CINXE.COM

Technology - Fletcher - Global Competitive 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>Technology - Fletcher - Global Competitive Insights</title><link rel="canonical" href="https://fletchercsi.com/industries/technology/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="Technology - Fletcher - Global Competitive Insights" /><meta property="og:url" content="https://fletchercsi.com/industries/technology/" /><meta property="og:site_name" content="Fletcher - Global Competitive Insights" /><meta property="article:modified_time" content="2023-04-28T19:01:20+00:00" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:label1" content="Est. reading time" /><meta name="twitter:data1" content="8 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://fletchercsi.com/industries/technology/","url":"https://fletchercsi.com/industries/technology/","name":"Technology - Fletcher - Global Competitive Insights","isPartOf":{"@id":"https://fletchercsi.com/#website"},"datePublished":"2023-01-24T18:38:00+00:00","dateModified":"2023-04-28T19:01:20+00:00","breadcrumb":{"@id":"https://fletchercsi.com/industries/technology/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://fletchercsi.com/industries/technology/"]}]},{"@type":"BreadcrumbList","@id":"https://fletchercsi.com/industries/technology/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://fletchercsi.com/"},{"@type":"ListItem","position":2,"name":"Industries","item":"https://fletchercsi.com/industries/"},{"@type":"ListItem","position":3,"name":"Technology"}]},{"@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 &raquo; Feed" href="https://fletchercsi.com/feed/" /><link rel="alternate" type="text/calendar" title="Fletcher - Global Competitive Insights &raquo; 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&#038;display=swap&#038;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 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/2579" /><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/?p=2579' /><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%2Findustries%2Ftechnology%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%2Findustries%2Ftechnology%2F&#038;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="page-template page-template-php page-template-dynamic-industry-page page-template-phpdynamic-industry-page-php page page-id-2579 page-child parent-pageid-12 wp-embed-responsive tribe-no-js slug-technology 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 menu-item-25"><a href="https://fletchercsi.com/">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 current-page-ancestor current-menu-ancestor current-menu-parent current-page-parent current_page_parent current_page_ancestor 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 current-menu-item page_item page-item-2579 current_page_item menu-item-3999"><a href="https://fletchercsi.com/industries/technology/" aria-current="page">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 topheavy" role="main"><article id="post-2579" class="post-2579 page type-page status-publish hentry"><div class="entry-container"><div class="entry-content"> <script defer src="data:text/javascript;base64,DQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoJCkgew0KCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVESVQgQ09QWSBIRVJFIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NCgkJd2luZG93LmR5bmFtaWNfcGFnZV90aXRsZSA9ICJUZWNobm9sb2d5IjsNCg0KCQl3aW5kb3cuZHluYW1pY19oZXJvX2ltYWdlX3VybCA9DQoJCQkiaHR0cHM6Ly9mbGV0Y2hlcmNzaS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDkvaW50ZWxsaWdlbnQtc29sdXRpb25zLTE5MjAuanBnIjsNCg0KCQl3aW5kb3cuZHluYW1pY19oZXJvX2ltYWdlX2NvcHkgPQ0KCQkJIkluIHRoZSBmYXN0LXBhY2VkIHRlY2ggaW5kdXN0cnksIGlubm92YXRpb24gYW5kIGNvbXBldGl0aXZlIG1vbml0b3JpbmcgYXJlIGNydWNpYWwgZm9yIHN0YXlpbmcgYWhlYWQuIFRlY2hub2xvZ3kgZmlybXMgbXVzdCBiZSBhZ2lsZSB0byBzY2FsZSBmYXN0IGFuZCBwaXZvdCBmYXN0ZXIuIEZsZXRjaGVy4oCZcyB0ZWNoIHRlYW0gYXJlIGV4cGVydHMgaW4gY29tcGV0aXRpdmUgaW50ZWxsaWdlbmNlLCBoZWxwaW5nIHRlY2ggY29tcGFuaWVzIGZyb20gRm9ydHVuZSA1MDAgdG8gc3RhcnR1cHMgZGV0ZXJtaW5lIHRoZSBiZXN0IGFjdGlvbnMgdG8gb3V0bWFuZXV2ZXIgY29tcGV0aXRvcnMuIFRocm91Z2ggdmFyaW91cyBzZXJ2aWNlcyBsaWtlIHByaW1hcnkgcmVzZWFyY2gsIFdpbi9Mb3NzLCBzYWxlcyBlbmFibGVtZW50LCBwcm9kdWN0IG1hcmtldGluZywgYW5kIG1vcmUsIHdlIHByb3ZpZGUgYWN0aW9uYWJsZSBpbnNpZ2h0cyB0byBlbmFibGUgbWFya2V0IGRvbWluYW5jZSBhbmQgZ3Jvd3RoLiI7DQoNCgkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5ID0gew0KCQkJIlNhbGVzIEVuYWJsZW1lbnQiOiB7DQoJCQkJc3ViX3NlcnZpY2VzX2FycmF5OiBbDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAiV2luL0xvc3MgQW5hbHlzaXMiLA0KCQkJCQkJaW5mb3JtYXRpb246DQoJCQkJCQkJIk9uZS1vbi1vbmUgaW50ZXJ2aWV3cyB0byB1bmNvdmVyIHRoZSBvdXRjb21lcyBvZiBjbG9zZWQgb3Bwb3J0dW5pdGllcyBhbmQgdHJlbmRzIHRoYXQgZHJpdmUgd2lucyBhbmQgbG9zc2VzLiBVbmNvdmVyaW5nIHRoZSDigJhXaHknIHRvIGltcHJvdmUgc2FsZXMgZW5nYWdlbWVudHMgYW5kIGNvbXBldGl0b3IgaW5zaWdodHMgdG8gaW5jcmVhc2UgeW91ciByZXZlbnVlIGFuZCBjbG9zZSByYXRlcyIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRU0wbEVRVlI0bk8xYVcwZ1VZUlQrMWkwTHNudEcyWVdpQy9Xc1JJU1IySVhLcUNpcWw2U3R0K2loaTBKRTJRVXJqWHJRb3Q2S3dvSUtIOEplS2d1cDlDR2xDTHNaVkNhNVFZUmlrVkdSYnZ6d0xSeTIzWjJSK1dmbUYrYURnZVg4NXovbk80ZXpNK2Y4TTBDQUFBRUNEQXpyQWJ3QzBBY2dadGpWUjI2S295dklOVFR3WklsWTRFWUNxdW5nTklBUXpFTUdnRFBrV09XR2c4czBIb0c1aUpDajRxb2RwM3dxNmNlQ1E1UEYrZ0hLRkZmdDJPTlRBaDRKRG8wVzYyY3BVMXkxWXpPTjE4SmMxSkxqSmlkR3NnRWNCdEFNb0FkQUYzOWZwM0ZWaHFZaVhpRTN5TG1MTVR3QlVBWmdncFdCdGR5VXJpUS93Rnk4dCtEZXhSaVRvZ2pBWHlyZUJiQVJ3R1JtYlNtQU9xNzk0aVBITklUSkxVYXVoZVN1S25vbGdIdGNVekd1VHR3OERrQTNGY3JUT09ta3pqUU5oTE5abXZJdTdnVFR5ZTFUaW5YVnV4d1hsVEJXTGg3aHdoMkxKdWNCOVpab0NMNVZsS1lPRk5KV2ZScWRFS3RiNlIyU0MwOHBYR2JoNUR6MWRtc01YbGNDOXRIV09RdTk1ZFJybHNKdkZJNjAyTHlEZWpVT2lEYlR4a3ZOQ2JoR1c5c3M5RVpUcjBjS2YxQTR3bUx6Zk9xOWMwQlUvZWRiQUV6VW5JQjIycHByb1pkRnZlOVMrSUxDZkl2TjZqLzBsYnF6bkhQV2xvQTV0UFBGeHFDMm1MclBwYkJTTkJCV3FLSHVUcGlUZ0YyMGM4V0c3azNxbnBEQ0hBQzlvbzlPbDhVdDFGTlBCRk1TMEdDakJRNkplVWI5NVNjbEtoUUxRdlZwL2c2akFQeGtRL0dmRVI4U2tNTkRrTjRVTi9FUVk2a1gvcmFtTWxZc25nanFhZ053Rk1CQ2RscUpkOXhTQXhLd256YXVDbG1ZbkJYM3Q4SlBUN3JnNDFEdDR6RUFINVAwMGFyRlBNaHVNY2JlTzhQSEJJUUZ6M0p5cTBzeXo3UXpwdkVETVo0Qm9BREFoWVFzSmw0cGh3c1BFckFoRGE4MmNpL1FOYnRNWmZsVWMreU16dzR0RHM0SW5TUkErWHpHL2Qza1ZFV09pcXZyR0E2Z2d3VFcrSkNBZGR6YlFTNitZRHRKdkFZdzFNTUVLRjl2YkxhK3JpSXNldnE5SGlhZ2xQdFVFb2JBWjZ3QTBNL2Vlc1lBenUxaUZnZWNxVENUdnZvNTJSbUJTd3lnd2NZZDkxYWFCRHkwMkpzaHVyNkxNQWhqQUVSSnJNUkZQeVgwRWFWUG8xREVzdndOSU04RiszbTAzVTlmUnFKYW5CZW9tVUVYc3RqWXVQYmVUeGVHaWViRXptaHRGL0VSdk5YUFo3NWR6T1pkV3Rjek9pSkcySGtZSklob0lxMDdtWjZpeG1IWnV2VjM4Z3haWW9xc011aUc2aWx5eGFOTERTOTJzWXA3L3ZCZ1kxQ2pWSXlzNnZXVkZhYUlrMmMzbXlyUG9PYjIyNkxWbFVkcnlWcmQrelpmMHcwcVpBUDR6TURVZS9wVUtCUG4rMDRQWEQxRkpyL0xpUWZwNWhYbGV3emwweGhVZWhCNDRsVUJneEFscVVVZStNb1hsV0FNWWc1UGQwMzNOMkJDVFVtKy9OQXBNejRCc1NRRWRjcUNCTUR3Q21oTWNzQ3BVMlo4QXR4R2tBRDRYQUdaSG5aK1JuYUdsUVlFN210bkdQV3c4ek95TTR6YS9Lck1DOFMvK2xLZjhYcUdDZ05LUHZFNjZXVUNNcG1FZUNYNGVYVXllS1BHNHdBQkFzQjQvQU1Hc3ZjcVFiY3FUd0FBQUFCSlJVNUVya0pnZ2c9PSI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICJSZW5ld2FsIEludGVsbGlnZW5jZSIsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQkiSW50ZXJ2aWV3cyB3aXRoIGN1cnJlbnQgY3VzdG9tZXJzIHRvIGlkZW50aWZ5IGFyZWFzIG9mIGltcHJvdmVtZW50IG9yIHN0cmVuZ3RocyBvZiBjdXN0b21lciBzdWNjZXNzIHRlYW1zIHRvIHVuZGVyc3RhbmQgZHJpdmVycyB0aGF0IHJlZHVjZSBjaHVybiwgZ3JvdyByZWN1cnJpbmcgcmV2ZW51ZSwgYW5kIGJ1aWxkIHN0cm9uZ2VyIHJlbGF0aW9uc2hpcHMiLA0KCQkJCQkJaWNvbl9pbWdfaHRtbDoNCgkJCQkJCQknPGltZyBkZWNvZGluZz0iYXN5bmMiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUlPa2xFUVZSNG5PMWFhMnhWUlJEK1dsb3N0SXIxUWFHdHdRY2lJb0lpQ2xVSUlrS2dJaG9GeExmeVVER29VUkpGSlZINWd5S29NUlFSTklvSWdvQUpFUkVSdzZNaUNtSjhvSkdIU2xzczBQSXNJQXFGWTRaOFM0Ymw3TDE3N3kzcXJmMlNrL2J1enU3T3pKblpuWms5UUIzcVVJZi9Pd29CYkFSUUN1QkcxSDZJakdVQWZnUFFDL3dSOEtrR2NDOXFMd1pSUmlOdmlUUlc4TWViL0hzWXdCT29mWGlTc21sWnQwckhiUDY0SDhCREFBN3g5eFFBSnlINWtRRmdLbVVTMllZQmVJQy9aNEdDQjFTRW9BK0FLcmF0QkhEaFA4QmtBd0RMQVJUWDhMeXRBS3lpTENMVDlXeWZ3N2I3NUVjKy9XS25ldU1YQS9pRlJQc0JqQUNRaGhPRGN3SE1VMzVaRTBpanlmL0pPVVdXMXNvaWRsSG1YRFBnWXhMMlZaT2NET0ExNVRmZkFPaGVRd3llRG1BY2dISWxlRTBwb0FkNU5mdlpCTXBpY0F2NzV1dEIvZG00S0dUQ3Jzb2E1RmtLNEFZQXFYRXllSTUxOGxRQ2VDZEJCYVR5ZUZ1bTV0a0E0T29RMmlYczc2Y2J4ZlEzczZOenlDQXhtK0VBdHFrRjF0R0hwTThIelFHOHJVNmRRSnRnbkFySUlBL3JMSVUrNXVDckMybkt3emI0WWV4Y0FhQ2VZOEVzMHExWEMyN21IdEV3QXFPWEFOaHRtYnE4TGNTcGdJWmMwN3kwZ0R3SmI1bU9NU0xUbDZSOU1JeWdQb0ExSkpBTkpKcko5Vk03ckR5L01xb013N2Vra2Vpcm80UEdWd0dGWE12UXIrTGVGYzBsbnliOTl3RFNYVVNYQXpnSTRDK0gvNFNoRzREVmlxR1pBRTZ4YUphclNQUEkwUk9IQWhweGJrTzNtbXY3NEJvQUJ5amJaZEdJSCtVQ1lyTHRQUmNRODNwRXhROC9BMmhwSFV1amxCSTZ4cWdBT2MvWEtyNGVqdUNtTnE1UWZNazRMMHprZ0cwOEJYeHh0anFDaE5FQ3EvOGw5bjBZZ3dLdVV2dkhhcTZCR043OGRvNHRpa1RZbTltZzdJNWpxZkVKSENobTh6aUFsQmcycUJsS0NSMVVYdzdiaFNrZkJYUlF3azlueE9pREZHNlMxVXI0VmlyMktLWE1SN0VwSkNENURzQU85WHVoaXFhaW9aNkt2N2NBeUdON25wcFBmTnJnMUpDak1ZOWpBOFlKdm5GSGE4WXpacjRkbE1XV1QyS1JvekFSbWJ6cHlReUw3UUhHZjhVOUduc3F3VEN5bUR2dlhEVlhXMFY3cVdxZnl4TnBxUXJPZlB5OU1YblQ2VzVnS1dJU1pRejQwbzlpQkJ0bHR3YURoT3NBakdIa0pIbnpQalZaaWFkTE5GRnY4UWVMb1djVTNiTlduNkhkd2ptaUlZVm1iY2J2STQ5TEtFTWhsU3I0Z2pUSHBQeVppbEVKaTExb0ErQjlSblFHdHdFWUNhQ2RReW0zS3NiRW40Y3lScGVJclNtZlNyWU50UUttQVE1aDIzRk5tZHRnQ25rVEhsMFlvQlI3WE1BMFJKbEtDL2hEaDhmR2dqUXVZSi9FRnAzWU5sM3Q2aWFHbU1hK3pxUU5PTmJHQ3JXZWhOVythS2xjZTdDTGFBNEpTbU9vQTdTbjcyMXk1UE92Y003bnJVMVB4KzlyMldid0F0dGxySTNQdWRiRUdPS1VWaW9CTzFJRWNhR0J5cGIyTUdZMnZoTXZqS0JTWTlESVk4RmxwWlVVZ1dac0FxcEVVSi81d1Y2MUdUZndPY2VucXJlemtXOVBhZ0hOb2lROVlkalBlU1NSOGtVV3gvd1I0MW9OeVdOM1dsR0prbU5xTEx4bldwcXpIMjNxeFk1Mmc2b0VGQ0JqYmJqVzArMkJkU0pFeWhLUFFhR1ZZdXFuVkIySHl4d0wyeWt1VkF3djlRQmZuQi9CQlZ6ckZhdmpUeCtKK2hIWmVrWmFlSVBTV2huOXM0akZSTi9rdzhabm5QT21HTWIwNVpoUDQxeXpIbmt1WXJwY3B1SVkyWk9jMkVpaXQrTHdkUmVlNDV5dnhqQm1QTWRJZ0ZRVHlHVHNFckNXNEVSdnBTa3BYdHpsR1lPbnN0ajRZMGdzMEVsRmo3NXptU1BMeEEwR3k3bEdmODlJVk9hNlc3M1l2WXh3STZLTlZlRDRuVytrSjB2b3BwYldsRUhMS0RMbENvYnlWWjlQYW4ydG9zOExVWURwVzBQcjZreGVRTjd5ZWVjM25yd2IrcTlEanVLSVBpVDNhRDg1TnBPd3A0d1JsbjEvWUpJUGZma1NDUjhvZWluRWFxUnhEVjFWanZiSXl4a1k3eDZXQXVCSytxKzVNak0xZ2dvV0dZdDQ3cVk3d2s5ekRBYk0xR1NIZDZHRnRjNXVSemljenZwL0VYbW9JRTltM0NIeVhCQkRIY09KWGt4V3pPUXpyVncrVWw1dTZneFNJSG1QLzh0ZkYyWW9Hdk4vbVdjZG9oR1RJY05uWmJRanp4ZEdpR0xQSW1RV0s3RDdWZmlaUld1b1p0WVhWaE1zWUY4MWFiTTROdUJjVDNrR1U5MllMNWpZSldHVUsxOGF6VTFLd3Mxc21sY1dnNXkrTEtQdEl2MWhGaURNcG5rYUs3TUJjM0p0bWlrcVR6OUFXdkJ5WTVLNm50dkpOVzRHY0I3WFRpRXZ6Y2piYUxVcHl5YVlNUHBZdHprK3orS1FzdnBBaStaMjFYZUgxU2UwR2wxVmt1YjdWS2piNElTUnhtdWxNU3hSbGJCdWNJaFpvMFNRQzJpbXJvS0V1WUJkcW55ME1RdWxwcVpnN3ZhRU5neHR1Y1luWEhNUGVkakJzMzRSZWV4eUFtK3o0NEl4ZjltcHoyQ0lhM0x6V2Z4Zm1EK1ROTm9OL2hQb3g1cStqdVJTUW01OXhTL0RZTXhmM2h6b3I3cjBWY1Uya0NiTURReWFjeTBOelplYzl5OWJWLzBKSVZVZGczbktKNlZzZFkraUsyTzlQeU9DK2V0U1ZBK2E4WHJydTRQQkVkd2dnK2F1ZC9lQmRJVUNxL1JlbWNBVi9uRlhTM1lTTVp4dGNvbGlZSFplKys0dG04bzZTQlAzK1hqQ3VJSDhyOUZlaGNFRzQ5Z21WK0oyVml0M25haUpRQ2dBOEtKcUc4azJ5UU1NM21XYjdPaVJ6TjhIQ3gxdWNDZmJaUzBEYytjb1BCbU1aVnVOQkVLQ2k2eFF0NURtM3QzNkJ1QU43dXJSekQ4YWhqamNvQW5Ya0xXMEsyMDNIejBTNmVUNVgwZDJqT2J2NHdaSmhVRjhreElqeEFxWEd5UVZGbEFJVVVTc2NMbEIwaUE3VHZPdk5XNHdLSTdkdjFhNXdYd3lMNmFzOFJYdjkrRFJQaVRzbzhaa1FSV1p0Nis5VFBnTGovWmNsUVluSFNwREZKRGpvWUNja0lMcWtjL2FrdzNUeVB4SEZDUXZ5a2ZSZ2ZxQUtwZGo1cXRQWkpJT1RTSmNzMFZTZ1Axc0RTbVBKdzFhc0JSZVNVRW1xMXE5dkdHRHM5aTJpYUh1Vm82WkhhV0tuSlI0bmNMT294THk2U1lCUDgrdjljaHh1RWE1NTlkbnRRSzUvRTVvTjZ2STAwS095enJVb1E1MXdJbkczMEcrWGRmRGs2bWNBQUFBQUVsRlRrU3VRbUNDIj4nLA0KCQkJCQl9LA0KCQkJCQl7DQoJCQkJCQl0aXRsZTogIlZvaWNlIG9mIEN1c3RvbWVyIiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJJbmRpdmlkdWFsIG9uZS1vbi1vbmUgaW50ZXJ2aWV3cywgcGFpcmVkIHdpdGggc3VydmV5cywgdG8gYnJpbmcgY2xpZW50cyBpbnNpZ2h0cyBvbiBjdXN0b21lcnMgcHVyY2hhc2luZyBiZWhhdmlvciBhbmQgYXNzZXNzbWVudCBvZiB0aGUgcGVyY2VwdGlvbiBvZiB2ZW5kb3JzIGluIHRoZSBtYXJrZXRwbGFjZSIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRXEwbEVRVlI0bk8yYlc4Z1ZWUlRIZndkTmpiSlB3eWdyTWpDaVVyR2tsd2dqMFVqdEl2VlFsbW5hMTBQYWc5SVYxSVI2S0xvWVZxZ1JoVjJVaUNqRWZLa3M4MUo0N1lKR2FFVlNKdlIxTXhVMVB6K05CZitSelRSbnpweHpaczlzOWZ4Z0hzN3NOWHV0dmZhZXRmZGVzdysweUpXZVFGOWRGVTV3QmdEM0E0dUJyY0JlNEtoemRRSTdnVlhBUE9BMm9JMFRvSWNuQXV0aWpZMnVmNEcvZENXVkh3S1dBVGNjYnlPa0F0d0o3SEFhOHlld0JKZ0NYQUdjSG51bWgwYkpHR0Eyc0FZNDdEei9KWEFkeHdIbkFTc2N3emZKR2RiQWV1a3ZaL3ptMUxjSU9JTkF1Vlk5YlliK0N0eVIwOUMxMGZLNFhobXIrMXRnSUlGeE8zQlFCaTRGK21WODdsSGdrWXl5UTRIdnBXTVhjREdCY0tPaXVCbjJiSlZlcnlnR3pJM2Q3OUs3N3ZLOFpvc2t6Z1Mra0s2ZmdiTXBtY3VCL1RMb2lSUzViaG9oWGJIcExYcTNJOW9rYzFEUEpHRXltL1hjcWhRNTcvUUd0c3VRVnhPQzRhall2V2c2SE9uYzY5UVZNVkl5SnVzeVNuVkdYQUIwU0hZNkpiRkFCbndGOUlxVkxWV1pUV3NSVCt2ZUJPZGV1NjZJaVpJeDJZZ3h1dmQrUXR5eCszdnFpRG01RHYzRFdxd01TaWgvUU1hdGRPNmRCdHdFZEUrcDl4VEptR3pFU3RWbGRjYjVSR1ZQVVRETHBOZ0NWaEkyVisrV3pEbE42RGxYZGV5dU12OWZvL0kvdFBJc2hFc1VxQ3o0blpVaVowTjNWcE5yZ1lycUdKMGlzMVZPdUpXQ2VFNEtGeElHTTZzRVlpOVVnSitrOENyQzRFclo4Mk1SeWdaSjJjNkFkbWpkdFc0NGtyREp5cDEyT2VCdHdtS0w3QnJtVzlGOEtacEJXSHdrdTY0dmF2cTdtYkJZTEx0c0llV1ZqVkprZ1Nja1poVTFNMzBqUlVNSWkwc1ZCUGRvaitLTnJ3TjFBRXFqbVczMytsVHltWlNNSUR3bXliYjFQcFc4VlZTd2FZQlRuWlNjSlY2OU1FY0tuaUZNNXZrT2hxT2RURXlJWENiNy92RzFLdXlyREk0dFBmc1FKcXQ5QjhPUHBXQXlZWEtYN051UUl2TTVzTFpSQlpPZFZGZ29HeUtYWGhtQ1lUd1pXeGM5dFJ1TTUveENESWFXdThqZEFjYURBUWJEYmdyU1M1eFUvWXNOT3FEbUs5TGJHV2FXbHlzYlM2Zi80alNzU3p0RXl5azI0b0JNSTJTT2hENmxmTGJKbG0zNm9HcGZtcW1qZ2ZFZXorU0FOdWZiL2tXVXl6N1o0YWJUMDRnM3NOYnZxcndtd1ljSjJ3RzFlcmhoQjdSTDhHWENka0M5RGM3c2dBa1NmSjJ3SE5Cc2o5ZUtFY2VZSWNFWENNc0J6VFk0ODRpWXE0S0hPRWtkOEs0SzdGamJTZW1BOVlGOEpTck5BYnRVY0Q1aE9XQ050c1Y1TlRoZTM3Rk4wUkdkRVNqdG1FcVowK0JBQ2RuSDBySnpnWjFhLzlzQml5U2FIUkdKalBDd0k3U1I5QWF3SEhoSnAwSnUwWW1VYW1lSHA4a09TOWxuSlJjSDNDMGh5eFRuUlp1emxVMjZPdFNiYitvYzBYdnFlU3NiWDRlZVd1OTRKZ2M4SnFFbnlSYzdBVFpPKzR1amlqTS9LTllrT2FWVEJ5N3JvVllETXpuZ0ZRbE54UThWNXdCbUQ3MGVBM1FrZDRvYVBUWEQxcmVSQmlaRy9UZ2ZxcEt4K0tNamg0TldEZmR3TGI1VEpZUHpzU2xWaCtYN2czUEFQbFhpODU4ZGE2VmplTTcxWmhyaWFmU1RZWDlUeklFTUM0cEJNVXlHMlhrQm55eVNubnNJakhFeTdJT0N6aVNXblhMN0gvY1ZsQXFiNldtdGtkdjN0eFZhaS92QTF2WHZTSTk5aUFtS1BzRHZLVXZXUEM5YkdsOUlnQXpSa1prRG5ocCtTSCtjdUxyc2hyWm8wYUtGOFI4MDl4bGM0NlNkOHdBQUFBQkpSVTVFcmtKZ2dnPT0iPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAiQ29tcGV0aXRvciBQcmljaW5nIEFuYWx5c2lzIiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJFbmdhZ2VtZW50IHdpdGggc2FsZXMgdGVhbXMsIGFzIHdlbGwgYXMgY29uZHVjdGluZyBwcmltYXJ5IGludGVydmlld3MgdG8gaWRlbnRpZnkgY29tcGV0aXRvcnMnIHByaWNlcywgZGlzY291bnQgbWV0aG9kb2xvZ2llcywgYW5kIG1lc3NhZ2luZyB0byBlcXVpcCBjbGllbnQgc2FsZXMgdGVhbSB0byBvdXRtYW5ldXZlciBhIGNvbXBldGl0b3IgYXQgYW55IHN0YWdlIGluIHRoZSBzYWxlcyBjeWNsZSIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBSVowbEVRVlI0bk5WYmFXeFZSUlQrd05JU0V4QVJLZ1dYWW9rTCtpaUZBZ0lTa2I5cVlreGtjZnVqOFlkUmdqRlNJWUJXWEFySTVvSmdqTDhVTnphUkZJa0tLcUNwdFNKYVVjR29NUXFVUmNHQzBCYjZ6RW0rU1U0bWM5K2J1N3ozeXBmY3ZEZno3c3k5OTdzelo4NzV6anlnNjZFRXdFUUF0UURXQS9nUndOOEEyZ0cwOGZzUC9LMlc1MHFiY3g1VkFGYnhBZE1oRDJtemtuMUV4ZzRBalFCS2tWOE1BMUFQb0ZNOTBMY0FsZ0M0Zzc5ZkNLQUhEL2xleWQva25OMnFuZlN4Q1VBcXlvMTh6VTYrenhNSlBRRXNCdERCNjdheVBEUkNYME5KUml2N2tqNFhoWjBhcFh6NGZKQXdCTUF1ZGJOTEFmUlZ2L2NCY0MrQW14MXRkM0swdW5BUmdHV0sxRzhBVkhRMUVxb0J0UEFhUDF2emRqeUFEUUJPOC9mamp2Wm11R3RNNGxRWXlmSUlBSHQ1WGd1djJTVklHTW1Ia3I0L0FOQ0w5ZktXMXFxSE93UGdJd0MzZWhMd0pldnVWblc5YUEray9sOUZUc0ZJcUFCd2lIMitDYUNJOWJmekJxWCtCSUFuQVF6STBJOE0vKzJxUEp4dGp3STQzenBYak9acU5SS3VLQlFKUFFFMHFUZHZIcjVXV2YrM0FaUkY2RnNlNmpjQU02eDczd3JnUlpKUXoyczBGY293TGxCejNnejdtY29JNnB1UGkzN3FucmV4cmplQWZheGJHTGJEMHBna3BPakZkU2lEZHlmZi9Ga0FrNUVzWmdiY2F6VnRTM3NVUDZFMEJnbnZzNTBzZFlKQkFJNng3aUVrai80QUh1TklzUEdDbW9haEVZV0VTcjdwVnJYT2IyUWY0c3ZuQzVmeGZ2dlIwSGJ5M25KT3dzczhWenc4d1ZqbHU1ZUZmS3NObHZYM3dRUUFXempWZm1YZFV0N0RDa1NFTHdrOVZHQmozTnQzV0g0NjVNTi9GN0QrWjROcDl4OVhITUYxYXRrc1JnNUp1RUVGTnFaTkIwUGFnUkVmUGl3QmNnOFBNSURTYUdaZkV4QUQyVWlZWnczL3FTekxtdXlMcjlpbU9TSUJRVmpHdnA2STIxRW1FdDVqdllTdFlLeWZwb1gyeFhZVm9pZEp3QlQydFM2SnpvSklNSFVTeit1M0tZWXdDcUlTc0ZPMTNXRzV6ODFJQ0M0U0RyQXNJYXJnZDVZdnp6TUJPMVJiczRyMFkva3dFb1JOUWh1L0cwdDdrbVU3WVBGRmtsT2doSDJkUnNKd1dXMUR3Q21yZk00VFVNUmxaaDROWGpPSHZSRXp6REdZNTVzcFVkb0ZDSWcxQlNycDRmbXF0OFltRk1vSUNyb0J1SmFma1kxZ2lvR05yM3Bicm14Q00zMS8rZjVvQVFpNGoyMW5XRDdKV2w4eFkwRkU5VlliUmtOY1dIOCtDUUsyV1pMWmNwYm4rY2hZVFJuVVcwRjN2bkdEYVFEbUE1aE9oMk93SXNIb2ZhVjVKR0FBcjNtS3dnaVlXWksreElZRllxVFM4R3oxMWdnTVFzaGZYT05scEVDSm51YVliNDJFU0twTURBS2V0Y0x2bERLQVBZSWFWUWVvdDZZRG83R1pvMUYxZGlPQU9SeG1yd0c0bXZXYWhGT00wWE5OUUptSy8wZGJjWUFZOHNDa1JZdER2VDBQUUIySGs0bnBudzhwTjJzUzFpbXI3SU12Nk5iNm9wdUtSOVlvUDhVUTRwVEZlcXFNalZadlpkMzhtUFh0dFB5MkxZaEN3bHprRG8vd0dzZVVIUDRTNjJRMWMyS3htdk5tMlBkbWlrbnE5ek43RXhlR2hFNGF6YVF4alM5SytyK05kYU9VS09wY3dZYlIwbXYxdG9UNmVwcDUraWk2dlE4SmMwTk9oMHg0a0JLWVh1WXVBUEFMNjJRYU8xRnZxYmVnZENWMWYyYUo0dTZueEJUa0RXNzN0QWxoRGFOR21YSzJPcFh1SU1aNXN6TFd6bGlreXFIZVZuRzRuTTNpdnZaV2tWL1E4WG1HOXZicUlHbnRpME04K0VBdWRmK3dEL204U3ozOFc2dy9RTy9VaVZXV2ZDWDR4REVpWEJpcjJJMEsyMDg0eXpoZTN1STRFbExNVUxxY0Rvd2tRRDYweU4vSXZJTVo5cHVWSVpTTXNSTWxEdlYyR012SGxmY1VoSHQ0cmlRaGtTQUp2a2NIODRwaTVBeEdxVGwvZ01GUElDYXF3TWJnVmMrM0wzaUs1OHBuWE5peHczcm1BL1p6ZXB5a3ZpL3A4RmNZaE1uYWJ0Q2ZTNTN4VlJwOEZLaGF4L0QvZzNVK09UU1RmcFlkSFVrZ1NnWXFSUS92Qk52SnRIakdOeE84d1ZKdmg3QjgwSE5wYW9nWjUydmNCT0IxQUZkYUpKVFRvQlZUWXh6T1FHdTVDbXpNcUpFUTk1b3dGOTFqcWJkVExmY3hHN1k0NXVVSitnKzNoQ1RnRGJhZkhOSW1IQ1laa3ZVSmphT1dlanVkWmVuUUI4T3R4SVY5aEVtRG1lenR3eXlYVzMyZHBqM1lUY00zRzhEMWpGTWlvNDJkR3dkaFBzc1MwVVdGck0wMXFtL2ZrVEJIaGREZ1BXa0Njckp4cTgwaTREbkxqWXlEeDltWCtCUStxTEhjVmFQZXR1Vnk5OW9SYXdyTVpsbTJuc2JGUVBZbG02QjhVTWZ6WjFucTdmNWM3bDdiWXhuQmFjcXJTZ0poaEF5elZVNE1zVlp2ZFlZNWNSTFdLOHVyOCtjSHFmZmxpNER1dkdhYUVyWmVrY1RnSVZjazFMSXpFVG5BdGQ5b2dlS0haOExPTENydm9CQlRZTHpEL3pEcXJVeEw1SXFFaWV4SWxwWk13WkVMWm9QakpRRy96d3BoQkpmd1hIRnhEWXlUSTBzZGNrVkNpU01ZR3NOeWE1YlFkQjNQRXkzaFV1dk56MUlyakd2VHN5MWRtNTNlb3kzMTlsQ0dkVDR4RWxaYTB3QktDUXBVVHdGY2xVVUkwV3U2ei9WbGZ6QXM5VlkrTXlFUkVxcVVJR0tXd3hHTXFqbzRUWUlndy85ZEt4L1F5bUdmN2MyYm5kNUdpcXQwcUxjKzdtMGlKR3h5dU1CMXl0Y090ZEhZRXhYS0Q1SG9EWlo2NjVXN1M0cUVsSG9UUmoyUkNPeFRkdnBUd2lSVXNNODBwMXVScGQ2MmhZM3FraUJoRVJ2dlZiSjRINVVyT0pKbE92aGlrbnJ6dXloZjJlcXRIaEY1STZGRUpVTTNxWFNYa1BDWmtxQldoQlF1dGJWZnFUTE5XOW0zcmQ0MnhQd3JYQ3dTS2xScWJMVWlvY2hLalprMCtiZ3NIbU4zT2psTGxHTFR3VGRjRktEZVJ0MUlsUmdKMWNySnFiZUUwU3FsR0tlVjk3YUcrd2hxZUN4a25TRXpyWlk2dlZIWlZtOHpDcGo1SnFHRmpmYzUvbmcwaHNQWmZrRFhjWkFlbm5GeWd0VGJRT202a05PaGlZM1BVTEd4OStGMzQxbzlsZkYvSFk4YTF1bTlPVUhxYldPbXBFVUNpRzBZRnpKTGxPWThYaHBSZjdQVjIzYVNGWG5YZGtRU0lpVnhVa3laNjAxU3pYeWdLWnk3ZmZrd1B1cnR4b2ovRW8xTFFtT1dWRjFXVkhJWnpCWUR1STRqakMwaS9iZTNxNkdZKyszbGYzN2lzc3J3a2djVUQwNE9JVWpxNURmUkZ5V2ZGN2ducDFENEg4dEx4UDQxbXBCT0FBQUFBRWxGVGtTdVFtQ0MiPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAiQmF0dGxlY2FyZHMiLA0KCQkJCQkJaW5mb3JtYXRpb246DQoJCQkJCQkJIkxldmVyYWdpbmcgcHJpbWFyeSBpbnRlcnZpZXdzIHdpdGggc2FsZXMsIHByb2R1Y3QsIG1hcmtldGluZywgYW5kIGV4ZWN1dGl2ZXMgdG8gcHVsbCBpbnNpZ2h0cyBvbiBjb21wZXRpdG9ycycgc3RyZW5ndGhzLCB3ZWFrbmVzc2VzLCBhbmQgb3Bwb3J0dW5pdGllcyB0byBidWlsZCBhIHNpbmdsZSByZXBvc2l0b3J5IHRvIGFybSB5b3VyIHNhbGVzIGFuZCBwcm9kdWN0IG1hcmtldGluZyBvbiBjdXJyZW50IGNvbXBldGl0b3IgdGFjdGljcyIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQ1MwbEVRVlI0bk8yYlFXN2JNQkJGMzhvM0tKdzJOeW1TQXlTNVQ1eDkwOWc1UjQ3Uklvc1lCcnJwcGtCdlVHV2RMTHVhUWdBRktCS2xVSmFvbWRyekFRTHlTTVAvT1NhcElTV0J3OUdIQlhBUFBBTUZzQW0yWEg3YXZDMlVGVWlqckRQNmFmTzJVSVJLUGdObjRiaTA1ZkxUNW0yaGltTFg3Nm45dEhsYjhBQndKRDFnVVpzOW01TklyTUxVRXZON0JiNERsN1h6VjhIMm1wRzNLdEc3dzJaRWhXUDhib0d2Q3J3UzJoeWRQWE4zeFUvQUN2aGJzNWZIMStGY0x0NEswYnVEZEJEa0ZMS3EyVmN6OGtidG9oQ0FrNXI5NDR5OFVidDBYRmdOamJMYm5JZmpQd2xDVXYzTThFcUhrSFZrOHJoTEVKTHFaNFpYT29Rc1FxVkZpT1RkZ0VWSmlwOFpYa2tjWTFQRERLOVlFYUxGS3hFaE8yQ2IyV2FHVnlKQ2pzb21Wb1JZQ3NBV2VNcHNNOE1yVmlZakxWNnhJa1NMVjZ3STBlSVZLMEswZU1XS0VDMWVzU0pFaTFlc0NOSGlsVDJGTElHZklkMmNSTWllRzdkREg0Tk5Fb0FsOEh2a3Z6akU5NzJOMjlaRzV4QmVHZGlJWnVQbkNFRFh4aTE3UEFZYkhZQWY0ZnBmTXdiZ3ZXdEgxU1VERy9FQVBBSWZqalVBZFhnQThCNkFEd0gyZzg4QitDU0kzd1dZWnJqNGJSRFBBL0JFaUFQT0JJdHdiYm53YWVKODdzWFFybWRKMm53TTFZZlludjJZNWZCNnJnQnNlMFNrTm1nb0ZpRUloWlVOa2Y4WkhnQ005SURkd0RuajRBSWdWbmpGaWhBdFhyRWlSSXRYRklTYzFuaXJWMlNQS2dBM1BhL0s1a2FydlVWUG1qazF1bDZXWHMzVUU2SnA4eVloemN4UnZvUlg1alc0MzZUTmZXbm0xT1VGK0FaYzFQZ3Z3d2NUTHpQd1QvSTVuY1BoY0RnNEFQd0RYb3QvTkwzVk5TZ0FBQUFBU1VWT1JLNUNZSUk9Ij4nLA0KCQkJCQl9LA0KCQkJCV0sDQoJCQl9LA0KCQkJIlByb2R1Y3QgTWFya2V0aW5nIjogew0KCQkJCXN1Yl9zZXJ2aWNlc19hcnJheTogWw0KCQkJCQl7DQoJCQkJCQl0aXRsZTogIkdvLVRvLU1hcmtldCBBbmFseXNpcyIsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQkiVW5jb3ZlciBjb21wZXRpdG9ycycgYnJhbmQgYW5kIHByb2R1Y3QgbWVzc2FnaW5nLCBzYWxlcyBhbmQgcHJpY2luZyBzdHJhdGVneSwgYW5kIHRoZSBtZXNzYWdpbmcgYWdhaW5zdCBvdXIgY2xpZW50cyB0byBlbmFibGUgdGhlaXIgc2FsZXMgYW5kIHByb2R1Y3QgdGVhbXMgdG8gc3VycGFzcyB0aGUgY29tcGV0aXRpb24ncyBwcm9kdWN0IHN1aXRlIiwNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFHazBsRVFWUjRuTzJiQzRnVlZSakhmK3ZXcm1KcXBXNXNscFk5VnBQS0tMWFVMQXExMENnMUkzdFJVSlJQUWxFcHRRZjJ3QUpMcmJEb1JaaGxxVlJFRDE4OXRTek5Wdzh0S3pYVGxONnVacnJ1alFQL2dZL3B6dHladS9jNnMrb2ZCdS9PZk9mTWQ3NDU1M3Y4enhFTzRhQkFBNkFOY0Fad0dBY3dtZ0RkZ0p1QlNjQmNZQTJ3RzhqbzJncGN6QUdDcHNBQTRHbGdIYkRQRE5SL2JRYSsxZTgvZ1diVTQrbmNHNWpsKzdMdTJnVjhEandQakFNR0FoMkJ4bXBiQW53cTJWN1VNN2kxZTRPK3REZGc5OFhmQTBZRFp3R2xFZnI1V0cxN1VJOXdxVy9nRzRHeFFLczgrdHF1UGlxcEI2aVVJN1BUL0ZmZzJEejdPMUo5L0szbGtHcGNBbXlUd2p2MHhkZm9iL2R2UlI1OWRsYjdMMGc1N2dacXBleTdRR3ZkcjZpakVhNVZXK2RBVXdubnhLWkx5UnJnSG5sOWk1YkFhc2w4RTNNdDM2dDJFMG5wNEdkTHdXcWdUNGlzblFrdTdFWEZxMnB6SFNsRENmQ3NsUHNONkJLaFRZVUcvMkdNOTN5dmQzUWdaWmhrbk4yNVJYckgwZklyMVJIemhmMkdXelQ0UFVEUE92VGpFcHhsSVk3eEtyMW5BU2xDTDJDdkZMc3B5L055WUlUUzEycGQ3dmN3b013bnV5eEhkSGhPejBlU0Vwd08vQ1dsN3MveTNHVjVLME9LbXhXK1REQXNSSllyZ1hMUDJwRUNWQ3FkZFFxOWxDVXJLemVEMzZTS3I0bXVmc0JhazlDVVJZZ08zdlIzc3lSeE5EYlQxYTNiaGxsa1JwakJPK2ZsaDd2M2syU0dSb2dPQ3lRN21JUlJDcndtWmI0RFdnVElMWldNKy9KQkdDaVpUM0s4czB1YU9JQkhUS3cvTlVSdWgrVGNsQThqUTd6Q0pneHZTdTQrRXNZd0tiSTdRaTBleFFETkloaWdsNUZwVG9Mb3E5eStObUlhNnJFMnp1RUZZWUJrbGdROGIyZ29zRkVrZ01PQnJzQ2Q1b3U2S2k4S2hrdCtiWWdUOUFZM0pLQ1B5WHErZW44eHdXVmlaQjBYTjA5Smk0M2JMOFFnSWNvVjV6UHk5Z08xNWowUzFCdjg4aXdKRVNxazNHejdGK2hFa1ZBR2RBZkdBL09CblNGSnkvc0Jpb2FobFRGQ3RtdDVBRFBVVGs2MjRGTy9IRGdmdUF0WUtBYldLbFNySkdRYWNMVmljZGcwenNiV1RBQWFtWHRsY3A1THRJeDI2UGVRQUlPNkJHdUQzanVuVUxUWDVjRGJJUU9lcW1ucGlBb1BqMHZHRVpBbnhhelY1L21NRUJWdU5ueGxFcXg4K3ZoZjB2S1VqNEplQlV3QitvY2tNU01sLzQrY1lGUlVBVnZVOWxIaTRVUmd2ZHF1TEZUSW0ycHE5R0VSTzcxQ2hxcFYvcDBMRGJLc1grY3ZCc1hRczVPMnV6SUtuMGRSNEtTbGV3eEZQRWQ0UndUNUUxUU56bExJekFmOXpEdmZBWTZnUUpzUU5mcUtqa1dOZ2pibUs3aDl1cWhyOW5lMW1aMkh3eHBsOWdLZkxGU3M3MkJxZE1mSVJrRXpVNExPai9rMXo1WVIzRUNPaWRqR0RmUUo0NWZHVUVETVZjY3ZSdndpcGZMYXJzMlhFYXF0YzBTQjJiWGZWdUUxQ2x4dDhKYlpDTDJTQW1OT1NPSVJkbTNWTXNpRlJaSi9Kb3NEeklYakRFbXlyVmprYVR1RnVyZ0djUGwrRlBRd0tYS2NxZXQyZm45V3U2OFY5bEtCb1NZdERTdGRMUzdRSUtLRVNhK1M5SXFwaGRyZ1RBMEdtMW13T0lzUnFuUXk0OEU4K3grdWlKUVJxeHUzbmlnNnQ3ZEZ5djBSWUlRTzVoVEhRekg2TGxVMjZLWGNydUJLSFNhWTdNc2xOVDhHR0tHdnl0S2FBQUkwbTJGZk56UHJBVktJQ3RGTUdVTnZoUm1oczg3MTVFS2xZWXk5Nnp4U2lERlM3ZzNmL1RBalJOa28yYVMyM2laR2RSM1M1S0xnWkUzSkxTRk1hejVHNkcweTBJK0EyMHhwbkFvMFZiN3Q3ZU5sVE1ucmpyTFV4UWkzbW41bmluaDVMR1orVVZSVUFUOUlvUnBsaXhjYUx4MW1oQTBoUm5DWjRNUEdtQk5OK3UzVkZvNWpUQlJ0Z1Y4TXRXVVBGcFFZemlDdUVScVoweUF1UXR4bzJyUlU2TnVaZE53dk0ybnhJaTBEUDZJYVliTmtsbXBmWUtuSkh5NEs0UHRkWlprb1JrdVJUVDYrTDQ0UkhCODRJK0FNcjF0VzdiUDBOMDNQeHlmOTliZExFWmZJNUlMZkNPTjAybXVQdVRmWm5OTEtoRkJzM2dtd3FFeFVVZEJIU3F5UFViYVdHS0xDdS9hS0lUcmV5SG5Qc3FHRjF2K3VwTmYvNUpoYldYNUdlSjN5QlJkQi9BZ3pRSDlUOVNXS3o2U0kzMEhsS21DOGNPbTJzb0lRWm9BcGV1YnFqTVJRcWdwdVgweVcxVHZ0dFZISlRENEdXSldHbyt5blNBa1h2Nk9pbzlrNXlyWDlIV1NBNWpMNnJod0dMRHA2eGp4UDE4M1FWUzlIa0E4eWdMY1g0VWpQUkhHTnljdkQwRUxVK1I3anVCcmxhWUN1aHZhNmpJUnh1eFJ4RHNuQ1Rjc3pWYnpNVkd6M0dKdnBNY0tXM3dDRFRGK3VuOFF4VnNxczBJbXV4Zkx1SGpkbnJ3OVVHTVdCMTdiRTkvOENwcWJsREcrVm1ZNytwR2F0VXR1aDRnYnlnVGZnR2FiQ2RPcy9WV2dOWEsrekFWMDEyRUl4TTE2cG14R3Q1dllpRHlxMDE0N3dLOEJwU1N0ekNJZkF3WTMvQUFGNGQvWjR4QmEzQUFBQUFFbEZUa1N1UW1DQyI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICJDb21wZXRpdG9yIERlZXAgRGl2ZXMiLA0KCQkJCQkJaW5mb3JtYXRpb246DQoJCQkJCQkJIlRocm91Z2ggbXVsdGlwbGUgb25lLW9uLW9uZSBpbnRlcnZpZXdzIHdpdGggY29tcGV0aXRvcnMnIHByb2R1Y3QgdGVhbXMsIHNhbGVzLCBleGVjdXRpdmVzLCBwbHVzIHBhcnRuZXJzIGFuZCBTTUVzLCBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgYSBjb21wZXRpdG9yIGlzIGJ1aWx0IHRvIGVuYWJsZSBjbGllbnRzIHRvIGFsbG9jYXRlIHJlc291cmNlcyBiZXR0ZXIgdG8gbWFpbnRhaW4gb3IgZ2FpbiBtYXJrZXQgc2hhcmUiLA0KCQkJCQkJaWNvbl9pbWdfaHRtbDoNCgkJCQkJCQknPGltZyBkZWNvZGluZz0iYXN5bmMiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUdpMGxFUVZSNG5PMWJhMnhWUlJEK1d0cENBZXVqSUdBaktnaEtqSUlFK1NOR3hhb3RvRWJSeEZjUUh5Q0tFbEJCSkNLb3FTQ0toR2hFRk9zREZZV0NRaFUwK0tnUm8yaUlqd2hxQWlLaUp1SmJLTlcrcnBuazIyUnlzdWYwOXB6ZDIxN29sOXowNXM3dW5EbTdzek96TTFPZ0F4M29RRUowQXBDSGd3aEhBYmdKd0RvQTN3R29CNUFDMEF6Z0J3QWJBTndHb0M4T01Bd0VzQXpBZjN6aGxqNk5BS29Bbklnc1J5NkF1L2xDNXVVMkE3Z1h3SmtBQmdEb0NlQTRBT2NBbUE3Z1V6VzJubVBscUdRZERnUHdsbnFaalFCT1QzUHV5WUc1OHIwYnNnaWRBZFJRZUZIN1NUSDVYQTVnUC9tOEI2QVFXWUtYS2ZRK0FDTkN4dVFBT0FsQUtZQ2hFZDVnT0lBOTVDZDJwTjNqRWdyYkJPQ2lrQmUvR2NDUEFjUDNHNERaQUFvc2M4UmVOSERjdHdCK1ZmUCtBckNOSHFRQ3dCZ0FYZEZHS0tSN0U4RVdoQmpGbDVUd3UyZ2J2bEcvMVlTbytvdzBQVWlLeDJZTmdQUDV6SXpoT2dyd0M0QWlDMzJtMnJWeEFkb1pqQVdFL29SbHJtakdUdEtuY0pIRTFoVFRhRjRNWUI2QWo2aDlaakcrSWswMHp6dmU1a05uV1dpaWxuK1RQalprL21sVTlVYTZ4aUN1NTN6Um9paVVjTEYzcVlWNEo0U25NL1RreWt0VTE4OUNMNmNnc2tOUmVKSGpKbHRvZVZ3RUczOGI4c25IR05HOTlDeGVjQllmc2pXRWZtT0VlbXZjd1hFUE9aU3RoL0pNc2tFUCtEZ1NFL2tBTVQ0MlRDRjljUXQ4V2hvbmh1MG5BR2ZIa1BFV2RmOTR6UFVpekNialJTSDBDYVJYdHNCbkZzZUpRYlBoSHRMbnhKUlRqbUlkZVlnbU9NTTB0YkkybEtxN1FCUldjSnhvbEEzM2t5NExIaGRsU2hPdWhpTk1JTU1YUXVoRmpBemxEQTZPT0t1MUhOTS9aTXlUZkk3WWxDU1lwQXhqdWtZMUVpUEk4TE9JTVd0VlhOOHA0dVcyMG9MYmNCbmpBYmxpSjhVS0pVOWlGS2dkN2gyZ3liMysvVUMwOWhwM1hOQWR3T01CK25hcXFrOGN3YUF0RlJLMnR4cnJMZXA1SWRVc3hVQ29VdDN3NmhuSDE2cEV5SElBdnl1WEpVYlBRS0svSVhDTHlTcGlUT3dWTGxBWEZnbGFSZ0w0bDcrOUF1QndqaHNHNEpQQWpzdWM4NVJHbU9PUTRqMUFoUHVBd1pZTDlUZklWeUc0R09wRXlBSHdKWmxWMEYrSFhZd0VKOUN2RHc1Wi9lbWNMK0h4SS96K3ZZZmIzbDNrdmRJRnN6S3FydGs5TVh4SlVCblFGTG5ZdUVZSlpkN3JLdW15UUFtY1ZLMkdLRjV5akh4aE01OVI1dXBjdlVtR2YxRE40MkNrU242SXErb0NmNWpQNTh4MXhiQkEzZXlhcWNySHBEbTNtR2UrUVYxbEQ0VmZqT1d6cWwweXpRVndKK01ENC9aV014a3lVT1VCNWUreHZLbytwOXhpQTlQcW1janFtS08yeFFmenZqeS9KdjdXSDVNQUNmNjJuRW5UVEtFWG55MjVTbS9vd1JpOG1ubEFFeVBzb3krdVltQ1M3bEdKZzdEc2MyZktJamRGcDFpcGpzQzJnRHJuUnNUOHJ0eWJYTkpXQWRpaFVuTDdLY3M2MG90WmVESFJxbE5zVUtxOUtVUEp5UUUwdXJZanAyTVVmZVNxK1gyM0Q0RzZJelBJWVRMVWVJOTY3cjdzOHZGS2prSm1rcThCOEVaZ29YWm1PcFh1Q29jQWVKMHYwY1RjWTdwWjRLT1p4MmhXYVQzbnhaVmNYb0xrdkxsR3ZpcW03a2tRZUowTDRFL3kyZWpTUGkxVXFXa0phbHpqR2VYQ0pKNUlVb3NjcE1wMlQ3a1Fyb3ZLQjBpU1l6emNvbHhWbTA1eFZJc2NyaEtubzEwSTJaOHI2eHFpb2w5SDVBaVQxQ0p2VlVheDNmWXhEYU9RWDRUa0dKUFVJdk9wc1VLL3dxWFFaUUErQkREVkVUOUprdmJ4Vkl1OGx2T2w1dWtFeTVUcWllSHlDUmUxeUNLRzYzV3VFaVZidUN1M08zQXhSektVbGVZSm43WElUYVNiZkdWaWo5RE5CU05HY1NMWXM1NXJrVXRJRjAvaUhLUHBJblhxTzEyWWhLa2tUbnpXSWl0SWw4U3BVNHhTalpPU05JbTdBSkxLOGxtTG5LZXkzRTZ4aW93WHhyd2hqbUhzUHRGekxmTHBDQ09aT0FNanNYZlE3ZFJhZm85N3kzUlJpelNkcTc3TGRDaFJmanZkQmVqS3pwUWNTeTJ5cHBXMXlCMTBuY0cybjBiZUxxWFIyeXZtVTVCWEErMjJVako3MUpLK0Vqek1PZEkzWkt0Ri9wTkdMZko1M2d0TXNtU094VU5JU2M0N1RnV3dsRWNqMkhZbjkzeURjZ28rWGpWbGJxY0tseXJEMnRwYTVGSkZtOGxGTmoyUDBsclRKbGhMQVc2d3RPTGNSOVgvWEJuVG4vbjl3WmkxU0JNVU5haW1xdDF0MmFnOWwyNU1GMFVXVWJDcHlodWtITllpamRVM242dlF6bkFwcmZZZ3k2S2thQU9Tb0V6eFdwMnBEdE9reUtlclM5SEFYUm1UenppVkNQazRtOXJ6UVdHcjFPNVZ0NktiWktncTVzcm5YZVV5c3dxNXRCdW00bVJjMkF3bVFQclFNL1JpVTljMGFvN0pCamV4ZHpBci8wVkhveDlEN1dETk1lelRSRmNybW5CQW9UZDkrSHJHQ3FZQVVrZVh1WWJYWEs5ZDVPMEplWjZiTERyUUFSeEUrQjlhblhlckcyVmZNQUFBQUFCSlJVNUVya0pnZ2c9PSI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICJQcm9kdWN0IERlZXAgRGl2ZXMgYW5kIENvbXBhcmlzb25zIiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJUaG9yb3VnaCBpbnRlcnZpZXdzIHdpdGggY29tcGV0aXRvcnMnIHByb2R1Y3QgdGVhbXMsIGN1c3RvbWVycywgYW5kIFNNRXMsIGNsaWVudHMgZ2FpbiBhbiB1bmRlcnN0YW5kaW5nIG9mIHdoZXJlIHRoZXkgYmVhdCBvciBuZWVkIHRvIGludmVzdCBhZ2FpbnN0IGNvbXBldGl0b3JzJyBzb2x1dGlvbnMiLA0KCQkJCQkJaWNvbl9pbWdfaHRtbDoNCgkJCQkJCQknPGltZyBkZWNvZGluZz0iYXN5bmMiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQURia2xFUVZSNG5PMWFQV2dVUVJUK2xPU0VnSjJLUkxFVkN4VzBNbWl3TkZFUndTNGlnb1dOSXVnSkJsUUVUVXd3S29oZ3BSWWlwTk5DTE1UNGR4ejJRUVFyeGJ2VFJMUUlhdkFIV1JuNERwWmpmMlpuNSszTzN0MEhBOGZNZk85NzgyN216ZTI3QmJyb3doVERBR29BUE1lYjhuRUlBcWc1c0RqZDlsRWlBQjZiNnhEejAydVhBSlFBVEFMNEJHQWV3QlVBdlk0ZGdZcFB0Mm93SG5rRUpnSUlxaThPUXpTY1JRQmUrWFFyQ2NlVmo3dWlGdExneEFFQTIvbjVHNEF0S1BaUjBQYXJ3WWxxOFR0OHhIOEFiZ0hvc1NXVU1iVDl1aHl5cFJiNWVSckFVaHRDRWJrbmJPczNlQnpWM0tUUTlxdkVJQ2l4cndDbTJMZUpSMEVaT1dSRFNDUDNoRFhsWDFKWTJaa0hhT1JEeEM0d0ZmTG5uakEwYzVLYW0wc0FsZ0I0VDBOYkxRdjVjMDhZbWptcGJtRGZXbTZhcHFFUnkwSkJ1U2VzamVjWmdPczBkTUt5a0QvM2hDMjh6c1dMSnNFNG5LZWhDKzE2RGNiaE9BM2Q2TlFBSEtTaGU5SkNsbUhOcjkwMDlFaGF5REtzK1RWQVExVnBJY3V3NXRjR0ducWI0ajdQR3MzZkQzTTJqSzJtc2M4Vzd2TkMxZ3FYa2ZBcnhYMWUrRnJoVHhMNk5PYTZtaE5TK1ZubjVMVzJEZWVJUkg3T2N2TEdBdGNLV3hlZTZBaThKR0d3d0xYQzFnREUxZ3I5ZUVqU1BsMkN3MGZCeUsrN0pCMldGc29BUm41ZEkrbWt0SkJMdFVJL3pwRjBFZklCY0xKV2VJeWttOUpDcnRZS1IwaTZMeTNrYXExd21LVEgwa0t1MWdxM2tmUmFXc2pWV3VGNmt0NUpDMlVBSTc5V2tmUkZXaWdER1BuVlM5SmYvbGtpSnBRQmpQMzZRZUp5YVNGaEdQdFZJM0dkdEpBd2pQMmFKWEd6dEpBd2pQMTZRZUpPUTZGcXdQTjVIbjNHQVhoQTRuN04rYTFDUWNKNTlCa0g0QTZKUnpvMUFGZEpMR3ZPYnhXcUJGUm84dWd6RHNCWkVzYzZOUWtlSmZHMjV2dzVqYWU2ck5GOGlsVEZsc1FZSlBrTkgwS20rRktWVjhDMnlBZXVuaVFCS1BGVldvOW55bXVETnBsMEY1eHVNUkJWdFhFWnpZclNmRktpMmpKUEhFNXdTV0M4aHI1T0Q0QkNOd0FJajU1NnBXWUd3QUxiVTlZVXM0S3VmcW92TWF4eU94YVJjUzlCSHJyNmFhcktzWlhiUHdCT0FWakJWbVlsS2F1ckxZbitPQXdSVmJrdGExeWZrazFIUDAxVk9SVGZhVndWVUZ1eGttTnFqaFR5MWtmVGdmNkFzVFVjVzJoamZUeW55Sm1Bc1ZHT3piU3hQdlpTNURlZDZHZmtSOW5uOFlwcVYvM1lheWpKWCt0RjFZZkNIZ0RQZUNaVlU5dE9QUEttK3Y4QnZPZjdLTVhNM3o4QUFBQUFTVVZPUks1Q1lJST0iPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAiQ29uZmVyZW5jZSBJbnRlbGxpZ2VuY2UiLA0KCQkJCQkJaW5mb3JtYXRpb246DQoJCQkJCQkJIkVuZ2FnaW5nIGRpcmVjdGx5IHdpdGggcHJlc2VudGVycywgZXhoaWJpdG9ycywgYW5kIG90aGVyIGF0dGVuZGVlcyB2aWEgcGhvbmUsIGNoYXQsIGFuZCBpbiBwZXJzb24sIHRvIGlkZW50aWZ5IGFuZCBnYXRoZXIgbWFya2V0IGludGVsbGlnZW5jZSBpbmNsdWRpbmcgdHJlbmRzLCBtZXNzYWdpbmcsIGlubm92YXRpb24sIGFuZCBsYXVuY2hlcyIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQjdVbEVRVlI0bk8yYVBVc0RRUkNHSHhBRURkaFlxcFdvWUVyL2lWMjBNRC9GeXQ0L29MMEdHMEU3QzVNenJZVmlaV2ZwWnhCQkVGY09SZ2doWDF6Mk5yTjM4OEEya3pEWm1ienYzTjF5WUJqR2hLd0FEYUFqNnd6WW9FVEZ2d0N1WjZXeFpVcEFRd28rQjVhazZBdUpuVkFDT2xMc0liRFRwWW8wOWtHQldRRDJnZDh1MmIvMU5PQ2RnbElGSG5zOC93WHNTdkdYRWt2dFVUZ1dnU2NwOEFiWUJwNEhETUUxQ3NpQkZKZ0FzeEpiQlU2QlYvRjlvNmpGcHp4SUE3WW9LZC9TZ0JsS3lvODFBRk9BTXd0UWpobVE5TG0reDdwYVdScmdDcll5TnlCMnJBRjRWRUFDTkNPTGVXMkFLMGhzTEp5aURhdHBRQk80aml4bVF4QzdEREtSQmR5UXU2b2t3K2ZSM0FpMUJpUnFqdmpPcU0rbnNhN0l5SHJYMFhlZGVLakxuai9sRUhjaWFqNlRCYUFxZTAzM3ZPY3I2YkVrdkFjcTZLVWllMHozZXVRejhSeHdLNG5UWm1qbC80KzZBK1o5SjE5WFBnKzZmYitaMTQvVWxNNkRYSHdmeXp6SXpmZXh6SU5jZmE5OUhnVHh2ZFo1RU5UMzJ1WkJjTjlybXdkVDhiMldlVEJWMzA5N0hxancvU2haRG5vMDlubDJvT0h5MjNjd3RZY2NSUGc2TzJncnVRRWJTZWFUbUp6eUJNZFpBekFGT0VWS0NvNHpCV0FLY0lxVUZCeG5Dc0FVNEJRcEtUak9GSUFwd0NsU1VuQmMwUlNRZUh5ZVYvZFc2RGpFOGk1QTcydHlobUV3a0Q5aFAxaDliRVhDcGdBQUFBQkpSVTVFcmtKZ2dnPT0iPicsDQoJCQkJCX0sDQoJCQkJXSwNCgkJCX0sDQoJCQkiU3RyYXRlZ3kgRW5hYmxlbWVudCI6IHsNCgkJCQlzdWJfc2VydmljZXNfYXJyYXk6IFsNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICJDb21wZXRpdG9yIExhbmRzY2FwZSBBbmFseXNpcyIsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQkiSW4tZGVwdGggaW50ZXJ2aWV3cyB3aXRoIGNvbXBldGl0b3JzIGFuZCBpbmR1c3RyeSBTTUVzLCBwYWlyZWQgd2l0aCBzZWNvbmRhcnksIG9uIG1hcmtldC1sZWFkaW5nIGNvbXBldGl0b3JzIHRvIHByb3ZpZGUgaW5zaWdodHMgaW50byBpbmRpdmlkdWFsIGNvbXBhbmllcyBhbmQgaW5kdXN0cnkgdHJlbmRzIGF0IGxhcmdlIHRvIGhlbHAgaWRlbnRpZnkgYWR2YW50YWdlcyBvciBpbnZlc3RtZW50cyB0byBnYWluIG1hcmtldCBzaGFyZSIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRjgwbEVRVlI0bk8xYldXeFZSUmorYm51TEJaSWFVWXF5cEJpQnVMNjR4UzJweUlOTGtXaUlHa1Y5b1lrcEVvdkdoZGdtYU1CcU5MeTRCeFdqVVNNUHdJc2lMNmh0d1kyQ1dpeVN1TVFkRFM2a3R5SmE2REYvOGgzelp6ekwzSFBuM0h0NjJ5K1ozTlA1Wi82WitjL012ODBwTUk1eGpIYnNBTkNMTVlJVkFKWWJkUjZMaHJScFJ4WGlkeTYyT1VJQXpmejdWMVFoT3JpNFBsVW4yNzlIL2QzSE50SzI2bEFQWUFEQUp4RnQrZ0Y4eHJhakh1M2N5cDBBSnJLdURrQnRSSjg4Qzlpbmt6enVLTU44a1FQd0xrdU5JNlhubi9HOXhzSVhBdGdHWUFoQWdjOHRpcDVuSDc5L1daVGlKV3JBS3h6eHZKVG51bDhKWUkwYXh5eXJsUUQyc0svd0tBdWVWaFBabk5JWUM4bi9NSUM3QVp6RWNnL3JQR01ubEExMUFBNXdBa2NBREFPWWtjSTRiM01NV2J5SmUwbVQ0MUIydEhCdzJhb2IrTHlxUkEvUDMwM2EweHRrbmJ4MUU5TkpHN1RnNHh5dmNwQ1ZBT2J6K1h1bGtZdEZyNXA0VHdrQ0NPUGpGSk9walVjQU5ORWE3T09naXh5UHRZMTg1Y3lidUs5U1IrQ21nQzEyRit1MnBIVFVEdlBNVDJlUnhmOWRLU1g0QmdkdVUzWEhBL2dMd0ZFQXMwdmczVXhUdGx1WndkV1dadkJqOXRXeGczT2NBT0FmRm5uV2VKbVQ2bkxnQ0EwWWpsQUx0M29od2hFYVVQMkZWeXBvNHdDeUMweGNSTnArQUJNUzhKWkovOGJBeHZmdGN6R0tOYzgyWUo4Tzhrak5GZTdsSWtVUEJLR2Y5T3NjakZYUFFPZlRyQVJEVGRUOFE3UUVRYmpkb1diMncrR2RFUm1oMU1MaEhBZmFvUmE3a29PSkR4Q0dZNVdKbkJkQXJ5VmZtd0Nxb2dtUjg5UmdMeHJiTzg3c1BNZDJhd05vMXlxK0xSWTZvZDBpSmRhZVJ2VFhaWmlieC9oN2dIRkFGTTVSYjhVOG16MktaeEtmd2N3SXBZYlBPY2tYREVGSUJHaURuV3gvczZvN2wzVi9BRGhFbjJFT01valQxUnZNOHdqNEFyallra2RyZ0xmNEd1c2VVWUlOT2lZVlI0ZDYrNkFTM002dDU5dmNPRWlmZytSekpvQlp5b0dhQ2VCczBrVFJUVUxHc011UmovMGsrVHdCNEZFK3Y2TG83N0ZPZGt0bTBFUVROdWpBdVRpTEN6ekljKzlSRC9oWXdqcngrek9ERlp6VTY0NzRiVmY2bzl1Z2lidjhNMm5pUm1jQzNaelFEWTc0M2FJRWNFMEFmWTJGYzFVMlRHVitUMkx2QmtjODYybE56TzN2WXhiemlSTGJUMHZBdjVFNmF4ZWZTMEpyUktSWEN0YVM3N29RK2tiUzVWS2oyQmZtZTZjZWZaZWcxSmsxM2lTanBYQ0xPVlNzaFpDZGRSbkgvZEhDeXd4YmZNbENhT0RXUDBMbVNDbTN0eXlBbGxPM09vc3RlRFh5RXNSVHYvcDVUNUxqY0NNN3Y0TjBjRDM1aDhYMnkwbVhld0RiTnk5diswUWxBSk5XMUU3WWtQS2QyZ1JtaXNKTVhnTjlEemtxWjFqRUdQb3Q2d2hSNzQ2UGl0SFVneXJOblJiOENQT2xFUHBUcE10dkdONW5FcVF4SWtSdVpCdHBXOVQ5V3gvU3hXeEdnQklKVGdrSndud3YxTllNTnlvQkpEYUQ2OG5nZnFTUExSenJ6cGk3UVBQYm9OVE1ZRjVkY2w0TzRFRUFIOUovRjR2d0E0QVBBRHpMSy9BazJWNk5SUnhyWDBoa3VaajB2VEdScHo3cnVoUnRBZWF6NDRpNmFZa3Ezd0s0cllRN3dGcmVJWG9jMjBSZTBSZVV3d3crcmhpTU1BaTZpbTVwSGEraHptZENkTGRxSzkvdFhKQlFDS3ZJUXl4UEVEcEozMlN4ZUZNSEZDV0VHZ0Rmc2NOK2kyeFBqbHY0Qy9ZNXlnUm9zWlpqUm96L1A0MjBZY1lLVVl1UE1vT3hRbWhUaWM1VGlsakFSRVp4L2hjYXczeGJ5NWpwbWFrK2NnckRadmFWblJWMS9TN2pSUGtBWVdZdzFoZVl6Q3NrYVhRMWtrR0U5cndTUkpJaXduK1kzeHZWQkZ5ei9RTGdtQWdmSUVnQVZyNUFLenU1U0RGUFpkeS9ub09Lb3Z3emdUQkVyMXlwK1BvNlJ6SkhVUWdTUUN3MlZqZ2ZWOGUzZENIdi9iVTlYMGZ2ZENuL2x0eWhjd0Y4dzA1emtRM2t1T0FDNTlWTkFmbkhWSFNMVXdFY1lxZXNwYVRuOFFoNXpDYytZNlRvblFuQVM5S3BURGhaQ2VGci9vYkZEMVVwQUQrTDlKT2hKSU8rRmF4YUFRaE9CZkNWbXFzOG54YmdZMVN0QUh3VHU5WFNqQTdSbEhZeFUxUVZBdkN4Z0ltVUx5MTlqS0U0LzhFYlpRS3d3U1I2bEZ0VmNMZGtMQWxBNHdHdXJ4QjJITHdxRjBCT1hmTTlGQ1dBNDBvc0x2NVRKQzNjcW1LTS84RWJRMFYvVGY0ZjN1TFhHYVVVLzFQMnJKZXlmRlExam5FZysvZ1h0Tjd3UzNwZFFqc0FBQUFBU1VWT1JLNUNZSUk9Ij4nLA0KCQkJCQl9LA0KCQkJCQl7DQoJCQkJCQl0aXRsZTogIk0mQSBEdWUgRGlsaWdlbmNlIiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJBIHRydXN0ZWQgdGhpcmQtcGFydHkgdGhhdCBwcm92aWRlcyBpbnNpZ2h0cyB0byBjbGllbnRzIHdobyByZXF1aXJlIGludmVzdGlnYXRpb24sIGNvbmZpcm1hdGlvbiwgYW5kIGEgc2Vjb25kYXJ5IHBvaW50IG9mIHZpZXcgdGhyb3VnaG91dCB0aGUgYWNxdWlzaXRpb24gcHJvY2VzcyB0byBnaXZlIGEgbW9yZSBkZXRhaWxlZCBhc3Nlc3NtZW50IGJ1aWxkaW5nIG9mZiBjbGllbnRzJyBmb3VuZGF0aW9uYWwgdmlldyIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQndrbEVRVlI0bk8xWXkwM0VNQkI5cDFTeEhCRTlJQ2dBQ2lPaEU0UVFSeWhnblViWURUY2tsZ1lHUmZJaFF2SGllT3g0SE0rVDV1TDFXak12ODNrMm9GQW9GT2ZSQUhnRThBbUFDck1CUUdkakNFWW5JQkN1dFJ3Q0JudklOY3JEelNRVGdrSFdTZ1hiZjFJQ29CbEFLQmRhQWxpeEIvUUFEQ29tZ0FUMmkrUUVORE5LOFp3QzZ6MkVpL0hjYnlRUTBDMVVZTWFEZ0wzbi9uMEUvOWtIekNuRktBb3NFcElUUUk3ZnBmU0RiQVFZUjRyNjlBQk96Uy8xUHhrQkx2ajBBRTdOYy8wTDdnRmozVXRFY2dMYVZBOFJKZW1BZHBJSi80M0JUU3ZCS3NlZ0M5V013ZDR4bnFvaGdHb1hRc1BNR0x5MWEwZFVPZ2JKMmtOa0pSaWlETE9Nd2FNTnZvbXNCRU9VNGFwVGdJVFVmVFlDVEtCZTM2UU9jSUh6SWlUeU5yZ1VuQmNoa2JkQjZWQUNvQmtBTFFIa3JLSE0wQktBbGdDMEJKQ3poakpEU3dBSlNxQ2YwZVZTMTVJUVFBV3RLUUZJa0FGbTVtWW1kVTJiSUZRSFFIVUFHS0JhaE5BOWdFUEVKK3UxYmZUOWprUEFRVUFRWFB2Z0VFQWJUWFVsQUo0ZjlzZHUzS0ZNZk0zNGYySFh2bjBPZUxXYjMrd2ZTOFBUSC85SGU3ZHJMejRIWEUxWTNKS05NVjM2c3JnRDhBemdKTUJ4cnAzc2wvY09YcUZRb0RyOEF0NUtDNy8veHNFZ0FBQUFBRWxGVGtTdVFtQ0MiPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAiQ29tcGV0aXRvciBSb2FkbWFwIFN0cmF0ZWd5IiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJBIHRoaXJkLXBhcnR5IHRoYXQgbGVhcm5zIHJlYWwtdGltZSBpbmZvcm1hdGlvbiBvbiBjb21wZXRpdG9ycycgcHJvZHVjdHMgYW5kIEdvLVRvLU1hcmtldCBzdHJhdGVnaWVzIHRvIGluZm9ybSBjbGllbnRzIG9uIHRyZW5kcyB3aXRoaW4gdGhlIG1hcmtldHBsYWNlIGFuZCBob3cgdG8gcHJpb3JpdGl6ZSB0aGVpciBvd24gcHJvZHVjdCByb2FkbWFwIGFuZCBtYXJrZXQgbWVzc2FnaW5nIiwNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFFL2tsRVFWUjRuTzJhUzJoZFZSU0d2M3RwWXNBNnFRcFZrNW5TYUJRZitJcFdFQ3dWcXc1VW5MZFRCeGFjaUlMWWlhS3B4a2V0RXNWeHBjYU9iQjFVZkNWMUlFR3N0VDZLRGJRcXREWkZXMEhTdFBiS2h2L0FjWGVmcy9kNTNudnIrV0dUazN2WHV1ZXNmNi96NzllQ0JnMGFOR2pRb0VHRGN0QUN4b0ZKNEN0Z0ZuZ2FXTW4vSk9qRFFNZlJsb0FQZ0xWQXUwdlBPUXc4cG5aaGxVRWZBbDRHN2dUdVUrQkxzZS9uZ2FkcXlvb0I0Q0hnUStCTTdCbmVyeXJvMjJWbjR6SzlDdk5XVmt4WGxCV2p3QVJ3SkhhL1JlQzkySFV3eG9CTndNOVcwSWFFMTREVkNVRzdZQUpkQTJ5M3N1SVg0QVZnaFB3WUFoNEZkZ05uWTcvOVBmQWtjS25zb3M5VGNXWE9ubTdwTzJQekkvQmRpZ2lXbFJXM0FsUEFpZGp2bU91M2dkc2M5bDRDN2xHSzVBbjZrRWNFNzNVRTF0Ym50bFljVE5HS0ZjQkc0RnZyUG1iVTJlQVJPUzhCWDh0Z215Zm84WVNnNDRTdFZZL2FJcGduSys2WHFHNnpPdWdvc0ZudmZRaThCSnlXd1ZCQzBKT2VvRjJFclZSdkhpeVlGVkV6aXI0VGVGaEtueVNDNW40L0thdURDZWhZQnBlSTRheDY0RUs3UUZaOHB2YU14blFiSnUzWEF6TU93dWFMRVBCcHdhQ1RrSlFWWlluZ2xMNno0OGxNd0JuOVgwYlFXYk1pVFFRZlR4REI5WllJRmlhZ0V6SnVsZ1JmVnF6SklZSjlSWUJ2d2hTMWZ6VGhNUk9mUWRMUmx3UzRzbUt2VWo1SkJNOWJBb3FpcXdRTTZQMDhxb1hKUk1LNGZkNFNNT0Y0ZjgyaXB3aEdKSW9uMVhZQXEzcVJnT3VBQmZuZW9WV2p1VDRHWEV2KzRJODdTRDJlb2d1MUV6QUV2R1V0U1Uzd2Qxa3F2dFV4M2ZaaFd2NDdGYkJwdS9UWjlsNGdZQ2cyY3pScmlqbEhiODNGMWhzZkF4Y1FqcFB5RzdheUlwcjlkWjJBTjJWckJPOW1CVGVwRkYzUU5OcU0yN2ZFZG12ZW9Cd0MvdXcyQWRjcnRSY1ZvQTltcytLVWZFSTFZWWVlWlpjQ04rMGpmVGJkYlFLMnl1NGR3dkd1ZkxZRTJxOUtFY0dydWszQUQ3SXp1OEdoaUVhRy9SbDhoaVY0SjlTbVU0S3ZsWUMvWldkV2FxRzRXRDdHdHlwVVRzQ0FabnVSbmJsZVZ1QUJRN0ZIbXg5ZEorQWx4enRwU0tpYWdGQy95Z2s0NXBqdC9VNzJvVzE1QnArTDVHTjhlNGFBMWJIWlhoWUM5c3ZIdFllZmhISDU3T3NGQWpZN1hnR3pDQXJGSy9KNVBZTlBOT1NhaVZYWENWaG1yZnBlekNpQ1k5cDNOQk9vR3dMc2I5SUV5dmhjRTJCZjJ6RFl5U2xtYUNKa2ZILzFrR0NDLzAyMnJ3YitkbDhRTUtpRlVVZTl1MFh2K1hLMWNhWDlLZG5zenJDeFVoc0JNOEFYNU1lZ2RDQitqbSszMCtyNUxMdEt0UkZRRnNhMGdqUUsvNWZhUGdsZXlEdmZjd1E4b0lQTmJxRldBbG82am9yMzFHTFdpb3grSTZEbHFBOVk4UGpYbVJXVkVOQktLWW93L3ovaHlZQzZzbUtnVEFKYW5xQ1RUbzFOVDYvejNNUGdlZUE1eXNGbzdEekMzT2VBNTk3L2dXM3dSeXpJMEtCOWNHWEFXVzJQNVVWVUh6QnJQZWMzMHFXaytNNkJiZkJzaHFEalZTUnptaGU0Q2g5Q3MyS1BBaXBTSDJEUE5UcWFheVRDOVNDakdwOWJGVmFLUnNkbnZtZUpkcEkyQnRZSFJCalJlVVZIMVd1WkNNZ1NkSlFsZDB2dFF5dEZyd0F1VDNtV2RvNzZBTlBqajJnWE9acGhtcjhQNWlHZzFZVkswZG5ZdHRlWEdZcWtydFpPVlNTQ0haRm15THN4TFhpYmdDSkJ1NUNuSmpEQ0o3SkxLNUxhNEJEQnZTcW5DZDZzWFpKalV0Q1RJcVZvdlZEVmxhSlRnUWMwNXlBNmFZbmE0UktETGlzcmtrUndKa1VFZzdGQ2FiYXB3cUNUNEtzVVhlY1F3U01aSzBYN0F1ME1SVkoxVjV6VWpuaWw2T2M1aXFRYU5HalFnQ1Q4QzdJaGRscjVwdDhDQUFBQUFFbEZUa1N1UW1DQyI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICJRdWFydGVybHkgQ29tcGV0aXRvciBNb25pdG9yaW5nIiwNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJUaHJvdWdoIHByb3ByaWV0YXJ5IHRvb2xzIGFuZCBvbmUtb24tb25lIGludGVydmlld3MsIGNsaWVudHMgYXJlIHByb3ZpZGVkIHdpdGggZGVwZW5kYWJsZSBpbnNpZ2h0cyB0aGF0IGluZm9ybSBvbiBjb21wZXRpdG9ycycgYWN0aXZpdGllcyBmb3IgY2xpZW50cyB0byBiZSBhZ2lsZSB0byBhdHRhY2sgb3IgZGVmZW5kIHRoZWlyIHBvc2l0aW9uIiwNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFER1VsRVFWUjRuTzJiejB0VlFSVEhQMEdHVXFZdEVnTGJTS2JSSnNnaThDOW9aYmJzTCtnUE1OelZwcXhXVWJtSXdITFJqMVcwem41YnRuRlhVR0JJQmJhS1htQmxRZWpFaVhOaGVseDdjOThkYmU0d1h6anduSGZtT09jN1o4N01tWHNmSkNRa0pDVDhRUnZRRTRtSUw4N1lDdHdHZmdFbUVoRmZiZ0h0TGdSYzFVNUx3SHdrc3FRK1hYRWg0Sk1xN3lJZTlLcFA0bHRER0pVTWJUbHJxSXB0OVg2dENsT24rQmFZcTlPcFlsdlRCSmljanJHMDVjSWtBdmlMcVp2QWpUcVNxdGpXZEFURWdzSUU5RVFtaFFrd2tZb3pBZk9SU2NvQnBDUkkyZ1Vva0FOaWcvY2xNQU04THordTBuWmMrM3Nud0hpS2xMSjJ2SS9YSkFKSUVXQjhodFFhMjBsTGdIWEtBVE1Cbk9OZDVlNWFFUEFzQU1kYzVjNWFFRkNQbEFOSVNaQzBDMUFlWlNOSmN0TzB6LzlqS3BZRE12UUJvOEFENEEzd0RmZ0JmQVNtWWlaZ0FIaFlZSWQ0QkF6R1FFQUxNQTZzYVAvUHdBUXdwTkd3V1VVK0h3R3VBVFhWbFQ2WGdOYXFFckJOWjlMb2s5L1QrbGkvRVRxQU1ldHA4WFJlUHhNNEFTMlc4d3ZBL2lhWHpZTGFrTHVFVFZVaVlOeHl2cnZFUlVtM1JjSzR5NERHclBXMjN2SmVRM1ZBeDdEa01QTXV4QjdRblVKc0htclU4UXl3L0o4SWVLY0VaTmxlMXJ5dnlEcW5lbzlEWHdKOVZyYnY4R2kzMDlvZDlvUk13S2pxVFhpMks3aXV1aWRESnVDKzZnMTV0aXNZVnQxN0lSTXdWL0RsclNMank1YlhoNUFKV0ZTOTlvSjJ1eHgwMjFYM2U1RUJ1VlpodnV3VUpXQlc5Vjg1a0pBUnNPaHpabjBqV3dLN0hmVzNBeSsxajFTSE8vNmgyMi9wRVNvQldSS1V3c1lWWFJvQmpTTGhhRE5KY0wxeFFzY2xWUjJlU1pqVTcwZlFVNWY4Y1N5QTkzcHNPYXpqcWprZWhGWWpRWEpEL1VIb2kzN1hpN0pnQWhlcFMyaUNoTm1jaEh2ZURuL0JCdUE0OENLQTkzcnlaRVVMR0NtTXl1S2cycElhWng4VndVWEhjcmdSZHVwOW9kaTZRSVhRQ2p5eFNKQ1N0cG1aejV5WEM5T05WQXdkd0ZOMVFFTDRyQ2F6UnVqVU5mL1RjdDZsWDVDUWE2ekwxaVZOVGF1NllUM1liRkhwMTdaSks5c3ZhOWhYYnViek1HamRFYnJJVkpVU1hoSHNCVTdwZHJhZzEyWmZnZGZhTmhMWno0QVNFaEx3ajk5TjhLYUdrUlUzSFFBQUFBQkpSVTVFcmtKZ2dnPT0iPicsDQoJCQkJCX0sDQoJCQkJXSwNCgkJCX0sDQoJCX07DQoNCgkJd2luZG93LmR5bmFtaWNfY2FzZV9zdHVkaWVzX2ltYWdlX3VybCA9DQoJCQkiaHR0cHM6Ly9mbGV0Y2hlcmNzaS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDgvYmlnZ2VyLXRvbW9ycm93cy0xNjAwLmpwZyI7DQoNCgkJd2luZG93LmR5bmFtaWNfY2FzZV9zdHVkaWVzX2RpY3Rpb25hcnkgPSB7DQoJCQkiR2xvYmFsIEVudGVycHJpc2UgU29mdHdhcmUgQ29tcGFueSdzIEpvdXJuZXkgd2l0aCBGbGV0Y2hlciI6IHsNCgkJCQljb3B5OiAiQSBnbG9iYWwgZW50ZXJwcmlzZSBzb2Z0d2FyZSBjb21wYW55IHdpdGggYSB3aWRlIHNvbHV0aW9uIHBvcnRmb2xpbywgZ3Jvd2luZyB0aHJvdWdoIGFjcXVpc2l0aW9uIGFuZCBtYXJrZXQgc2hhcmUgZ2FpbnMsIG5lZWRlZCB0byBpbmNyZWFzZSB3aW4gcmF0ZXMgZm9yIGl0cyBnbG9iYWwgYW5kIGVudGVycHJpc2Ugc29sdXRpb25zIGFjcm9zcyBpdHMgc2FsZXMgb3JnYW5pemF0aW9uLiBQYXJ0bmVyaW5nIHdpdGggRmxldGNoZXIgdG8gcGlsb3QgYSBXaW4vTG9zcyBwcm9ncmFtLCBvdXIgY2xpZW50IHdhcyBhYmxlIHRvIGlkZW50aWZ5IGtleSBwdXJjaGFzZSBkZWNpc2lvbiBkcml2ZXJzIGFuZCBjb21wZXRpdGl2ZSBpbnNpZ2h0cyB0aGF0IGluY3JlYXNlZCB3aW4gcmF0ZXMgYW5kIG1hcmtldCBzaGFyZSBhY3Jvc3MgdGhlIGNsaWVudCdzIGVudGVycHJpc2Ugc29mdHdhcmUgcG9ydGZvbGlvLCByZXN1bHRpbmcgaW4gZ2xvYmFsIHJlY29nbml0aW9uIGFzIGFuIGluZHVzdHJ5IGxlYWRlci4gRnJvbSBhIHBpbG90IHByb2dyYW0gc2hpZnRpbmcgdG8gYW4gYW5udWFsIHByb2dyYW0gb3ZlciBmaXZlIHllYXJzLCB0aGUgY2xpZW50IGhhcyBlbmdhZ2VkIHdpdGggRmxldGNoZXIgdG8gZXhwYW5kIGNvbXBldGl0aXZlIHNlcnZpY2VzIHRvIGNvbXBldGl0b3IgZGVlcCBkaXZlcywgcHJvZHVjdCBkZWVwIGRpdmVzLCBNJkEgZHVlIGRpbGlnZW5jZSwgYW5kIEdvLVRvLU1hcmtldCBhbmFseXNpcyBpbiBwYXJhbGxlbCB0byBXaW4vTG9zcy4gUmVwb3J0cyBmcm9tIHRoZXNlIHZhcmlvdXMgc3R1ZGllcyB3ZXJlIHdpZGVseSBjaXJjdWxhdGVkIGFjcm9zcyBudW1lcm91cyBzYWxlcyB0ZWFtcywgcHJvZHVjdCB0ZWFtcywgZXhlY3V0aXZlIGxlYWRlcnMsIGFuZCBjbGllbnQncyBDLVN1aXRlLiIsDQoJCQl9LA0KCQkJIk1haW50YWluaW5nIENvbXBldGl0aXZlIERvbWluYW5jZSBmb3IgR2xvYmFsIFdpcmVsZXNzIFByb3ZpZGVyIjogew0KCQkJCWNvcHk6ICJGb3Igb3ZlciAxNSB5ZWFycywgYSBsZWFkaW5nIGdsb2JhbCByZXRhaWwgYW5kIHByaXZhdGUgd2lyZWxlc3MgcHJvdmlkZXIgaGFzIHBhcnRuZXJlZCB3aXRoIEZsZXRjaGVyIHRvIGFzc2VzcyBpdHMgY29tcGV0aXRpdmUgbGFuZHNjYXBlIG9uIG11bHRpcGxlIHByb2R1Y3RzIHdpdGhpbiBpdHMgcmljaCBwb3J0Zm9saW8gb2YgRmliZXIsIFNELVdBTiwgUHJpdmF0ZSBXaXJlbGVzcyAmIFdpLUZpLCBFdGhlcm5ldCwgNUcsIGFuZCBtb3JlIHRvIHBvc2l0aW9uIGl0c2VsZiBhcyBvbmUgb2YgdGhlIGluZHVzdHJ5IGxlYWRlcnMuIFRocm91Z2ggdmFyaW91cyBwcmljaW5nIHN0dWRpZXMsIGNvbXBldGl0b3IgYW5kIHByb2R1Y3QgZGVlcCBkaXZlcywgRmxldGNoZXIgaGFzIHByb3ZpZGVkIGluc2lnaHRzIGRpc3RyaWJ1dGVkIGluIHJlcG9ydHMgYW5kIGJhdHRsZWNhcmRzIHRvIHByb2R1Y3Qgc3Rha2Vob2xkZXJzLCBzYWxlcyBWUHMsIGFuZCBDLVN1aXRlIGV4ZWN1dGl2ZXMuIFRoZXNlIHN0dWRpZXMgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY2xpZW50J3MgZG91YmxlLWRpZ2l0IGFubnVhbCBncm93dGgsIG1haW50YWluaW5nIGl0cyBjb21wZXRpdGl2ZSBkb21pbmFuY2UgYXMgYW4gaW5kdXN0cnkgbGVhZGVyLiIsDQoJCQl9LA0KCQkJIkhDTSBDb21wYW55IFN0ZWFsaW5nIHRoZSBMZWFkIFdpdGggV2luL0xvc3MgQW5hbHlzaXMiOiB7DQoJCQkJY29weTogIlRvIG91dG1hbmV1dmVyIGNvbXBldGl0b3JzLCBhIGdsb2JhbCBIQ00gY29tcGFueSBlbmdhZ2VkIHdpdGggRmxldGNoZXIgaW4gYW4gYW5udWFsIFdpbi9Mb3NzIHByb2dyYW0gdG8gaW1wcm92ZSBzYWxlcyBjeWNsZXMsIGluY3JlYXNlIHdpbiByYXRlcywgYW5kIHN0ZWFsIG1hcmtldCBzaGFyZSBmcm9tIGxlYWRpbmcgdmVuZG9ycy4gSW4gY29sbGFib3JhdGlvbiB0aHJvdWdoIGEgZm91ci15ZWFyIFdpbi9Mb3NzIGFuYWx5c2lzIHByb2dyYW0sIG91ciBjbGllbnQgcmVjZWl2ZWQgZ2xvYmFsIHJlY29nbml0aW9uIGZyb20gdmFyaW91cyBwdWJsaWNhdGlvbnMgYXMgYW4gaW5kdXN0cnkgbGVhZGVyLCBpbXByb3ZlZCBjdXN0b21lciBhbmQgcHJvc3BlY3QgcGVyY2VwdGlvbnMsIGFuZCBwcm92aWRlZCBpbnNpZ2h0cyB0aGF0IHN0cmVuZ3RoZW5lZCBjdXN0b21lciBzYXRpc2ZhY3Rpb24gdGhyb3VnaG91dCB0aGUgc2FsZXMgY3ljbGUgYmFzZWQgb24gaW5zaWdodHMgYW5kIHJlY29tbWVuZGF0aW9ucyBzaGFyZWQgd2l0aCBvdXIgY2xpZW50J3MgQy1TdWl0ZS4gRmxldGNoZXIgaGFzIGdyb3duIG91ciBwYXJ0bmVyc2hpcCB3aXRoIHRoaXMgbGVhZGluZyBnbG9iYWwgSENNIGNvbXBhbnkgdG8gcHJvdmlkZSBhIGhvbGlzdGljIGNvbXBldGl0aXZlIHN0cmF0ZWd5IHByb2dyYW0gdGhhdCBidWlsZHMgb2ZmIGFubnVhbCBXaW4vTG9zcyB0byBwcmlvcml0aXplIGZ1cnRoZXIgcmVzZWFyY2ggZm9yIHNhbGVzIGFuZCBwcm9kdWN0IG1lc3NhZ2luZyB0aHJvdWdoIGJhdHRsZWNhcmRzLCBHby1Uby1NYXJrZXQgYW5hbHlzaXMsIGNvbXBldGl0b3Igcm9hZG1hcCBzdHJhdGVneSwgYW5kIGNvbXBldGl0b3IgZGVlcCBkaXZlcy4iLA0KCQkJfSwNCgkJfTsNCg0KCQl3aW5kb3cuZHluYW1pY19vdmVydmlld19kb2N1bWVudHNfaW1hZ2VfdXJsID0NCgkJCSJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOS9pbmNyZWFzZWQtZ3Jvd3RoLTE5MjAuanBnIjsNCg0KCQl3aW5kb3cuZHluYW1pY19vdmVydmlld19kb2N1bWVudHNfZGljdGlvbmFyeSA9IHsNCgkJCSJGbGV0Y2hlciBUZWNobm9sb2d5IG92ZXJ2aWV3Ijogew0KCQkJCWxpbms6ICJodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMy8wMy9GbGV0Y2hlci1UZWNobm9sb2d5LnBkZiIsDQoJCQl9LA0KCQl9Ow0KDQoJCXdpbmRvdy5keW5hbWljX2NvbnRhY3RfcGVyc29uX2RpY3Rpb25hcnkgPSB7DQoJCQluYW1lOiAiTWFyayBHaWdsaW90dGkiLA0KCQkJdGl0bGU6ICJWaWNlIFByZXNpZGVudCwgVGVjaG5vbG9neSIsDQoJCQllbWFpbDogIm1hcmtfZ2lnbGlvdHRpQGZsZXRjaGVyY3NpLmNvbSIsDQoJCQlwaG9uZTogIisxICg4MDIpIDg4MS0xMTQzIiwNCgkJfTsNCg0KCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVESVQgQ09QWSBIRVJFIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NCgl9KTsNCg=="></script> <div id="" class="page-container container-fluid"><div id="hero-container" class="row"><div class="col position-relative background-image-zoom-on-hover-parent"><div id="industry-image" role="img" aria-label="" class="row background-image-zoom-on-hover-child"></div><div id="industry-image-filter" class="row position-absolute-stretch-to-fill background-fcsi-gradient-1-blue pass-through-pointer-events"></div><div class="row pass-through-pointer-events" id="hero-copy-container"><div class="col max-width-outer-horizontal-bounds"><div class="row mb-40 color-white" id="industry-header"><div class="col"><h1><span id="dynamic-page-title"></span></h1></div></div><div class="row all-width-two-thirds mb-40" id="industry-description"><div class="col color-white"> <span id="dynamic-hero-image-copy" class="no-hyphens"></span></div></div><div class="row" id="industry-contact-cta"><div class="col"> <a class="button m-unset catch-pointer-events" href="../contact/">Get in Touch</a></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJJChkb2N1bWVudCkuZmluZCgnI2luZHVzdHJ5LWltYWdlJykKCQkJCS5hdHRyKHsKCQkJCQknYXJpYS1sYWJlbCc6IHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUsCgkJCQkJJ3N0eWxlJzogImJhY2tncm91bmQtaW1hZ2U6IHVybCgnIiArIHdpbmRvdy5keW5hbWljX2hlcm9faW1hZ2VfdXJsICsgIicpOyIKCQkJCX0pOwoKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLXBhZ2UtdGl0bGUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfcGFnZV90aXRsZSk7CgoJCQkkKGRvY3VtZW50KS5maW5kKCdzcGFuI2R5bmFtaWMtaGVyby1pbWFnZS1jb3B5JykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2hlcm9faW1hZ2VfY29weSk7CgkJfQoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBJTklUSUFMSVpFIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkvLyBWYXJpYWJsZXM6CgkJLy8gQ29udHJvbGxlcjoKCgoJCS8vIERPTToKCgoJCS8vIEN1c3RvbToKCgoJCS8vIFN0YXRlczoKCQkvLyBIeWRyYXRlIGR5bmFtaWMgY29weToKCQloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkJLy8gUGx1Z2luczoKCQkvLyAKCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJLy8gCgoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gRVZFTlRTIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJfSk7Cg=="></script> <div class="row block-seperator border-top-green extra-copy-container"></div><div id="extra-copy-container" class="row min-height-page-block"><div class="col copy"><div class="row py-80 h-100 align-items-center justify-content-end"><div class="col center-aligned-right-padding max-width-half-outer-horizontal-bounds"><div class="row copy-header mb-20"><div class="col"><h3><span class="" id="extra-copy-header"></span></h3></div></div><div class="row copy-body"><div class="col"> <span id="extra-copy" class="d-none"></span><ul id="extra-copy-bullets" class="d-none ml-20 mb-0"></ul><li class="splide__slide h-100 horizontal-borders-transparent template"><div class="container h-100 px-30 pb-30 extra-copy"><div class="row h-100 align-items-center content"><div class="col"><div class="row copy"><div class="col h-100"> <span class="copy no-hyphens"></span></div></div><div class="row pt-15 pl-20 d-none bullets"><div class="col h-100"><ul class="bulleted-item-list"></ul></div></div></div></div></div></li><div id="extra-copy-slides-carousel" class="h-100 splide d-none" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div></div></div></div></div></div></div><div class="col background-image-zoom-on-hover-parent image"><div id="extra-copy-image" role="img" aria-label="Extra Copy Image" class="row background-image-zoom-on-hover-child"></div><div id="extra-copy-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJdmFyIGV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kID0gZmFsc2U7CgkJCWlmICgKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2hlYWRlciAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyICE9ICIiKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyLmxlbmd0aCAhPSAwKQoJCQkpIHsKCQkJCWV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kID0gdHJ1ZTsKCQkJfQoKCQkJdmFyIGV4dHJhX2NvcHlfZm91bmQgPSBmYWxzZTsKCQkJdmFyIGV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weSAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHkgIT0gIiIpICYmCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weS5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X2ZvdW5kID0gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICgKCQkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9idWxsZXRzICE9PSB1bmRlZmluZWQpICYmCgkJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfYnVsbGV0cy5sZW5ndGggIT0gMCkKCQkJCSkgewoJCQkJCWV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCA9IHRydWU7CgkJCQl9CgkJCX0KCgkJCXZhciBleHRyYV9jb3B5X3NsaWRlc19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9zbGlkZXMgIT09IHVuZGVmaW5lZCkgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X3NsaWRlcy5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X3NsaWRlc19mb3VuZCA9IHRydWU7CgkJCX0KCgkJCXZhciBleHRyYV9jb3B5X2ltYWdlX3VybF9mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9pbWFnZV91cmwgIT09IHVuZGVmaW5lZCkgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2ltYWdlX3VybCAhPSAiIikgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2ltYWdlX3VybC5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X2ltYWdlX3VybF9mb3VuZCA9IHRydWU7CgkJCX0KCgkJCWlmICgKCQkJCSgKCQkJCQlleHRyYV9jb3B5X2ZvdW5kIHx8CgkJCQkJZXh0cmFfY29weV9idWxsZXRzX2ZvdW5kIHx8CgkJCQkJZXh0cmFfY29weV9zbGlkZXNfZm91bmQKCQkJCSkgJiYKCQkJCWV4dHJhX2NvcHlfaW1hZ2VfdXJsX2ZvdW5kCgkJCSkgewoJCQkJaWYgKGV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kKSB7CgkJCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNleHRyYS1jb3B5LWhlYWRlcicpCgkJCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyKTsKCQkJCX0KCgkJCQlpZiAoZXh0cmFfY29weV9mb3VuZCkgewoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJ3NwYW4jZXh0cmEtY29weScpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJykKCQkJCQkJLnRleHQod2luZG93LmR5bmFtaWNfZXh0cmFfY29weSk7CgkJCQl9IGVsc2UgaWYgKGV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCkgewoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJ3VsI2V4dHJhLWNvcHktYnVsbGV0cycpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgoJCQkJCSQuZWFjaCgKCQkJCQkJd2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9idWxsZXRzLAoJCQkJCQlmdW5jdGlvbihleHRyYV9jb3B5X2J1bGxldF9pbmRleCwgZXh0cmFfY29weV9idWxsZXRfY29weSkgewoJCQkJCQkJJG5ld19saV9lbGVtZW50ID0gJCgnPGxpIGNsYXNzPSJtYi0xMCBuby1oeXBoZW5zIj48L2xpPicpLnRleHQoZXh0cmFfY29weV9idWxsZXRfY29weSk7CgoJCQkJCQkJJChkb2N1bWVudCkuZmluZCgndWwjZXh0cmEtY29weS1idWxsZXRzJykKCQkJCQkJCQkuYXBwZW5kKCRuZXdfbGlfZWxlbWVudCk7CgkJCQkJCX0KCQkJCQkpOwoJCQkJfSBlbHNlIGlmIChleHRyYV9jb3B5X3NsaWRlc19mb3VuZCkgewoJCQkJCS8vIENyZWF0ZSBET00gY2Fyb3VzZWwgaXRlbSBlbGVtZW50cyBmb3IgU3BsaWRlCgkJCQkJJC5lYWNoKAoJCQkJCQl3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X3NsaWRlcywKCQkJCQkJZnVuY3Rpb24oZXh0cmFfY29weV9zbGlkZV9pbmRleCwgZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdCkgewoJCQkJCQkJJG5ld19jYXJvdXNlbF9pdGVtID0gY3JlYXRlRXh0cmFDb3B5Q2Fyb3VzZWxJdGVtKGV4dHJhX2NvcHlfc2xpZGVfaW5mb19vYmplY3QpOwoKCQkJCQkJCSRleHRyYV9jb3B5X3NsaWRlc19jYXJvdXNlbAoJCQkJCQkJCS5maW5kKCJ1bC5zcGxpZGVfX2xpc3QiKQoJCQkJCQkJCS5hcHBlbmQoJG5ld19jYXJvdXNlbF9pdGVtKTsKCQkJCQkJfQoJCQkJCSk7CgoJCQkJCS8vIEluaXRpYWxpemUgYW5kIGh5ZHJhdGUgU3BsaWRlIHZhcnMgdy8gZGVmYXVsdCB2YWx1ZXM6CgkJCQkJdmFyIHNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCQkJdmFyIHNwbGlkZV9wZXJfbW92ZSA9IDE7CgkJCQkJdmFyIHNwbGlkZV9hdXRvcGxheSA9IHRydWU7CgkJCQkJdmFyIHNwbGlkZV9hcnJvd3MgPSB0cnVlOwoJCQkJCXZhciBzcGxpZGVfZHJhZyA9IHRydWU7CgoJCQkJCWxldCBleHRyYV9jb3B5X3NsaWRlc19jb3VudCA9IHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfc2xpZGVzLmxlbmd0aDsKCQkJCQlpZiAoZXh0cmFfY29weV9zbGlkZXNfY291bnQgPT0gMSkgewoJCQkJCQlzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCQkJc3BsaWRlX2RyYWcgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCS8vIEluaXRpYWxpemUgbmV3IFNwbGlkZSBpbnN0YW5jZToKCQkJCQl3aW5kb3cuZXh0cmFfY29weV9zbGlkZXNfY2Fyb3VzZWxfc3BsaWRlID0gbmV3IFNwbGlkZSgKCQkJCQkJIiNleHRyYS1jb3B5LXNsaWRlcy1jYXJvdXNlbC5zcGxpZGUiLCB7CgkJCQkJCQl0eXBlOiAibG9vcCIsCgkJCQkJCQlwZXJQYWdlOiBzcGxpZGVfcGVyX3BhZ2UsCgkJCQkJCQlwZXJNb3ZlOiBzcGxpZGVfcGVyX21vdmUsCgkJCQkJCQlzcGVlZDogMTMwMCwKCQkJCQkJCXBhZ2luYXRpb246IHRydWUsCgkJCQkJCQlhdXRvcGxheTogc3BsaWRlX2F1dG9wbGF5LAoJCQkJCQkJaW50ZXJ2YWw6IDYwMDAsCgkJCQkJCQlwYXVzZU9uSG92ZXI6IHRydWUsCgkJCQkJCQlwYXVzZU9uRm9jdXM6IHRydWUsCgkJCQkJCQlhcnJvd3M6IHNwbGlkZV9hcnJvd3MsCgkJCQkJCQlkcmFnOiBzcGxpZGVfZHJhZwoJCQkJCQl9CgkJCQkJKS5tb3VudCgpOwoKCQkJCQkkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1zbGlkZXMtY2Fyb3VzZWwnKQoJCQkJCQkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpOwoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJy5yb3cuYnVsbGV0cycpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgkJCQl9CgoJCQkJJChkb2N1bWVudCkuZmluZCgnI2V4dHJhLWNvcHktY29udGFpbmVyICNleHRyYS1jb3B5LWltYWdlJykKCQkJCQkuYXR0cignc3R5bGUnLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsgd2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9pbWFnZV91cmwgKyAiJyk7IikKCgkJCQkkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1jb250YWluZXInKS5jc3MoJ2Rpc3BsYXknLCAnZmxleCcpOwoJCQkJJChkb2N1bWVudCkuZmluZCgnLmJsb2NrLXNlcGVyYXRvci5leHRyYS1jb3B5LWNvbnRhaW5lcicpLmNzcygnZGlzcGxheScsICdmbGV4Jyk7CgkJCX0KCQl9CgoJCS8vIENyZWF0ZSBuZXcgY2Fyb3VzZWwgaXRlbSBjb2w6CgkJZnVuY3Rpb24gY3JlYXRlRXh0cmFDb3B5Q2Fyb3VzZWxJdGVtKHBhc3NlZF9leHRyYV9jb3B5X3NsaWRlX2luZm9fb2JqZWN0KSB7CgkJCXZhciAkbmV3X2V4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpID0gJGV4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpX3RlbXBsYXRlLmNsb25lKCkKCQkJCS5yZW1vdmVDbGFzcygidGVtcGxhdGUiKTsKCgkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgnLnJvdy5jb3B5IHNwYW4uY29weScpCgkJCQkuaHRtbChwYXNzZWRfZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdFsnY29weSddKTsKCgkJCXZhciBidWxsZXRlZF9pdGVtc19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkocGFzc2VkX2V4dHJhX2NvcHlfc2xpZGVfaW5mb19vYmplY3RbJ2J1bGxldHMnXSAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHBhc3NlZF9leHRyYV9jb3B5X3NsaWRlX2luZm9fb2JqZWN0WydidWxsZXRzJ10ubGVuZ3RoICE9IDApCgkJCSkgewoJCQkJYnVsbGV0ZWRfaXRlbXNfZm91bmQgPSB0cnVlOwoJCQl9CgoJCQlpZiAoYnVsbGV0ZWRfaXRlbXNfZm91bmQpIHsKCQkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgiLnJvdy5idWxsZXRzIikKCQkJCQkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpOwoKCQkJCSQuZWFjaCgKCQkJCQlwYXNzZWRfZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdFsiYnVsbGV0cyJdLAoJCQkJCWZ1bmN0aW9uKGJ1bGxldGVkX2l0ZW1faW5kZXgsIGJ1bGxldGVkX2l0ZW1fY29weSkgewoJCQkJCQkkbmV3X2J1bGxldGVkX2xpID0gJCgnPGxpIGNsYXNzPSJidWxsZXRlZC1pdGVtIG5vLWh5cGhlbnMiPjwvbGk+Jyk7CgoJCQkJCQkkbmV3X2J1bGxldGVkX2xpLmh0bWwoYnVsbGV0ZWRfaXRlbV9jb3B5KTsKCgkJCQkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgidWwuYnVsbGV0ZWQtaXRlbS1saXN0IikKCQkJCQkJCS5hcHBlbmQoJG5ld19idWxsZXRlZF9saSk7CgkJCQkJfQoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGk7CgkJfQoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIFZhcmlhYmxlczoKCQkvLyBDb250cm9sbGVyOgoKCgkJLy8gRE9NOgoJCSRleHRyYV9jb3B5X3NsaWRlc19jYXJvdXNlbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNleHRyYS1jb3B5LXNsaWRlcy1jYXJvdXNlbC5zcGxpZGUnKTsKCQkkZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGlfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1jb250YWluZXIgbGkudGVtcGxhdGUnKTsKCQljb25zb2xlLmxvZygiJGV4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpX3RlbXBsYXRlID0iLCAkZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGlfdGVtcGxhdGUpOwoKCQkvLyBDdXN0b206CgoKCQkvLyBTdGF0ZXM6CgkJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgkJaHlkcmF0ZUR5bmFtaWNDb3B5KCk7CgoJCS8vIFBsdWdpbnM6CgkJLy8gCgoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgRVZFTlRTIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIAoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCX0pOwo="></script> <div class="row border-top-green block-seperator"></div><div id="core-services-container" class="row justify-content-center min-height-page-block background-color-off-white"><div class="col mx-40 min-height-100pct all-width-outer-horizontal-bounds"><div class="row content h-100"><div class="col h-100"><div class="row py-80 h-100 w-100 flex-nowrap block-row"><div class="col-auto max-width-100pct px-0 pr-10 core-services information"><div class="row h-100 w-100 align-items-center"><div class="col-auto w-100 px-0"><div class="row mb-20 header"><div class="col"><h3 class="header">Competitive Services</h3></div></div><div class="row mb-20 w-100 core-services"><div id="core-services-col" class="col-auto w-100 px-0"><div class="row mb-20 core-service-row template"><div class="col"> <button type="button" class="core-service-button trigger-link" data-title=""><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col text-left underline-on-hover link"></div></div></div> </button></div></div><div class="row my-10 core-service-child-row template"><div class="col"> <button type="button" class="nested-core-service-button trigger-link"><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col d-flex flex-column justify-content-center underline-on-hover link"> <span class="child-name"></span></div></div></div> </button></div></div><div class="row mb-20 core-service-parent-row template"><div class="col"><div class="row parent-name"><div class="col"><h5> <span class="font-italic font-weight-normal parent-name"></span></h5></div></div><div class="row child-services"><div class="col child-services-col"></div></div></div></div></div></div></div></div></div><div class="col sub-services"><div class="container p-0 h-100 all-width-100pct w-100"><div class="row h-100"><div class="col h-100"><div class="row ml-40 border-left-1px-solid-black pl-40 min-height-100pct height-fit-content align-items-center core-service-detail-row template"><div class="col detail-container height-fit-content"><div class="row pt-40 pb-20 min-height-one-third align-items-end icon"><div class="col"></div></div><div class="row min-height-two-thirds information no-hyphens"><div class="col h-100"></div></div></div></div><li class="splide__slide h-100 horizontal-borders-transparent template"><div class="container h-100 px-30 sub-service"><div class="row icon"><div class="col h-100"></div></div><div class="row font-weight-bold title"><div class="col h-100"></div></div><div class="row information splide-information-row no-hyphens all-height-fit"><div class="col h-100"><div class="row information no-hyphens"><div class="col"></div></div><div class="row information-bullets"><div class="col"><ul class="ml-5 mr-0"><li class="template pt-3"></li></ul></div></div></div></div></div></li><div id="sub-services-carousel" class="splide h-100" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div></div></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CglmdW5jdGlvbiBoeWRyYXRlRHluYW1pY0NvcHkoKSB7CgkJdmFyICRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID0gdW5kZWZpbmVkOwoKCQlpZiAoCgkJCXdpbmRvdy5keW5hbWljX25lc3RlZF9jb3JlX3NlcnZpY2VzX2FycmF5ICE9PSB1bmRlZmluZWQgJiYKCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9IDAKCQkpIHsKCQkJY29uc29sZS5sb2coCgkJCQknd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXknLAoJCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkKCQkJKTsKCgkJCSQuZWFjaCgKCQkJCXdpbmRvdy5keW5hbWljX25lc3RlZF9jb3JlX3NlcnZpY2VzX2FycmF5LAoJCQkJZnVuY3Rpb24gKHBhcmVudF9jb3JlX3NlcnZpY2VfaW5kZXgsIHBhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QpIHsKCQkJCQkkdGhpc19uZXN0ZWRfY29yZV9zZXJ2aWNlX3BhcmVudF9yb3cgPQoJCQkJCQljcmVhdGVOZXN0ZWRDb3JlU2VydmljZVBhcmVudFJvdyhwYXJlbnRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0KTsKCgkJCQkJaWYgKCRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID09PSB1bmRlZmluZWQpIHsKCQkJCQkJJGZpcnN0X2NvcmVfc2VydmljZV9yb3cgPSAkdGhpc19uZXN0ZWRfY29yZV9zZXJ2aWNlX3BhcmVudF9yb3c7CgkJCQkJfQoJCQkJfQoJCQkpOwoJCX0gZWxzZSB7CgkJCWxldCBzb3J0ZWRfY29yZV9zZXJ2aWNlcyA9IHNvcnRDb3JlU2VydmljZXNEaWN0aW9uYXJ5KCk7CgoJCQl2YXIgc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gZmFsc2U7CgkJCWlmICgKCQkJCXNvcnRlZF9jb3JlX3NlcnZpY2VzWzBdLmluZm9fb2JqZWN0LnN1Yl9zZXJ2aWNlc19hcnJheSAhPT0gdW5kZWZpbmVkICYmCgkJCQlzb3J0ZWRfY29yZV9zZXJ2aWNlc1swXS5pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9PSAwCgkJCSkgewoJCQkJc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gdHJ1ZTsKCQkJfQoKCQkJJC5lYWNoKAoJCQkJc29ydGVkX2NvcmVfc2VydmljZXMsCgkJCQlmdW5jdGlvbiAoc29ydGVkX2NvcmVfc2VydmljZV9pbmRleCwgc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX3JvdyA9IGNyZWF0ZUNvcmVTZXJ2aWNlUm93KAoJCQkJCQlzb3J0ZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0Lm5hbWUKCQkJCQkpOwoJCQkJCWlmIChzb3J0ZWRfY29yZV9zZXJ2aWNlX2luZGV4ID09PSAwKSB7CgkJCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID0gJG5ld19jb3JlX3NlcnZpY2Vfcm93OwoJCQkJCX0KCgkJCQkJaWYgKCFzdWJfc2VydmljZXNfYXJyYXlfZm91bmQpIHsKCQkJCQkJJG5ld19jb3JlX3NlcnZpY2VfZGV0YWlsX3JvdyA9IGNyZWF0ZUNvcmVTZXJ2aWNlRGV0YWlsUm93KAoJCQkJCQkJc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5uYW1lLAoJCQkJCQkJc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5pbmZvX29iamVjdAoJCQkJCQkpOwoKCQkJCQkJaWYgKHNvcnRlZF9jb3JlX3NlcnZpY2VfaW5kZXggIT09IDApIHsKCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cuYWRkQ2xhc3MoJ2Qtbm9uZScpOwoJCQkJCQl9CgoJCQkJCQkkY29yZV9zZXJ2aWNlX2RldGFpbF9yb3dfdGVtcGxhdGUuYWZ0ZXIoCgkJCQkJCQkkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93CgkJCQkJCSk7CgoJCQkJCQlpZiAoc29ydGVkX2NvcmVfc2VydmljZV9pbmRleCA9PT0gMCkgewoJCQkJCQkJbGV0IGNvcmVfc2VydmljZXNfY29udGFpbmVyX21pbl9oZWlnaHRfcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93LmNzcygnbWluLWhlaWdodCcpCgkJCQkJCQkpOwoKCQkJCQkJCWxldCBjb21wZXRpdGl2ZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9yb3dfaGVpZ2h0X3B4ID0KCQkJCQkJCQkkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93CgkJCQkJCQkJCS5maW5kKCcuZGV0YWlsLWNvbnRhaW5lciAucm93LmluZm9ybWF0aW9uJykKCQkJCQkJCQkJLm91dGVySGVpZ2h0KCk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19wYWRkaW5nX3RvcF9weCA9IHBhcnNlSW50KAoJCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJCQkJCQkJLmZpbmQoJy5yb3cuaWNvbicpCgkJCQkJCQkJCS5jc3MoJ3BhZGRpbmctdG9wJykKCQkJCQkJCSk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19wYWRkaW5nX2JvdHRvbV9weCA9IHBhcnNlSW50KAoJCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJCQkJCQkJLmZpbmQoJy5yb3cuaWNvbicpCgkJCQkJCQkJCS5jc3MoJ3BhZGRpbmctYm90dG9tJykKCQkJCQkJCSk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19oZWlnaHRfcHggPQoJCQkJCQkJCWRldGFpbF9pY29uX3Jvd19wYWRkaW5nX3RvcF9weCArCgkJCQkJCQkJZGV0YWlsX2ljb25fcm93X3BhZGRpbmdfYm90dG9tX3B4ICsKCQkJCQkJCQk2NDsKCgkJCQkJCQlsZXQgY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ190b3BfcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93CgkJCQkJCQkJCS5maW5kKCcuYmxvY2stcm93JykKCQkJCQkJCQkJLmNzcygncGFkZGluZy10b3AnKQoJCQkJCQkJKTsKCgkJCQkJCQlsZXQgY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ19ib3R0b21fcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93CgkJCQkJCQkJCS5maW5kKCcuYmxvY2stcm93JykKCQkJCQkJCQkJLmNzcygncGFkZGluZy1ib3R0b20nKQoJCQkJCQkJKTsKCgkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9weCA9CgkJCQkJCQkJY29tcGV0aXRpdmVfc2VydmljZXNfaW5mb3JtYXRpb25fcm93X2hlaWdodF9weCArCgkJCQkJCQkJZGV0YWlsX2ljb25fcm93X2hlaWdodF9weCArCgkJCQkJCQkJY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ190b3BfcHggKwoJCQkJCQkJCWNvcmVfc2VydmljZXNfY29udGFpbmVyX3BhZGRpbmdfYm90dG9tX3B4OwoKCQkJCQkJCWlmICgKCQkJCQkJCQluZXdfY29yZV9zZXJ2aWNlc19jb250YWluZXJfaGVpZ2h0X3B4ID4KCQkJCQkJCQljb3JlX3NlcnZpY2VzX2NvbnRhaW5lcl9taW5faGVpZ2h0X3B4CgkJCQkJCQkpIHsKCQkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX21pbl9oZWlnaHRfc3RyaW5nID0KCQkJCQkJCQkJbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9weCArICdweCAhaW1wb3J0YW50JzsKCQkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9zdHJpbmcgPQoJCQkJCQkJCQluZXdfY29yZV9zZXJ2aWNlc19jb250YWluZXJfaGVpZ2h0X3B4ICsgJ3B4JzsKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93LmF0dHIoCgkJCQkJCQkJCSdzdHlsZScsCgkJCQkJCQkJCSdtaW4taGVpZ2h0OiAnICsKCQkJCQkJCQkJCW5ld19jb3JlX3NlcnZpY2VzX2NvbnRhaW5lcl9taW5faGVpZ2h0X3N0cmluZyArCgkJCQkJCQkJCQknOyBoZWlnaHQ6ICcgKwoJCQkJCQkJCQkJbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9zdHJpbmcKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkpOwoJCX0KCgkJLy8gU3RhdGVzIGZvciBpbml0aWFsIHNlbGVjdGlvbiBvZiBidXR0b25zOgoJCXNldFRpbWVvdXQoKCkgPT4gewoJCQlpZiAoCgkJCQkkZmlyc3RfY29yZV9zZXJ2aWNlX3Jvdy5maW5kKCdidXR0b24uY29yZS1zZXJ2aWNlLWJ1dHRvbicpLmxlbmd0aCAhPT0gMAoJCQkpIHsKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93LmZpbmQoJ2J1dHRvbi5jb3JlLXNlcnZpY2UtYnV0dG9uJykuY2xpY2soKTsKCQkJfSBlbHNlIGlmICgKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93LmZpbmQoCgkJCQkJJy5yb3cuY29yZS1zZXJ2aWNlLWNoaWxkLXJvdzpmaXJzdC1jaGlsZCgpIGJ1dHRvbi5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicKCQkJCSkgIT09IHVuZGVmaW5lZAoJCQkpIHsKCQkJCSR0ZXN0ID0gJGZpcnN0X2NvcmVfc2VydmljZV9yb3cuZmluZCgKCQkJCQknLnJvdy5jb3JlLXNlcnZpY2UtY2hpbGQtcm93OmZpcnN0LWNoaWxkKCkgYnV0dG9uLm5lc3RlZC1jb3JlLXNlcnZpY2UtYnV0dG9uJwoJCQkJKTsKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93CgkJCQkJLmZpbmQoCgkJCQkJCScucm93LmNvcmUtc2VydmljZS1jaGlsZC1yb3c6Zmlyc3QtY2hpbGQoKSBidXR0b24ubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24nCgkJCQkJKQoJCQkJCS5jbGljaygpOwoJCQl9CgkJfSwgMSk7Cgl9CgoJLy8gQ3JlYXRlIG5ldyBjb3JlIHNlcnZpY2Ugcm93OgoJZnVuY3Rpb24gY3JlYXRlQ29yZVNlcnZpY2VSb3cocGFzc2VkX2NvcmVfc2VydmljZV9uYW1lKSB7CgkJdmFyICRuZXdfY29yZV9zZXJ2aWNlX3JvdyA9ICRjb3JlX3NlcnZpY2Vfcm93X3RlbXBsYXRlCgkJCS5jbG9uZSgpCgkJCS5yZW1vdmVDbGFzcygndGVtcGxhdGUnKTsKCgkJJG5ld19jb3JlX3NlcnZpY2Vfcm93CgkJCS5maW5kKCdidXR0b24uY29yZS1zZXJ2aWNlLWJ1dHRvbicpCgkJCS5hdHRyKCdkYXRhLXRpdGxlJywgcGFzc2VkX2NvcmVfc2VydmljZV9uYW1lKTsKCQkkbmV3X2NvcmVfc2VydmljZV9yb3cuZmluZCgnLmNvbC5saW5rJykudGV4dChwYXNzZWRfY29yZV9zZXJ2aWNlX25hbWUpOwoKCQkkY29yZV9zZXJ2aWNlc19jb2wuYXBwZW5kKCRuZXdfY29yZV9zZXJ2aWNlX3Jvdyk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9yb3c7Cgl9CgoJLy8gQ3JlYXRlIG5ldyBjYXJvdXNlbCBpdGVtIGNvbDoKCWZ1bmN0aW9uIGNyZWF0ZVN1YlNlcnZpY2VDYXJvdXNlbEl0ZW0ocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0KSB7CgkJdmFyICRuZXdfc3ViX3NlcnZpY2VfbGkgPSAkc3ViX3NlcnZpY2VfbGlfdGVtcGxhdGUKCQkJLmNsb25lKCkKCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCS5maW5kKCcucm93Lmljb24gPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0WydpY29uX2ltZ19odG1sJ10pOwoJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJLmZpbmQoJy5yb3cudGl0bGUgPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0Wyd0aXRsZSddKTsKCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uID4gLmNvbCcpCgkJCS5odG1sKHBhc3NlZF9zdWJfc2VydmljZV9pbmZvX29iamVjdFsnaW5mb3JtYXRpb24nXSk7CgoJCXJldHVybiAkbmV3X3N1Yl9zZXJ2aWNlX2xpOwoJfQoKCS8vIENyZWF0ZSBDb3JlIFNlcnZpY2UgaXRlbSBjb2w6CglmdW5jdGlvbiBjcmVhdGVDb3JlU2VydmljZURldGFpbFJvdygKCQlwYXNzZWRfY29yZV9zZXJ2aWNlX25hbWUsCgkJcGFzc2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdAoJKSB7CgkJJG5ld19jb3JlX3NlcnZpY2VfZGV0YWlsX3JvdyA9ICRjb3JlX3NlcnZpY2VfZGV0YWlsX3Jvd190ZW1wbGF0ZQoJCQkuY2xvbmUoKQoJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cuYXR0cignbmFtZScsIHBhc3NlZF9jb3JlX3NlcnZpY2VfbmFtZSk7CgoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJLmZpbmQoJy5yb3cuaWNvbiA+IC5jb2wnKQoJCQkuaHRtbChwYXNzZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0WydpY29uX2ltZ19odG1sJ10pOwoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJLmZpbmQoJy5yb3cuaW5mb3JtYXRpb24gPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdFsnaW5mb3JtYXRpb24nXSk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93OwoJfQoKCWZ1bmN0aW9uIHNvcnRDb3JlU2VydmljZXNEaWN0aW9uYXJ5KCkgewoJCWxldCBwcmVfc29ydGVkX2NvcmVfc2VydmljZXMgPSBbXTsKCQlmb3IgKHZhciB0ZW1wX2NvcmVfc2VydmljZV9uYW1lIGluIHdpbmRvdy5keW5hbWljX2NvcmVfc2VydmljZXNfZGljdGlvbmFyeSkgewoJCQlwcmVfc29ydGVkX2NvcmVfc2VydmljZXMucHVzaCh7CgkJCQluYW1lOiB0ZW1wX2NvcmVfc2VydmljZV9uYW1lLAoJCQkJaW5mb19vYmplY3Q6CgkJCQkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5W3RlbXBfY29yZV9zZXJ2aWNlX25hbWVdLAoJCQl9KTsKCQl9CgoJCXZhciBsb25nZXN0X2luZm9ybWF0aW9uX3N0cmluZ19sZW5ndGggPSAwOwoJCXZhciBsb25nZXN0X2luZm9ybWF0aW9uX2luZGV4ID0gMDsKCQkkLmVhY2goCgkJCXByZV9zb3J0ZWRfY29yZV9zZXJ2aWNlcywKCQkJZnVuY3Rpb24gKGNvcmVfc2VydmljZV9pbmRleCwgcHJlc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJaWYgKAoJCQkJCXByZXNvcnRlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb19vYmplY3QuaW5mb3JtYXRpb24gIT0KCQkJCQkJdW5kZWZpbmVkICYmCgkJCQkJcHJlc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5pbmZvX29iamVjdC5pbmZvcm1hdGlvbi5sZW5ndGggPgoJCQkJCQlsb25nZXN0X2luZm9ybWF0aW9uX3N0cmluZ19sZW5ndGgKCQkJCSkgewoJCQkJCWxvbmdlc3RfaW5mb3JtYXRpb25fc3RyaW5nX2xlbmd0aCA9CgkJCQkJCXByZXNvcnRlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb19vYmplY3QuaW5mb3JtYXRpb24ubGVuZ3RoOwoJCQkJCWxvbmdlc3RfaW5mb3JtYXRpb25faW5kZXggPSBjb3JlX3NlcnZpY2VfaW5kZXg7CgkJCQl9CgkJCX0KCQkpOwoKCQlsZXQgbG9uZ2VzdF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QgPSBwcmVfc29ydGVkX2NvcmVfc2VydmljZXMuc3BsaWNlKAoJCQlsb25nZXN0X2luZm9ybWF0aW9uX2luZGV4LAoJCQkxCgkJKVswXTsKCgkJcHJlX3NvcnRlZF9jb3JlX3NlcnZpY2VzLnVuc2hpZnQobG9uZ2VzdF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QpOwoKCQl2YXIgc29ydGVkX2NvcmVfc2VydmljZXMgPSBwcmVfc29ydGVkX2NvcmVfc2VydmljZXM7CgoJCXJldHVybiBzb3J0ZWRfY29yZV9zZXJ2aWNlczsKCX0KCgkvLyBDcmVhdGUgbmV3IGNvcmUgc2VydmljZSByb3c6CglmdW5jdGlvbiBjcmVhdGVOZXN0ZWRDb3JlU2VydmljZVBhcmVudFJvdygKCQlwYXNzZWRfcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdAoJKSB7CgkJdmFyICRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9wYXJlbnRfcm93ID0KCQkJJGNvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3Jvd190ZW1wbGF0ZS5jbG9uZSgpLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3JvdwoJCQkuZmluZCgnc3Bhbi5wYXJlbnQtbmFtZScpCgkJCS50ZXh0KHBhc3NlZF9wYXJlbnRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0LnBhcmVudF9jb3JlX3NlcnZpY2VfbmFtZSk7CgoJCWlmICgKCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuY2hpbGRyZW5fY29yZV9zZXJ2aWNlcyAhPT0KCQkJCXVuZGVmaW5lZCAmJgoJCQlwYXNzZWRfcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5jaGlsZHJlbl9jb3JlX3NlcnZpY2VzLmxlbmd0aCA+IDAKCQkpIHsKCQkJJC5lYWNoKAoJCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuY2hpbGRyZW5fY29yZV9zZXJ2aWNlcywKCQkJCWZ1bmN0aW9uIChjaGlsZF9jb3JlX3NlcnZpY2VfaW5kZXgsIGNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJCXZhciAkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93ID0KCQkJCQkJJGNvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93X3RlbXBsYXRlCgkJCQkJCQkuY2xvbmUoKQoJCQkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCQkkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93CgkJCQkJCS5maW5kKCdzcGFuLmNoaWxkLW5hbWUnKQoJCQkJCQkudGV4dChjaGlsZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QubmFtZSk7CgoJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3cKCQkJCQkJLmZpbmQoJ2J1dHRvbi5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicpCgkJCQkJCS5hdHRyKHsKCQkJCQkJCSdkYXRhLXBhcmVudC1jb3JlLXNlcnZpY2UtbmFtZSc6CgkJCQkJCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QucGFyZW50X2NvcmVfc2VydmljZV9uYW1lLAoJCQkJCQkJJ2RhdGEtY2hpbGQtY29yZS1zZXJ2aWNlLW5hbWUnOgoJCQkJCQkJCWNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5uYW1lLAoJCQkJCQl9KTsKCgkJCQkJJG5ld19jb3JlX3NlcnZpY2VfbmVzdGVkX3BhcmVudF9yb3cKCQkJCQkJLmZpbmQoJy5jaGlsZC1zZXJ2aWNlcy1jb2wnKQoJCQkJCQkuYXBwZW5kKCRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3cpOwoJCQkJfQoJCQkpOwoJCX0KCgkJJGNvcmVfc2VydmljZXNfY29sLmFwcGVuZCgkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3Jvdyk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3JvdzsKCX0KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBWYXJpYWJsZXM6CgkvLyBWYXJpYWJsZXMgPj4+IENvbnRyb2xsZXI6CgoJLy8gVmFyaWFibGVzID4+PiBET006Cgl2YXIgJGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sID0gJChkb2N1bWVudCkuZmluZCgKCQknLmNvcmUtc2VydmljZXMuaW5mb3JtYXRpb24nCgkpOwoJdmFyICRjb3JlX3NlcnZpY2VzX3N1Yl9zZXJ2aWNlc19jb2wgPSAkKGRvY3VtZW50KS5maW5kKCcuY29sLnN1Yi1zZXJ2aWNlcycpOwoKCXZhciAkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93ID0gJChkb2N1bWVudCkuZmluZCgKCQknI2NvcmUtc2VydmljZXMtY29udGFpbmVyJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlc19jb2wgPSAkKGRvY3VtZW50KS5maW5kKCcjY29yZS1zZXJ2aWNlcy1jb2wnKTsKCXZhciAkY29yZV9zZXJ2aWNlX3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoCgkJJy5jb3JlLXNlcnZpY2Utcm93LnRlbXBsYXRlJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlX25lc3RlZF9wYXJlbnRfcm93X3RlbXBsYXRlID0gJChkb2N1bWVudCkuZmluZCgKCQknLmNvcmUtc2VydmljZS1wYXJlbnQtcm93LnRlbXBsYXRlJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3dfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKAoJCScuY29yZS1zZXJ2aWNlLWNoaWxkLXJvdy50ZW1wbGF0ZScKCSk7CgoJdmFyICRjb3JlX3NlcnZpY2VfZGV0YWlsX3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoCgkJJy5jb3JlLXNlcnZpY2UtZGV0YWlsLXJvdy50ZW1wbGF0ZScKCSk7CgoJdmFyICRzdWJfc2VydmljZXNfY2Fyb3VzZWwgPSAkKGRvY3VtZW50KS5maW5kKCcjc3ViLXNlcnZpY2VzLWNhcm91c2VsJyk7Cgl2YXIgJHN1Yl9zZXJ2aWNlX2xpX3RlbXBsYXRlID0gJHN1Yl9zZXJ2aWNlc19jYXJvdXNlbC5zaWJsaW5ncygnbGkudGVtcGxhdGUnKTsKCgkvLyBWYXJpYWJsZXMgPj4+IEN1c3RvbToKCXdpbmRvdy5hY3RpdmVfY29yZV9zZXJ2aWNlX3RpdGxlID0gJyc7CgoJLy8gU3RhdGVzOgoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkvLyBTZXQgbWF4IHdpZHRoIGR5bmFtaWNhbGx5IG9uICRjb3JlX3NlcnZpY2VzX3N1Yl9zZXJ2aWNlc19jb2w6CglsZXQgY29yZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9jb2xfd2lkdGggPQoJCSRjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbC5vdXRlcldpZHRoKHRydWUpOwoKCWxldCAkY29yZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9jb2xfcGFyZW50X3JvdyA9CgkJJGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sLnBhcmVudCgnLnJvdycpOwoJbGV0IGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sX3BhcmVudF9yb3dfd2lkdGggPQoJCSRjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93Lm91dGVyV2lkdGgodHJ1ZSk7CgoJbGV0IGNvcmVfc2VydmljZXNfc3ViX3NlcnZpY2VzX2NvbF93aWR0aCA9CgkJTnVtYmVyKAoJCQljb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93X3dpZHRoIC0KCQkJCWNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sX3dpZHRoCgkJKSArICdweCc7CgkkY29yZV9zZXJ2aWNlc19zdWJfc2VydmljZXNfY29sLmNzcygKCQknd2lkdGgnLAoJCWNvcmVfc2VydmljZXNfc3ViX3NlcnZpY2VzX2NvbF93aWR0aAoJKTsKCgkvLyBQbHVnaW5zOgoJLy8KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBIYW5kbGUgYSBDTElDSyBvbiBvbmUgb2YgdGhlICRjb3JlX3NlcnZpY2VfYnV0dG9uczoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCcuY29yZS1zZXJ2aWNlLWJ1dHRvbicsICdjbGljaycsIGZ1bmN0aW9uIChldmVudCkgewoJCS8vIERlc3Ryb3kgZXhpc3Rpbmcgd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgU3BsaWRlIGluc3RhbmNlIGlmIGV4aXN0czoKCQlpZiAod2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgIT09IHVuZGVmaW5lZCkgewoJCQl3aW5kb3cuc3ViX3NlcnZpY2VzX2Nhcm91c2VsX3NwbGlkZS5kZXN0cm95KHRydWUpOwoJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsLmZpbmQoJ2xpLnNwbGlkZV9fc2xpZGUnKS5yZW1vdmUoKTsKCQl9CgoJCS8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBzaWJsaW5nIENvcmUgU2VydmljZSBidXR0b25zOgoJCSQoZG9jdW1lbnQpLmZpbmQoJy5jb3JlLXNlcnZpY2UtYnV0dG9uJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoKCQkvLyBBZGQgYWN0aXZlIGNsYXNzIHRvIHRoaXMgY2xpY2tlZCBDb3JlIFNlcnZpY2UgYnV0dG9uOgoJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKCQl2YXIgY2xpY2tlZF9jb3JlX3NlcnZpY2VfdGl0bGUgPSAkKHRoaXMpLmRhdGEoJ3RpdGxlJyk7CgkJd2luZG93LmFjdGl2ZV9jb3JlX3NlcnZpY2VfdGl0bGUgPSBjbGlja2VkX2NvcmVfc2VydmljZV90aXRsZTsKCgkJbGV0IGNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0ID0KCQkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5W2NsaWNrZWRfY29yZV9zZXJ2aWNlX3RpdGxlXTsKCgkJbGV0IHN1Yl9zZXJ2aWNlX2NvdW50ID0KCQkJY2xpY2tlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3RbJ3N1Yl9zZXJ2aWNlc19hcnJheSddLmxlbmd0aDsKCgkJLy8gQ2hlY2sgZm9yIENvcmUgU2VydmljZXMgT05MWSAtT1ItIENvcmUgU2VydmljZXMgdy8gU3ViIFNlcnZpY2VzOgoJCXZhciBjb3JlX3NlcnZpY2VfaW5mb3JtYXRpb25fZm91bmQgPSBmYWxzZTsKCQlpZiAoCgkJCWNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0LmluZm9ybWF0aW9uICE9PSB1bmRlZmluZWQgJiYKCQkJY2xpY2tlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb3JtYXRpb24gIT09ICcnCgkJKSB7CgkJCWNvcmVfc2VydmljZV9pbmZvcm1hdGlvbl9mb3VuZCA9IHRydWU7CgkJfQoKCQl2YXIgc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gZmFsc2U7CgkJaWYgKAoJCQljbGlja2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkgIT09IHVuZGVmaW5lZCAmJgoJCQljbGlja2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9PSAwCgkJKSB7CgkJCXN1Yl9zZXJ2aWNlc19hcnJheV9mb3VuZCA9IHRydWU7CgkJfQoKCQlpZiAoIXN1Yl9zZXJ2aWNlc19hcnJheV9mb3VuZCAmJiBjb3JlX3NlcnZpY2VfaW5mb3JtYXRpb25fZm91bmQpIHsKCQkJJChkb2N1bWVudCkKCQkJCS5maW5kKCcucm93LmNvcmUtc2VydmljZS1kZXRhaWwtcm93Om5vdCgudGVtcGxhdGUpJykKCQkJCS5ub3QoYFtuYW1lPSIke2NsaWNrZWRfY29yZV9zZXJ2aWNlX3RpdGxlfSJdYCkKCQkJCS5hZGRDbGFzcygnZC1ub25lJyk7CgoJCQkkKGRvY3VtZW50KQoJCQkJLmZpbmQoCgkJCQkJYC5yb3cuY29yZS1zZXJ2aWNlLWRldGFpbC1yb3dbbmFtZT0iJHtjbGlja2VkX2NvcmVfc2VydmljZV90aXRsZX0iXWAKCQkJCSkKCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgkJfSBlbHNlIHsKCQkJLy8gQ29yZSBTZXJ2aWNlcyB3LyBTdWIgU2VydmljZXM6CgkJCS8vIENyZWF0ZSBET00gY2Fyb3VzZWwgaXRlbSBlbGVtZW50cyBmb3IgU3BsaWRlCgkJCSQuZWFjaCgKCQkJCWNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0WydzdWJfc2VydmljZXNfYXJyYXknXSwKCQkJCWZ1bmN0aW9uIChzdWJfc2VydmljZV9pbmRleCwgc3ViX3NlcnZpY2VfaW5mb19vYmplY3QpIHsKCQkJCQkkbmV3X2Nhcm91c2VsX2l0ZW0gPSBjcmVhdGVTdWJTZXJ2aWNlQ2Fyb3VzZWxJdGVtKAoJCQkJCQlzdWJfc2VydmljZV9pbmZvX29iamVjdAoJCQkJCSk7CgoJCQkJCSRzdWJfc2VydmljZXNfY2Fyb3VzZWwKCQkJCQkJLmZpbmQoJ3VsLnNwbGlkZV9fbGlzdCcpCgkJCQkJCS5hcHBlbmQoJG5ld19jYXJvdXNlbF9pdGVtKTsKCQkJCX0KCQkJKTsKCgkJCS8vIEluaXRpYWxpemUgYW5kIGh5ZHJhdGUgU3BsaWRlIHZhcnMgdy8gZGVmYXVsdCB2YWx1ZXM6CgkJCXZhciBtaW5fc2xpZGVfcGl4ZWxfd2lkdGggPSAyNTY7CgkJCXZhciBzcGxpZGVfcGVyX3BhZ2UgPSAzOwoJCQl2YXIgc3BsaWRlX3Blcl9tb3ZlID0gMTsKCQkJdmFyIHNwbGlkZV9hdXRvcGxheSA9IHRydWU7CgkJCXZhciBzcGxpZGVfYXJyb3dzID0gdHJ1ZTsKCQkJdmFyIHNwbGlkZV9kcmFnID0gdHJ1ZTsKCgkJCXZhciBzdWJfc2VydmljZXNfaG9yaXpvbnRhbF9tYXJnaW4gPSAzMiArIDMyOwoJCQkvLyBSdW4gTWVkaWEgUXVlcnkgdG8gY29uZmlndXJlIFNwbGlkZSB2YXJzOgoJCQlpZiAoTW9kZXJuaXpyLm1xKCdzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzNjlweCknKSkgewoJCQkJc3ViX3NlcnZpY2VzX2hvcml6b250YWxfbWFyZ2luID0gMjQgKyAyNDsKCQkJfQoKCQkJc3BsaWRlX3Blcl9wYWdlID0gTWF0aC5mbG9vcigKCQkJCShjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93X3dpZHRoIC0KCQkJCQljb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF93aWR0aCAtCgkJCQkJc3ViX3NlcnZpY2VzX2hvcml6b250YWxfbWFyZ2luKSAvCgkJCQkJbWluX3NsaWRlX3BpeGVsX3dpZHRoCgkJCSk7CgoJCQlpZiAoc3BsaWRlX3Blcl9wYWdlIDw9IDApIHsKCQkJCXNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCX0KCgkJCWlmIChzcGxpZGVfcGVyX3BhZ2UgPiBzdWJfc2VydmljZV9jb3VudCkgewoJCQkJc3BsaWRlX3Blcl9wYWdlID0gc3ViX3NlcnZpY2VfY291bnQ7CgkJCX0KCgkJCWlmIChzdWJfc2VydmljZV9jb3VudCA9PSAxKSB7CgkJCQlzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCXNwbGlkZV9kcmFnID0gZmFsc2U7CgkJCX0KCgkJCS8vIEluaXRpYWxpemUgbmV3IFNwbGlkZSBpbnN0YW5jZToKCQkJd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgPSBuZXcgU3BsaWRlKAoJCQkJJyNzdWItc2VydmljZXMtY2Fyb3VzZWwuc3BsaWRlJywKCQkJCXsKCQkJCQl0eXBlOiAnbG9vcCcsCgkJCQkJcGVyUGFnZTogc3BsaWRlX3Blcl9wYWdlLAoJCQkJCXBlck1vdmU6IHNwbGlkZV9wZXJfbW92ZSwKCQkJCQlzcGVlZDogMTMwMCwKCQkJCQlwYWdpbmF0aW9uOiBmYWxzZSwKCQkJCQlhdXRvcGxheTogc3BsaWRlX2F1dG9wbGF5LAoJCQkJCWludGVydmFsOiA0MDAwLAoJCQkJCXBhdXNlT25Ib3ZlcjogdHJ1ZSwKCQkJCQlwYXVzZU9uRm9jdXM6IHRydWUsCgkJCQkJYXJyb3dzOiBzcGxpZGVfYXJyb3dzLAoJCQkJCWRyYWc6IHNwbGlkZV9kcmFnLAoJCQkJfQoJCQkpLm1vdW50KCk7CgkJfQoJfSk7CgoJLy8gSGFuZGxlIGEgQ0xJQ0sgb24gb25lIG9mIHRoZSAubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24gYnV0dG9uczoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKAoJCScubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24nLAoJCSdjbGljaycsCgkJZnVuY3Rpb24gKGV2ZW50KSB7CgkJCS8vIERlc3Ryb3kgZXhpc3Rpbmcgd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgU3BsaWRlIGluc3RhbmNlIGlmIGV4aXN0czoKCQkJaWYgKHdpbmRvdy5zdWJfc2VydmljZXNfY2Fyb3VzZWxfc3BsaWRlICE9PSB1bmRlZmluZWQpIHsKCQkJCXdpbmRvdy5zdWJfc2VydmljZXNfY2Fyb3VzZWxfc3BsaWRlLmRlc3Ryb3kodHJ1ZSk7CgkJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsLmZpbmQoJ2xpLnNwbGlkZV9fc2xpZGUnKS5yZW1vdmUoKTsKCQkJfQoKCQkJLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIHNpYmxpbmcgQ29yZSBTZXJ2aWNlIGJ1dHRvbnM6CgkJCSQoZG9jdW1lbnQpLmZpbmQoJy5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCgkJCS8vIEFkZCBhY3RpdmUgY2xhc3MgdG8gdGhpcyBjbGlja2VkIENvcmUgU2VydmljZSBidXR0b246CgkJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKCQkJY29uc3QgY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QgPQoJCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkKCQkJCQkuZmluZCgKCQkJCQkJcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdCA9PgoJCQkJCQkJcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5wYXJlbnRfY29yZV9zZXJ2aWNlX25hbWUgPT09CgkJCQkJCQkkKHRoaXMpLmRhdGEoJ3BhcmVudC1jb3JlLXNlcnZpY2UtbmFtZScpCgkJCQkJKQoJCQkJCS5jaGlsZHJlbl9jb3JlX3NlcnZpY2VzLmZpbmQoCgkJCQkJCWNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCA9PgoJCQkJCQkJY2hpbGRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0Lm5hbWUgPT09CgkJCQkJCQkkKHRoaXMpLmRhdGEoJ2NoaWxkLWNvcmUtc2VydmljZS1uYW1lJykKCQkJCQkpOwoKCQkJY29uc3QgaW5mb3JtYXRpb25Gb3VuZCA9CgkJCQkhIWNoaWxkQ29yZVNlcnZpY2VJbmZvT2JqZWN0Py5pbmZvcm1hdGlvbiA/PyBmYWxzZTsKCgkJCWNvbnN0IGluZm9ybWF0aW9uQnVsbGV0c0ZvdW5kID0KCQkJCSEhY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3Q/LmluZm9ybWF0aW9uX2J1bGxldHM/Lmxlbmd0aCA/PyBmYWxzZTsKCgkJCWNvbnN0IGljb25JbWdIdG1sRm91bmQgPQoJCQkJISFjaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdD8uaWNvbl9pbWdfaHRtbCA/PyBmYWxzZTsKCgkJCWlmIChpbmZvcm1hdGlvbkZvdW5kIHx8IGluZm9ybWF0aW9uQnVsbGV0c0ZvdW5kKSB7CgkJCQl2YXIgJG5ld19zdWJfc2VydmljZV9saSA9ICRzdWJfc2VydmljZV9saV90ZW1wbGF0ZQoJCQkJCS5jbG9uZSgpCgkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkuZmluZCgnLmNvbnRhaW5lci5zdWItc2VydmljZScpCgkJCQkJLmFkZENsYXNzKCdkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlcicpOwoKCQkJCWlmIChNb2Rlcm5penIubXEoJ3NjcmVlbiBhbmQgKG1heC13aWR0aDogNDQ0cHgpJykpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy50aXRsZScpCgkJCQkJCS5odG1sKAoJCQkJCQkJIjxkaXYgY2xhc3M9J2NvbCBwYi0zJz48ZGl2IGNsYXNzPSdyb3cnPjxkaXYgY2xhc3M9J2NvbCBmb250LWl0YWxpYyBmb250LXdlaWdodC1ub3JtYWwnPiIgKwoJCQkJCQkJCSQodGhpcykuZGF0YSgncGFyZW50LWNvcmUtc2VydmljZS1uYW1lJykgKwoJCQkJCQkJCSI6PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ncm93Jz48ZGl2IGNsYXNzPSdjb2wnPiIgKwoJCQkJCQkJCSQodGhpcykuZGF0YSgnY2hpbGQtY29yZS1zZXJ2aWNlLW5hbWUnKSArCgkJCQkJCQkJJzwvZGl2PjwvZGl2PjwvZGl2PicKCQkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkuZmluZCgnLmNvbnRhaW5lci5zdWItc2VydmljZSA+IC5yb3cudGl0bGUnKQoJCQkJCQkucmVtb3ZlKCk7CgkJCQl9CgoJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy5pbmZvcm1hdGlvbicpCgkJCQkJLnJlbW92ZUNsYXNzKCdzcGxpZGUtaW5mb3JtYXRpb24tcm93Jyk7CgoJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy5pbmZvcm1hdGlvbiA+IC5jb2wnKQoJCQkJCS5yZW1vdmVDbGFzcygnaC0xMDAnKQoJCQkJCS5hZGRDbGFzcygnbWF4LWhlaWdodC1maXQgbm8taHlwaGVucyBoZWlnaHQtZml0LWNvbnRlbnQnKTsKCgkJCQlpZiAoaWNvbkltZ0h0bWxGb3VuZCkgewoJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkJLmZpbmQoJy5yb3cuaWNvbiA+IC5jb2wnKQoJCQkJCQkuYWRkQ2xhc3MoJ3BiLTIwJykKCQkJCQkJLmh0bWwoY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QuaWNvbl9pbWdfaHRtbCk7CgkJCQl9IGVsc2UgewoJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkuZmluZCgnLnJvdy5pY29uJykucmVtb3ZlKCk7CgkJCQl9CgoJCQkJaWYgKGluZm9ybWF0aW9uRm91bmQgJiYgaW5mb3JtYXRpb25CdWxsZXRzRm91bmQpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uIC5yb3cuaW5mb3JtYXRpb24gPiAuY29sJykKCQkJCQkJLmh0bWwoY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QuaW5mb3JtYXRpb24pOwoKCQkJCQljaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdC5pbmZvcm1hdGlvbl9idWxsZXRzLmZvckVhY2goCgkJCQkJCWluZm9ybWF0aW9uQnVsbGV0U3RyaW5nID0+IHsKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpID0gJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uLWJ1bGxldHMgbGkudGVtcGxhdGUnKQoJCQkJCQkJCS5jbG9uZSgpCgkJCQkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpLmh0bWwoaW5mb3JtYXRpb25CdWxsZXRTdHJpbmcpOwoKCQkJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkJCQkuZmluZCgnLnJvdy5pbmZvcm1hdGlvbi1idWxsZXRzIHVsJykKCQkJCQkJCQkuYXBwZW5kKCRuZXdJbmZvcm1hdGlvbkJ1bGxldExpKTsKCQkJCQkJfQoJCQkJCSk7CgkJCQl9IGVsc2UgaWYgKGluZm9ybWF0aW9uRm91bmQpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uID4gLmNvbCcpCgkJCQkJCS5odG1sKGNoaWxkQ29yZVNlcnZpY2VJbmZvT2JqZWN0LmluZm9ybWF0aW9uKTsKCQkJCX0gZWxzZSBpZiAoaW5mb3JtYXRpb25CdWxsZXRzRm91bmQpIHsKCQkJCQljaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdC5pbmZvcm1hdGlvbl9idWxsZXRzLmZvckVhY2goCgkJCQkJCWluZm9ybWF0aW9uQnVsbGV0U3RyaW5nID0+IHsKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpID0gJHN1Yl9zZXJ2aWNlX2xpX3RlbXBsYXRlCgkJCQkJCQkJLmZpbmQoJy5yb3cuaW5mb3JtYXRpb24tYnVsbGV0cyBsaS50ZW1wbGF0ZScpCgkJCQkJCQkJLmNsb25lKCkKCQkJCQkJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCQkJCQkJJG5ld0luZm9ybWF0aW9uQnVsbGV0TGkuaHRtbChpbmZvcm1hdGlvbkJ1bGxldFN0cmluZyk7CgoJCQkJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uLWJ1bGxldHMgdWwnKQoJCQkJCQkJCS5hcHBlbmQoJG5ld0luZm9ybWF0aW9uQnVsbGV0TGkpOwoJCQkJCQl9CgkJCQkJKTsKCQkJCX0KCgkJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsCgkJCQkJLmZpbmQoJ3VsLnNwbGlkZV9fbGlzdCcpCgkJCQkJLmFwcGVuZCgkbmV3X3N1Yl9zZXJ2aWNlX2xpKTsKCgkJCQkvLyBJbml0aWFsaXplIGFuZCBoeWRyYXRlIFNwbGlkZSB2YXJzIHcvIGRlZmF1bHQgdmFsdWVzOgoJCQkJdmFyIHNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCQl2YXIgc3BsaWRlX3Blcl9tb3ZlID0gMTsKCQkJCXZhciBzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCXZhciBzcGxpZGVfYXJyb3dzID0gZmFsc2U7CgkJCQl2YXIgc3BsaWRlX2RyYWcgPSBmYWxzZTsKCgkJCQkvLyBJbml0aWFsaXplIG5ldyBTcGxpZGUgaW5zdGFuY2U6CgkJCQl3aW5kb3cuc3ViX3NlcnZpY2VzX2Nhcm91c2VsX3NwbGlkZSA9IG5ldyBTcGxpZGUoCgkJCQkJJyNzdWItc2VydmljZXMtY2Fyb3VzZWwuc3BsaWRlJywKCQkJCQl7CgkJCQkJCXR5cGU6ICdsb29wJywKCQkJCQkJcGVyUGFnZTogc3BsaWRlX3Blcl9wYWdlLAoJCQkJCQlwZXJNb3ZlOiBzcGxpZGVfcGVyX21vdmUsCgkJCQkJCXNwZWVkOiAxMzAwLAoJCQkJCQlwYWdpbmF0aW9uOiBmYWxzZSwKCQkJCQkJYXV0b3BsYXk6IHNwbGlkZV9hdXRvcGxheSwKCQkJCQkJaW50ZXJ2YWw6IDQwMDAsCgkJCQkJCXBhdXNlT25Ib3ZlcjogdHJ1ZSwKCQkJCQkJcGF1c2VPbkZvY3VzOiB0cnVlLAoJCQkJCQlhcnJvd3M6IHNwbGlkZV9hcnJvd3MsCgkJCQkJCWRyYWc6IHNwbGlkZV9kcmFnLAoJCQkJCX0KCQkJCSkubW91bnQoKTsKCQkJfQoJCX0KCSk7CgoJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KfSk7Cg=="></script> <div class="row block-seperator border-top-green"></div><div id="case-studies-container" class="row justify-content-center min-height-page-block"><div class="col case-studies-link-container"><div class="row h-100 justify-content-end"><div class="col max-width-half-outer-horizontal-bounds"><div class="row h-100 w-100 align-items-center"><div class="col max-width-fit-content center-aligned-right-padding"><div class="row mb-20 pt-30 header"><div class="col"><h3>Case Studies</h3></div></div><div class="row mb-40 links"><div id="case-studies-col" class="col"><div class="row mb-20 case-study-row template"><div class="col"> <button type="button" class="case-study-link trigger-link" data-copy=""><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col text-left underline-on-hover link"></div></div></div> </button></div></div></div></div></div></div></div></div></div><div class="col position-relative case-studies-image-container background-image-zoom-on-hover-parent"><div id="case-studies-image" role="img" aria-label="Case Studies Image" class="row background-image-zoom-on-hover-child"></div><div id="case-studies-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div><div id="case-studies-copy-parent" class="row h-100 pass-through-pointer-events"><div class="col max-width-half-outer-horizontal-bounds"><div class="row min-height-100pct align-items-center case-studies-image-copy"><div class="col pr-0 pt-40 pb-40 center-aligned-left-padding h-100 d-flex align-items-center justify-content-center"><div class="container p-10 position-relative"><div class="row position-absolute-stretch-to-fill background-white"></div><div class="row w-100 top-quote-icon"><div class="col"> <i class="fa fa-quote-left font-size-20" aria-hidden="true"></i></div></div><div class="row w-100"><div id="case-studies-image-copy" class="col py-10 px-30 no-hyphens"><div class="row copy"><div class="col"></div></div><div class="row bullets"><div class="col"><ul class="mr-0 mb-0 ml-20"><li class="template mt-10"></li></ul></div></div></div></div><div class="row w-100 bottom-quote-icon"><div class="col d-flex justify-content-end"> <i class="fa fa-quote-right font-size-20" aria-hidden="true"></i></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CglmdW5jdGlvbiBoeWRyYXRlRHluYW1pY0NvcHkoKSB7CgkJJChkb2N1bWVudCkKCQkJLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UnKQoJCQkuYXR0cigKCQkJCSdzdHlsZScsCgkJCQkiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsKCQkJCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfaW1hZ2VfdXJsICsKCQkJCQkiJyk7IgoJCQkpOwoKCQlsZXQgY2FzZV9zdHVkeV9pbmRleCA9IDA7CgkJbGV0ICRmaXJzdF9jYXNlX3N0dWR5X3JvdyA9IHVuZGVmaW5lZDsKCQkkLmVhY2goCgkJCXdpbmRvdy5keW5hbWljX2Nhc2Vfc3R1ZGllc19kaWN0aW9uYXJ5LAoJCQlmdW5jdGlvbiAoY2FzZV9zdHVkeV9uYW1lLCBjYXNlX3N0dWR5X2luZm9fb2JqZWN0KSB7CgkJCQkkbmV3X2Nhc2Vfc3R1ZHlfcm93ID0gY3JlYXRlQ2FzZVN0dWR5Um93KAoJCQkJCWNhc2Vfc3R1ZHlfbmFtZSwKCQkJCQljYXNlX3N0dWR5X2luZm9fb2JqZWN0CgkJCQkpOwoKCQkJCWlmIChjYXNlX3N0dWR5X2luZGV4ID09PSAwKSB7CgkJCQkJJGZpcnN0X2Nhc2Vfc3R1ZHlfcm93ID0gJG5ld19jYXNlX3N0dWR5X3JvdzsKCQkJCX0KCgkJCQljYXNlX3N0dWR5X2luZGV4ICs9IDE7CgkJCX0KCQkpOwoKCQkvLyBTdGF0ZXMgZm9yIGluaXRpYWwgc2VsZWN0aW9uIG9mIGJ1dHRvbnM6CgkJc2V0VGltZW91dCgoKSA9PiB7CgkJCSRmaXJzdF9jYXNlX3N0dWR5X3Jvdy5maW5kKCcuY2FzZS1zdHVkeS1saW5rJykuY2xpY2soKTsKCQl9LCAxKTsKCX0KCgkvLyBDcmVhdGUgbmV3IGNhc2Ugc3R1ZHkgcm93OgoJZnVuY3Rpb24gY3JlYXRlQ2FzZVN0dWR5Um93KAoJCXBhc3NlZF9jYXNlX3N0dWR5X25hbWUsCgkJcGFzc2VkX2Nhc2Vfc3R1ZHlfaW5mb19vYmplY3QKCSkgewoJCWxldCBjYXNlX3N0dWR5X2NvcHkgPSBwYXNzZWRfY2FzZV9zdHVkeV9pbmZvX29iamVjdC5jb3B5OwoKCQl2YXIgJG5ld19jYXNlX3N0dWR5X3JvdyA9ICRjYXNlX3N0dWR5X3Jvd190ZW1wbGF0ZQoJCQkuY2xvbmUoKQoJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCSRuZXdfY2FzZV9zdHVkeV9yb3cKCQkJLmZpbmQoJ2J1dHRvbi5jYXNlLXN0dWR5LWxpbmsnKQoJCQkuYXR0cignZGF0YS1jb3B5JywgY2FzZV9zdHVkeV9jb3B5KTsKCgkJJG5ld19jYXNlX3N0dWR5X3Jvdy5maW5kKCcuY29sLmxpbmsnKS50ZXh0KHBhc3NlZF9jYXNlX3N0dWR5X25hbWUpOwoKCQkkY2FzZV9zdHVkaWVzX2NvbC5hcHBlbmQoJG5ld19jYXNlX3N0dWR5X3Jvdyk7CgoJCXJldHVybiAkbmV3X2Nhc2Vfc3R1ZHlfcm93OwoJfQoKCS8vIFNlYXJjaCBmb3IgYW4gb2JqZWN0IGluIGFuIGFycmF5IGJhc2VkIG9uIGEga2V5LXZhbHVlIHBhaXI6CglmdW5jdGlvbiBnZXRPYmplY3RCeUtleVZhbHVlKGFycmF5LCBrZXksIHZhbHVlKSB7CgkJcmV0dXJuIGFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW2tleV0gPT09IHZhbHVlKTsKCX0KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBWYXJpYWJsZXM6CgkvLyBDb250cm9sbGVyOgoKCS8vIERPTToKCSRjYXNlX3N0dWRpZXNfY29sID0gJChkb2N1bWVudCkuZmluZCgnI2Nhc2Utc3R1ZGllcy1jb2wnKTsKCSRjYXNlX3N0dWR5X3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoJy5jYXNlLXN0dWR5LXJvdy50ZW1wbGF0ZScpOwoKCS8vIEN1c3RvbToKCgkvLyBTdGF0ZXM6CgkvLyBIeWRyYXRlIGR5bmFtaWMgY29weToKCWh5ZHJhdGVEeW5hbWljQ29weSgpOwoKCS8vIFBsdWdpbnM6CgkvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCS8vIEhhbmRsZSBhIENMSUNLIG9uIG9uZSBvZiB0aGUgJGNhc2Vfc3R1ZHlfbGlua19lbGVtZW50czoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCcuY2FzZS1zdHVkeS1saW5rJywgJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJLy8gUmVzZXQgc3RhdGU6CgkJJChkb2N1bWVudCkuZmluZCgnI2Nhc2Utc3R1ZGllcy1pbWFnZS1jb3B5IC5yb3cuY29weSA+IC5jb2wnKS5odG1sKCcnKTsKCQkkKGRvY3VtZW50KQoJCQkuZmluZCgnI2Nhc2Utc3R1ZGllcy1pbWFnZS1jb3B5IC5yb3cuYnVsbGV0cyB1bCBsaTpub3QoLnRlbXBsYXRlKScpCgkJCS5yZW1vdmUoKTsKCgkJJChkb2N1bWVudCkuZmluZCgnLmNhc2Utc3R1ZHktbGluaycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCgkJJCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7CgoJCXZhciBjYXNlU3R1ZGllc0luZm9PYmplY3QgPQoJCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfZGljdGlvbmFyeVskKHRoaXMpLmZpbmQoJy5jb2wubGluaycpLnRleHQoKV07CgkJY29uc29sZS5sb2coJ2Nhc2VTdHVkaWVzSW5mb09iamVjdCcsIGNhc2VTdHVkaWVzSW5mb09iamVjdCk7CgoJCSQoZG9jdW1lbnQpCgkJCS5maW5kKCcjY2FzZS1zdHVkaWVzLWltYWdlLWNvcHkgLnJvdy5jb3B5ID4gLmNvbCcpCgkJCS5odG1sKCQodGhpcykuZGF0YSgnY29weScpKTsKCgkJY29uc3QgYnVsbGV0c0ZvdW5kID0gISFjYXNlU3R1ZGllc0luZm9PYmplY3Q/LmJ1bGxldHM/Lmxlbmd0aDsKCQlpZiAoYnVsbGV0c0ZvdW5kKSB7CgkJCWNvbnNvbGUubG9nKCdidWxsZXRzRm91bmQnLCBidWxsZXRzRm91bmQpOwoKCQkJY2FzZVN0dWRpZXNJbmZvT2JqZWN0Py5idWxsZXRzLmZvckVhY2goYnVsbGV0U3RyaW5nID0+IHsKCQkJCXZhciAkbmV3X2J1bGxldF9saSA9ICQoZG9jdW1lbnQpCgkJCQkJLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UtY29weSBsaS50ZW1wbGF0ZScpCgkJCQkJLmNsb25lKCkKCQkJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCQkJJG5ld19idWxsZXRfbGkuaHRtbChidWxsZXRTdHJpbmcpOwoKCQkJCSQoZG9jdW1lbnQpLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UtY29weSB1bCcpLmFwcGVuZCgkbmV3X2J1bGxldF9saSk7CgkJCX0pOwoJCX0KCX0pOwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCn0pOwo="></script> <div class="row block-seperator border-top-green"></div><div id="other-documents-container" class="row height-page-block justify-content-center"><div class="col image background-image-zoom-on-hover-parent"><div id="other-documents-image" role="img" aria-label="Other Documents Image" class="row background-image-zoom-on-hover-child"></div><div id="other-documents-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div><div class="col copy"><div class="row h-100"><div class="col max-width-half-outer-horizontal-bounds"><div class="container center-aligned-left-padding h-100"><div class="row h-100 d-flex align-items-center"><div class="col"><div class="row mb-25 header"><div class="col"><h3 class="header">Overview Documents</h3></div></div><div class="row body"><div class="col d-flex align-items-center"><div class="container p-0"><div class="row mb-40 links"><div id="document-links-col" class="col"><div class="row pb-20 document-link-row template"><div class="col link"> <a href="" target="_blank" rel="noopener" download="" class="color-fcsi-primary-blue underline-on-hover"><div class="container p-0"><div class="row"><div class="col icon"> <i class="fa fa-download" aria-hidden="true"></i></div><div class="col text truncate-single-line-with-ellipses"> <span class="document-name"></span></div></div></div> </a></div></div></div></div><div class="row contact-info"><div class="col"><div class="row mb-10 header"><div class="col contact-header"><h5><span id="dynamic-contact-header-name"></span></h5></div></div><div class="row mb-10 person-name-and-title"><div class="col"> <span id="dynamic-contact-person-name"></span>&nbsp;-&nbsp;<i><span id="dynamic-contact-person-title"></span></i></div></div><div class="row mb-10 person-email-link"><div class="col"> <a class="color-fcsi-primary-blue" href="mailto:mark_gigliotti@fletchercsi.com"><span id="dynamic-contact-person-email"></span></a></div></div><div class="row person-phone-number"><div class="col"><span id="dynamic-contact-person-phone"></span></div></div></div></div></div></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJLy8gT3ZlcnZpZXcgRG9jdW1lbnRzOgoJCQkkKGRvY3VtZW50KS5maW5kKCcjb3RoZXItZG9jdW1lbnRzLWltYWdlJykuYXR0cignc3R5bGUnLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsgd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2ltYWdlX3VybCArICInKTsiKQoKCQkJJC5lYWNoKAoJCQkJd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2RpY3Rpb25hcnksCgkJCQlmdW5jdGlvbihvdmVydmlld19kb2N1bWVudF9uYW1lLCBvdmVydmlld19kb2N1bWVudF9pbmZvX29iamVjdCkgewoJCQkJCSRuZXdfb3ZlcnZpZXdfZG9jdW1lbnRfcm93ID0gY3JlYXRlT3ZlcnZpZXdEb2N1bWVudFJvdyhvdmVydmlld19kb2N1bWVudF9uYW1lLCBvdmVydmlld19kb2N1bWVudF9pbmZvX29iamVjdFsnbGluayddKTsKCQkJCX0KCQkJKTsKCgkJCS8vIENvbnRhY3QgSW5mb3JtYXRpb246CgkJCSQoZG9jdW1lbnQpLmZpbmQoJ3NwYW4jZHluYW1pYy1jb250YWN0LWhlYWRlci1uYW1lJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUgKyAiIENvbnRhY3QiKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLW5hbWUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfY29udGFjdF9wZXJzb25fZGljdGlvbmFyeVsnbmFtZSddKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLXRpdGxlJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2NvbnRhY3RfcGVyc29uX2RpY3Rpb25hcnlbJ3RpdGxlJ10pOwoJCQkkKGRvY3VtZW50KS5maW5kKCcucGVyc29uLWVtYWlsLWxpbmsnKQoJCQkJLmF0dHIoJ2hyZWYnLCAibWFpbHRvOiIgKyB3aW5kb3cuZHluYW1pY19jb250YWN0X3BlcnNvbl9kaWN0aW9uYXJ5WydlbWFpbCddKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLWVtYWlsJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2NvbnRhY3RfcGVyc29uX2RpY3Rpb25hcnlbJ2VtYWlsJ10pOwoJCQkkKGRvY3VtZW50KS5maW5kKCdzcGFuI2R5bmFtaWMtY29udGFjdC1wZXJzb24tcGhvbmUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfY29udGFjdF9wZXJzb25fZGljdGlvbmFyeVsncGhvbmUnXSk7CgkJfQoKCQkvLyBDcmVhdGUgbmV3IG92ZXJ2aWV3IGRvY3VtZW50IHJvdzoKCQlmdW5jdGlvbiBjcmVhdGVPdmVydmlld0RvY3VtZW50Um93KHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9uYW1lLCBwYXNzZWRfb3ZlcnZpZXdfZG9jdW1lbnRfbGluaykgewoJCQl2YXIgJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cgPSAkZG9jdW1lbnRfbGlua19yb3dfdGVtcGxhdGUuY2xvbmUoKQoJCQkJLnJlbW92ZUNsYXNzKCJ0ZW1wbGF0ZSIpOwoKCQkJJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cuZmluZCgnYScpCgkJCQkuYXR0cignaHJlZicsIHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9saW5rKTsKCQkJJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cuZmluZCgnLmNvbC50ZXh0JykKCQkJCS50ZXh0KHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9uYW1lKTsKCgkJCSRkb2N1bWVudF9saW5rc19jb2wuYXBwZW5kKCRuZXdfb3ZlcnZpZXdfZG9jdW1lbnRfcm93KTsKCgkJCXJldHVybiAkbmV3X292ZXJ2aWV3X2RvY3VtZW50X3JvdzsKCQl9CgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSEVMUEVSIEZVTkNUSU9OUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJLy8gVmFyaWFibGVzOgoJCS8vIENvbnRyb2xsZXI6CgoKCQkvLyBET006CgkJJGRvY3VtZW50X2xpbmtzX2NvbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNkb2N1bWVudC1saW5rcy1jb2wnKTsKCQkkZG9jdW1lbnRfbGlua19yb3dfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKCcuZG9jdW1lbnQtbGluay1yb3cudGVtcGxhdGUnKTsKCgkJLy8gQ3VzdG9tOgoKCgkJLy8gU3RhdGVzOgoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWh5ZHJhdGVEeW5hbWljQ29weSgpOwoKCQkvLyBQbHVnaW5zOgoJCS8vIAoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBJTklUSUFMSVpFIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkvLyAKCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgl9KTsK"></script> <div class="row block-seperator border-top-green"></div></div> <script defer src="data:text/javascript;base64,CgkJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCQkJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCQkJCQkJZnVuY3Rpb24gaHlkcmF0ZUR5bmFtaWNDb3B5KCkgewoJCQkJCQkJCS8vIEVudHJ5IENvbnRlbnQ6CgkJCQkJCQkJJChkb2N1bWVudCkuZmluZCgnLnBhZ2UtY29udGFpbmVyJykKCQkJCQkJCQkJLmF0dHIoJ2lkJywgY29udmVydFRvS2ViYWJDYXNlKHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUpICsgIi1jb250YWluZXIiKTsKCQkJCQkJCX0KCgkJCQkJCQkvLyBDb252ZXJ0IGEgc3RyaW5nIHRvICdrZWJhYi1jYXNlJzoKCQkJCQkJCWZ1bmN0aW9uIGNvbnZlcnRUb0tlYmFiQ2FzZShwYXNzZWRfc3RyaW5nKSB7CgkJCQkJCQkJbGV0IGNvbnZlcnRlZF9zdHJpbmcgPSBwYXNzZWRfc3RyaW5nLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICIkMS0kMiIpCgkJCQkJCQkJCS5yZXBsYWNlKC9bXHNfXSsvZywgJy0nKQoJCQkJCQkJCQkudG9Mb3dlckNhc2UoKTsKCgkJCQkJCQkJcmV0dXJuIGNvbnZlcnRlZF9zdHJpbmc7CgkJCQkJCQl9CgoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJCQkJLy8gVmFyaWFibGVzOgoJCQkJCQkJLy8gRE9NOgoKCgkJCQkJCQkvLyBDdXN0b206CgoJCQkJCQkJLy8gU3RhdGVzOgoJCQkJCQkJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgkJCQkJCQloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkJCQkJCQkvLyBQbHVnaW5zOgoJCQkJCQkJLy8KCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkJCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoKCQkJCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJCQkJCX0pOwoJCQkJCQ=="></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"> <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 active"> <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 active"> <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 active"><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 active"> <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>

Pages: 1 2 3 4 5 6 7 8 9 10