{"version":3,"sources":["components/results/result.js","components/icons/search.js","components/text-search/no-autocomplete.js","helpers/index.js","components/text-search/search-as-you-type.js","components/text-search/index.js","components/list-facet/index.js","components/range-facet/index.js","components/search-field-container.js","components/results/list.js","components/icons/chevrons.js","components/results/pagination.js","components/results/count-label.js","components/current-query/index.js","components/sort-menu/index.js","components/results/instructions.js","components/federated_solr_component_pack.js","components/results/result-components/index.js","components/results/result-components/directory.js","components/results/result-components/condition.js","components/results/result-components/treatment.js","components/results/result-components/recipe.js","components/results/result-components/department.js","components/federated-solr-faceted-search.js","index.js"],"names":["FederatedResult","date","Intl","DateTimeFormat","year","month","day","format","Date","parse","phoneNumberString","match","replace","join","doc","hostname","this","props","Object","hasOwnProperty","call","ss_canonical_url","Array","isArray","sm_urls","currentHostUrl","find","item","url","ss_url","console","log","arr","sep","length","slice","reduce","xs","x","i","concat","sitenames","urls","originalSitename","sites","push","className","href","key","departments","highlight","sm_department","onClick","onSelect","getCanonicalLink","dangerouslySetInnerHTML","__html","ss_federated_type","ss_sort_az_field","ss_federated_title","ss_summary","sm_federated_type","React","Component","Search","xmlns","viewBox","d","FederatedTextSearchNoAutocomplete","state","value","handleInputChange","bind","handleInputKeyDown","handleSubmit","nextProps","setState","ev","target","keyCode","onChange","field","parsed","queryString","window","location","search","stringified","stringify","history","pushState","newUrl","protocol","host","pathname","path","label","Fragment","htmlFor","type","name","id","autoFocus","onKeyDown","e","preventDefault","defaultProps","filterFieldsWithQsState","qs","getParsedQsAndParams","arrayFormat","params","entries","getFieldQsInfo","values","foundIdx","indexOf","isQsParamField","param","addValueToQsParam","newParsed","includes","addQsParam","fieldType","split","isMultiple","charAt","removeValueFromQsParam","filter","addNewUrlToBrowserHistory","newurl","setFieldStateFromQs","searchField","newSearchField","collapse","decodeURI","expandedHierarchies","forEach","decodedParam","map","highlightText","text","toString","trim","parts","RegExp","part","style","toLowerCase","fontWeight","FederatedTextSearchAsYouType","suggestions","reset","getSuggestionValue","loadSuggestions","onSuggestionSelected","onSuggestionsFetchRequested","onSuggestionsClearRequested","renderSuggestion","renderSuggestionsContainer","shouldRenderSuggestions","active","suggestQuery","docs","event","newValue","method","suggestion","autocomplete","mode","stopPropagation","assign","persist","onSuggest","query","defaultPrevented","numChars","containerProps","children","hasResultModeConfig","hasTermModeConfig","resultTitleText","result","titleText","termTitleText","showDirectionsText","term","decodedTitle","he","decode","highlightedTitle","helpers","currentHumanIndex","suggestionsLength","inputProps","role","focusInputOnSuggestionClick","renderInputComponent","theme","container","containerOpen","input","inputOpen","inputFocused","suggestionsContainer","suggestionsContainerOpen","suggestionsList","suggestionFirst","suggestionHighlighted","sectionContainer","sectionContainerFirst","sectionTitle","FederatedTextSearch","InputComponent","FederatedListFacet","truncateFacetListsAt","v","hierarchyFacetValue","onSetCollapse","indexOfExpandedHierarchyFacetValue","splice","facets","hierarchy","options","siteList","facetCounts","facet","facetValues","facetInputs","keys","expanded","height","types","terms","facetValue","pieces","items","facetCount","uniqueTypes","self","String","listFacetHierarchyLis","listFacetHierarchyTermsLis","termObj","checked","handleClick","tabIndex","cx","toggleExpand","duration","FederatedRangeFacet","startDate","endDate","focusedInput","momentToSolrStart","moment","subtract","hours","momentToSolrEnd","add","minutes","seconds","calendarOrientation","undefined","calendarFullScreen","calendarMonths","getLastMonth","matchMedia","matches","startDateId","endDateId","onDatesChange","handleDatesChange","onFocusChange","isOutsideRange","today","diff","isBefore","minimumNights","small","showClearDates","onClose","handleCalendarClose","phrases","calendarLabel","chooseAvailableStartDate","chooseAvailableEndDate","clearDates","closeDatePicker","dateIsSelected","dateIsUnavailable","enterKey","escape","focusStartDate","hideKeyboardShortcutsPanel","homeEnd","jumpToNextMonth","jumpToPrevMonth","keyboardNavigationInstructions","keyboardShortcuts","leftArrowRightArrow","moveFocusByOneDay","moveFocusByOneMonth","moveFocusByOneWeek","moveFocustoStartAndEndOfWeek","openThisPanel","pageUpPageDown","questionMark","returnFocusToInput","selectFocusedDate","showKeyboardShortcutsPanel","upArrowDownArrow","initialVisibleMonth","numberOfMonths","orientation","withFullScreenPortal","FederatedSearchFieldContainer","intFrameWidth","innerWidth","addEventListener","onNewSearch","resultsCount","title","aria-labelledby","FederatedResultList","DoubleChevronLeft","DoubleChevronRight","ArrowRight","ArrowLeft","FederatedPagination","buildHandleEnterKeyPress","page","pageAmt","document","getElementById","focus","preventScroll","currentPage","isCurrentPage","onPageChange","onKeyPress","aria-current","results","start","rows","numFound","Math","ceil","numButtons","paginationButtons","rangeStart","rangeEnd","pages","firstPageHidden","prevPageHidden","nextPageHidden","lastPageHidden","aria-hidden","rel","idx","renderPage","FederatedCountLabel","termValue","noResultsText","message","a11yMessage","aria-live","searchResultsStat","FacetType","ListFacetType","announcePolite","val","removeListFacetValue","RangeFacetType","utc","startFormatted","end","endFormatted","filterValue","removeRangeFacetValue","TextFacetType","removeTextValue","FederatedCurrentQuery","fields","searchFields","facetTypes","isHidden","MyFacetType","FederatedSortMenu","sortField","sortFields","order","option","customDropdownStyles","control","styles","backgroundColor","borderColor","fontSize","borderRadius","padding","minWidth","border","outline","isDisabled","isSelected","color","cursor","indicatorSeparator","display","dropdownIndicator","menu","paddingTop","paddingBottom","margin","menuList","placeholder","selectedValue","FederatedInstructions","FederatedSolrComponentPack","defaultComponentPack","currentQuery","list","paginate","resultCount","instructions","Directory","sm_federated_image","media","srcset","src","alt","width","ss_field_clinical_title","tm_X3b_en_field_special_interest","interest","bs_field_accepting_patients","bs_field_top_dentist","bs_field_top_doc","sm_field_phone","phone","formatPhoneNumber","Conditions","Treatment","Recipe","Department","FederatedSolrFacetedSearch","submitted","resetFilters","searchTerm","mainQueryField","onSearchFieldChange","ResultComponents","customComponents","bootstrapCss","onTextInputChange","onSortFieldChange","SearchFieldContainerComponent","ResultContainerComponent","ResultComponent","ResultCount","ResultHeaderComponent","header","ResultInstructionsComponent","ResultListComponent","ResultPendingComponent","pending","PaginateComponent","PreloadComponent","preloadIndicator","CurrentQueryComponent","SortComponent","resultPending","pagination","pageStrategy","preloadListItem","pageTitle","sortChange","a","b","autoComplete","sf","menuTitle","sidebarFilters","lowerBound","upperBound","SearchComponent","getFacetValues","showEmptySearchResults","noResults","CustomResultComponent","getResultByType","onSelectDoc","resultIndex","highlighting","showCsvExport","searchFromQuerystring","solrClient","searchFieldsState","prototype","filterField","siteSearch","sort","defaultSort","sendQuery","root","dataset","settings","defaults","isD7","proxyIsDisabled","hiddenSearchFields","hl","fl","usePhraseHighlighter","filters","sm_site_name_value","sm_site_name","SolrClient","userpass","handlers","ReactDOM","render","onpopstate","init","JSON","federatedSearchAppConfig","error"],"mappings":"yUA6JeA,E,gKApJb,SAAWC,GACT,GAAoB,qBAATA,EAMT,OALoB,IAAIC,KAAKC,eAAe,QAAS,CACnDC,KAAM,UACNC,MAAO,OACPC,IAAK,YACJC,OAAOC,KAAKC,MAAMR,M,+BAMzB,SAAkBS,GAChB,IACIC,GADW,GAAKD,GAAmBE,QAAQ,MAAO,IAClCD,MAAM,gCAC1B,GAAIA,EAAO,CACOA,EAAM,GAEtB,MAAO,CAACA,EAAM,GAAI,IAAKA,EAAM,GAAI,IAAKA,EAAM,IAAIE,KAAK,IAEvD,OAAO,O,8BAeT,SAAiBC,GACf,IAAQC,EAAaC,KAAKC,MAAlBF,SAGR,GAAIG,OAAOC,eAAeC,KAAKN,EAAK,qBAAuBA,EAAIO,iBAC7D,OAAOP,EAAIO,iBAIb,GAAIH,OAAOC,eAAeC,KAAKN,EAAK,YAAcQ,MAAMC,QAAQT,EAAIU,SAAU,CAE5E,IAAMC,EAAiBX,EAAIU,QAAQE,MAAK,SAACC,GAEvC,OADcC,IAAInB,MAAMkB,GACXZ,WAAaA,KAI5B,OAAIU,GAKGX,EAAIU,QAAQ,GAIrB,OAAIN,OAAOC,eAAeC,KAAKN,EAAK,WAAaA,EAAIe,OAC5Cf,EAAIe,QAEbC,QAAQC,IAAI,QAGL,M,yBAGT,SAAYC,EAAKC,GACf,OAAmB,IAAfD,EAAIE,OACC,GAGFF,EAAIG,MAAM,GAAGC,QAAO,SAASC,EAAIC,EAAGC,GACzC,OAAOF,EAAGG,OAAO,CAACP,EAAKK,MACtB,CAACN,EAAI,O,iCAGV,SAAoBS,EAAWC,EAAMC,GACnC,GAAiB,MAAbF,GAA6B,MAARC,EAEvB,IADA,IAAIE,EAAQ,GACHL,EAAI,EAAGA,EAAIE,EAAUP,OAAQK,IACpCK,EAAMC,KAAK,uBAAGC,UAAU,WAAWC,KAAML,EAAKH,GAAIS,IAAKT,GAAIE,EAAUF,KAC1DE,EAAUP,OAMzB,OAAwB,MAApBS,EACKA,EAGF,O,oBAGT,WAAU,IAAD,OACP,EAA2B3B,KAAKC,MAAxBH,EAAR,EAAQA,IACJmC,GADJ,EAAaC,UACK,MAIlB,OAHI5B,MAAMC,QAAQT,EAAIqC,iBACpBF,EAAcnC,EAAIqC,cAActC,KAAK,QAGrC,wBACEiC,UAAU,wCACVM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KAEnC,uBAAGiC,KAAM/B,KAAKsC,iBAAiBxC,IAE7B,yBAAKgC,UAAU,gBACZG,EACC,0BAAMH,UAAU,kBAAkBG,GAChC,KAEJ,wBAAIH,UAAU,aAAaS,wBAAyB,CAAEC,OAAiC,YAAzB1C,EAAI2C,kBAC9D3C,EAAI4C,iBACJ5C,EAAI6C,sBAGR,uBACEb,UAAU,uBACVS,wBAAyB,CAAEC,OAAQ1C,EAAI8C,cAGzC,yBAAKd,UAAU,wBACZhC,EAAI+C,kBACH,0BAAMf,UAAU,yBACbhC,EAAI+C,mBAEL,a,GArIYC,IAAMC,W,yBCGrBC,E,4JAPd,WACC,OACM,yBAAKC,MAAM,6BAA6BC,QAAQ,aAAY,0BAAMC,EAAE,8Y,GAHvDL,IAAMC,WCMrBK,E,kDACJ,WAAYnD,GAAQ,IAAD,8BACjB,cAAMA,IAEDoD,MAAQ,CACXC,MAAO,IAGT,EAAKC,kBAAoB,EAAKA,kBAAkBC,KAAvB,gBACzB,EAAKC,mBAAqB,EAAKA,mBAAmBD,KAAxB,gBAC1B,EAAKE,aAAe,EAAKA,aAAaF,KAAlB,gBATH,E,oEAYnB,SAAiCG,GAC/B3D,KAAK4D,SAAS,CACZN,MAAOK,EAAUL,U,+BAIrB,SAAkBO,GAChB7D,KAAK4D,SAAS,CACZN,MAAOO,EAAGC,OAAOR,U,gCAIrB,SAAmBO,GACE,KAAfA,EAAGE,SACL/D,KAAK0D,iB,0BAIT,WACE1D,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAOjE,KAAKqD,MAAMC,OAEjD,IAAMY,EAASC,IAAY1E,MAAM2E,OAAOC,SAASC,QAEjDJ,EAAOI,OAAStE,KAAKqD,MAAMC,MAC3B,IAAMiB,EAAcJ,IAAYK,UAAUN,GAG1C,GAAIE,OAAOK,QAAQC,UAAW,CAC5B,IAAMC,EAAM,UAAMP,OAAOC,SAASO,SAAtB,aAAmCR,OAAOC,SAASQ,MAAnD,OAA0DT,OAAOC,SAASS,SAA1E,YAAsFP,GAClGH,OAAOK,QAAQC,UAAU,CAAEK,KAAMJ,GAAU,GAAIA,QAE/CP,OAAOC,SAASC,OAASC,I,oBAI7B,WAAU,IAAD,OACCS,EAAUhF,KAAKC,MAAf+E,MAER,OACE,kBAAC,IAAMC,SAAP,KACE,2BAAOC,QAAQ,SAASpD,UAAU,yBAAyBkD,GAC3D,yBAAKlD,UAAU,iCACb,2BACEqD,KAAK,SACLC,KAAK,SACLC,GAAG,SACHvD,UAAU,wBACVwD,WAAS,EACTtB,SAAUhE,KAAKuD,kBACfgC,UAAWvF,KAAKyD,mBAChBH,MAAOtD,KAAKqD,MAAMC,OAAS,KAE7B,4BACE6B,KAAK,SACLrD,UAAU,uCACVM,QAAS,SAAAoD,GAAMA,EAAEC,iBAAkB,EAAK/B,aAAa8B,KAErD,0BAAM1D,UAAU,eAAhB,kBACA,kBAAC,EAAD,a,GAvEoCgB,IAAMC,WA+EtDK,EAAkCsC,aAAe,CAC/CV,MAAO,GACPhB,SAAU,aACVV,MAAO,IAUMF,Q,4CC1ETuC,EAA0B,CAC9B,eACA,oBACA,gBACA,sBAGIC,EAAK,CAQTC,qBAAsB,WACpB,IAAM3B,EAASC,IAAY1E,MAAM2E,OAAOC,SAASC,OAAQ,CAAEwB,YAAa,YACxE,MAAO,CACL5B,SACA6B,OAAQ7F,OAAO8F,QAAQ9B,KAmB3B+B,eAAgB,YAA+B,IAA5BhC,EAA2B,EAA3BA,MAAOiC,EAAoB,EAApBA,OAAQ5C,EAAY,EAAZA,MAG1B6C,EAAWD,EAAOE,QAAQ9C,GAEhC,EAA2BsC,EAAGC,uBAAtB3B,EAAR,EAAQA,OAAQ6B,EAAhB,EAAgBA,OAQhB,MAAO,CACLI,WACAjC,SACAmC,eARqBV,EAAwBjF,MAAK,SAAAC,GAAI,OAAIA,IAASsD,KASnEqC,MANYP,EAAOrF,MAAK,SAAAC,GAAI,OAAIA,EAAK,KAAOsD,OAuBhDsC,kBAAmB,YAKZ,IAJLtC,EAII,EAJJA,MACAX,EAGI,EAHJA,MACAgD,EAEI,EAFJA,MAGME,EADF,EADJtC,OAeA,MAXwB,kBAAboC,EAAM,IAAmBhD,IAAUgD,EAAM,KAElDE,EAAUvC,GAASX,GAGG,kBAAbgD,EAAM,IAAoBA,EAAM,GAAGG,SAASnD,KAErDgD,EAAM,GAAGzE,KAAKyB,GAEdkD,EAAUvC,GAAV,YAAuBqC,EAAM,KAExBE,GAiBTE,WAAY,YAIL,IAHLzC,EAGI,EAHJA,MACAX,EAEI,EAFJA,MAGMkD,EADF,EADJtC,OAGMyC,EAAY1C,EAAM2C,MAAM,KAAK,GAC7BC,EAAwD,MAA3CF,EAAUG,OAAOH,EAAUzF,OAAS,GAYvD,OATK2F,IAEHL,EAAUvC,GAASX,GAGjBuD,IAEFL,EAAUvC,GAAS,CAACX,IAEfkD,GAgBTO,uBAAwB,YAKjB,IAJL9C,EAII,EAJJA,MACAX,EAGI,EAHJA,MACAgD,EAEI,EAFJA,MAGME,EADF,EADJtC,OAeA,MAVwB,kBAAboC,EAAM,IAAmBhD,IAAUgD,EAAM,WAE3CE,EAAUvC,GAGK,kBAAbqC,EAAM,IAAmBA,EAAM,GAAGG,SAASnD,KAEpDkD,EAAUvC,GAASqC,EAAM,GAAGU,QAAO,SAAArG,GAAI,OAAIA,IAAS2C,MAG/CkD,GAQTS,0BAA2B,SAAC/C,GAE1B,IAAMK,EAAcJ,IAAYK,UAAUN,EAAQ,CAAE4B,YAAa,YAGjE,GAAI1B,OAAOK,QAAQC,UAAW,CAC5B,IAAMwC,EAAM,UAAM9C,OAAOC,SAASO,SAAtB,aAAmCR,OAAOC,SAASQ,MAAnD,OAA0DT,OAAOC,SAASS,SAA1E,YAAsFP,GAClGH,OAAOK,QAAQC,UAAU,CAAEK,KAAMmC,GAAU,GAAIA,QAE/C9C,OAAOC,SAASC,OAASC,GAc7B4C,oBAAqB,YAGd,IAFLpB,EAEI,EAFJA,OACAqB,EACI,EADJA,YAGMC,EAAiBD,EAEjBd,EAAQP,EAAOrF,MAAK,SAAAC,GAAI,OAAIA,EAAK,KAAOyG,EAAYnD,SAG1D,GAAIqC,GAaF,GATAe,EAAeC,UAAW,EAE1BD,EAAe/D,MAAQ8D,EAAY9D,OAAS,GAGpB,kBAAbgD,EAAM,IAAoBc,EAAY9D,MAAM5C,MAAK,SAAAC,GAAI,OAAIA,IAAS2F,EAAM,OACjFe,EAAe/D,MAAMzB,KAAK0F,UAAUjB,EAAM,KAGpB,kBAAbA,EAAM,IAAmBc,EAAY9D,QAAUgD,EAAM,GAAI,CAElE,GAD+C,uBAAtBc,EAAYnD,MACf,CACpB,IAAMuD,EAAsB,GAC5BlB,EAAM,GAAGmB,SAAQ,SAAC9G,GAEhB6G,EAAoB3F,KAAKlB,EAAKiG,MAAM,KAAK,OAG3CS,EAAeG,oBAAsBA,EAGvC,IAAME,EAAepB,EAAM,GAAGqB,KAAI,SAAAhH,GAAI,OAAI4G,UAAU5G,MAEpD0G,EAAe/D,MAAf,YAA2BoE,gBAItBL,EAAe/D,MAEtB+D,EAAeC,UAAW,EAG5B,OAAOD,IAII,GACbO,cArQoB,SAACC,EAAM3F,GAC3B,IAAKA,EAAU4F,WAAWC,OACxB,OAAO,8BAAOF,GAGhB,IAAMG,EAAQH,EAAKjB,MAAM,IAAIqB,OAAJ,WAAe/F,EAAf,KAA6B,OACtD,OACE,kCAAS8F,EAAML,KAAI,SAACO,EAAM3G,GAAP,OAEf,0BAAMS,IAAKT,EAAG4G,MAAOD,EAAKE,gBAAkBlG,EAAU4F,WAAWM,cAAgB,CAAEC,WAAY,QAAW,IACtGH,QA4PVvC,0BACAC,MCrQI0C,E,kDACJ,WAAYrI,GAAQ,IAAD,8BACjB,cAAMA,IAEDoD,MAAQ,CACXC,MAAO,GACPiF,YAAa,GACbC,OAAO,GAGT,EAAKC,mBAAqB,EAAKA,mBAAmBjF,KAAxB,gBAC1B,EAAKC,mBAAqB,EAAKA,mBAAmBD,KAAxB,gBAC1B,EAAKE,aAAe,EAAKA,aAAaF,KAAlB,gBACpB,EAAKkF,gBAAkB,EAAKA,gBAAgBlF,KAArB,gBACvB,EAAKQ,SAAW,EAAKA,SAASR,KAAd,gBAChB,EAAKmF,qBAAuB,EAAKA,qBAAqBnF,KAA1B,gBAC5B,EAAKoF,4BAA8B,EAAKA,4BAA4BpF,KAAjC,gBACnC,EAAKqF,4BAA8B,EAAKA,4BAA4BrF,KAAjC,gBACnC,EAAKsF,iBAAmB,EAAKA,iBAAiBtF,KAAtB,gBACxB,EAAKuF,2BAA6B,EAAKA,2BAA2BvF,KAAhC,gBAClC,EAAKwF,wBAA0B,EAAKA,wBAAwBxF,KAA7B,gBAnBd,E,oEAsBnB,SAAiCG,GAQ/B,IAAIsF,GAAS,EACW,OAApBtF,EAAUL,QACZtD,KAAK4D,SAAS,CACZ4E,OAAO,IAETS,GAAS,GAEa,OAApBtF,EAAUL,QAAuC,IAArBtD,KAAKqD,MAAMmF,QACzCxI,KAAK4D,SAAS,CACZN,MAAO,GACPiF,YAAa,GACbC,OAAO,IAETS,GAAS,GAEe,KAArBjJ,KAAKqD,MAAMC,OAAqC,OAArBtD,KAAKC,MAAMqD,QAA8B,IAAX2F,GAC5DjJ,KAAK4D,SAAS,CACZN,MAAOK,EAAUuF,cAAgBvF,EAAUuF,aAAa5F,MACpDK,EAAUuF,aAAa5F,MACvBK,EAAUL,MACdiF,YAAa5E,EAAU4E,YAAc5E,EAAU4E,YAAYY,KAAOnJ,KAAKqD,MAAMkF,gB,sBAsBnF,SAASa,EAAT,GAAuC,IAArBC,EAAoB,EAApBA,SACD,SADqB,EAAVC,SAExBtJ,KAAK4D,SAAS,CACZN,MAAO+F,IAITrJ,KAAKC,MAAMiJ,aAAa5F,MAAQ+F,K,yCAKpC,YAAwC,IAAV/F,EAAS,EAATA,MAC5BtD,KAAK0I,gBAAgBpF,K,kCAuBvB,SAAqB8F,EAArB,GAAqD,IAAvBG,EAAsB,EAAtBA,WAAYD,EAAU,EAAVA,OAG3B,WAFItJ,KAAKC,MAAMuJ,aAApBC,MAEoC,KAAlBL,EAAMrF,SAA6B,UAAXuF,IAChDF,EAAM3D,iBACN2D,EAAMM,kBACNtF,OAAOC,SAASsF,OAAOJ,EAAW/I,QAAQ,O,yCAK9C,WAEOR,KAAKC,MAAM2J,SACd5J,KAAK4D,SAAS,CACZ2E,YAAa,O,gCAQnB,SAAmBgB,GACjB,IAAQE,EAASzJ,KAAKC,MAAMuJ,aAApBC,KACR,MAAa,WAATA,IACS,SAATA,GACKF,EAAW5G,sB,6BAOtB,SAAgBW,GAEdtD,KAAKC,MAAM4J,UAAU7J,KAAKC,MAAM6J,MAAO9J,KAAKC,MAAMuJ,aAAclG,K,gCAGlE,SAAmB8F,GAIK,KAAlBA,EAAMrF,SAAmBqF,EAAMW,kBACjC/J,KAAK0D,eAIe,KAAlB0F,EAAMrF,SACR/D,KAAK6I,gC,0BAMT,WACE7I,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAOjE,KAAKqD,MAAMC,OAEjD,IAAMY,EAASC,IAAY1E,MAAM2E,OAAOC,SAASC,QAEjDJ,EAAOI,OAAStE,KAAKqD,MAAMC,MAC3B,IAAMiB,EAAcJ,IAAYK,UAAUN,GAG1C,GAAIE,OAAOK,QAAQC,UAAW,CAC5B,IAAMC,EAAM,UAAMP,OAAOC,SAASO,SAAtB,aAAmCR,OAAOC,SAASQ,MAAnD,OAA0DT,OAAOC,SAASS,SAA1E,YAAsFP,GAClGH,OAAOK,QAAQC,UAAU,CAAEK,KAAMJ,GAAU,GAAIA,QAE/CP,OAAOC,SAASC,OAASC,I,qCAO7B,SAAwBjB,GACtB,IAAM0G,EAAWhK,KAAKC,MAAMuJ,aAAaQ,UAAY,EACrD,OAAO1G,EAAMyE,OAAO7G,OAAS8I,I,wCAG/B,YAAiE,IAApCC,EAAmC,EAAnCA,eAAgBC,EAAmB,EAAnBA,SACnCT,GADsD,EAATK,MACpC9J,KAAKC,MAAMuJ,aAApBC,MACFU,EAAsBjK,OAAOC,eAAeC,KAAKJ,KAAKC,MAAMuJ,aAAc,UAC1EY,EAAoBlK,OAAOC,eAAeC,KAAKJ,KAAKC,MAAMuJ,aAAc,QACxEa,EAAkBF,GAAuBnK,KAAKC,MAAMuJ,aAAac,OAAOC,UAC1EvK,KAAKC,MAAMuJ,aAAac,OAAOC,UAC/B,4BAKEC,IAJ2BL,IAC5BjK,OAAOC,eAAeC,KAAKJ,KAAKC,MAAMuJ,aAAac,OAAQ,uBAC5DtK,KAAKC,MAAMuJ,aAAac,OAAOG,mBAEbL,GAAqBpK,KAAKC,MAAMuJ,aAAakB,KAAKH,UACpEvK,KAAKC,MAAMuJ,aAAakB,KAAKH,UAC7B,0BAMEA,IALyBH,IAC1BlK,OAAOC,eAAeC,KAAKJ,KAAKC,MAAMuJ,aAAakB,KAAM,uBAC1D1K,KAAKC,MAAMuJ,aAAakB,KAAKD,mBAGN,SAAThB,EAAkBe,EAAgBH,GAOpD,OACE,6CAAaJ,EAAb,CAA6BnI,UAAWmI,EAAenI,UAAY,iBACjE,wBAAIA,UAAU,cAAcyI,GAGzBL,K,8BAiDT,SAAiBX,EAAjB,GAAyC,IAAVO,EAAS,EAATA,MAErBL,EAASzJ,KAAKC,MAAMuJ,aAApBC,KAEFkB,EAAeC,IAAGC,OAAOtB,EAAW5G,oBAEpCmI,EAAmBC,EAAQnD,cAAc+C,EAAcb,GAEvDkB,EAAoBhL,KAAKqD,MAAMkF,YAAYnC,QAAQmD,GAAc,EACjE0B,EAAoBjL,KAAKqD,MAAMkF,YAAYrH,OAIjD,MAAa,SAATuI,EACM,kDAMR,uBACE3H,UAAU,qCACVC,KAAMwH,EAAW/I,QAAQ,IAExBsK,EACD,0BAAMhJ,UAAU,eAAhB,YACQkJ,EADR,eACgCC,EADhC,S,oBAcN,WAAU,IAAD,OACP,EAAgCjL,KAAKC,MAA7B+E,EAAR,EAAQA,MAAOkE,EAAf,EAAeA,aACf,EAA+BlJ,KAAKqD,MAA5BkF,EAAR,EAAQA,YAAajF,EAArB,EAAqBA,MAEf4H,EAAa,CACjB/F,KAAM,SACNC,KAAM,SACNC,GAAI,SACJvD,UAAW,2BACXkC,SAAUhE,KAAKgE,SACfuB,UAAWvF,KAAKyD,mBAChBH,MAAOA,GAAS,GAChB6H,KAAM,WACN,oBAAqB,QAGvB,OACE,kBAAC,IAAMlG,SAAP,KACE,2BAAOC,QAAQ,UAAUF,GACzB,kCAEE,kBAAC,IAAD,CACEoG,6BAA6B,EAC7B3C,mBAAoBzI,KAAKyI,mBACzByC,WAAYA,EACZrC,4BAA6B7I,KAAK6I,4BAClCD,4BAA6B5I,KAAK4I,4BAClCD,qBAAsB3I,KAAK2I,qBAC3B0C,qBAAsB/C,EAA6B+C,qBACnDvC,iBAAkB9I,KAAK8I,iBACvBC,2BAA4B/I,KAAK+I,2BACjCC,wBAAyBhJ,KAAKgJ,wBAC9BE,aAAcA,EACdX,YAAaA,EACb+C,MAAO,CACLC,UAAW,+BACXC,cAAe,qCACfC,MAAO,0DACPC,UAAW,iCACXC,aAAc,oCACdC,qBAAsB,2CACtBC,yBAA0B,iDAC1BC,gBAAiB,QACjBvC,WAAY,OACZwC,gBAAiB,uCACjBC,sBAAuB,6CACvBC,iBAAkB,uCAClBC,sBAAuB,8CACvBC,aAAc,sCAGpB,4BACIhH,KAAK,SACLrD,UAAU,yBACVM,QAAS,SAAAoD,GAAMA,EAAEC,iBAAkB,EAAK/B,aAAa8B,KAErD,0BAAM1D,UAAU,eAAhB,kBACA,kBAAC,EAAD,Y,mCA/DV,SAA4BoJ,GAC1B,OACE,0BAAWA,O,GAhT0BpI,IAAMC,WAqXjDuF,EAA6B5C,aAAe,CAC1CV,MAAO,sBACP1B,MAAO,GACP4F,aAAc,CACZ5F,MAAO,KAkCIgF,QC1ZA8D,EARa,SAACnM,GAC3B,IACMoM,EADmBpM,EAAjBuJ,aAEJlB,EACAlF,EACJ,OAAO,kBAACiJ,EAAmBpM,I,kCCHvBqM,E,kDAEJ,WAAYrM,GAAQ,IAAD,8BACjB,cAAMA,IAEDoD,MAAQ,CACX2D,OAAQ,GACRuF,qBAAsBtM,EAAMsM,sBALb,E,+CASnB,SAAYjJ,GACV,MAKIyH,EAAQnF,GAAGK,eAAe,CAC5BhC,MAAOjE,KAAKC,MAAMgE,MAClBiC,OAAQlG,KAAKC,MAAMqD,MACnBA,UAPA6C,EADF,EACEA,SACAjC,EAFF,EAEEA,OACAmC,EAHF,EAGEA,eACAC,EAJF,EAIEA,MAQEE,EAAYtC,EAGZmC,IAEEF,EAAW,GAIXK,EAFEF,EAEUyE,EAAQnF,GAAGW,kBAAkB,CACvCtC,MAAOjE,KAAKC,MAAMgE,MAClBX,QACAgD,QACApC,WAIU6G,EAAQnF,GAAGc,WAAW,CAChCzC,MAAOjE,KAAKC,MAAMgE,MAClBX,QACAY,WAKJlE,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAOjE,KAAKC,MAAMqD,MAAM9B,OAAO8B,MAG1DgD,IACFE,EAAYuE,EAAQnF,GAAGmB,uBAAuB,CAC5C9C,MAAOjE,KAAKC,MAAMgE,MAClBX,QACAgD,QACApC,YAKJlE,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAOjE,KAAKC,MAAMqD,MAAM0D,QAAO,SAACwF,EAAGjL,GAAJ,OAAUA,IAAM4E,OAGhF4E,EAAQnF,GAAGqB,0BAA0BT,M,0BAIzC,SAAaiG,GAGX,GAFAzM,KAAKC,MAAMyM,cAAc1M,KAAKC,MAAMgE,OAASjE,KAAKC,MAAMqH,UAEpDmF,EAAqB,CAEvB,IAAME,EAAqC3M,KAAKC,MAAMuH,oBACnDpB,QAAQqG,GACPE,GAAsC,EAExC3M,KAAKC,MAAMuH,oBAAoBoF,OAAOD,EAAmC,GAGzE3M,KAAKC,MAAMuH,oBAAoB3F,KAAK4K,M,oBAK1C,WAAU,IAAD,OACP,EAQIzM,KAAKC,MAPP+E,EADF,EACEA,MACA6H,EAFF,EAEEA,OACA5I,EAHF,EAGEA,MACAX,EAJF,EAIEA,MACAgE,EALF,EAKEA,SACAwF,EANF,EAMEA,UACAC,EAPF,EAOEA,QAEMR,EAAyBvM,KAAKqD,MAA9BkJ,qBAEFS,EAAWD,EAAQC,SACnBC,EAAcJ,EAAO7F,QAAO,SAACkG,EAAO3L,GAAR,OAAcA,EAAI,IAAM,KACpD4L,EAAcN,EAAO7F,QAAO,SAACkG,EAAO3L,GAAR,OAAcA,EAAI,IAAM,KAEpD6L,EAAc,GAGpB,GAAc,iBAAVnJ,GAA4B+I,EAAS9L,OAAS,GAQhD,GAPAiM,EAAY1F,SAAQ,SAAC+E,EAAGjL,GACtB,IAAMS,EAAMmL,EAAY5L,GACpByL,EAAS5G,QAAQoG,IAAM,IACzBY,EAAYpL,GAAOiL,EAAY1L,OAI/B+B,EAAMpC,OAAS,GAAKhB,OAAOmN,KAAKD,GAAalM,OAAS,EACxD,OAAO,UAITiM,EAAY1F,SAAQ,SAAC+E,EAAGjL,GACtB,IAAMS,EAAMmL,EAAY5L,GACxB6L,EAAYpL,GAAOiL,EAAY1L,MAKnC,IAAM+L,EAA8B,qBAAnBtN,KAAKC,MAAMgE,MAA8BqD,GAAYA,EAChEiG,EAASD,EAAW,OAAS,EAInC,GAAIR,EAAW,CAIb,IAAMU,EAAQ,GAYRC,EAAQ,GACdN,EAAY1F,SAAQ,SAACiG,EAAYnM,GAE/B,IAAMoM,EAASD,EAAW9G,MAAM,KAChC4G,EAAM3L,KAAK8L,EAAO,IAEbzN,OAAOC,eAAeC,KAAKqN,EAAOE,EAAO,MAC5CF,EAAME,EAAO,IAAM,GACnBF,EAAME,EAAO,IAAIC,MAAQ,GACzBH,EAAME,EAAO,IAAIL,SAAY,EAAKrN,MAAMuH,oBAAoBpB,QAAQuH,EAAO,KAAO,EAClFF,EAAME,EAAO,IAAIJ,OAASE,EAAME,EAAO,IAAIL,SAAW,OAAS,GAGjEG,EAAME,EAAO,IAAIC,MAAM/L,KAAK,CAC1B6I,KAAMiD,EAAO,GACbD,aACAG,WAAYZ,EAAY1L,QAO5B,IAAMuM,EAAcN,EAAMxG,QAAO,SAACwF,EAAGjL,EAAGwM,GAAP,OAAgBA,EAAK3H,QAAQoG,KAAOjL,KAAGyF,OAAOgH,QAGzEC,EAAwB,GAExBC,EAA6B,GAiDnC,OA/CAJ,EAAYrG,SAAQ,SAACtC,EAAM5D,GAEzB2M,EAA2B/I,GAAQ,GACnCsI,EAAMtI,GAAMyI,MAAMnG,SAAQ,SAAC0G,EAAS5M,GAAV,OAAgB4M,EAAQN,YAC7CK,EAA2B/I,GAAMtD,KAAK,wBAAIC,UAAU,oCAAoCE,IAAG,UAAKmM,EAAQzD,KAAb,YAAqByD,EAAQT,WAA7B,YAA2CnM,IACvI,2BAAOO,UAAU,uCACjB,2BACEqD,KAAK,WACLC,KAAMD,EACNrD,UAAU,sCACVwB,MAAO6K,EAAQT,WACfU,QAAS9K,EAAM8C,QAAQ+H,EAAQT,aAAe,EAC9C1J,SAAU,kBAAM,EAAKqK,YAAYF,EAAQT,eAP3C,IAQIS,EAAQzD,KACV,0BAAM5I,UAAU,qBAAhB,KAAuCqM,EAAQN,WAC7C,0BAAM/L,UAAU,eAAhB,WADF,WAONoM,EAA2B/I,GAAMjE,QAAU+M,EAAsBpM,KAC/D,wBAAIC,UAAU,oCAAoCuD,GAAE,0BAAqBF,GAAQnD,IAAG,0BAAqBmD,EAArB,YAA6B5D,IAC/G,yBACE+M,SAAS,IACTxM,UAAWyM,IAAG,6BAA8B,CAAE,8BAA+Bd,EAAMtI,GAAMmI,WACzFjI,GAAIL,EAAMpF,QAAQ,OAAQ,KAAKwI,cAC/BhG,QAAS,EAAKoM,aAAahL,KAAK,EAAM2B,GACtCI,UAAW,SAAC6D,GACY,KAAlBA,EAAMrF,SACR,EAAKyK,aAAarJ,KAItB,0BAAMrD,UAAU,eAAhB,2BAXF,IAWgEqD,GAEhE,kBAAC,IAAD,CACEsJ,SAAU,IACVlB,OAAQE,EAAMtI,GAAMoI,QAEpB,wBAAIzL,UAAU,+BAA+BE,IAAG,0BAAqBmD,EAArB,QAC7C+I,EAA2B/I,UAM/B8I,EAIT,OACE,wBAAInM,UAAU,kCAAkCuD,GAAE,0BAAqBpB,IACrE,yBACEqK,SAAS,IACTxM,UAAWyM,IAAG,6BAA8B,CAAE,8BAA+BjB,IAC7EjI,GAAIL,EAAMpF,QAAQ,OAAQ,KAAKwI,cAC/BhG,QAASpC,KAAKwO,aAAahL,KAAKxD,MAChCuF,UAAW,SAAC6D,GACY,KAAlBA,EAAMrF,SACR,EAAKyK,iBAIT,0BAAM1M,UAAU,eAAhB,2BAXF,IAWgEkD,GAEhE,kBAAC,IAAD,CACEyJ,SAAU,IACVlB,OAAQA,GAER,wBAAIzL,UAAU,+BAA+BE,IAAG,0BAAqBiC,EAArB,QAC7CkJ,EAAYnG,QAAO,SAAC0G,EAAYnM,GAAb,OAAmB6L,EAAYM,GAAc,IACzDnB,EAAuB,GAAKhL,EAAIgL,MACrC5E,KAAI,SAAC+F,EAAYnM,GAChB,OAAiC,IAA7B,EAAK8B,MAAM2D,OAAO9F,QACjBwM,EAAWtF,cAAchC,QAAQ,EAAK/C,MAAM2D,OAAOoB,gBAAkB,EAEtE,wBAAItG,UAAU,oCAAoCE,IAAG,UAAK0L,EAAL,YAAmBN,EAAYM,KAClF,2BAAO5L,UAAU,uCACf,2BACEqD,KAAK,WACLC,KAAMnB,EACNX,MAAOoK,EACPU,QAAS9K,EAAM8C,QAAQsH,IAAe,EACtC1J,SAAU,kBAAM,EAAKqK,YAAYX,MANrC,IAOMA,EAPN,KAOoBN,EAAYM,GAPhC,MAYC,e,GA1QU5K,IAAMC,WAmRvCuJ,EAAmB5G,aAAe,CAChCoH,WAAW,EACXtF,oBAAqB,GACrBlE,MAAO,IAqBMgJ,Q,mCCzSToC,E,kDAEJ,WAAYzO,GAAQ,IAAD,8BACjB,cAAMA,IAEDoD,MAAQ,CACX2D,OAAQ,GACRuF,qBAAsBtM,EAAMsM,qBAC5BoC,UAAW,KACXC,QAAS,KACTC,aAAc,MARC,E,gDAYnB,WACE7O,KAAKC,MAAMyM,cAAc1M,KAAKC,MAAMgE,OAASjE,KAAKC,MAAMqH,Y,iCAG1D,SAAoBhE,GAElB,GAAwB,OAApBA,EAAMqL,WAAwC,OAAlBrL,EAAMsL,QAAkB,CAEtD,IAAME,EAAoBC,IAAOzL,EAAMqL,WAAWK,SAAS,CAACC,MAAM,KAAK1P,OAAO,uBAAyB,IAEjG2P,EAAkBH,IAAOzL,EAAMsL,SAASO,IAAI,CAACF,MAAM,GAAIG,QAAQ,GAAIC,QAAS,KAAK9P,OAAO,uBAAyB,IACvHS,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAO,CAAC6K,EAAmBI,O,+BAI9D,SAAkBP,EAAUC,GAC1B5O,KAAK4D,SAAS,CAAC+K,YAAWC,YAER,OAAdD,GAAkC,OAAZC,GACxB5O,KAAKC,MAAM+D,SAAShE,KAAKC,MAAMgE,MAAO,M,gCAK1C,SAAmBN,GAEb3D,KAAKC,MAAMqD,MAAMpC,SAAWyC,EAAUL,MAAMpC,QAC9ClB,KAAK4D,SAAS,CACZ+K,UAAW,KACXC,QAAS,S,oBAKf,WAAU,IAAD,OACP,EAA0C5O,KAAKC,MAAxC+E,EAAP,EAAOA,MAAO6H,EAAd,EAAcA,OAAQ5I,EAAtB,EAAsBA,MAEhBqJ,GAFN,EAA6BhG,SAGvBiG,EAASD,EAAW,OAAS,EAI/BgC,OAAsBC,EACtBC,OAAqBD,EACrBE,EAAiB,EAEjBC,EAAe,kBAAMX,MAASC,SAAS,EAAG,WAW9C,OARI5K,OAAOuL,WAAW,sBAAsBC,UAE1CH,EAAiB,EACjBH,EAAsB,WACtBE,GAAqB,EACrBE,OAAeH,GAIf,wBAAIzN,UAAU,kCAAkCuD,GAAE,0BAAqBpB,IACrE,yBACEqK,SAAS,IACTxM,UAAWyM,IAAG,6BAA8B,CAAC,8BAA+BjB,IAC5EjI,GAAIL,EAAMpF,QAAQ,OAAQ,KAAKwI,cAC/BhG,QAASpC,KAAKwO,aAAahL,KAAKxD,MAChCuF,UAAW,SAAC6D,GAA+B,KAAlBA,EAAMrF,SAAiB,EAAKyK,iBACrDxJ,GACF,kBAAC,IAAD,CACEyJ,SAAU,IACVlB,OAAQA,GAER,wBAAIzL,UAAU,gCACZ,wBAAIA,UAAU,qCAEZ,kBAAC,kBAAD,CACE6M,UAAW3O,KAAKqD,MAAMsL,UACtBkB,YAAY,kBACZjB,QAAS5O,KAAKqD,MAAMuL,QACpBkB,UAAU,gBACVC,cAAe,gBAAGpB,EAAH,EAAGA,UAAWC,EAAd,EAAcA,QAAd,OAA4B,EAAKoB,kBAAkBrB,EAAUC,IAC5EC,aAAc7O,KAAKqD,MAAMwL,aACzBoB,cAAe,SAAApB,GAAY,OAAI,EAAKjL,SAAS,CAAEiL,kBAC/CqB,eAAgB,SAAC5Q,GACf,IAAM6Q,EAAQpB,MAASxP,OAAO,cAC9B,OAAOD,EAAI8Q,KAAKD,EAAO,QAAU,GAAKpB,IAAOzP,GAAK+Q,SAASxD,EAAO,KAEpEyD,cAAe,EACfC,OAAO,EACPC,gBAAc,EACdC,QAAS,SAACnN,GAAD,OAAU,EAAKoN,oBAAoBpN,IAE5CqN,QAAS,CACPC,cAAe,WACfC,yBAA0B,gBAAG5R,EAAH,EAAGA,KAAH,uBAAwBA,EAAxB,uCAC1B6R,uBAAwB,gBAAG7R,EAAH,EAAGA,KAAH,uBAAwBA,EAAxB,qCACxB8R,WAAY,cACZC,gBAAiB,QACjBC,eAAgB,gBAAGhS,EAAH,EAAGA,KAAH,kCAAmCA,EAAnC,MAChBiS,kBAAmB,gBAAGjS,EAAH,EAAGA,KAAH,uBAAwBA,EAAxB,qBACnBkS,SAAU,YACVC,OAAQ,aACRC,eAAgB,sEAChBC,2BAA4B,6BAC5BC,QAAS,oBACTC,gBAAiB,4CACjBC,gBAAiB,iDACjBC,+BAAgC,6JAChCC,kBAAmB,qBACnBC,oBAAqB,4BACrBC,kBAAmB,uDACnBC,oBAAqB,iBACrBC,mBAAoB,qDACpBC,6BAA8B,yCAC9BC,cAAe,mBACfC,eAAgB,6BAChBC,aAAc,gBACdC,mBAAoB,kCACpBC,kBAAmB,4BACnBC,2BAA4B,qCAC5BC,iBAAkB,0BAGpBC,oBAAqB9C,EAErB+C,eAAgBhD,EAChBiD,YAAapD,EACbqD,qBAAsBnD,Y,GA3IJ1M,IAAMC,WAqJxC2L,EAAoBhJ,aAAe,CACjCpC,MAAO,IAmBMoL,QC5EAkE,E,kDA9Fb,WAAY3S,GAAQ,IAAD,sBACjB,cAAMA,GAGN,IAAI4S,EAAgBzO,OAAO0O,WAJV,OAMjB,EAAKzP,MAAQ,CAEXiK,SAAUuF,EAAgB,KAG5B,EAAKxE,YAAc,EAAKA,YAAY7K,KAAjB,gBAEnBY,OAAO2O,iBAAiB,UAAU,WAEhC,IAAIxF,EAAS,OAETnJ,OAAO0O,WAAa,MACtBvF,EAAS,GAEX,EAAK3J,SAAS,CACZ0J,SAAUC,OArBG,E,+CA0BnB,WACEvN,KAAK4D,SAAS,CACZ0J,UAAWtN,KAAKqD,MAAMiK,a,oBAI1B,WACE,IAAQ0F,EAAgBhT,KAAKC,MAArB+S,YACFzF,EAASvN,KAAKqD,MAAMiK,SAAW,OAAS,EAI9C,OAFAxM,QAAQC,IAAIf,KAAKC,MAAMgT,cAGrB,yBAAKnR,UAAU,qBACb,4BACEA,UAAWyM,IAAG,6BAA8B,CAC1C,4BAA6BvO,KAAKqD,MAAMiK,WAE1ClL,QAASpC,KAAKqO,aAEbrO,KAAKC,MAAMiT,MAAQlT,KAAKC,MAAMiT,MAAQ,kBAEzC,kBAAC,IAAD,CAAezE,SAAU,IAAKlB,OAAQA,GAEpC,0BAAMzL,UAAU,2BACd,wBAAIA,UAAU,2BAA2BuD,GAAG,oBACzCrF,KAAKC,MAAMiT,MAAQlT,KAAKC,MAAMiT,MAAQ,qBAGzC,6BACEpR,UAAU,sBACVqR,kBAAgB,oBAEfnT,KAAKC,MAAMgT,aAAe,EACzB,wBAAInR,UAAU,8BACX9B,KAAKC,MAAMiK,UAGd,yBAAKpI,UAAU,iCAAf,oCAMH9B,KAAKC,MAAMgT,aAAe,EACzB,yBAAKnR,UAAU,0BACb,4BACEA,UAAU,wCACVqD,KAAK,SACL/C,QAAS4Q,GAHX,cAQA,Y,GAjF4BlQ,IAAMC,WCenCqQ,E,4JAhBd,WACC,OACC,kBAAC,IAAMnO,SAAP,KACC,wBAAInD,UAAU,eAAd,kBACA,wBAAIA,UAAU,yCACZ9B,KAAKC,MAAMiK,e,GAPiBpH,IAAMC,WCIlCsQ,EAAoB,kBACxB,yBAAKpQ,MAAM,6BAA6BC,QAAQ,aAAY,0BAAMC,EAAE,yKAAwK,0BAAMA,EAAE,0KAWhPmQ,EAAqB,kBACzB,yBAAKrQ,MAAM,6BAA6BC,QAAQ,aAAY,0BAAMC,EAAE,qKAAoK,0BAAMA,EAAE,yKAG5OoQ,EAAa,kBACjB,yBAAKrQ,QAAQ,YAAYD,MAAM,8BAA6B,0BAAME,EAAE,kKAGhEqQ,EAAY,kBAChB,yBAAKtQ,QAAQ,YAAYD,MAAM,8BAA6B,0BAAME,EAAE,+EC0FvDsQ,E,4MAtGbC,yBAA2B,SAACtR,GAAD,OAAa,YAC1B,UADuC,EAAVJ,KAEvCI,M,kDAXJ,SAAauR,EAAMC,GACbD,GAAQC,GAAWD,EAAO,IAC9B3T,KAAKC,MAAM+D,SAAS2P,GAEkB,MAAnCE,SAASC,eAAe,SACzBD,SAASC,eAAe,QAAQC,MAAM,CAACC,eAAe,O,wBAU1D,SAAWL,EAAMM,EAAajS,GAC5B,IAAIkS,EAAgBP,IAASM,EAC7B,OACE,wBAAInS,UAAWyM,IAAG,0BAA4B2F,EAAgB,YAAc,cAAgBlS,IAAKA,GAC/F,4BAAQF,UAAWyM,IAAG,iEAAkED,SAAS,IAAIlM,QAASpC,KAAKmU,aAAa3Q,KAAKxD,KAAM2T,GAAOS,WAAYpU,KAAK0T,yBAAyB1T,KAAKmU,aAAa3Q,KAAKxD,KAAM2T,IAAQT,MAAOgB,EAAgB,eAAH,qBAAkCP,EAAO,GAAKU,eAAcH,EAAgBP,EAAO,OAAIpE,GAC1U,0BAAMzN,UAAU,eAAhB,QAA0C6R,EAAO,M,oBAMzD,WAAU,IAAD,OACP,EAA2B3T,KAAKC,MAAxB6J,EAAR,EAAQA,MAAOwK,EAAf,EAAeA,QACPC,EAAgBzK,EAAhByK,MAAOC,EAAS1K,EAAT0K,KACPC,EAAaH,EAAbG,SACFb,EAAUc,KAAKC,KAAKF,EAAWD,GAC/BP,EAAcM,EAAQC,EACtBI,EAAa5U,KAAKC,MAAM8M,QAAQ8H,mBAAqB,EAE3D,GAAiB,IAAbJ,EACF,MAAQ,GAGV,IAAIK,EAAab,EAAc,EAAI,EAAI,EAAIA,EAAc,EACrDc,EAAWD,EAAaF,EAAahB,EAAUA,EAAUkB,EAAaF,EAEtEG,EAAWD,EAAaF,GAAcE,EAAa,IACrDA,EAAaC,EAAWH,GACP,IAAKE,EAAa,GAIrC,IADA,IAAIE,EAAQ,GACHrB,EAAOmB,EAAYnB,EAAOoB,EAAUpB,IACvCqB,EAAM5O,QAAQuN,GAAQ,GACxBqB,EAAMnT,KAAK8R,GAIf,IAAIsB,EAAmC,IAAhBhB,EACnBiB,EAAkBjB,EAAc,EAAI,EACpCkB,EAAkBlB,EAAc,GAAKL,EACrCwB,EAA8B,IAAZxB,GAAiBK,IAAgBL,EAAU,EAEjE,OACE,yBAAK9R,UAAU,aAAaqJ,KAAK,aAAagI,kBAAgB,uBAC5D,wBAAI9N,GAAG,sBAAsBvD,UAAU,eAAvC,cACA,wBAAIA,UAAU,wBACZ,wBAAIA,UAAWyM,IAAG,kDAAmDvM,IAAI,SACvE,4BAAQF,UAAWyM,IAAG,+DAAgE,CAAC,cAAe0G,IAAmB3G,SAAU2G,EAAkB,KAAO,IAAK7S,QAASpC,KAAKmU,aAAa3Q,KAAKxD,KAAM,GAAIoU,WAAapU,KAAK0T,yBAAyB1T,KAAKmU,aAAa3Q,KAAKxD,KAAM,IAAMkT,MAAM,oBAC7R,0BAAMpR,UAAU,eAAhB,cACA,0BAAMuT,cAAaJ,EAAkB,OAAS,SAC5C,kBAAC,EAAD,SAIN,wBAAInT,UAAWyM,IAAG,qDAAsDvM,IAAI,QAC1E,4BAAQF,UAAWyM,IAAG,8DAA+D,CAAC,cAAe2G,IAAkB5G,SAAU4G,EAAiB,KAAO,IAAK9S,QAASpC,KAAKmU,aAAa3Q,KAAKxD,KAAMiU,EAAc,GAAIG,WAAapU,KAAK0T,yBAAyB1T,KAAKmU,aAAa3Q,KAAKxD,KAAMiU,EAAc,IAAKf,MAAM,sBAAsBoC,IAAI,YAC/U,0BAAMxT,UAAU,eAAhB,iBACA,0BAAMuT,cAAaH,EAAkB,OAAS,SAC5C,kBAAC,EAAD,SAIN,4BACE,wBAAIpT,UAAU,6BACbkT,EAAMrN,KAAI,SAACgM,EAAM4B,GAAP,OAAe,EAAKC,WAAW7B,EAAMM,EAAasB,QAG/D,wBAAIzT,UAAWyM,IAAG,iDAAkDvM,IAAI,QACtE,4BAAQF,UAAWyM,IAAG,8DAA+D,CAAC,cAAe4G,IAAkB7G,SAAU6G,EAAiB,KAAO,IAAK/S,QAASpC,KAAKmU,aAAa3Q,KAAKxD,KAAMiU,EAAc,EAAGL,GAAUQ,WAAapU,KAAK0T,yBAAyB1T,KAAKmU,aAAa3Q,KAAKxD,KAAMiU,EAAc,EAAGL,IAAYV,MAAM,kBAAkBoC,IAAI,QAC9V,0BAAMxT,UAAU,eAAhB,aACA,0BAAMuT,cAAaF,EAAiB,OAAS,SAC3C,kBAAC,EAAD,SAIN,wBAAIrT,UAAWyM,IAAG,iDAAkDvM,IAAI,OACtE,4BAAQF,UAAWyM,IAAG,8DAA+D,CAAC,cAAe6G,IAAkB9G,SAAU8G,EAAiB,KAAO,IAAKhT,QAASpC,KAAKmU,aAAa3Q,KAAKxD,KAAM4T,EAAU,GAAIQ,WAAapU,KAAK0T,yBAAyB1T,KAAKmU,aAAa3Q,KAAKxD,KAAM4T,EAAU,IAAMV,MAAM,mBAC9S,0BAAMpR,UAAU,eAAhB,aACA,0BAAMuT,cAAaD,EAAiB,OAAS,SAC3C,kBAAC,EAAD,e,GAjGkBtS,IAAMC,W,aCgClC0S,E,4JACJ,WACE,MAMIzV,KAAKC,MALPwU,EADF,EACEA,SACAF,EAFF,EAEEA,MACAC,EAHF,EAGEA,KAEAkB,GALF,EAIEC,cAJF,EAKED,WAEIzB,EAAcM,EAAQC,EACtBZ,EAAUc,KAAKC,KAAKF,EAAWD,GACrC,OACE,kBAAC,IAAMvP,SAAP,KA7CN,SAA2BgP,EAAaQ,EAAUD,EAAMZ,EAAS+B,EAAeD,GAE9E,IAAIE,EAAU,GACVC,EAAc,GAsBlB,OArBIpB,EAAWD,GACbqB,EAAW,uBAAmB5B,EAAc,EAAjC,eAAyCL,EAAzC,aAAqDa,EAArD,cACXmB,EACE,6CACE,+BAAK3B,EAAc,GADrB,MAEE,+BAAKL,GAFP,OAEuB,2BAAIa,GAF3B,aAKOA,GAAYD,GAAQC,EAAW,GACxCoB,EAAW,kBAAcpB,EAAd,aACXmB,EAAW,yCAAc,2BAAInB,GAAlB,cACW,IAAbA,GACToB,EAAW,kBAAcpB,EAAd,YACXmB,EAAW,yCAAc,2BAAInB,GAAlB,aACW,IAAbA,IAGToB,EADAD,EAAU,IAIZC,EAAcH,EAAYG,EAAc,GAEtC,kBAAC,IAAM5Q,SAAP,KACE,kBAAC,IAAD,CAAa2Q,QAASC,EAAaC,YAAU,WAC7C,uBAAGzQ,GAAG,OAAOiJ,SAAS,KAAKxM,UAAU,0BAA0B8T,IAkB5DG,CAAkB9B,EAAaQ,EAAUD,EAAMZ,EAAS+B,EAAeD,Q,GAb9C5S,IAAMC,WAyBxC0S,EAAoB/P,aAAe,CACjC6O,MAAO,GAGMkB,QCzDTO,GAAY,SAAA/V,GAAK,OACrB,4BAAQ6B,UAAU,6BAA6BE,IAAK/B,EAAMoF,GAAIjD,QAASnC,EAAMmC,SAC3E,0BAAMN,UAAU,eAAhB,iBAGC7B,EAAMiK,WAKL+L,G,0KACJ,SAAqBhS,EAAOiC,EAAQ5C,GAClCtD,KAAKC,MAAMiW,eAAX,kBAAqCjS,EAAMX,MAA3C,aAEA,MAKIyH,EAAQnF,GAAGK,eAAe,CAC5BhC,QACAiC,SACA5C,UAPA6C,EADF,EACEA,SACAjC,EAFF,EAEEA,OACAmC,EAHF,EAGEA,eACAC,EAJF,EAIEA,MAQF,GAAIH,GAAY,EAAG,CAEjB,GAAIE,GAAkBC,EAAO,CAC3B,IAAME,EAAYuE,EAAQnF,GAAGmB,uBAAuB,CAClD9C,QACAX,QACAgD,QACApC,WAGF6G,EAAQnF,GAAGqB,0BAA0BT,GAIvCxG,KAAKC,MAAM+D,SAASC,EAAOiC,EAAOc,QAAO,SAACwF,EAAGjL,GAAJ,OAAUA,IAAM4E,S,oBAI7D,WAAU,IAAD,OACCiB,EAAgBpH,KAAKC,MAArBmH,YACR,OAAQA,EAAY9D,MAAMqE,KAAI,SAACwO,EAAK5U,GAAN,OAC5B,kBAAC,GAAD,CACES,IAAKT,EACL8D,GAAI9D,EACJa,QAAS,kBAAM,EAAKgU,qBAAqBhP,EAAYnD,MAAOmD,EAAY9D,MAAO6S,KAG9EA,EAAIvW,QAAQ,IAAK,e,GA3CEkD,IAAMC,WAkD5BsT,G,2KACJ,SAAsBpS,GACpBjE,KAAKC,MAAMiW,eAAX,kBAAqCjS,EAAMX,MAA3C,aACAtD,KAAKC,MAAM+D,SAASC,EAAO,M,oBAG7B,WAAU,IAAD,OACCmD,EAAgBpH,KAAKC,MAArBmH,YAEFmN,EAAQxF,IAAO3H,EAAY9D,MAAM,IAEvCiR,EAAM+B,MAEN,IAAMC,EAAiBhC,EAAMhV,OAAO,cAE9BiX,EAAMzH,IAAO3H,EAAY9D,MAAM,IAErCkT,EAAIF,MAEJ,IAAMG,EAAeD,EAAIjX,OAAO,cAI1BmX,EAFOnC,EAAMnE,KAAKoG,EAAK,QAEL,UAAMD,EAAN,cAA0BE,GAAiBF,EACnE,OACE,kBAAC,GAAD,CAAWnU,QAAS,kBAAM,EAAKuU,sBAAsBvP,EAAYnD,SAC9DyS,O,GA1BoB5T,IAAMC,WAiC7B6T,G,qKACJ,SAAgB3S,GACdjE,KAAKC,MAAMiW,eAAX,8BAAiDjS,EAAMX,MAAvD,MAEAtD,KAAKC,MAAM+D,SAASC,EAAO,MAE3B,IAAMC,EAASC,IAAY1E,MAAM2E,OAAOC,SAASC,QAE7CJ,EAAOI,eACFJ,EAAOI,OAEhB,IAAMC,EAAcJ,IAAYK,UAAUN,GAG1C,GAAIE,OAAOK,QAAQC,UACjB,GAAIH,EAAa,CACf,IAAM2C,EAAM,UAAM9C,OAAOC,SAASO,SAAtB,aAAmCR,OAAOC,SAASQ,MAAnD,OAA0DT,OAAOC,SAASS,SAA1E,YAAsFP,GAClGH,OAAOK,QAAQC,UAAU,CAAEK,KAAMmC,GAAU,GAAIA,OAC1C,CACL,IAAMA,EAAM,UAAM9C,OAAOC,SAASO,SAAtB,aAAmCR,OAAOC,SAASQ,MAAnD,OAA0DT,OAAOC,SAASS,UACtFV,OAAOK,QAAQC,UAAU,CAAEK,KAAMmC,GAAU,GAAIA,QAGjD9C,OAAOC,SAASC,OAASC,I,oBAI7B,WAAU,IAAD,OACC6C,EAAgBpH,KAAKC,MAArBmH,YACR,OACE,kBAAC,GAAD,CAAWhF,QAAS,kBAAM,EAAKyU,gBAAgBzP,EAAYnD,SACxDmD,EAAY9D,W,GA/BOR,IAAMC,WA0FnB+T,G,4JApDb,WAAU,IAAD,OAGDC,EAFY/W,KAAKC,MAAf6J,MAEakN,aAAahQ,QAAO,SAAAI,GAAW,OAAIA,EAAY9D,OAC/D8D,EAAY9D,MAAMpC,OAAS,KAG1B+V,EAAa,CACjB,aAAchB,GACd,cAAeI,GACfxO,KAAM+O,IAGR,OACE,kBAAC,IAAD,MACG,gBAAGV,EAAH,EAAGA,eAAH,OACC,kBAAC,IAAMjR,SAAP,KACG8R,EAAO7V,OAAS,GACf,yBAAKY,UAAU,sBACb,wBAAIA,UAAU,eAAd,qCAGA,uBAAGA,UAAU,eAAb,uDAICiV,EAAO/P,QAAO,SAAAI,GAAW,OAAKA,EAAY8P,YAAUvP,KAAI,SAACP,EAAa7F,GAErE,IAAM4V,EAAcF,EAAW7P,EAAYjC,MAC3C,OACE,kBAACgS,EAAD,iBACM,EAAKlX,MADX,CAEE+B,IAAKT,EACL6F,YAAaA,EACb8O,eAAgBA,iB,GAnCFpT,IAAMC,W,UCY3BqU,G,kDAlJd,WAAYnX,GAAQ,IAAD,8BAClB,cAAMA,IACEoC,SAAW,EAAKA,SAASmB,KAAd,gBACnB,EAAKuJ,QAAU,GAHG,E,4CAMnB,YAAmB,IAIVsK,EAJS,EAAR/T,MAKHgH,EAAStK,KAAKC,MAAMqX,WAAW5W,MAAM,qBAAIuD,QAAuBoT,KAOrErX,KAAKC,MAAM+D,SAASsG,EAAOrG,MAAOqG,EAAOiN,S,+BAI3C,WAECzW,QAAQC,IAAI,iC,0BAQb,SAAayW,GACZ1W,QAAQC,IAAIyW,K,oBAGb,WAAU,IAAD,OACAF,EAAetX,KAAKC,MAApBqX,WACR,GAA0B,IAAtBA,EAAWpW,OAAgB,OAAO,KACvBlB,KAAKC,MAAMqX,WAAW5W,MAAM,sBAAI4C,SAE/CgU,EAAW3P,KAAI,SAAC0P,GACf,IAAQpT,EAAiBoT,EAAjBpT,MAAOe,EAAUqS,EAAVrS,MACA,EAAK+H,QAAQrM,MAAK,SAAC8W,GAAD,OAAYA,EAAOlU,QAAUW,MAE7D,EAAK8I,QAAQlL,KAAK,CACjByB,MAAOW,EACPe,MAAOA,OAKV,IAAMyS,EAAuB,CAC5BC,QAAS,SAAAC,GAAM,kCACXA,GADW,IAEdC,gBAAiB,OACjBC,YAAa,UACbC,SAAU,OACVC,aAAc,UACdC,QAAS,YAEVzM,UAAW,SAAAoM,GAAM,kCACbA,GADa,IAEhBM,SAAU,WACV,kBAAmB,CAClBC,OAAQ,yBACRC,QAAS,QAEV,4CAA4C,2BACxCR,EAAO,8CADX,IAECM,SAAU,YAGZT,OAAQ,SAACG,EAAD,GAAyC,IAA9BS,EAA6B,EAA7BA,WAAYC,EAAiB,EAAjBA,WAC7B,OAAO,2BACLV,GADF,IAEDC,gBAAiBQ,EACd,MACAC,EACA,UACA,OACHC,MAAO,UACPR,SAAU,OACVS,OAAQH,EAAa,cAAgB,UACrCJ,QAAS,gBACT,UAAW,CACVJ,gBAAiB,cAInBY,mBAAoB,SAAAb,GAAM,kCACtBA,GADsB,IAEzBc,QAAS,UAEVC,kBAAmB,SAAAf,GAAM,kCACrBA,GADqB,IAExBW,MAAO,aAERK,KAAM,SAAAhB,GAAM,kCACRA,GADQ,IAEXiB,WAAY,IACZC,cAAe,IACfC,OAAQ,IACRf,aAAc,aAEfgB,SAAU,SAAApB,GAAM,kCACZA,GADY,IAEfK,QAAS,IACTc,OAAQ,IACRvL,OAAQ,OACRsK,YAAa,UACbE,aAAc,UACda,WAAY,IACZC,cAAe,IACff,SAAU,UAEXkB,YAAa,SAAArB,GAAM,kCACfA,GADe,IAElBG,SAAU,UAEXmB,cAAe,SAAAtB,GAAM,kCACjBA,GADiB,IAEpBG,SAAU,WAIZ,OACC,yBAAKhW,UAAU,8CACd,2BAAOoD,QAAQ,WAAf,mBACA,kBAAC,KAAD,CACClB,SAAUhE,KAAKqC,SACf0K,QAAS/M,KAAK+M,QACd4K,OAAQF,S,GArImB3U,IAAMC,WC0BvBmW,G,4JAzBX,WAEI,MAA2BlZ,KAAKC,MAAhC,EAAQ6J,MAGR,OAHA,EAAewK,QACPG,SAEO,EACH,GAIV,yBAAK3S,UAAU,0BACb,iK,GAbwBgB,IAAMC,WCkC3BoW,GAvBiB,2BAC3BC,KAD2B,IAE9BpC,aAAa,2BACRoC,IAAqBpC,cADd,IAEVnP,KAAMuE,EACN,aAAcE,EACd,cAAeoC,EACfnD,UAAWqH,EACXyG,aAAcvC,KAEhBxC,QAAQ,2BACH8E,IAAqB9E,SADnB,IAELhK,OAAQtL,EACRsa,KAAMlG,EACNmG,SAAU9F,EACV+F,YAAa/D,EACbgE,aAAcP,KAEhB5B,WAAY,CACVqB,KAAMvB,M,UC3BK,IACXsC,U,4JCCF,WAAU,IAAD,OACP,EAA2B1Z,KAAKC,MAAxBH,EAAR,EAAQA,IAEJmC,GAFJ,EAAaC,UAEK,MAIlB,OAHI5B,MAAMC,QAAQT,EAAIqC,iBACpBF,EAAcnC,EAAIqC,cAActC,KAAK,QAGrC,wBACEiC,UAAU,0CACVM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KAEnC,uBAAGiC,KAAM/B,KAAKsC,iBAAiBxC,IAC/B,yBAAKgC,UAAU,WACf,yBAAKA,UAAU,OACZhC,EAAI6Z,oBAAsB7Z,EAAI6Z,mBAAmBzY,OAChD,6BAASY,UAAU,oBACjB,4BACE8X,MAAM,oBACNC,OAAM,UAAK/Z,EAAI6Z,mBAAmB,GAA5B,oDAA0E7Z,EAAI6Z,mBAAmB,GAAjG,iDAER,yBACEG,IAAG,UAAKha,EAAI6Z,mBAAmB,GAA5B,0DACHI,IAAI,GACJ5R,MAAO,CAAE6R,MAAO,QAChBlY,UAAU,sBAId,6BAASA,UAAU,oBACjB,yBAAKgY,IA5BU,gFAiCrB,yBAAKhY,UAAU,QACZG,EACC,0BAAMH,UAAU,kBAAkBG,GAChC,KAEJ,yBAAKH,UAAU,mBAAf,wGAEA,wBAAIA,UAAU,aAAaS,wBAAyB,CAAEC,OAAQ1C,EAAI4C,oBAGjE5C,EAAIma,yBACD,wBAAInY,UAAU,cAAchC,EAAIma,0BAIpC,uBACEnY,UAAU,UACVS,wBAAyB,CAAEC,OAAQ1C,EAAI8C,cAGxC9C,EAAIoa,kCACH,yBAAKpY,UAAU,sCACb,0CACA,2BACGxB,MAAMC,QAAQT,EAAIoa,mCACjBpa,EAAIoa,iCAAiCvS,KAAI,SAACwS,GAAD,OACvC,0BAAMrY,UAAU,OAAOqY,SAM/Bra,EAAIsa,6BACJta,EAAIua,sBACJva,EAAIwa,mBACJ,yBAAKxY,UAAU,wBACb,2BACGhC,EAAIsa,6BACH,0BAAMtY,UAAU,sCACd,0BAAMA,UAAU,mBAAhB,uBAGHhC,EAAIua,sBACH,0BAAMvY,UAAU,+BACd,0BAAMA,UAAU,mBAAhB,gBAGHhC,EAAIwa,kBACH,0BAAMxY,UAAU,2BACd,0BAAMA,UAAU,mBAAhB,iBAOThC,EAAIya,gBACH,yBAAKzY,UAAU,yBACb,2BACGxB,MAAMC,QAAQT,EAAIya,iBACjBza,EAAIya,eAAe5S,KAAI,SAAC6S,GAAD,OACrB,uBACE1Y,UAAU,MACVC,KAAI,cAAS,EAAK0Y,kBAAkBD,KAEnC,EAAKC,kBAAkBD,SAOpC,yBAAK1Y,UAAU,wBACb,0BAAMA,UAAU,yBACbhC,EAAI+C,4B,GA/GoB7D,GDEnC0b,W,4JEAF,WAAU,IAAD,OACP,EAA2B1a,KAAKC,MAAxBH,EAAR,EAAQA,IAAR,EAAaoC,UAEb,OACE,wBAAIJ,UAAU,0CAA0CM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KAOzF,yBAAKgC,UAAU,QAEb,wBAAIA,UAAU,cACZ,uBAAGC,KAAM/B,KAAKsC,iBAAiBxC,GAAMyC,wBAAyB,CAACC,OAAQ1C,EAAI6C,uBAG7E,uBAAGb,UAAU,UAAUS,wBAAyB,CAACC,OAAQ1C,EAAI8C,cAE7D,yBAAKd,UAAU,wBAEb,0BAAMA,UAAU,yBAAyBhC,EAAI+C,0B,GAvBlB7D,GFGnC2b,U,4JGFF,WAAU,IAAD,OACP,EAA2B3a,KAAKC,MAAxBH,EAAR,EAAQA,IAAR,EAAaoC,UAEb,OACE,wBAAIJ,UAAU,0CAA0CM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KACzF,uBAAGiC,KAAM/B,KAAKsC,iBAAiBxC,IAE/B,yBAAKgC,UAAU,QACZhC,EAAIqC,eAAiBrC,EAAIqC,cAAcjB,QAAUpB,EAAI6C,mBAAmByF,gBAAkBtI,EAAIqC,cAAc,GAAGiG,eAC9G,yBAAKtG,UAAU,+BACb,2BACI,0BAAMA,UAAU,kBAAkBhC,EAAIqC,cAAc,MAK5D,wBAAIL,UAAU,aAAaS,wBAAyB,CAAEC,OAAQ1C,EAAI6C,sBAGlE,uBAAGb,UAAU,UAAUS,wBAAyB,CAACC,OAAQ1C,EAAI8C,cAE9D,yBAAKd,UAAU,wBAEZ,0BAAMA,UAAU,yBAAyBhC,EAAI+C,2B,GAxBlB7D,GHInC4b,O,4JIHF,WAAU,IAAD,OACP,EAA2B5a,KAAKC,MAAxBH,EAAR,EAAQA,IAAR,EAAaoC,UAEb,OACE,wBACEJ,UAAU,uCACVM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KAEnC,uBAAGiC,KAAM/B,KAAKsC,iBAAiBxC,IAE/B,yBAAKgC,UAAU,QAEb,wBAAIA,UAAU,aAAaS,wBAAyB,CAAEC,OAAQ1C,EAAI6C,sBAGlE,uBACEb,UAAU,UACVS,wBAAyB,CAAEC,OAAQ1C,EAAI8C,cAGzC,yBAAKd,UAAU,wBACb,0BAAMA,UAAU,yBACbhC,EAAI+C,2B,GAvBiB7D,GJKhC6b,W,4JKHF,WAAU,IAAD,OACP,EAA2B7a,KAAKC,MAAxBH,EAAR,EAAQA,IAAR,EAAaoC,UACb,OACE,wBACEJ,UAAU,2CACVM,QAAS,kBAAM,EAAKnC,MAAMoC,SAASvC,KAEnC,uBAAGiC,KAAM/B,KAAKsC,iBAAiBxC,IAC7B,yBAAKgC,UAAU,QACb,wBAAIA,UAAU,aAAaS,wBAAyB,CAAEC,OAAQ1C,EAAI6C,sBAElE,uBACEb,UAAU,uBACVS,wBAAyB,CAAEC,OAAQ1C,EAAI8C,cAGzC,yBAAKd,UAAU,wBACb,0BAAMA,UAAU,yBACbhC,EAAI+C,2B,GApBmB7D,ICUlC8b,G,kDACJ,WAAY7a,GAAQ,IAAD,8BACjB,cAAMA,IACDoD,MAAQ,CACX0X,WAAW,GAEb,EAAKC,aAAe,EAAKA,aAAaxX,KAAlB,gBALH,E,gDAQnB,WACE,IADa,EACPsG,EAAU9J,KAAKC,MAAf6J,MACFmR,EAAa,GAFJ,eAIOnR,EAAMkN,cAJb,IAIb,2BAAwC,CAAC,IAA9B/S,EAA6B,QAClCA,EAAMA,QAAU6F,EAAMoR,uBAEhBjX,EAAMX,MAEdW,EAAMqD,UAAW,EAEbpH,OAAOC,eAAeC,KAAK6D,EAAO,yBACpCA,EAAMuD,oBAAsB,KAI9ByT,EAAahX,EAAMX,OAhBV,8BAoBb,IAAMY,EAAS,CACbI,OAAQ2W,GAGVlQ,EAAQnF,GAAGqB,0BAA0B/C,GAGrClE,KAAK4D,SAAS,CAAEkG,UAEhB9J,KAAKC,MAAMkb,wB,6BAGb,SAAgBhW,GAKd,GAJI7E,MAAMC,QAAQ4E,KAChBA,EAAOA,EAAK,IAGVA,EACF,OAAQA,EAAKiD,eACX,IAAK,iBACL,IAAK,WACH,OAAOgT,GAAiB1B,UAQ1B,IAAK,UACH,OAAO0B,GAAiBR,OAE1B,IAAK,aACH,OAAOQ,GAAiBP,c,oBAMhC,WAAU,IAAD,OACP,EAWI7a,KAAKC,MAVPob,EADF,EACEA,iBACAC,EAFF,EAEEA,aACAxR,EAHF,EAGEA,MACAwK,EAJF,EAIEA,QACA/H,EALF,EAKEA,qBAEA4O,GAPF,EAMEpO,QANF,EAOEoO,qBACAI,EARF,EAQEA,kBACAC,EATF,EASEA,kBACArH,EAVF,EAUEA,aAGM6C,EAAmClN,EAAnCkN,aAAcM,EAAqBxN,EAArBwN,WAAY9C,EAAS1K,EAAT0K,KAC5BD,EAAQzK,EAAMyK,MAAQzK,EAAMyK,MAAQ,EACpCkH,EAAgCJ,EAAiBrE,aAAazL,UAC9DmQ,EAA2BL,EAAiB/G,QAAQ/I,UACpDoQ,EAAkBN,EAAiB/G,QAAQhK,OAC3CsR,EAAcP,EAAiB/G,QAAQkF,YACvCqC,EAAwBR,EAAiB/G,QAAQwH,OACjDC,EAA8BV,EAAiB/G,QAAQmF,aACvDuC,EAAsBX,EAAiB/G,QAAQgF,KAC/C2C,EAAyBZ,EAAiB/G,QAAQ4H,QAClDC,EAAoBd,EAAiB/G,QAAQiF,SAC7C6C,EAAmBf,EAAiB/G,QAAQ+H,iBAC5CC,EAAwBjB,EAAiBrE,aAAaqC,aAEtDkD,EAAgBlB,EAAiB/D,WAAWqB,KAC5CvM,EAAsB+M,GAA2BnC,aAAanP,KAE9D2U,EAAgBlI,EAAQ4H,QACzB,kBAACD,EAAD,CAAwBX,aAAcA,IACvC,KAEEmB,EAAoC,aAAvB3S,EAAM4S,aACvB,kBAACP,EAAD,iBAAuBnc,KAAKC,MAA5B,CAAmCqb,aAAcA,EAActX,SAAUmQ,KACzE,KAEIwI,EAAyC,WAAvB7S,EAAM4S,cAC3BpI,EAAQnL,KAAKjI,OAASoT,EAAQG,SAC7B,kBAAC2H,EAAqBpc,KAAKC,OAC3B,KAGgC,MAAhCD,KAAKC,MAAM8M,QAAQ6P,WACJ5c,KAAKC,MAAM8M,QAAQ6P,UAEtC,IAAIC,EAAa,SAACC,EAAGC,GAEd,EAAK1Z,MAAM0X,WAQdS,EAAkB,QAAS,QAC3BL,EAAoB2B,EAAGC,IARvB,EAAKnZ,SACH,CACEmX,WAAW,IAEb,WAAOI,EAAoB2B,EAAGC,OASpC,OACE,kBAAC,IAAD,KACE,0BAAMjb,UAAU,mBAAmBkb,aAAa,OAE9C,yBAAKlb,UAAU,iBAAiBkb,aAAa,OAC3C,kBAAC5Q,EAAD,iBACMpM,KAAKC,MADX,CAEEuJ,cAAc,EACdvF,MAAM,mBACNe,MAAM,uBACN6E,UAAW0R,EACXvX,SAAU6Y,EACVvZ,MAAO0T,EAAatW,MAAK,SAACuc,GAAD,MAAqB,qBAAbA,EAAGhZ,SAA8BX,SAEpE,kBAACgZ,EAAD,iBAA2Btc,KAAKC,MAAhC,CAAuC+D,SAAU6Y,OAGrD,yBAAK/a,UAAU,kBACb,2BAAOA,UAAU,YACf,kBAAC2Z,EAAD,CACEH,aAAcA,EACdtI,YAAahT,KAAKgb,aAClB/H,aAAcjT,KAAKC,MAAMqU,QAAQG,SACjCvB,MAAOlT,KAAKC,MAAM8M,QAAQmQ,WAIzBlG,EACEhQ,QACC,SAACI,GAAD,OACE,EAAKnH,MAAMkd,eAAe/W,QAAQgB,EAAYnD,QAAU,IACvDmD,EAAY8P,YAEhBvP,KAAI,SAACP,EAAa7F,GACjB,IAAQ4D,EAAwCiC,EAAxCjC,KAAMlB,EAAkCmD,EAAlCnD,MAAOmZ,EAA2BhW,EAA3BgW,WAAYC,EAAejW,EAAfiW,WAC3BC,EAAkBjC,EAAiBrE,aAAa7R,GAChD0H,EAhLD,SAAC1H,EAAMmP,EAASrQ,EAAOmZ,EAAYC,GACxD,MAAgB,uBAATlY,GACFmP,EAAQzH,OAAOuQ,IAAe,IAAI5b,OAAO8S,EAAQzH,OAAOwQ,IAAe,IAC/D,eAATlY,GAAkC,gBAATA,EACvBmP,EAAQzH,OAAO5I,IAAU,GACzB,KA2KyBsZ,CACbpY,EACAmP,EACArQ,EACAmZ,EACAC,GAGF,OACE,kBAACC,EAAD,eACEtb,IAAKT,GACD,EAAKtB,MACLmH,EAHN,CAIEkU,aAAcA,EACdzO,OAAQA,EACRN,qBAAsBA,EACtBvI,SAAUmX,UAOtB,yBAAKrZ,UAAU,WACb,yBACEA,UACEkV,EAAatW,MAAK,SAACuc,GAAD,MAAqB,qBAAbA,EAAGhZ,SAC1BX,OAAStD,KAAKC,MAAM8M,QAAQyQ,uBAC3B,0BACA,uCAGN,kBAAC9B,EAAD,CAA0BJ,aAAcA,GACtC,kBAACO,EAAD,CAAuBP,aAAcA,GAEnC,yBAAKxZ,UAAU,0BACb,yBAAKA,UAAU,yBACb,kBAAC8Z,EAAD,CACEN,aAAcA,EACd7G,SAAUH,EAAQG,SAClBF,MAAOA,EACPC,KAAMA,EACNxQ,SAAUmQ,EACVwB,cAAe3V,KAAKC,MAAM8M,QAAQ0Q,WAAa,KAC/C/H,UACEsB,EAAatW,MACX,SAACuc,GAAD,MAAqB,qBAAbA,EAAGhZ,SACXX,QAGLkZ,GAEH,kBAACD,EAAD,CACEjB,aAAcA,EACdtX,SAAUwX,EACVlE,WAAYA,MAKlB,kBAACyE,EAAgC/b,KAAKC,OAEtC,kBAAC+b,EAAD,CAAqBV,aAAcA,GAChChH,EAAQnL,KAAKxB,KAAI,SAAC7H,EAAKyB,GACtB,IAAImc,EACF,EAAKC,gBAAgB7d,EAAI+C,oBACzB8Y,EAEF,OACE,kBAAC+B,EAAD,CACEpC,aAAcA,EACdxb,IAAKA,EACLiX,OAAQC,EACRhV,IAAKlC,EAAIuF,IAAM9D,EACfc,SAAU,EAAKpC,MAAM2d,YACrBC,YAAatc,EACbiT,KAAMA,EACND,MAAOA,EACPrS,UAAWoS,EAAQwJ,aAAahe,EAAIuF,IACpCtF,SAAU,EAAKE,MAAM8M,QAAQhN,cAKlC4c,GAEFF,W,GA9PwB3Z,IAAMC,WAwQ/C+X,GAA2BpV,aAAe,CACxC4V,cAAc,EACdD,iBAAkBlC,GAClBuD,aAAc,WACdlI,KAAM,GACNwC,aAAc,CACZ,CACE7R,KAAM,OAAQlB,MAAO,MAGzBqT,WAAY,GACZ/K,sBAAuB,EACvBwR,eAAe,EACfZ,eAAgB,CAAC,eAAgB,oBAAqB,gBAAiB,oBAAqB,sBAC5FpQ,QAAS,IAoBI+N,UCpSTkD,I,QAAwB,SAACC,GAA8B,IAAlBlR,EAAiB,uDAAP,GAEnD,EAA2BhC,EAAQnF,GAAGC,uBAA9B3B,EAAR,EAAQA,OAAQ6B,EAAhB,EAAgBA,OAEZmY,EAAoBD,EAAW5a,MAAMyG,MAAMkN,aAG/CkH,EAAkBzW,SAAQ,SAACL,GAErBlH,OAAOie,UAAUhe,eAAeC,KAAK2M,EAAQ,mBAAqB3F,EAAYnD,QAAU8I,EAAQmO,iBAElG9T,EAAY9D,MAAQY,EAAOI,QAGzByG,EAAQpF,wBAAwBjF,MAAK,SAAC0d,GAAD,OAAiBA,IAAgBhX,EAAYnD,WACpFmD,EAAc2D,EAAQnF,GAAGuB,oBAAoB,CAC3CpB,SACAqB,sBAKuBmI,IAAvBxC,EAAQsR,YAAkD,iBAAtBjX,EAAYnD,YAAkDsL,IAAtBnI,EAAY9D,QAAgD,IAAzB8D,EAAY8P,WAC7H9P,EAAY9D,MAAQ,CAACyJ,EAAQsR,gBAIjCJ,EAAW5a,MAAMyG,MAAMyK,MAAQ0J,EAAW5a,MAAMyG,MAAMyK,OAAS,EAE/D0J,EAAW5a,MAAMyG,MAAMwU,KAAOvR,EAAQwR,YACtCN,EAAWO,UAAUP,EAAW5a,MAAMyG,SAoIhC2U,GAAO5K,SAASC,eAAe,WAEjC2K,GAEEve,OAAOC,eAAeC,KAAKqe,GAAKC,QAAS,4BApIpC,SAACC,GACZ,IAAMC,EAAW,CACfC,MAAM,EAENC,iBAAiB,EAEjBle,IAAK,GAELoW,aAAc,CACZ,CAAChS,MAAO,qBAAsBf,MAAO,mBAAoBkB,KAAM,OAAQ+R,UAAU,GACjF,CAAClS,MAAO,YAAaf,MAAO,eAAgBkB,KAAM,aAAcmC,UAAU,EAAM4P,UAAU,GAC1F,CAAClS,MAAO,OAAQf,MAAO,oBAAqBkB,KAAM,aAAcmC,UAAU,EAAM4P,UAAU,GAC1F,CAAClS,MAAO,aAAcf,MAAO,gBAAiBkB,KAAM,aAAcmC,UAAU,EAAM4P,UAAU,GAC5F,CAAClS,MAAO,OAAQf,MAAO,oBAAqBkB,KAAM,cAAemC,UAAU,EAAM4P,UAAU,GAC3F,CAAClS,MAAO,kBAAmBf,MAAO,qBAAsBkB,KAAM,aAAc2H,WAAW,EAAMtF,oBAAqB,GAAI0P,UAAU,IAGlIgE,eAAgB,mBAChB5D,WAAY,CAKV,CAACjS,GAAI,QAASL,MAAO,YAAaf,MAAO,QAASsT,MAAO,QACzD,CAAClS,GAAI,oBAAqBL,MAAO,OAAQf,MAAO,oBAAqBsT,MAAO,QAC5E,CAAClS,GAAI,gBAAiBL,MAAO,MAAOf,MAAO,mBAAoBsT,MAAO,QAGxEwH,mBAAqB,GAErBC,GAAI,CACFC,GAAI,mBACJC,sBAAsB,GAExBxC,aAAc,WACdlI,KAAM,GAENzU,SAAUqE,OAAOC,SAAStE,SAC1ByJ,cAAc,EACd2V,QAAS,GACTZ,YAAa,IAGTxR,EAAU7M,OAAOyJ,OAAOiV,EAAUD,GAEzB5R,EAAQuK,WAAW3P,KAAM,SAAA6P,GAClCA,EAAOvT,QAAU8I,EAAQwR,cAC3B/G,EAAOlU,MAAQkU,EAAOD,UAM1BxK,EAAQiK,aAAejK,EAAQiK,aAAarP,KAAI,SAAAP,GAAgB,IAAD,EAI7D,OAHA,UAAIuX,EAASI,0BAAb,aAAI,EAA6BtY,SAASW,EAAYnD,UACpDmD,EAAY8P,UAAW,GAElB9P,KAIT,IAAMgY,EAAqBT,EAASU,eAAgB,EAIpDtS,EAAQC,SAAW,QACSuC,IAAxBoP,EAASN,WACXtR,EAAQiK,aAAavP,SAAQ,SAACL,GACF,iBAAtBA,EAAYnD,QACbmD,EAAY8P,UAAYkI,EAAmBle,OAAS,KACrD6L,EAAQC,SAAW,CAAC2R,EAASN,gBAKjCtR,EAAQC,SAAWoS,EAGrBrS,EAAQoS,QAAQtd,KAAK,CAACoC,MAAO,eAAgBkB,KAAM,aAAc7B,MAAOyJ,EAAQC,WAGhF,IAAMiR,EAAa,IAAIqB,IAAW,CAChCT,KAAM9R,EAAQ8R,KACdC,gBAAiB/R,EAAQ+R,gBACzBle,IAAKmM,EAAQnM,IACb2e,SAAUxS,EAAQwS,SAClBvI,aAAcjK,EAAQiK,aAEtBM,WAAYvK,EAAQuK,WACpBoF,aAAc3P,EAAQ2P,aACtBlI,KAAMzH,EAAQyH,KACdwK,GAAIjS,EAAQiS,GACZ9D,eAAgBnO,EAAQmO,eACxBiE,QAASpS,EAAQoS,QAIjBnb,SAAU,SAACX,EAAOmc,GAAR,OAERC,IAASC,OACP,kBAAC,GAAD,iBACMrc,EACAmc,EAFN,CAGEnE,iBAAkBlC,GAClBmC,cAAc,EAEdsC,YAAa,aACbrR,sBAAuB,EACvBQ,QAASA,KAEX8G,SAASC,eAAe,eAK9BkK,GAAsBC,EAAYlR,GAIlC3I,OAAOub,WAAa,WAClB3B,GAAsBC,EAAYlR,IAchC6S,CADiBC,KAAKpgB,MAAMgf,GAAKC,QAAQoB,2BAIzChf,QAAQif,MAAM,8LAIhBjf,QAAQif,MAAM,yF","file":"static/js/main.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport url from 'url';\n\n// Custom class for the result component\nclass FederatedResult extends React.Component {\n\n  dateFormat(date){\n    if (typeof date !== 'undefined') {\n      const prettyDate =  new Intl.DateTimeFormat('en-US', {\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric'\n      }).format(Date.parse(date));\n      return prettyDate;\n    }\n  }\n\n  // https://stackoverflow.com/questions/8358084/regular-expression-to-reformat-a-us-phone-number-in-javascript\n  formatPhoneNumber(phoneNumberString) {\n    let cleaned = ('' + phoneNumberString).replace(/\\D/g, '');\n    let match = cleaned.match(/^(1|)?(\\d{3})(\\d{3})(\\d{4})$/);\n    if (match) {\n      let intlCode = (match[1] ? '+1 ' : '');\n      // return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('');\n      return [match[2], '.', match[3], '.', match[4]].join('');\n    }\n    return null;\n}\n\n  /**\n   * Returns the appropriate link for a given search result.\n   * 1. Use the canonical url if present.\n   * 2. Next, attempt to find a url from the current host.\n   * 3. Then, use the first url returned in the array of urls.\n   * 4. Fall back to the legacy url field.\n   * 5. Send an empty string if none of these options work.\n   *\n   * @param doc\n   *   Search result object\n   * @returns string\n   */\n  getCanonicalLink(doc) {\n    const { hostname } = this.props;\n\n    // 1. Use the canonical url as a first option\n    if (Object.hasOwnProperty.call(doc, 'ss_canonical_url') && doc.ss_canonical_url) {\n      return doc.ss_canonical_url;\n    }\n\n    // Use a url from the current host, if present.  Otherwise use the first Url.\n    if (Object.hasOwnProperty.call(doc, 'sm_urls') && Array.isArray(doc.sm_urls)) {\n      // Attempt to find a url from the current host.\n      const currentHostUrl = doc.sm_urls.find((item) => {\n        const myUrl = url.parse(item);\n        return myUrl.hostname === hostname;\n      });\n\n      // 2. Use the url from the current host.\n      if (currentHostUrl) {\n        return currentHostUrl;\n      }\n\n      // 3. Use the first url.\n      return doc.sm_urls[0];\n    }\n\n    // 4. Fall back to the single url (which will be relative)\n    if (Object.hasOwnProperty.call(doc, 'ss_url') && doc.ss_url) {\n      return doc.ss_url;\n    }\n    console.log(\"test\")\n    // 5. If no valid urls are passed, return nothing. This will result in an\n    // unlinked title, but at least it won't crash.\n    return '';\n  }\n\n  intersperse(arr, sep) {\n    if (arr.length === 0) {\n      return [];\n    }\n\n    return arr.slice(1).reduce(function(xs, x, i) {\n      return xs.concat([sep, x]);\n    }, [arr[0]]);\n  }\n\n  renderSitenameLinks(sitenames, urls, originalSitename) {\n    if (sitenames != null && urls != null) {\n      var sites = [];\n      for (var i = 0; i < sitenames.length; i++) {\n        sites.push(<a className=\"tag site\" href={urls[i]} key={i}>{sitenames[i]}</a>);\n        if (i !== (sitenames.length - 1)) {\n\n        }\n      }\n    }\n\n    if (originalSitename != null) {\n      return originalSitename;\n    }\n\n    return null;\n  }\n\n  render() {\n    const { doc, highlight } = this.props;\n    let departments = null;\n    if (Array.isArray(doc.sm_department)){\n      departments = doc.sm_department.join(\" | \");\n    }\n    return (\n      <li\n        className=\"search-card search-card--default tile\"\n        onClick={() => this.props.onSelect(doc)}\n      >\n        <a href={this.getCanonicalLink(doc)}>\n\n          <div className=\"text wrapper\">\n            {departments ? (\n              <span className=\"department-tag\">{departments}</span>\n            ) : null}\n\n            <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_type == 'Provider'\n              ? doc.ss_sort_az_field\n              : doc.ss_federated_title\n            }}></h3>\n\n            <p\n              className=\"search-card__summary\"\n              dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n            />\n\n            <div className=\"meta tags tags--pipe\">\n              {doc.sm_federated_type ? (\n                <span className=\"content-type-tag type\">\n                  {doc.sm_federated_type}\n                </span>\n              ) : null}\n\n            </div>\n          </div>\n        </a>\n      </li>\n    );\n  }\n}\n\nFederatedResult.propTypes = {\n  doc: PropTypes.object,\n  fields: PropTypes.array,\n  onSelect: PropTypes.func.isRequired,\n  hostname: PropTypes.string\n};\n\nexport default FederatedResult;\n","import React from \"react\";\n\nclass Search extends React.Component {\n\trender() {\n\t\treturn (\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M17.545 15.467l-3.779-3.779a6.15 6.15 0 0 0 .898-3.21c0-3.417-2.961-6.377-6.378-6.377A6.185 6.185 0 0 0 2.1 8.287c0 3.416 2.961 6.377 6.377 6.377a6.15 6.15 0 0 0 3.115-.844l3.799 3.801a.953.953 0 0 0 1.346 0l.943-.943c.371-.371.236-.84-.135-1.211zM4.004 8.287a4.282 4.282 0 0 1 4.282-4.283c2.366 0 4.474 2.107 4.474 4.474a4.284 4.284 0 0 1-4.283 4.283c-2.366-.001-4.473-2.109-4.473-4.474z\"/></svg>\n\t\t);\n\t}\n}\n\nexport default Search;","import PropTypes from 'prop-types';\nimport queryString from 'query-string';\nimport React from 'react';\nimport SearchIcon from '../icons/search';\n\n// Renders plain text input and submit button for text search.\n// Rendered when env config autocomplete is not present or set to false.\n// @see /env.local.js.example\nclass FederatedTextSearchNoAutocomplete extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      value: '',\n    };\n\n    this.handleInputChange = this.handleInputChange.bind(this);\n    this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    this.setState({\n      value: nextProps.value,\n    });\n  }\n\n  handleInputChange(ev) {\n    this.setState({\n      value: ev.target.value,\n    });\n  }\n\n  handleInputKeyDown(ev) {\n    if (ev.keyCode === 13) {\n      this.handleSubmit();\n    }\n  }\n\n  handleSubmit() {\n    this.props.onChange(this.props.field, this.state.value);\n    // Get existing querystring params.\n    const parsed = queryString.parse(window.location.search);\n    // Update the search querystring param with the value from the search field.\n    parsed.search = this.state.value;\n    const stringified = queryString.stringify(parsed);\n    // Update the querystring params in the browser, add path to history.\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n    if (window.history.pushState) {\n      const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n      window.history.pushState({ path: newUrl }, '', newUrl);\n    } else {\n      window.location.search = stringified;\n    }\n  }\n\n  render() {\n    const { label } = this.props;\n\n    return (\n      <React.Fragment>\n        <label htmlFor=\"search\" className=\"fs-search-form__label\">{label}</label>\n        <div className=\"fs-search-form__input-wrapper\">\n          <input\n            type=\"search\"\n            name=\"search\"\n            id=\"search\"\n            className=\"fs-search-form__input\"\n            autoFocus\n            onChange={this.handleInputChange}\n            onKeyDown={this.handleInputKeyDown}\n            value={this.state.value || ''}\n          />\n          <button\n            type=\"submit\"\n            className=\"fs-search-form__submit btn-secondary\"\n            onClick={e=> { e.preventDefault(); this.handleSubmit(e);}}\n          >\n            <span className=\"screen-hide\">Perform Search</span>\n            <SearchIcon />\n          </button>\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nFederatedTextSearchNoAutocomplete.defaultProps = {\n  label: '',\n  onChange: () => {},\n  value: '',\n};\n\nFederatedTextSearchNoAutocomplete.propTypes = {\n  field: PropTypes.string.isRequired,\n  label: PropTypes.string,\n  onChange: PropTypes.func,\n  value: PropTypes.string,\n};\n\nexport default FederatedTextSearchNoAutocomplete;\n","import React from 'react';\nimport queryString from 'query-string';\n\n/**\n * Find and highlight relevant keywords within a block of text\n * @param  {string} text - The text to parse\n * @param  {string} highlight - The search keyword/partial to highlight\n * @return {object} A JSX object containing an array of alternating strings and JSX\n */\nconst highlightText = (text, highlight) => {\n  if (!highlight.toString().trim()) {\n    return <span>{text}</span>;\n  }\n  // Split on highlight term and include term into parts, ignore case\n  const parts = text.split(new RegExp(`(${highlight})`, 'gi'));\n  return (\n    <span> { parts.map((part, i) =>\n      (\n        <span key={i} style={part.toLowerCase() === highlight.toString().toLowerCase() ? { fontWeight: 'bold' } : {}}>\n          { part }\n        </span>\n      ))}\n    </span>);\n};\n\n// Those filter fields for which we want to preserve state in qs.\nconst filterFieldsWithQsState = [\n  'sm_site_name',\n  'sm_federated_type',\n  'sm_department',\n  'sm_federated_terms',\n];\n\nconst qs = {\n  /**\n   * Gets the qs params as an object and broken into array of [key,value] pairs.\n   * Params with multiple values (i.e. federated terms) use the following syntax:\n   * ...&sm_federated_terms[]=value1&sm_federated_terms[]=value2\n   *\n   * @returns {{parsed: (*|*|*), params: [string, any][]}}\n   */\n  getParsedQsAndParams: () => {\n    const parsed = queryString.parse(window.location.search, { arrayFormat: 'bracket' });\n    return {\n      parsed,\n      params: Object.entries(parsed),\n    };\n  },\n  /**\n   * Determines information related this search field, its value, and state.\n   *\n   * @param field\n   *   this.props.query.searchField.field (i.e. the solr field name)\n   * @param values\n   *   this.props.query.searchField.value (i.e. the current value for the field)\n   * @param value\n   *   The value of the field with which interaction has happened.\n   * @returns object\n   *   An object with:\n   *     foundIdx: the position of the field value in question found in this field's state,\n   *     parsed: an object with parsed qs params and their values,\n   *     isQsParamField: whether or not the field in question should track state in the qs,\n   *     param: an object with the as param and value for this field, if it exists\n   */\n  getFieldQsInfo: ({ field, values, value }) => {\n    // Determine if the field value in question exists in this search field's state.\n    // i.e. was it toggled on or off?\n    const foundIdx = values.indexOf(value);\n    // Get existing querystring params.\n    const { parsed, params } = qs.getParsedQsAndParams();\n\n    // Check if the search field is one for which we preserve state through qs.\n    const isQsParamField = filterFieldsWithQsState.find(item => item === field);\n\n    // Check if the filter field exists in qs param.\n    const param = params.find(item => item[0] === field);\n\n    return {\n      foundIdx,\n      parsed,\n      isQsParamField,\n      param,\n    };\n  },\n  /**\n   * Updates the parsed object by adding the field value in question to its param key.\n   *\n   * @param field\n   *   this.props.query.searchField.field (i.e. the solr field name)\n   * @param value\n   *   The value of the field with which interaction has happened.\n   * @param param\n   *   An object with the as param and value for this field, if it exists.\n   * @param parsed\n   *   An object with parsed qs params and their values.\n   * @returns Object\n   *   An updated parsed object with the field value in question added.\n   */\n  addValueToQsParam: ({\n    field,\n    value,\n    param,\n    parsed,\n  }) => {\n    const newParsed = parsed;\n    // Handle single value params.\n    if (typeof param[1] !== 'object' && value !== param[1]) {\n      // Add the param for this field from the parsed qs object.\n      newParsed[field] = value;\n    }\n    // Handle multi value params.\n    if (typeof param[1] === 'object' && !param[1].includes(value)) {\n      // Add the list item facet value to the param value.\n      param[1].push(value);\n      // Set the new param value.\n      newParsed[field] = [...param[1]];\n    }\n    return newParsed;\n  },\n  /**\n   * Updates the parsed object by adding the field and its value to the\n   *   current object of params and their values.\n   *\n   * @param field\n   *   this.props.query.searchField.field (i.e. the solr field name)\n   * @param value\n   *   The value of the field with which interaction has happened.\n   * @param param\n   *   An object with the as param and value for this field, if it exists.\n   * @param parsed\n   *   An object with parsed qs params and their values.\n   * @returns Object\n   *   An updated parsed object with the field + value added.\n   */\n  addQsParam: ({\n    field,\n    value,\n    parsed,\n  }) => {\n    const newParsed = parsed;\n    const fieldType = field.split('_')[0];\n    const isMultiple = fieldType.charAt(fieldType.length - 1) === 'm';\n\n    // Handle single value params.\n    if (!isMultiple) {\n      // Add the param for this field from the parsed qs object.\n      newParsed[field] = value;\n    }\n    // Handle multi value params.\n    if (isMultiple) {\n      // Set the new param value.\n      newParsed[field] = [value];\n    }\n    return newParsed;\n  },\n  /**\n   * Updates the parsed object by removing the field value in question to its param key.\n   *\n   * @param field\n   *   this.props.query.searchField.field (i.e. the solr field name)\n   * @param value\n   *   The value of the field with which interaction has happened.\n   * @param param\n   *   An object with the as param and value for this field, if it exists.\n   * @param parsed\n   *   An object with parsed qs params and their values.\n   * @returns Object\n   *   An updated parsed object with the field value in question removed.\n   */\n  removeValueFromQsParam: ({\n    field,\n    value,\n    param,\n    parsed,\n  }) => {\n    const newParsed = parsed;\n    // Remove value from parsed qs params.\n    // Handle single value params.\n    if (typeof param[1] !== 'object' && value === param[1]) {\n      // Remove the param for this field from the parsed qs object.\n      delete newParsed[field];\n    }\n    // Handle multi value params.\n    if (typeof param[1] === 'object' && param[1].includes(value)) {\n      // Remove the list facet value from the param.\n      newParsed[field] = param[1].filter(item => item !== value);\n    }\n\n    return newParsed;\n  },\n  /**\n   * Updates the browser window.history with an entry based on the new parsed qs params and values.\n   *\n   * @param parsed\n   *   An object with parsed qs params and their values.\n   */\n  addNewUrlToBrowserHistory: (parsed) => {\n    // Update the search querystring param with the value from the search field.\n    const stringified = queryString.stringify(parsed, { arrayFormat: 'bracket' });\n    // Update the querystring params in the browser, add path to history.\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n    if (window.history.pushState) {\n      const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n      window.history.pushState({ path: newurl }, '', newurl);\n    } else {\n      window.location.search = stringified;\n    }\n  },\n  /**\n   * Sets query.searchFields state based on the state of the qs.\n   * Allows searches to be executed on app load based on URL.\n   *\n   * @param params\n   *   QS params broken into array of [key,value] pairs.\n   * @param searchField\n   *   Search field in question. (this.props.query.searchField)\n   * @returns Object\n   *   Updated this.props.query.searchField based on qs param values.\n   */\n  setFieldStateFromQs: ({\n    params,\n    searchField,\n  }) => {\n    // Make a copy of the searchField arg.\n    const newSearchField = searchField;\n    // Check if the filter field exists in qs params.\n    const param = params.find(item => item[0] === searchField.field);\n    // Check if the filter field is sm_federated_terms.\n    // If searchField has corresponding qs param present.\n    if (param) {\n      // Since there is a param for this search field, set it's toggle group to be open.\n      // Note: sm_federated_terms needs to list active \"parents\".\n      // See below in logic for multivalue fields.\n      newSearchField.collapse = false;\n      // Ensure we can push to searchField value.\n      newSearchField.value = searchField.value || [];\n      // Don't add qs param values if they're already set in app state.\n      // Push single values onto the searchField.value array.\n      if (typeof param[1] !== 'object' && !searchField.value.find(item => item === param[1])) {\n        newSearchField.value.push(decodeURI(param[1]));\n      }\n      // Concatenate existing searchField.value array with multivalue param array..\n      if (typeof param[1] === 'object' && searchField.value !== param[1]) {\n        const isFederatedTerms = searchField.field === 'sm_federated_terms';\n        if (isFederatedTerms) {\n          const expandedHierarchies = [];\n          param[1].forEach((item) => {\n            // Add the first part of the term to indicate it's toggle should be open.\n            expandedHierarchies.push(item.split('>')[0]);\n          });\n          // Set tm_federated_terms expanded hierarchies.\n          newSearchField.expandedHierarchies = expandedHierarchies;\n        }\n        // Decode param values.\n        const decodedParam = param[1].map(item => decodeURI(item));\n        // Set the searchField.value to the new decoded param values.\n        newSearchField.value = [...decodedParam];\n      }\n    } else {\n      // If the searchField does not have qs param present, clear its value in state.\n      delete newSearchField.value;\n      // Set its sidebar toggle group to be closed.\n      newSearchField.collapse = true;\n    }\n\n    return newSearchField;\n  },\n};\n\nexport default {\n  highlightText,\n  filterFieldsWithQsState,\n  qs,\n};\n","import React from 'react';\nimport queryString from 'query-string';\nimport he from 'he';\nimport PropTypes from 'prop-types';\nimport Autosuggest from 'react-autosuggest';\nimport helpers from '../../helpers';\nimport SearchIcon from '../icons/search';\n\n// Renders autocomplete text input and submit button for text search.\n// Rendered when env config autocomplete is present.\n// @see /env.local.js.example\nclass FederatedTextSearchAsYouType extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      value: '',\n      suggestions: [],\n      reset: false,\n    };\n\n    this.getSuggestionValue = this.getSuggestionValue.bind(this);\n    this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.loadSuggestions = this.loadSuggestions.bind(this);\n    this.onChange = this.onChange.bind(this);\n    this.onSuggestionSelected = this.onSuggestionSelected.bind(this);\n    this.onSuggestionsFetchRequested = this.onSuggestionsFetchRequested.bind(this);\n    this.onSuggestionsClearRequested = this.onSuggestionsClearRequested.bind(this);\n    this.renderSuggestion = this.renderSuggestion.bind(this);\n    this.renderSuggestionsContainer = this.renderSuggestionsContainer.bind(this);\n    this.shouldRenderSuggestions = this.shouldRenderSuggestions.bind(this);\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    // nextProps.value will be null if the filter is reset.\n    // The logic here is rather tortured, which seemed a better option\n    // than trying to fix the iteration bug in the core react suite.\n    // See https://github.com/palantirnet/federated-search-react/pull/63.\n    // The 'reset' state indicates that we should reset the field. The\n    // 'active' variable indicates that we are clearing the field and\n    // should not act on the nextProps value.\n    var active = false;\n    if (nextProps.value !== null) {\n      this.setState({\n        reset: true,\n      });\n      active = false;\n    }\n    if (nextProps.value === null && this.state.reset === true) {\n      this.setState({\n        value: \"\",\n        suggestions: [],\n        reset: false,\n      });\n      active = true;\n    }\n    if ((this.state.value !== \"\" || this.props.value !== null) && active === false) {\n      this.setState({\n        value: nextProps.suggestQuery && nextProps.suggestQuery.value\n          ? nextProps.suggestQuery.value\n          : nextProps.value,\n        suggestions: nextProps.suggestions ? nextProps.suggestions.docs : this.state.suggestions,\n      });\n    }\n  }\n\n  /**\n   * Called every time the input value changes\n   *\n   * @param event\n   *   Event object\n   * @param newValue\n   *   The new value of the input\n   * @param method\n   *   String describing how the change has occurred. The possible values are:\n   *     'down' - user pressed Down\n   *     'up' - user pressed Up\n   *     'escape' - user pressed Escape\n   *     'enter' - user pressed Enter\n   *     'click' - user clicked (or tapped) on suggestion\n   *     'type' - none of the methods above (usually means that user typed something,\n   *       but can also be that they pressed Backspace, pasted something into the input, etc.)\n   */\n  onChange(event, { newValue, method }) {\n    if (method === 'type') {\n      this.setState({\n        value: newValue,\n      });\n\n      // Ensure that the suggestQuery.value prop gets cleared on backspace / cut.\n      this.props.suggestQuery.value = newValue;\n    }\n  }\n\n  // Called every time you need to recalculate suggestions.\n  onSuggestionsFetchRequested({ value }) {\n    this.loadSuggestions(value);\n  }\n\n  /**\n   * Called every time suggestion is selected via mouse or keyboard.\n   *\n   * @param event\n   *   Event object\n   * @param suggestion\n   *   The selected suggestion\n   *   Unused: suggestionValue\n   *     The value of the selected suggestion\n   *     (equivalent to getSuggestionValue(suggestion))\n   *   Unused: suggestionIndex\n   *     The index of the selected suggestion in the suggestions array\n   *   Unused: sectionIndex\n   *     When rendering multiple sections,this will be the section index\n   *     (in suggestions) of the selected suggestion. Otherwise, it will be null.\n   * @param method\n   *   String describing how user selected the suggestion. The possible values are:\n   *     'click' - user clicked (or tapped) on the suggestion\n   *     'enter' - user selected the suggestion using Enter\n   */\n  onSuggestionSelected(event, { suggestion, method }) {\n    const { mode } = this.props.autocomplete;\n    // If results are rendered, redirect to the result url and prevent search execution.\n    if (mode === 'result' && (event.keyCode === 13 || method === 'click')) {\n      event.preventDefault(); // don't submit the search query\n      event.stopPropagation(); // don't bubble up event\n      window.location.assign(suggestion.sm_urls[0]); // redirect to the selected item\n    }\n  }\n\n  // Called every time you need to set suggestions to [].\n  onSuggestionsClearRequested() {\n    // TODO: JL added prop to short circuit clearing of suggestions\n    if (!this.props.persist) {\n      this.setState({\n        suggestions: [],\n      });\n    }\n  }\n\n  // For search term autocomplete mode:\n  // When user navigates the suggestions using the Up and Down keys,\n  // the input value should be set according to the highlighted suggestion.\n  getSuggestionValue(suggestion) {\n    const { mode } = this.props.autocomplete;\n    if (mode === 'result') return false;\n    if (mode === 'term') {\n      return suggestion.ss_federated_title; // @todo get the value of the term\n    }\n    return false;\n  }\n\n  // Gets search suggestions based on input.\n  // @todo support different modes: term, results\n  loadSuggestions(value) {\n    // Run typeahead search query based on the autocomplete config and current value.\n    this.props.onSuggest(this.props.query, this.props.autocomplete, value);\n  }\n\n  handleInputKeyDown(event) {\n    // Call submit handler when enter is pressed while text input\n    // has focused.  This functionality is prevented by the\n    // onSuggestionSelected method.\n    if (event.keyCode === 13 && !event.defaultPrevented) {\n      this.handleSubmit();\n    }\n\n    // Clear and close suggetsions.\n    if (event.keyCode === 27) {\n      this.onSuggestionsClearRequested();\n    }\n  }\n\n  // Trigger search query execution by updating the current URL based\n  // on current state.\n  handleSubmit() {\n    this.props.onChange(this.props.field, this.state.value);\n    // Get existing querystring params.\n    const parsed = queryString.parse(window.location.search);\n    // Update the search querystring param with the value from the search field.\n    parsed.search = this.state.value;\n    const stringified = queryString.stringify(parsed);\n    // Update the querystring params in the browser, add path to history.\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n    if (window.history.pushState) {\n      const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n      window.history.pushState({ path: newUrl }, '', newUrl);\n    } else {\n      window.location.search = stringified;\n    }\n  }\n\n  // When the input is focused, Autosuggest will consult this function\n  // when to render suggestions. Use it, for example, if you want to\n  // display suggestions when input value is at least 2 characters long.\n  shouldRenderSuggestions(value) {\n    const numChars = this.props.autocomplete.numChars || 2;\n    return value.trim().length > numChars;\n  }\n\n  renderSuggestionsContainer({ containerProps, children, query }) {\n    const { mode } = this.props.autocomplete;\n    const hasResultModeConfig = Object.hasOwnProperty.call(this.props.autocomplete, 'result');\n    const hasTermModeConfig = Object.hasOwnProperty.call(this.props.autocomplete, 'term');\n    const resultTitleText = hasResultModeConfig && this.props.autocomplete.result.titleText\n      ? this.props.autocomplete.result.titleText\n      : 'What are you looking for?';\n    const resultShowDirectionsText = hasResultModeConfig\n      && Object.hasOwnProperty.call(this.props.autocomplete.result, 'showDirectionsText')\n      ? this.props.autocomplete.result.showDirectionsText\n      : true;\n    const termTitleText = hasTermModeConfig && this.props.autocomplete.term.titleText\n      ? this.props.autocomplete.term.titleText\n      : 'Suggested search terms';\n    const termShowDirectionsText = hasTermModeConfig\n      && Object.hasOwnProperty.call(this.props.autocomplete.term, 'showDirectionsText')\n      ? this.props.autocomplete.term.showDirectionsText\n      : true;\n\n    const titleText = mode === 'term' ? termTitleText : resultTitleText;\n    const directionsText = mode === 'term' ? termShowDirectionsText : resultShowDirectionsText;\n\n    const suggestionsWrapperClasses = directionsText\n      ? 'react-autosuggest__suggestions-itemslist-wrapper react-autosuggest__suggestions-itemslist-wrapper--with-directions'\n      : 'react-autosuggest__suggestions-itemslist-wrapper';\n\n    return (\n      <section {...containerProps} className={containerProps.className + \" suggestions\"}>\n        <h3 className=\"heading h6\">{titleText}</h3>\n        {/* <button className=\"suggestions__close-button\" onClick={this.onSuggestionsClearRequested}>x</button> */}\n        \n          {children}\n          \n          {/* {% for suggestion in site.data.search.suggestions %}\n          <li class=\"text\">\n            <a href=\"{{ suggestion.url }}\">{{ suggestion.term }}</a>\n            <span class=\"visually-hidden\">({{ forloop.index }} of {{ forloop.length }})</span>\n          </li>\n          {% endfor %} */}\n      </section>\n\n\n      // <div {...containerProps}>\n      //   <div className=\"react-autosuggest__container-title\">\n      //     {titleText}\n      //     <button className=\"react-autosuggest__container-close-button\" onClick={this.onSuggestionsClearRequested}>x</button>\n      //   </div>\n      //   <div className={suggestionsWrapperClasses}>\n      //     {children}\n      //   </div>\n      //   {/* @todo add logic for suggestion mode and alter directionsText accordingly */}\n      //   {directionsText &&\n      //     <div className=\"react-autosuggest__container-directions\">\n      //       <span className=\"react-autosuggest__container-directions-item\">Press <code>ENTER</code> to search for <strong>{query}</strong> or <code>ESC</code> to close.</span>\n      //       <span className=\"react-autosuggest__container-directions-item\">Press ↑ and ↓ to highlight a suggestion then <code>ENTER</code> to be redirected to that suggestion.</span>\n      //     </div>\n      //   }\n      // </div>\n    );\n  }\n\n  /**\n   * Define how suggestions are rendered.\n   * Note: must be a pure function.\n   *\n   * @param suggestion\n   *   The suggestion to render\n   *\n   * @param query\n   *   Used to highlight the matching string. As user types in the input,\n   *   query will be equal to the trimmed value of the input. Then, if user\n   *   interacts using the Up or Down keys, the input will get the value of\n   *   the highlighted suggestion, but query will remain to be equal to the\n   *   trimmed value of the input prior to the Up and Down interactions.\n   *\n   * unused - isHighlighted\n   *   Whether or not the suggestion is highlighted.\n   *\n   * @return a ReactElement\n   */\n  renderSuggestion(suggestion, { query }) {\n    // Determine if we are returning results or terms. @todo or both\n    const { mode } = this.props.autocomplete;\n    // Decode any html entities that come from title.\n    const decodedTitle = he.decode(suggestion.ss_federated_title);\n    // Wrap the query partial string in <b>.\n    const highlightedTitle = helpers.highlightText(decodedTitle, query);\n    // Define a11y message i.e. (1 of 3) to append to suggestion text.\n    const currentHumanIndex = this.state.suggestions.indexOf(suggestion) + 1;\n    const suggestionsLength = this.state.suggestions.length;\n\n    // Render plain text for search term suggestions.\n    // @todo update this when we have a return structure for terms.\n    if (mode === 'term') {\n      return (<span>highlightedTitle</span>);\n    }\n\n    // Defaults to result based autosuggestion.\n    // Render a link for search result suggestions.\n    return (\n      <a\n        className=\"react-autosuggest__suggestion-link\"\n        href={suggestion.sm_urls[0]}\n      >\n        {highlightedTitle}\n        <span className=\"screen-hide\">\n          {` (${currentHumanIndex} of ${suggestionsLength})`}\n        </span>\n      </a>\n    );\n  }\n\n  // Wrap the input component with our expected wrapper.\n  static renderInputComponent(inputProps) {\n    return (\n      <input {...inputProps} />\n    );\n  }\n\n  render() {\n    const { label, suggestQuery } = this.props;\n    const { suggestions, value } = this.state;\n    // Define props for autocomplete input element.\n    const inputProps = {\n      type: 'search',\n      name: 'search',\n      id: 'search',\n      className: 'react-autosuggest__input',\n      onChange: this.onChange,\n      onKeyDown: this.handleInputKeyDown,\n      value: value || '',\n      role: 'combobox',\n      'aria-autocomplete': 'both',\n    };\n\n    return (\n      <React.Fragment>\n        <label htmlFor=\"search\">{label}</label>\n        <fieldset>\n          {/* @see: https://github.com/moroshko/react-autosuggest#react-autosuggest */}\n          <Autosuggest\n            focusInputOnSuggestionClick={false}\n            getSuggestionValue={this.getSuggestionValue}\n            inputProps={inputProps}\n            onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n            onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n            onSuggestionSelected={this.onSuggestionSelected}\n            renderInputComponent={FederatedTextSearchAsYouType.renderInputComponent}\n            renderSuggestion={this.renderSuggestion}\n            renderSuggestionsContainer={this.renderSuggestionsContainer}\n            shouldRenderSuggestions={this.shouldRenderSuggestions}\n            suggestQuery={suggestQuery}\n            suggestions={suggestions}\n            theme={{\n              container: 'react-autosuggest__container',\n              containerOpen: 'react-autosuggest__container--open',\n              input: 'react-autosuggest__input react-autosuggest__input--open',\n              inputOpen: 'react-autosuggest__input--open',\n              inputFocused: 'react-autosuggest__input--focused',\n              suggestionsContainer: 'react-autosuggest__suggestions-container',\n              suggestionsContainerOpen: 'react-autosuggest__suggestions-container--open',\n              suggestionsList: 'terms',\n              suggestion: 'text',\n              suggestionFirst: 'react-autosuggest__suggestion--first',\n              suggestionHighlighted: 'react-autosuggest__suggestion--highlighted',\n              sectionContainer: 'react-autosuggest__section-container',\n              sectionContainerFirst: 'react-autosuggest__section-container--first',\n              sectionTitle: 'react-autosuggest__section-title'\n            }}\n        />\n        <button\n            type=\"submit\"\n            className=\"fs-search-form__submit\"\n            onClick={e=> { e.preventDefault(); this.handleSubmit(e);}}\n          >\n            <span className=\"screen-hide\">Perform Search</span>\n            <SearchIcon />\n          </button>\n        </fieldset>\n      </React.Fragment>\n    );\n  }\n}\n\nFederatedTextSearchAsYouType.defaultProps = {\n  label: 'Enter a search term',\n  value: '',\n  suggestQuery: {\n    value: '',\n  },\n};\n\nFederatedTextSearchAsYouType.propTypes = {\n  autocomplete: PropTypes.oneOfType([\n    PropTypes.shape({\n      mode: PropTypes.string,\n      method: PropTypes.string,\n      url: PropTypes.string,\n      queryField: PropTypes.string,\n      suggestionRows: PropTypes.number,\n      numChars: PropTypes.number,\n      result: PropTypes.shape({\n        titleText: PropTypes.string,\n        showDirectionsText: PropTypes.bool,\n      }),\n      term: PropTypes.shape({\n        titleText: PropTypes.string,\n        showDirectionsText: PropTypes.bool,\n      }),\n    }),\n    PropTypes.bool,\n  ]).isRequired,\n  field: PropTypes.string.isRequired,\n  label: PropTypes.string,\n  onChange: PropTypes.func.isRequired,\n  onSuggest: PropTypes.func.isRequired,\n  suggestQuery: PropTypes.shape({\n    value: PropTypes.string,\n  }),\n  value: PropTypes.string,\n};\n\nexport default FederatedTextSearchAsYouType;\n","import React from 'react';\nimport FederatedTextSearchNoAutocomplete from './no-autocomplete';\nimport FederatedTextSearchAsYouType from './search-as-you-type';\n\nconst FederatedTextSearch = (props) => {\n  const { autocomplete } = props;\n  const InputComponent = autocomplete\n    ? FederatedTextSearchAsYouType\n    : FederatedTextSearchNoAutocomplete;\n  return <InputComponent {...props} />;\n};\n\nexport default FederatedTextSearch;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport cx from 'classnames';\nimport AnimateHeight from 'react-animate-height';\nimport helpers from '../../helpers';\n\nclass FederatedListFacet extends React.Component {\n\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      filter: '',\n      truncateFacetListsAt: props.truncateFacetListsAt,\n    };\n  }\n\n  handleClick(value) {\n    const {\n      foundIdx,\n      parsed,\n      isQsParamField,\n      param,\n    } = helpers.qs.getFieldQsInfo({\n      field: this.props.field,\n      values: this.props.value,\n      value,\n    });\n\n    // Define var for new parsed qs params object.\n    let newParsed = parsed;\n\n    // If the clicked list facet field is one whose state is tracked in the qs.\n    if (isQsParamField) {\n      // If the click is adding the field value.\n      if (foundIdx < 0) {\n        // If there is already a qs param for this field value.\n        if (param) {\n          // Add value to parsed qs params.\n          newParsed = helpers.qs.addValueToQsParam({\n            field: this.props.field,\n            value,\n            param,\n            parsed,\n          });\n        } else { // If there is not already a qs param for this field value.\n          // Add new qs param for field + value.\n          newParsed = helpers.qs.addQsParam({\n            field: this.props.field,\n            value,\n            parsed,\n          });\n        }\n\n        // Send new query based on app state.\n        this.props.onChange(this.props.field, this.props.value.concat(value));\n      } else { // If the click is removing this field value.\n        // If their is already a qs param for this field value.\n        if (param) {\n          newParsed = helpers.qs.removeValueFromQsParam({\n            field: this.props.field,\n            value,\n            param,\n            parsed,\n          });\n        }\n\n        // Send new query based on app state.\n        this.props.onChange(this.props.field, this.props.value.filter((v, i) => i !== foundIdx));\n      }\n\n      helpers.qs.addNewUrlToBrowserHistory(newParsed);\n    }\n  }\n\n  toggleExpand(hierarchyFacetValue) {\n    this.props.onSetCollapse(this.props.field, !(this.props.collapse || false));\n    // If this is a hierarchical list facet.\n    if (hierarchyFacetValue) {\n      // Determine the current state of the expanded hierarchical list facets.\n      const indexOfExpandedHierarchyFacetValue = this.props.expandedHierarchies\n        .indexOf(hierarchyFacetValue);\n      if (indexOfExpandedHierarchyFacetValue > -1) {\n        // This accordion is currently expanded, so collapse it.\n        this.props.expandedHierarchies.splice(indexOfExpandedHierarchyFacetValue,1);\n      } else {\n        // This accordion is currently collapsed, so expand it.\n        this.props.expandedHierarchies.push(hierarchyFacetValue);\n      }\n    }\n  }\n\n  render() {\n    const {\n      label,\n      facets,\n      field,\n      value,\n      collapse,\n      hierarchy,\n      options,\n    } = this.props;\n    const { truncateFacetListsAt } = this.state;\n\n    const siteList = options.siteList;\n    const facetCounts = facets.filter((facet, i) => i % 2 === 1);\n    const facetValues = facets.filter((facet, i) => i % 2 === 0);\n    // Create an object of facets {value: count} to keep consistent for inputs.\n    const facetInputs = {};\n\n    // Handle site name restrictions.\n    if (field === 'sm_site_name' && siteList.length > 0) {\n      facetValues.forEach((v, i) => {\n        const key = facetValues[i];\n        if (siteList.indexOf(v) > -1) {\n          facetInputs[key] = facetCounts[i];\n        }\n      });\n      // If only one option exists and nothing is selected, don't show it.\n      if (value.length < 1 && Object.keys(facetInputs).length < 2) {\n        return null;\n      }\n    }\n    else {\n      facetValues.forEach((v, i) => {\n        const key = facetValues[i];\n        facetInputs[key] = facetCounts[i];\n      });\n    }\n\n    //This line controls default filter expansion \n    const expanded = this.props.field ==\"sm_federated_type\" ? collapse : !collapse;\n    const height = expanded ? 'auto' : 0;\n\n    // If we need to generate multiple list-fact accordion groups\n    // from this list-facet field (i.e. sm_federated_terms).\n    if (hierarchy) {\n      // Iterate through sm_federated_terms array of values.\n      // Each value is a string with the format Type>Term.\n      // Define array of types which will render as accordion li links.\n      const types = [];\n      // Define object to hold data for each type:\n      // {\n      //   type: {\n      //     items: [{\n      //       term (the checkbox label),\n      //       facetValue (the checkbox value, Type>Term),\n      //       facetCount (the number of items with this value returned)\n      //     },...],\n      //     expanded: bool (whether or not this accordion is expanded)\n      //   },...\n      // }\n      const terms = {};\n      facetValues.forEach((facetValue, i) => {\n        // Create array of [Type, Term] from Type>Term.\n        const pieces = facetValue.split('>');\n        types.push(pieces[0]);\n        // If we don't already have terms.Type then create it.\n        if (!Object.hasOwnProperty.call(terms, pieces[0])) {\n          terms[pieces[0]] = {};\n          terms[pieces[0]].items = [];\n          terms[pieces[0]].expanded = (this.props.expandedHierarchies.indexOf(pieces[0]) > -1);\n          terms[pieces[0]].height = terms[pieces[0]].expanded ? 'auto' : 0;\n        }\n        // Add the object for this facet value to the array of terms for this type.\n        terms[pieces[0]].items.push({\n          term: pieces[1],\n          facetValue,\n          facetCount: facetCounts[i],\n        });\n      });\n\n      // Remove duplicate types\n      // So facet values of \"Condition>Bones\", \"Condition>Bone growth\" should only\n      // Add \"Condition\" type once so we only render 1 Condition accordion group.\n      const uniqueTypes = types.filter((v, i, self) => self.indexOf(v) === i).filter(String);\n\n      // Define array of accordion Lis which we'll populate with react fragments.\n      const listFacetHierarchyLis = [];\n      // Define array of checkbox Lis which we'll populate with react fragments, per type.\n      const listFacetHierarchyTermsLis = [];\n      // Iterate through types (accordion lis).\n      uniqueTypes.forEach((type, i) => {\n        // Populate the checkbox lis react fragments for each type.\n        listFacetHierarchyTermsLis[type] = [];\n        terms[type].items.forEach((termObj, i) => termObj.facetCount\n          && listFacetHierarchyTermsLis[type].push(<li className=\"fs-search-accordion__content-item\" key={`${termObj.term}_${termObj.facetValue}_${i}`}>\n            <label className=\"fs-search-accordion__checkbox-label\">\n            <input\n              type=\"checkbox\"\n              name={type}\n              className=\"fs-search-accordion__checkbox-input\"\n              value={termObj.facetValue}\n              checked={value.indexOf(termObj.facetValue) > -1}\n              onChange={() => this.handleClick(termObj.facetValue)}\n            /> {termObj.term}\n              <span className=\"facet-item-amount\"> ({termObj.facetCount}\n                <span className=\"screen-hide\">results</span>)\n              </span>\n            </label>\n          </li>));\n\n        // Populate the accordion lis array with all of its checkboxes.\n        listFacetHierarchyTermsLis[type].length && listFacetHierarchyLis.push(\n          <li className=\"fs-search-accordion__content-item\" id={`solr-list-facet-${type}`} key={`solr-list-facet-${type}-${i}`}>\n            <div\n              tabIndex=\"0\"\n              className={cx('fs-search-accordion__title', { 'js-fs-search-accordion-open': terms[type].expanded })}\n              id={label.replace(/\\s+/g, '-').toLowerCase()}\n              onClick={this.toggleExpand.bind(this, type)}\n              onKeyDown={(event) => {\n                if (event.keyCode === 13) {\n                  this.toggleExpand(type);\n                }\n              }}\n            >\n              <span className=\"screen-hide\">Toggle filter group for</span> {type}\n            </div>\n            <AnimateHeight\n              duration={600}\n              height={terms[type].height}\n            >\n              <ul className=\"fs-search-accordion__content\" key={`solr-list-facet-${type}-ul`}>\n                {listFacetHierarchyTermsLis[type]}\n              </ul>\n            </AnimateHeight>\n          </li>);\n      });\n      // Render the group of accordion lis with their facet value checkbox lists.\n      return listFacetHierarchyLis;\n    }\n    // This is not a hierarchy of accordion groups,\n    // just render the single list-facet accordion.\n    return (\n      <li className=\"fs-search-accordion__group-item\" id={`solr-list-facet-${field}`}>\n        <div\n          tabIndex=\"0\"\n          className={cx('fs-search-accordion__title', { 'js-fs-search-accordion-open': expanded })}\n          id={label.replace(/\\s+/g, '-').toLowerCase()}\n          onClick={this.toggleExpand.bind(this)}\n          onKeyDown={(event) => {\n            if (event.keyCode === 13) {\n              this.toggleExpand();\n            }\n          }}\n        >\n          <span className=\"screen-hide\">Toggle filter group for</span> {label}\n        </div>\n        <AnimateHeight\n          duration={600}\n          height={height}\n        >\n          <ul className=\"fs-search-accordion__content\" key={`solr-list-facet-${field}-ul`}>\n            {facetValues.filter((facetValue, i) => facetInputs[facetValue] > 0\n                && (truncateFacetListsAt < 0 || i < truncateFacetListsAt))\n              .map((facetValue, i) => {\n                if (this.state.filter.length === 0\n                  || facetValue.toLowerCase().indexOf(this.state.filter.toLowerCase()) > -1) {\n                  return (\n                    <li className=\"fs-search-accordion__content-item\" key={`${facetValue}_${facetInputs[facetValue]}`}>\n                      <label className=\"fs-search-accordion__checkbox-label\">\n                        <input\n                          type=\"checkbox\"\n                          name={field}\n                          value={facetValue}\n                          checked={value.indexOf(facetValue) > -1}\n                          onChange={() => this.handleClick(facetValue)}\n                        /> {facetValue} ({facetInputs[facetValue]})\n                      </label>\n                    </li>\n                  );\n                }\n                return null;\n              })}\n          </ul>\n        </AnimateHeight>\n      </li>\n    );\n  }\n}\n\nFederatedListFacet.defaultProps = {\n  hierarchy: false,\n  expandedHierarchies: [],\n  value: [],\n};\n\nFederatedListFacet.propTypes = {\n  bootstrapCss: PropTypes.bool,\n  children: PropTypes.array,\n  collapse: PropTypes.bool,\n  expandedHierarchies: PropTypes.array,\n  facetSort: PropTypes.string,\n  facets: PropTypes.array.isRequired,\n  field: PropTypes.string.isRequired,\n  hierarchy: PropTypes.bool,\n  label: PropTypes.string,\n  onChange: PropTypes.func,\n  onFacetSortChange: PropTypes.func,\n  onSetCollapse: PropTypes.func,\n  query: PropTypes.object,\n  truncateFacetListsAt: PropTypes.number,\n  value: PropTypes.array,\n};\n\nexport default FederatedListFacet;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\nimport cx from \"classnames\";\nimport moment from \"moment\";\nimport 'react-dates/initialize';\nimport { DateRangePicker } from 'react-dates';\nimport AnimateHeight from 'react-animate-height';\n\nclass FederatedRangeFacet extends React.Component {\n\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      filter: \"\",\n      truncateFacetListsAt: props.truncateFacetListsAt,\n      startDate: null,\n      endDate: null,\n      focusedInput: null,\n    };\n  }\n\n  toggleExpand() {\n    this.props.onSetCollapse(this.props.field, !(this.props.collapse || false));\n  }\n\n  handleCalendarClose(value) {\n    // If there are not start/end dates, we've likely just cleared them, so update props.\n    if (value.startDate !== null && value.endDate !== null) {\n      // The default time is noon, so start date should start at midnight.\n      const momentToSolrStart = moment(value.startDate).subtract({hours:12}).format(\"YYYY-MM-DDTHH:mm:ss\") + 'Z';\n      // The default time is noon, so end date should end at 11:59:59.\n      const momentToSolrEnd = moment(value.endDate).add({hours:11, minutes:59, seconds: 59}).format(\"YYYY-MM-DDTHH:mm:ss\") + 'Z';\n      this.props.onChange(this.props.field, [momentToSolrStart, momentToSolrEnd]);\n    }\n  }\n\n  handleDatesChange(startDate,endDate) {\n    this.setState({startDate, endDate});\n    // If there are no start/end dates, something has just cleared them, so update props.\n    if (startDate === null && endDate === null) {\n      this.props.onChange(this.props.field, []);\n    }\n  }\n\n  // See: https://reactjs.org/docs/react-component.html#the-component-lifecycle\n  componentDidUpdate(nextProps) {\n    // Clear component inputs when rangeFacet value transitions from populated->empty.\n    if (this.props.value.length && !nextProps.value.length) {\n      this.setState({\n        startDate: null,\n        endDate: null\n      });\n    }\n  }\n\n  render() {\n    const {label, facets, field, collapse } = this.props;\n\n    const expanded = !(collapse || false);\n    const height = expanded ? 'auto' : 0;\n\n    // Set better react date props for responsive behavior.\n    // See: https://github.com/airbnb/react-dates/issues/262\n    let calendarOrientation = undefined; // prop will not be added unless set.\n    let calendarFullScreen = undefined; // prop will not be added unless set.\n    let calendarMonths = 2; // view 2 months on large screens\n    // When viewing 2 months, the last month should be the current.\n    let getLastMonth = () => moment().subtract(1, 'months');\n\n    // Set prop values for mobile.\n    if (window.matchMedia(\"(max-width: 600px)\").matches) {\n      /* the viewport is less than 600 pixels wide */\n      calendarMonths = 1;\n      calendarOrientation = \"vertical\";\n      calendarFullScreen = true;\n      getLastMonth = undefined; // prop will not be added on mobile.\n    }\n\n    return (\n      <li className=\"fs-search-accordion__group-item\" id={`solr-list-facet-${field}`}>\n        <div\n          tabIndex=\"0\"\n          className={cx(\"fs-search-accordion__title\", {\"js-fs-search-accordion-open\": expanded})}\n          id={label.replace(/\\s+/g, '-').toLowerCase()}\n          onClick={this.toggleExpand.bind(this)}\n          onKeyDown={(event)=>{if (event.keyCode === 13) {this.toggleExpand()}}}\n        >{label}</div>\n        <AnimateHeight\n          duration={600}\n          height={height}\n        >\n          <ul className=\"fs-search-accordion__content\">\n            <li className=\"fs-search-accordion__content-item\">\n              {/* See: https://github.com/airbnb/react-dates#daterangepicker */}\n              <DateRangePicker\n                startDate={this.state.startDate} // momentPropTypes.momentObj or null,\n                startDateId=\"solr-start-date\" // PropTypes.string.isRequired,\n                endDate={this.state.endDate} // momentPropTypes.momentObj or null,\n                endDateId=\"solr-end-date\" // PropTypes.string.isRequired,\n                onDatesChange={({ startDate, endDate }) => this.handleDatesChange(startDate,endDate)} // PropTypes.func.isRequired,\n                focusedInput={this.state.focusedInput} // PropTypes.oneOf([START_DATE, END_DATE]) or null,\n                onFocusChange={focusedInput => this.setState({ focusedInput })} // PropTypes.func.isRequired,\n                isOutsideRange={(day) => {\n                  const today = moment().format('YYYY-MM-DD');\n                  return day.diff(today, 'days') > 0 || moment(day).isBefore(facets[0])\n                }} // allow only past dates & dates after earliest facet value\n                minimumNights={0} // allow just 1 day (same start/end date)\n                small={true} // use the smaller theme\n                showClearDates // show the clear dates button\n                onClose={(value)=> this.handleCalendarClose(value)}\n                // custom phrases for screenreader\n                phrases={{\n                  calendarLabel: \"Calendar\",\n                  chooseAvailableStartDate: ({ date }) => `Choose ${date} as your search filter start date.`,\n                  chooseAvailableEndDate: ({ date }) => `Choose ${date} as your search filter end date.`,\n                  clearDates: \"Clear Dates\",\n                  closeDatePicker: \"Close\",\n                  dateIsSelected: ({ date }) => `You have selected ${date}.`,\n                  dateIsUnavailable: ({ date }) => `Sorry, ${date} is unavailable.`,\n                  enterKey: \"Enter key\",\n                  escape: \"Escape key\",\n                  focusStartDate: \"Interact with the calendar and add the check-in date for your trip.\",\n                  hideKeyboardShortcutsPanel: \"Close the shortcuts panel.\",\n                  homeEnd: \"Home and end keys\",\n                  jumpToNextMonth: \"Move forward to switch to the next month.\",\n                  jumpToPrevMonth: \"Move backward to switch to the previous month.\",\n                  keyboardNavigationInstructions: \"Press the down arrow key to interact with the calendar and\\n  select a date. Press the question mark key to get the keyboard shortcuts for changing dates.\",\n                  keyboardShortcuts: \"Keyboard Shortcuts\",\n                  leftArrowRightArrow: \"Right and left arrow keys\",\n                  moveFocusByOneDay: \"Move backward (left) and forward (right) by one day.\",\n                  moveFocusByOneMonth: \"Switch months.\",\n                  moveFocusByOneWeek: \"Move backward (up) and forward (down) by one week.\",\n                  moveFocustoStartAndEndOfWeek: \"Go to the first or last day of a week.\",\n                  openThisPanel: \"Open this panel.\",\n                  pageUpPageDown: \"page up and page down keys\",\n                  questionMark: \"Question mark\",\n                  returnFocusToInput: \"Return to the date input field.\",\n                  selectFocusedDate: \"Select the date in focus.\",\n                  showKeyboardShortcutsPanel: \"Open the keyboard shortcuts panel.\",\n                  upArrowDownArrow: \"up and down arrow keys\"\n                }}\n                // > mobile only props\n                initialVisibleMonth={getLastMonth} // large viewports only\n                // mobile only props\n                numberOfMonths={calendarMonths} // view one month at a time\n                orientation={calendarOrientation} // use vertical orientation\n                withFullScreenPortal={calendarFullScreen} // use full screen\n              />\n            </li>\n          </ul>\n        </AnimateHeight>\n      </li>\n    );\n  }\n}\n\nFederatedRangeFacet.defaultProps = {\n  value: []\n};\n\nFederatedRangeFacet.propTypes = {\n  bootstrapCss: PropTypes.bool,\n  children: PropTypes.array,\n  collapse: PropTypes.bool,\n  facetSort: PropTypes.string,\n  facets: PropTypes.array.isRequired,\n  field: PropTypes.string.isRequired,\n  label: PropTypes.string,\n  onChange: PropTypes.func,\n  onFacetSortChange: PropTypes.func,\n  onSetCollapse: PropTypes.func,\n  query: PropTypes.object,\n  truncateFacetListsAt: PropTypes.number,\n  value: PropTypes.array\n};\n\nexport default FederatedRangeFacet;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport cx from 'classnames';\nimport AnimateHeight from 'react-animate-height';\n\n\nclass FederatedSearchFieldContainer extends React.Component {\n  constructor(props) {\n    super(props);\n\n    // This will return the width of the viewport.\n    let intFrameWidth = window.innerWidth;\n\n    this.state = {\n      // Filters are visible for large / hidden for small screens by default.\n      expanded: intFrameWidth > 900,\n    };\n\n    this.handleClick = this.handleClick.bind(this);\n\n    window.addEventListener('resize', () => {\n      // Desktop height.\n      let height = 'auto';\n      // In mobile view, when resized, lets close things.\n      if (window.innerWidth < 900) {\n        height = 0;\n      }\n      this.setState({\n        expanded: height,\n      });\n    });\n  }\n\n  handleClick() {\n    this.setState({\n      expanded: !this.state.expanded,\n    });\n  }\n\n  render() {\n    const { onNewSearch } = this.props;\n    const height = this.state.expanded ? \"auto\" : 0;\n\n    console.log(this.props.resultsCount);\n    // fs-search-filters__form\n    return (\n      <div className=\"fs-search-filters\">\n        <button\n          className={cx(\"fs-search-filters__trigger\", {\n            \"js-fs-search-filters-open\": this.state.expanded,\n          })}\n          onClick={this.handleClick}\n        >\n          {this.props.title ? this.props.title : \"Filter Results\"}\n        </button>\n        <AnimateHeight duration={450} height={height}>\n\n          <form className=\"fs-search-filters__form\">\n            <h2 className=\"fs-search-filters__title\" id=\"fs-section-title\">\n              {this.props.title ? this.props.title : \"Filter results by\"}\n            </h2>\n\n            <section\n              className=\"fs-search-accordion\"\n              aria-labelledby=\"fs-section-title\"\n            >\n              {this.props.resultsCount > 0 ? (\n                <ul className=\"fs-search-accordion__group\">\n                  {this.props.children}\n                </ul>\n              ) : (\n                <div className=\"fs-search-filters__no-results\">\n                  There are no results to filter.\n                </div>\n              )}\n            </section>\n\n            {this.props.resultsCount > 0 ? (\n              <div className=\"fs-search-filters__row\">\n                <button\n                  className=\"fs-search-filters__reset btn-tertiary\"\n                  type=\"button\"\n                  onClick={onNewSearch}\n                >\n                  Clear All\n                </button>\n              </div>\n            ) : null}\n          </form>\n        </AnimateHeight>\n      </div>\n    );\n  }\n}\n\nFederatedSearchFieldContainer.propTypes = {\n  children: PropTypes.array,\n  onNewSearch: PropTypes.func,\n  title: PropTypes.string\n};\n\nexport default FederatedSearchFieldContainer;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\n\nclass FederatedResultList extends React.Component {\n\n\trender() {\n\t\treturn (\n\t\t\t<React.Fragment>\n\t\t\t\t<h2 className=\"screen-hide\">Search results</h2>\n\t\t\t\t<ul className=\"fs-search-results search-card-wrapper\">\n\t\t\t\t\t{this.props.children}\n\t\t\t\t</ul>\n\t\t\t</React.Fragment>\n\t\t);\n\t}\n}\n\nFederatedResultList.propTypes = {\n\tchildren: PropTypes.array\n};\n\nexport default FederatedResultList;\n","/**\n * Defines react components from chevron svgs (see styleguide/src/includes/svg)\n * @todo consider using an svg loader package (i.e. https://www.npmjs.com/package/react-svg-loader) to import and return the svg elements directly vs duplicating markup\n */\n\nimport React from \"react\";\n\nconst DoubleChevronLeft = () => (\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M16.1 4.5c.4.4.5 1 0 1.6L12.3 10l3.7 3.9c.5.5.4 1.1 0 1.6-.4.4-1.2.4-1.6 0-.4-.4-4.5-4.7-4.5-4.7-.2-.2-.3-.5-.3-.8s.1-.6.3-.8c0 0 4.1-4.3 4.5-4.7.5-.4 1.2-.4 1.7 0z\"/><path d=\"M10.1 4.5c.4.4.5 1 0 1.6L6.3 10l3.7 3.9c.5.5.4 1.1 0 1.6-.4.4-1.2.4-1.6 0-.4-.4-4.5-4.7-4.5-4.7-.2-.2-.3-.5-.3-.8s.1-.6.3-.8c0 0 4.1-4.3 4.5-4.7.5-.4 1.2-.4 1.7 0z\"/></svg>\n);\n\nconst ChevronLeft = () => (\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M12.452 4.516c.446.436.481 1.043 0 1.576L8.705 10l3.747 3.908c.481.533.446 1.141 0 1.574-.445.436-1.197.408-1.615 0-.418-.406-4.502-4.695-4.502-4.695a1.095 1.095 0 0 1 0-1.576s4.084-4.287 4.502-4.695c.418-.409 1.17-.436 1.615 0z\"/></svg>\n);\n\nconst ChevronRight = () => (\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M9.163 4.516c.418.408 4.502 4.695 4.502 4.695a1.095 1.095 0 0 1 0 1.576s-4.084 4.289-4.502 4.695c-.418.408-1.17.436-1.615 0-.446-.434-.481-1.041 0-1.574L11.295 10 7.548 6.092c-.481-.533-.446-1.141 0-1.576.445-.436 1.197-.409 1.615 0z\"/></svg>\n);\n\nconst DoubleChevronRight = () =>  (\n  <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M5.6 4.5c.4.4 4.5 4.7 4.5 4.7.2.2.3.5.3.8s-.1.6-.3.8c0 0-4.1 4.3-4.5 4.7-.4.4-1.2.4-1.6 0-.4-.4-.5-1 0-1.6L7.7 10 3.9 6.1c-.4-.5-.4-1.1 0-1.6.5-.4 1.2-.4 1.7 0z\"/><path d=\"M11.6 4.5c.4.4 4.5 4.7 4.5 4.7.2.2.3.5.3.8s-.1.6-.3.8c0 0-4.1 4.3-4.5 4.7-.4.4-1.2.4-1.6 0-.4-.4-.5-1 0-1.6l3.7-3.9-3.8-3.9c-.4-.5-.4-1.1 0-1.6.5-.4 1.2-.4 1.7 0z\"/></svg>\n);\n\nconst ArrowRight = () => (\n  <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m14.7071068 2.29289322 9.1923881 9.19238818v1.0294372l-9.1923881 9.1923882-1.4142136-1.4142136 7.2921068-7.2928932h-20.585v-2h20.585l-7.2921068-7.29289322z\"/></svg>\n)\n\nconst ArrowLeft = () => (\n  <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.2,21.7L0,12.5l0-1l9.2-9.2l1.4,1.4L3.3,11h20.6v2H3.3l7.3,7.3L9.2,21.7z\"/></svg>\n)\n\nexport {DoubleChevronLeft, ChevronLeft, ChevronRight, DoubleChevronRight, ArrowRight, ArrowLeft};\n","import PropTypes from 'prop-types';\nimport React from \"react\";\nimport cx from \"classnames\";\nimport {DoubleChevronLeft, ChevronLeft, ChevronRight, DoubleChevronRight, ArrowLeft, ArrowRight} from \"../icons/chevrons\";\n\nclass FederatedPagination extends React.Component {\n\n  onPageChange(page, pageAmt) {\n    if (page >= pageAmt || page < 0) { return; }\n    this.props.onChange(page);\n\n    if(document.getElementById(\"stat\") != null) {\n      document.getElementById(\"stat\").focus({preventScroll: false});\n    }\n  }\n\n  buildHandleEnterKeyPress = (onClick) => ({ key }) => {\n    if (key === 'Enter') {\n      onClick();\n    }\n  };\n\n  renderPage(page, currentPage, key) {\n    let isCurrentPage = page === currentPage;\n    return (\n      <li className={cx(\"pagination__control tag\", (isCurrentPage ? 'is-active' : 'not-active'))} key={key}>\n        <button className={cx(\"pagination__control-button pagination__control-button--number\")} tabIndex=\"0\" onClick={this.onPageChange.bind(this, page)} onKeyPress={this.buildHandleEnterKeyPress(this.onPageChange.bind(this, page))} title={isCurrentPage ? \"Current page\" : `Go to page ${page + 1}`} aria-current={isCurrentPage ? page + 1 : undefined}>\n          <span className=\"screen-hide\">Page</span>{page + 1}\n        </button>\n      </li>\n    );\n  }\n\n  render() {\n    const { query, results } = this.props;\n    const { start, rows } = query;\n    const { numFound } = results;\n    const pageAmt = Math.ceil(numFound / rows);\n    const currentPage = start / rows;\n    const numButtons = this.props.options.paginationButtons || 5;\n\n    if (numFound === 0) {\n      return (\"\");\n    }\n\n    let rangeStart = currentPage - 2 < 0 ? 0 : currentPage - 2;\n    let rangeEnd = rangeStart + numButtons > pageAmt ? pageAmt : rangeStart + numButtons;\n\n    if (rangeEnd - rangeStart < numButtons && rangeStart > 0) {\n      rangeStart = rangeEnd - numButtons;\n      if (rangeStart < 0) { rangeStart = 0; }\n    }\n\n    let pages = [];\n    for (let page = rangeStart; page < rangeEnd; page++) {\n      if (pages.indexOf(page) < 0) {\n        pages.push(page);\n      }\n    }\n\n    let firstPageHidden = (currentPage === 0);\n    let prevPageHidden = (currentPage - 1 < 0);\n    let nextPageHidden = (currentPage + 1 >= pageAmt);\n    let lastPageHidden = (pageAmt === 0 || currentPage === pageAmt - 1);\n\n    return (\n      <nav className=\"pagination\" role=\"navigation\" aria-labelledby=\"pagination__heading\">\n        <h4 id=\"pagination__heading\" className=\"screen-hide\">Pagination</h4>\n        <ul className=\"pagination__controls\">\n          <li className={cx(\"pagination__control pagination__control--first\")} key=\"start\">\n            <button className={cx(\"pagination__control-button pagination__control-button--first\", {\"screen-hide\": firstPageHidden})} tabIndex={firstPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, 0)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, 0)) } title=\"Go to first page\">\n              <span className=\"screen-hide\">First page</span>\n              <span aria-hidden={firstPageHidden ? \"true\" : \"false\"}>\n                <DoubleChevronLeft/>\n              </span>\n            </button>\n          </li>\n          <li className={cx(\"pagination__control pagination__control--previous\")} key=\"prev\">\n            <button className={cx(\"pagination__control-button pagination__control-button--prev\", {\"screen-hide\": prevPageHidden})} tabIndex={prevPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, currentPage - 1)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, currentPage - 1)) }title=\"Go to previous page\" rel=\"previous\">\n              <span className=\"screen-hide\">Previous page</span>\n              <span aria-hidden={prevPageHidden  ? \"true\" : \"false\"}>\n                <ArrowLeft/>\n              </span>\n            </button>\n          </li>\n          <li>\n            <ul className=\"pagination__controls tags\">\n            {pages.map((page, idx) => this.renderPage(page, currentPage, idx))}\n            </ul>\n          </li>\n          <li className={cx(\"pagination__control pagination__control--next\")} key=\"next\">\n            <button className={cx(\"pagination__control-button pagination__control-button--next\", {\"screen-hide\": nextPageHidden})} tabIndex={nextPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, currentPage + 1, pageAmt)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, currentPage + 1, pageAmt)) } title=\"Go to next page\" rel=\"next\">\n              <span className=\"screen-hide\">Next page</span>\n              <span aria-hidden={nextPageHidden ? \"true\" : \"false\"}>\n                <ArrowRight/>\n              </span>\n            </button>\n          </li>\n          <li className={cx(\"pagination__control pagination__control--last\")} key=\"end\">\n            <button className={cx(\"pagination__control-button pagination__control-button--last\", {\"screen-hide\": lastPageHidden})} tabIndex={lastPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, pageAmt - 1)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, pageAmt - 1)) } title=\"Go to last page\">\n              <span className=\"screen-hide\">Last page</span>\n              <span aria-hidden={lastPageHidden ? \"true\" : \"false\"}>\n                <DoubleChevronRight/>\n              </span>\n            </button>\n          </li>\n        </ul>\n      </nav>\n    );\n  }\n}\n\nFederatedPagination.propTypes = {\n  onChange: PropTypes.func,\n  query: PropTypes.object,\n  results: PropTypes.object\n};\n\nexport default FederatedPagination;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { LiveMessage } from 'react-aria-live';\n\nfunction searchResultsStat(currentPage, numFound, rows, pageAmt, noResultsText, termValue) {\n  // Set visible and a11y message based on query results.\n  let message = '';\n  let a11yMessage = '';\n  if (numFound > rows) { // Many pages\n    a11yMessage = `Showing page ${currentPage + 1} of ${pageAmt} (${numFound} results).`;\n    message = (\n      <span>Showing page\n        <b> {currentPage + 1}</b> of\n        <b> {pageAmt}</b> of <b>{numFound}</b> results\n      </span>\n    );\n  } else if (numFound <= rows && numFound > 1) { // Single page\n    a11yMessage = `Showing ${numFound} results.`;\n    message = (<span>Showing <b>{numFound}</b> results.</span>);\n  } else if (numFound === 1) { // Single item\n    a11yMessage = `Showing ${numFound} result.`;\n    message = (<span>Showing <b>{numFound}</b> result.</span>);\n  } else if (numFound === 0) { // No results\n    // noResultsText is set in the Federated Search Drupal Module\n    message = \"\";\n    a11yMessage = message;\n  }\n  // Don't announce total results when wildcard query sent on term clear.\n  a11yMessage = termValue ? a11yMessage : '';\n  return (\n    <React.Fragment>\n      <LiveMessage message={a11yMessage} aria-live=\"polite\" />\n      <p id=\"stat\" tabIndex=\"-1\" className=\"fs-search-results-stat\">{message}</p>\n    </React.Fragment>\n  );\n}\n\nclass FederatedCountLabel extends React.Component {\n  render() {\n    const {\n      numFound,\n      start,\n      rows,\n      noResultsText,\n      termValue,\n    } = this.props;\n    const currentPage = start / rows;\n    const pageAmt = Math.ceil(numFound / rows);\n    return (\n      <React.Fragment>\n        {searchResultsStat(currentPage, numFound, rows, pageAmt, noResultsText, termValue)}\n      </React.Fragment>\n    );\n  }\n}\n\nFederatedCountLabel.propTypes = {\n  numFound: PropTypes.number.isRequired,\n  start: PropTypes.number.isRequired,\n  rows: PropTypes.number,\n};\n\nFederatedCountLabel.defaultProps = {\n  start: 0,\n};\n\nexport default FederatedCountLabel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport queryString from 'query-string';\nimport moment from 'moment';\nimport { LiveMessenger } from 'react-aria-live';\nimport helpers from '../../helpers';\n\n\n// Create dumb component which can be configured by props.\nconst FacetType = props => (\n  <button className=\"fs-applied-filters__filter\" key={props.id} onClick={props.onClick}>\n    <span className=\"screen-hide\">\n      Remove filter\n    </span>\n    {props.children}\n  </button>\n);\n\n// Configure and render the FacetType component to render as list facet type.\nclass ListFacetType extends React.Component {\n  removeListFacetValue(field, values, value) {\n    this.props.announcePolite(`Removed ${field.value} filter.`);\n\n    const {\n      foundIdx,\n      parsed,\n      isQsParamField,\n      param,\n    } = helpers.qs.getFieldQsInfo({\n      field,\n      values,\n      value,\n    });\n\n    // Confirm the field value is set in state.\n    if (foundIdx > -1) {\n      // If the field is one whose state is tracked in qs and there is currently a param for it.\n      if (isQsParamField && param) {\n        const newParsed = helpers.qs.removeValueFromQsParam({\n          field,\n          value,\n          param,\n          parsed,\n        });\n\n        helpers.qs.addNewUrlToBrowserHistory(newParsed);\n      }\n\n      // Send query based on new state.\n      this.props.onChange(field, values.filter((v, i) => i !== foundIdx));\n    }\n  }\n\n  render() {\n    const { searchField } = this.props;\n    return (searchField.value.map((val, i) => (\n      <FacetType\n        key={i}\n        id={i}\n        onClick={() => this.removeListFacetValue(searchField.field, searchField.value, val)}\n      >\n        {/* Add spacing to hierarchical facet values: Type>Term = Type > Term. */}\n        {val.replace('>', ' > ')}\n      </FacetType>\n    )));\n  }\n}\n\n// Configure and render the FacetType component to render as range facet type.\nclass RangeFacetType extends React.Component {\n  removeRangeFacetValue(field) {\n    this.props.announcePolite(`Removed ${field.value} filter.`);\n    this.props.onChange(field, []);\n  }\n\n  render() {\n    const { searchField } = this.props;\n    // Create a moment from the search start date.\n    const start = moment(searchField.value[0]);\n    // Use UTC.\n    start.utc();\n    // Create a formatted string from start date.\n    const startFormatted = start.format('MM/DD/YYYY');\n    // Create a moment from search end date.\n    const end = moment(searchField.value[1]);\n    // Use utc.\n    end.utc();\n    // Create a formatted string from end date.\n    const endFormatted = end.format('MM/DD/YYYY');\n    // Determine if we chose the same or different start / end dates.\n    const diff = start.diff(end, 'days');\n    // Only show the start date if the same date were chosen, otherwise: start - end.\n    const filterValue = diff ? `${startFormatted} - ${endFormatted}` : startFormatted;\n    return (\n      <FacetType onClick={() => this.removeRangeFacetValue(searchField.field)}>\n        {filterValue}\n      </FacetType>\n    );\n  }\n}\n\n// Configure and render the FacetType component to render as text facet type.\nclass TextFacetType extends React.Component {\n  removeTextValue(field) {\n    this.props.announcePolite(`Removed search term ${field.value}.`);\n    // Setting this to '' or \"\" throws a fatal error.\n    this.props.onChange(field, null);\n    // Get current querystring params.\n    const parsed = queryString.parse(window.location.search);\n    // Remove the search term param, if it exists.\n    if (parsed.search) {\n      delete parsed.search;\n    }\n    const stringified = queryString.stringify(parsed);\n    // Update the querystring params in the browser, add path to history.\n    // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n    if (window.history.pushState) {\n      if (stringified) {\n        const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n        window.history.pushState({ path: newurl }, '', newurl);\n      } else {\n        const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n        window.history.pushState({ path: newurl }, '', newurl);\n      }\n    } else {\n      window.location.search = stringified;\n    }\n  }\n\n  render() {\n    const { searchField } = this.props;\n    return (\n      <FacetType onClick={() => this.removeTextValue(searchField.field)}>\n        {searchField.value}\n      </FacetType>\n    );\n  }\n}\n\nclass FederatedCurrentQuery extends React.Component {\n  render() {\n    const { query } = this.props;\n\n    const fields = query.searchFields.filter(searchField => searchField.value\n      && searchField.value.length > 0);\n\n    // Create a map of known facet type child components which can be rendered dynamically.\n    const facetTypes = {\n      'list-facet': ListFacetType,\n      'range-facet': RangeFacetType,\n      text: TextFacetType,\n    };\n\n    return (\n      <LiveMessenger>\n        {({ announcePolite }) => (\n          <React.Fragment>\n            {fields.length > 0 && // Only render this if there are filters applied.\n              <div className=\"fs-applied-filters\">\n                <h2 className=\"screen-hide\">\n                  Currently Applied Search Filters.\n                </h2>\n                <p className=\"screen-hide\">\n                  Click a filter to remove it from your search query.\n                </p>\n                {/* Only render the values for visible facets / filters */}\n                {fields.filter(searchField => !searchField.isHidden).map((searchField, i) => {\n                  // Determine which child component to render.\n                  const MyFacetType = facetTypes[searchField.type];\n                  return (\n                    <MyFacetType\n                      {...this.props}\n                      key={i}\n                      searchField={searchField}\n                      announcePolite={announcePolite}\n                    />\n                  );\n                })}\n              </div>\n            }\n          </React.Fragment>\n        )}\n      </LiveMessenger>\n    );\n  }\n}\n\nFederatedCurrentQuery.propTypes = {\n  onChange: PropTypes.func,\n  query: PropTypes.object,\n};\n\nexport default FederatedCurrentQuery;\n","import PropTypes from 'prop-types';\nimport React, {useState} from \"react\";\nimport Select from 'react-select';\n\nclass FederatedSortMenu extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n    \tthis.onSelect = this.onSelect.bind(this);\n\t\tthis.options = [];\n\t}\n\n\tonSelect({value}) {\n\t// \tdebugger\n\t//   this.setState({sort: event.target.value});\n\n\t  \tconst sortField = value;\n\t\tconst result = this.props.sortFields.find( ( { field } ) => field === sortField );\n\n\t\t// let order = result.order ?result.order : \"desc\"\n\t\t// this.setState({\n\t\t// \tsort: sortField,\n\t\t// \torder: order\n\t\t// },()=>{\n\t\t\tthis.props.onChange(result.field, result.order);\n\t\t// })\n\t}\n\n\tcomponentDidMount() {\n\t\t// call api or anything\n\t\tconsole.log(\"Component has been rendered\");\n\t}\n\n\t// componentDidUpdate(prevProps, prevState){\n\t// \tif (this.props.defaultSort !== prevProps.defaultSort){\n\t// \t\tthis.setState({sort: this.props.defaultSort} )\n\t// \t}\n\t//}\n\tonTestChange(option) {\n\t\tconsole.log(option)\n\t}\n\n\trender() {\n\t\tconst { sortFields } = this.props;\n\t\tif (sortFields.length === 0) { return null; }\n\t\tconst result = this.props.sortFields.find( ( { value } ) => !!value );\n\n\t\tsortFields.map((sortField) => {\n\t\t\tconst { field, label } = sortField\n\t\t\tconst result = this.options.find((option) => option.value === field);\n\t\t\tif(!result) {\n\t\t\t\tthis.options.push({\n\t\t\t\t\tvalue: field,\n\t\t\t\t\tlabel: label\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tconst customDropdownStyles = {\n\t\t\tcontrol: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tbackgroundColor: '#fff',\n\t\t\t\tborderColor: '#6D6D6D',\n\t\t\t\tfontSize: '1rem',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t\tpadding: '0.5rem'\n\t\t\t}),\n\t\t\tcontainer: styles => ({\n\t\t\t\t...styles, \n\t\t\t\tminWidth: \"11.75rem\",\n\t\t\t\t\"&:focus-visible\": {\n\t\t\t\t\tborder: \"0.125rem solid #553178\",\n\t\t\t\t\toutline: 'none'\n\t\t\t\t},\n\t\t\t\t\"@media only screen and (max-width: 768px)\": {\n\t\t\t\t\t...styles[\"@media only screen and (max-width: 768px)\"],\n\t\t\t\t\tminWidth: \"100%\",\n\t\t\t\t},\n\t\t\t}),\n\t\t\toption: (styles, { isDisabled, isSelected }) => {\n\t\t\t  return {\n\t\t\t\t...styles,\n\t\t\t\tbackgroundColor: isDisabled \n\t\t\t\t\t? 'red' \n\t\t\t\t\t: isSelected\n\t\t\t\t\t? '#CCE7E5'\n\t\t\t\t\t: '#fff',\n\t\t\t\tcolor: '#181818',\n\t\t\t\tfontSize: '1rem',\n\t\t\t\tcursor: isDisabled ? 'not-allowed' : 'default',\n\t\t\t\tpadding: '0.625rem 1rem',\n\t\t\t\t\"&:hover\": {\n\t\t\t\t\tbackgroundColor: \"#daedeb\"\n\t\t\t\t}\n\t\t\t  };\n\t\t\t},\n\t\t\tindicatorSeparator: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tdisplay: 'none',\n\t\t\t}),\n\t\t\tdropdownIndicator: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tcolor: '#181818',\n\t\t\t}),\n\t\t\tmenu: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tpaddingTop: '0',\n\t\t\t\tpaddingBottom: '0',\n\t\t\t\tmargin: '0',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t}),\n\t\t\tmenuList: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tpadding: '0',\n\t\t\t\tmargin: '0',\n\t\t\t\theight: '100%',\n\t\t\t\tborderColor: '#6D6D6D',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t\tpaddingTop: '0',\n\t\t\t\tpaddingBottom: '0',\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t\tplaceholder: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t\tselectedValue: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"search-results__sortby js-form-type-select\">\n\t\t\t\t<label htmlFor=\"sort-by\">Sort results by</label>\n\t\t\t\t<Select\n\t\t\t\t\tonChange={this.onSelect}\n\t\t\t\t\toptions={this.options}\n\t\t\t\t\tstyles={customDropdownStyles}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}}\n\n\nFederatedSortMenu.propTypes = {\n\tbootstrapCss: PropTypes.bool,\n\tonChange: PropTypes.func,\n\tsortFields: PropTypes.array,\n\tdefaultSort: PropTypes.string\n};\n\nexport default FederatedSortMenu;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\n\nclass FederatedInstructions extends React.Component {\n\n    render() {\n\n        const { query, results } = this.props;\n        const { numFound } = results;\n\n        if (numFound > 0) {\n            return (\"\")\n        }\n\n        return (\n          <div className=\"search-no-results-text\">\n            <p>\n              No results were found for your search. Try again by changing your\n              search terms or checking the spelling of your search terms.\n            </p>\n          </div>\n        );\n    }\n}\n\nFederatedInstructions.propTypes = {\n    query: PropTypes.object,\n    results: PropTypes.object\n}\n\nexport default FederatedInstructions;\n","// Create a custom component pack from the default component pack\nimport {defaultComponentPack} from \"../solr-faceted-search-react/src/index\";\nimport FederatedResult from \"./results/result\";\nimport FederatedTextSearch from \"./text-search/index\";\nimport FederatedListFacet from \"./list-facet/index\";\nimport FederatedRangeFacet from \"./range-facet/index\";\nimport FederatedSearchFieldContainer from \"./search-field-container\";\nimport FederatedResultList from \"./results/list\";\nimport FederatedPagination from \"./results/pagination\";\nimport FederatedCountLabel from \"./results/count-label\";\nimport FederatedCurrentQuery from \"./current-query\";\nimport FederatedSortMenu from \"./sort-menu\";\nimport FederatedInstructions from \"./results/instructions\";\n\nconst FederatedSolrComponentPack = {\n  ...defaultComponentPack,\n  searchFields: {\n    ...defaultComponentPack.searchFields,\n    text: FederatedTextSearch,\n    \"list-facet\": FederatedListFacet,\n    \"range-facet\": FederatedRangeFacet,\n    container: FederatedSearchFieldContainer,\n    currentQuery: FederatedCurrentQuery\n  },\n  results: {\n    ...defaultComponentPack.results,\n    result: FederatedResult,\n    list: FederatedResultList,\n    paginate: FederatedPagination,\n    resultCount: FederatedCountLabel,\n    instructions: FederatedInstructions\n  },\n  sortFields: {\n    menu: FederatedSortMenu\n  }\n}\n\nexport default FederatedSolrComponentPack;\n","import FederatedDirectoryResult from \"./directory\";\nimport FederatedConditionResult from \"./condition\";\nimport FederatedTreatmentResult from './treatment';\nimport FederatedRecipeResult from \"./recipe\";\nimport FederatedDepartmentResult from \"./department\";\n\nexport default {\n    Directory: FederatedDirectoryResult,\n    Conditions: FederatedConditionResult,\n    Treatment: FederatedTreatmentResult,\n    Recipe: FederatedRecipeResult,\n    Department: FederatedDepartmentResult\n}","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedDirectoryResult extends FederatedResult {\n\n  render() {\n    const { doc, highlight } = this.props;\n    const placeholderImage = \"/themes/custom/bmc_base_theme/assets/images/placeholders/headshoticon.png\";\n    let departments = null;\n    if (Array.isArray(doc.sm_department)){\n      departments = doc.sm_department.join(\" | \");\n    }\n    return (\n      <li\n        className=\"search-card search-card--directory tile\"\n        onClick={() => this.props.onSelect(doc)}\n      >\n        <a href={this.getCanonicalLink(doc)} >\n        <div className=\"wrapper\">\n        <div className=\"img\">\n          {doc.sm_federated_image && doc.sm_federated_image.length ? (\n            <picture className=\"aspect-ratio-2x3\">\n              <source\n                media=\"(min-width:340px)\"\n                srcset={`${doc.sm_federated_image[0]}?io=transform:fill,width:333,height:500, ${doc.sm_federated_image[0]}?io=transform:fill,width:666,height:1000 2x`}\n              />\n              <img\n                src={`${doc.sm_federated_image[0]}?io=transform:fill,width:166,height:250&amp;format=jpg`}\n                alt=\"\"\n                style={{ width: \"100%\" }}\n                className=\"aspect-ratio-2x3\"\n              />\n            </picture>\n          ) : (\n            <picture className=\"aspect-ratio-2x3\">\n              <img src={placeholderImage} />\n            </picture>\n          )}\n        </div>\n\n        <div className=\"text\">\n          {departments ? (\n            <span className=\"department-tag\">{departments}</span>\n          ) : null}\n\n          <div className=\"heading-wrapper\">\n          // Use the sort field instead of the title field to match the sort with the title showed to the user.\n          <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_sort_az_field }} >\n          </h3>\n\n          {doc.ss_field_clinical_title && (\n              <h5 className=\"subheading\">{doc.ss_field_clinical_title}</h5>\n            )}\n          </div>\n\n          <p\n            className=\"summary\"\n            dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n          />\n\n          {doc.tm_X3b_en_field_special_interest && (\n            <div className=\"tags tags--comma special-interests\">\n              <h5>Specialty:</h5>\n              <p>\n                {Array.isArray(doc.tm_X3b_en_field_special_interest) &&\n                  doc.tm_X3b_en_field_special_interest.map((interest) => (\n                    <span className=\"tag\">{interest}</span>\n                  ))}\n              </p>\n            </div>\n          )}\n\n          {(doc.bs_field_accepting_patients ||\n            doc.bs_field_top_dentist ||\n            doc.bs_field_top_doc) && (\n            <div className=\"tags tags attributes\">\n              <p>\n                {doc.bs_field_accepting_patients && (\n                  <span className=\"tag attributes--accepting-patients\">\n                    <span className=\"visually-hidden\">Accepting Patients</span>\n                  </span>\n                )}\n                {doc.bs_field_top_dentist && (\n                  <span className=\"tag attributes--top-dentist\">\n                    <span className=\"visually-hidden\">Top Dentist</span>\n                  </span>\n                )}\n                {doc.bs_field_top_doc && (\n                  <span className=\"tag attributes--top-doc\">\n                    <span className=\"visually-hidden\">Top Doctor</span>\n                  </span>\n                )}\n              </p>\n            </div>\n          )}\n\n          {doc.sm_field_phone && (\n            <div className=\"tags tags--pipe phone\">\n              <p>\n                {Array.isArray(doc.sm_field_phone) &&\n                  doc.sm_field_phone.map((phone) => (\n                    <a\n                      className=\"tag\"\n                      href={`tel:${this.formatPhoneNumber(phone)}`}\n                    >\n                      {this.formatPhoneNumber(phone)}\n                    </a>\n                  ))}\n              </p>\n            </div>\n          )}\n\n          <div className=\"meta tags tags--pipe\">\n            <span className=\"content-type-tag type\">\n              {doc.sm_federated_type}\n            </span>\n          </div>\n\n\n        </div>\n        </div>\n        </a>\n      </li>\n    );\n  }\n}\n\nexport default FederatedDirectoryResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedConditionResult extends FederatedResult {\n  \n  render() {\n    const { doc, highlight } = this.props;\n\n    return (\n      <li className=\"search-card search-card--condition tile\" onClick={() => this.props.onSelect(doc)}>\n        {/* {doc.sm_federated_image && doc.sm_federated_image.length && \n          <div className=\"img\">\n            <img src={doc.sm_federated_image[0]} />\n          </div>\n        } */}\n        \n        <div className=\"text\">\n\n          <h3 className=\"heading h5\">\n            <a href={this.getCanonicalLink(doc)} dangerouslySetInnerHTML={{__html: doc.ss_federated_title}} />\n          </h3>\n\n          <p className=\"summary\" dangerouslySetInnerHTML={{__html: doc.ss_summary}} />\n\n          <div className=\"meta tags tags--pipe\">\n            {/* <cite className=\"tags tags--list citation\">{this.renderSitenameLinks(doc.sm_site_name, doc.sm_urls, doc.ss_site_name)}</cite> */}\n            <span className=\"content-type-tag type\">{doc.sm_federated_type}</span>\n          </div>\n        </div>\n      </li>\n    )\n  }\n}\n\nexport default FederatedConditionResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedTreatmentResult extends FederatedResult {\n  render() {\n    const { doc, highlight } = this.props;\n\n    return (\n      <li className=\"search-card search-card--treatment tile\" onClick={() => this.props.onSelect(doc)}>\n        <a href={this.getCanonicalLink(doc)} >\n\n        <div className=\"text\">\n          {doc.sm_department && doc.sm_department.length && doc.ss_federated_title.toLowerCase() !== doc.sm_department[0].toLowerCase() &&\n            <div className=\"tags tags--comma department\">\n              <p>\n                  <span className=\"department-tag\">{doc.sm_department[0]}</span>\n              </p>\n            </div>\n          }\n\n          <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}>\n          </h3>\n\n          <p className=\"summary\" dangerouslySetInnerHTML={{__html: doc.ss_summary}} />\n\n         <div className=\"meta tags tags--pipe\">\n            {/* <cite className=\"tags tags--list citation\">{this.renderSitenameLinks(doc.sm_site_name, doc.sm_urls, doc.ss_site_name)}</cite> */}\n            <span className=\"content-type-tag type\">{doc.sm_federated_type}</span>\n          </div>\n        </div>\n        </a>\n      </li>\n    )\n  }\n}\n\nexport default FederatedTreatmentResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedRecipeResult extends FederatedResult {\n  render() {\n    const { doc, highlight } = this.props;\n\n    return (\n      <li\n        className=\"search-card search-card--recipe tile\"\n        onClick={() => this.props.onSelect(doc)}\n      >\n        <a href={this.getCanonicalLink(doc)} >\n\n        <div className=\"text\">\n\n          <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}>\n          </h3>\n\n          <p\n            className=\"summary\"\n            dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n          />\n\n          <div className=\"meta tags tags--pipe\">\n            <span className=\"content-type-tag type\">\n              {doc.sm_federated_type}\n            </span>\n          </div>\n\n        </div>\n        </a>\n      </li>\n    );\n  }\n}\n\nexport default FederatedRecipeResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedDepartmentResult extends FederatedResult {\n\n  render() {\n    const { doc, highlight } = this.props;\n    return (\n      <li\n        className=\"search-card search-card--department tile\"\n        onClick={() => this.props.onSelect(doc)}\n      >\n        <a href={this.getCanonicalLink(doc)}>\n          <div className=\"text\">\n            <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}></h3>\n\n            <p\n              className=\"search-card__summary\"\n              dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n            />\n\n            <div className=\"meta tags tags--pipe\">\n              <span className=\"content-type-tag type\">\n                {doc.sm_federated_type}\n              </span>\n            </div>\n          </div>\n        </a>\n      </li>\n    );\n  }\n}\n\nexport default FederatedDepartmentResult;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { LiveAnnouncer } from 'react-aria-live';\nimport FederatedSolrComponentPack from './federated_solr_component_pack';\nimport helpers from '../helpers';\nimport ResultComponents from './results/result-components';\n//import componentPack from \"./component-pack\";\n\nconst getFacetValues = (type, results, field, lowerBound, upperBound) => {\n  return type === 'period-range-facet'\n    ? (results.facets[lowerBound] || []).concat(results.facets[upperBound] || [])\n    : type === 'list-facet' || type === 'range-facet'\n      ? results.facets[field] || []\n      : null;\n};\n\nclass FederatedSolrFacetedSearch extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      submitted: false\n    }\n    this.resetFilters = this.resetFilters.bind(this);\n  }\n\n  resetFilters() {\n    let { query } = this.props;\n    let searchTerm = '';\n    // Keep only the value of the main search field.\n    for (const field of query.searchFields) {\n      if (field.field !== query.mainQueryField) {\n        // Remove the field value.\n        delete (field.value);\n        // Collapse the sidebar filter toggle.\n        field.collapse = true;\n        // Collapse the terms sidebar filter toggle.\n        if (Object.hasOwnProperty.call(field, 'expandedHierarchies')) {\n          field.expandedHierarchies = [];\n        }\n      } else {\n        // Extract the value of the main search term to use when setting new URL for this state.\n        searchTerm = field.value;\n      }\n    }\n    // Set new parsed params based on only search term value.\n    const parsed = {\n      search: searchTerm,\n    };\n    // Add new url to browser window history.\n    helpers.qs.addNewUrlToBrowserHistory(parsed);\n\n    // Update state to remove the filter field values.\n    this.setState({ query });\n    // Execute search.\n    this.props.onSearchFieldChange();\n  }\n\n  getResultByType(type) {\n    if (Array.isArray(type)) {\n      type = type[0];\n    }\n\n    if (type) {\n      switch (type.toLowerCase()) {\n        case \"administrative\":\n        case \"provider\":\n          return ResultComponents.Directory\n          break;\n        // case \"conditions\":\n        //   return ResultComponents.Conditions\n        //   break;\n        // case \"treatments\":\n        //   return ResultComponents.Treatment\n        //   break;\n        case \"recipes\":\n          return ResultComponents.Recipe;\n          break;\n        case \"department\":\n          return ResultComponents.Department;\n          break;\n      }\n    }\n  }\n\n  render() {\n    const {\n      customComponents,\n      bootstrapCss,\n      query,\n      results,\n      truncateFacetListsAt,\n      options,\n      onSearchFieldChange,\n      onTextInputChange,\n      onSortFieldChange,\n      onPageChange,\n    } = this.props;\n    //TODO: SORT\n    const { searchFields, sortFields, rows } = query;\n    const start = query.start ? query.start : 0;\n    const SearchFieldContainerComponent = customComponents.searchFields.container;\n    const ResultContainerComponent = customComponents.results.container;\n    const ResultComponent = customComponents.results.result;\n    const ResultCount = customComponents.results.resultCount;\n    const ResultHeaderComponent = customComponents.results.header;\n    const ResultInstructionsComponent = customComponents.results.instructions;\n    const ResultListComponent = customComponents.results.list;\n    const ResultPendingComponent = customComponents.results.pending;\n    const PaginateComponent = customComponents.results.paginate;\n    const PreloadComponent = customComponents.results.preloadIndicator;\n    const CurrentQueryComponent = customComponents.searchFields.currentQuery;\n    //TODO: SORT\n    const SortComponent = customComponents.sortFields.menu;\n    const FederatedTextSearch = FederatedSolrComponentPack.searchFields.text;\n\n    const resultPending = results.pending\n      ? (<ResultPendingComponent bootstrapCss={bootstrapCss} />)\n      : null;\n\n    const pagination = query.pageStrategy === 'paginate' ?\n      <PaginateComponent {...this.props} bootstrapCss={bootstrapCss} onChange={onPageChange} /> :\n      null;\n\n    const preloadListItem = query.pageStrategy === 'cursor'\n    && results.docs.length < results.numFound\n      ? <PreloadComponent {...this.props} />\n      : null;\n\n    let pageTitle;\n    if (this.props.options.pageTitle != null) {\n      pageTitle = <h1>{this.props.options.pageTitle}</h1>;\n    }\n    let sortChange = (a, b) => {\n\n      if (!this.state.submitted) {\n        this.setState(\n          {\n            submitted: true,\n          },\n          () => {onSearchFieldChange(a, b);}\n        );\n      } else {\n        onSortFieldChange(\"score\", \"desc\");\n        onSearchFieldChange(a, b);\n      }\n    };\n\n\n    return (\n      <LiveAnnouncer>\n        <form className=\"site-search-form\" autoComplete=\"off\">\n          {/* {pageTitle} */}\n          <div className=\"fs-search-form\" autoComplete=\"off\">\n            <FederatedTextSearch\n              {...this.props}\n              autocomplete={false} //options.autocomplete} TODO: JL remove autocomplete from search page\n              field=\"tm_rendered_item\"\n              label=\"Showing results for:\"\n              onSuggest={onTextInputChange}\n              onChange={sortChange}\n              value={searchFields.find((sf) => sf.field === \"tm_rendered_item\").value}\n            />\n            <CurrentQueryComponent {...this.props} onChange={sortChange} />\n          </div>\n        </form>\n        <div className=\"search-results\">\n          <aside className=\"fs-aside\">\n            <SearchFieldContainerComponent\n              bootstrapCss={bootstrapCss}\n              onNewSearch={this.resetFilters}\n              resultsCount={this.props.results.numFound}\n              title={this.props.options.menuTitle}\n            >\n              {/* Only render the visible facets / filters.\n                  Note: their values may still be used in the query, if they were pre-set. */}\n              {searchFields\n                .filter(\n                  (searchField) =>\n                    this.props.sidebarFilters.indexOf(searchField.field) > -1 &&\n                    !searchField.isHidden\n                )\n                .map((searchField, i) => {\n                  const { type, field, lowerBound, upperBound } = searchField;\n                  const SearchComponent = customComponents.searchFields[type];\n                  const facets = getFacetValues(\n                    type,\n                    results,\n                    field,\n                    lowerBound,\n                    upperBound\n                  );\n\n                  return (\n                    <SearchComponent\n                      key={i}\n                      {...this.props}\n                      {...searchField}\n                      bootstrapCss={bootstrapCss}\n                      facets={facets}\n                      truncateFacetListsAt={truncateFacetListsAt}\n                      onChange={onSearchFieldChange}\n                    />\n                  );\n                })}\n            </SearchFieldContainerComponent>\n          </aside>\n\n          <div className=\"fs-main\">\n            <div\n              className={\n                searchFields.find((sf) => sf.field === \"tm_rendered_item\")\n                  .value || this.props.options.showEmptySearchResults\n                  ? \"search-results__wrapper\"\n                  : \"search-results__wrapper screen-hide\"\n              }\n            >\n              <ResultContainerComponent bootstrapCss={bootstrapCss}>\n                <ResultHeaderComponent bootstrapCss={bootstrapCss}>\n                  {/* conditional rendering to hide white css block */}\n                  <div className=\"search-results__header\">\n                    <div className=\"search-results__count\">\n                      <ResultCount\n                        bootstrapCss={bootstrapCss}\n                        numFound={results.numFound}\n                        start={start}\n                        rows={rows}\n                        onChange={onPageChange}\n                        noResultsText={this.props.options.noResults || null}\n                        termValue={\n                          searchFields.find(\n                            (sf) => sf.field === \"tm_rendered_item\"\n                          ).value\n                        }\n                      />\n                      {resultPending}\n                    </div>\n                    <SortComponent\n                      bootstrapCss={bootstrapCss}\n                      onChange={onSortFieldChange}\n                      sortFields={sortFields}\n                    />\n                  </div>\n                </ResultHeaderComponent>\n\n                <ResultInstructionsComponent {...this.props} />\n\n                <ResultListComponent bootstrapCss={bootstrapCss}>\n                  {results.docs.map((doc, i) => {\n                    let CustomResultComponent =\n                      this.getResultByType(doc.sm_federated_type) ||\n                      ResultComponent;\n\n                    return (\n                      <CustomResultComponent\n                        bootstrapCss={bootstrapCss}\n                        doc={doc}\n                        fields={searchFields}\n                        key={doc.id || i}\n                        onSelect={this.props.onSelectDoc}\n                        resultIndex={i}\n                        rows={rows}\n                        start={start}\n                        highlight={results.highlighting[doc.id]}\n                        hostname={this.props.options.hostname}\n                      />\n                    );\n                  })}\n\n                  {preloadListItem}\n                </ResultListComponent>\n                {pagination}\n              </ResultContainerComponent>\n            </div>\n          </div>\n        </div>\n      </LiveAnnouncer>\n    );\n  }\n}\n\nFederatedSolrFacetedSearch.defaultProps = {\n  bootstrapCss: true,\n  customComponents: FederatedSolrComponentPack,\n  pageStrategy: 'paginate',\n  rows: 20,\n  searchFields: [\n    {\n      type: 'text', field: '*',\n    },\n  ],\n  sortFields: [],\n  truncateFacetListsAt: -1,\n  showCsvExport: false,\n  sidebarFilters: ['sm_site_name', 'sm_federated_type', 'sm_department', 'ds_federated_date', 'sm_federated_terms'],\n  options: {},\n};\n\nFederatedSolrFacetedSearch.propTypes = {\n  bootstrapCss: PropTypes.bool,\n  customComponents: PropTypes.object,\n  onCsvExport: PropTypes.func,\n  onNewSearch: PropTypes.func,\n  onPageChange: PropTypes.func,\n  onSearchFieldChange: PropTypes.func.isRequired,\n  onTextInputChange: PropTypes.func,\n  onSelectDoc: PropTypes.func,\n  onSortFieldChange: PropTypes.func.isRequired,\n  query: PropTypes.object,\n  results: PropTypes.object,\n  showCsvExport: PropTypes.bool,\n  truncateFacetListsAt: PropTypes.number,\n  options: PropTypes.object,\n};\n\nexport default FederatedSolrFacetedSearch;\n","// index.js\nimport 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport 'babel-polyfill';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { SolrClient } from './solr-faceted-search-react/src/index';\nimport FederatedSolrComponentPack from './components/federated_solr_component_pack';\nimport FederatedSolrFacetedSearch from './components/federated-solr-faceted-search';\nimport helpers from './helpers';\n\n// import search app boilerplate styles\nimport './styles.css';\n\n/**\n * Executes search query based on the value of URL querystring params.\n *\n * @param solrClient\n *   Instantiated solrClient.\n * @param options\n *   Config options, used to determine initial site search name\n */\nconst searchFromQuerystring = (solrClient, options = {}) => {\n  // Get existing querystring params.\n  const { parsed, params } = helpers.qs.getParsedQsAndParams();\n\n  let searchFieldsState = solrClient.state.query.searchFields;\n\n  // Set the state for searchFields based on qs params.\n  searchFieldsState.forEach((searchField) => {\n    // Get the field machine name for the main query field.\n    if (Object.prototype.hasOwnProperty.call(options,'mainQueryField') && searchField.field === options.mainQueryField) {\n      // Set the state of the main query field to the value of the search qs param\n      searchField.value = parsed.search;\n    }\n    // If the searchField is one for which we preserve state through qs.\n    if (helpers.filterFieldsWithQsState.find((filterField) => filterField === searchField.field )) {\n      searchField = helpers.qs.setFieldStateFromQs({\n        params,\n        searchField\n      }) // this resets our initial state of search sites\n    }\n    // If restricted to the current site by configuration, enforce it here.\n    // This rule only applies if site has not been selected by the user.\n    if (options.siteSearch !== undefined && searchField.field === 'sm_site_name' && searchField.value === undefined && searchField.isHidden === false) {\n      searchField.value = [options.siteSearch];\n    }\n  });\n  // Ensure the initial query succeeds by setting a default start value.\n  solrClient.state.query.start = solrClient.state.query.start || 0;\n  // Send query based on state derived from querystring.\n  solrClient.state.query.sort = options.defaultSort\n  solrClient.sendQuery(solrClient.state.query);\n};\n\n// Initialize the solr client + search app with settings.\nconst init = (settings) => {\n  const defaults = {\n    isD7: false,\n    // Whether or not we should be querying the solr backend directly.\n    proxyIsDisabled: false,\n    // The query request endpoint url must be assigned in ./.env.local.js and by the search app settings in the module.\n    url: \"\",\n    // The search fields and filterable facets.\n    searchFields: [\n      {label: \"Enter Search Term:\", field: \"tm_rendered_item\", type: \"text\", isHidden: false},\n      {label: \"Site Name\", field: \"sm_site_name\", type: \"list-facet\", collapse: true, isHidden: false},\n      {label: \"Type\", field: \"sm_federated_type\", type: \"list-facet\", collapse: true, isHidden: false},\n      {label: \"Department\", field: \"sm_department\", type: \"list-facet\", collapse: true, isHidden: false},\n      {label: \"Date\", field: \"ds_federated_date\", type: \"range-facet\", collapse: true, isHidden: false},\n      {label: \"Federated Terms\", field: \"sm_federated_terms\", type: \"list-facet\", hierarchy: true, expandedHierarchies: [], isHidden: false},\n    ],\n    // The solr field to use as the source for the main query param \"q\".\n    mainQueryField: \"tm_rendered_item\",\n    sortFields: [\n      //The following field is used to sort by first name\n      // {id: \"a-z-title\", label: \"A-Z\", field:\"ss_federated_title\", order: \"asc\"},\n      // {label: \"Z-A\", field:\"ss_federated_title\", order: \"desc\"},\n      // Z-A sort needs to be continuously worked on, build is not picking it up correctly\n      {id: \"score\", label: \"Relevance\", field: \"score\", order: \"desc\"},\n      {id: \"ds_federated_date\", label: \"Date\", field: \"ds_federated_date\", order: \"desc\"},\n      {id: \"sort_az_field\", label: \"A-Z\", field: \"ss_sort_az_field\", order: \"asc\"}\n      // {id: \"sort_az_field\", label: \"A-Z\", field: \"ss_federated_title\", order: \"asc\"}\n    ],\n    hiddenSearchFields : [],\n    // Enable highlighting in search results snippets.\n    hl: {\n      fl: 'tm_rendered_item', // the highlight snippet source field(s)\n      usePhraseHighlighter: true // highlight phrase queries\n    },\n    pageStrategy: \"paginate\",\n    rows: 20,\n    // Hostname overridable in ./.env.local.js for testing purposes.\n    hostname: window.location.hostname,\n    autocomplete: false,\n    filters: [],\n    defaultSort: []\n  };\n\n  const options = Object.assign(defaults, settings);\n\n  const result = options.sortFields.map(  option => {\n    if (option.field === options.defaultSort ) {\n      option.value = option.order\n    }\n  })\n  // Update searchFields to indicate which facets or filters should be hidden in the UI.\n  // Note: these facets and filters may still be used in the query.\n  // settings.hiddenSearchFields = settings.hiddenSearchFields || [];\n  options.searchFields = options.searchFields.map(searchField => {\n    if (settings.hiddenSearchFields?.includes(searchField.field)) {\n      searchField.isHidden = true;\n    }\n    return searchField;\n  });\n\n  // Set sm_site_name default values from config\n  const sm_site_name_value = settings.sm_site_name || false;\n\n\n  // Logic for restricting site search based on config.\n  options.siteList = [];\n  if (settings.siteSearch !== undefined) {\n    options.searchFields.forEach((searchField) => {\n      if (searchField.field === 'sm_site_name' &&\n        (searchField.isHidden || sm_site_name_value.length < 2)) {\n        options.siteList = [settings.siteSearch];\n      }\n    });\n  }\n  else {\n    options.siteList = sm_site_name_value;\n  }\n\n  options.filters.push({field: \"sm_site_name\", type: \"list-facet\", value: options.siteList});\n\n  // The client class.\n  const solrClient = new SolrClient({\n    isD7: options.isD7,\n    proxyIsDisabled: options.proxyIsDisabled,\n    url: options.url,\n    userpass: options.userpass,\n    searchFields: options.searchFields,\n    //TODO: SORT\n    sortFields: options.sortFields,\n    pageStrategy: options.pageStrategy,\n    rows: options.rows,\n    hl: options.hl,\n    mainQueryField: options.mainQueryField,\n    filters: options.filters,\n\n    // The change handler passes the current query- and result state for render\n    // as well as the default handlers for interaction with the search component\n    onChange: (state, handlers) =>\n      // Render the faceted search component\n      ReactDOM.render(\n        <FederatedSolrFacetedSearch\n          {...state}\n          {...handlers}\n          customComponents={FederatedSolrComponentPack}\n          bootstrapCss={false}\n          //onSelectDoc={(doc) => console.log(doc)}\n          onSelectDoc={()=>{}}\n          truncateFacetListsAt={-1}\n          options={options}\n        />,\n        document.getElementById(\"fs-root\")\n      )\n  });\n\n  // Check if there is a querystring param search term and make initial query.\n  searchFromQuerystring(solrClient, options);\n\n  // Listen for browser history changes / updated querystring, make new query.\n  // See https://developer.mozilla.org/en-US/docs/Web/Events/popstate\n  window.onpopstate = function() {\n    searchFromQuerystring(solrClient, options);\n  };\n};\n\n// If we are in the production environment (i.e. using the build compiled js)\n// @see https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables\nif (process.env.NODE_ENV === 'production') {\n  // Get the root element where the app will be rendered.\n  const root = document.getElementById(\"fs-root\");\n\n  if (root) {\n    // Get the data attribute which has the stringified configuration data json object.\n    if (Object.hasOwnProperty.call(root.dataset, 'federatedSearchAppConfig')) {\n      const settings = JSON.parse(root.dataset.federatedSearchAppConfig);\n      init(settings);\n    }\n    else {\n      console.error('Federated Search React | Could not find a data-federated-search-app-config attribute on div#fs-root.  Please populate data-federated-search-app-config with search app configuration data.');\n    }\n  }\n  else {\n    console.error('Federated Search React | Could not find div#fs-root in which to load the search app.');\n  }\n}\n// This is not production (i.e. not using the build compiled js)\nelse {\n  // Get the local environment settings for the search app and initialize.\n  import('./.env.local.js')\n    .then(\n      (settings) => {\n        init(settings); // Load the app, passing in the ./.env.local.js config.\n      },\n      (error) => {\n        console.error('Federated Search React | Could not load local configuration for search app: ', error);\n      }\n    );\n}\n"],"sourceRoot":""}