CINXE.COM
Fletcher - Global Competitive Strategic Insights
<!DOCTYPE html><html lang="en-US"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"><link rel="profile" href="http://gmpg.org/xfn/11"> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/themes/catch-responsive-child/js/splide.min.js"></script> <link rel="stylesheet" id="splide-style-css" href="https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/splide.min.css" type="text/css" media="all"> <script defer src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script defer src="https://www.googletagmanager.com/gtag/js?id=AW-1070951481"></script> <script defer src="data:text/javascript;base64,CgkJCXdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwoJCQlmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CgkJCWd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CgoJCQlndGFnKCdjb25maWcnLCAnQVctMTA3MDk1MTQ4MScpOwoJCQ=="></script> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_d29b672c88ddab4ae609ffe7cf1cfdb4.php"></script> <style>@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap');</style><meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /><style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style><title>Fletcher - Global Competitive Strategic Insights</title><link rel="canonical" href="https://fletchercsi.com/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="website" /><meta property="og:title" content="Fletcher - Primary Research, Competitive Intelligence, Win/Loss Analysis" /><meta property="og:description" content="Business leaders around the globe rely on our competitive insights to drive decisions that matter. You deserve more than data. We roll up our sleeves to acquire reliable information and make the connections needed so it is actionable." /><meta property="og:url" content="https://fletchercsi.com/" /><meta property="og:site_name" content="Fletcher - Global Competitive Insights" /><meta property="article:modified_time" content="2024-03-04T20:59:14+00:00" /><meta property="og:image" content="https://fletchercsi.com/wp-content/uploads/2022/10/fletcher-homepage.jpg" /><meta property="og:image:width" content="1664" /><meta property="og:image:height" content="806" /><meta property="og:image:type" content="image/jpeg" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Fletcher - Primary Research, Competitive Intelligence, Win/Loss Analysis" /><meta name="twitter:description" content="Business leaders around the globe rely on our competitive insights to drive decisions that matter. You deserve more than data. We roll up our sleeves to acquire reliable information and make the connections needed so it is actionable." /><meta name="twitter:image" content="https://fletchercsi.com/wp-content/uploads/2022/10/fletcher-homepage.jpg" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://fletchercsi.com/","url":"https://fletchercsi.com/","name":"Fletcher - Global Competitive Strategic Insights","isPartOf":{"@id":"https://fletchercsi.com/#website"},"primaryImageOfPage":{"@id":"https://fletchercsi.com/#primaryimage"},"image":{"@id":"https://fletchercsi.com/#primaryimage"},"thumbnailUrl":"https://fletchercsi.com/wp-content/uploads/2022/08/temp-home-pic-brain.jpg","datePublished":"2022-08-19T19:15:53+00:00","dateModified":"2024-03-04T20:59:14+00:00","breadcrumb":{"@id":"https://fletchercsi.com/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://fletchercsi.com/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://fletchercsi.com/#primaryimage","url":"https://fletchercsi.com/wp-content/uploads/2022/08/temp-home-pic-brain.jpg","contentUrl":"https://fletchercsi.com/wp-content/uploads/2022/08/temp-home-pic-brain.jpg","width":1600,"height":960,"caption":"Temp Home Pic"},{"@type":"BreadcrumbList","@id":"https://fletchercsi.com/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home"}]},{"@type":"WebSite","@id":"https://fletchercsi.com/#website","url":"https://fletchercsi.com/","name":"Fletcher - Global Competitive Insights","description":"Global Competitive Insights","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://fletchercsi.com/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script> <link rel='dns-prefetch' href='//www.googletagmanager.com' /><link rel='dns-prefetch' href='//fonts.googleapis.com' /><link rel='dns-prefetch' href='//use.fontawesome.com' /><link rel="alternate" type="application/rss+xml" title="Fletcher - Global Competitive Insights » Feed" href="https://fletchercsi.com/feed/" /><link rel="alternate" type="text/calendar" title="Fletcher - Global Competitive Insights » iCal Feed" href="https://fletchercsi.com/events/?ical=1" /><link rel='stylesheet' id='wp-block-library-css' href='https://fletchercsi.com/wp-includes/css/dist/block-library/style.min.css?ver=6.7.1' type='text/css' media='all' /><style id='wp-block-library-theme-inline-css' type='text/css'>.wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em}</style><style id='classic-theme-styles-inline-css' type='text/css'>/*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}</style><style id='global-styles-inline-css' type='text/css'>:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #404040;--wp--preset--color--gray: #eeeeee;--wp--preset--color--light-gray: #f9f9f9;--wp--preset--color--yellow: #e5ae4a;--wp--preset--color--blue: #1b8be0;--wp--preset--color--tahiti-gold: #e4741f;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 14px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 26px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-size--extra-small: 13px;--wp--preset--font-size--normal: 16px;--wp--preset--font-size--huge: 32px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}</style><link rel='stylesheet' id='contact-form-7-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3fd2afa98866679439097f4ab102fe0a.php?ver=6.0' type='text/css' media='all' /><link rel='stylesheet' id='more-google-fonts-css' href='https://fonts.googleapis.com/css?family=Oswald%3Awght%40400%3B500%3B600&display=swap&ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='animate-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_e8f760ef9145795c4352cac3a8936207.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='bootstrap-style-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/bootstrap.min.css?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='fontawesome-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3a84551df4f26e66de3e3711c1b743ca.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_5fc1ccc818bf7988e64028f8aa853ecf.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-laptop-average-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_570302ffd8756266629f18e91c0a4f1e.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-mobile-large-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_7b1590f97369e800967ff8bcf9bccf6f.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9b4dbfbf6cc716f6b5ec687519ab48f1.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='child-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9105caf58d7f8757337dad89cfdda326.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-fonts-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_1ef829497e33b0231d889b95978a972f.php' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-block-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_8ae0ffb70e81dcc97200fed987c0c347.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='genericons-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_13a6500ddf36c6dd581877aefc78d34d.php?ver=3.4.1' type='text/css' media='all' /><link rel='stylesheet' id='jquery-sidr-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive/css/jquery.sidr.light.min.css?ver=2.1.0' type='text/css' media='all' /><link rel='stylesheet' id='font-awesome-official-css' href='https://use.fontawesome.com/releases/v6.2.0/css/all.css' type='text/css' media='all' integrity="sha384-SOnAn/m2fVJCwnbEYgD4xzrPtvsXdElhOVvR8ND1YjB5nhGNwwf7nBQlhfAwHAZC" crossorigin="anonymous" /><link rel='stylesheet' id='font-awesome-official-v4shim-css' href='https://use.fontawesome.com/releases/v6.2.0/css/v4-shims.css' type='text/css' media='all' integrity="sha384-MAgG0MNwzSXBbmOw4KK9yjMrRaUNSCk3WoZPkzVC1rmhXzerY4gqk/BLNYtdOFCO" crossorigin="anonymous" /> <!--[if lt IE 9]> <script type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/html5.min.js?ver=3.7.3" id="catchresponsive-html5-js"></script> <![endif]--> <script defer type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/jquery.sidr.min.js?ver=2.2.1.1" id="jquery-sidr-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/catchresponsive-custom-scripts.min.js" id="catchresponsive-custom-scripts-js"></script> <script defer type="text/javascript" src="https://www.googletagmanager.com/gtag/js?id=G-MMHB4QCLRY" id="google_gtagjs-js"></script> <script defer id="google_gtagjs-js-after" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTtmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9Cmd0YWcoInNldCIsImxpbmtlciIseyJkb21haW5zIjpbImZsZXRjaGVyY3NpLmNvbSJdfSk7Cmd0YWcoImpzIiwgbmV3IERhdGUoKSk7Cmd0YWcoInNldCIsICJkZXZlbG9wZXJfaWQuZFpUTmlNVCIsIHRydWUpOwpndGFnKCJjb25maWciLCAiRy1NTUhCNFFDTFJZIik7Ci8qIF1dPiAqLwo="></script> <link rel="https://api.w.org/" href="https://fletchercsi.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://fletchercsi.com/wp-json/wp/v2/pages/8" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://fletchercsi.com/xmlrpc.php?rsd" /><meta name="generator" content="WordPress 6.7.1" /><link rel='shortlink' href='https://fletchercsi.com/' /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2F&format=xml" /><meta name="generator" content="Site Kit by Google 1.140.0" /><meta name="tec-api-version" content="v1"><meta name="tec-api-origin" content="https://fletchercsi.com"><link rel="alternate" href="https://fletchercsi.com/wp-json/tribe/events/v1/" /><style type="text/css"></style> <script defer src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwoKCQkJKCBmdW5jdGlvbiggdywgZCwgcywgbCwgaSApIHsKCQkJCXdbbF0gPSB3W2xdIHx8IFtdOwoJCQkJd1tsXS5wdXNoKCB7J2d0bS5zdGFydCc6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBldmVudDogJ2d0bS5qcyd9ICk7CgkJCQl2YXIgZiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHMgKVswXSwKCQkJCQlqID0gZC5jcmVhdGVFbGVtZW50KCBzICksIGRsID0gbCAhPSAnZGF0YUxheWVyJyA/ICcmbD0nICsgbCA6ICcnOwoJCQkJai5hc3luYyA9IHRydWU7CgkJCQlqLnNyYyA9ICdodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndG0uanM/aWQ9JyArIGkgKyBkbDsKCQkJCWYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGosIGYgKTsKCQkJfSApKCB3aW5kb3csIGRvY3VtZW50LCAnc2NyaXB0JywgJ2RhdGFMYXllcicsICdHVE0tVzlHRFJUNicgKTsKCQkJCi8qIF1dPiAqLwo="></script> <link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon-40x40.png" sizes="32x32" /><link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /><meta name="msapplication-TileImage" content="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /> <style type="text/css" media="screen">.site-title a, .site-description { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px); }</style></head><body class="home page-template page-template-php page-template-home-page page-template-phphome-page-php page page-id-8 wp-embed-responsive tribe-no-js slug-home new-header no-sidebar content-width excerpt-image-left mobile-menu-two"> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GDRT6" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <script type="text/javascript">/*! * modernizr v3.6.0 * Build https://modernizr.com/download?-mq-dontmin * * Copyright (c) * Faruk Ates * Paul Irish * Alex Sexton * Ryan Seddon * Patrick Kettner * Stu Cox * Richard Herrera * MIT License */ /* * Modernizr tests which native CSS3 and HTML5 features are available in the * current UA and makes the results available to you in two ways: as properties on * a global `Modernizr` object, and as classes on the `<html>` element. This * information allows you to progressively enhance your pages with a granular level * of control over the experience. */ ; (function(window, document, undefined) { var tests = []; /** * * ModernizrProto is the constructor for Modernizr * * @class * @access public */ var ModernizrProto = { // The current version, dummy _version: '3.6.0', // Any settings that don't work as separate modules // can go in here as configuration. _config: { 'classPrefix': '', 'enableClasses': true, 'enableJSClass': true, 'usePrefixes': true }, // Queue of tests _q: [], // Stub these for people who are listening on: function(test, cb) { // I don't really think people should do this, but we can // safe guard it a bit. // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests. // This is in case people listen to synchronous tests. I would leave it out, // but the code to *disallow* sync tests in the real version of this // function is actually larger than this. var self = this; setTimeout(function() { cb(self[test]); }, 0); }, addTest: function(name, fn, options) { tests.push({ name: name, fn: fn, options: options }); }, addAsyncTest: function(fn) { tests.push({ name: null, fn: fn }); } }; // Fake some of Object.create so we can force non test results to be non "own" properties. var Modernizr = function() {}; Modernizr.prototype = ModernizrProto; // Leak modernizr globally when you `require` it rather than force it here. // Overwrite name so constructor name is nicer :D Modernizr = new Modernizr(); var classes = []; /** * is returns a boolean if the typeof an obj is exactly type. * * @access private * @function is * @param {*} obj - A thing we want to check the type of * @param {string} type - A string to compare the typeof against * @returns {boolean} */ function is(obj, type) { return typeof obj === type; }; /** * Run through all tests and detect their support in the current UA. * * @access private */ function testRunner() { var featureNames; var feature; var aliasIdx; var result; var nameIdx; var featureName; var featureNameSplit; for (var featureIdx in tests) { if (tests.hasOwnProperty(featureIdx)) { featureNames = []; feature = tests[featureIdx]; // run the test, throw the return value into the Modernizr, // then based on that boolean, define an appropriate className // and push it into an array of classes we'll join later. // // If there is no name, it's an 'async' test that is run, // but not directly added to the object. That should // be done with a post-run addTest call. if (feature.name) { featureNames.push(feature.name.toLowerCase()); if (feature.options && feature.options.aliases && feature.options.aliases.length) { // Add all the aliases into the names list for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) { featureNames.push(feature.options.aliases[aliasIdx].toLowerCase()); } } } // Run the test, or use the raw value if it's not a function result = is(feature.fn, 'function') ? feature.fn() : feature.fn; // Set each of the names on the Modernizr object for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) { featureName = featureNames[nameIdx]; // Support dot properties as sub tests. We don't do checking to make sure // that the implied parent tests have been added. You must call them in // order (either in the test, or make the parent test a dependency). // // Cap it to TWO to make the logic simple and because who needs that kind of sub testing // hashtag famous last words featureNameSplit = featureName.split('.'); if (featureNameSplit.length === 1) { Modernizr[featureNameSplit[0]] = result; } else { // cast to a Boolean, if not one already if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) { Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]); } Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result; } classes.push((result ? '' : 'no-') + featureNameSplit.join('-')); } } } }; /** * docElement is a convenience wrapper to grab the root element of the document * * @access private * @returns {HTMLElement|SVGElement} The root element of the document */ var docElement = document.documentElement; /** * A convenience helper to check if the document we are running in is an SVG document * * @access private * @returns {boolean} */ var isSVG = docElement.nodeName.toLowerCase() === 'svg'; /** * createElement is a convenience wrapper around document.createElement. Since we * use createElement all over the place, this allows for (slightly) smaller code * as well as abstracting away issues with creating elements in contexts other than * HTML documents (e.g. SVG documents). * * @access private * @function createElement * @returns {HTMLElement|SVGElement} An HTML or SVG element */ function createElement() { if (typeof document.createElement !== 'function') { // This is the case in IE7, where the type of createElement is "object". // For this reason, we cannot call apply() as Object is not a Function. return document.createElement(arguments[0]); } else if (isSVG) { return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]); } else { return document.createElement.apply(document, arguments); } } ; /** * getBody returns the body of a document, or an element that can stand in for * the body if a real body does not exist * * @access private * @function getBody * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an * artificially created element that stands in for the body */ function getBody() { // After page load injecting a fake body doesn't work so check if body exists var body = document.body; if (!body) { // Can't use the real body create a fake one. body = createElement(isSVG ? 'svg' : 'body'); body.fake = true; } return body; } ; /** * injectElementWithStyles injects an element with style element and some CSS rules * * @access private * @function injectElementWithStyles * @param {string} rule - String representing a css rule * @param {function} callback - A function that is used to test the injected element * @param {number} [nodes] - An integer representing the number of additional nodes you want injected * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes * @returns {boolean} */ function injectElementWithStyles(rule, callback, nodes, testnames) { var mod = 'modernizr'; var style; var ret; var node; var docOverflow; var div = createElement('div'); var body = getBody(); if (parseInt(nodes, 10)) { // In order not to give false positives we create a node for each test // This also allows the method to scale for unspecified uses while (nodes--) { node = createElement('div'); node.id = testnames ? testnames[nodes] : mod + (nodes + 1); div.appendChild(node); } } style = createElement('style'); style.type = 'text/css'; style.id = 's' + mod; // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 (!body.fake ? div : body).appendChild(style); body.appendChild(div); if (style.styleSheet) { style.styleSheet.cssText = rule; } else { style.appendChild(document.createTextNode(rule)); } div.id = mod; if (body.fake) { //avoid crashing IE8, if background image is used body.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible body.style.overflow = 'hidden'; docOverflow = docElement.style.overflow; docElement.style.overflow = 'hidden'; docElement.appendChild(body); } ret = callback(div, rule); // If this is done after page load we don't want to remove the body so check if body exists if (body.fake) { body.parentNode.removeChild(body); docElement.style.overflow = docOverflow; // Trigger layout so kinetic scrolling isn't disabled in iOS6+ // eslint-disable-next-line docElement.offsetHeight; } else { div.parentNode.removeChild(div); } return !!ret; } ; /** * Modernizr.mq tests a given media query, live against the current state of the window * adapted from matchMedia polyfill by Scott Jehl and Paul Irish * gist.github.com/786768 * * @memberof Modernizr * @name Modernizr.mq * @optionName Modernizr.mq() * @optionProp mq * @access public * @function mq * @param {string} mq - String of the media query we want to test * @returns {boolean} * @example * Modernizr.mq allows for you to programmatically check if the current browser * window state matches a media query. * * ```js * var query = Modernizr.mq('(min-width: 900px)'); * * if (query) { * // the browser window is larger than 900px * } * ``` * * Only valid media queries are supported, therefore you must always include values * with your media query * * ```js * // good * Modernizr.mq('(min-width: 900px)'); * * // bad * Modernizr.mq('min-width'); * ``` * * If you would just like to test that media queries are supported in general, use * * ```js * Modernizr.mq('only all'); // true if MQ are supported, false if not * ``` * * * Note that if the browser does not support media queries (e.g. old IE) mq will * always return false. */ var mq = (function() { var matchMedia = window.matchMedia || window.msMatchMedia; if (matchMedia) { return function(mq) { var mql = matchMedia(mq); return mql && mql.matches || false; }; } return function(mq) { var bool = false; injectElementWithStyles('@media ' + mq + ' { #modernizr { position: absolute; } }', function(node) { bool = (window.getComputedStyle ? window.getComputedStyle(node, null) : node.currentStyle).position == 'absolute'; }); return bool; }; })(); ModernizrProto.mq = mq; // Run each test testRunner(); delete ModernizrProto.addTest; delete ModernizrProto.addAsyncTest; // Run the things that are supposed to run after the tests for (var i = 0; i < Modernizr._q.length; i++) { Modernizr._q[i](); } // Leak Modernizr namespace window.Modernizr = Modernizr; ; })(window, document);</script> <div id="page" class="hfeed site"><header id="masthead" role="banner"><div class="wrapper"><div id="mobile-header-left-menu" class="mobile-menu-anchor primary-menu"> <a href="#mobile-header-left-nav" id="header-left-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><div id="site-branding"><div id="site-header"><p class="site-title"><a href="https://fletchercsi.com/" rel="home">Fletcher - Global Competitive Insights</a></p><p class="site-description">Global Competitive Insights</p></div></div><div id="mobile-header-right-menu" class="mobile-menu-anchor secondary-menu"> <a href="#mobile-header-right-menu" id="secondary-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><aside class="sidebar sidebar-header-right widget-area"></aside></div></header><nav class="site-navigation nav-secondary" role="navigation"><div class="wrapper"><h2 class="screen-reader-text">Secondary Menu</h2><div class="screen-reader-text skip-link"><a href="#content" title="Skip to content">Skip to content</a></div><div class="menu-main-menu-container"><ul id="menu-main-menu" class="menu catchresponsive-nav-menu"><li id="menu-item-25" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item page-item-8 current_page_item menu-item-25"><a href="https://fletchercsi.com/" aria-current="page">Home</a></li><li id="menu-item-24" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-24"><a href="https://fletchercsi.com/about/">About</a><ul class="sub-menu"><li id="menu-item-1958" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1958"><a href="https://fletchercsi.com/about/#company">Company</a></li><li id="menu-item-1933" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1933"><a href="https://fletchercsi.com/about/#careers">Careers</a></li><li id="menu-item-1934" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1934"><a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></li></ul></li><li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-23"><a href="https://fletchercsi.com/industries/">Industries</a><ul class="sub-menu"><li id="menu-item-4191" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4191"><a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></li><li id="menu-item-4210" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4210"><a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></li><li id="menu-item-3999" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3999"><a href="https://fletchercsi.com/industries/technology/">Technology</a></li><li id="menu-item-4200" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4200"><a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></li><li id="menu-item-4179" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4179"><a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></li></ul></li><li id="menu-item-6362" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6362"><a href="https://fletchercsi.com/services/">Services</a><ul class="sub-menu"><li id="menu-item-6363" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6363"><a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></li><li id="menu-item-6368" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6368"><a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></li><li id="menu-item-6367" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6367"><a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></li><li id="menu-item-6366" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6366"><a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></li><li id="menu-item-6365" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6365"><a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></li></ul></li><li id="menu-item-6742" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6742"><a href="https://fletchercsi.com/resources/">Resources</a><ul class="sub-menu"><li id="menu-item-6783" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6783"><a href="https://fletchercsi.com/resources/blogs/">Blogs</a></li><li id="menu-item-6747" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6747"><a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></li><li id="menu-item-6746" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6746"><a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></li><li id="menu-item-6745" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6745"><a href="https://fletchercsi.com/resources/presentations/">Presentations</a></li><li id="menu-item-6744" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6744"><a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></li></ul></li><li id="menu-item-4865" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4865"><a href="https://fletchercsi.com/contact/">Contact Us</a></li></ul></div></div></nav><div id="content" class="site-content"><div class="wrapper"><main id="main full-width" class="site-main home" role="main"><article id="post-8" class="post-8 page type-page status-publish has-post-thumbnail hentry"><div class="entry-container"><div class="entry-content"><div id="" class="page-container container-fluid"><div id="hero-container" class="row"><div class="col position-relative h-100 background-image-zoom-on-hover-parent"><div role="img" aria-label="" class="home-header-background-image row background-image-zoom-on-hover-child"></div><div id="home-image-filter" class="row position-absolute-stretch-to-fill background-fcsi-gradient-1-blue pass-through-pointer-events"></div><div class="row h-100 pass-through-pointer-events justify-content-center" id="hero-copy-container"><div class="col all-width-half-outer-horizontal-bounds hero-container-left-col"></div><div id="hero-copy" class="col pb-40 all-width-half-outer-horizontal-bounds d-flex flex-column justify-content-center"><div class="row mb-40" id="cta-language"><div class="col color-white"> <span id="dynamic-hero-image-copy" class="no-hyphens"><h3>We deliver insights</h3><h3>you can count on.</h3><div class="su-spacer" style="height:40px"></div> Business leaders around the globe rely on our competitive insights to drive decisions that matter. You deserve more than data. We roll up our sleeves to acquire reliable information and make the connections needed so it is actionable. </span></div></div><div class="row" id=""><div class="col cta-button"> <a class="button border-fcsi-secondary-light-green m-unset catch-pointer-events" href="../contact/">Get in Touch</a></div></div></div></div></div></div><div class="row border-top-green block-seperator"></div><div id="logos-container" class="row align-items-center justify-content-center background-color-off-white"><div class="col all-width-outer-horizontal-bounds justify-content-center align-items-center h-100"><div id="stats-carousel" class="splide h-100" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100 align-items-center"><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">Fortune 500</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>187</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> use fletcher</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">Research hours</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>1.5+</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> million</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">We work in</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>165</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> countries</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">Operating for over</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>35</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> years</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">More than</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>87%</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> renewal rate</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">Win/Loss interviews</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>10k+</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> conducted</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">We speak</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>23</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> languages</div></div><div class="row dash"></div></div></div></div></li><li class="splide__slide h-100 horizontal-borders-transparent"><div class="container h-100 px-10 stat-container d-flex flex-column justify-content-center align-items-center"><div class="row font-weight-bold title"><div class="col h-100 d-flex justify-content-center pt-10"><h4 class="color-fcsi-primary-blue text-center">Over</h4></div></div><div class="row information no-hyphens all-height-fit"><div class="col all-height-fit"><div class="row stat"><div class="col d-flex justify-content-center"><h2>700</h2></div></div><div class="row"><div class="col qualifier font-weight-bold color-gray d-flex justify-content-center"> clients</div></div><div class="row dash"></div></div></div></div></li></ul></div></div></div></div><div class="row border-top-green block-seperator"></div><div id="middle-container" class="row"><div class="col h-100"><li class="splide__slide h-100 w-100 horizontal-borders-transparent template"><div class="container li-container h-100 w-100"><div class="row h-100 w-100 content"><div class="col position-relative h-100 w-100 background-image-zoom-on-hover-parent"><div role="img" aria-label="" class="li-background-image row background-image-child"></div><div class="row middle-container-row py-80 justify-content-center h-100"><div class="col all-width-outer-horizontal-bounds"><div class="row h-100 all-width-half-outer-horizontal-bounds justify-content-center circle-parent-row"><div id="circle-parent-container" class="col d-flex align-items-center h-100"><div id="circle-parent" class="row"><div id="circle-container" class="col"><div id="circle-child" class="row h-100 w-100 justify-content-center align-items-center"><div class="col"><div class="row title justify-content-center"><div class="col all-width-fit-content"> <u style="text-underline-offset: 14px;"><h6>INSIGHTS THAT DRIVE</h6> </u></div></div><div class="row dynamic-header justify-content-center pt-10 heading"><div class="col all-width-fit-content"><h3><span class="heading color-fcsi-primary-blue"></span></h3></div></div><div class="row body-copy pt-15 px-40 justify-content-center"><div class="col all-width-fit-content"><span class="text-center px-10 d-block no-hyphens">Our in-house teams have deep professional and academic expertise in their specific fields, enabling us to deliver the highest accuracy of data and insights on any given subject matter.</span></div></div><div class="row button-row mt-10 pt-15 justify-content-center"><div class="col all-width-fit-content"><a class="button dark border-fcsi-secondary-light-green m-unset catch-pointer-events" href="./industries/">View Industries</a></div></div><div class="row pagination-container"><div class="col all-width-fit-content"></div></div></div></div></div></div></div></div></div></div></div></div></div></li><div id="middle-container-carousel" class="splide h-100 w-100 position-relative" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div><div id="splide-pagination-container" class="position-absolute"><div class="container-fluid py-80 h-100 w-100"><div class="row m-auto h-100 all-width-outer-horizontal-bounds"><div class="col"><div class="row h-100 justify-content-center all-width-half-outer-horizontal-bounds circle-parent-row"><div id="circle-parent-container" class="col d-flex align-items-center h-100"><div class="row position-relative d-block w-100 pt-100pct"><div class="col position-absolute inset-0"><ul class="splide__pagination"></ul></div></div></div></div></div></div></div></div></div></div></div><div class="row border-top-green block-seperator"></div><div id="bottom-container" class="row justify-content-center"><div class="col"><div class="row bottom-container-row"><div class="col"><div class="row justify-content-end"><div class="col content-col all-width-half-outer-horizontal-bounds py-80 center-aligned-right-padding"><div class="row"><div class="col no-hyphens"><h5><span style="text-decoration: underline; text-underline-offset: 7px;"><strong>WE ARE</strong></span></h5><h4><span style="color: #41ad49;">Human Powered.</span></h4><h4><span style="color: #41ad49;">Technology Enabled.</span></h4><div class="su-spacer" style="height:10px"></div> Fletcher is a collection of industry leaders, thinkers, and driven researchers always striving to find better ways to deliver the most actionable insight. With thorough primary research, machine learning models, seamless virtual workshops, and more, we deliver insight that makes a difference. In an increasingly competitive world, we strive to be a true partner in helping you achieve your goals.</div></div><div class="row pt-40 button-row"><div class="col"> <a class="button dark m-unset catch-pointer-events color-black" href="./services/">View Services</a></div></div></div></div></div><div class="col right-col position-relative background-image-zoom-on-hover-parent"><div id="bottom-background-image" aria-label="" class="row background-image-zoom-on-hover-child" style="background-image: url('https://fletchercsi.com/wp-content/uploads/2022/09/Green-Buildings.png');"></div><div class="row py-80 h-100 align-items-center pass-through-pointer-events" id="hero-copy-container"><div class="col copy-col all-width-half-outer-horizontal-bounds center-aligned-left-padding color-white no-hyphens"><h3>"Fletcher is an important partner for us. The insights they deliver are based on solid research and directly help us improve our strategy."</h3><div class="su-spacer" style="height:40px"></div><p style="text-align: right;"><strong>SAAS PROVIDER</strong></p></div></div></div></div></div></div><div class="row border-top-green block-seperator"></div><div id="logos-container" class="row py-80 height-page-block align-items-center justify-content-center background-color-off-white"><div class="col all-width-half-outer-horizontal-bounds center-aligned-right-padding no-hyphens"><h3>Strategic Partners</h3><div class="su-spacer" style="height:20px"></div> We are excited to highlight our partners: <strong>Contify</strong>, <strong>Klue</strong>, and <strong>Crayon</strong>. Each of them holds an esteemed place in the competitive intelligence industry, and our collaboration enriches the services we offer. This synergy augments our capabilities and assures you of a comprehensive and effective competitive intelligence solution. Together, we strive to keep your business ahead of the curve.</div><div class="col h-100 all-width-half-outer-horizontal-bounds center-aligned-left-padding partner-logos"><div class="row h-33 pt-10 justify-content-center"> <a href="https://www.contify.com/about-us/" target=”_blank” class="h-100 w-100 d-flex justify-content-center"> <img src="https://fletchercsi.com/wp-content/uploads/2023/06/contify_logo.png" alt="Contify Partner Logo" class="h-100"> </a></div><div class="row py-40 h-33 justify-content-center"> <a href="https://klue.com/about" target=”_blank” class="h-100 w-100 d-flex justify-content-center"> <img src="https://fletchercsi.com/wp-content/uploads/2023/06/Klue-Purple-Logo.png" alt="Klue Partner Logo" class="h-100"> </a></div><div class="row pt-15 h-33 justify-content-center"> <a href="https://www.crayon.co/partners/fletcher" target=”_blank” class="h-100 w-100 d-flex justify-content-center"> <img src="https://fletchercsi.com/wp-content/uploads/2023/06/crayon_logo.png" alt="Crayon Partner Logo" class="h-100"> </a></div></div></div><div class="row border-top-green block-seperator"></div></div> <script defer src="data:text/javascript;base64,CgkJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCQkJCS8vIAoKCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkJCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJCQkJCQkvLyBWYXJpYWJsZXM6CgkJCQkJCQkvLyBDb250cm9sbGVyOgoKCgkJCQkJCQkvLyBET006CgkJCQkJCQkkaGVyb19jb250YWluZXJfYmFja2dyb3VuZF9pbWFnZV9kaXYgPSAkKGRvY3VtZW50KS5maW5kKCcuaG9tZS1oZWFkZXItYmFja2dyb3VuZC1pbWFnZScpOwoKCQkJCQkJCSRtaWRkbGVfY29udGFpbmVyX2Nhcm91c2VsID0gJChkb2N1bWVudCkuZmluZCgiI21pZGRsZS1jb250YWluZXItY2Fyb3VzZWwiKTsKCQkJCQkJCSRtaWRkbGVfY29udGFpbmVyX2xpX3RlbXBsYXRlID0gJG1pZGRsZV9jb250YWluZXJfY2Fyb3VzZWwuc2libGluZ3MoImxpLnRlbXBsYXRlIik7CgoJCQkJCQkJLy8gQ3VzdG9tOgoJCQkJCQkJbGV0IGhlcm9fY29udGFpbmVyX2JhY2tncm91bmRfaW1hZ2VfYXJyYXkgPSBbewoJCQkJCQkJCQknZGVza3RvcCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOC9GbGV0Y2hlcldlYnNpdGVIb21lSW1hZ2UzLTE2MDAuanBnIiwKCQkJCQkJCQkJJ21vYmlsZSc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9Ib21lTW9iaWxlVG9wSW1hZ2UzLTc1MC5qcGciCgoJCQkJCQkJCX0sCgkJCQkJCQkJewoJCQkJCQkJCQknZGVza3RvcCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOC9GbGV0Y2hlcldlYnNpdGVIb21lSW1hZ2UyLTE2MDAuanBnIiwKCQkJCQkJCQkJJ21vYmlsZSc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9Ib21lTW9iaWxlVG9wSW1hZ2UyLTc1MC5qcGciCgoJCQkJCQkJCX0sCgkJCQkJCQkJewoJCQkJCQkJCQknZGVza3RvcCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOC9GbGV0Y2hlcldlYnNpdGVIb21lSW1hZ2UxLTE2MDAuanBnIiwKCQkJCQkJCQkJJ21vYmlsZSc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9Ib21lTW9iaWxlVG9wSW1hZ2UxLTc1MC5qcGciCgoJCQkJCQkJCX0sCgkJCQkJCQldOwoKCQkJCQkJCWxldCBtaWRkbGVfY29udGFpbmVyX2Nhcm91c2VsX2FycmF5ID0gW3sKCQkJCQkJCQkJJ2hlYWRpbmcnOiAiYmlnZ2VyIHRvbW9ycm93cy4iLAoJCQkJCQkJCQknaW1nX3VybCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9iaWdnZXItdG9tb3Jyb3dzLTE5MjAuanBnIgoJCQkJCQkJCX0sCgkJCQkJCQkJewoJCQkJCQkJCQknaGVhZGluZyc6ICJiZXR0ZXIgb3V0Y29tZXMuIiwKCQkJCQkJCQkJJ2ltZ191cmwnOiAiaHR0cHM6Ly9mbGV0Y2hlcmNzaS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDkvYmV0dGVyLW91dGNvbWVzLTE5MjAuanBnIgoJCQkJCQkJCX0sCgkJCQkJCQkJewoJCQkJCQkJCQknaGVhZGluZyc6ICJpbnRlbGxpZ2VudCBzb2x1dGlvbnMuIiwKCQkJCQkJCQkJJ2ltZ191cmwnOiAiaHR0cHM6Ly9mbGV0Y2hlcmNzaS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDkvaW50ZWxsaWdlbnQtc29sdXRpb25zLTE5MjAuanBnIgoJCQkJCQkJCX0sCgkJCQkJCQkJewoJCQkJCQkJCQknaGVhZGluZyc6ICJiaWdnZXIgbWFyZ2lucy4iLAoJCQkJCQkJCQknaW1nX3VybCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9iaWdnZXItbWFyZ2lucy0xOTIwLmpwZyIKCQkJCQkJCQl9LAoJCQkJCQkJCXsKCQkJCQkJCQkJJ2hlYWRpbmcnOiAiaW5jcmVhc2VkIGdyb3d0aC4iLAoJCQkJCQkJCQknaW1nX3VybCc6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9pbmNyZWFzZWQtZ3Jvd3RoLTE5MjAuanBnIgoJCQkJCQkJCX0sCgkJCQkJCQldOwoKCQkJCQkJCXdpbmRvdy5ob21lX3BhZ2Vfc3BsaWRlX21vdmluZyA9IGZhbHNlOwoKCQkJCQkJCS8vIFN0YXRlczoKCQkJCQkJCS8vIFJ1biBNZWRpYSBRdWVyeSB0byBkZXRlcm1pbmUgZGV2aWNlX3R5cGUgdmFsdWU6CgkJCQkJCQl2YXIgZGV2aWNlX3R5cGUgPSAiZGVza3RvcCIKCQkJCQkJCWlmIChNb2Rlcm5penIubXEoInNjcmVlbiBhbmQgKG1heC13aWR0aDogNDQ0cHgpIikpIHsKCQkJCQkJCQlkZXZpY2VfdHlwZSA9ICJtb2JpbGUiOwoJCQkJCQkJCS8vIHN1Yl9zZXJ2aWNlc19ob3Jpem9udGFsX21hcmdpbiA9ICgyNCArIDI0KTsKCQkJCQkJCX0KCQkJCQkJCWNvbnNvbGUubG9nKCdkZXZpY2VfdHlwZScsIGRldmljZV90eXBlKTsKCgkJCQkJCQkvLyBIeWRyYXRlIGhlcm8gY29udGFpbmVyIGJhY2tncm91bmQgaW1hZ2U6CgkJCQkJCQkkaGVyb19jb250YWluZXJfYmFja2dyb3VuZF9pbWFnZV9kaXYuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJywgJ3VybCgiJyArIGhlcm9fY29udGFpbmVyX2JhY2tncm91bmRfaW1hZ2VfYXJyYXlbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaGVyb19jb250YWluZXJfYmFja2dyb3VuZF9pbWFnZV9hcnJheS5sZW5ndGgpXVtkZXZpY2VfdHlwZV0gKyAnIiknKTsKCgoJCQkJCQkJLy8gU2V0dXAgU3BsaWRlIENhcm91c2VsOgoJCQkJCQkJLy8gQ3JlYXRlIERPTSBjYXJvdXNlbCBpdGVtIGVsZW1lbnRzIGZvciBTcGxpZGUKCQkJCQkJCSQuZWFjaCgKCQkJCQkJCQltaWRkbGVfY29udGFpbmVyX2Nhcm91c2VsX2FycmF5LAoJCQkJCQkJCWZ1bmN0aW9uKGNhcm91c2VsX2luZGV4LCBjYXJvdXNlbF9pbmZvX29iamVjdCkgewoJCQkJCQkJCQl2YXIgJG5ld19jYXJvdXNlbF9pdGVtID0gJG1pZGRsZV9jb250YWluZXJfbGlfdGVtcGxhdGUuY2xvbmUoKQoJCQkJCQkJCQkJLnJlbW92ZUNsYXNzKCJ0ZW1wbGF0ZSIpOwoKCQkJCQkJCQkJJG5ld19jYXJvdXNlbF9pdGVtLmZpbmQoIi5yb3cuaGVhZGluZyBzcGFuLmhlYWRpbmciKQoJCQkJCQkJCQkJLmh0bWwoY2Fyb3VzZWxfaW5mb19vYmplY3RbImhlYWRpbmciXSk7CgkJCQkJCQkJCSRuZXdfY2Fyb3VzZWxfaXRlbS5maW5kKCcubGktYmFja2dyb3VuZC1pbWFnZScpCgkJCQkJCQkJCQkuYXR0cigic3R5bGUiLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsgY2Fyb3VzZWxfaW5mb19vYmplY3RbJ2ltZ191cmwnXSArICInKTsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgbWluLWhlaWdodDogNzIwcHg7Iik7CgoJCQkJCQkJCQkkbWlkZGxlX2NvbnRhaW5lcl9jYXJvdXNlbAoJCQkJCQkJCQkJLmZpbmQoInVsLnNwbGlkZV9fbGlzdCIpCgkJCQkJCQkJCQkuYXBwZW5kKCRuZXdfY2Fyb3VzZWxfaXRlbSk7CgkJCQkJCQkJfQoJCQkJCQkJKTsKCgkJCQkJCQkvLyBJbml0aWFsaXplIGFuZCBoeWRyYXRlIFNwbGlkZSB2YXJzIHcvIGRlZmF1bHQgdmFsdWVzOgoJCQkJCQkJLy8gdmFyIG1pbl9zbGlkZV9waXhlbF93aWR0aCA9IDI1NjsKCQkJCQkJCXZhciBzcGxpZGVfc3BlZWQgPSAwOwoJCQkJCQkJdmFyIHNwbGlkZV9kcmFnID0gZmFsc2U7CgkJCQkJCQlpZiAoZGV2aWNlX3R5cGUgPT0gIm1vYmlsZSIpIHsKCQkJCQkJCQlzcGxpZGVfZHJhZyA9IHRydWU7CgkJCQkJCQkJc3BsaWRlX3NwZWVkID0gNDAwOwoJCQkJCQkJfQoKCQkJCQkJCS8vIHZhciBzdWJfc2VydmljZXNfaG9yaXpvbnRhbF9tYXJnaW4gPSAoMzIgKyAzMik7CgoJCQkJCQkJLy8gc3BsaWRlX3Blcl9wYWdlID0gTWF0aC5mbG9vcigoY29yZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9jb2xfcGFyZW50X3Jvd193aWR0aCAtIGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sX3dpZHRoIC0gc3ViX3NlcnZpY2VzX2hvcml6b250YWxfbWFyZ2luKSAvIG1pbl9zbGlkZV9waXhlbF93aWR0aCk7CgoJCQkJCQkJLy8gaWYgKHNwbGlkZV9wZXJfcGFnZSA8PSAwKSB7CgkJCQkJCQkvLyAJc3BsaWRlX3Blcl9wYWdlID0gMTsKCQkJCQkJCS8vIH0KCgkJCQkJCQkvLyBpZiAoc3BsaWRlX3Blcl9wYWdlID4gc3ViX3NlcnZpY2VfY291bnQpIHsKCQkJCQkJCS8vIAlzcGxpZGVfcGVyX3BhZ2UgPSBzdWJfc2VydmljZV9jb3VudDsKCQkJCQkJCS8vIH0KCgkJCQkJCQkvLyBpZiAoc3ViX3NlcnZpY2VfY291bnQgPT0gMSkgewoJCQkJCQkJLy8gCXNwbGlkZV9hdXRvcGxheSA9IGZhbHNlOwoJCQkJCQkJLy8gCXNwbGlkZV9kcmFnID0gZmFsc2U7CgkJCQkJCQkvLyB9CgoJCQkJCQkJLy8gSW5pdGlhbGl6ZSBuZXcgU3BsaWRlIGluc3RhbmNlKHMpOgoJCQkJCQkJd2luZG93Lm1pZGRsZV9jb250YWluZXJfY2Fyb3VzZWxfc3BsaWRlID0gbmV3IFNwbGlkZSgKCQkJCQkJCQkJIiNtaWRkbGUtY29udGFpbmVyLWNhcm91c2VsLnNwbGlkZSIsIHsKCQkJCQkJCQkJCXR5cGU6ICJsb29wIiwKCQkJCQkJCQkJCXBlclBhZ2U6IDEsCgkJCQkJCQkJCQlwZXJNb3ZlOiAxLAoJCQkJCQkJCQkJc3BlZWQ6IHNwbGlkZV9zcGVlZCwKCQkJCQkJCQkJCXBhZ2luYXRpb246IHRydWUsCgkJCQkJCQkJCQlhdXRvcGxheTogdHJ1ZSwKCQkJCQkJCQkJCWludGVydmFsOiA0MDAwLAoJCQkJCQkJCQkJcGF1c2VPbkhvdmVyOiB0cnVlLAoJCQkJCQkJCQkJcGF1c2VPbkZvY3VzOiB0cnVlLAoJCQkJCQkJCQkJYXJyb3dzOiBmYWxzZSwKCQkJCQkJCQkJCWRyYWc6IHNwbGlkZV9kcmFnCgkJCQkJCQkJCX0KCQkJCQkJCQkpCgkJCQkJCQkJLm9uKCdwYWdpbmF0aW9uOm1vdW50ZWQnLCBmdW5jdGlvbihkYXRhKSB7CgkJCQkJCQkJCWRhdGEubGlzdC5jbGFzc0xpc3QuYWRkKCdzcGxpZGVfX3BhZ2luYXRpb24tLWN1c3RvbScpOwoJCQkJCQkJCX0pCgkJCQkJCQkJLm1vdW50KCkKCQkJCQkJCQkub24oJ21vdmUnLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJd2luZG93LmhvbWVfcGFnZV9zcGxpZGVfbW92aW5nID0gdHJ1ZTsKCQkJCQkJCQl9KQoJCQkJCQkJCS5vbignbW92ZWQnLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkJd2luZG93LmhvbWVfcGFnZV9zcGxpZGVfbW92aW5nID0gZmFsc2U7CgkJCQkJCQkJfSk7CgoJCQkJCQkJLy8gSW5pdGlhbGl6ZSBuZXcgU3BsaWRlIGluc3RhbmNlOgoJCQkJCQkJLy8gLy8gUnVuIE1lZGlhIFF1ZXJ5IHRvIGNvbmZpZ3VyZSBTcGxpZGUgdmFyczoKCQkJCQkJCXNwbGlkZVBlclBhZ2UgPSA0OwoJCQkJCQkJc3BsaWRlQXJyb3dzID0gdHJ1ZTsKCQkJCQkJCWlmIChkZXZpY2VfdHlwZSA9PT0gIm1vYmlsZSIpIHsKCQkJCQkJCQlzcGxpZGVQZXJQYWdlID0gMTsKCQkJCQkJCQlzcGxpZGVBcnJvd3MgPSB0cnVlOwoJCQkJCQkJfQoKCQkJCQkJCXdpbmRvdy5zdGF0c19jYXJvdXNlbF9zcGxpZGUgPSBuZXcgU3BsaWRlKAoJCQkJCQkJCScjc3RhdHMtY2Fyb3VzZWwuc3BsaWRlJywgewoJCQkJCQkJCQl0eXBlOiAnbG9vcCcsCgkJCQkJCQkJCXBlclBhZ2U6IHNwbGlkZVBlclBhZ2UsCgkJCQkJCQkJCXBlck1vdmU6IDEsCgkJCQkJCQkJCXNwZWVkOiAxMzAwLAoJCQkJCQkJCQlwYWdpbmF0aW9uOiBmYWxzZSwKCQkJCQkJCQkJYXV0b3BsYXk6IHRydWUsCgkJCQkJCQkJCWludGVydmFsOiA0MDAwLAoJCQkJCQkJCQlwYXVzZU9uSG92ZXI6IHRydWUsCgkJCQkJCQkJCXBhdXNlT25Gb2N1czogdHJ1ZSwKCQkJCQkJCQkJYXJyb3dzOiBzcGxpZGVBcnJvd3MsCgkJCQkJCQkJCWRyYWc6IHRydWUsCgkJCQkJCQkJfQoJCQkJCQkJKS5tb3VudCgpOwoKCQkJCQkJCS8vIFBsdWdpbnM6CgkJCQkJCQkvLyAKCgoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBJTklUSUFMSVpFIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgRVZFTlRTIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJCQkJLy8gSGFuZGxlIGEgTU9VU0VPVkVSIG9uIHRoZSAkbWlkZGxlX2NvbnRhaW5lcl9jYXJvdXNlbDoKCQkJCQkJCSRtaWRkbGVfY29udGFpbmVyX2Nhcm91c2VsLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkkKGRvY3VtZW50KS5maW5kKCcubGktYmFja2dyb3VuZC1pbWFnZScpLmFkZENsYXNzKCdob3ZlcmVkJyk7CgkJCQkJCQl9KTsKCgkJCQkJCQkvLyBIYW5kbGUgYSBNT1VTRU9VVCBvbiB0aGUgJG1pZGRsZV9jb250YWluZXJfY2Fyb3VzZWw6CgkJCQkJCQkkbWlkZGxlX2NvbnRhaW5lcl9jYXJvdXNlbC5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpIHsKCQkJCQkJCQkkKGRvY3VtZW50KS5maW5kKCcubGktYmFja2dyb3VuZC1pbWFnZScpLnJlbW92ZUNsYXNzKCdob3ZlcmVkJyk7CgkJCQkJCQl9KTsKCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gRVZFTlRTIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJCQl9KTsKCQkJCQk="></script> </div><footer class="entry-footer"><p class="entry-meta"></p></footer></div></article></main> <script defer src="data:text/javascript;base64,CgkJCQkJCS8qIQ0KICAqIEJvb3RzdHJhcCB2NC4xLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pDQogICogQ29weXJpZ2h0IDIwMTEtMjAxOCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKQ0KICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpDQogICovDQohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyxyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIiwianF1ZXJ5IiwicG9wcGVyLmpzIl0sZSk6ZSh0LmJvb3RzdHJhcD17fSx0LmpRdWVyeSx0LlBvcHBlcil9KHRoaXMsZnVuY3Rpb24odCxlLGgpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIGUmJmkodC5wcm90b3R5cGUsZSksbiYmaSh0LG4pLHR9ZnVuY3Rpb24gbChyKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbz1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGU9T2JqZWN0LmtleXMobyk7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihlPWUuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sdCkuZW51bWVyYWJsZX0pKSksZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG4saTtlPXIsaT1vW249dF0sbiBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW25dPWl9KX1yZXR1cm4gcn1lPWUmJmUuaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZSxoPWgmJmguaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9oLmRlZmF1bHQ6aDt2YXIgcixuLG8sYSxjLHUsZixkLGcsXyxtLHAsdix5LEUsQyxULGIsUyxJLEEsRCx3LE4sTyxrLFAsaixILEwsUix4LFcsVSxxLEYsSyxNLFEsQixWLFkseixKLFosRywkLFgsdHQsZXQsbnQsaXQscnQsb3Qsc3QsYXQsbHQsY3QsaHQsdXQsZnQsZHQsZ3QsX3QsbXQscHQsdnQseXQsRXQsQ3QsVHQsYnQsU3QsSXQsQXQsRHQsd3QsTnQsT3Qsa3QsUHQsanQsSHQsTHQsUnQseHQsV3QsVXQscXQsRnQsS3QsTXQsUXQsQnQsVnQsWXQsenQsSnQsWnQsR3QsJHQsWHQsdGUsZWUsbmUsaWUscmUsb2Usc2UsYWUsbGUsY2UsaGUsdWUsZmUsZGUsZ2UsX2UsbWUscGUsdmUseWUsRWUsQ2UsVGUsYmUsU2UsSWUsQWUsRGUsd2UsTmUsT2Usa2UsUGUsamUsSGUsTGUsUmUseGUsV2UsVWUscWUsRmUsS2UsTWUsUWUsQmUsVmUsWWUsemUsSmUsWmUsR2UsJGUsWGUsdG4sZW4sbm4scm4sb24sc24sYW4sbG4sY24saG4sdW4sZm4sZG4sZ24sX24sbW4scG4sdm4seW4sRW4sQ24sVG4sYm4sU24sSW4sQW4sRG4sd24sTm4sT24sa24sUG4sam4sSG4sTG4sUm4seG4sV24sVW4scW4sRm49ZnVuY3Rpb24oaSl7dmFyIGU9InRyYW5zaXRpb25lbmQiO2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpcyxuPSExO3JldHVybiBpKHRoaXMpLm9uZShsLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7bj0hMH0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtufHxsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKGUpfSx0KSx0aGlzfXZhciBsPXtUUkFOU0lUSU9OX0VORDoiYnNUcmFuc2l0aW9uRW5kIixnZXRVSUQ6ZnVuY3Rpb24odCl7Zm9yKDt0Kz1+figxZTYqTWF0aC5yYW5kb20oKSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7KTtyZXR1cm4gdH0sZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDpmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10YXJnZXQiKTtlJiYiIyIhPT1lfHwoZT10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIik7dHJ5e3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpP2U6bnVsbH1jYXRjaCh0KXtyZXR1cm4gbnVsbH19LGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiAwO3ZhciBlPWkodCkuY3NzKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIik7cmV0dXJuIHBhcnNlRmxvYXQoZSk/KGU9ZS5zcGxpdCgiLCIpWzBdLDFlMypwYXJzZUZsb2F0KGUpKTowfSxyZWZsb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHQub2Zmc2V0SGVpZ2h0fSx0cmlnZ2VyVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXtpKHQpLnRyaWdnZXIoZSl9LHN1cHBvcnRzVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKGUpfSxpc0VsZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuKHRbMF18fHQpLm5vZGVUeXBlfSx0eXBlQ2hlY2tDb25maWc6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSBpbiBuKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpKXt2YXIgcj1uW2ldLG89ZVtpXSxzPW8mJmwuaXNFbGVtZW50KG8pPyJlbGVtZW50IjooYT1vLHt9LnRvU3RyaW5nLmNhbGwoYSkubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKSk7aWYoIW5ldyBSZWdFeHAocikudGVzdChzKSl0aHJvdyBuZXcgRXJyb3IodC50b1VwcGVyQ2FzZSgpKyc6IE9wdGlvbiAiJytpKyciIHByb3ZpZGVkIHR5cGUgIicrcysnIiBidXQgZXhwZWN0ZWQgdHlwZSAiJytyKyciLicpfXZhciBhfX07cmV0dXJuIGkuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9dCxpLmV2ZW50LnNwZWNpYWxbbC5UUkFOU0lUSU9OX0VORF09e2JpbmRUeXBlOmUsZGVsZWdhdGVUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe2lmKGkodC50YXJnZXQpLmlzKHRoaXMpKXJldHVybiB0LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGx9KGUpLEtuPShuPSJhbGVydCIsYT0iLiIrKG89ImJzLmFsZXJ0IiksYz0ocj1lKS5mbltuXSx1PXtDTE9TRToiY2xvc2UiK2EsQ0xPU0VEOiJjbG9zZWQiK2EsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIithKyIuZGF0YS1hcGkifSxmPSJhbGVydCIsZD0iZmFkZSIsZz0ic2hvdyIsXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LmNsb3NlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VsZW1lbnQ7dCYmKGU9dGhpcy5fZ2V0Um9vdEVsZW1lbnQodCkpLHRoaXMuX3RyaWdnZXJDbG9zZUV2ZW50KGUpLmlzRGVmYXVsdFByZXZlbnRlZCgpfHx0aGlzLl9yZW1vdmVFbGVtZW50KGUpfSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtyLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxvKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2dldFJvb3RFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCksbj0hMTtyZXR1cm4gZSYmKG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKSksbnx8KG49cih0KS5jbG9zZXN0KCIuIitmKVswXSksbn0sdC5fdHJpZ2dlckNsb3NlRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9ci5FdmVudCh1LkNMT1NFKTtyZXR1cm4gcih0KS50cmlnZ2VyKGUpLGV9LHQuX3JlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZihyKGUpLnJlbW92ZUNsYXNzKGcpLHIoZSkuaGFzQ2xhc3MoZCkpe3ZhciB0PUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGUpO3IoZSkub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKHQpe3JldHVybiBuLl9kZXN0cm95RWxlbWVudChlLHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodCl9ZWxzZSB0aGlzLl9kZXN0cm95RWxlbWVudChlKX0sdC5fZGVzdHJveUVsZW1lbnQ9ZnVuY3Rpb24odCl7cih0KS5kZXRhY2goKS50cmlnZ2VyKHUuQ0xPU0VEKS5yZW1vdmUoKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1yKHRoaXMpLGU9dC5kYXRhKG8pO2V8fChlPW5ldyBpKHRoaXMpLHQuZGF0YShvLGUpKSwiY2xvc2UiPT09biYmZVtuXSh0aGlzKX0pfSxpLl9oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt0JiZ0LnByZXZlbnREZWZhdWx0KCksZS5jbG9zZSh0aGlzKX19LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxpfSgpLHIoZG9jdW1lbnQpLm9uKHUuQ0xJQ0tfREFUQV9BUEksJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLF8uX2hhbmRsZURpc21pc3MobmV3IF8pKSxyLmZuW25dPV8uX2pRdWVyeUludGVyZmFjZSxyLmZuW25dLkNvbnN0cnVjdG9yPV8sci5mbltuXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHIuZm5bbl09YyxfLl9qUXVlcnlJbnRlcmZhY2V9LF8pLE1uPShwPSJidXR0b24iLHk9Ii4iKyh2PSJicy5idXR0b24iKSxFPSIuZGF0YS1hcGkiLEM9KG09ZSkuZm5bcF0sVD0iYWN0aXZlIixiPSJidG4iLEk9J1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxBPSdbZGF0YS10b2dnbGU9ImJ1dHRvbnMiXScsRD0iaW5wdXQiLHc9Ii5hY3RpdmUiLE49Ii5idG4iLE89e0NMSUNLX0RBVEFfQVBJOiJjbGljayIreStFLEZPQ1VTX0JMVVJfREFUQV9BUEk6KFM9ImZvY3VzIikreStFKyIgYmx1ciIreStFfSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0aGlzLl9lbGVtZW50PXR9dmFyIHQ9bi5wcm90b3R5cGU7cmV0dXJuIHQudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIHQ9ITAsZT0hMCxuPW0odGhpcy5fZWxlbWVudCkuY2xvc2VzdChBKVswXTtpZihuKXt2YXIgaT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoRCk7aWYoaSl7aWYoInJhZGlvIj09PWkudHlwZSlpZihpLmNoZWNrZWQmJnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFQpKXQ9ITE7ZWxzZXt2YXIgcj1uLnF1ZXJ5U2VsZWN0b3Iodyk7ciYmbShyKS5yZW1vdmVDbGFzcyhUKX1pZih0KXtpZihpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8bi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJkaXNhYmxlZCIpfHxuLmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSlyZXR1cm47aS5jaGVja2VkPSF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhUKSxtKGkpLnRyaWdnZXIoImNoYW5nZSIpfWkuZm9jdXMoKSxlPSExfX1lJiZ0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoVCkpLHQmJm0odGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoVCl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe20ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LHYpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1tKHRoaXMpLmRhdGEodik7dHx8KHQ9bmV3IG4odGhpcyksbSh0aGlzKS5kYXRhKHYsdCkpLCJ0b2dnbGUiPT09ZSYmdFtlXSgpfSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxufSgpLG0oZG9jdW1lbnQpLm9uKE8uQ0xJQ0tfREFUQV9BUEksSSxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dC50YXJnZXQ7bShlKS5oYXNDbGFzcyhiKXx8KGU9bShlKS5jbG9zZXN0KE4pKSxrLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChtKGUpLCJ0b2dnbGUiKX0pLm9uKE8uRk9DVVNfQkxVUl9EQVRBX0FQSSxJLGZ1bmN0aW9uKHQpe3ZhciBlPW0odC50YXJnZXQpLmNsb3Nlc3QoTilbMF07bShlKS50b2dnbGVDbGFzcyhTLC9eZm9jdXMoaW4pPyQvLnRlc3QodC50eXBlKSl9KSxtLmZuW3BdPWsuX2pRdWVyeUludGVyZmFjZSxtLmZuW3BdLkNvbnN0cnVjdG9yPWssbS5mbltwXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG0uZm5bcF09QyxrLl9qUXVlcnlJbnRlcmZhY2V9LGspLFFuPShqPSJjYXJvdXNlbCIsTD0iLiIrKEg9ImJzLmNhcm91c2VsIiksUj0iLmRhdGEtYXBpIix4PShQPWUpLmZuW2pdLFc9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITB9LFU9e2ludGVydmFsOiIobnVtYmVyfGJvb2xlYW4pIixrZXlib2FyZDoiYm9vbGVhbiIsc2xpZGU6Iihib29sZWFufHN0cmluZykiLHBhdXNlOiIoc3RyaW5nfGJvb2xlYW4pIix3cmFwOiJib29sZWFuIn0scT0ibmV4dCIsRj0icHJldiIsSz0ibGVmdCIsTT0icmlnaHQiLFE9e1NMSURFOiJzbGlkZSIrTCxTTElEOiJzbGlkIitMLEtFWURPV046ImtleWRvd24iK0wsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrTCxNT1VTRUxFQVZFOiJtb3VzZWxlYXZlIitMLFRPVUNIRU5EOiJ0b3VjaGVuZCIrTCxMT0FEX0RBVEFfQVBJOiJsb2FkIitMK1IsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitMK1J9LEI9ImNhcm91c2VsIixWPSJhY3RpdmUiLFk9InNsaWRlIix6PSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixKPSJjYXJvdXNlbC1pdGVtLWxlZnQiLFo9ImNhcm91c2VsLWl0ZW0tbmV4dCIsRz0iY2Fyb3VzZWwtaXRlbS1wcmV2IiwkPSIuYWN0aXZlIixYPSIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHR0PSIuY2Fyb3VzZWwtaXRlbSIsZXQ9Ii5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYiLG50PSIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsaXQ9IltkYXRhLXNsaWRlXSwgW2RhdGEtc2xpZGUtdG9dIixydD0nW2RhdGEtcmlkZT0iY2Fyb3VzZWwiXScsb3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faXRlbXM9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2FjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLl9pc1BhdXNlZD0hMSx0aGlzLl9pc1NsaWRpbmc9ITEsdGhpcy50b3VjaFRpbWVvdXQ9bnVsbCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9UCh0KVswXSx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IobnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCl9dmFyIHQ9by5wcm90b3R5cGU7cmV0dXJuIHQubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUocSl9LHQubmV4dFdoZW5WaXNpYmxlPWZ1bmN0aW9uKCl7IWRvY3VtZW50LmhpZGRlbiYmUCh0aGlzLl9lbGVtZW50KS5pcygiOnZpc2libGUiKSYmImhpZGRlbiIhPT1QKHRoaXMuX2VsZW1lbnQpLmNzcygidmlzaWJpbGl0eSIpJiZ0aGlzLm5leHQoKX0sdC5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZShGKX0sdC5wYXVzZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITApLHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihldCkmJihGbi50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KSx0aGlzLmN5Y2xlKCEwKSksY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbH0sdC5jeWNsZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITEpLHRoaXMuX2ludGVydmFsJiYoY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbCksdGhpcy5fY29uZmlnLmludGVydmFsJiYhdGhpcy5faXNQYXVzZWQmJih0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCgoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlP3RoaXMubmV4dFdoZW5WaXNpYmxlOnRoaXMubmV4dCkuYmluZCh0aGlzKSx0aGlzLl9jb25maWcuaW50ZXJ2YWwpKX0sdC50bz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2FjdGl2ZUVsZW1lbnQ9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFgpO3ZhciBuPXRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9hY3RpdmVFbGVtZW50KTtpZighKHQ+dGhpcy5faXRlbXMubGVuZ3RoLTF8fHQ8MCkpaWYodGhpcy5faXNTbGlkaW5nKVAodGhpcy5fZWxlbWVudCkub25lKFEuU0xJRCxmdW5jdGlvbigpe3JldHVybiBlLnRvKHQpfSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPW48dD9xOkY7dGhpcy5fc2xpZGUoaSx0aGlzLl9pdGVtc1t0XSl9fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtQKHRoaXMuX2VsZW1lbnQpLm9mZihMKSxQLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxIKSx0aGlzLl9pdGVtcz1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2lzUGF1c2VkPW51bGwsdGhpcy5faXNTbGlkaW5nPW51bGwsdGhpcy5fYWN0aXZlRWxlbWVudD1udWxsLHRoaXMuX2luZGljYXRvcnNFbGVtZW50PW51bGx9LHQuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4gdD1sKHt9LFcsdCksRm4udHlwZUNoZWNrQ29uZmlnKGosdCxVKSx0fSx0Ll9hZGRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fY29uZmlnLmtleWJvYXJkJiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuS0VZRE9XTixmdW5jdGlvbih0KXtyZXR1cm4gZS5fa2V5ZG93bih0KX0pLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihQKHRoaXMuX2VsZW1lbnQpLm9uKFEuTU9VU0VFTlRFUixmdW5jdGlvbih0KXtyZXR1cm4gZS5wYXVzZSh0KX0pLm9uKFEuTU9VU0VMRUFWRSxmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0pLCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuVE9VQ0hFTkQsZnVuY3Rpb24oKXtlLnBhdXNlKCksZS50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dChlLnRvdWNoVGltZW91dCksZS50b3VjaFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0sNTAwK2UuX2NvbmZpZy5pbnRlcnZhbCl9KSl9LHQuX2tleWRvd249ZnVuY3Rpb24odCl7aWYoIS9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSkpc3dpdGNoKHQud2hpY2gpe2Nhc2UgMzc6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucHJldigpO2JyZWFrO2Nhc2UgMzk6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmV4dCgpfX0sdC5fZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtcz10JiZ0LnBhcmVudE5vZGU/W10uc2xpY2UuY2FsbCh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCh0dCkpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LHQuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXQ9PT1xLGk9dD09PUYscj10aGlzLl9nZXRJdGVtSW5kZXgoZSksbz10aGlzLl9pdGVtcy5sZW5ndGgtMTtpZigoaSYmMD09PXJ8fG4mJnI9PT1vKSYmIXRoaXMuX2NvbmZpZy53cmFwKXJldHVybiBlO3ZhciBzPShyKyh0PT09Rj8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cz90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbc119LHQuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSkscj1QLkV2ZW50KFEuU0xJREUse3JlbGF0ZWRUYXJnZXQ6dCxkaXJlY3Rpb246ZSxmcm9tOmksdG86bn0pO3JldHVybiBQKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIocikscn0sdC5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7dmFyIGU9W10uc2xpY2UuY2FsbCh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCQpKTtQKGUpLnJlbW92ZUNsYXNzKFYpO3ZhciBuPXRoaXMuX2luZGljYXRvcnNFbGVtZW50LmNoaWxkcmVuW3RoaXMuX2dldEl0ZW1JbmRleCh0KV07biYmUChuKS5hZGRDbGFzcyhWKX19LHQuX3NsaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG89dGhpcyxzPXRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSxhPXRoaXMuX2dldEl0ZW1JbmRleChzKSxsPWV8fHMmJnRoaXMuX2dldEl0ZW1CeURpcmVjdGlvbih0LHMpLGM9dGhpcy5fZ2V0SXRlbUluZGV4KGwpLGg9Qm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7aWYodD09PXE/KG49SixpPVoscj1LKToobj16LGk9RyxyPU0pLGwmJlAobCkuaGFzQ2xhc3MoVikpdGhpcy5faXNTbGlkaW5nPSExO2Vsc2UgaWYoIXRoaXMuX3RyaWdnZXJTbGlkZUV2ZW50KGwscikuaXNEZWZhdWx0UHJldmVudGVkKCkmJnMmJmwpe3RoaXMuX2lzU2xpZGluZz0hMCxoJiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKTt2YXIgdT1QLkV2ZW50KFEuU0xJRCx7cmVsYXRlZFRhcmdldDpsLGRpcmVjdGlvbjpyLGZyb206YSx0bzpjfSk7aWYoUCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhZKSl7UChsKS5hZGRDbGFzcyhpKSxGbi5yZWZsb3cobCksUChzKS5hZGRDbGFzcyhuKSxQKGwpLmFkZENsYXNzKG4pO3ZhciBmPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHMpO1Aocykub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7UChsKS5yZW1vdmVDbGFzcyhuKyIgIitpKS5hZGRDbGFzcyhWKSxQKHMpLnJlbW92ZUNsYXNzKFYrIiAiK2krIiAiK24pLG8uX2lzU2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIFAoby5fZWxlbWVudCkudHJpZ2dlcih1KX0sMCl9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChmKX1lbHNlIFAocykucmVtb3ZlQ2xhc3MoViksUChsKS5hZGRDbGFzcyhWKSx0aGlzLl9pc1NsaWRpbmc9ITEsUCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHUpO2gmJnRoaXMuY3ljbGUoKX19LG8uX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKS5kYXRhKEgpLGU9bCh7fSxXLFAodGhpcykuZGF0YSgpKTsib2JqZWN0Ij09dHlwZW9mIGkmJihlPWwoe30sZSxpKSk7dmFyIG49InN0cmluZyI9PXR5cGVvZiBpP2k6ZS5zbGlkZTtpZih0fHwodD1uZXcgbyh0aGlzLGUpLFAodGhpcykuZGF0YShILHQpKSwibnVtYmVyIj09dHlwZW9mIGkpdC50byhpKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfWVsc2UgZS5pbnRlcnZhbCYmKHQucGF1c2UoKSx0LmN5Y2xlKCkpfSl9LG8uX2RhdGFBcGlDbGlja0hhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpZihlKXt2YXIgbj1QKGUpWzBdO2lmKG4mJlAobikuaGFzQ2xhc3MoQikpe3ZhciBpPWwoe30sUChuKS5kYXRhKCksUCh0aGlzKS5kYXRhKCkpLHI9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtdG8iKTtyJiYoaS5pbnRlcnZhbD0hMSksby5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoUChuKSxpKSxyJiZQKG4pLmRhdGEoSCkudG8ociksdC5wcmV2ZW50RGVmYXVsdCgpfX19LHMobyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFd9fV0pLG99KCksUChkb2N1bWVudCkub24oUS5DTElDS19EQVRBX0FQSSxpdCxvdC5fZGF0YUFwaUNsaWNrSGFuZGxlciksUCh3aW5kb3cpLm9uKFEuTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocnQpKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgaT1QKHRbZV0pO290Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbChpLGkuZGF0YSgpKX19KSxQLmZuW2pdPW90Ll9qUXVlcnlJbnRlcmZhY2UsUC5mbltqXS5Db25zdHJ1Y3Rvcj1vdCxQLmZuW2pdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gUC5mbltqXT14LG90Ll9qUXVlcnlJbnRlcmZhY2V9LG90KSxCbj0oYXQ9ImNvbGxhcHNlIixjdD0iLiIrKGx0PSJicy5jb2xsYXBzZSIpLGh0PShzdD1lKS5mblthdF0sdXQ9e3RvZ2dsZTohMCxwYXJlbnQ6IiJ9LGZ0PXt0b2dnbGU6ImJvb2xlYW4iLHBhcmVudDoiKHN0cmluZ3xlbGVtZW50KSJ9LGR0PXtTSE9XOiJzaG93IitjdCxTSE9XTjoic2hvd24iK2N0LEhJREU6ImhpZGUiK2N0LEhJRERFTjoiaGlkZGVuIitjdCxDTElDS19EQVRBX0FQSToiY2xpY2siK2N0KyIuZGF0YS1hcGkifSxndD0ic2hvdyIsX3Q9ImNvbGxhcHNlIixtdD0iY29sbGFwc2luZyIscHQ9ImNvbGxhcHNlZCIsdnQ9IndpZHRoIix5dD0iaGVpZ2h0IixFdD0iLnNob3csIC5jb2xsYXBzaW5nIixDdD0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxUdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSx0KXt0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fZWxlbWVudD1lLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcodCksdGhpcy5fdHJpZ2dlckFycmF5PXN0Lm1ha2VBcnJheShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrZS5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJytlLmlkKyciXScpKTtmb3IodmFyIG49W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKEN0KSksaT0wLHI9bi5sZW5ndGg7aTxyO2krKyl7dmFyIG89bltpXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyksYT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocykpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9KTtudWxsIT09cyYmMDxhLmxlbmd0aCYmKHRoaXMuX3NlbGVjdG9yPXMsdGhpcy5fdHJpZ2dlckFycmF5LnB1c2gobykpfXRoaXMuX3BhcmVudD10aGlzLl9jb25maWcucGFyZW50P3RoaXMuX2dldFBhcmVudCgpOm51bGwsdGhpcy5fY29uZmlnLnBhcmVudHx8dGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsdGhpcy5fdHJpZ2dlckFycmF5KSx0aGlzLl9jb25maWcudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfXZhciB0PWEucHJvdG90eXBlO3JldHVybiB0LnRvZ2dsZT1mdW5jdGlvbigpe3N0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sdC5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmIXN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSYmKHRoaXMuX3BhcmVudCYmMD09PSh0PVtdLnNsaWNlLmNhbGwodGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoRXQpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudCIpPT09bi5fY29uZmlnLnBhcmVudH0pKS5sZW5ndGgmJih0PW51bGwpLCEodCYmKGU9c3QodCkubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKGx0KSkmJmUuX2lzVHJhbnNpdGlvbmluZykpKXt2YXIgaT1zdC5FdmVudChkdC5TSE9XKTtpZihzdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGkpLCFpLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt0JiYoYS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoc3QodCkubm90KHRoaXMuX3NlbGVjdG9yKSwiaGlkZSIpLGV8fHN0KHQpLmRhdGEobHQsbnVsbCkpO3ZhciByPXRoaXMuX2dldERpbWVuc2lvbigpO3N0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKF90KS5hZGRDbGFzcyhtdCksdGhpcy5fZWxlbWVudC5zdHlsZVtyXT0wLHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGgmJnN0KHRoaXMuX3RyaWdnZXJBcnJheSkucmVtb3ZlQ2xhc3MocHQpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKSx0aGlzLnNldFRyYW5zaXRpb25pbmcoITApO3ZhciBvPSJzY3JvbGwiKyhyWzBdLnRvVXBwZXJDYXNlKCkrci5zbGljZSgxKSkscz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXtzdChuLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhtdCkuYWRkQ2xhc3MoX3QpLmFkZENsYXNzKGd0KSxuLl9lbGVtZW50LnN0eWxlW3JdPSIiLG4uc2V0VHJhbnNpdGlvbmluZyghMSksc3Qobi5fZWxlbWVudCkudHJpZ2dlcihkdC5TSE9XTil9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChzKSx0aGlzLl9lbGVtZW50LnN0eWxlW3JdPXRoaXMuX2VsZW1lbnRbb10rInB4In19fSx0LmhpZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSl7dmFyIGU9c3QuRXZlbnQoZHQuSElERSk7aWYoc3QodGhpcy5fZWxlbWVudCkudHJpZ2dlcihlKSwhZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIG49dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW25dKyJweCIsRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLHN0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKG10KS5yZW1vdmVDbGFzcyhfdCkucmVtb3ZlQ2xhc3MoZ3QpO3ZhciBpPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYoMDxpKWZvcih2YXIgcj0wO3I8aTtyKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtyXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyk7aWYobnVsbCE9PXMpc3QoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHMpKSkuaGFzQ2xhc3MoZ3QpfHxzdChvKS5hZGRDbGFzcyhwdCkuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT0iIjt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXt0LnNldFRyYW5zaXRpb25pbmcoITEpLHN0KHQuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKG10KS5hZGRDbGFzcyhfdCkudHJpZ2dlcihkdC5ISURERU4pfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9fX0sdC5zZXRUcmFuc2l0aW9uaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVHJhbnNpdGlvbmluZz10fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtzdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsbHQpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl90cmlnZ2VyQXJyYXk9bnVsbCx0aGlzLl9pc1RyYW5zaXRpb25pbmc9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybih0PWwoe30sdXQsdCkpLnRvZ2dsZT1Cb29sZWFuKHQudG9nZ2xlKSxGbi50eXBlQ2hlY2tDb25maWcoYXQsdCxmdCksdH0sdC5fZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKHZ0KT92dDp5dH0sdC5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PW51bGw7Rm4uaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpPyh0PXRoaXMuX2NvbmZpZy5wYXJlbnQsInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSYmKHQ9dGhpcy5fY29uZmlnLnBhcmVudFswXSkpOnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jb25maWcucGFyZW50KTt2YXIgZT0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMuX2NvbmZpZy5wYXJlbnQrJyJdJyxpPVtdLnNsaWNlLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKGUpKTtyZXR1cm4gc3QoaSkuZWFjaChmdW5jdGlvbih0LGUpe24uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhhLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlKSxbZV0pfSksdH0sdC5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzPWZ1bmN0aW9uKHQsZSl7aWYodCl7dmFyIG49c3QodCkuaGFzQ2xhc3MoZ3QpO2UubGVuZ3RoJiZzdChlKS50b2dnbGVDbGFzcyhwdCwhbikuYXR0cigiYXJpYS1leHBhbmRlZCIsbil9fSxhLl9nZXRUYXJnZXRGcm9tRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBlP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6bnVsbH0sYS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCksbj1sKHt9LHV0LHQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgaSYmaT9pOnt9KTtpZighZSYmbi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoaSkmJihuLnRvZ2dsZT0hMSksZXx8KGU9bmV3IGEodGhpcyxuKSx0LmRhdGEobHQsZSkpLCJzdHJpbmciPT10eXBlb2YgaSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW2ldKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytpKyciJyk7ZVtpXSgpfX0pfSxzKGEsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB1dH19XSksYX0oKSxzdChkb2N1bWVudCkub24oZHQuQ0xJQ0tfREFUQV9BUEksQ3QsZnVuY3Rpb24odCl7IkEiPT09dC5jdXJyZW50VGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgbj1zdCh0aGlzKSxlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyksaT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpO3N0KGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCk/InRvZ2dsZSI6bi5kYXRhKCk7VHQuX2pRdWVyeUludGVyZmFjZS5jYWxsKHQsZSl9KX0pLHN0LmZuW2F0XT1UdC5falF1ZXJ5SW50ZXJmYWNlLHN0LmZuW2F0XS5Db25zdHJ1Y3Rvcj1UdCxzdC5mblthdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBzdC5mblthdF09aHQsVHQuX2pRdWVyeUludGVyZmFjZX0sVHQpLFZuPShTdD0iZHJvcGRvd24iLEF0PSIuIisoSXQ9ImJzLmRyb3Bkb3duIiksRHQ9Ii5kYXRhLWFwaSIsd3Q9KGJ0PWUpLmZuW1N0XSxOdD1uZXcgUmVnRXhwKCIzOHw0MHwyNyIpLE90PXtISURFOiJoaWRlIitBdCxISURERU46ImhpZGRlbiIrQXQsU0hPVzoic2hvdyIrQXQsU0hPV046InNob3duIitBdCxDTElDSzoiY2xpY2siK0F0LENMSUNLX0RBVEFfQVBJOiJjbGljayIrQXQrRHQsS0VZRE9XTl9EQVRBX0FQSToia2V5ZG93biIrQXQrRHQsS0VZVVBfREFUQV9BUEk6ImtleXVwIitBdCtEdH0sa3Q9ImRpc2FibGVkIixQdD0ic2hvdyIsanQ9ImRyb3B1cCIsSHQ9ImRyb3ByaWdodCIsTHQ9ImRyb3BsZWZ0IixSdD0iZHJvcGRvd24tbWVudS1yaWdodCIseHQ9InBvc2l0aW9uLXN0YXRpYyIsV3Q9J1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsVXQ9Ii5kcm9wZG93biBmb3JtIixxdD0iLmRyb3Bkb3duLW1lbnUiLEZ0PSIubmF2YmFyLW5hdiIsS3Q9Ii5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpIixNdD0idG9wLXN0YXJ0IixRdD0idG9wLWVuZCIsQnQ9ImJvdHRvbS1zdGFydCIsVnQ9ImJvdHRvbS1lbmQiLFl0PSJyaWdodC1zdGFydCIsenQ9ImxlZnQtc3RhcnQiLEp0PXtvZmZzZXQ6MCxmbGlwOiEwLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHJlZmVyZW5jZToidG9nZ2xlIixkaXNwbGF5OiJkeW5hbWljIn0sWnQ9e29mZnNldDoiKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pIixmbGlwOiJib29sZWFuIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSIscmVmZXJlbmNlOiIoc3RyaW5nfGVsZW1lbnQpIixkaXNwbGF5OiJzdHJpbmcifSxHdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGModCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9tZW51PXRoaXMuX2dldE1lbnVFbGVtZW50KCksdGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKX12YXIgdD1jLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZWxlbWVudC5kaXNhYmxlZCYmIWJ0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGt0KSl7dmFyIHQ9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCksZT1idCh0aGlzLl9tZW51KS5oYXNDbGFzcyhQdCk7aWYoYy5fY2xlYXJNZW51cygpLCFlKXt2YXIgbj17cmVsYXRlZFRhcmdldDp0aGlzLl9lbGVtZW50fSxpPWJ0LkV2ZW50KE90LlNIT1csbik7aWYoYnQodCkudHJpZ2dlcihpKSwhaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7aWYoIXRoaXMuX2luTmF2YmFyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIHI9dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/cj10OkZuLmlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSYmKHI9dGhpcy5fY29uZmlnLnJlZmVyZW5jZSwidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UuanF1ZXJ5JiYocj10aGlzLl9jb25maWcucmVmZXJlbmNlWzBdKSksInNjcm9sbFBhcmVudCIhPT10aGlzLl9jb25maWcuYm91bmRhcnkmJmJ0KHQpLmFkZENsYXNzKHh0KSx0aGlzLl9wb3BwZXI9bmV3IGgocix0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX0ib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmMD09PWJ0KHQpLmNsb3Nlc3QoRnQpLmxlbmd0aCYmYnQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbigibW91c2VvdmVyIixudWxsLGJ0Lm5vb3ApLHRoaXMuX2VsZW1lbnQuZm9jdXMoKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApLGJ0KHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKFB0KSxidCh0KS50b2dnbGVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5TSE9XTixuKSl9fX19LHQuZGlzcG9zZT1mdW5jdGlvbigpe2J0LnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxJdCksYnQodGhpcy5fZWxlbWVudCkub2ZmKEF0KSx0aGlzLl9lbGVtZW50PW51bGwsKHRoaXMuX21lbnU9bnVsbCkhPT10aGlzLl9wb3BwZXImJih0aGlzLl9wb3BwZXIuZGVzdHJveSgpLHRoaXMuX3BvcHBlcj1udWxsKX0sdC51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9pbk5hdmJhcj10aGlzLl9kZXRlY3ROYXZiYXIoKSxudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0sdC5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2J0KHRoaXMuX2VsZW1lbnQpLm9uKE90LkNMSUNLLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLGUudG9nZ2xlKCl9KX0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LGJ0KHRoaXMuX2VsZW1lbnQpLmRhdGEoKSx0KSxGbi50eXBlQ2hlY2tDb25maWcoU3QsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXRNZW51RWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLl9tZW51KXt2YXIgdD1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTt0JiYodGhpcy5fbWVudT10LnF1ZXJ5U2VsZWN0b3IocXQpKX1yZXR1cm4gdGhpcy5fbWVudX0sdC5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9YnQodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlKSxlPUJ0O3JldHVybiB0Lmhhc0NsYXNzKGp0KT8oZT1NdCxidCh0aGlzLl9tZW51KS5oYXNDbGFzcyhSdCkmJihlPVF0KSk6dC5oYXNDbGFzcyhIdCk/ZT1ZdDp0Lmhhc0NsYXNzKEx0KT9lPXp0OmJ0KHRoaXMuX21lbnUpLmhhc0NsYXNzKFJ0KSYmKGU9VnQpLGV9LHQuX2RldGVjdE5hdmJhcj1mdW5jdGlvbigpe3JldHVybiAwPGJ0KHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoIi5uYXZiYXIiKS5sZW5ndGh9LHQuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD17fTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldD90LmZuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZnNldHM9bCh7fSx0Lm9mZnNldHMsZS5fY29uZmlnLm9mZnNldCh0Lm9mZnNldHMpfHx7fSksdH06dC5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldDt2YXIgbj17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnQsZmxpcDp7ZW5hYmxlZDp0aGlzLl9jb25maWcuZmxpcH0scHJldmVudE92ZXJmbG93Ontib3VuZGFyaWVzRWxlbWVudDp0aGlzLl9jb25maWcuYm91bmRhcnl9fX07cmV0dXJuInN0YXRpYyI9PT10aGlzLl9jb25maWcuZGlzcGxheSYmKG4ubW9kaWZpZXJzLmFwcGx5U3R5bGU9e2VuYWJsZWQ6ITF9KSxufSxjLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJ0KHRoaXMpLmRhdGEoSXQpO2lmKHR8fCh0PW5ldyBjKHRoaXMsIm9iamVjdCI9PXR5cGVvZiBlP2U6bnVsbCksYnQodGhpcykuZGF0YShJdCx0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LGMuX2NsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDMhPT10LndoaWNoJiYoImtleXVwIiE9PXQudHlwZXx8OT09PXQud2hpY2gpKWZvcih2YXIgZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoV3QpKSxuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXt2YXIgcj1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudChlW25dKSxvPWJ0KGVbbl0pLmRhdGEoSXQpLHM9e3JlbGF0ZWRUYXJnZXQ6ZVtuXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKHMuY2xpY2tFdmVudD10KSxvKXt2YXIgYT1vLl9tZW51O2lmKGJ0KHIpLmhhc0NsYXNzKFB0KSYmISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmOT09PXQud2hpY2gpJiZidC5jb250YWlucyhyLHQudGFyZ2V0KSkpe3ZhciBsPWJ0LkV2ZW50KE90LkhJREUscyk7YnQocikudHJpZ2dlcihsKSxsLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmJ0KGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCJtb3VzZW92ZXIiLG51bGwsYnQubm9vcCksZVtuXS5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGJ0KGEpLnJlbW92ZUNsYXNzKFB0KSxidChyKS5yZW1vdmVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5ISURERU4scykpKX19fX0sYy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBuJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4pKSxlfHx0LnBhcmVudE5vZGV9LGMuX2RhdGFBcGlLZXlkb3duSGFuZGxlcj1mdW5jdGlvbih0KXtpZigoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8hKDMyPT09dC53aGljaHx8MjchPT10LndoaWNoJiYoNDAhPT10LndoaWNoJiYzOCE9PXQud2hpY2h8fGJ0KHQudGFyZ2V0KS5jbG9zZXN0KHF0KS5sZW5ndGgpKTpOdC50ZXN0KHQud2hpY2gpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhYnQodGhpcykuaGFzQ2xhc3Moa3QpKSl7dmFyIGU9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyksbj1idChlKS5oYXNDbGFzcyhQdCk7aWYoKG58fDI3PT09dC53aGljaCYmMzI9PT10LndoaWNoKSYmKCFufHwyNyE9PXQud2hpY2gmJjMyIT09dC53aGljaCkpe3ZhciBpPVtdLnNsaWNlLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKEt0KSk7aWYoMCE9PWkubGVuZ3RoKXt2YXIgcj1pLmluZGV4T2YodC50YXJnZXQpOzM4PT09dC53aGljaCYmMDxyJiZyLS0sNDA9PT10LndoaWNoJiZyPGkubGVuZ3RoLTEmJnIrKyxyPDAmJihyPTApLGlbcl0uZm9jdXMoKX19ZWxzZXtpZigyNz09PXQud2hpY2gpe3ZhciBvPWUucXVlcnlTZWxlY3RvcihXdCk7YnQobykudHJpZ2dlcigiZm9jdXMiKX1idCh0aGlzKS50cmlnZ2VyKCJjbGljayIpfX19LHMoYyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEp0fX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBadH19XSksY30oKSxidChkb2N1bWVudCkub24oT3QuS0VZRE9XTl9EQVRBX0FQSSxXdCxHdC5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihPdC5LRVlET1dOX0RBVEFfQVBJLHF0LEd0Ll9kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLm9uKE90LkNMSUNLX0RBVEFfQVBJKyIgIitPdC5LRVlVUF9EQVRBX0FQSSxHdC5fY2xlYXJNZW51cykub24oT3QuQ0xJQ0tfREFUQV9BUEksV3QsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksR3QuX2pRdWVyeUludGVyZmFjZS5jYWxsKGJ0KHRoaXMpLCJ0b2dnbGUiKX0pLm9uKE90LkNMSUNLX0RBVEFfQVBJLFV0LGZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9KSxidC5mbltTdF09R3QuX2pRdWVyeUludGVyZmFjZSxidC5mbltTdF0uQ29uc3RydWN0b3I9R3QsYnQuZm5bU3RdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYnQuZm5bU3RdPXd0LEd0Ll9qUXVlcnlJbnRlcmZhY2V9LEd0KSxZbj0oWHQ9Im1vZGFsIixlZT0iLiIrKHRlPSJicy5tb2RhbCIpLG5lPSgkdD1lKS5mbltYdF0saWU9e2JhY2tkcm9wOiEwLGtleWJvYXJkOiEwLGZvY3VzOiEwLHNob3c6ITB9LHJlPXtiYWNrZHJvcDoiKGJvb2xlYW58c3RyaW5nKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLGZvY3VzOiJib29sZWFuIixzaG93OiJib29sZWFuIn0sb2U9e0hJREU6ImhpZGUiK2VlLEhJRERFTjoiaGlkZGVuIitlZSxTSE9XOiJzaG93IitlZSxTSE9XTjoic2hvd24iK2VlLEZPQ1VTSU46ImZvY3VzaW4iK2VlLFJFU0laRToicmVzaXplIitlZSxDTElDS19ESVNNSVNTOiJjbGljay5kaXNtaXNzIitlZSxLRVlET1dOX0RJU01JU1M6ImtleWRvd24uZGlzbWlzcyIrZWUsTU9VU0VVUF9ESVNNSVNTOiJtb3VzZXVwLmRpc21pc3MiK2VlLE1PVVNFRE9XTl9ESVNNSVNTOiJtb3VzZWRvd24uZGlzbWlzcyIrZWUsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitlZSsiLmRhdGEtYXBpIn0sc2U9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIixhZT0ibW9kYWwtYmFja2Ryb3AiLGxlPSJtb2RhbC1vcGVuIixjZT0iZmFkZSIsaGU9InNob3ciLHVlPSIubW9kYWwtZGlhbG9nIixmZT0nW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxkZT0nW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsZ2U9Ii5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiLF9lPSIuc3RpY2t5LXRvcCIsbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fZGlhbG9nPXQucXVlcnlTZWxlY3Rvcih1ZSksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9MH12YXIgdD1yLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lzU2hvd24/dGhpcy5oaWRlKCk6dGhpcy5zaG93KHQpfSx0LnNob3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5faXNTaG93bil7JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpJiYodGhpcy5faXNUcmFuc2l0aW9uaW5nPSEwKTt2YXIgbj0kdC5FdmVudChvZS5TSE9XLHtyZWxhdGVkVGFyZ2V0OnR9KTskdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKG4pLHRoaXMuX2lzU2hvd258fG4uaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLl9pc1Nob3duPSEwLHRoaXMuX2NoZWNrU2Nyb2xsYmFyKCksdGhpcy5fc2V0U2Nyb2xsYmFyKCksdGhpcy5fYWRqdXN0RGlhbG9nKCksJHQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MobGUpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdCh0aGlzLl9lbGVtZW50KS5vbihvZS5DTElDS19ESVNNSVNTLGRlLGZ1bmN0aW9uKHQpe3JldHVybiBlLmhpZGUodCl9KSwkdCh0aGlzLl9kaWFsb2cpLm9uKG9lLk1PVVNFRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKCl7JHQoZS5fZWxlbWVudCkub25lKG9lLk1PVVNFVVBfRElTTUlTUyxmdW5jdGlvbih0KXskdCh0LnRhcmdldCkuaXMoZS5fZWxlbWVudCkmJihlLl9pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5fc2hvd0JhY2tkcm9wKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3Nob3dFbGVtZW50KHQpfSkpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodCYmdC5wcmV2ZW50RGVmYXVsdCgpLCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnRoaXMuX2lzU2hvd24pe3ZhciBuPSR0LkV2ZW50KG9lLkhJREUpO2lmKCR0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIobiksdGhpcy5faXNTaG93biYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkpe3RoaXMuX2lzU2hvd249ITE7dmFyIGk9JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpO2lmKGkmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdChkb2N1bWVudCkub2ZmKG9lLkZPQ1VTSU4pLCR0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKGhlKSwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuQ0xJQ0tfRElTTUlTUyksJHQodGhpcy5fZGlhbG9nKS5vZmYob2UuTU9VU0VET1dOX0RJU01JU1MpLGkpe3ZhciByPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2VsZW1lbnQpLm9uZShGbi5UUkFOU0lUSU9OX0VORCxmdW5jdGlvbih0KXtyZXR1cm4gZS5faGlkZU1vZGFsKHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQocil9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXskdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsdGUpLCR0KHdpbmRvdyxkb2N1bWVudCx0aGlzLl9lbGVtZW50LHRoaXMuX2JhY2tkcm9wKS5vZmYoZWUpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9kaWFsb2c9bnVsbCx0aGlzLl9iYWNrZHJvcD1udWxsLHRoaXMuX2lzU2hvd249bnVsbCx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz1udWxsLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9bnVsbCx0aGlzLl9zY3JvbGxiYXJXaWR0aD1udWxsfSx0LmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2FkanVzdERpYWxvZygpfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bCh7fSxpZSx0KSxGbi50eXBlQ2hlY2tDb25maWcoWHQsdCxyZSksdH0sdC5fc2hvd0VsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPSR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKTt0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfHxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpLHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wPTAsbiYmRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLCR0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKGhlKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBpPSR0LkV2ZW50KG9lLlNIT1dOLHtyZWxhdGVkVGFyZ2V0OnR9KSxyPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLCR0KGUuX2VsZW1lbnQpLnRyaWdnZXIoaSl9O2lmKG4pe3ZhciBvPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2RpYWxvZykub25lKEZuLlRSQU5TSVRJT05fRU5ELHIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG8pfWVsc2UgcigpfSx0Ll9lbmZvcmNlRm9jdXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyR0KGRvY3VtZW50KS5vZmYob2UuRk9DVVNJTikub24ob2UuRk9DVVNJTixmdW5jdGlvbih0KXtkb2N1bWVudCE9PXQudGFyZ2V0JiZlLl9lbGVtZW50IT09dC50YXJnZXQmJjA9PT0kdChlLl9lbGVtZW50KS5oYXModC50YXJnZXQpLmxlbmd0aCYmZS5fZWxlbWVudC5mb2N1cygpfSl9LHQuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9pc1Nob3duJiZ0aGlzLl9jb25maWcua2V5Ym9hcmQ/JHQodGhpcy5fZWxlbWVudCkub24ob2UuS0VZRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKHQpezI3PT09dC53aGljaCYmKHQucHJldmVudERlZmF1bHQoKSxlLmhpZGUoKSl9KTp0aGlzLl9pc1Nob3dufHwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuS0VZRE9XTl9ESVNNSVNTKX0sdC5fc2V0UmVzaXplRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2lzU2hvd24/JHQod2luZG93KS5vbihvZS5SRVNJWkUsZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlVXBkYXRlKHQpfSk6JHQod2luZG93KS5vZmYob2UuUkVTSVpFKX0sdC5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24oKXskdChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhsZSksdC5fcmVzZXRBZGp1c3RtZW50cygpLHQuX3Jlc2V0U2Nyb2xsYmFyKCksJHQodC5fZWxlbWVudCkudHJpZ2dlcihvZS5ISURERU4pfSl9LHQuX3JlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy5fYmFja2Ryb3AmJigkdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCksdGhpcy5fYmFja2Ryb3A9bnVsbCl9LHQuX3Nob3dCYWNrZHJvcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpP2NlOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPWFlLG4mJnRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQobiksJHQodGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLCR0KHRoaXMuX2VsZW1lbnQpLm9uKG9lLkNMSUNLX0RJU01JU1MsZnVuY3Rpb24odCl7ZS5faWdub3JlQmFja2Ryb3BDbGljaz9lLl9pZ25vcmVCYWNrZHJvcENsaWNrPSExOnQudGFyZ2V0PT09dC5jdXJyZW50VGFyZ2V0JiYoInN0YXRpYyI9PT1lLl9jb25maWcuYmFja2Ryb3A/ZS5fZWxlbWVudC5mb2N1cygpOmUuaGlkZSgpKX0pLG4mJkZuLnJlZmxvdyh0aGlzLl9iYWNrZHJvcCksJHQodGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKGhlKSwhdClyZXR1cm47aWYoIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2JhY2tkcm9wKTskdCh0aGlzLl9iYWNrZHJvcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELHQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXskdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoaGUpO3ZhciByPWZ1bmN0aW9uKCl7ZS5fcmVtb3ZlQmFja2Ryb3AoKSx0JiZ0KCl9O2lmKCR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKSl7dmFyIG89Rm4uZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApOyR0KHRoaXMuX2JhY2tkcm9wKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCl9ZWxzZSB0JiZ0KCl9LHQuX2FkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7IXRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiZ0JiYodGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKSx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyYmIXQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0sdC5fcmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQ9IiIsdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ9IiJ9LHQuX2NoZWNrU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz10LmxlZnQrdC5yaWdodDx3aW5kb3cuaW5uZXJXaWR0aCx0aGlzLl9zY3JvbGxiYXJXaWR0aD10aGlzLl9nZXRTY3JvbGxiYXJXaWR0aCgpfSx0Ll9zZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO2lmKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZ2UpKSxlPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChfZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPSR0KGUpLmNzcygicGFkZGluZy1yaWdodCIpOyR0KGUpLmRhdGEoInBhZGRpbmctcmlnaHQiLG4pLmNzcygicGFkZGluZy1yaWdodCIscGFyc2VGbG9hdChpKStyLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0pLCR0KGUpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9JHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiKTskdChlKS5kYXRhKCJtYXJnaW4tcmlnaHQiLG4pLmNzcygibWFyZ2luLXJpZ2h0IixwYXJzZUZsb2F0KGkpLXIuX3Njcm9sbGJhcldpZHRoKyJweCIpfSk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQsaT0kdChkb2N1bWVudC5ib2R5KS5jc3MoInBhZGRpbmctcmlnaHQiKTskdChkb2N1bWVudC5ib2R5KS5kYXRhKCJwYWRkaW5nLXJpZ2h0IixuKS5jc3MoInBhZGRpbmctcmlnaHQiLHBhcnNlRmxvYXQoaSkrdGhpcy5fc2Nyb2xsYmFyV2lkdGgrInB4Iil9fSx0Ll9yZXNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChnZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj0kdChlKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7JHQoZSkucmVtb3ZlRGF0YSgicGFkZGluZy1yaWdodCIpLGUuc3R5bGUucGFkZGluZ1JpZ2h0PW58fCIifSk7dmFyIGU9W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIiK19lKSk7JHQoZSkuZWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPSR0KGUpLmRhdGEoIm1hcmdpbi1yaWdodCIpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmJHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiLG4pLnJlbW92ZURhdGEoIm1hcmdpbi1yaWdodCIpfSk7dmFyIG49JHQoZG9jdW1lbnQuYm9keSkuZGF0YSgicGFkZGluZy1yaWdodCIpOyR0KGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1ufHwiIn0sdC5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT1zZSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfSxyLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obixpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9JHQodGhpcykuZGF0YSh0ZSksZT1sKHt9LGllLCR0KHRoaXMpLmRhdGEoKSwib2JqZWN0Ij09dHlwZW9mIG4mJm4/bjp7fSk7aWYodHx8KHQ9bmV3IHIodGhpcyxlKSwkdCh0aGlzKS5kYXRhKHRlLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdFtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO3Rbbl0oaSl9ZWxzZSBlLnNob3cmJnQuc2hvdyhpKX0pfSxzKHIsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBpZX19XSkscn0oKSwkdChkb2N1bWVudCkub24ob2UuQ0xJQ0tfREFUQV9BUEksZmUsZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLGk9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGkpKTt2YXIgcj0kdChlKS5kYXRhKHRlKT8idG9nZ2xlIjpsKHt9LCR0KGUpLmRhdGEoKSwkdCh0aGlzKS5kYXRhKCkpOyJBIiE9PXRoaXMudGFnTmFtZSYmIkFSRUEiIT09dGhpcy50YWdOYW1lfHx0LnByZXZlbnREZWZhdWx0KCk7dmFyIG89JHQoZSkub25lKG9lLlNIT1csZnVuY3Rpb24odCl7dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5vbmUob2UuSElEREVOLGZ1bmN0aW9uKCl7JHQobikuaXMoIjp2aXNpYmxlIikmJm4uZm9jdXMoKX0pfSk7bWUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0KGUpLHIsdGhpcyl9KSwkdC5mbltYdF09bWUuX2pRdWVyeUludGVyZmFjZSwkdC5mbltYdF0uQ29uc3RydWN0b3I9bWUsJHQuZm5bWHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gJHQuZm5bWHRdPW5lLG1lLl9qUXVlcnlJbnRlcmZhY2V9LG1lKSx6bj0odmU9InRvb2x0aXAiLEVlPSIuIisoeWU9ImJzLnRvb2x0aXAiKSxDZT0ocGU9ZSkuZm5bdmVdLFRlPSJicy10b29sdGlwIixiZT1uZXcgUmVnRXhwKCIoXnxcXHMpIitUZSsiXFxTKyIsImciKSxBZT17YW5pbWF0aW9uOiEwLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiEoSWU9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0pLHNlbGVjdG9yOiEoU2U9e2FuaW1hdGlvbjoiYm9vbGVhbiIsdGVtcGxhdGU6InN0cmluZyIsdGl0bGU6IihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbikiLHRyaWdnZXI6InN0cmluZyIsZGVsYXk6IihudW1iZXJ8b2JqZWN0KSIsaHRtbDoiYm9vbGVhbiIsc2VsZWN0b3I6IihzdHJpbmd8Ym9vbGVhbikiLHBsYWNlbWVudDoiKHN0cmluZ3xmdW5jdGlvbikiLG9mZnNldDoiKG51bWJlcnxzdHJpbmcpIixjb250YWluZXI6IihzdHJpbmd8ZWxlbWVudHxib29sZWFuKSIsZmFsbGJhY2tQbGFjZW1lbnQ6IihzdHJpbmd8YXJyYXkpIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSJ9KSxwbGFjZW1lbnQ6InRvcCIsb2Zmc2V0OjAsY29udGFpbmVyOiExLGZhbGxiYWNrUGxhY2VtZW50OiJmbGlwIixib3VuZGFyeToic2Nyb2xsUGFyZW50In0sd2U9Im91dCIsTmU9e0hJREU6ImhpZGUiK0VlLEhJRERFTjoiaGlkZGVuIitFZSxTSE9XOihEZT0ic2hvdyIpK0VlLFNIT1dOOiJzaG93biIrRWUsSU5TRVJURUQ6Imluc2VydGVkIitFZSxDTElDSzoiY2xpY2siK0VlLEZPQ1VTSU46ImZvY3VzaW4iK0VlLEZPQ1VTT1VUOiJmb2N1c291dCIrRWUsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrRWUsTU9VU0VMRUFWRToibW91c2VsZWF2ZSIrRWV9LE9lPSJmYWRlIixrZT0ic2hvdyIsUGU9Ii50b29sdGlwLWlubmVyIixqZT0iLmFycm93IixIZT0iaG92ZXIiLExlPSJmb2N1cyIsUmU9ImNsaWNrIix4ZT0ibWFudWFsIixXZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCxlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PXQsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCl9dmFyIHQ9aS5wcm90b3R5cGU7cmV0dXJuIHQuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSx0LmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LHQudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSx0LnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPXBlKHQuY3VycmVudFRhcmdldCkuZGF0YShlKTtufHwobj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKGUsbikpLG4uX2FjdGl2ZVRyaWdnZXIuY2xpY2s9IW4uX2FjdGl2ZVRyaWdnZXIuY2xpY2ssbi5faXNXaXRoQWN0aXZlVHJpZ2dlcigpP24uX2VudGVyKG51bGwsbik6bi5fbGVhdmUobnVsbCxuKX1lbHNle2lmKHBlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSkpcmV0dXJuIHZvaWQgdGhpcy5fbGVhdmUobnVsbCx0aGlzKTt0aGlzLl9lbnRlcihudWxsLHRoaXMpfX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHBlLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpLHBlKHRoaXMuZWxlbWVudCkub2ZmKHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxwZSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoIi5tb2RhbCIpLm9mZigiaGlkZS5icy5tb2RhbCIpLHRoaXMudGlwJiZwZSh0aGlzLnRpcCkucmVtb3ZlKCksdGhpcy5faXNFbmFibGVkPW51bGwsdGhpcy5fdGltZW91dD1udWxsLHRoaXMuX2hvdmVyU3RhdGU9bnVsbCwodGhpcy5fYWN0aXZlVHJpZ2dlcj1udWxsKSE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCx0aGlzLmVsZW1lbnQ9bnVsbCx0aGlzLmNvbmZpZz1udWxsLHRoaXMudGlwPW51bGx9LHQuc2hvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIm5vbmUiPT09cGUodGhpcy5lbGVtZW50KS5jc3MoImRpc3BsYXkiKSl0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzIik7dmFyIHQ9cGUuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXtwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodCk7dmFyIG49cGUuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuZWxlbWVudCk7aWYodC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IW4pcmV0dXJuO3ZhciBpPXRoaXMuZ2V0VGlwRWxlbWVudCgpLHI9Rm4uZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7aS5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnBlKGkpLmFkZENsYXNzKE9lKTt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50P3RoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsaSx0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnBsYWNlbWVudCxzPXRoaXMuX2dldEF0dGFjaG1lbnQobyk7dGhpcy5hZGRBdHRhY2htZW50Q2xhc3Mocyk7dmFyIGE9ITE9PT10aGlzLmNvbmZpZy5jb250YWluZXI/ZG9jdW1lbnQuYm9keTpwZShkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO3BlKGkpLmRhdGEodGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSxwZS5jb250YWlucyh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdGhpcy50aXApfHxwZShpKS5hcHBlbmRUbyhhKSxwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyBoKHRoaXMuZWxlbWVudCxpLHtwbGFjZW1lbnQ6cyxtb2RpZmllcnM6e29mZnNldDp7b2Zmc2V0OnRoaXMuY29uZmlnLm9mZnNldH0sZmxpcDp7YmVoYXZpb3I6dGhpcy5jb25maWcuZmFsbGJhY2tQbGFjZW1lbnR9LGFycm93OntlbGVtZW50OmplfSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe2UuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSh0KX19KSxwZShpKS5hZGRDbGFzcyhrZSksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJnBlKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKTt2YXIgbD1mdW5jdGlvbigpe2UuY29uZmlnLmFuaW1hdGlvbiYmZS5fZml4VHJhbnNpdGlvbigpO3ZhciB0PWUuX2hvdmVyU3RhdGU7ZS5faG92ZXJTdGF0ZT1udWxsLHBlKGUuZWxlbWVudCkudHJpZ2dlcihlLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKSx0PT09d2UmJmUuX2xlYXZlKG51bGwsZSl9O2lmKHBlKHRoaXMudGlwKS5oYXNDbGFzcyhPZSkpe3ZhciBjPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMudGlwKTtwZSh0aGlzLnRpcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELGwpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMpfWVsc2UgbCgpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmdldFRpcEVsZW1lbnQoKSxpPXBlLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkscj1mdW5jdGlvbigpe2UuX2hvdmVyU3RhdGUhPT1EZSYmbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobiksZS5fY2xlYW5UaXBDbGFzcygpLGUuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKSxwZShlLmVsZW1lbnQpLnRyaWdnZXIoZS5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLG51bGwhPT1lLl9wb3BwZXImJmUuX3BvcHBlci5kZXN0cm95KCksdCYmdCgpfTtpZihwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaSksIWkuaXNEZWZhdWx0UHJldmVudGVkKCkpe2lmKHBlKG4pLnJlbW92ZUNsYXNzKGtlKSwib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmcGUoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKSx0aGlzLl9hY3RpdmVUcmlnZ2VyW1JlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0xlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0hlXT0hMSxwZSh0aGlzLnRpcCkuaGFzQ2xhc3MoT2UpKXt2YXIgbz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChuKTtwZShuKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCk7dGhpcy5faG92ZXJTdGF0ZT0iIn19LHQudXBkYXRlPWZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCl9LHQuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSl9LHQuYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3BlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhUZSsiLSIrdCl9LHQuZ2V0VGlwRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpcD10aGlzLnRpcHx8cGUodGhpcy5jb25maWcudGVtcGxhdGUpWzBdLHRoaXMudGlwfSx0LnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHBlKHQucXVlcnlTZWxlY3RvckFsbChQZSkpLHRoaXMuZ2V0VGl0bGUoKSkscGUodCkucmVtb3ZlQ2xhc3MoT2UrIiAiK2tlKX0sdC5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY29uZmlnLmh0bWw7Im9iamVjdCI9PXR5cGVvZiBlJiYoZS5ub2RlVHlwZXx8ZS5qcXVlcnkpP24/cGUoZSkucGFyZW50KCkuaXModCl8fHQuZW1wdHkoKS5hcHBlbmQoZSk6dC50ZXh0KHBlKGUpLnRleHQoKSk6dFtuPyJodG1sIjoidGV4dCJdKGUpfSx0LmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC10aXRsZSIpO3JldHVybiB0fHwodD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcudGl0bGU/dGhpcy5jb25maWcudGl0bGUuY2FsbCh0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnRpdGxlKSx0fSx0Ll9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBJZVt0LnRvVXBwZXJDYXNlKCldfSx0Ll9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCJjbGljayI9PT10KXBlKGkuZWxlbWVudCkub24oaS5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSyxpLmNvbmZpZy5zZWxlY3RvcixmdW5jdGlvbih0KXtyZXR1cm4gaS50b2dnbGUodCl9KTtlbHNlIGlmKHQhPT14ZSl7dmFyIGU9dD09PUhlP2kuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjppLmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4sbj10PT09SGU/aS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFOmkuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7cGUoaS5lbGVtZW50KS5vbihlLGkuY29uZmlnLnNlbGVjdG9yLGZ1bmN0aW9uKHQpe3JldHVybiBpLl9lbnRlcih0KX0pLm9uKG4saS5jb25maWcuc2VsZWN0b3IsZnVuY3Rpb24odCl7cmV0dXJuIGkuX2xlYXZlKHQpfSl9cGUoaS5lbGVtZW50KS5jbG9zZXN0KCIubW9kYWwiKS5vbigiaGlkZS5icy5tb2RhbCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5oaWRlKCl9KX0pLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPWwoe30sdGhpcy5jb25maWcse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSx0Ll9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LHQuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c2luIj09PXQudHlwZT9MZTpIZV09ITApLHBlKGUuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSl8fGUuX2hvdmVyU3RhdGU9PT1EZT9lLl9ob3ZlclN0YXRlPURlOihjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT1EZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09RGUmJmUuc2hvdygpfSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LHQuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c291dCI9PT10LnR5cGU/TGU6SGVdPSExKSxlLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCl8fChjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT13ZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuaGlkZT9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09d2UmJmUuaGlkZSgpfSxlLmNvbmZpZy5kZWxheS5oaWRlKTplLmhpZGUoKSl9LHQuX2lzV2l0aEFjdGl2ZVRyaWdnZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcilpZih0aGlzLl9hY3RpdmVUcmlnZ2VyW3RdKXJldHVybiEwO3JldHVybiExfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZih0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LHBlKHRoaXMuZWxlbWVudCkuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSxGbi50eXBlQ2hlY2tDb25maWcodmUsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSx0Ll9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9cGUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKGJlKTtudWxsIT09ZSYmZS5sZW5ndGgmJnQucmVtb3ZlQ2xhc3MoZS5qb2luKCIiKSl9LHQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10Lmluc3RhbmNlO3RoaXMudGlwPWUucG9wcGVyLHRoaXMuX2NsZWFuVGlwQ2xhc3MoKSx0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LHQuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJihwZSh0KS5yZW1vdmVDbGFzcyhPZSksdGhpcy5jb25maWcuYW5pbWF0aW9uPSExLHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpLHRoaXMuY29uZmlnLmFuaW1hdGlvbj1lKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1wZSh0aGlzKS5kYXRhKHllKSxlPSJvYmplY3QiPT10eXBlb2YgbiYmbjtpZigodHx8IS9kaXNwb3NlfGhpZGUvLnRlc3QobikpJiYodHx8KHQ9bmV3IGkodGhpcyxlKSxwZSh0aGlzKS5kYXRhKHllLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbbl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK24rJyInKTt0W25dKCl9fSl9LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEFlfX0se2tleToiTkFNRSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlfX0se2tleToiREFUQV9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiB5ZX19LHtrZXk6IkV2ZW50IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTmV9fSx7a2V5OiJFVkVOVF9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiBFZX19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gU2V9fV0pLGl9KCkscGUuZm5bdmVdPVdlLl9qUXVlcnlJbnRlcmZhY2UscGUuZm5bdmVdLkNvbnN0cnVjdG9yPVdlLHBlLmZuW3ZlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmZuW3ZlXT1DZSxXZS5falF1ZXJ5SW50ZXJmYWNlfSxXZSksSm49KHFlPSJwb3BvdmVyIixLZT0iLiIrKEZlPSJicy5wb3BvdmVyIiksTWU9KFVlPWUpLmZuW3FlXSxRZT0iYnMtcG9wb3ZlciIsQmU9bmV3IFJlZ0V4cCgiKF58XFxzKSIrUWUrIlxcUysiLCJnIiksVmU9bCh7fSx6bi5EZWZhdWx0LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PjxoMyBjbGFzcz0icG9wb3Zlci1oZWFkZXIiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1ib2R5Ij48L2Rpdj48L2Rpdj4nfSksWWU9bCh7fSx6bi5EZWZhdWx0VHlwZSx7Y29udGVudDoiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSJ9KSx6ZT0iZmFkZSIsWmU9Ii5wb3BvdmVyLWhlYWRlciIsR2U9Ii5wb3BvdmVyLWJvZHkiLCRlPXtISURFOiJoaWRlIitLZSxISURERU46ImhpZGRlbiIrS2UsU0hPVzooSmU9InNob3ciKStLZSxTSE9XTjoic2hvd24iK0tlLElOU0VSVEVEOiJpbnNlcnRlZCIrS2UsQ0xJQ0s6ImNsaWNrIitLZSxGT0NVU0lOOiJmb2N1c2luIitLZSxGT0NVU09VVDoiZm9jdXNvdXQiK0tlLE1PVVNFRU5URVI6Im1vdXNlZW50ZXIiK0tlLE1PVVNFTEVBVkU6Im1vdXNlbGVhdmUiK0tlfSxYZT1mdW5jdGlvbih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9bj10LChlPWkpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSwoZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSkuX19wcm90b19fPW47dmFyIHI9aS5wcm90b3R5cGU7cmV0dXJuIHIuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0sci5hZGRBdHRhY2htZW50Q2xhc3M9ZnVuY3Rpb24odCl7VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKFFlKyItIit0KX0sci5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlwPXRoaXMudGlwfHxVZSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF0sdGhpcy50aXB9LHIuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciB0PVVlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChaZSksdGhpcy5nZXRUaXRsZSgpKTt2YXIgZT10aGlzLl9nZXRDb250ZW50KCk7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlPWUuY2FsbCh0aGlzLmVsZW1lbnQpKSx0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChHZSksZSksdC5yZW1vdmVDbGFzcyh6ZSsiICIrSmUpfSxyLl9nZXRDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudCIpfHx0aGlzLmNvbmZpZy5jb250ZW50fSxyLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKEJlKTtudWxsIT09ZSYmMDxlLmxlbmd0aCYmdC5yZW1vdmVDbGFzcyhlLmpvaW4oIiIpKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1VZSh0aGlzKS5kYXRhKEZlKSxlPSJvYmplY3QiPT10eXBlb2Ygbj9uOm51bGw7aWYoKHR8fCEvZGVzdHJveXxoaWRlLy50ZXN0KG4pKSYmKHR8fCh0PW5ldyBpKHRoaXMsZSksVWUodGhpcykuZGF0YShGZSx0KSksInN0cmluZyI9PXR5cGVvZiBuKSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBWZX19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBxZX19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRmV9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRlfX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gS2V9fSx7a2V5OiJEZWZhdWx0VHlwZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFllfX1dKSxpfSh6biksVWUuZm5bcWVdPVhlLl9qUXVlcnlJbnRlcmZhY2UsVWUuZm5bcWVdLkNvbnN0cnVjdG9yPVhlLFVlLmZuW3FlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFVlLmZuW3FlXT1NZSxYZS5falF1ZXJ5SW50ZXJmYWNlfSxYZSksWm49KGVuPSJzY3JvbGxzcHkiLHJuPSIuIisobm49ImJzLnNjcm9sbHNweSIpLG9uPSh0bj1lKS5mbltlbl0sc249e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sYW49e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sbG49e0FDVElWQVRFOiJhY3RpdmF0ZSIrcm4sU0NST0xMOiJzY3JvbGwiK3JuLExPQURfREFUQV9BUEk6ImxvYWQiK3JuKyIuZGF0YS1hcGkifSxjbj0iZHJvcGRvd24taXRlbSIsaG49ImFjdGl2ZSIsdW49J1tkYXRhLXNweT0ic2Nyb2xsIl0nLGZuPSIuYWN0aXZlIixkbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLGduPSIubmF2LWxpbmsiLF9uPSIubmF2LWl0ZW0iLG1uPSIubGlzdC1ncm91cC1pdGVtIixwbj0iLmRyb3Bkb3duIix2bj0iLmRyb3Bkb3duLWl0ZW0iLHluPSIuZHJvcGRvd24tdG9nZ2xlIixFbj0ib2Zmc2V0IixDbj0icG9zaXRpb24iLFRuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fZWxlbWVudD10LHRoaXMuX3Njcm9sbEVsZW1lbnQ9IkJPRFkiPT09dC50YWdOYW1lP3dpbmRvdzp0LHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fc2VsZWN0b3I9dGhpcy5fY29uZmlnLnRhcmdldCsiICIrZ24rIiwiK3RoaXMuX2NvbmZpZy50YXJnZXQrIiAiK21uKyIsIit0aGlzLl9jb25maWcudGFyZ2V0KyIgIit2bix0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5fc2Nyb2xsSGVpZ2h0PTAsdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub24obG4uU0NST0xMLGZ1bmN0aW9uKHQpe3JldHVybiBuLl9wcm9jZXNzKHQpfSksdGhpcy5yZWZyZXNoKCksdGhpcy5fcHJvY2VzcygpfXZhciB0PW4ucHJvdG90eXBlO3JldHVybiB0LnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93P0VuOkNuLHI9ImF1dG8iPT09dGhpcy5fY29uZmlnLm1ldGhvZD90OnRoaXMuX2NvbmZpZy5tZXRob2Qsbz1yPT09Q24/dGhpcy5fZ2V0U2Nyb2xsVG9wKCk6MDt0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpLm1hcChmdW5jdGlvbih0KXt2YXIgZSxuPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCk7aWYobiYmKGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKSksZSl7dmFyIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihpLndpZHRofHxpLmhlaWdodClyZXR1cm5bdG4oZSlbcl0oKS50b3ArbyxuXX1yZXR1cm4gbnVsbH0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlLl9vZmZzZXRzLnB1c2godFswXSksZS5fdGFyZ2V0cy5wdXNoKHRbMV0pfSl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe3RuLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxubiksdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub2ZmKHJuKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1sKHt9LHNuLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0KXt2YXIgZT10bih0LnRhcmdldCkuYXR0cigiaWQiKTtlfHwoZT1Gbi5nZXRVSUQoZW4pLHRuKHQudGFyZ2V0KS5hdHRyKCJpZCIsZSkpLHQudGFyZ2V0PSIjIitlfXJldHVybiBGbi50eXBlQ2hlY2tDb25maWcoZW4sdCxhbiksdH0sdC5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sdC5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sdC5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSx0Ll9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLG48PXQpe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmMDx0aGlzLl9vZmZzZXRzWzBdKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciByPXRoaXMuX29mZnNldHMubGVuZ3RoO3ItLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbcl0mJnQ+PXRoaXMuX29mZnNldHNbcl0mJigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX29mZnNldHNbcisxXXx8dDx0aGlzLl9vZmZzZXRzW3IrMV0pJiZ0aGlzLl9hY3RpdmF0ZSh0aGlzLl90YXJnZXRzW3JdKX19fSx0Ll9hY3RpdmF0ZT1mdW5jdGlvbihlKXt0aGlzLl9hY3RpdmVUYXJnZXQ9ZSx0aGlzLl9jbGVhcigpO3ZhciB0PXRoaXMuX3NlbGVjdG9yLnNwbGl0KCIsIik7dD10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCsnW2RhdGEtdGFyZ2V0PSInK2UrJyJdLCcrdCsnW2hyZWY9IicrZSsnIl0nfSk7dmFyIG49dG4oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQuam9pbigiLCIpKSkpO24uaGFzQ2xhc3MoY24pPyhuLmNsb3Nlc3QocG4pLmZpbmQoeW4pLmFkZENsYXNzKGhuKSxuLmFkZENsYXNzKGhuKSk6KG4uYWRkQ2xhc3MoaG4pLG4ucGFyZW50cyhkbikucHJldihnbisiLCAiK21uKS5hZGRDbGFzcyhobiksbi5wYXJlbnRzKGRuKS5wcmV2KF9uKS5jaGlsZHJlbihnbikuYWRkQ2xhc3MoaG4pKSx0bih0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKGxuLkFDVElWQVRFLHtyZWxhdGVkVGFyZ2V0OmV9KX0sdC5fY2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTt0bih0KS5maWx0ZXIoZm4pLnJlbW92ZUNsYXNzKGhuKX0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD10bih0aGlzKS5kYXRhKG5uKTtpZih0fHwodD1uZXcgbih0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSksdG4odGhpcykuZGF0YShubix0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHNufX1dKSxufSgpLHRuKHdpbmRvdykub24obG4uTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodW4pKSxlPXQubGVuZ3RoO2UtLTspe3ZhciBuPXRuKHRbZV0pO1RuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChuLG4uZGF0YSgpKX19KSx0bi5mbltlbl09VG4uX2pRdWVyeUludGVyZmFjZSx0bi5mbltlbl0uQ29uc3RydWN0b3I9VG4sdG4uZm5bZW5dLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdG4uZm5bZW5dPW9uLFRuLl9qUXVlcnlJbnRlcmZhY2V9LFRuKSxHbj0oSW49Ii4iKyhTbj0iYnMudGFiIiksQW49KGJuPWUpLmZuLnRhYixEbj17SElERToiaGlkZSIrSW4sSElEREVOOiJoaWRkZW4iK0luLFNIT1c6InNob3ciK0luLFNIT1dOOiJzaG93biIrSW4sQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitJbisiLmRhdGEtYXBpIn0sd249ImRyb3Bkb3duLW1lbnUiLE5uPSJhY3RpdmUiLE9uPSJkaXNhYmxlZCIsa249ImZhZGUiLFBuPSJzaG93Iixqbj0iLmRyb3Bkb3duIixIbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLExuPSIuYWN0aXZlIixSbj0iPiBsaSA+IC5hY3RpdmUiLHhuPSdbZGF0YS10b2dnbGU9InRhYiJdLCBbZGF0YS10b2dnbGU9InBpbGwiXSwgW2RhdGEtdG9nZ2xlPSJsaXN0Il0nLFduPSIuZHJvcGRvd24tdG9nZ2xlIixVbj0iPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlIixxbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LnNob3c9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYm4odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoTm4pfHxibih0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhPbikpKXt2YXIgdCxpLGU9Ym4odGhpcy5fZWxlbWVudCkuY2xvc2VzdChIbilbMF0scj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2lmKGUpe3ZhciBvPSJVTCI9PT1lLm5vZGVOYW1lP1JuOkxuO2k9KGk9Ym4ubWFrZUFycmF5KGJuKGUpLmZpbmQobykpKVtpLmxlbmd0aC0xXX12YXIgcz1ibi5FdmVudChEbi5ISURFLHtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9KSxhPWJuLkV2ZW50KERuLlNIT1cse3JlbGF0ZWRUYXJnZXQ6aX0pO2lmKGkmJmJuKGkpLnRyaWdnZXIocyksYm4odGhpcy5fZWxlbWVudCkudHJpZ2dlcihhKSwhYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmIXMuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ImJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocikpLHRoaXMuX2FjdGl2YXRlKHRoaXMuX2VsZW1lbnQsZSk7dmFyIGw9ZnVuY3Rpb24oKXt2YXIgdD1ibi5FdmVudChEbi5ISURERU4se3JlbGF0ZWRUYXJnZXQ6bi5fZWxlbWVudH0pLGU9Ym4uRXZlbnQoRG4uU0hPV04se3JlbGF0ZWRUYXJnZXQ6aX0pO2JuKGkpLnRyaWdnZXIodCksYm4obi5fZWxlbWVudCkudHJpZ2dlcihlKX07dD90aGlzLl9hY3RpdmF0ZSh0LHQucGFyZW50Tm9kZSxsKTpsKCl9fX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Ym4ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LFNuKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2FjdGl2YXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9KCJVTCI9PT1lLm5vZGVOYW1lP2JuKGUpLmZpbmQoUm4pOmJuKGUpLmNoaWxkcmVuKExuKSlbMF0sbz1uJiZyJiZibihyKS5oYXNDbGFzcyhrbikscz1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxyLG4pfTtpZihyJiZvKXt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChyKTtibihyKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9ZWxzZSBzKCl9LHQuX3RyYW5zaXRpb25Db21wbGV0ZT1mdW5jdGlvbih0LGUsbil7aWYoZSl7Ym4oZSkucmVtb3ZlQ2xhc3MoUG4rIiAiK05uKTt2YXIgaT1ibihlLnBhcmVudE5vZGUpLmZpbmQoVW4pWzBdO2kmJmJuKGkpLnJlbW92ZUNsYXNzKE5uKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9aWYoYm4odCkuYWRkQ2xhc3MoTm4pLCJ0YWIiPT09dC5nZXRBdHRyaWJ1dGUoInJvbGUiKSYmdC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCEwKSxGbi5yZWZsb3codCksYm4odCkuYWRkQ2xhc3MoUG4pLHQucGFyZW50Tm9kZSYmYm4odC5wYXJlbnROb2RlKS5oYXNDbGFzcyh3bikpe3ZhciByPWJuKHQpLmNsb3Nlc3Qoam4pWzBdO2lmKHIpe3ZhciBvPVtdLnNsaWNlLmNhbGwoci5xdWVyeVNlbGVjdG9yQWxsKFduKSk7Ym4obykuYWRkQ2xhc3MoTm4pfXQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCl9biYmbigpfSxpLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJuKHRoaXMpLGU9dC5kYXRhKFNuKTtpZihlfHwoZT1uZXcgaSh0aGlzKSx0LmRhdGEoU24sZSkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7ZVtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19XSksaX0oKSxibihkb2N1bWVudCkub24oRG4uQ0xJQ0tfREFUQV9BUEkseG4sZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHFuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChibih0aGlzKSwic2hvdyIpfSksYm4uZm4udGFiPXFuLl9qUXVlcnlJbnRlcmZhY2UsYm4uZm4udGFiLkNvbnN0cnVjdG9yPXFuLGJuLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGJuLmZuLnRhYj1Bbixxbi5falF1ZXJ5SW50ZXJmYWNlfSxxbik7IWZ1bmN0aW9uKHQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeS4galF1ZXJ5IG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIEJvb3RzdHJhcCdzIEphdmFTY3JpcHQuIik7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT09ZVswXSYmOT09PWVbMV0mJmVbMl08MXx8NDw9ZVswXSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCIpfShlKSx0LlV0aWw9Rm4sdC5BbGVydD1Lbix0LkJ1dHRvbj1Nbix0LkNhcm91c2VsPVFuLHQuQ29sbGFwc2U9Qm4sdC5Ecm9wZG93bj1Wbix0Lk1vZGFsPVluLHQuUG9wb3Zlcj1Kbix0LlNjcm9sbHNweT1abix0LlRhYj1Hbix0LlRvb2x0aXA9em4sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7DQovLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAubWluLmpzLm1hcAkJ"></script> <div id="nav-menu" class="container all-height-fcsi-header-height position-fixed right-0 left-0 z-index-1"><div class="row h-100 all-width-outer-horizontal-bounds m-auto"><div class="col pt-0 h-100 all-width-fcsi-header-logo d-flex align-items-center"> <a href="https://fletchercsi.com" class="nav-menu-link"><div class="row fletcher-logo h-100"><div class="col fletcher-icon all-width-fit-content"> <img src="https://fletchercsi.com/wp-content/uploads/2023/03/FletcherCSI_Logo-Mark_White.png" alt="Fletcher/CSI - Global Strategy Consulting Firm" class="logo-file" /></div><div class="col fletcher-branding"><div class="row h-66"><div class="col h-100"> <span class="fletcher-name"> FLETCHER </span></div></div><div class="row h-33"><div class="col d-flex flex-column justify-content-end h-100"> <span class="fletcher-tagline"> COMPETITIVE. STRATEGIC. INSIGHT. </span></div></div></div></div> </a></div><div class="col"><div class="row h-33 justify-content-end portal-login-parent"><div class="col all-width-fit-content dropdown"><div class="row h-100"><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> LiveInsights<sup>tm</sup> Win/Loss Portal - <b>Login</b></div></div></div> </a></div></div></div></div><div class="row h-66 justify-content-end links-parent"><div class="col all-width-fit-content nav-menu-item parent active"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div><div class="col all-width-fit-content align-items-center mobile-toggle-parent"> <button id="mobile-nav-menu-toggle" type="button" expanded="false"> <i class="fa fa-bars burger" aria-hidden="true"></i> <i class="fa fa-times x-icon" aria-hidden="true"></i> </button></div></div></div></div><div id="mobile-nav-menu" class="row"><div class="col"><div class="container"><div class="row mobile-nav-menu-item parent winloss-portal d-none"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center justify-content-end"><div class="col all-width-fit-content color-fcsi-primary-green"> LiveInsights<sup>tm</sup> Win/Loss Portal Login</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CgkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFRvcCgpIHsKCQkJCQlyZXR1cm4gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFN0YXRlKHBhc3NlZF9zY3JvbGxfdG9wKSB7CgkJCQkJdmFyIG5ld19zY3JvbGxfc3RhdGUgPSAiIjsKCgkJCQkJaWYgKHBhc3NlZF9zY3JvbGxfdG9wID09IDApIHsKCQkJCQkJLy8gU2Nyb2xsZWQgdG8gdG9wIG9mIHBhZ2U6CgkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJfSBlbHNlIGlmIChwYXNzZWRfc2Nyb2xsX3RvcCA8IDEyNSkgewoJCQkJCQkvLyBTY3JvbGxlZCBkb3duIGJ1dCBsZXNzIHRoYW4gMTI1IHB4OgoJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQl9IGVsc2UgaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPiBwYXNzZWRfc2Nyb2xsX3RvcCkgewoJCQkJCQkvLyBTY3JvbGxlZCB1cDoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGx1cCI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gU2Nyb2xsZWQgZG93bjoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGxkb3duIjsKCQkJCQl9CgoJCQkJCXJldHVybiBuZXdfc2Nyb2xsX3N0YXRlOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKHBhc3NlZF9uZXdfc2Nyb2xsX3N0YXRlKSB7CgkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gcGFzc2VkX25ld19zY3JvbGxfc3RhdGU7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5jc3MoJ29wYWNpdHknLCAnMS4wJyk7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5hdHRyKCdzY3JvbGwtc3RhdGUnLCBwYXNzZWRfbmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQl9CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJLy8gVmFyaWFibGVzOgoJCQkJLy8gRE9NOgoJCQkJbGV0ICRtYWluX25hdl9tZW51X2RpdiA9ICQoZG9jdW1lbnQpLmZpbmQoJyNuYXYtbWVudScpOwoJCQkJbGV0ICRtb2JpbGVfbmF2X21lbnUgPSAkKGRvY3VtZW50KS5maW5kKCcjbW9iaWxlLW5hdi1tZW51Jyk7CgkJCQlsZXQgJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbiA9ICQoZG9jdW1lbnQpLmZpbmQoJ2J1dHRvbiNtb2JpbGUtbmF2LW1lbnUtdG9nZ2xlJyk7CgoJCQkJLy8gQ3VzdG9tOgoJCQkJd2luZG93LmRvbV9oYXNfbG9hZGVkID0gZmFsc2U7CgoJCQkJLy8gU3RhdGVzOgoJCQkJLy8gQ2hlY2sgZm9yIERPTSBsb2FkZWQgc3RhdGU6CgkJCQl2YXIgdGltZW91dElEOwoKCQkJCWxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsKCQkJCQltdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKCQkJCQkJbGV0IG9sZFZhbHVlID0gbXV0YXRpb24ub2xkVmFsdWU7CgkJCQkJCWxldCBuZXdWYWx1ZSA9IG11dGF0aW9uLnRhcmdldC50ZXh0Q29udGVudDsKCQkJCQkJaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgewoJCQkJCQkJaWYgKCF3aW5kb3cuZG9tX2hhc19sb2FkZWQpIHsKCgkJCQkJCQkJY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7CgkJCQkJCQl9CgoJCQkJCQkJdGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJCQl3aW5kb3cuZG9tX2hhc19sb2FkZWQgPSB0cnVlOwoKCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfdG9wID0gZ2V0U2Nyb2xsVG9wKCk7CgkJCQkJCQkJaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQkJCQl9CgoJCQkJCQkJCW9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUod2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlKTsKCQkJCQkJCX0sIDI1MCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0pOwoKCQkJCW9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgewoJCQkJCWNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZSwKCQkJCQlzdWJ0cmVlOiB0cnVlLAoJCQkJCWNoaWxkTGlzdDogdHJ1ZSwKCQkJCQljaGFyYWN0ZXJEYXRhOiB0cnVlCgkJCQl9KTsKCgkJCQkvLyBTZXQgdGltZW91dCBmb3Igb3V0ZXIgYm91bmQgdGltZSBoYW5kbGluZzoKCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCXdpbmRvdy5kb21faGFzX2xvYWRlZCA9IHRydWU7CgoJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBnZXRTY3JvbGxUb3AoKTsKCQkJCQlpZiAod2luZG93LmN1cnJlbnRfc2Nyb2xsX3RvcCA9PSAwKSB7CgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF9zdGF0ZSA9ICJwYWdldG9wIjsKCQkJCQl9IGVsc2UgewoJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCX0KCQkJCQl1cGRhdGVTY3JvbGxTdGF0ZSh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUpOwoKCQkJCQlvYnNlcnZlci5kaXNjb25uZWN0KCk7CgkJCQl9LCA1MDApOwoKCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCS8vIEhhbmRsZSBwYWdlIHNjcm9sbGluZyBmb3IgbmF2IHN0eWxpbmc6CgkJCQkkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKHdpbmRvdy5kb21faGFzX2xvYWRlZCAmJiAhd2luZG93LmhvbWVfcGFnZV9zcGxpZGVfbW92aW5nKSB7CgkJCQkJCWxldCBuZXdfc2Nyb2xsX3RvcCA9IGdldFNjcm9sbFRvcCgpOwoJCQkJCQlsZXQgbmV3X3Njcm9sbF9zdGF0ZSA9IGdldFNjcm9sbFN0YXRlKG5ld19zY3JvbGxfdG9wKTsKCgkJCQkJCWlmICh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgIT09IG5ld19zY3JvbGxfc3RhdGUpIHsKCQkJCQkJCWlmICgoJChkb2N1bWVudCkuZmluZCgnLm5hdi1tZW51LWl0ZW0ucGFyZW50OmhvdmVyJykubGVuZ3RoICE9IDApIHx8ICgkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uLmF0dHIoJ2V4cGFuZGVkJykgPT0gInRydWUiKSkgewoJCQkJCQkJCS8vIFVzZXIgSVMgaG92ZXJpbmcgb3ZlciBuYXYgaXRlbToKCQkJCQkJCQlpZiAobmV3X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInBhZ2V0b3AiOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCQkJCX0KCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCS8vIFVzZXIgaXMgTk9UIGhvdmVyaW5nIG92ZXIgbmF2IGl0ZW06CgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBuZXdfc2Nyb2xsX3RvcDsKCQkJCQl9CgkJCQl9KTsKCgkJCQkvLyBIYW5kbGUgYSBjbGljayBvbiAkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uOgoJCQkJJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5hdHRyKCdleHBhbmRlZCcpID09ICJmYWxzZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5hZGRDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAidHJ1ZSIKCQkJCQkJfSk7CgoJCQkJCQkkKGRvY3VtZW50KS5maW5kKCdib2R5JykKCQkJCQkJCS5hZGRDbGFzcygnbm9zY3JvbGwnKTsKCQkJCQl9IGVsc2UgaWYgKCRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cignZXhwYW5kZWQnKSA9PSAidHJ1ZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5yZW1vdmVDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAiZmFsc2UiCgkJCQkJCX0pOwoKCQkJCQkJJChkb2N1bWVudCkuZmluZCgnYm9keScpCgkJCQkJCQkucmVtb3ZlQ2xhc3MoJ25vc2Nyb2xsJyk7CgkJCQkJfQoJCQkJfSk7CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJfSk7CgkJ"></script> <footer><div id="site-generator"><div class="wrapper background-transparent"><div class="container m-auto height-180px all-width-outer-horizontal-bounds"><div class="row h-100 w-100 flex-nowrap footer-parent-row"><div id="footer-content" class="col"><div class="row h-100"><div class="col-auto px-0 d-flex align-items-center"> <a href="#" class="logo opaque-on-hover"> <img src="https://fletchercsi.com/intelligence/wp-content/uploads/2022/08/fletcher-footer-logo-500.png" alt="Fletcher Global Strategy Consulting Firm" alt="Fletcher Logo" /> </a></div></div></div><div id="footer-nav" class="col-auto width-unset"><div id="bottom-nav" class="row h-100 align-items-center justify-content-center flex-nowrap"><div class="col-auto height-fit-content px-26 white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/">Home</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about/#company">About</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#careers">Careers</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/contact/">Contact</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#privacypolicy">Privacy Policy</a></div></div></div><div id="socials" class="col width-unset background-transparent"><div class="row h-100"><div class="col m-0 p-0 h-100 links-col"><div class="row h-100 w-100 align-items-center justify-content-end flex-nowrap"><div class="col-auto px-0"> <a href="https://www.linkedin.com/company/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-linkedin" aria-hidden="true" alt="Find Fletcher CSI on LinkedIn"></i> </a></div><div class="col-auto px-0"> <a href="https://twitter.com/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-twitter" aria-hidden="true" alt="Find Fletcher CSI on Twitter"></i> </a></div><div class="col-auto px-0 last"> <a href="https://vimeo.com/user114140327" target="_blank" class="pr-0 opaque-on-hover color-black"> <i class="fa fa-vimeo" aria-hidden="true" alt="Find Fletcher CSI on Vimeo"></i> </a></div></div></div></div></div></div></div></div></div></footer>