diff options
author | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-07-01 11:24:44 -0700 |
---|---|---|
committer | Danglewood <85772166+deeleeramone@users.noreply.github.com> | 2024-07-01 11:24:44 -0700 |
commit | 036975d984442720be953b04530b9008196a5020 (patch) | |
tree | 0d581d898fb8870fe6f30df323ff3ef7b3655f0a | |
parent | 3b48bc5153224a8f5adee85f4ce56f2d9f94803b (diff) |
finviz cassettes
5 files changed, 6679 insertions, 7976 deletions
diff --git a/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml b/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml index 338774b892e..5c56137054d 100644 --- a/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml +++ b/openbb_platform/providers/finviz/tests/record/http/test_finviz_fetchers/test_finviz_compare_groups_fetcher_urllib3_v1.yaml @@ -14,1032 +14,251 @@ interactions: uri: https://finviz.com/groups.ashx?g=country&o=perf1w&v=140 response: body: - string: "<!DOCTYPE html>\n<html lang=\"en\" class=\" dark\">\n<head>\n<title>Group - Screener - Performance country perf1w</title>\n<meta charset=\"UTF-8\"><meta - name=\"viewport\" content=\"width=1024\"><meta name=\"description\" content=\"Stock - screener for investors and traders, financial visualizations.\">\n\r\n <link - rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-regular.woff2\" as=\"font\" - crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-700.woff2\" - as=\"font\" crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/lato-v17-latin-ext_latin-900.woff2\" - as=\"font\" crossorigin>\r\n <link rel=\"preload\" href=\"/fonts/inter-latin.woff2\" - as=\"font\" crossorigin>\r\n \r\n <script>\r\n window.notificationsArray - = [];\r\n window.renderScriptNotLoaded = function () {};\r\n - \ window.handleScriptNotLoaded = function (element) {\r\n window.notificationsArray.push(element);\r\n - \ window.sentryDisabled = true;\r\n window.handleScriptNotLoaded - = function () {};\r\n };\r\n </script>\r\n <link - rel=\"stylesheet\" href=\"/assets/dist-legacy/redesign.434ddfac.css\" type=\"text/css\" - onerror=\"window.handleScriptNotLoaded(this)\">\n<link rel=\"stylesheet\" - href=\"/assets/dist-legacy/main.a7b34d07.css\" type=\"text/css\" onerror=\"window.handleScriptNotLoaded(this)\">\n<link - rel=\"icon\" type=\"image/png\" href=\"/favicon_2x.png\" sizes=\"32x32\">\n<link - rel=\"icon\" type=\"image/png\" href=\"/favicon.png\" sizes=\"16x16\">\n <script - type=\"text/javascript\" async=true>\r\n (function() {\r\n var host = - 'finviz.com';\r\n var element = document.createElement('script');\r\n var - firstScript = document.getElementsByTagName('script')[0];\r\n var url = - 'https://cmp.inmobi.com'\r\n .concat('/choice/', 'c2W8esUZ6Q8oA', '/', - host, '/choice.js?tag_version=V3');\r\n var uspTries = 0;\r\n var uspTriesLimit - = 3;\r\n element.async = true;\r\n element.type = 'text/javascript';\r\n - \ element.src = url;\r\n\r\n firstScript.parentNode.insertBefore(element, - firstScript);\r\n\r\n function makeStub() {\r\n var TCF_LOCATOR_NAME - = '__tcfapiLocator';\r\n var queue = [];\r\n var win = window;\r\n - \ var cmpFrame;\r\n\r\n function addFrame() {\r\n var doc - = win.document;\r\n var otherCMP = !!(win.frames[TCF_LOCATOR_NAME]);\r\n\r\n - \ if (!otherCMP) {\r\n if (doc.body) {\r\n var iframe - = doc.createElement('iframe');\r\n\r\n iframe.style.cssText = 'display:none';\r\n - \ iframe.name = TCF_LOCATOR_NAME;\r\n doc.body.appendChild(iframe);\r\n - \ } else {\r\n setTimeout(addFrame, 5);\r\n }\r\n - \ }\r\n return !otherCMP;\r\n }\r\n\r\n function tcfAPIHandler() - {\r\n var gdprApplies;\r\n var args = arguments;\r\n\r\n if - (!args.length) {\r\n return queue;\r\n } else if (args[0] - === 'setGdprApplies') {\r\n if (\r\n args.length > 3 &&\r\n - \ args[2] === 2 &&\r\n typeof args[3] === 'boolean'\r\n - \ ) {\r\n gdprApplies = args[3];\r\n if (typeof - args[2] === 'function') {\r\n args[2]('set', true);\r\n }\r\n - \ }\r\n } else if (args[0] === 'ping') {\r\n var retr - = {\r\n gdprApplies: gdprApplies,\r\n cmpLoaded: false,\r\n - \ cmpStatus: 'stub'\r\n };\r\n\r\n if (typeof - args[2] === 'function') {\r\n args[2](retr);\r\n }\r\n - \ } else {\r\n if(args[0] === 'init' && typeof args[3] === - 'object') {\r\n args[3] = Object.assign(args[3], { tag_version: - 'V3' });\r\n }\r\n queue.push(args);\r\n }\r\n }\r\n\r\n - \ function postMessageEventHandler(event) {\r\n var msgIsString - = typeof event.data === 'string';\r\n var json = {};\r\n\r\n try - {\r\n if (msgIsString) {\r\n json = JSON.parse(event.data);\r\n - \ } else {\r\n json = event.data;\r\n }\r\n } - catch (ignore) {}\r\n\r\n var payload = json.__tcfapiCall;\r\n\r\n - \ if (payload) {\r\n window.__tcfapi(\r\n payload.command,\r\n - \ payload.version,\r\n function(retValue, success) {\r\n - \ var returnMsg = {\r\n __tcfapiReturn: {\r\n returnValue: - retValue,\r\n success: success,\r\n callId: - payload.callId\r\n }\r\n };\r\n if - (msgIsString) {\r\n returnMsg = JSON.stringify(returnMsg);\r\n - \ }\r\n if (event && event.source && event.source.postMessage) - {\r\n event.source.postMessage(returnMsg, '*');\r\n }\r\n - \ },\r\n payload.parameter\r\n );\r\n }\r\n - \ }\r\n\r\n while (win) {\r\n try {\r\n if (win.frames[TCF_LOCATOR_NAME]) - {\r\n cmpFrame = win;\r\n break;\r\n }\r\n - \ } catch (ignore) {}\r\n\r\n if (win === window.top) {\r\n break;\r\n - \ }\r\n win = win.parent;\r\n }\r\n if (!cmpFrame) - {\r\n addFrame();\r\n win.__tcfapi = tcfAPIHandler;\r\n win.addEventListener('message', - postMessageEventHandler, false);\r\n }\r\n };\r\n\r\n makeStub();\r\n\r\n - \ var uspStubFunction = function() {\r\n var arg = arguments;\r\n if - (typeof window.__uspapi !== uspStubFunction) {\r\n setTimeout(function() - {\r\n if (typeof window.__uspapi !== 'undefined') {\r\n window.__uspapi.apply(window.__uspapi, - arg);\r\n }\r\n }, 500);\r\n }\r\n };\r\n\r\n var - checkIfUspIsReady = function() {\r\n uspTries++;\r\n if (window.__uspapi - === uspStubFunction && uspTries < uspTriesLimit) {\r\n console.warn('USP - is not accessible');\r\n } else {\r\n clearInterval(uspInterval);\r\n - \ }\r\n };\r\n\r\n if (typeof window.__uspapi === 'undefined') {\r\n - \ window.__uspapi = uspStubFunction;\r\n var uspInterval = setInterval(checkIfUspIsReady, - 6000);\r\n }\r\n })();\r\n </script><script>\r\n FinvizSettings - = {\r\n versionImages: 12,\r\n hasUserPremium: - false,\r\n name: \"\",\r\n email: \"\",\r\n - \ nodeChartsDomain: \"https://charts2-node.finviz.com\",\r\n - \ hasUserStickyHeader: true,\r\n adsProvider: - 1,\r\n hasRedesignEnabled: true,\r\n hasDarkTheme: - true,\r\n quoteSearchExt: '',\r\n isJoinBannerVisible: - false,\r\n };\r\n </script><script src=\"/assets/dist-legacy/script/browser_check.0d635eab.js\"></script><script - src=\"/assets/dist-legacy/script/vendor/boxover.94c8d909.js\"></script>\n<script - src=\"/assets/dist-legacy/runtime.c6d22a12.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/libs_init.6c24f8e6.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/4448.4d6ce3b6.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/7808.bfd72543.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/1556.75067b82.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/3988.202a9cce.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/7603.96a170ed.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/1756.6bddc02b.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script><script - src=\"/assets/dist-legacy/header.8fcd949e.js\" onerror=\"window.handleScriptNotLoaded(this)\"></script></head>\n<body - class=\"m-0 yellow-tooltip is-groups min-w-[1000px] chart-tooltip\">\r\n <script>\r\n - \ var cookieName = 'fv_block';\r\n var selector - = '[data-google-query-id]';\r\n var selectorFrame = selector - + ' iframe, ' + selector + ' [id*=aax]';\r\n var cookieExpiry - = 5 * 60 * 1000; // 5min\r\n var checkTimeout = 20 * 1000; - // 20sec\r\n\r\n function getCookie(value) {\r\n var - expiration = +new Date() + cookieExpiry;\r\n return cookieName - + '=' + value + '; expires=' + (new Date(expiration)).toUTCString() + '; path=/';\r\n - \ }\r\n\r\n var finvizBannersLoaded = false;\r\n - \ function loadFinvizBanners(setCookie) {\r\n \r\n - \ if (setCookie) document.cookie = getCookie('block');\r\n - \ finvizBannersLoaded = true;\r\n var - s = document.createElement('script');\r\n s.type = 'text/javascript';\r\n - \ s.async = true;\r\n s.src = '/assets/dist-legacy/script/finviz_b.cff16f1f.js';\r\n - \ document.head.appendChild(s);\r\n }\r\n\r\n - \ function checkBannersLoaded() {\r\n var - checkEnd = +new Date() + checkTimeout;\r\n function asyncCheckIfExists(selector, - resolve) {\r\n var now = +new Date();\r\n var - container = document.querySelector(selector);\r\n if - (!container && checkEnd > now) return setTimeout(function () { asyncCheckIfExists(selector, - resolve) }, 1000)\r\n resolve(!!container);\r\n }\r\n - \ \r\n asyncCheckIfExists(selector, function - (exists) {\r\n if (!exists) return loadFinvizBanners(true);\r\n\r\n - \ asyncCheckIfExists(selectorFrame, function (hasIframe) - {\r\n if (!hasIframe) return loadFinvizBanners(true);\r\n - \ })\r\n })\r\n }\r\n\r\n - \ if (document.cookie.indexOf(cookieName) >= 0) {\r\n loadFinvizBanners(false);\r\n - \ } else {\r\n var s = document.createElement('script');\r\n - \ s.type = 'text/javascript';\r\n s.async - = true;\r\n s.onerror = loadFinvizBanners;\r\n s.onload - = checkBannersLoaded;\r\n s.src = 'https://u5.investingchannel.com/static/uat.js';\r\n - \ document.head.appendChild(s);\r\n\r\n InvestingChannelQueue - = window.InvestingChannelQueue || [];\r\n var ic_page;\r\n\r\n - \ function refreshAd(container, refreshes) { \r\n var - placementTag, adslot;\r\n window.InvestingChannelQueue.push(function - () {\r\n var pubTags = ic_page.getPubTag.call(ic_page, - container.id);\r\n if (!pubTags) return;\r\n var - pubTag = pubTags[0];\r\n placementTag = pubTag.mPlacements[0].mTagToRender;\r\n - \ adslot = pubTag.mPlacements[0].mPublisherKval.adslot[0];\r\n - \ // Update div ID\r\n var - id = container.id.split('_');\r\n var numberOfDivs - = document.querySelectorAll('[id*=' + id.slice(0, id.length - 1).join('_') - + ']').length;\r\n var newDivNumber = Number(id.pop()) - + numberOfDivs * refreshes;\r\n container.setAttribute('id', - id.join('_') + '_' + newDivNumber);\r\n // Destroy - previous pubtag & reset container html (loading span)\r\n pubTag.destroy();\r\n - \ container.innerHTML = '';\r\n }); - \r\n window.InvestingChannelQueue.push(function () - {\r\n if (!placementTag || !adslot) return\r\n - \ // Create new pub tag\r\n var - newTag;\r\n var layoutId = placementTag.mNativeLayout - ? placementTag.mNativeLayout.nativelayoutid : null;\r\n if - (layoutId) {\r\n newTag = ic_page.defineNativeTag('finviz/' - + placementTag.mTarget.dfpkeyname, placementTag.mAdSize, container.id, layoutId);\r\n - \ var nativeLayout, layoutData\r\n\r\n try - {\r\n nativeLayout = newTag.mPlacements[0].mTags[0].mNativeLayout;\r\n - \ } catch (e) {\r\n console.log(e.message)\r\n - \ }\r\n\r\n try - {\r\n layoutData = newTag.mTemplate.mNativeLayout[layoutId].Data\r\n - \ if (layoutData && nativeLayout && !nativeLayout.layout) - {\r\n newTag.mPlacements[0].mTags[0].mNativeLayout - = layoutData\r\n }\r\n } - catch (e) {\r\n console.log(e.message)\r\n - \ }\r\n } else {\r\n - \ newTag = ic_page.defineTag('finviz/' + placementTag.mTarget.dfpkeyname, - placementTag.mAdSize, container.id);\r\n }\r\n - \ // Set adslot param\r\n newTag.setKval({ - adslot: adslot });\r\n newTag.setKval({ kw: 'ajax' - });\r\n newTag.render();\r\n });\r\n - \ }\r\n\r\n var refreshCount = 1;\r\n - \ function refreshAds(selectors) { \r\n if - (window.ic_page) {\r\n document.querySelectorAll(selectors).forEach(function - (element) {\r\n try {\r\n refreshAd(element, - refreshCount);\r\n } catch (e) {\r\n console.log('Ad - refresh error for:', element, e);\r\n }\r\n - \ });\r\n window.ic_page.loadMore();\r\n - \ refreshCount++;\r\n } \r\n - \ }\r\n\r\n\r\n InvestingChannelQueue.push(function() - {\r\n var icConfig = window['FINVIZ_IC_UAT_CONFIG'] - = {};\r\n \r\n ic_page = InvestingChannel.UAT.Run('df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a', - icConfig);\r\n });\r\n\r\n var hash - = null;\r\n if (typeof hash === 'string') {\r\n InvestingChannelQueue.push(function() - {\r\n if (ic_page) {\r\n ic_page.setUserId('email', - hash, true);\r\n }\r\n });\r\n - \ }\r\n }\r\n </script> <script>\r\n - \ function FinvizNewsletterHide() {\r\n fetch('/api/set_cookie.ashx?cookie=notice-newsletter').catch(function(){}).then(function(){\r\n - \ window.gtag && window.gtag('event', 'close', { event_category: - 'notice-newsletter', non_interaction: true })\r\n })\r\n document.getElementById('js-notice-newsletter').style.display - = 'none';\r\n }\r\n\r\n const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/\r\n\r\n - \ function FinvizNewsletterSubmit(event) {\r\n const emailValue - = event.target.elements[\"email\"].value\r\n if (!emailRegex.test(emailValue)) - {\r\n event.preventDefault()\r\n alert(\"Invalid - email address\")\r\n return\r\n }\r\n window.gtag - && window.gtag('event', 'subscription', { event_category: 'notice-newsletter', - non_interaction: true })\r\n }\r\n window.gtag && window.gtag('event', - 'impression', { event_category: 'notice-newsletter', non_interaction: true - })\r\n </script>\r\n <div id=\"js-notice-newsletter\" class=\"font-sans - relative isolate flex items-center justify-center gap-x-2 gap-y-2 overflow-hidden - bg-gray-50 px-6 py-2.5\">\r\n <div class=\"absolute left-[max(-7rem,calc(50%-52rem))] - top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl\" aria-hidden=\"true\">\r\n - \ <div class=\"aspect-[577/310] w-[36.0625rem] bg-gradient-to-r - from-purple-500 to-blue-500 opacity-30\" style=\"clip-path: polygon(74.8% - 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, - 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% - 54.1%, 68.6% 100%, 74.8% 41.9%)\"></div>\r\n </div>\r\n <div - class=\"absolute left-[max(45rem,calc(50%+8rem))] top-1/2 -z-10 -translate-y-1/2 - transform-gpu blur-2xl\" aria-hidden=\"true\">\r\n <div class=\"aspect-[577/310] - w-[36.0625rem] bg-gradient-to-r from-blue-500 to-purple-500 opacity-30\" style=\"clip-path: - polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, - 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% - 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)\"></div>\r\n </div>\r\n\r\n - \ <p class=\"text-sm leading-6 text-gray-900\">\r\n Subscribe - to our newsletter to receive the latest product updates and special offers\r\n - \ </p>\r\n <form action=\"/api/newsletter/widget\" method=\"post\" - onsubmit=\"FinvizNewsletterSubmit(event)\" class=\"relative w-[280px]\">\r\n - \ <div class=\"w-full\">\r\n <label class=\"flex - grow flex-col\">\r\n <div class=\"group relative flex\">\r\n - \ <input name=\"email\" value=\"\" placeholder=\"Your - email\" type=\"email\" maxlength=\"50\" required class=\"text-gray-900 border - bg-white disabled:bg-gray-50 disabled:text-gray-500 border-gray-300 focus:border-blue-400 - disabled:hover:border-gray-100 h-8 text-sm rounded-md !pr-24 w-full grow select-text - appearance-none outline-none pl-2\">\r\n </div>\r\n </label>\r\n - \ </div>\r\n <button class=\"flex items-center font-medium - whitespace-nowrap focus:outline-none text-sm text-white hover:text-white active:bg-blue-600 - disabled:bg-blue-200 disabled:hover:bg-blue-200 bg-blue-400 hover:bg-blue-500 - h-7 px-2 rounded focus-visible:ring-2 ring-gray-200 absolute right-0.5 top-0.5 - rounded-l-none\">\r\n <div class=\"grow text-left\">Subscribe</div>\r\n - \ </button>\r\n </form>\r\n\r\n <button type=\"button\" - onclick=\"FinvizNewsletterHide()\" class=\"-m-3 p-3 focus-visible:outline-offset-[-4px]\">\r\n - \ <span class=\"sr-only\">Dismiss</span>\r\n <svg class=\"h-5 - w-5 text-gray-900\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\r\n - \ <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 - 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 - 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\r\n </svg>\r\n </button>\r\n - \ </div>\r\n <script>\r\n function checkMediaQuery(matches) - {\r\n if (matches) {\r\n FinvizSettings.hasUserStickyHeader - = true;\r\n document.body.classList.add('is-header-sticky');\r\n - \ } else {\r\n FinvizSettings.hasUserStickyHeader - = false;\r\n document.body.classList.remove('is-header-sticky');\r\n - \ }\r\n }\r\n var mediaMatch = window.matchMedia('(min-width: - 1025px) and (min-height: 650px)');\r\n checkMediaQuery(mediaMatch.matches);\r\n - \ mediaMatch.addListener(function (ev) { checkMediaQuery(ev.matches) - });\r\n </script>\r\n <div id=\"notifications-container\"></div><table - class=\"header\">\r\n <tr class=\"align-top\">\r\n <td>\r\n <table - class=\"header-container\">\r\n <tr>\r\n <td - class=\"w-[30%]\">\r\n <table class=\"w-full\">\r\n - \ <tr>\r\n <td class=\"h-[50px] - align-middle\">\r\n <a href=\"/\" class=\"logo\"><svg - width=\"225\" height=\"32\" class=\"block\">\r\n <use href=\"/img/logo.svg#free\" - class=\"dark:hidden\" />\r\n <use href=\"/img/logo.svg#free-dark\" class=\"hidden - dark:block\" />\r\n</svg></a>\r\n </td>\r\n - \ </tr>\r\n <tr>\r\n - \ <td id=\"search\" style=\"padding-top: 7px\">\r\n - \ <div class=\"navbar-search-placeholder\">\r\n - \ <span class=\"icon-wrapper\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" - class=\"icon\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path d=\"M16.9 - 15.5l4 4c.2.2.1.5 0 .7l-.7.7a.5.5 0 01-.8 0l-4-4c0-.2-.2-.3-.3-.4l-.7-1a7 - 7 0 01-11.2-4 7 7 0 1112.2 3l1 .6.5.4zM5 10a5 5 0 1010 0 5 5 0 00-10 0z\" - />\r\n </svg>\r\n </span>\r\n <input placeholder=\"Search ticker, - company or profile\" class=\"search-input is-free\"/>\r\n</div>\r\n </td>\r\n - \ </tr>\r\n </table>\r\n - \ </td>\r\n <td class=\"align-bottom - pb-1\">\r\n <div id=\"microbar_position\" class=\"hidden - xl:flex items-center h-[37px] pl-2\"><div>\r\n <div - id=\"IC_D_88x31_1\"class=\"relative overflow-hidden flex items-center justify-center - w-full mx-auto\" style=\"width:88px;height:31px;max-height:31px\"></div>\r\n - \ </div></div>\r\n </td>\r\n <td - class=\"relative w-[730px] text-right\">\r\n <div id=\"banner_position\" - class=\"overflow-hidden absolute top-0 right-0 w-full h-24\">\r\n <div - id=\"IC_D_728x90_1\"class=\"relative overflow-hidden flex items-center justify-center - w-full mx-auto\" style=\"width:728px;height:90px;max-height:90px\"></div>\r\n - \ </div>\r\n </td>\r\n </tr>\r\n - \ </table>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td - class=\"w-[994px] leading-none\" style=\"font-size:0\">\r\n <img - src=\"/gfx/nic2x2.gif\" class=\"w-[994px] h-px\" alt=\"\">\r\n </td>\r\n - \ </tr>\r\n</table>\r\n <table class=\"navbar\">\r\n <tr>\r\n - \ <td class=\"h-[30px]\">\r\n <table - class=\"header-container\">\r\n <tr><td><a class=\"nav-link - \ is-first\" href=\"/\">Home</a></td><td><a class=\"nav-link \" href=\"/news.ashx\">News</a></td><td><a - class=\"nav-link \" href=\"/screener.ashx\">Screener</a></td><td><a class=\"nav-link - \" href=\"/map.ashx\">Maps</a></td><td><a class=\"nav-link is-active\" href=\"/groups.ashx\">Groups</a></td><td><a - class=\"nav-link \" href=\"/portfolio.ashx\">Portfolio</a></td><td><a class=\"nav-link - \" href=\"/insidertrading.ashx\">Insider</a></td><td><a class=\"nav-link \" - href=\"/futures.ashx\">Futures</a></td><td><a class=\"nav-link \" href=\"/forex.ashx\">Forex</a></td><td><a - class=\"nav-link \" href=\"/crypto.ashx\">Crypto</a></td><td><a class=\"nav-link - \" href=\"/elite.ashx?utm_source=finviz&utm_medium=banner&utm_campaign=main-navbar-backtests\">Backtests</a></td><td><a - class=\"nav-link is-elite\" href=\"/elite.ashx\">Elite</a></td><td class=\"w-full - relative\"><div class=\"absolute bottom-0 left-0 right-0 top-0\"><div id=\"time\" - class=\"pr-1\"></div></div></td>\r\n <td class=\"nav relative\">\r\n - \ <a data-testid=\"chart-layout-theme\" href=\"#\" class=\"!flex !bg-transparent - !border-b-0 mt-1 !py-0 !px-1\" style='border-left: 1px solid #444a57' title=\"Toggle - Light/Dark mode\" onclick=\"setChartThemeCookie('light', true)\">\r\n <div - class='relative box-content flex rounded-full w-10 h-5 border border-gray-750 - bg-gray-800 text-white justify-end'>\r\n <div class='box-border - w-1/2 rounded-full p-px border border-gray-800 bg-[#4c5261] flex justify-center - items-center'>\r\n <svg width=\"16\" height=\"16\" class=\"fill-current - text-white inline-block -ml-px\">\r\n <use href=\"/assets/dist-icons/icons.svg?rev=12#moonOutlined\"/>\r\n</svg>\r\n - \ </div>\r\n </div>\r\n <span class='ml-1 - select-none font-medium text-xs text-white'>Theme</span>\r\n </a>\r\n - \ </td>\r\n \r\n <td>\r\n <a href=\"/help/groups.ashx\" - class=\"nav-link is-help\" style=\"border-left: 1px solid #444a57\"><span - class=\"fa fa-question-circle\"></span>Help</a>\r\n </td>\r\n - \ <td><a href=\"/login.ashx\" class=\"nav-link sign-in\">Login</a></td>\r\n - \ <td><a href=\"/register.ashx\" class=\"nav-link sign-up\">Register</a></td>\r\n - \ \r\n </tr>\r\n </table>\r\n - \ </td>\r\n </tr>\r\n </table>\r\n - \ \r\n <script>\r\n function reloadPage () { location.reload() - }\r\n function setChartThemeCookie(chartsTheme) {\r\n fetch('/api/set_cookie.ashx?cookie=chartsTheme&value=' - + chartsTheme ).catch(function(){}).then(function(){\r\n window.gtag - && window.gtag('event', 'click', { event_category: 'theme', event_label: 'toggle', - value: chartsTheme, event_callback: reloadPage });\r\n setTimeout(reloadPage,1000);\r\n - \ })\r\n }\r\n </script><div class=\"content - \"><div class=\"fv-container is-tight\"><tr>\n<td>\n<table id=\"filter-table-top\" - class=\"screener-groups_table-filter\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" - border=\"0\">\n<tr>\n<td class=\"screener-groups_filter-label text-right\" - width=\"6%\">\n<span class=\"body-combo-title\" style=\"cursor:pointer;\" - data-boxover=\"cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[Group] - body=[<table width=300><tr><td class='tooltip_tab'>Select group - stocks organized - by <b>sector</b>, <b>industry</b>, <b>country</b> or market <b>capitalization</b>.</td></tr></table>] - delay=[500]\">Group</span></td>\n<td class=\"pl-1\" align=\"left\">\n<select - id=\"groupSelect\" style=\"width:100%;\" class=\"body-combo-text fv-select\" - onchange='window.location=document.getElementById(\"groupSelect\").value'>\n<option - value=\"groups.ashx?g=sector&v=140&o=perf1w\">Sector</option><option value=\"groups.ashx?g=industry&v=140&o=perf1w\">Industry</option><option - value=\"groups.ashx?g=industry&sg=basicmaterials&v=140&o=perf1w\">Industry - (Basic Materials)</option><option value=\"groups.ashx?g=industry&sg=communicationservices&v=140&o=perf1w\">Industry - (Communication Services)</option><option value=\"groups.ashx?g=industry&sg=consumercyclical&v=140&o=perf1w\">Industry - (Consumer Cyclical)</option><option value=\"groups.ashx?g=industry&sg=consumerdefensive&v=140&o=perf1w\">Industry - (Consumer Defensive)</option><option value=\"groups.ashx?g=industry&sg=energy&v=140&o=perf1w\">Industry - (Energy)</option><option value=\"groups.ashx?g=industry&sg=financial&v=140&o=perf1w\">Industry - (Financial)</option><option value=\"groups.ashx?g=industry&sg=healthcare&v=140&o=perf1w\">Industry - (Healthcare)</option><option value=\"groups.ashx?g=industry&sg=industrials&v=140&o=perf1w\">Industry - (Industrials)</option><option value=\"groups.ashx?g=industry&sg=realestate&v=140&o=perf1w\">Industry - (Real Estate)</option><option value=\"groups.ashx?g=industry&sg=technology&v=140&o=perf1w\">Industry - (Technology)</option><option value=\"groups.ashx?g=industry&sg=utilities&v=140&o=perf1w\">Industry - (Utilities)</option><option selected=\"selected\" value=\"groups.ashx?g=country&v=140&o=perf1w\">Country - (U.S. listed stocks only)</option><option value=\"groups.ashx?g=capitalization&v=140&o=perf1w\">Capitalization</option></select>\n</td>\n<td - class=\"screener-groups_filter-label text-right\" width=\"7%\">\n<span class=\"body-combo-title\" - style=\"cursor:pointer;\" data-boxover=\"cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] - header=[Order By] body=[<table width=300><tr><td class='tooltip_tab'>Select - the criteria by which the output information will be sorted. Use the <b>ascending</b> - and <b>descending</b> option to invert the current order.<br><br> TIP: In - table views you can click on top of a column to sort the table by the underlying - values.</td></tr></table>] delay=[500]\">Order By</span></td>\n<td class=\"pl-1\" - align=\"left\">\n<select id=\"orderSelect\" style=\"width:100%;\" class=\"body-combo-text - fv-select\" onchange='window.location=document.getElementById(\"orderSelect\").value'>\n<option - value=\"groups.ashx?g=country&v=140&o=name\">Name</option><option value=\"groups.ashx?g=country&v=140&o=marketcap\">Market - Capitalization</option><option value=\"groups.ashx?g=country&v=140&o=pe\">Price/Earnings</option><option - value=\"groups.ashx?g=country&v=140&o=forwardpe\">Forward Price/Earnings</option><option - value=\"groups.ashx?g=country&v=140&o=peg\">PEG (Price/Earnings/Growth)</option><option - value=\"groups.ashx?g=country&v=140&o=ps\">Price/Sales</option><option value=\"groups.ashx?g=country&v=140&o=pb\">Price/Book</option><option - value=\"groups.ashx?g=country&v=140&o=pc\">Price/Cash</option><option value=\"groups.ashx?g=country&v=140 |