From 20ea3c7c8dcf04082334ed95ffa2b0b127d2d99a Mon Sep 17 00:00:00 2001 From: gdobrilov <95942119+gdobrilov@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:33:59 +0300 Subject: [PATCH] Update W3W related functionalities (#9) * Update W3W related functionalities * fix comments * Small addition to the index page --------- Co-authored-by: Georgi Dobrilov --- dist/css/experian-address-validation.css | 358 +-- dist/js/experian-address-validation.js | 4 +- dist/lib/address-search.d.ts | 7 + dist/lib/class-types.d.ts | 35 +- dist/lib/search-options.d.ts | 2 + index.html | 1076 ++++----- src/css/experian-address-validation.css | 358 +-- src/ts/address-search.ts | 2657 ++++++++++++---------- src/ts/class-types.ts | 224 +- src/ts/search-options.ts | 86 +- 10 files changed, 2563 insertions(+), 2244 deletions(-) diff --git a/dist/css/experian-address-validation.css b/dist/css/experian-address-validation.css index 41dd090..5f8862c 100644 --- a/dist/css/experian-address-validation.css +++ b/dist/css/experian-address-validation.css @@ -1,164 +1,194 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -.hidden { - display: none; -} - -/* Loading spinner styles */ -@-webkit-keyframes spinner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes spinner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.loader { - margin: auto; - overflow: hidden; -} -.loader.loader-overlay { - position: absolute; - z-index: 999; - top: 0; - left: 0; - right: 0; - bottom: 0; - margin-top: 0; - margin-bottom: 0; - width: 100%; - height: 14em; - pointer-events: none; -} -.loader .spinner { - font-size: 1em; - border-radius: 50%; - border-top: 1.1em solid rgba(1, 92, 174, 0.2); - border-right: 1.1em solid rgba(1, 92, 174, 0.2); - border-bottom: 1.1em solid rgba(1, 92, 174, 0.2); - border-left: 1.1em solid #1d4f91; - height: 8em; - width: 8em; - margin: 2em auto; - position: relative; - text-indent: -9999em; - -webkit-animation: spinner .8s infinite linear; - animation: spinner .8s infinite linear; -} -.loader.loader-inline { - height: 0; - overflow: visible; - text-align: right; -} -.loader.loader-inline .spinner { - border-width: 1.5em; - display: inline-block; - font-size: 2px; - margin: 0 5em; - top: -27px; - z-index: 9; -} - -input.showing-suggestions { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.address-picklist-container { - position: absolute; - width: 100%; - border: 2px solid #1d4f91; -} -.address-picklist { - background-color: white; - max-height: 150px; - overflow: auto; - overflow-x: hidden; - padding: 0; -} -.picklist-refinement-box { - display: flex; - align-items: center; - background-color: white; - padding: 5px 11px; - border-bottom: 1px solid #1d4f91; -} -.picklist-refinement-box button { - margin-top: 0; - margin-left: 1em; - border-radius: 4px; - padding: 8px 14px; - color: white; - background-color: #426da9; - border: 1px solid transparent; - font-size: 14px; - line-height: 16px; -} -.address-picklist div, -.use-address-entered, -.powered-by-experian, -.picklist-suggestions-header, -.picklist-use-entered-header, -.picklist-use-entered-option { - color: #575755; - font-size: 14px; - line-height: 1.4; - padding: 5px 11px; -} - -.address-picklist div { - padding-left: 20px; - position: relative; -} - -.use-address-entered, -.powered-by-experian { - background-color: white; - border-top: 1px solid #1d4f91; - margin-top: 0; - padding-top: 7px; - display: flex; - align-items: center; -} -.use-address-entered:hover { - background-color: #f4f4f4; - cursor: pointer; -} - -.picklist-use-entered-container { - background-color: white; -} -.picklist-use-entered-header, .picklist-suggestions-header { - background-color: #eaeaea; - font-weight: 600; -} -.picklist-use-entered-option { - padding-left: 20px; -} - -.picklist-use-entered-option:hover, .address-picklist div:not(.selected):hover { - background-color: #e0effb; -} -.address-picklist .selected { - background-color: #426da9; - cursor: pointer; - border-left: 4px solid #e63888; - color: white; -} +*, +*::before, +*::after { + box-sizing: border-box; +} + +.hidden { + display: none; +} + +/* Loading spinner styles */ +@-webkit-keyframes spinner { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.loader { + margin: auto; + overflow: hidden; +} + +.loader.loader-overlay { + position: absolute; + z-index: 999; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin-top: 0; + margin-bottom: 0; + width: 100%; + height: 14em; + pointer-events: none; +} + +.loader .spinner { + font-size: 1em; + border-radius: 50%; + border-top: 1.1em solid rgba(1, 92, 174, 0.2); + border-right: 1.1em solid rgba(1, 92, 174, 0.2); + border-bottom: 1.1em solid rgba(1, 92, 174, 0.2); + border-left: 1.1em solid #1d4f91; + height: 8em; + width: 8em; + margin: 2em auto; + position: relative; + text-indent: -9999em; + -webkit-animation: spinner .8s infinite linear; + animation: spinner .8s infinite linear; +} + +.loader.loader-inline { + height: 0; + overflow: visible; + text-align: right; +} + +.loader.loader-inline .spinner { + border-width: 1.5em; + display: inline-block; + font-size: 2px; + margin: 0 5em; + top: -27px; + z-index: 9; +} + +input.showing-suggestions { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.address-picklist-container { + position: absolute; + width: 100%; + border: 2px solid #1d4f91; +} + +.address-picklist { + background-color: white; + max-height: 150px; + overflow: auto; + overflow-x: hidden; + padding: 0; +} + +.picklist-refinement-box { + display: flex; + align-items: center; + background-color: white; + padding: 5px 11px; + border-bottom: 1px solid #1d4f91; +} + +.picklist-refinement-box button { + margin-top: 0; + margin-left: 1em; + border-radius: 4px; + padding: 8px 14px; + color: white; + background-color: #426da9; + border: 1px solid transparent; + font-size: 14px; + line-height: 16px; +} + +.address-picklist div, +.use-address-entered, +.powered-by-experian, +.picklist-suggestions-header, +.picklist-use-entered-header, +.picklist-use-entered-option { + color: #575755; + font-size: 14px; + line-height: 1.4; + padding: 5px 11px; +} + +.address-picklist div { + padding-left: 20px; + position: relative; +} + +.use-address-entered, +.powered-by-experian { + background-color: white; + border-top: 1px solid #1d4f91; + margin-top: 0; + padding-top: 7px; + display: flex; + align-items: center; +} + +.use-address-entered:hover { + background-color: #f4f4f4; + cursor: pointer; +} + +.picklist-use-entered-container { + background-color: white; +} + +.picklist-use-entered-header, +.picklist-suggestions-header { + background-color: #eaeaea; + font-weight: 600; +} + +.picklist-use-entered-option { + padding-left: 20px; +} + +.picklist-use-entered-option:hover, +.address-picklist div:not(.selected):hover { + background-color: #e0effb; +} + +.address-picklist .selected { + background-color: #426da9; + cursor: pointer; + border-left: 4px solid #e63888; + color: white; +} + +.picklist-use-entered-option, +.address-picklist div:not(.selected) .what3Words-name { + font-weight: bold; + padding-bottom: 0px; +} + +.picklist-use-entered-option, +.address-picklist div:not(.selected) .what3Words-description { + font-style: italic; + padding-top: 0px; + font-size: 12px; +} \ No newline at end of file diff --git a/dist/js/experian-address-validation.js b/dist/js/experian-address-validation.js index 8e00c5e..7587df1 100644 --- a/dist/js/experian-address-validation.js +++ b/dist/js/experian-address-validation.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e,s=function(){function e(){this.collection={}}return e.prototype.on=function(e,s){this.collection[e]=this.collection[e]||[],this.collection[e].push(s)},e.prototype.trigger=function(e,s){if(this.collection[e])for(var o=0;o=200&&d.currentRequest.status<400){var s=JSON.parse(d.currentRequest.responseText);o(s)}else d.instance.searchSpinner.hide(),d.instance.events.trigger("request-error",e),d.instance.events.trigger("request-error-".concat(d.currentRequest.status),e)},this.currentRequest.onerror=function(e){d.instance.searchSpinner.hide(),d.instance.events.trigger("request-error",e)},this.currentRequest.ontimeout=function(e){d.instance.searchSpinner.hide(),d.instance.events.trigger("request-timeout",e)},this.currentRequest.send(t)},e}();!function(e){e.AUTOCOMPLETE="autocomplete",e.SINGLELINE="singleline",e.VALIDATE="validate"}(e||(e={}));var a={searchType:e.AUTOCOMPLETE,input:{placeholderText:"Start typing an address...",applyFocus:!1},formattedAddressContainer:{showHeading:!1,headingType:"h3",validatedHeadingText:"Validated address",manualHeadingText:"Manual address entered"},searchAgain:{visible:!0,text:"Search again"},useAddressEnteredText:" - Use address entered or try again...",useSpinner:!1,language:"en",addressLineLabels:["address_line_1","address_line_2","address_line_3","locality","region","postal_code","country"]},d=[{country:"Afghanistan",iso3Code:"AFG",iso2Code:"AF",datasetCode:"af-address-ed",searchType:"singleline, validate"},{country:"Afghanistan",iso3Code:"AFG",iso2Code:"AF",datasetCode:"af-address-eh",searchType:"autocomplete"},{country:"Albania",iso3Code:"ALB",iso2Code:"AL",datasetCode:"al-address-ed",searchType:"singleline, validate"},{country:"Albania",iso3Code:"ALB",iso2Code:"AL",datasetCode:"al-address-eh",searchType:"autocomplete"},{country:"Algeria",iso3Code:"DZA",iso2Code:"DZ",datasetCode:"dz-address-ed",searchType:"singleline, validate"},{country:"Algeria",iso3Code:"DZA",iso2Code:"DZ",datasetCode:"dz-address-eh",searchType:"autocomplete"},{country:"American Samoa",iso3Code:"ASM",iso2Code:"AS",datasetCode:"as-address-eh",searchType:"autocomplete"},{country:"Andorra",iso3Code:"AND",iso2Code:"AD",datasetCode:"ad-address-ed",searchType:"singleline, validate"},{country:"Andorra",iso3Code:"AND",iso2Code:"AD",datasetCode:"ad-address-eh",searchType:"autocomplete"},{country:"Angola",iso3Code:"AGO",iso2Code:"AO",datasetCode:"ao-address-ed",searchType:"singleline, validate"},{country:"Angola",iso3Code:"AGO",iso2Code:"AO",datasetCode:"ao-address-eh",searchType:"autocomplete"},{country:"Anguilla",iso3Code:"AIA",iso2Code:"AI",datasetCode:"ai-address-eh",searchType:"autocomplete"},{country:"Antarctica",iso3Code:"ATA",iso2Code:"AQ",datasetCode:"aq-address-ed",searchType:"singleline, validate"},{country:"Antigua and Barbuda",iso3Code:"ATG",iso2Code:"AG",datasetCode:"ag-address-ed",searchType:"singleline, validate"},{country:"Antigua and Barbuda",iso3Code:"ATG",iso2Code:"AG",datasetCode:"ag-address-eh",searchType:"autocomplete"},{country:"Argentina",iso3Code:"ARG",iso2Code:"AR",datasetCode:"ar-address-ed",searchType:"singleline, validate"},{country:"Argentina",iso3Code:"ARG",iso2Code:"AR",datasetCode:"ar-address-eh",searchType:"autocomplete"},{country:"Armenia",iso3Code:"ARM",iso2Code:"AM",datasetCode:"am-address-ed",searchType:"singleline, validate"},{country:"Armenia",iso3Code:"ARM",iso2Code:"AM",datasetCode:"am-address-eh",searchType:"autocomplete"},{country:"Aruba",iso3Code:"ABW",iso2Code:"AW",datasetCode:"aw-address-ed",searchType:"singleline, validate"},{country:"Aruba",iso3Code:"ABW",iso2Code:"AW",datasetCode:"aw-address-eh",searchType:"autocomplete"},{country:"Australia DataFusion",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address-datafusion",searchType:"autocomplete, singleline, typedown"},{country:"Australia Geocoded National Address",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address-gnaf",searchType:"autocomplete, singleline, typedown, validate"},{country:"Australia Postal Address",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Austria",iso3Code:"AUT",iso2Code:"AT",datasetCode:"at-address-eh",searchType:"autocomplete"},{country:"Austria",iso3Code:"AUT",iso2Code:"AT",datasetCode:"az-address-ed",searchType:"singleline, validate"},{country:"Azerbaijan",iso3Code:"AZE",iso2Code:"AZ",datasetCode:"az-address-ed",searchType:"singleline, validate"},{country:"Azerbaijan",iso3Code:"AZE",iso2Code:"AZ",datasetCode:"az-address-eh",searchType:"autocomplete"},{country:"Bahamas",iso3Code:"BHS",iso2Code:"BS",datasetCode:"bs-address-ed",searchType:"singleline, validate"},{country:"Bahamas",iso3Code:"BHS",iso2Code:"BS",datasetCode:"bs-address-eh",searchType:"autocomplete"},{country:"Bahrain",iso3Code:"BHR",iso2Code:"BH",datasetCode:"bh-address-ed",searchType:"singleline, validate"},{country:"Bahrain",iso3Code:"BHR",iso2Code:"BH",datasetCode:"bh-address-eh",searchType:"autocomplete"},{country:"Bangladesh",iso3Code:"BGD",iso2Code:"BD",datasetCode:"bd-address-ed",searchType:"singleline, validate"},{country:"Bangladesh",iso3Code:"BGD",iso2Code:"BD",datasetCode:"bd-address-eh",searchType:"autocomplete"},{country:"Barbados",iso3Code:"BRB",iso2Code:"BB",datasetCode:"bb-address-ed",searchType:"singleline, validate"},{country:"Barbados",iso3Code:"BRB",iso2Code:"BB",datasetCode:"bb-address-eh",searchType:"autocomplete"},{country:"Belarus",iso3Code:"BLR",iso2Code:"BY",datasetCode:"by-address-ed",searchType:"singleline, validate"},{country:"Belarus",iso3Code:"BLR",iso2Code:"BY",datasetCode:"by-address-eh",searchType:"autocomplete"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address",searchType:"singleline, typedown"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address-ed",searchType:" validate"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address-eh",searchType:"autocomplete"},{country:"Belize",iso3Code:"BLZ",iso2Code:"BZ",datasetCode:"bz-address-ed",searchType:"singleline, validate"},{country:"Belize",iso3Code:"BLZ",iso2Code:"BZ",datasetCode:"bz-address-eh",searchType:"autocomplete"},{country:"Benin",iso3Code:"BEN",iso2Code:"BJ",datasetCode:"bj-address-ed",searchType:"singleline, validate"},{country:"Benin",iso3Code:"BEN",iso2Code:"BJ",datasetCode:"bj-address-eh",searchType:"autocomplete"},{country:"Bermuda",iso3Code:"BMU",iso2Code:"BM",datasetCode:"bm-address-ed",searchType:"singleline, validate"},{country:"Bermuda",iso3Code:"BMU",iso2Code:"BM",datasetCode:"bm-address-eh",searchType:"autocomplete"},{country:"Bhutan",iso3Code:"BTN",iso2Code:"BT",datasetCode:"bt-address-ed",searchType:"singleline, validate"},{country:"Bhutan",iso3Code:"BTN",iso2Code:"BT",datasetCode:"bt-address-eh",searchType:"autocomplete"},{country:"Bolivia",iso3Code:"BOL",iso2Code:"BO",datasetCode:"bo-address-ed",searchType:"singleline, validate"},{country:"Bolivia",iso3Code:"BOL",iso2Code:"BO",datasetCode:"bo-address-eh",searchType:"autocomplete"},{country:"Bonaire, Sint Eustatius and Saba",iso3Code:"BES",iso2Code:"BQ",datasetCode:"bq-address-ed",searchType:"singleline, validate"},{country:"Bonaire, Sint Eustatius and Saba",iso3Code:"BES",iso2Code:"BQ",datasetCode:"bq-address-eh",searchType:"autocomplete"},{country:"Bosnia and Herzegovina",iso3Code:"BIH",iso2Code:"BA",datasetCode:"ba-address-ed",searchType:"singleline, validate"},{country:"Bosnia and Herzegovina",iso3Code:"BIH",iso2Code:"BA",datasetCode:"ba-address-eh",searchType:"autocomplete"},{country:"Botswana",iso3Code:"BWA",iso2Code:"BW",datasetCode:"bw-address-ed",searchType:"singleline, validate"},{country:"Botswana",iso3Code:"BWA",iso2Code:"BW",datasetCode:"bw-address-eh",searchType:"autocomplete"},{country:"Brazil",iso3Code:"BRA",iso2Code:"BR",datasetCode:"br-address-ed",searchType:"singleline, validate"},{country:"Brazil",iso3Code:"BRA",iso2Code:"BR",datasetCode:"br-address-eh",searchType:"autocomplete"},{country:"Brunei Darussalam",iso3Code:"BRN",iso2Code:"BN",datasetCode:"bn-address-ed",searchType:"singleline, validate"},{country:"Brunei Darussalam",iso3Code:"BRN",iso2Code:"BN",datasetCode:"bn-address-eh",searchType:"autocomplete"},{country:"Bulgaria",iso3Code:"BGR",iso2Code:"BG",datasetCode:"bg-address-ed",searchType:"singleline, validate"},{country:"Bulgaria",iso3Code:"BGR",iso2Code:"BG",datasetCode:"bg-address-eh",searchType:"autocomplete"},{country:"Burkina Faso",iso3Code:"BFA",iso2Code:"BF",datasetCode:"bf-address-ed",searchType:"singleline, validate"},{country:"Burkina Faso",iso3Code:"BFA",iso2Code:"BF",datasetCode:"bf-address-eh",searchType:"autocomplete"},{country:"Burundi",iso3Code:"BDI",iso2Code:"BI",datasetCode:"bi-address-eh",searchType:"autocomplete"},{country:"Cambodia",iso3Code:"KHM",iso2Code:"KH",datasetCode:"kh-address-ed",searchType:"singleline, validate"},{country:"Cambodia",iso3Code:"KHM",iso2Code:"KH",datasetCode:"kh-address-eh",searchType:"autocomplete"},{country:"Cameroon",iso3Code:"CMR",iso2Code:"CM",datasetCode:"cm-address-ed",searchType:"singleline, validate"},{country:"Cameroon",iso3Code:"CMR",iso2Code:"CM",datasetCode:"cm-address-eh",searchType:"autocomplete"},{country:"Canada",iso3Code:"CAN",iso2Code:"CA",datasetCode:"ca-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Cape Verde",iso3Code:"CPV",iso2Code:"CV",datasetCode:"cv-address-ed",searchType:"singleline, validate"},{country:"Cape Verde",iso3Code:"CPV",iso2Code:"CV",datasetCode:"cv-address-eh",searchType:"autocomplete"},{country:"Cayman Islands",iso3Code:"CYM",iso2Code:"KY",datasetCode:"ky-address-ed",searchType:"singleline, validate"},{country:"Cayman Islands",iso3Code:"CYM",iso2Code:"KY",datasetCode:"ky-address-eh",searchType:"autocomplete"},{country:"Central African Republic",iso3Code:"CAF",iso2Code:"CF",datasetCode:"cf-address-ed",searchType:"singleline, validate"},{country:"Central African Republic",iso3Code:"CAF",iso2Code:"CF",datasetCode:"cf-address-eh",searchType:"autocomplete"},{country:"Chad",iso3Code:"TCD",iso2Code:"TD",datasetCode:"td-address-ed",searchType:"singleline, validate"},{country:"Chad",iso3Code:"TCD",iso2Code:"TD",datasetCode:"td-address-eh",searchType:"autocomplete"},{country:"Chile",iso3Code:"CHL",iso2Code:"CL",datasetCode:"cl-address-ed",searchType:"singleline, validate"},{country:"Chile",iso3Code:"CHL",iso2Code:"CL",datasetCode:"cl-address-eh",searchType:"autocomplete"},{country:"China",iso3Code:"CHN",iso2Code:"CN",datasetCode:"cn-address-ed",searchType:"singleline, validate"},{country:"China",iso3Code:"CHN",iso2Code:"CN",datasetCode:"cn-address-eh",searchType:"autocomplete"},{country:"Christmas Island",iso3Code:"CXR",iso2Code:"CX",datasetCode:"cx-address-eh",searchType:"autocomplete"},{country:"Cocos Island",iso3Code:"CCK",iso2Code:"CC",datasetCode:"cc-address-eh",searchType:"autocomplete"},{country:"Colombia",iso3Code:"COL",iso2Code:"CO",datasetCode:"co-address-ed",searchType:"singleline, validate"},{country:"Colombia",iso3Code:"COL",iso2Code:"CO",datasetCode:"co-address-eh",searchType:"autocomplete"},{country:"Comoros",iso3Code:"COM",iso2Code:"KM",datasetCode:"km-address-ed",searchType:"singleline, validate"},{country:"Comoros",iso3Code:"COM",iso2Code:"KM",datasetCode:"km-address-eh",searchType:"autocomplete"},{country:"Congo",iso3Code:"COG",iso2Code:"CG",datasetCode:"cg-address-ed",searchType:"singleline, validate"},{country:"Congo",iso3Code:"COG",iso2Code:"CG",datasetCode:"cg-address-eh",searchType:"autocomplete"},{country:"Congo, The Democratic Republic of the",iso3Code:"COD",iso2Code:"CD",datasetCode:"cd-address-ed",searchType:"singleline, validate"},{country:"Congo, The Democratic Republic of the",iso3Code:"COD",iso2Code:"CD",datasetCode:"cd-address-eh",searchType:"autocomplete"},{country:"Cook Islands",iso3Code:"COK",iso2Code:"CK",datasetCode:"ck-address-ed",searchType:"singleline, validate"},{country:"Cook Islands",iso3Code:"COK",iso2Code:"CK",datasetCode:"ck-address-eh",searchType:"autocomplete"},{country:"Costa Rica",iso3Code:"CRI",iso2Code:"CR",datasetCode:"cr-address-ed",searchType:"singleline, validate"},{country:"Costa Rica",iso3Code:"CRI",iso2Code:"CR",datasetCode:"cr-address-eh",searchType:"autocomplete"},{country:"Croatia",iso3Code:"HRV",iso2Code:"HR",datasetCode:"hr-address-ed",searchType:"singleline, validate"},{country:"Croatia",iso3Code:"HRV",iso2Code:"HR",datasetCode:"hr-address-eh",searchType:"autocomplete"},{country:"Cuba",iso3Code:"CUB",iso2Code:"CU",datasetCode:"cu-address-ed",searchType:"singleline, validate"},{country:"Cuba",iso3Code:"CUB",iso2Code:"CU",datasetCode:"cu-address-eh",searchType:"autocomplete"},{country:"Curaçao",iso3Code:"CUW",iso2Code:"CW",datasetCode:"cw-address-ed",searchType:"singleline, validate"},{country:"Curaçao",iso3Code:"CUW",iso2Code:"CW",datasetCode:"cw-address-eh",searchType:"autocomplete"},{country:"Cyprus",iso3Code:"CYP",iso2Code:"CY",datasetCode:"cy-address-ed",searchType:"singleline, validate"},{country:"Cyprus",iso3Code:"CYP",iso2Code:"CY",datasetCode:"cy-address-eh",searchType:"autocomplete"},{country:"Czech Republic",iso3Code:"CZE",iso2Code:"CZ",datasetCode:"cz-address-ed",searchType:"singleline, validate"},{country:"Czech Republic",iso3Code:"CZE",iso2Code:"CZ",datasetCode:"cz-address-eh",searchType:"autocomplete"},{country:"Côte d'Ivoire",iso3Code:"CIV",iso2Code:"CI",datasetCode:"ci-address-ed",searchType:"singleline, validate"},{country:"Côte d'Ivoire",iso3Code:"CIV",iso2Code:"CI",datasetCode:"ci-address-eh",searchType:"autocomplete"},{country:"Denmark",iso3Code:"DNK",iso2Code:"DK",datasetCode:"dk-address-ed",searchType:"singleline, validate"},{country:"Denmark",iso3Code:"DNK",iso2Code:"DK",datasetCode:"dk-address-eh",searchType:"autocomplete"},{country:"Djibouti",iso3Code:"DJI",iso2Code:"DJ",datasetCode:"dj-address-ed",searchType:"singleline, validate"},{country:"Djibouti",iso3Code:"DJI",iso2Code:"DJ",datasetCode:"dj-address-eh",searchType:"autocomplete"},{country:"Dominica",iso3Code:"DMA",iso2Code:"DM",datasetCode:"dm-address-ed",searchType:"singleline, validate"},{country:"Dominica",iso3Code:"DMA",iso2Code:"DM",datasetCode:"dm-address-eh",searchType:"autocomplete"},{country:"Dominican Republic",iso3Code:"DOM",iso2Code:"DO",datasetCode:"do-address-ed",searchType:"singleline, validate"},{country:"Dominican Republic",iso3Code:"DOM",iso2Code:"DO",datasetCode:"do-address-eh",searchType:"autocomplete"},{country:"Ecuador",iso3Code:"ECU",iso2Code:"EC",datasetCode:"ec-address-ed",searchType:"singleline, validate"},{country:"Ecuador",iso3Code:"ECU",iso2Code:"EC",datasetCode:"ec-address-eh",searchType:"autocomplete"},{country:"Egypt",iso3Code:"EGY",iso2Code:"EG",datasetCode:"eg-address-ed",searchType:"singleline, validate"},{country:"Egypt",iso3Code:"EGY",iso2Code:"EG",datasetCode:"eg-address-eh",searchType:"autocomplete"},{country:"El Salvador",iso3Code:"SLV",iso2Code:"SV",datasetCode:"sv-address-ed",searchType:"singleline, validate"},{country:"El Salvador",iso3Code:"SLV",iso2Code:"SV",datasetCode:"sv-address-eh",searchType:"autocomplete"},{country:"Equatorial Guinea",iso3Code:"GNQ",iso2Code:"GQ",datasetCode:"gq-address-ed",searchType:"singleline, validate"},{country:"Equatorial Guinea",iso3Code:"GNQ",iso2Code:"GQ",datasetCode:"gq-address-eh",searchType:"autocomplete"},{country:"Eritrea",iso3Code:"ERI",iso2Code:"ER",datasetCode:"er-address-ed",searchType:"singleline, validate"},{country:"Eritrea",iso3Code:"ERI",iso2Code:"ER",datasetCode:"er-address-eh",searchType:"autocomplete"},{country:"Estonia",iso3Code:"EST",iso2Code:"EE",datasetCode:"ee-address-ed",searchType:"singleline, validate"},{country:"Estonia",iso3Code:"EST",iso2Code:"EE",datasetCode:"ee-address-eh",searchType:"autocomplete"},{country:"Ethiopia",iso3Code:"ETH",iso2Code:"ET",datasetCode:"et-address-ed",searchType:"singleline, validate"},{country:"Ethiopia",iso3Code:"ETH",iso2Code:"ET",datasetCode:"et-address-eh",searchType:"autocomplete"},{country:"Falkland Islands (Malvinas)",iso3Code:"FLK",iso2Code:"FK",datasetCode:"fk-address-eh",searchType:"autocomplete"},{country:"Faroe Islands",iso3Code:"FRO",iso2Code:"FO",datasetCode:"fo-address-ed",searchType:"singleline, validate"},{country:"Faroe Islands",iso3Code:"FRO",iso2Code:"FO",datasetCode:"fo-address-eh",searchType:"autocomplete"},{country:"Fiji",iso3Code:"FJI",iso2Code:"FJ",datasetCode:"fj-address-ed",searchType:"singleline, validate"},{country:"Fiji",iso3Code:"FJI",iso2Code:"FJ",datasetCode:"fj-address-eh",searchType:"autocomplete"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address",searchType:"singleline, typedown"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address-ed",searchType:"validate"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address-eh",searchType:"autocomplete"},{country:"France Street Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-address-streetlevel",searchType:"singleline, typedown, validate"},{country:"France Sub-Premises Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-additional-hexaline3",searchType:"autocomplete, singleline, typedown"},{country:"France Premises Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-address",searchType:"singleline, typedown, validate"},{country:"French Guiana",iso3Code:"GUF",iso2Code:"GF",datasetCode:"gf-address-eh",searchType:"autocomplete"},{country:"French Polynesia",iso3Code:"PYF",iso2Code:"PF",datasetCode:"pf-address-eh",searchType:"autocomplete"},{country:"Gabon",iso3Code:"GAB",iso2Code:"GA",datasetCode:"ga-address-ed",searchType:"singleline, validate"},{country:"Gabon",iso3Code:"GAB",iso2Code:"GA",datasetCode:"ga-address-eh",searchType:"autocomplete"},{country:"Gambia",iso3Code:"GMB",iso2Code:"GM",datasetCode:"gm-address-ed",searchType:"singleline, validate"},{country:"Gambia",iso3Code:"GMB",iso2Code:"GM",datasetCode:"gm-address-eh",searchType:"autocomplete"},{country:"Georgia",iso3Code:"GEO",iso2Code:"GE",datasetCode:"ge-address-ed",searchType:"singleline, validate"},{country:"Georgia",iso3Code:"GEO",iso2Code:"GE",datasetCode:"ge-address-eh",searchType:"autocomplete"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address",searchType:"singleline, typedown, validate"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address-ed",searchType:"validate"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address-eh",searchType:"autocomplete"},{country:"Ghana",iso3Code:"GHA",iso2Code:"GH",datasetCode:"gh-address-ed",searchType:"singleline, validate"},{country:"Ghana",iso3Code:"GHA",iso2Code:"GH",datasetCode:"gh-address-eh",searchType:"autocomplete"},{country:"Gibraltar",iso3Code:"GIB",iso2Code:"GI",datasetCode:"gi-address-eh",searchType:"autocomplete"},{country:"Greece",iso3Code:"GRC",iso2Code:"GR",datasetCode:"gr-address-ed",searchType:"singleline, validate"},{country:"Greece",iso3Code:"GRC",iso2Code:"GR",datasetCode:"gr-address-eh",searchType:"autocomplete"},{country:"Greenland",iso3Code:"GRL",iso2Code:"GL",datasetCode:"gl-address-ed",searchType:"singleline, validate"},{country:"Greenland",iso3Code:"GRL",iso2Code:"GL",datasetCode:"gl-address-eh",searchType:"autocomplete"},{country:"Grenada",iso3Code:"GRD",iso2Code:"GD",datasetCode:"gd-address-ed",searchType:"singleline, validate"},{country:"Grenada",iso3Code:"GRD",iso2Code:"GD",datasetCode:"gd-address-eh",searchType:"autocomplete"},{country:"Guadeloupe",iso3Code:"GLP",iso2Code:"GP",datasetCode:"gp-address-eh",searchType:"autocomplete"},{country:"Guam",iso3Code:"GUM",iso2Code:"GU",datasetCode:"gu-address-eh",searchType:"autocomplete"},{country:"Guatemala",iso3Code:"GTM",iso2Code:"GT",datasetCode:"gt-address-ed",searchType:"singleline, validate"},{country:"Guatemala",iso3Code:"GTM",iso2Code:"GT",datasetCode:"gt-address-eh",searchType:"autocomplete"},{country:"Guinea",iso3Code:"GIN",iso2Code:"GN",datasetCode:"gn-address-ed",searchType:"singleline, validate"},{country:"Guinea",iso3Code:"GIN",iso2Code:"GN",datasetCode:"gn-address-eh",searchType:"autocomplete"},{country:"Guinea-Bissau",iso3Code:"GNB",iso2Code:"GW",datasetCode:"gw-address-ed",searchType:"singleline, validate"},{country:"Guinea-Bissau",iso3Code:"GNB",iso2Code:"GW",datasetCode:"gw-address-eh",searchType:"autocomplete"},{country:"Guyana",iso3Code:"GUY",iso2Code:"GY",datasetCode:"gy-address-ed",searchType:"singleline, validate"},{country:"Guyana",iso3Code:"GUY",iso2Code:"GY",datasetCode:"gy-address-eh",searchType:"autocomplete"},{country:"Haiti",iso3Code:"HTI",iso2Code:"HT",datasetCode:"ht-address-ed",searchType:"singleline, validate"},{country:"Haiti",iso3Code:"HTI",iso2Code:"HT",datasetCode:"ht-address-eh",searchType:"autocomplete"},{country:"Honduras",iso3Code:"HND",iso2Code:"HN",datasetCode:"hn-address-ed",searchType:"singleline, validate"},{country:"Honduras",iso3Code:"HND",iso2Code:"HN",datasetCode:"hn-address-eh",searchType:"autocomplete"},{country:"Hong Kong",iso3Code:"HKG",iso2Code:"HK",datasetCode:"hk-address-ed",searchType:"singleline, validate"},{country:"Hong Kong",iso3Code:"HKG",iso2Code:"HK",datasetCode:"hk-address-eh",searchType:"autocomplete"},{country:"Hungary",iso3Code:"HUN",iso2Code:"HU",datasetCode:"hu-address-ed",searchType:"singleline, validate"},{country:"Hungary",iso3Code:"HUN",iso2Code:"HU",datasetCode:"hu-address-eh",searchType:"autocomplete"},{country:"Iceland",iso3Code:"ISL",iso2Code:"IS",datasetCode:"is-address-ed",searchType:"singleline, validate"},{country:"Iceland",iso3Code:"ISL",iso2Code:"IS",datasetCode:"is-address-eh",searchType:"autocomplete"},{country:"India",iso3Code:"IND",iso2Code:"IN",datasetCode:"in-address-ed",searchType:"singleline, validate"},{country:"India",iso3Code:"IND",iso2Code:"IN",datasetCode:"in-address-eh",searchType:"autocomplete"},{country:"Indonesia",iso3Code:"IDN",iso2Code:"ID",datasetCode:"id-address-ed",searchType:"singleline, validate"},{country:"Indonesia",iso3Code:"IDN",iso2Code:"ID",datasetCode:"id-address-eh",searchType:"autocomplete"},{country:"Iran, Islamic Republic of",iso3Code:"IRN",iso2Code:"IR",datasetCode:"ir-address-ed",searchType:"singleline, validate"},{country:"Iran, Islamic Republic of",iso3Code:"IRN",iso2Code:"IR",datasetCode:"ir-address-eh",searchType:"autocomplete"},{country:"Iraq",iso3Code:"IRQ",iso2Code:"IQ",datasetCode:"iq-address-ed",searchType:"singleline, validate"},{country:"Iraq",iso3Code:"IRQ",iso2Code:"IQ",datasetCode:"iq-address-eh",searchType:"autocomplete"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address",searchType:"singleline, typedown"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-ed",searchType:"singleline, validate"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-eh",searchType:"autocomplete"},{country:"Ireland Eircode",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-additional-eircode",searchType:"autocomplete"},{country:"Ireland ECAD",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-ecad",searchType:"autocomplete"},{country:"Israel",iso3Code:"ISR",iso2Code:"IL",datasetCode:"il-address-ed",searchType:"singleline, validate"},{country:"Israel",iso3Code:"ISR",iso2Code:"IL",datasetCode:"il-address-eh",searchType:"autocomplete"},{country:"Italy",iso3Code:"ITA",iso2Code:"IT",datasetCode:"it-address-ed",searchType:"singleline, validate"},{country:"Italy",iso3Code:"ITA",iso2Code:"IT",datasetCode:"it-address-eh",searchType:"autocomplete"},{country:"Jamaica",iso3Code:"JAM",iso2Code:"JM",datasetCode:"jm-address-ed",searchType:"singleline, validate"},{country:"Jamaica",iso3Code:"JAM",iso2Code:"JM",datasetCode:"jm-address-eh",searchType:"autocomplete"},{country:"Japan",iso3Code:"JPN",iso2Code:"JP",datasetCode:"jp-address-ed",searchType:"singleline, validate"},{country:"Japan",iso3Code:"JPN",iso2Code:"JP",datasetCode:"jp-address",searchType:"singleline, validate"},{country:"Jordan",iso3Code:"JOR",iso2Code:"JO",datasetCode:"jo-address-ed",searchType:"singleline, validate"},{country:"Jordan",iso3Code:"JOR",iso2Code:"JO",datasetCode:"jo-address-eh",searchType:"autocomplete"},{country:"Kazakhstan",iso3Code:"KAZ",iso2Code:"KZ",datasetCode:"kz-address-ed",searchType:"singleline, validate"},{country:"Kazakhstan",iso3Code:"KAZ",iso2Code:"KZ",datasetCode:"kz-address-eh",searchType:"autocomplete"},{country:"Kenya",iso3Code:"KEN",iso2Code:"KE",datasetCode:"ke-address-ed",searchType:"singleline, validate"},{country:"Kenya",iso3Code:"KEN",iso2Code:"KE",datasetCode:"ke-address-eh",searchType:"autocomplete"},{country:"Kiribati",iso3Code:"KIR",iso2Code:"KI",datasetCode:"ki-address-ed",searchType:"singleline, validate"},{country:"Kiribati",iso3Code:"KIR",iso2Code:"KI",datasetCode:"ki-address-eh",searchType:"autocomplete"},{country:"Korea, Democratic People's Republic of",iso3Code:"PRK",iso2Code:"KP",datasetCode:"kp-address-ed",searchType:"singleline, validate"},{country:"Korea, Democratic People's Republic of",iso3Code:"PRK",iso2Code:"KP",datasetCode:"kp-address-eh",searchType:"autocomplete"},{country:"Korea, Republic of",iso3Code:"KOR",iso2Code:"KR",datasetCode:"kr-address-ed",searchType:"singleline, validate"},{country:"Korea, Republic of",iso3Code:"KOR",iso2Code:"KR",datasetCode:"kr-address-eh",searchType:"autocomplete"},{country:"Kosovo",iso3Code:"KOS",iso2Code:"XK",datasetCode:"kv-address-eh",searchType:"autocomplete"},{country:"Kuwait",iso3Code:"KWT",iso2Code:"KW",datasetCode:"kw-address-ed",searchType:"singleline, validate"},{country:"Kuwait",iso3Code:"KWT",iso2Code:"KW",datasetCode:"kw-address-eh",searchType:"autocomplete"},{country:"Kyrgyzstan",iso3Code:"KGZ",iso2Code:"KG",datasetCode:"kg-address-ed",searchType:"singleline, validate"},{country:"Kyrgyzstan",iso3Code:"KGZ",iso2Code:"KG",datasetCode:"kg-address-eh",searchType:"autocomplete"},{country:"Laos",iso3Code:"LAO",iso2Code:"LA",datasetCode:"la-address-ed",searchType:"singleline, validate"},{country:"Laos",iso3Code:"LAO",iso2Code:"LA",datasetCode:"la-address-eh",searchType:"autocomplete"},{country:"Latvia",iso3Code:"LVA",iso2Code:"LV",datasetCode:"lv-address-ed",searchType:"singleline, validate"},{country:"Latvia",iso3Code:"LVA",iso2Code:"LV",datasetCode:"lv-address-eh",searchType:"autocomplete"},{country:"Lebanon",iso3Code:"LBN",iso2Code:"LB",datasetCode:"lb-address-ed",searchType:"singleline, validate"},{country:"Lebanon",iso3Code:"LBN",iso2Code:"LB",datasetCode:"lb-address-eh",searchType:"autocomplete"},{country:"Lesotho",iso3Code:"LSO",iso2Code:"LS",datasetCode:"ls-address-ed",searchType:"singleline, validate"},{country:"Lesotho",iso3Code:"LSO",iso2Code:"LS",datasetCode:"ls-address-eh",searchType:"autocomplete"},{country:"Liberia",iso3Code:"LBR",iso2Code:"LR",datasetCode:"lr-address-ed",searchType:"singleline, validate"},{country:"Liberia",iso3Code:"LBR",iso2Code:"LR",datasetCode:"lr-address-eh",searchType:"autocomplete"},{country:"Libya",iso3Code:"LBY",iso2Code:"LY",datasetCode:"ly-address-ed",searchType:"singleline, validate"},{country:"Libya",iso3Code:"LBY",iso2Code:"LY",datasetCode:"ly-address-eh",searchType:"autocomplete"},{country:"Liechtenstein",iso3Code:"LIE",iso2Code:"LI",datasetCode:"li-address-ed",searchType:"singleline, validate"},{country:"Liechtenstein",iso3Code:"LIE",iso2Code:"LI",datasetCode:"li-address-eh",searchType:"autocomplete"},{country:"Lithuania",iso3Code:"LTU",iso2Code:"LT",datasetCode:"lt-address-ed",searchType:"singleline, validate"},{country:"Lithuania",iso3Code:"LTU",iso2Code:"LT",datasetCode:"lt-address-eh",searchType:"autocomplete"},{country:"Luxembourg",iso3Code:"LUX",iso2Code:"LU",datasetCode:"lu-address-ed",searchType:"singleline, validate"},{country:"Luxembourg",iso3Code:"LUX",iso2Code:"LU",datasetCode:"lu-address-eh",searchType:"autocomplete"},{country:"Macau",iso3Code:"MAC",iso2Code:"MO",datasetCode:"lv-address-ed",searchType:"singleline, validate"},{country:"Macau",iso3Code:"MAC",iso2Code:"MO",datasetCode:"lv-address-eh",searchType:"autocomplete"},{country:"Madagascar",iso3Code:"MDG",iso2Code:"MG",datasetCode:"mo-address-ed",searchType:"singleline, validate"},{country:"Madagascar",iso3Code:"MDG",iso2Code:"MG",datasetCode:"mo-address-eh",searchType:"autocomplete"},{country:"Malawi",iso3Code:"MWI",iso2Code:"MW",datasetCode:"mw-address-ed",searchType:"singleline, validate"},{country:"Malawi",iso3Code:"MWI",iso2Code:"MW",datasetCode:"mw-address-eh",searchType:"autocomplete"},{country:"Malaysia",iso3Code:"MYS",iso2Code:"MY",datasetCode:"my-address-ed",searchType:"singleline, validate"},{country:"Malaysia",iso3Code:"MYS",iso2Code:"MY",datasetCode:"my-address-eh",searchType:"autocomplete"},{country:"Maldives",iso3Code:"MDV",iso2Code:"MV",datasetCode:"mv-address-ed",searchType:"singleline, validate"},{country:"Maldives",iso3Code:"MDV",iso2Code:"MV",datasetCode:"mv-address-eh",searchType:"autocomplete"},{country:"Mali",iso3Code:"MLI",iso2Code:"ML",datasetCode:"ml-address-ed",searchType:"singleline, validate"},{country:"Mali",iso3Code:"MLI",iso2Code:"ML",datasetCode:"ml-address-eh",searchType:"autocomplete"},{country:"Malta",iso3Code:"MLT",iso2Code:"MT",datasetCode:"mt-address-ed",searchType:"singleline, validate"},{country:"Malta",iso3Code:"MLT",iso2Code:"MT",datasetCode:"mt-address-eh",searchType:"autocomplete"},{country:"Marshall Islands",iso3Code:"MHL",iso2Code:"MH",datasetCode:"mh-address-eh",searchType:"autocomplete"},{country:"Martinique",iso3Code:"MTQ",iso2Code:"MQ",datasetCode:"mq-address-eh",searchType:"autocomplete"},{country:"Mauritania",iso3Code:"MRT",iso2Code:"MR",datasetCode:"mr-address-ed",searchType:"singleline, validate"},{country:"Mauritania",iso3Code:"MRT",iso2Code:"MR",datasetCode:"mr-address-eh",searchType:"autocomplete"},{country:"Mauritius",iso3Code:"MUS",iso2Code:"MU",datasetCode:"mu-address-ed",searchType:"singleline, validate"},{country:"Mauritius",iso3Code:"MUS",iso2Code:"MU",datasetCode:"mu-address-eh",searchType:"autocomplete"},{country:"Mayotte",iso3Code:"MYT",iso2Code:"YT",datasetCode:"yt-address-eh",searchType:"autocomplete"},{country:"Mexico",iso3Code:"MEX",iso2Code:"MX",datasetCode:"mx-address-ed",searchType:"singleline, validate"},{country:"Mexico",iso3Code:"MEX",iso2Code:"MX",datasetCode:"mx-address-eh",searchType:"autocomplete"},{country:"Micronesia, Federated States of",iso3Code:"FSM",iso2Code:"FM",datasetCode:"fm-address-eh",searchType:"autocomplete"},{country:"Moldova",iso3Code:"MDA",iso2Code:"MD",datasetCode:"md-address-ed",searchType:"singleline, validate"},{country:"Moldova",iso3Code:"MDA",iso2Code:"MD",datasetCode:"md-address-eh",searchType:"autocomplete"},{country:"Monaco",iso3Code:"MCO",iso2Code:"MC",datasetCode:"mc-address-ed",searchType:"singleline, validate"},{country:"Monaco",iso3Code:"MCO",iso2Code:"MC",datasetCode:"mc-address-eh",searchType:"autocomplete"},{country:"Mongolia",iso3Code:"MNG",iso2Code:"MN",datasetCode:"mn-address-ed",searchType:"singleline, validate"},{country:"Mongolia",iso3Code:"MNG",iso2Code:"MN",datasetCode:"mn-address-eh",searchType:"autocomplete"},{country:"Montenegro",iso3Code:"MNE",iso2Code:"ME",datasetCode:"me-address-ed",searchType:"singleline, validate"},{country:"Montenegro",iso3Code:"MNE",iso2Code:"ME",datasetCode:"me-address-eh",searchType:"autocomplete"},{country:"Montserrat",iso3Code:"MSR",iso2Code:"MS",datasetCode:"ms-address-eh",searchType:"autocomplete"},{country:"Morocco",iso3Code:"MAR",iso2Code:"MA",datasetCode:"ma-address-ed",searchType:"singleline, validate"},{country:"Morocco",iso3Code:"MAR",iso2Code:"MA",datasetCode:"ma-address-eh",searchType:"autocomplete"},{country:"Mozambique",iso3Code:"MOZ",iso2Code:"MZ",datasetCode:"mz-address-ed",searchType:"singleline, validate"},{country:"Mozambique",iso3Code:"MOZ",iso2Code:"MZ",datasetCode:"mz-address-eh",searchType:"autocomplete"},{country:"Myanmar",iso3Code:"MMR",iso2Code:"MM",datasetCode:"mm-address-ed",searchType:"singleline, validate"},{country:"Myanmar",iso3Code:"MMR",iso2Code:"MM",datasetCode:"mm-address-eh",searchType:"autocomplete"},{country:"Namibia",iso3Code:"NAM",iso2Code:"NA",datasetCode:"na-address-ed",searchType:"singleline, validate"},{country:"Namibia",iso3Code:"NAM",iso2Code:"NA",datasetCode:"na-address-eh",searchType:"autocomplete"},{country:"Nauru",iso3Code:"NRU",iso2Code:"NR",datasetCode:"nr-address-ed",searchType:"singleline, validate"},{country:"Nauru",iso3Code:"NRU",iso2Code:"NR",datasetCode:"nr-address-eh",searchType:"autocomplete"},{country:"Nepal",iso3Code:"NPL",iso2Code:"NP",datasetCode:"np-address-ed",searchType:"singleline, validate"},{country:"Nepal",iso3Code:"NPL",iso2Code:"NP",datasetCode:"np-address-eh",searchType:"autocomplete"},{country:"Netherlands",iso3Code:"NLD",iso2Code:"NL",datasetCode:"nl-address-ed",searchType:"singleline, validate"},{country:"Netherlands",iso3Code:"NLD",iso2Code:"NL",datasetCode:"nl-address-eh",searchType:"autocomplete"},{country:"New Caledonia",iso3Code:"NCL",iso2Code:"NC",datasetCode:"nc-address-eh",searchType:"autocomplete"},{country:"New Zealand DataFusion",iso3Code:"NZL",iso2Code:"NZ",datasetCode:"nz-additional-datafusion",searchType:"autocomplete, singleline, typedown, validate"},{country:"New Zealand Postal Address",iso3Code:"NZL",iso2Code:"NZ",datasetCode:"nz-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Nicaragua",iso3Code:"NIC",iso2Code:"NI",datasetCode:"ni-address-ed",searchType:"singleline, validate"},{country:"Nicaragua",iso3Code:"NIC",iso2Code:"NI",datasetCode:"ni-address-eh",searchType:"autocomplete"},{country:"Niger",iso3Code:"NER",iso2Code:"NE",datasetCode:"ne-address-ed",searchType:"singleline, validate"},{country:"Niger",iso3Code:"NER",iso2Code:"NE",datasetCode:"ne-address-eh",searchType:"autocomplete"},{country:"Nigeria",iso3Code:"NGA",iso2Code:"NG",datasetCode:"ng-address-ed",searchType:"singleline, validate"},{country:"Nigeria",iso3Code:"NGA",iso2Code:"NG",datasetCode:"ng-address-eh",searchType:"autocomplete"},{country:"Niue",iso3Code:"NIU",iso2Code:"NU",datasetCode:"nu-address-ed",searchType:"singleline, validate"},{country:"Norfolk Island",iso3Code:"NFK",iso2Code:"NF",datasetCode:"nf-address-ed",searchType:"singleline, validate"},{country:"Norfolk Island",iso3Code:"NFK",iso2Code:"NF",datasetCode:"nf-address-eh",searchType:"autocomplete"},{country:"North Macedonia",iso3Code:"MKD",iso2Code:"MK",datasetCode:"mk-address-ed",searchType:"singleline, validate"},{country:"North Macedonia",iso3Code:"MKD",iso2Code:"MK",datasetCode:"mk-address-eh",searchType:"autocomplete"},{country:"Northern Mariana Islands",iso3Code:"MNP",iso2Code:"MP",datasetCode:"mp-address-eh",searchType:"autocomplete"},{country:"Norway",iso3Code:"NOR",iso2Code:"NO",datasetCode:"no-address-ed",searchType:"validate"},{country:"Norway",iso3Code:"NOR",iso2Code:"NO",datasetCode:"no-address-eh",searchType:"autocomplete"},{country:"Oman",iso3Code:"OMN",iso2Code:"OM",datasetCode:"om-address-ed",searchType:"singleline, validate"},{country:"Oman",iso3Code:"OMN",iso2Code:"OM",datasetCode:"om-address-eh",searchType:"autocomplete"},{country:"Pakistan",iso3Code:"PAK",iso2Code:"PK",datasetCode:"pk-address-ed",searchType:"singleline, validate"},{country:"Pakistan",iso3Code:"PAK",iso2Code:"PK",datasetCode:"pk-address-eh",searchType:"autocomplete"},{country:"Palau",iso3Code:"PLW",iso2Code:"PW",datasetCode:"pw-address-eh",searchType:"autocomplete"},{country:"Palestine",iso3Code:"PSE",iso2Code:"PS",datasetCode:"ps-address-eh",searchType:"autocomplete"},{country:"Panama",iso3Code:"PAN",iso2Code:"PA",datasetCode:"pa-address-ed",searchType:"singleline, validate"},{country:"Panama",iso3Code:"PAN",iso2Code:"PA",datasetCode:"pa-address-eh",searchType:"autocomplete"},{country:"Papua New Guinea",iso3Code:"PNG",iso2Code:"PG",datasetCode:"pg-address-ed",searchType:"singleline, validate"},{country:"Papua New Guinea",iso3Code:"PNG",iso2Code:"PG",datasetCode:"pg-address-eh",searchType:"autocomplete"},{country:"Paraguay",iso3Code:"PRY",iso2Code:"PY",datasetCode:"py-address-ed",searchType:"singleline, validate"},{country:"Paraguay",iso3Code:"PRY",iso2Code:"PY",datasetCode:"py-address-eh",searchType:"autocomplete"},{country:"Peru",iso3Code:"PER",iso2Code:"PE",datasetCode:"pe-address-ed",searchType:"singleline, validate"},{country:"Peru",iso3Code:"PER",iso2Code:"PE",datasetCode:"pe-address-eh",searchType:"autocomplete"},{country:"Philippines",iso3Code:"PHL",iso2Code:"PH",datasetCode:"ph-address-ed",searchType:"singleline, validate"},{country:"Philippines",iso3Code:"PHL",iso2Code:"PH",datasetCode:"ph-address-eh",searchType:"autocomplete"},{country:"Pitcairn Islands",iso3Code:"PCN",iso2Code:"PN",datasetCode:"pn-address-eh",searchType:"autocomplete"},{country:"Poland",iso3Code:"POL",iso2Code:"PL",datasetCode:"pl-address-ed",searchType:"singleline, validate"},{country:"Poland",iso3Code:"POL",iso2Code:"PL",datasetCode:"pl-address-eh",searchType:"autocomplete"},{country:"Portugal",iso3Code:"PRT",iso2Code:"PT",datasetCode:"pt-address-ed",searchType:"singleline, validate"},{country:"Portugal",iso3Code:"PRT",iso2Code:"PT",datasetCode:"pt-address-eh",searchType:"autocomplete"},{country:"Qatar",iso3Code:"QAT",iso2Code:"QA",datasetCode:"qa-address-ed",searchType:"singleline, validate"},{country:"Qatar",iso3Code:"QAT",iso2Code:"QA",datasetCode:"qa-address-eh",searchType:"autocomplete"},{country:"Romania",iso3Code:"ROU",iso2Code:"RO",datasetCode:"ro-address-ed",searchType:"singleline, validate"},{country:"Romania",iso3Code:"ROU",iso2Code:"RO",datasetCode:"ro-address-eh",searchType:"autocomplete"},{country:"Russian Federation",iso3Code:"RUS",iso2Code:"RU",datasetCode:"ru-address-ed",searchType:"singleline, validate"},{country:"Russian Federation",iso3Code:"RUS",iso2Code:"RU",datasetCode:"ru-address-eh",searchType:"autocomplete"},{country:"Rwanda",iso3Code:"RWA",iso2Code:"RW",datasetCode:"rw-address-ed",searchType:"singleline, validate"},{country:"Rwanda",iso3Code:"RWA",iso2Code:"RW",datasetCode:"rw-address-eh",searchType:"autocomplete"},{country:"Réunion",iso3Code:"REU",iso2Code:"RE",datasetCode:"re-address-eh",searchType:"autocomplete"},{country:"Saint Barthélemy",iso3Code:"BLM",iso2Code:"BL",datasetCode:"bl-address-eh",searchType:"autocomplete"},{country:"Saint Helena",iso3Code:"SHN",iso2Code:"SH",datasetCode:"sh-address-eh",searchType:"autocomplete"},{country:"Saint Kitts and Nevis",iso3Code:"KNA",iso2Code:"KN",datasetCode:"kn-address-ed",searchType:"singleline, validate"},{country:"Saint Kitts and Nevis",iso3Code:"KNA",iso2Code:"KN",datasetCode:"kn-address-eh",searchType:"autocomplete"},{country:"Saint Lucia",iso3Code:"LCA",iso2Code:"LC",datasetCode:"lc-address-eh",searchType:"autocomplete"},{country:"Saint Pierre and Miquelon",iso3Code:"SPM",iso2Code:"PM",datasetCode:"pm-address-eh",searchType:"autocomplete"},{country:"Saint Vincent and the Grenadines",iso3Code:"VCT",iso2Code:"VC",datasetCode:"vc-address-ed",searchType:"singleline, validate"},{country:"Saint Vincent and the Grenadines",iso3Code:"VCT",iso2Code:"VC",datasetCode:"vc-address-eh",searchType:"autocomplete"},{country:"Samoa",iso3Code:"WSM",iso2Code:"WS",datasetCode:"ws-address-ed",searchType:"singleline, validate"},{country:"Samoa",iso3Code:"WSM",iso2Code:"WS",datasetCode:"ws-address-eh",searchType:"autocomplete"},{country:"San Marino",iso3Code:"SMR",iso2Code:"SM",datasetCode:"sm-address-ed",searchType:"singleline, validate"},{country:"San Marino",iso3Code:"SMR",iso2Code:"SM",datasetCode:"sm-address-eh",searchType:"autocomplete"},{country:"Sao Tome and Principe",iso3Code:"STP",iso2Code:"ST",datasetCode:"st-address-ed",searchType:"singleline, validate"},{country:"Sao Tome and Principe",iso3Code:"STP",iso2Code:"ST",datasetCode:"st-address-eh",searchType:"autocomplete"},{country:"Saudi Arabia",iso3Code:"SAU",iso2Code:"SA",datasetCode:"sa-address-ed",searchType:"singleline, validate"},{country:"Saudi Arabia",iso3Code:"SAU",iso2Code:"SA",datasetCode:"sa-address-eh",searchType:"autocomplete"},{country:"Senegal",iso3Code:"SEN",iso2Code:"SN",datasetCode:"sn-address-ed",searchType:"singleline, validate"},{country:"Senegal",iso3Code:"SEN",iso2Code:"SN",datasetCode:"sn-address-eh",searchType:"autocomplete"},{country:"Serbia",iso3Code:"SRB",iso2Code:"RS",datasetCode:"rs-address-ed",searchType:"singleline, validate"},{country:"Serbia",iso3Code:"SRB",iso2Code:"RS",datasetCode:"rs-address-eh",searchType:"autocomplete"},{country:"Seychelles",iso3Code:"SYC",iso2Code:"SC",datasetCode:"sc-address-ed",searchType:"singleline, validate"},{country:"Seychelles",iso3Code:"SYC",iso2Code:"SC",datasetCode:"sc-address-eh",searchType:"autocomplete"},{country:"Sierra Leone",iso3Code:"SLE",iso2Code:"SL",datasetCode:"sl-address-ed",searchType:"singleline, validate"},{country:"Sierra Leone",iso3Code:"SLE",iso2Code:"SL",datasetCode:"sl-address-eh",searchType:"autocomplete"},{country:"Singapore",iso3Code:"SGP",iso2Code:"SG",datasetCode:"sg-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Sint Maarten",iso3Code:"SXM",iso2Code:"SX",datasetCode:"sx-address-ed",searchType:"singleline, validate"},{country:"Sint Maarten",iso3Code:"SXM",iso2Code:"SX",datasetCode:"sx-address-eh",searchType:"autocomplete"},{country:"Slovakia",iso3Code:"SVK",iso2Code:"SK",datasetCode:"sk-address-ed",searchType:"singleline, validate"},{country:"Slovakia",iso3Code:"SVK",iso2Code:"SK",datasetCode:"sk-address-eh",searchType:"autocomplete"},{country:"Slovenia",iso3Code:"SVN",iso2Code:"SI",datasetCode:"si-address-ed",searchType:"singleline, validate"},{country:"Slovenia",iso3Code:"SVN",iso2Code:"SI",datasetCode:"si-address-eh",searchType:"autocomplete"},{country:"Solomon Islands",iso3Code:"SLB",iso2Code:"SB",datasetCode:"sb-address-ed",searchType:"singleline, validate"},{country:"Solomon Islands",iso3Code:"SLB",iso2Code:"SB",datasetCode:"sb-address-eh",searchType:"autocomplete"},{country:"Somalia",iso3Code:"SOM",iso2Code:"SO",datasetCode:"so-address-ed",searchType:"singleline, validate"},{country:"Somalia",iso3Code:"SOM",iso2Code:"SO",datasetCode:"so-address-eh",searchType:"autocomplete"},{country:"South Africa",iso3Code:"ZAF",iso2Code:"ZA",datasetCode:"za-address-ed",searchType:"singleline, validate"},{country:"South Africa",iso3Code:"ZAF",iso2Code:"ZA",datasetCode:"za-address-eh",searchType:"autocomplete"},{country:"South Georgia and the South Sandwich Islands",iso3Code:"SGS",iso2Code:"GS",datasetCode:"gs-address-eh",searchType:"autocomplete"},{country:"South Sudan",iso3Code:"SSD",iso2Code:"SS",datasetCode:"ss-address-ed",searchType:"singleline, validate"},{country:"South Sudan",iso3Code:"SSD",iso2Code:"SS",datasetCode:"ss-address-eh",searchType:"autocomplete"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address",searchType:"singleline, typedown"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address-ed",searchType:"validate"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address-eh",searchType:"autocomplete"},{country:"Sri Lanka",iso3Code:"LKA",iso2Code:"LK",datasetCode:"lk-address-ed",searchType:"singleline, validate"},{country:"Sudan",iso3Code:"SDN",iso2Code:"SD",datasetCode:"sd-address-ed",searchType:"singleline, validate"},{country:"Sudan",iso3Code:"SDN",iso2Code:"SD",datasetCode:"sd-address-eh",searchType:"autocomplete"},{country:"Suriname",iso3Code:"SUR",iso2Code:"SR",datasetCode:"sr-address-ed",searchType:"singleline, validate"},{country:"Suriname",iso3Code:"SUR",iso2Code:"SR",datasetCode:"sr-address-eh",searchType:"autocomplete"},{country:"Svalbard and Jan Mayen Islands",iso3Code:"SJM",iso2Code:"SJ",datasetCode:"sj-address-eh",searchType:"autocomplete"},{country:"Swaziland (Eswatini)",iso3Code:"SWZ",iso2Code:"SZ",datasetCode:"sz-address-ed",searchType:"singleline, validate"},{country:"Swaziland (Eswatini)",iso3Code:"SWZ",iso2Code:"SZ",datasetCode:"sz-address-eh",searchType:"autocomplete"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address",searchType:"singleline, typedown"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address-ed",searchType:"validate"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address-eh",searchType:"autocomplete"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address",searchType:"singleline, typedown"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address-ed",searchType:"validate"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address-eh",searchType:"autocomplete"},{country:"Syria",iso3Code:"SYR",iso2Code:"SY",datasetCode:"sy-address-ed",searchType:"singleline, validate"},{country:"Syria",iso3Code:"SYR",iso2Code:"SY",datasetCode:"sy-address-eh",searchType:"autocomplete"},{country:"Taiwan",iso3Code:"TWN",iso2Code:"TW",datasetCode:"tw-address-ed",searchType:"singleline, validate"},{country:"Taiwan",iso3Code:"TWN",iso2Code:"TW",datasetCode:"tw-address-eh",searchType:"autocomplete"},{country:"Tajikistan",iso3Code:"TJK",iso2Code:"TJ",datasetCode:"tj-address-ed",searchType:"singleline, validate"},{country:"Tajikistan",iso3Code:"TJK",iso2Code:"TJ",datasetCode:"tj-address-eh",searchType:"autocomplete"},{country:"Tanzania",iso3Code:"TZA",iso2Code:"TZ",datasetCode:"tz-address-ed",searchType:"singleline, validate"},{country:"Tanzania",iso3Code:"TZA",iso2Code:"TZ",datasetCode:"tz-address-eh",searchType:"autocomplete"},{country:"Thailand",iso3Code:"THA",iso2Code:"TH",datasetCode:"th-address-ed",searchType:"singleline, validate"},{country:"Thailand",iso3Code:"THA",iso2Code:"TH",datasetCode:"th-address-eh",searchType:"autocomplete"},{country:"Timor-Leste",iso3Code:"TLS",iso2Code:"TL",datasetCode:"tl-address-ed",searchType:"singleline, validate"},{country:"Timor-Leste",iso3Code:"TLS",iso2Code:"TL",datasetCode:"tl-address-eh",searchType:"autocomplete"},{country:"Togo",iso3Code:"TGO",iso2Code:"TG",datasetCode:"tg-address-ed",searchType:"singleline, validate"},{country:"Togo",iso3Code:"TGO",iso2Code:"TG",datasetCode:"tg-address-eh",searchType:"autocomplete"},{country:"Tokelau",iso3Code:"TKL",iso2Code:"TK",datasetCode:"tk-address-ed",searchType:"singleline, validate"},{country:"Tokelau",iso3Code:"TKL",iso2Code:"TK",datasetCode:"tk-address-eh",searchType:"autocomplete"},{country:"Tonga",iso3Code:"TON",iso2Code:"TO",datasetCode:"to-address-ed",searchType:"singleline, validate"},{country:"Tonga",iso3Code:"TON",iso2Code:"TO",datasetCode:"to-address-eh",searchType:"autocomplete"},{country:"Trinidad and Tobago",iso3Code:"TTO",iso2Code:"TT",datasetCode:"tt-address-ed",searchType:"singleline, validate"},{country:"Trinidad and Tobago",iso3Code:"TTO",iso2Code:"TT",datasetCode:"tt-address-eh",searchType:"autocomplete"},{country:"Tunisia",iso3Code:"TUN",iso2Code:"TN",datasetCode:"tn-address-ed",searchType:"singleline, validate"},{country:"Tunisia",iso3Code:"TUN",iso2Code:"TN",datasetCode:"tn-address-eh",searchType:"autocomplete"},{country:"Turkey",iso3Code:"TUR",iso2Code:"TR",datasetCode:"tr-address-ed",searchType:"singleline, validate"},{country:"Turkey",iso3Code:"TUR",iso2Code:"TR",datasetCode:"tr-address-eh",searchType:"autocomplete"},{country:"Turkish Republic of Northern Cyprus",iso3Code:"NCY",iso2Code:"CY",datasetCode:"ny-address-eh",searchType:"autocomplete"},{country:"Turkmenistan",iso3Code:"TKM",iso2Code:"TM",datasetCode:"tm-address-ed",searchType:"singleline, validate"},{country:"Turkmenistan",iso3Code:"TKM",iso2Code:"TM",datasetCode:"tm-address-eh",searchType:"autocomplete"},{country:"Turks and Caicos Islands",iso3Code:"TCA",iso2Code:"TC",datasetCode:"tc-address-eh",searchType:"autocomplete"},{country:"Tuvalu",iso3Code:"TUV",iso2Code:"TV",datasetCode:"tv-address-ed",searchType:"singleline, validate"},{country:"Tuvalu",iso3Code:"TUV",iso2Code:"TV",datasetCode:"tv-address-eh",searchType:"autocomplete"},{country:"Uganda",iso3Code:"UGA",iso2Code:"UG",datasetCode:"ug-address-ed",searchType:"singleline, validate"},{country:"Uganda",iso3Code:"UGA",iso2Code:"UG",datasetCode:"ug-address-eh",searchType:"autocomplete"},{country:"Ukraine",iso3Code:"UKR",iso2Code:"UA",datasetCode:"ua-address-ed",searchType:"singleline, validate"},{country:"Ukraine",iso3Code:"UKR",iso2Code:"UA",datasetCode:"ua-address-eh",searchType:"autocomplete"},{country:"United Arab Emirates",iso3Code:"ARE",iso2Code:"AE",datasetCode:"ae-address-ed",searchType:"singleline, validate"},{country:"United Arab Emirates",iso3Code:"ARE",iso2Code:"AE",datasetCode:"ae-address-eh",searchType:"autocomplete"},{country:"United Kingdom",iso3Code:"GBR",iso2Code:"GB",datasetCode:["gb-address"],searchType:"autocomplete"},{country:"United Kingdom",iso3Code:"GBR",iso2Code:"GB",datasetCode:["gb-additional-business","gb-additional-multipleresidence","gb-additional-notyetbuilt"],searchType:"singleline"},{country:"United Kingdom AddressBase Premium",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-addressbase",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom AddressBase Premium with Islands",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-addressbaseislands",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Business Names",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-business",searchType:"singleline, typedown"},{country:"United Kingdom Electricity",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-electricity",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Gas",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-gas",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Street Level",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-streetlevel",searchType:"singleline, typedown"},{country:"United Kingdom Extended Business",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-businessextended",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Cymraeg (Welsh Language) Postal Address",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-wales",searchType:"singleline, typedown, validate"},{country:"United States of America",iso3Code:"USA",iso2Code:"US",datasetCode:"us-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Uruguay",iso3Code:"URY",iso2Code:"UY",datasetCode:"uy-address-ed",searchType:"singleline, validate"},{country:"Uruguay",iso3Code:"URY",iso2Code:"UY",datasetCode:"uy-address-eh",searchType:"autocomplete"},{country:"Uzbekistan",iso3Code:"UZB",iso2Code:"UZ",datasetCode:"uz-address-ed",searchType:"singleline, validate"},{country:"Uzbekistan",iso3Code:"UZB",iso2Code:"UZ",datasetCode:"uz-address-eh",searchType:"autocomplete"},{country:"Vanuatu",iso3Code:"VUT",iso2Code:"VU",datasetCode:"vu-address-ed",searchType:"singleline, validate"},{country:"Vanuatu",iso3Code:"VUT",iso2Code:"VU",datasetCode:"vu-address-eh",searchType:"autocomplete"},{country:"Vatican City (Holy See)",iso3Code:"VAT",iso2Code:"VA",datasetCode:"va-address-ed",searchType:"singleline, validate"},{country:"Vatican City (Holy See)",iso3Code:"VAT",iso2Code:"VA",datasetCode:"va-address-eh",searchType:"autocomplete"},{country:"Venezuela",iso3Code:"VEN",iso2Code:"VE",datasetCode:"ve-address-ed",searchType:"singleline, validate"},{country:"Venezuela",iso3Code:"VEN",iso2Code:"VE",datasetCode:"ve-address-eh",searchType:"autocomplete"},{country:"Viet Nam",iso3Code:"VNM",iso2Code:"VN",datasetCode:"vn-address-ed",searchType:"singleline, validate"},{country:"Viet Nam",iso3Code:"VNM",iso2Code:"VN",datasetCode:"vn-address-eh",searchType:"autocomplete"},{country:"Virgin Islands, British",iso3Code:"VGB",iso2Code:"VG",datasetCode:"vg-address-eh",searchType:"autocomplete"},{country:"Virgin Islands, U.S.",iso3Code:"VIR",iso2Code:"VI",datasetCode:"vi-address-eh",searchType:"autocomplete"},{country:"Wallis and Futuna Islands",iso3Code:"WLF",iso2Code:"WF",datasetCode:"wf-address-eh",searchType:"autocomplete"},{country:"Western Sahara",iso3Code:"ESH",iso2Code:"EH",datasetCode:"eh-address-ed",searchType:"singleline, validate"},{country:"Western Sahara",iso3Code:"ESH",iso2Code:"EH",datasetCode:"eh-address-eh",searchType:"autocomplete"},{country:"Yemen",iso3Code:"YEM",iso2Code:"YE",datasetCode:"ye-address-ed",searchType:"singleline, validate"},{country:"Yemen",iso3Code:"YEM",iso2Code:"YE",datasetCode:"ye-address-eh",searchType:"autocomplete"},{country:"Zambia",iso3Code:"ZMB",iso2Code:"ZM",datasetCode:"zm-address-ed",searchType:"singleline, validate"},{country:"Zambia",iso3Code:"ZMB",iso2Code:"ZM",datasetCode:"zm-address-eh",searchType:"autocomplete"},{country:"Zimbabwe",iso3Code:"ZWE",iso2Code:"ZW",datasetCode:"zw-address-ed",searchType:"singleline, validate"},{country:"Zimbabwe",iso3Code:"ZWE",iso2Code:"ZW",datasetCode:"zw-address-eh",searchType:"autocomplete"}],i={en:{gbr:{locality:"Town/City",region:"County",postal_code:"Post code"},usa:{locality:"City",region:"State",postal_code:"ZIP code"}}},r=function(){this.size=0,this.maxSuggestions=25},n=function(){function s(s){var t=this;this.baseUrl="https://api.experianaperture.io/",this.searchEndpoint="address/search/v1",this.validateEndpoint="address/validate/v1",this.promptsetEndpoint="address/promptsets/v1",this.stepInEndpoint="address/suggestions/stepin/v1",this.refineEndpoint="address/suggestions/refine/v1",this.enrichmentEndpoint="enrichment/v2",this.poweredByLogo={element:null,create:function(e){var s={text:"".concat(this.svg," Powered by Experian"),format:""},o=e.createListItem(s);return o.classList.add("powered-by-experian"),e.list.parentNode.appendChild(o),o},destroy:function(e){this.element&&(e.list.parentNode.removeChild(this.element),this.element=void 0)},svg:''},this.result={formattedAddressContainer:null,lastAddressField:null,generateAddressLineRequired:!1,show:function(s){if(t.searchSpinner.hide(),t.picklist.hide(),t.lastSearchTerm="",t.searchType===e.AUTOCOMPLETE||s.result.address&&"No matches"!==s.result.confidence){t.inputs.forEach((function(e){return e.value=""})),t.result.calculateIfAddressLineGenerationRequired(),t.result.formattedAddressContainer=t.options.elements.formattedAddressContainer,!t.result.formattedAddressContainer&&t.result.generateAddressLineRequired&&t.result.createFormattedAddressContainer();for(var o=0;o0)for(var s=0;s3&&this.lastSearchTerm!==this.currentSearchTerm&&this.currentCountryCode&&!0===this.hasSearchInputBeenReset},s.prototype.createPicklist=function(){var s=this;this.picklist=new r,this.picklist.maxSuggestions=25,this.picklist.tabCount=-1,this.picklist.show=function(o){var t,a;s.picklist.items=null==o?void 0:o.result.suggestions,s.picklist.currentItem=null,s.picklist.size=null===(t=s.picklist.items)||void 0===t?void 0:t.length,s.picklist.resetTabCount(),s.searchSpinner.hide(),s.picklist.list=s.picklist.list||s.picklist.createList(),s.picklist.list.innerHTML="",s.picklist.useAddressEntered.destroy(),s.events.trigger("pre-picklist-create",s.picklist.items),(null===(a=s.picklist.items)||void 0===a?void 0:a.length)>0?(s.picklist.refine.isNeeded(o)&&s.picklist.refine.createInput(o.result.suggestions_prompt,o.result.suggestions_key),s.searchType===e.VALIDATE&&s.picklist.displaySuggestionsHeader(),s.picklist.items.forEach((function(e){var o=s.picklist.createListItem(e);s.picklist.list.appendChild(o),s.picklist.listen(o)})),s.searchType===e.VALIDATE&&s.picklist.displayUseAddressEnteredFooter(),s.picklist.scrollIntoViewIfNeeded()):s.picklist.handleEmptyPicklist(o),s.poweredByLogo.element=s.poweredByLogo.element||s.poweredByLogo.create(s.picklist),s.events.trigger("post-picklist-create",s.picklist.items)},this.picklist.hide=function(){if(s.picklist.currentItem=null,s.picklist.useAddressEntered.destroy(),s.poweredByLogo.destroy(s.picklist),s.inputs){var o=s.searchType===e.SINGLELINE?s.inputs.length-1:0;s.inputs[o].classList.remove("showing-suggestions")}s.picklist.list&&(s.picklist.container.remove(),s.picklist.list=void 0)},this.picklist.handleEmptyPicklist=function(e){var o;s.picklist.useAddressEntered.element=s.picklist.useAddressEntered.element||s.picklist.useAddressEntered.create(null===(o=e.result)||void 0===o?void 0:o.confidence),s.picklist.scrollIntoViewIfNeeded(),"function"==typeof s.picklist.handleEmptyPicklistCallback&&s.picklist.handleEmptyPicklistCallback()},this.picklist.displaySuggestionsHeader=function(){var e=document.querySelector(".picklist-suggestions-header")||document.createElement("div");e.classList.add("picklist-suggestions-header"),e.innerText="Suggestions:",s.picklist.list.parentNode.insertBefore(e,s.picklist.list)},this.picklist.displayUseAddressEnteredFooter=function(){var e=document.querySelector(".picklist-use-entered-container")||document.createElement("div");e.classList.add("picklist-use-entered-container"),s.picklist.list.parentNode.insertBefore(e,s.picklist.list.nextElementSibling);var o=document.querySelector(".picklist-use-entered-header")||document.createElement("div");o.classList.add("picklist-use-entered-header"),o.innerText="Or use address entered:",e.appendChild(o);var t=document.querySelector(".picklist-use-entered-option")||document.createElement("div");t.classList.add("picklist-use-entered-option"),t.innerText=s.currentSearchTerm.replace(/,+/g,", "),t.addEventListener("click",s.picklist.useAddressEntered.click),e.appendChild(t)},this.picklist.scrollIntoViewIfNeeded=function(){var e=s.picklist.container.getBoundingClientRect().top<0,o=s.picklist.container.getBoundingClientRect().bottom>window.innerHeight;(e||o)&&s.picklist.container.scrollIntoView()},this.picklist.useAddressEntered={element:null,create:function(e){var o={text:"".concat(e," ").concat(s.options.useAddressEnteredText)},t=s.picklist.createListItem(o);return t.classList.add("use-address-entered"),t.setAttribute("title","Enter address manually"),s.picklist.list=s.picklist.list||s.picklist.createList(),s.picklist.list.parentNode.insertBefore(t,s.picklist.container.firstChild),t.addEventListener("click",s.picklist.useAddressEntered.click),t},destroy:function(){s.picklist.useAddressEntered.element&&(s.picklist.list.parentNode.removeChild(s.picklist.useAddressEntered.element),s.picklist.useAddressEntered.element=void 0)},click:function(){var e={result:{confidence:"No matches",address:{address_line_1:"",address_line_2:"",address_line_3:"",locality:"",region:"",postal_code:"",country:""}}};if(s.currentSearchTerm){var o=s.currentSearchTerm.split(",");o[0]&&(e.result.address.address_line_1=o[0]),o[1]&&(e.result.address.address_line_2=o[1]),o[2]&&(e.result.address.address_line_3=o[2]);for(var t=3;ta.length-1&&(s.picklist.tabCount=0,o=!0);var d=a[s.picklist.tabCount],i=s.picklist.list.querySelector(".selected");i&&i.classList.remove("selected"),d.classList.add("selected"),s.picklist.currentItem=d;var r=s.picklist.list.offsetTop,n=s.picklist.list.offsetTop+s.picklist.list.offsetHeight,c=s.picklist.list.scrollTop,l=d.offsetTop,C=d.offsetTop+d.offsetHeight,u=d.offsetHeight;o?s.picklist.list.scrollTop=0:t?s.picklist.list.scrollTop=999:C+u>n?s.picklist.list.scrollTop=c+u:l-u-r";o=o.substring(0,s[t][0])+a+o.substring(s[t][1])}return o},this.picklist.listen=function(e){e.addEventListener("click",s.picklist.pick.bind(null,e))},this.picklist.checkEnter=function(e){if("Enter"===e.key||"Tab"===e.key){var o=void 0;1===s.picklist.size?o=s.picklist.list.querySelectorAll("div")[0]:s.picklist.currentItem&&(o=s.picklist.currentItem),o&&s.picklist.pick(o)}},this.picklist.pick=function(e){s.events.trigger("post-picklist-selection",e),e.getAttribute("format")?s.format(e.getAttribute("format")):s.refine(e.getAttribute("refine"))}},s.prototype.format=function(e){this.events.trigger("pre-formatting-search",e),this.searchSpinner.hide(),this.request.send(e,"GET",this.result.show,void 0,[{key:"Add-Metadata",value:!0}])},s.prototype.refine=function(e){this.events.trigger("pre-refinement",e),this.searchSpinner.hide(),this.request.send("".concat(this.baseUrl).concat(this.stepInEndpoint,"/").concat(e),"GET",this.picklist.show)},s.prototype.checkTab=function(e){var s=this.getKey(e);"Tab"!==s?"Enter"===s&&e.preventDefault():this.picklist.keyup(e)},s.prototype.toggleSearchInputs=function(e){var s,o,t,a="show"===e?"remove":"add";null===(s=this.options.elements.inputs)||void 0===s||s.forEach((function(e){return e.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")}))})),null===(o=this.options.elements.countryList)||void 0===o||o.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")})),null===(t=this.options.elements.lookupButton)||void 0===t||t.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")}))},s.prototype.globalReset=function(e){e&&e.preventDefault(),this.options.enabled=!0,this.result.hide(),this.hasSearchInputBeenReset=!0,this.inputs.forEach((function(e){return e.value=""})),this.picklist.hide(),this.toggleSearchInputs("show"),this.inputs[0].focus(),this.events.trigger("post-reset")},s}();window.AddressValidation=n}(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVMsYUFBY0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDbkcsQ0FBQ2tCLFFBQVMsYUFBY0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDbkcsQ0FBQ2tCLFFBQVMsT0FBUUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDN0YsQ0FBQ2tCLFFBQVMsT0FBUUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDN0YsQ0FBQ2tCLFFBQVMsU0FBVUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDL0YsQ0FBQ2tCLFFBQVMsU0FBVUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDL0YsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDOUYsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlC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LFNBQUF1RCxHQUFXLE9BQUFBLEVBQVFRLFVBQVVtTixHQUFVLGFBQ3ZGLFFBQWxDLEVBQUExUyxLQUFLc0IsUUFBUWtGLFNBQVNxRyxvQkFBWSxTQUFFbkgsV0FBV2tNLGlCQUFpQixXQUFXcFEsU0FBUSxTQUFBdUQsR0FBVyxPQUFBQSxFQUFRUSxVQUFVbU4sR0FBVSxjQUdwSCxZQUFBcEosWUFBUixTQUFvQnhKLEdBQ2RBLEdBQ0ZBLEVBQU1rTyxpQkFHUmhPLEtBQUtzQixRQUFRb0ssU0FBVSxFQUV2QjFMLEtBQUsrRixPQUFPNUQsT0FFWm5DLEtBQUsrRyx5QkFBMEIsRUFHL0IvRyxLQUFLc0csT0FBTzlFLFNBQVEsU0FBQWtCLEdBQVMsT0FBQUEsRUFBTWYsTUFBUSxNQUUzQzNCLEtBQUtpRixTQUFTOUMsT0FFZG5DLEtBQUs4RyxtQkFBbUIsUUFFeEI5RyxLQUFLc0csT0FBTyxHQUFHK0csUUFHZnJOLEtBQUtvQyxPQUFPbEMsUUFBUSxlQUV4QixFQWh0Q0EsR0NDQW1RLE9BQU9zQyxrQkFBb0IsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0V4cGVyaWFuLUFkZHJlc3MtVmFsaWRhdGlvbi8uL3NyYy90cy9ldmVudC1mYWN0b3J5LnRzIiwid2VicGFjazovL0V4cGVyaWFuLUFkZHJlc3MtVmFsaWRhdGlvbi8uL3NyYy90cy9zZWFyY2gtb3B0aW9ucy50cyIsIndlYnBhY2s6Ly9FeHBlcmlhbi1BZGRyZXNzLVZhbGlkYXRpb24vLi9zcmMvdHMvcmVxdWVzdC50cyIsIndlYnBhY2s6Ly9FeHBlcmlhbi1BZGRyZXNzLVZhbGlkYXRpb24vLi9zcmMvdHMvZGF0YXNldHMtY29kZXMudHMiLCJ3ZWJwYWNrOi8vRXhwZXJpYW4tQWRkcmVzcy1WYWxpZGF0aW9uLy4vc3JjL3RzL3RyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly9FeHBlcmlhbi1BZGRyZXNzLVZhbGlkYXRpb24vLi9zcmMvdHMvY2xhc3MtdHlwZXMudHMiLCJ3ZWJwYWNrOi8vRXhwZXJpYW4tQWRkcmVzcy1WYWxpZGF0aW9uLy4vc3JjL3RzL2FkZHJlc3Mtc2VhcmNoLnRzIiwid2VicGFjazovL0V4cGVyaWFuLUFkZHJlc3MtVmFsaWRhdGlvbi8uL3NyYy90cy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogTWV0aG9kIGV2ZW50IGxpc3RlbmVyIChwdWIvc3ViIHR5cGUgdGhpbmcpXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudEZhY3Rvcnkge1xyXG4gIC8vIENyZWF0ZSBhbiBvYmplY3QgdG8gaG9sZCB0aGUgY29sbGVjdGlvbiBvZiBldmVudHNcclxuICBjb2xsZWN0aW9uID0ge307XHJcblxyXG4gIC8vIFN1YnNjcmliZSBhIG5ldyBldmVudFxyXG4gIG9uKGV2ZW50LCBhY3Rpb24pIHtcclxuICAgIC8vIENyZWF0ZSB0aGUgcHJvcGVydHkgYXJyYXkgb24gdGhlIGNvbGxlY3Rpb24gb2JqZWN0XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25bZXZlbnRdID0gdGhpcy5jb2xsZWN0aW9uW2V2ZW50XSB8fCBbXTtcclxuICAgIC8vIFB1c2ggYSBuZXcgYWN0aW9uIGZvciB0aGlzIGV2ZW50IG9udG8gdGhlIGFycmF5XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25bZXZlbnRdLnB1c2goYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIC8vIFB1Ymxpc2ggKHRyaWdnZXIpIGFuIGV2ZW50XHJcbiAgdHJpZ2dlcihldmVudCwgZGF0YSkge1xyXG4gICAgLy8gSWYgdGhpcyBldmVudCBpcyBpbiBvdXIgY29sbGVjdGlvbiAoaS5lLiBhbnlvbmUncyBzdWJzY3JpYmVkKVxyXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbltldmVudF0pIHtcclxuICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgYWN0aW9ucyBmb3IgdGhpcyBldmVudFxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sbGVjdGlvbltldmVudF0ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBDcmVhdGUgYXJyYXkgd2l0aCBkZWZhdWx0IGRhdGEgYXMgMXN0IGl0ZW1cclxuICAgICAgICBjb25zdCBhcmdzID0gW2RhdGFdO1xyXG5cclxuICAgICAgICAvLyBMb29wIG92ZXIgYWRkaXRpb25hbCBhcmdzIGFuZCBhZGQgdG8gYXJyYXlcclxuICAgICAgICBmb3IgKGxldCBhID0gMjsgYSA8IGFyZ3VtZW50cy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1thXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDYWxsIGVhY2ggYWN0aW9uIGZvciB0aGlzIGV2ZW50IHR5cGUsIHBhc3NpbmcgdGhlIGFyZ3NcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5jb2xsZWN0aW9uW2V2ZW50XVtpXS5hcHBseSh0aGlzLmNvbGxlY3Rpb24sIGFyZ3MpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIFdoYXQgdG8gZG8/IFVuY29tbWVudCB0aGUgYmVsb3cgdG8gc2hvdyBlcnJvcnMgaW4geW91ciBldmVudCBhY3Rpb25zXHJcbiAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc1NlYXJjaE9wdGlvbnMge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgdG9rZW46IHN0cmluZztcclxuICBzZWFyY2hUeXBlOiBBZGRyZXNzVmFsaWRhdGlvbk1vZGU7XHJcbiAgbWF4U3VnZ2VzdGlvbnM6IG51bWJlcjtcclxuICBsYW5ndWFnZTogc3RyaW5nO1xyXG4gIGxvY2F0aW9uOiBzdHJpbmc7XHJcbiAgdXNlU3Bpbm5lcjogYm9vbGVhbjtcclxuICBjb3VudHJ5Q29kZT86IHN0cmluZztcclxuICBjb3VudHJ5Q29kZU1hcHBpbmc/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcclxuICBhcHBseUZvY3VzOiBib29sZWFuO1xyXG4gIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xyXG4gIHVzZUFkZHJlc3NFbnRlcmVkVGV4dDogc3RyaW5nO1xyXG4gIHNlYXJjaEFnYWluOiB7dmlzaWJsZT86IGJvb2xlYW4sIHRleHQ/OiBzdHJpbmcsIGxpbms/OiBIVE1MQnV0dG9uRWxlbWVudH07XHJcbiAgZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcjoge3Nob3dIZWFkaW5nOiBib29sZWFuLCBoZWFkaW5nVHlwZTogc3RyaW5nLCB2YWxpZGF0ZWRIZWFkaW5nVGV4dDogc3RyaW5nLCBtYW51YWxIZWFkaW5nVGV4dDogc3RyaW5nfTtcclxuICBlbGVtZW50czoge2lucHV0PzogSFRNTElucHV0RWxlbWVudCwgaW5wdXRzPzogSFRNTElucHV0RWxlbWVudFtdLCBjb3VudHJ5TGlzdD86IEhUTUxTZWxlY3RFbGVtZW50LCBhZGRyZXNzX2xpbmVfMT86IEhUTUxJbnB1dEVsZW1lbnQsIGFkZHJlc3NfbGluZV8yPzogSFRNTElucHV0RWxlbWVudCwgYWRkcmVzc19saW5lXzM/OiBIVE1MSW5wdXRFbGVtZW50LCBsb2NhbGl0eT86IEhUTUxJbnB1dEVsZW1lbnQsIHJlZ2lvbj86IEhUTUxJbnB1dEVsZW1lbnQsIHBvc3RhbF9jb2RlPzogSFRNTElucHV0RWxlbWVudCwgY291bnRyeT86IEhUTUxJbnB1dEVsZW1lbnQsIGZvcm1hdHRlZEFkZHJlc3NDb250YWluZXI/OiBIVE1MRWxlbWVudCwgbG9va3VwQnV0dG9uPzogSFRNTEJ1dHRvbkVsZW1lbnR9O1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUge1xyXG4gIEFVVE9DT01QTEVURSA9ICdhdXRvY29tcGxldGUnLFxyXG4gIFNJTkdMRUxJTkUgPSAnc2luZ2xlbGluZScsXHJcbiAgVkFMSURBVEUgPSAndmFsaWRhdGUnXHJcbn1cclxuXHJcbi8vIERlZmF1bHQgc2V0dGluZ3NcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0ge1xyXG4gIHNlYXJjaFR5cGU6IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5BVVRPQ09NUExFVEUsXHJcbiAgaW5wdXQ6IHtwbGFjZWhvbGRlclRleHQ6ICdTdGFydCB0eXBpbmcgYW4gYWRkcmVzcy4uLicsIGFwcGx5Rm9jdXM6IGZhbHNlfSxcclxuICBmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyOiB7c2hvd0hlYWRpbmc6IGZhbHNlLCBoZWFkaW5nVHlwZTogJ2gzJywgdmFsaWRhdGVkSGVhZGluZ1RleHQ6ICdWYWxpZGF0ZWQgYWRkcmVzcycsIG1hbnVhbEhlYWRpbmdUZXh0OiAnTWFudWFsIGFkZHJlc3MgZW50ZXJlZCd9LFxyXG4gIHNlYXJjaEFnYWluOiB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ1NlYXJjaCBhZ2Fpbid9LFxyXG4gIHVzZUFkZHJlc3NFbnRlcmVkVGV4dDogJzxlbT4gLSBVc2UgYWRkcmVzcyBlbnRlcmVkIG9yIHRyeSBhZ2Fpbi4uLjwvZW0+JyxcclxuICB1c2VTcGlubmVyOiBmYWxzZSxcclxuICBsYW5ndWFnZTogJ2VuJyxcclxuICBhZGRyZXNzTGluZUxhYmVsczogW1xyXG4gICAgJ2FkZHJlc3NfbGluZV8xJyxcclxuICAgICdhZGRyZXNzX2xpbmVfMicsXHJcbiAgICAnYWRkcmVzc19saW5lXzMnLFxyXG4gICAgJ2xvY2FsaXR5JyxcclxuICAgICdyZWdpb24nLFxyXG4gICAgJ3Bvc3RhbF9jb2RlJyxcclxuICAgICdjb3VudHJ5J1xyXG4gIF1cclxufTsiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0IHtcclxuICBpbnN0YW5jZTtcclxuICBjb25zdHJ1Y3RvcihpbnN0YW5jZSkge1xyXG4gICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGN1cnJlbnRSZXF1ZXN0O1xyXG5cclxuXHJcbiAgcHVibGljIHNlbmQodXJsOiBzdHJpbmcsIG1ldGhvZDogJ0dFVCcgfCAnUE9TVCcsIGNhbGxiYWNrOiAoZGF0YTogb2JqZWN0KSA9PiB2b2lkLCBkYXRhPzogc3RyaW5nLCBoZWFkZXJzOiB7a2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBib29sZWFufVtdID0gW10pOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnRpbWVvdXQgPSA1MDAwOyAvLyA1IHNlY29uZHNcclxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignYXV0aC10b2tlbicsIHRoaXMuaW5zdGFuY2Uub3B0aW9ucy50b2tlbik7XHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcblxyXG4gICAgLy8gQWRkIGFkZGl0aW9uYWwgaGVhZGVycyBpZiBzdXBwbGllZFxyXG4gICAgaGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLmtleSwgaGVhZGVyLnZhbHVlKSk7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdC5vbmxvYWQgPSAoeGhyKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5jdXJyZW50UmVxdWVzdC5zdGF0dXMgPCA0MDApIHtcclxuICAgICAgICAvLyBTdWNjZXNzIVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRoaXMuY3VycmVudFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICBjYWxsYmFjayhkYXRhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBXZSByZWFjaGVkIG91ciB0YXJnZXQgc2VydmVyLCBidXQgaXQgcmV0dXJuZWQgYW4gZXJyb3JcclxuICAgICAgICB0aGlzLmluc3RhbmNlLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgICAvLyBGaXJlIGFuIGV2ZW50IHRvIG5vdGlmeSB1c2VycyBvZiBhIGdlbmVyYWwgZXJyb3JcclxuICAgICAgICB0aGlzLmluc3RhbmNlLmV2ZW50cy50cmlnZ2VyKCdyZXF1ZXN0LWVycm9yJywgeGhyKTtcclxuICAgICAgICAvLyBGaXJlIGFuIGV2ZW50IGZvciB0aGUgc3BlY2lmaWMgc3RhdHVzIGNvZGVcclxuICAgICAgICB0aGlzLmluc3RhbmNlLmV2ZW50cy50cmlnZ2VyKGByZXF1ZXN0LWVycm9yLSR7dGhpcy5jdXJyZW50UmVxdWVzdC5zdGF0dXN9YCwgeGhyKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9uZXJyb3IgPSAoeGhyKSA9PiB7XHJcbiAgICAgIC8vIFRoZXJlIHdhcyBhIGNvbm5lY3Rpb24gZXJyb3Igb2Ygc29tZSBzb3J0XHJcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxyXG4gICAgICB0aGlzLmluc3RhbmNlLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gRmlyZSBhbiBldmVudCB0byBub3RpZnkgdXNlcnMgb2YgYW4gZXJyb3JcclxuICAgICAgdGhpcy5pbnN0YW5jZS5ldmVudHMudHJpZ2dlcigncmVxdWVzdC1lcnJvcicsIHhocik7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Qub250aW1lb3V0ID0gKHhocikgPT4ge1xyXG4gICAgICAvLyBUaGVyZSB3YXMgYSBjb25uZWN0aW9uIHRpbWVvdXRcclxuICAgICAgLy8gSGlkZSB0aGUgaW5saW5lIHNlYXJjaCBzcGlubmVyXHJcbiAgICAgIHRoaXMuaW5zdGFuY2Uuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XHJcblxyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IHRvIG5vdGlmeSB1c2VycyBvZiB0aGUgdGltZW91dFxyXG4gICAgICB0aGlzLmluc3RhbmNlLmV2ZW50cy50cmlnZ2VyKCdyZXF1ZXN0LXRpbWVvdXQnLCB4aHIpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0LnNlbmQoZGF0YSk7XHJcbiAgfVxyXG59IiwiZXhwb3J0IGNvbnN0IGRhdGFzZXRDb2RlcyA9IFtcclxuICB7Y291bnRyeTogJ0FmZ2hhbmlzdGFuJywgaXNvM0NvZGU6ICdBRkcnLCBpc28yQ29kZTogJ0FGJywgZGF0YXNldENvZGU6ICdhZi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdBZmdoYW5pc3RhbicsIGlzbzNDb2RlOiAnQUZHJywgaXNvMkNvZGU6ICdBRicsIGRhdGFzZXRDb2RlOiAnYWYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0FsYmFuaWEnLCBpc28zQ29kZTogJ0FMQicsIGlzbzJDb2RlOiAnQUwnLCBkYXRhc2V0Q29kZTogJ2FsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0FsYmFuaWEnLCBpc28zQ29kZTogJ0FMQicsIGlzbzJDb2RlOiAnQUwnLCBkYXRhc2V0Q29kZTogJ2FsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbGdlcmlhJywgaXNvM0NvZGU6ICdEWkEnLCBpc28yQ29kZTogJ0RaJywgZGF0YXNldENvZGU6ICdkei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbGdlcmlhJywgaXNvM0NvZGU6ICdEWkEnLCBpc28yQ29kZTogJ0RaJywgZGF0YXNldENvZGU6ICdkei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQW1lcmljYW4gU2Ftb2EnLCBpc28zQ29kZTogJ0FTTScsIGlzbzJDb2RlOiAnQVMnLCBkYXRhc2V0Q29kZTogJ2FzLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbmRvcnJhJywgaXNvM0NvZGU6ICdBTkQnLCBpc28yQ29kZTogJ0FEJywgZGF0YXNldENvZGU6ICdhZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbmRvcnJhJywgaXNvM0NvZGU6ICdBTkQnLCBpc28yQ29kZTogJ0FEJywgZGF0YXNldENvZGU6ICdhZC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQW5nb2xhJywgaXNvM0NvZGU6ICdBR08nLCBpc28yQ29kZTogJ0FPJywgZGF0YXNldENvZGU6ICdhby1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbmdvbGEnLCBpc28zQ29kZTogJ0FHTycsIGlzbzJDb2RlOiAnQU8nLCBkYXRhc2V0Q29kZTogJ2FvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBbmd1aWxsYScsIGlzbzNDb2RlOiAnQUlBJywgaXNvMkNvZGU6ICdBSScsIGRhdGFzZXRDb2RlOiAnYWktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0FudGFyY3RpY2EnLCBpc28zQ29kZTogJ0FUQScsIGlzbzJDb2RlOiAnQVEnLCBkYXRhc2V0Q29kZTogJ2FxLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0FudGlndWEgYW5kIEJhcmJ1ZGEnLCBpc28zQ29kZTogJ0FURycsIGlzbzJDb2RlOiAnQUcnLCBkYXRhc2V0Q29kZTogJ2FnLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0FudGlndWEgYW5kIEJhcmJ1ZGEnLCBpc28zQ29kZTogJ0FURycsIGlzbzJDb2RlOiAnQUcnLCBkYXRhc2V0Q29kZTogJ2FnLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBcmdlbnRpbmEnLCBpc28zQ29kZTogJ0FSRycsIGlzbzJDb2RlOiAnQVInLCBkYXRhc2V0Q29kZTogJ2FyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0FyZ2VudGluYScsIGlzbzNDb2RlOiAnQVJHJywgaXNvMkNvZGU6ICdBUicsIGRhdGFzZXRDb2RlOiAnYXItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0FybWVuaWEnLCBpc28zQ29kZTogJ0FSTScsIGlzbzJDb2RlOiAnQU0nLCBkYXRhc2V0Q29kZTogJ2FtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0FybWVuaWEnLCBpc28zQ29kZTogJ0FSTScsIGlzbzJDb2RlOiAnQU0nLCBkYXRhc2V0Q29kZTogJ2FtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBcnViYScsIGlzbzNDb2RlOiAnQUJXJywgaXNvMkNvZGU6ICdBVycsIGRhdGFzZXRDb2RlOiAnYXctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQXJ1YmEnLCBpc28zQ29kZTogJ0FCVycsIGlzbzJDb2RlOiAnQVcnLCBkYXRhc2V0Q29kZTogJ2F3LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdBdXN0cmFsaWEgRGF0YUZ1c2lvbicsIGlzbzNDb2RlOiAnQVVTJywgaXNvMkNvZGU6ICdBVScsIGRhdGFzZXRDb2RlOiAnYXUtYWRkcmVzcy1kYXRhZnVzaW9uJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSwgc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcclxuICB7Y291bnRyeTogJ0F1c3RyYWxpYSBHZW9jb2RlZCBOYXRpb25hbCBBZGRyZXNzJywgaXNvM0NvZGU6ICdBVVMnLCBpc28yQ29kZTogJ0FVJywgZGF0YXNldENvZGU6ICdhdS1hZGRyZXNzLWduYWYnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0F1c3RyYWxpYSBQb3N0YWwgQWRkcmVzcycsIGlzbzNDb2RlOiAnQVVTJywgaXNvMkNvZGU6ICdBVScsIGRhdGFzZXRDb2RlOiAnYXUtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUsIHNpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQXVzdHJpYScsIGlzbzNDb2RlOiAnQVVUJywgaXNvMkNvZGU6ICdBVCcsIGRhdGFzZXRDb2RlOiAnYXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0F1c3RyaWEnLCBpc28zQ29kZTogJ0FVVCcsIGlzbzJDb2RlOiAnQVQnLCBkYXRhc2V0Q29kZTogJ2F6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0F6ZXJiYWlqYW4nLCBpc28zQ29kZTogJ0FaRScsIGlzbzJDb2RlOiAnQVonLCBkYXRhc2V0Q29kZTogJ2F6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0F6ZXJiYWlqYW4nLCBpc28zQ29kZTogJ0FaRScsIGlzbzJDb2RlOiAnQVonLCBkYXRhc2V0Q29kZTogJ2F6LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCYWhhbWFzJywgaXNvM0NvZGU6ICdCSFMnLCBpc28yQ29kZTogJ0JTJywgZGF0YXNldENvZGU6ICdicy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdCYWhhbWFzJywgaXNvM0NvZGU6ICdCSFMnLCBpc28yQ29kZTogJ0JTJywgZGF0YXNldENvZGU6ICdicy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQmFocmFpbicsIGlzbzNDb2RlOiAnQkhSJywgaXNvMkNvZGU6ICdCSCcsIGRhdGFzZXRDb2RlOiAnYmgtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQmFocmFpbicsIGlzbzNDb2RlOiAnQkhSJywgaXNvMkNvZGU6ICdCSCcsIGRhdGFzZXRDb2RlOiAnYmgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0JhbmdsYWRlc2gnLCBpc28zQ29kZTogJ0JHRCcsIGlzbzJDb2RlOiAnQkQnLCBkYXRhc2V0Q29kZTogJ2JkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JhbmdsYWRlc2gnLCBpc28zQ29kZTogJ0JHRCcsIGlzbzJDb2RlOiAnQkQnLCBkYXRhc2V0Q29kZTogJ2JkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCYXJiYWRvcycsIGlzbzNDb2RlOiAnQlJCJywgaXNvMkNvZGU6ICdCQicsIGRhdGFzZXRDb2RlOiAnYmItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQmFyYmFkb3MnLCBpc28zQ29kZTogJ0JSQicsIGlzbzJDb2RlOiAnQkInLCBkYXRhc2V0Q29kZTogJ2JiLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCZWxhcnVzJywgaXNvM0NvZGU6ICdCTFInLCBpc28yQ29kZTogJ0JZJywgZGF0YXNldENvZGU6ICdieS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdCZWxhcnVzJywgaXNvM0NvZGU6ICdCTFInLCBpc28yQ29kZTogJ0JZJywgZGF0YXNldENvZGU6ICdieS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQmVsZ2l1bScsIGlzbzNDb2RlOiAnQkVMJywgaXNvMkNvZGU6ICdCRScsIGRhdGFzZXRDb2RlOiAnYmUtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxyXG4gIHtjb3VudHJ5OiAnQmVsZ2l1bScsIGlzbzNDb2RlOiAnQkVMJywgaXNvMkNvZGU6ICdCRScsIGRhdGFzZXRDb2RlOiAnYmUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICcgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JlbGdpdW0nLCBpc28zQ29kZTogJ0JFTCcsIGlzbzJDb2RlOiAnQkUnLCBkYXRhc2V0Q29kZTogJ2JlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCZWxpemUnLCBpc28zQ29kZTogJ0JMWicsIGlzbzJDb2RlOiAnQlonLCBkYXRhc2V0Q29kZTogJ2J6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JlbGl6ZScsIGlzbzNDb2RlOiAnQkxaJywgaXNvMkNvZGU6ICdCWicsIGRhdGFzZXRDb2RlOiAnYnotYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0JlbmluJywgaXNvM0NvZGU6ICdCRU4nLCBpc28yQ29kZTogJ0JKJywgZGF0YXNldENvZGU6ICdiai1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdCZW5pbicsIGlzbzNDb2RlOiAnQkVOJywgaXNvMkNvZGU6ICdCSicsIGRhdGFzZXRDb2RlOiAnYmotYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0Jlcm11ZGEnLCBpc28zQ29kZTogJ0JNVScsIGlzbzJDb2RlOiAnQk0nLCBkYXRhc2V0Q29kZTogJ2JtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0Jlcm11ZGEnLCBpc28zQ29kZTogJ0JNVScsIGlzbzJDb2RlOiAnQk0nLCBkYXRhc2V0Q29kZTogJ2JtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCaHV0YW4nLCBpc28zQ29kZTogJ0JUTicsIGlzbzJDb2RlOiAnQlQnLCBkYXRhc2V0Q29kZTogJ2J0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JodXRhbicsIGlzbzNDb2RlOiAnQlROJywgaXNvMkNvZGU6ICdCVCcsIGRhdGFzZXRDb2RlOiAnYnQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0JvbGl2aWEnLCBpc28zQ29kZTogJ0JPTCcsIGlzbzJDb2RlOiAnQk8nLCBkYXRhc2V0Q29kZTogJ2JvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JvbGl2aWEnLCBpc28zQ29kZTogJ0JPTCcsIGlzbzJDb2RlOiAnQk8nLCBkYXRhc2V0Q29kZTogJ2JvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCb25haXJlLCBTaW50IEV1c3RhdGl1cyBhbmQgU2FiYScsIGlzbzNDb2RlOiAnQkVTJywgaXNvMkNvZGU6ICdCUScsIGRhdGFzZXRDb2RlOiAnYnEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQm9uYWlyZSwgU2ludCBFdXN0YXRpdXMgYW5kIFNhYmEnLCBpc28zQ29kZTogJ0JFUycsIGlzbzJDb2RlOiAnQlEnLCBkYXRhc2V0Q29kZTogJ2JxLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJywgaXNvM0NvZGU6ICdCSUgnLCBpc28yQ29kZTogJ0JBJywgZGF0YXNldENvZGU6ICdiYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdCb3NuaWEgYW5kIEhlcnplZ292aW5hJywgaXNvM0NvZGU6ICdCSUgnLCBpc28yQ29kZTogJ0JBJywgZGF0YXNldENvZGU6ICdiYS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQm90c3dhbmEnLCBpc28zQ29kZTogJ0JXQScsIGlzbzJDb2RlOiAnQlcnLCBkYXRhc2V0Q29kZTogJ2J3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0JvdHN3YW5hJywgaXNvM0NvZGU6ICdCV0EnLCBpc28yQ29kZTogJ0JXJywgZGF0YXNldENvZGU6ICdidy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQnJhemlsJywgaXNvM0NvZGU6ICdCUkEnLCBpc28yQ29kZTogJ0JSJywgZGF0YXNldENvZGU6ICdici1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdCcmF6aWwnLCBpc28zQ29kZTogJ0JSQScsIGlzbzJDb2RlOiAnQlInLCBkYXRhc2V0Q29kZTogJ2JyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCcnVuZWkgRGFydXNzYWxhbScsIGlzbzNDb2RlOiAnQlJOJywgaXNvMkNvZGU6ICdCTicsIGRhdGFzZXRDb2RlOiAnYm4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQnJ1bmVpIERhcnVzc2FsYW0nLCBpc28zQ29kZTogJ0JSTicsIGlzbzJDb2RlOiAnQk4nLCBkYXRhc2V0Q29kZTogJ2JuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCdWxnYXJpYScsIGlzbzNDb2RlOiAnQkdSJywgaXNvMkNvZGU6ICdCRycsIGRhdGFzZXRDb2RlOiAnYmctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQnVsZ2FyaWEnLCBpc28zQ29kZTogJ0JHUicsIGlzbzJDb2RlOiAnQkcnLCBkYXRhc2V0Q29kZTogJ2JnLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdCdXJraW5hIEZhc28nLCBpc28zQ29kZTogJ0JGQScsIGlzbzJDb2RlOiAnQkYnLCBkYXRhc2V0Q29kZTogJ2JmLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0J1cmtpbmEgRmFzbycsIGlzbzNDb2RlOiAnQkZBJywgaXNvMkNvZGU6ICdCRicsIGRhdGFzZXRDb2RlOiAnYmYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0J1cnVuZGknLCBpc28zQ29kZTogJ0JESScsIGlzbzJDb2RlOiAnQkknLCBkYXRhc2V0Q29kZTogJ2JpLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDYW1ib2RpYScsIGlzbzNDb2RlOiAnS0hNJywgaXNvMkNvZGU6ICdLSCcsIGRhdGFzZXRDb2RlOiAna2gtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ2FtYm9kaWEnLCBpc28zQ29kZTogJ0tITScsIGlzbzJDb2RlOiAnS0gnLCBkYXRhc2V0Q29kZTogJ2toLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDYW1lcm9vbicsIGlzbzNDb2RlOiAnQ01SJywgaXNvMkNvZGU6ICdDTScsIGRhdGFzZXRDb2RlOiAnY20tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ2FtZXJvb24nLCBpc28zQ29kZTogJ0NNUicsIGlzbzJDb2RlOiAnQ00nLCBkYXRhc2V0Q29kZTogJ2NtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDYW5hZGEnLCBpc28zQ29kZTogJ0NBTicsIGlzbzJDb2RlOiAnQ0EnLCBkYXRhc2V0Q29kZTogJ2NhLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NhcGUgVmVyZGUnLCBpc28zQ29kZTogJ0NQVicsIGlzbzJDb2RlOiAnQ1YnLCBkYXRhc2V0Q29kZTogJ2N2LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NhcGUgVmVyZGUnLCBpc28zQ29kZTogJ0NQVicsIGlzbzJDb2RlOiAnQ1YnLCBkYXRhc2V0Q29kZTogJ2N2LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDYXltYW4gSXNsYW5kcycsIGlzbzNDb2RlOiAnQ1lNJywgaXNvMkNvZGU6ICdLWScsIGRhdGFzZXRDb2RlOiAna3ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ2F5bWFuIElzbGFuZHMnLCBpc28zQ29kZTogJ0NZTScsIGlzbzJDb2RlOiAnS1knLCBkYXRhc2V0Q29kZTogJ2t5LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnLCBpc28zQ29kZTogJ0NBRicsIGlzbzJDb2RlOiAnQ0YnLCBkYXRhc2V0Q29kZTogJ2NmLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYycsIGlzbzNDb2RlOiAnQ0FGJywgaXNvMkNvZGU6ICdDRicsIGRhdGFzZXRDb2RlOiAnY2YtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0NoYWQnLCBpc28zQ29kZTogJ1RDRCcsIGlzbzJDb2RlOiAnVEQnLCBkYXRhc2V0Q29kZTogJ3RkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NoYWQnLCBpc28zQ29kZTogJ1RDRCcsIGlzbzJDb2RlOiAnVEQnLCBkYXRhc2V0Q29kZTogJ3RkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDaGlsZScsIGlzbzNDb2RlOiAnQ0hMJywgaXNvMkNvZGU6ICdDTCcsIGRhdGFzZXRDb2RlOiAnY2wtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ2hpbGUnLCBpc28zQ29kZTogJ0NITCcsIGlzbzJDb2RlOiAnQ0wnLCBkYXRhc2V0Q29kZTogJ2NsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDaGluYScsIGlzbzNDb2RlOiAnQ0hOJywgaXNvMkNvZGU6ICdDTicsIGRhdGFzZXRDb2RlOiAnY24tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ2hpbmEnLCBpc28zQ29kZTogJ0NITicsIGlzbzJDb2RlOiAnQ04nLCBkYXRhc2V0Q29kZTogJ2NuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDaHJpc3RtYXMgSXNsYW5kJywgaXNvM0NvZGU6ICdDWFInLCBpc28yQ29kZTogJ0NYJywgZGF0YXNldENvZGU6ICdjeC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ29jb3MgSXNsYW5kJywgaXNvM0NvZGU6ICdDQ0snLCBpc28yQ29kZTogJ0NDJywgZGF0YXNldENvZGU6ICdjYy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ29sb21iaWEnLCBpc28zQ29kZTogJ0NPTCcsIGlzbzJDb2RlOiAnQ08nLCBkYXRhc2V0Q29kZTogJ2NvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NvbG9tYmlhJywgaXNvM0NvZGU6ICdDT0wnLCBpc28yQ29kZTogJ0NPJywgZGF0YXNldENvZGU6ICdjby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ29tb3JvcycsIGlzbzNDb2RlOiAnQ09NJywgaXNvMkNvZGU6ICdLTScsIGRhdGFzZXRDb2RlOiAna20tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ29tb3JvcycsIGlzbzNDb2RlOiAnQ09NJywgaXNvMkNvZGU6ICdLTScsIGRhdGFzZXRDb2RlOiAna20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0NvbmdvJywgaXNvM0NvZGU6ICdDT0cnLCBpc28yQ29kZTogJ0NHJywgZGF0YXNldENvZGU6ICdjZy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdDb25nbycsIGlzbzNDb2RlOiAnQ09HJywgaXNvMkNvZGU6ICdDRycsIGRhdGFzZXRDb2RlOiAnY2ctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0NvbmdvLCBUaGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUnLCBpc28zQ29kZTogJ0NPRCcsIGlzbzJDb2RlOiAnQ0QnLCBkYXRhc2V0Q29kZTogJ2NkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0NvbmdvLCBUaGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUnLCBpc28zQ29kZTogJ0NPRCcsIGlzbzJDb2RlOiAnQ0QnLCBkYXRhc2V0Q29kZTogJ2NkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDb29rIElzbGFuZHMnLCBpc28zQ29kZTogJ0NPSycsIGlzbzJDb2RlOiAnQ0snLCBkYXRhc2V0Q29kZTogJ2NrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0Nvb2sgSXNsYW5kcycsIGlzbzNDb2RlOiAnQ09LJywgaXNvMkNvZGU6ICdDSycsIGRhdGFzZXRDb2RlOiAnY2stYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0Nvc3RhIFJpY2EnLCBpc28zQ29kZTogJ0NSSScsIGlzbzJDb2RlOiAnQ1InLCBkYXRhc2V0Q29kZTogJ2NyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0Nvc3RhIFJpY2EnLCBpc28zQ29kZTogJ0NSSScsIGlzbzJDb2RlOiAnQ1InLCBkYXRhc2V0Q29kZTogJ2NyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdDcm9hdGlhJywgaXNvM0NvZGU6ICdIUlYnLCBpc28yQ29kZTogJ0hSJywgZGF0YXNldENvZGU6ICdoci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdDcm9hdGlhJywgaXNvM0NvZGU6ICdIUlYnLCBpc28yQ29kZTogJ0hSJywgZGF0YXNldENvZGU6ICdoci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ3ViYScsIGlzbzNDb2RlOiAnQ1VCJywgaXNvMkNvZGU6ICdDVScsIGRhdGFzZXRDb2RlOiAnY3UtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ3ViYScsIGlzbzNDb2RlOiAnQ1VCJywgaXNvMkNvZGU6ICdDVScsIGRhdGFzZXRDb2RlOiAnY3UtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0N1cmHDp2FvJywgaXNvM0NvZGU6ICdDVVcnLCBpc28yQ29kZTogJ0NXJywgZGF0YXNldENvZGU6ICdjdy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdDdXJhw6dhbycsIGlzbzNDb2RlOiAnQ1VXJywgaXNvMkNvZGU6ICdDVycsIGRhdGFzZXRDb2RlOiAnY3ctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0N5cHJ1cycsIGlzbzNDb2RlOiAnQ1lQJywgaXNvMkNvZGU6ICdDWScsIGRhdGFzZXRDb2RlOiAnY3ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ3lwcnVzJywgaXNvM0NvZGU6ICdDWVAnLCBpc28yQ29kZTogJ0NZJywgZGF0YXNldENvZGU6ICdjeS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ3plY2ggUmVwdWJsaWMnLCBpc28zQ29kZTogJ0NaRScsIGlzbzJDb2RlOiAnQ1onLCBkYXRhc2V0Q29kZTogJ2N6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0N6ZWNoIFJlcHVibGljJywgaXNvM0NvZGU6ICdDWkUnLCBpc28yQ29kZTogJ0NaJywgZGF0YXNldENvZGU6ICdjei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ8O0dGUgZFxcJ0l2b2lyZScsIGlzbzNDb2RlOiAnQ0lWJywgaXNvMkNvZGU6ICdDSScsIGRhdGFzZXRDb2RlOiAnY2ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnQ8O0dGUgZFxcJ0l2b2lyZScsIGlzbzNDb2RlOiAnQ0lWJywgaXNvMkNvZGU6ICdDSScsIGRhdGFzZXRDb2RlOiAnY2ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0Rlbm1hcmsnLCBpc28zQ29kZTogJ0ROSycsIGlzbzJDb2RlOiAnREsnLCBkYXRhc2V0Q29kZTogJ2RrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0Rlbm1hcmsnLCBpc28zQ29kZTogJ0ROSycsIGlzbzJDb2RlOiAnREsnLCBkYXRhc2V0Q29kZTogJ2RrLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdEamlib3V0aScsIGlzbzNDb2RlOiAnREpJJywgaXNvMkNvZGU6ICdESicsIGRhdGFzZXRDb2RlOiAnZGotYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRGppYm91dGknLCBpc28zQ29kZTogJ0RKSScsIGlzbzJDb2RlOiAnREonLCBkYXRhc2V0Q29kZTogJ2RqLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdEb21pbmljYScsIGlzbzNDb2RlOiAnRE1BJywgaXNvMkNvZGU6ICdETScsIGRhdGFzZXRDb2RlOiAnZG0tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRG9taW5pY2EnLCBpc28zQ29kZTogJ0RNQScsIGlzbzJDb2RlOiAnRE0nLCBkYXRhc2V0Q29kZTogJ2RtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdEb21pbmljYW4gUmVwdWJsaWMnLCBpc28zQ29kZTogJ0RPTScsIGlzbzJDb2RlOiAnRE8nLCBkYXRhc2V0Q29kZTogJ2RvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0RvbWluaWNhbiBSZXB1YmxpYycsIGlzbzNDb2RlOiAnRE9NJywgaXNvMkNvZGU6ICdETycsIGRhdGFzZXRDb2RlOiAnZG8tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0VjdWFkb3InLCBpc28zQ29kZTogJ0VDVScsIGlzbzJDb2RlOiAnRUMnLCBkYXRhc2V0Q29kZTogJ2VjLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0VjdWFkb3InLCBpc28zQ29kZTogJ0VDVScsIGlzbzJDb2RlOiAnRUMnLCBkYXRhc2V0Q29kZTogJ2VjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdFZ3lwdCcsIGlzbzNDb2RlOiAnRUdZJywgaXNvMkNvZGU6ICdFRycsIGRhdGFzZXRDb2RlOiAnZWctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRWd5cHQnLCBpc28zQ29kZTogJ0VHWScsIGlzbzJDb2RlOiAnRUcnLCBkYXRhc2V0Q29kZTogJ2VnLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdFbCBTYWx2YWRvcicsIGlzbzNDb2RlOiAnU0xWJywgaXNvMkNvZGU6ICdTVicsIGRhdGFzZXRDb2RlOiAnc3YtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRWwgU2FsdmFkb3InLCBpc28zQ29kZTogJ1NMVicsIGlzbzJDb2RlOiAnU1YnLCBkYXRhc2V0Q29kZTogJ3N2LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdFcXVhdG9yaWFsIEd1aW5lYScsIGlzbzNDb2RlOiAnR05RJywgaXNvMkNvZGU6ICdHUScsIGRhdGFzZXRDb2RlOiAnZ3EtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRXF1YXRvcmlhbCBHdWluZWEnLCBpc28zQ29kZTogJ0dOUScsIGlzbzJDb2RlOiAnR1EnLCBkYXRhc2V0Q29kZTogJ2dxLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdFcml0cmVhJywgaXNvM0NvZGU6ICdFUkknLCBpc28yQ29kZTogJ0VSJywgZGF0YXNldENvZGU6ICdlci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdFcml0cmVhJywgaXNvM0NvZGU6ICdFUkknLCBpc28yQ29kZTogJ0VSJywgZGF0YXNldENvZGU6ICdlci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRXN0b25pYScsIGlzbzNDb2RlOiAnRVNUJywgaXNvMkNvZGU6ICdFRScsIGRhdGFzZXRDb2RlOiAnZWUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRXN0b25pYScsIGlzbzNDb2RlOiAnRVNUJywgaXNvMkNvZGU6ICdFRScsIGRhdGFzZXRDb2RlOiAnZWUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0V0aGlvcGlhJywgaXNvM0NvZGU6ICdFVEgnLCBpc28yQ29kZTogJ0VUJywgZGF0YXNldENvZGU6ICdldC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdFdGhpb3BpYScsIGlzbzNDb2RlOiAnRVRIJywgaXNvMkNvZGU6ICdFVCcsIGRhdGFzZXRDb2RlOiAnZXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0ZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKScsIGlzbzNDb2RlOiAnRkxLJywgaXNvMkNvZGU6ICdGSycsIGRhdGFzZXRDb2RlOiAnZmstYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0Zhcm9lIElzbGFuZHMnLCBpc28zQ29kZTogJ0ZSTycsIGlzbzJDb2RlOiAnRk8nLCBkYXRhc2V0Q29kZTogJ2ZvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0Zhcm9lIElzbGFuZHMnLCBpc28zQ29kZTogJ0ZSTycsIGlzbzJDb2RlOiAnRk8nLCBkYXRhc2V0Q29kZTogJ2ZvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdGaWppJywgaXNvM0NvZGU6ICdGSkknLCBpc28yQ29kZTogJ0ZKJywgZGF0YXNldENvZGU6ICdmai1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdGaWppJywgaXNvM0NvZGU6ICdGSkknLCBpc28yQ29kZTogJ0ZKJywgZGF0YXNldENvZGU6ICdmai1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRmlubGFuZCcsIGlzbzNDb2RlOiAnRklOJywgaXNvMkNvZGU6ICdGSScsIGRhdGFzZXRDb2RlOiAnZmktYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxyXG4gIHtjb3VudHJ5OiAnRmlubGFuZCcsIGlzbzNDb2RlOiAnRklOJywgaXNvMkNvZGU6ICdGSScsIGRhdGFzZXRDb2RlOiAnZmktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICd2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRmlubGFuZCcsIGlzbzNDb2RlOiAnRklOJywgaXNvMkNvZGU6ICdGSScsIGRhdGFzZXRDb2RlOiAnZmktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0ZyYW5jZSBTdHJlZXQgTGV2ZWwnLCBpc28zQ29kZTogJ0ZSQScsIGlzbzJDb2RlOiAnRlInLCBkYXRhc2V0Q29kZTogJ2ZyLWFkZHJlc3Mtc3RyZWV0bGV2ZWwnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdGcmFuY2UgU3ViLVByZW1pc2VzIExldmVsJywgaXNvM0NvZGU6ICdGUkEnLCBpc28yQ29kZTogJ0ZSJywgZGF0YXNldENvZGU6ICdmci1hZGRpdGlvbmFsLWhleGFsaW5lMycsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUsIHNpbmdsZWxpbmUsIHR5cGVkb3duJ30sXHJcbiAge2NvdW50cnk6ICdGcmFuY2UgUHJlbWlzZXMgTGV2ZWwnLCBpc28zQ29kZTogJ0ZSQScsIGlzbzJDb2RlOiAnRlInLCBkYXRhc2V0Q29kZTogJ2ZyLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdGcmVuY2ggR3VpYW5hJywgaXNvM0NvZGU6ICdHVUYnLCBpc28yQ29kZTogJ0dGJywgZGF0YXNldENvZGU6ICdnZi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnRnJlbmNoIFBvbHluZXNpYScsIGlzbzNDb2RlOiAnUFlGJywgaXNvMkNvZGU6ICdQRicsIGRhdGFzZXRDb2RlOiAncGYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0dhYm9uJywgaXNvM0NvZGU6ICdHQUInLCBpc28yQ29kZTogJ0dBJywgZGF0YXNldENvZGU6ICdnYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHYWJvbicsIGlzbzNDb2RlOiAnR0FCJywgaXNvMkNvZGU6ICdHQScsIGRhdGFzZXRDb2RlOiAnZ2EtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0dhbWJpYScsIGlzbzNDb2RlOiAnR01CJywgaXNvMkNvZGU6ICdHTScsIGRhdGFzZXRDb2RlOiAnZ20tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR2FtYmlhJywgaXNvM0NvZGU6ICdHTUInLCBpc28yQ29kZTogJ0dNJywgZGF0YXNldENvZGU6ICdnbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR2VvcmdpYScsIGlzbzNDb2RlOiAnR0VPJywgaXNvMkNvZGU6ICdHRScsIGRhdGFzZXRDb2RlOiAnZ2UtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR2VvcmdpYScsIGlzbzNDb2RlOiAnR0VPJywgaXNvMkNvZGU6ICdHRScsIGRhdGFzZXRDb2RlOiAnZ2UtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0dlcm1hbnknLCBpc28zQ29kZTogJ0RFVScsIGlzbzJDb2RlOiAnREUnLCBkYXRhc2V0Q29kZTogJ2RlLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHZXJtYW55JywgaXNvM0NvZGU6ICdERVUnLCBpc28yQ29kZTogJ0RFJywgZGF0YXNldENvZGU6ICdkZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3ZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHZXJtYW55JywgaXNvM0NvZGU6ICdERVUnLCBpc28yQ29kZTogJ0RFJywgZGF0YXNldENvZGU6ICdkZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR2hhbmEnLCBpc28zQ29kZTogJ0dIQScsIGlzbzJDb2RlOiAnR0gnLCBkYXRhc2V0Q29kZTogJ2doLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0doYW5hJywgaXNvM0NvZGU6ICdHSEEnLCBpc28yQ29kZTogJ0dIJywgZGF0YXNldENvZGU6ICdnaC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR2licmFsdGFyJywgaXNvM0NvZGU6ICdHSUInLCBpc28yQ29kZTogJ0dJJywgZGF0YXNldENvZGU6ICdnaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR3JlZWNlJywgaXNvM0NvZGU6ICdHUkMnLCBpc28yQ29kZTogJ0dSJywgZGF0YXNldENvZGU6ICdnci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHcmVlY2UnLCBpc28zQ29kZTogJ0dSQycsIGlzbzJDb2RlOiAnR1InLCBkYXRhc2V0Q29kZTogJ2dyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdHcmVlbmxhbmQnLCBpc28zQ29kZTogJ0dSTCcsIGlzbzJDb2RlOiAnR0wnLCBkYXRhc2V0Q29kZTogJ2dsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0dyZWVubGFuZCcsIGlzbzNDb2RlOiAnR1JMJywgaXNvMkNvZGU6ICdHTCcsIGRhdGFzZXRDb2RlOiAnZ2wtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0dyZW5hZGEnLCBpc28zQ29kZTogJ0dSRCcsIGlzbzJDb2RlOiAnR0QnLCBkYXRhc2V0Q29kZTogJ2dkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0dyZW5hZGEnLCBpc28zQ29kZTogJ0dSRCcsIGlzbzJDb2RlOiAnR0QnLCBkYXRhc2V0Q29kZTogJ2dkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdHdWFkZWxvdXBlJywgaXNvM0NvZGU6ICdHTFAnLCBpc28yQ29kZTogJ0dQJywgZGF0YXNldENvZGU6ICdncC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR3VhbScsIGlzbzNDb2RlOiAnR1VNJywgaXNvMkNvZGU6ICdHVScsIGRhdGFzZXRDb2RlOiAnZ3UtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0d1YXRlbWFsYScsIGlzbzNDb2RlOiAnR1RNJywgaXNvMkNvZGU6ICdHVCcsIGRhdGFzZXRDb2RlOiAnZ3QtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR3VhdGVtYWxhJywgaXNvM0NvZGU6ICdHVE0nLCBpc28yQ29kZTogJ0dUJywgZGF0YXNldENvZGU6ICdndC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR3VpbmVhJywgaXNvM0NvZGU6ICdHSU4nLCBpc28yQ29kZTogJ0dOJywgZGF0YXNldENvZGU6ICdnbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHdWluZWEnLCBpc28zQ29kZTogJ0dJTicsIGlzbzJDb2RlOiAnR04nLCBkYXRhc2V0Q29kZTogJ2duLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdHdWluZWEtQmlzc2F1JywgaXNvM0NvZGU6ICdHTkInLCBpc28yQ29kZTogJ0dXJywgZGF0YXNldENvZGU6ICdndy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHdWluZWEtQmlzc2F1JywgaXNvM0NvZGU6ICdHTkInLCBpc28yQ29kZTogJ0dXJywgZGF0YXNldENvZGU6ICdndy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnR3V5YW5hJywgaXNvM0NvZGU6ICdHVVknLCBpc28yQ29kZTogJ0dZJywgZGF0YXNldENvZGU6ICdneS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdHdXlhbmEnLCBpc28zQ29kZTogJ0dVWScsIGlzbzJDb2RlOiAnR1knLCBkYXRhc2V0Q29kZTogJ2d5LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdIYWl0aScsIGlzbzNDb2RlOiAnSFRJJywgaXNvMkNvZGU6ICdIVCcsIGRhdGFzZXRDb2RlOiAnaHQtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSGFpdGknLCBpc28zQ29kZTogJ0hUSScsIGlzbzJDb2RlOiAnSFQnLCBkYXRhc2V0Q29kZTogJ2h0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdIb25kdXJhcycsIGlzbzNDb2RlOiAnSE5EJywgaXNvMkNvZGU6ICdITicsIGRhdGFzZXRDb2RlOiAnaG4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSG9uZHVyYXMnLCBpc28zQ29kZTogJ0hORCcsIGlzbzJDb2RlOiAnSE4nLCBkYXRhc2V0Q29kZTogJ2huLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdIb25nIEtvbmcnLCBpc28zQ29kZTogJ0hLRycsIGlzbzJDb2RlOiAnSEsnLCBkYXRhc2V0Q29kZTogJ2hrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0hvbmcgS29uZycsIGlzbzNDb2RlOiAnSEtHJywgaXNvMkNvZGU6ICdISycsIGRhdGFzZXRDb2RlOiAnaGstYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0h1bmdhcnknLCBpc28zQ29kZTogJ0hVTicsIGlzbzJDb2RlOiAnSFUnLCBkYXRhc2V0Q29kZTogJ2h1LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0h1bmdhcnknLCBpc28zQ29kZTogJ0hVTicsIGlzbzJDb2RlOiAnSFUnLCBkYXRhc2V0Q29kZTogJ2h1LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdJY2VsYW5kJywgaXNvM0NvZGU6ICdJU0wnLCBpc28yQ29kZTogJ0lTJywgZGF0YXNldENvZGU6ICdpcy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdJY2VsYW5kJywgaXNvM0NvZGU6ICdJU0wnLCBpc28yQ29kZTogJ0lTJywgZGF0YXNldENvZGU6ICdpcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSW5kaWEnLCBpc28zQ29kZTogJ0lORCcsIGlzbzJDb2RlOiAnSU4nLCBkYXRhc2V0Q29kZTogJ2luLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0luZGlhJywgaXNvM0NvZGU6ICdJTkQnLCBpc28yQ29kZTogJ0lOJywgZGF0YXNldENvZGU6ICdpbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSW5kb25lc2lhJywgaXNvM0NvZGU6ICdJRE4nLCBpc28yQ29kZTogJ0lEJywgZGF0YXNldENvZGU6ICdpZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdJbmRvbmVzaWEnLCBpc28zQ29kZTogJ0lETicsIGlzbzJDb2RlOiAnSUQnLCBkYXRhc2V0Q29kZTogJ2lkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdJcmFuLCBJc2xhbWljIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdJUk4nLCBpc28yQ29kZTogJ0lSJywgZGF0YXNldENvZGU6ICdpci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdJcmFuLCBJc2xhbWljIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdJUk4nLCBpc28yQ29kZTogJ0lSJywgZGF0YXNldENvZGU6ICdpci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSXJhcScsIGlzbzNDb2RlOiAnSVJRJywgaXNvMkNvZGU6ICdJUScsIGRhdGFzZXRDb2RlOiAnaXEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSXJhcScsIGlzbzNDb2RlOiAnSVJRJywgaXNvMkNvZGU6ICdJUScsIGRhdGFzZXRDb2RlOiAnaXEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0lyZWxhbmQnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcclxuICB7Y291bnRyeTogJ0lyZWxhbmQnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0lyZWxhbmQnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdJcmVsYW5kIEVpcmNvZGUnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZGl0aW9uYWwtZWlyY29kZScsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0lyZWxhbmQgRUNBRCcsIGlzbzNDb2RlOiAnSVJMJywgaXNvMkNvZGU6ICdJRScsIGRhdGFzZXRDb2RlOiAnaWUtYWRkcmVzcy1lY2FkJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSXNyYWVsJywgaXNvM0NvZGU6ICdJU1InLCBpc28yQ29kZTogJ0lMJywgZGF0YXNldENvZGU6ICdpbC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdJc3JhZWwnLCBpc28zQ29kZTogJ0lTUicsIGlzbzJDb2RlOiAnSUwnLCBkYXRhc2V0Q29kZTogJ2lsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdJdGFseScsIGlzbzNDb2RlOiAnSVRBJywgaXNvMkNvZGU6ICdJVCcsIGRhdGFzZXRDb2RlOiAnaXQtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSXRhbHknLCBpc28zQ29kZTogJ0lUQScsIGlzbzJDb2RlOiAnSVQnLCBkYXRhc2V0Q29kZTogJ2l0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdKYW1haWNhJywgaXNvM0NvZGU6ICdKQU0nLCBpc28yQ29kZTogJ0pNJywgZGF0YXNldENvZGU6ICdqbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdKYW1haWNhJywgaXNvM0NvZGU6ICdKQU0nLCBpc28yQ29kZTogJ0pNJywgZGF0YXNldENvZGU6ICdqbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnSmFwYW4nLCBpc28zQ29kZTogJ0pQTicsIGlzbzJDb2RlOiAnSlAnLCBkYXRhc2V0Q29kZTogJ2pwLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0phcGFuJywgaXNvM0NvZGU6ICdKUE4nLCBpc28yQ29kZTogJ0pQJywgZGF0YXNldENvZGU6ICdqcC1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdKb3JkYW4nLCBpc28zQ29kZTogJ0pPUicsIGlzbzJDb2RlOiAnSk8nLCBkYXRhc2V0Q29kZTogJ2pvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0pvcmRhbicsIGlzbzNDb2RlOiAnSk9SJywgaXNvMkNvZGU6ICdKTycsIGRhdGFzZXRDb2RlOiAnam8tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0themFraHN0YW4nLCBpc28zQ29kZTogJ0tBWicsIGlzbzJDb2RlOiAnS1onLCBkYXRhc2V0Q29kZTogJ2t6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0themFraHN0YW4nLCBpc28zQ29kZTogJ0tBWicsIGlzbzJDb2RlOiAnS1onLCBkYXRhc2V0Q29kZTogJ2t6LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdLZW55YScsIGlzbzNDb2RlOiAnS0VOJywgaXNvMkNvZGU6ICdLRScsIGRhdGFzZXRDb2RlOiAna2UtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnS2VueWEnLCBpc28zQ29kZTogJ0tFTicsIGlzbzJDb2RlOiAnS0UnLCBkYXRhc2V0Q29kZTogJ2tlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdLaXJpYmF0aScsIGlzbzNDb2RlOiAnS0lSJywgaXNvMkNvZGU6ICdLSScsIGRhdGFzZXRDb2RlOiAna2ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnS2lyaWJhdGknLCBpc28zQ29kZTogJ0tJUicsIGlzbzJDb2RlOiAnS0knLCBkYXRhc2V0Q29kZTogJ2tpLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGVcXCdzIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdQUksnLCBpc28yQ29kZTogJ0tQJywgZGF0YXNldENvZGU6ICdrcC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGVcXCdzIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdQUksnLCBpc28yQ29kZTogJ0tQJywgZGF0YXNldENvZGU6ICdrcC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnS29yZWEsIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdLT1InLCBpc28yQ29kZTogJ0tSJywgZGF0YXNldENvZGU6ICdrci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdLb3JlYSwgUmVwdWJsaWMgb2YnLCBpc28zQ29kZTogJ0tPUicsIGlzbzJDb2RlOiAnS1InLCBkYXRhc2V0Q29kZTogJ2tyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdLb3Nvdm8nLCBpc28zQ29kZTogJ0tPUycsIGlzbzJDb2RlOiAnWEsnLCBkYXRhc2V0Q29kZTogJ2t2LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdLdXdhaXQnLCBpc28zQ29kZTogJ0tXVCcsIGlzbzJDb2RlOiAnS1cnLCBkYXRhc2V0Q29kZTogJ2t3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0t1d2FpdCcsIGlzbzNDb2RlOiAnS1dUJywgaXNvMkNvZGU6ICdLVycsIGRhdGFzZXRDb2RlOiAna3ctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0t5cmd5enN0YW4nLCBpc28zQ29kZTogJ0tHWicsIGlzbzJDb2RlOiAnS0cnLCBkYXRhc2V0Q29kZTogJ2tnLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0t5cmd5enN0YW4nLCBpc28zQ29kZTogJ0tHWicsIGlzbzJDb2RlOiAnS0cnLCBkYXRhc2V0Q29kZTogJ2tnLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdMYW9zJywgaXNvM0NvZGU6ICdMQU8nLCBpc28yQ29kZTogJ0xBJywgZGF0YXNldENvZGU6ICdsYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMYW9zJywgaXNvM0NvZGU6ICdMQU8nLCBpc28yQ29kZTogJ0xBJywgZGF0YXNldENvZGU6ICdsYS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTGF0dmlhJywgaXNvM0NvZGU6ICdMVkEnLCBpc28yQ29kZTogJ0xWJywgZGF0YXNldENvZGU6ICdsdi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMYXR2aWEnLCBpc28zQ29kZTogJ0xWQScsIGlzbzJDb2RlOiAnTFYnLCBkYXRhc2V0Q29kZTogJ2x2LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdMZWJhbm9uJywgaXNvM0NvZGU6ICdMQk4nLCBpc28yQ29kZTogJ0xCJywgZGF0YXNldENvZGU6ICdsYi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMZWJhbm9uJywgaXNvM0NvZGU6ICdMQk4nLCBpc28yQ29kZTogJ0xCJywgZGF0YXNldENvZGU6ICdsYi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTGVzb3RobycsIGlzbzNDb2RlOiAnTFNPJywgaXNvMkNvZGU6ICdMUycsIGRhdGFzZXRDb2RlOiAnbHMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTGVzb3RobycsIGlzbzNDb2RlOiAnTFNPJywgaXNvMkNvZGU6ICdMUycsIGRhdGFzZXRDb2RlOiAnbHMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ0xpYmVyaWEnLCBpc28zQ29kZTogJ0xCUicsIGlzbzJDb2RlOiAnTFInLCBkYXRhc2V0Q29kZTogJ2xyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ0xpYmVyaWEnLCBpc28zQ29kZTogJ0xCUicsIGlzbzJDb2RlOiAnTFInLCBkYXRhc2V0Q29kZTogJ2xyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdMaWJ5YScsIGlzbzNDb2RlOiAnTEJZJywgaXNvMkNvZGU6ICdMWScsIGRhdGFzZXRDb2RlOiAnbHktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTGlieWEnLCBpc28zQ29kZTogJ0xCWScsIGlzbzJDb2RlOiAnTFknLCBkYXRhc2V0Q29kZTogJ2x5LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdMaWVjaHRlbnN0ZWluJywgaXNvM0NvZGU6ICdMSUUnLCBpc28yQ29kZTogJ0xJJywgZGF0YXNldENvZGU6ICdsaS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMaWVjaHRlbnN0ZWluJywgaXNvM0NvZGU6ICdMSUUnLCBpc28yQ29kZTogJ0xJJywgZGF0YXNldENvZGU6ICdsaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTGl0aHVhbmlhJywgaXNvM0NvZGU6ICdMVFUnLCBpc28yQ29kZTogJ0xUJywgZGF0YXNldENvZGU6ICdsdC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMaXRodWFuaWEnLCBpc28zQ29kZTogJ0xUVScsIGlzbzJDb2RlOiAnTFQnLCBkYXRhc2V0Q29kZTogJ2x0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdMdXhlbWJvdXJnJywgaXNvM0NvZGU6ICdMVVgnLCBpc28yQ29kZTogJ0xVJywgZGF0YXNldENvZGU6ICdsdS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdMdXhlbWJvdXJnJywgaXNvM0NvZGU6ICdMVVgnLCBpc28yQ29kZTogJ0xVJywgZGF0YXNldENvZGU6ICdsdS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFjYXUnLCBpc28zQ29kZTogJ01BQycsIGlzbzJDb2RlOiAnTU8nLCBkYXRhc2V0Q29kZTogJ2x2LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01hY2F1JywgaXNvM0NvZGU6ICdNQUMnLCBpc28yQ29kZTogJ01PJywgZGF0YXNldENvZGU6ICdsdi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFkYWdhc2NhcicsIGlzbzNDb2RlOiAnTURHJywgaXNvMkNvZGU6ICdNRycsIGRhdGFzZXRDb2RlOiAnbW8tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFkYWdhc2NhcicsIGlzbzNDb2RlOiAnTURHJywgaXNvMkNvZGU6ICdNRycsIGRhdGFzZXRDb2RlOiAnbW8tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01hbGF3aScsIGlzbzNDb2RlOiAnTVdJJywgaXNvMkNvZGU6ICdNVycsIGRhdGFzZXRDb2RlOiAnbXctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFsYXdpJywgaXNvM0NvZGU6ICdNV0knLCBpc28yQ29kZTogJ01XJywgZGF0YXNldENvZGU6ICdtdy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFsYXlzaWEnLCBpc28zQ29kZTogJ01ZUycsIGlzbzJDb2RlOiAnTVknLCBkYXRhc2V0Q29kZTogJ215LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01hbGF5c2lhJywgaXNvM0NvZGU6ICdNWVMnLCBpc28yQ29kZTogJ01ZJywgZGF0YXNldENvZGU6ICdteS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFsZGl2ZXMnLCBpc28zQ29kZTogJ01EVicsIGlzbzJDb2RlOiAnTVYnLCBkYXRhc2V0Q29kZTogJ212LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01hbGRpdmVzJywgaXNvM0NvZGU6ICdNRFYnLCBpc28yQ29kZTogJ01WJywgZGF0YXNldENvZGU6ICdtdi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFsaScsIGlzbzNDb2RlOiAnTUxJJywgaXNvMkNvZGU6ICdNTCcsIGRhdGFzZXRDb2RlOiAnbWwtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWFsaScsIGlzbzNDb2RlOiAnTUxJJywgaXNvMkNvZGU6ICdNTCcsIGRhdGFzZXRDb2RlOiAnbWwtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01hbHRhJywgaXNvM0NvZGU6ICdNTFQnLCBpc28yQ29kZTogJ01UJywgZGF0YXNldENvZGU6ICdtdC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdNYWx0YScsIGlzbzNDb2RlOiAnTUxUJywgaXNvMkNvZGU6ICdNVCcsIGRhdGFzZXRDb2RlOiAnbXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01hcnNoYWxsIElzbGFuZHMnLCBpc28zQ29kZTogJ01ITCcsIGlzbzJDb2RlOiAnTUgnLCBkYXRhc2V0Q29kZTogJ21oLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdNYXJ0aW5pcXVlJywgaXNvM0NvZGU6ICdNVFEnLCBpc28yQ29kZTogJ01RJywgZGF0YXNldENvZGU6ICdtcS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWF1cml0YW5pYScsIGlzbzNDb2RlOiAnTVJUJywgaXNvMkNvZGU6ICdNUicsIGRhdGFzZXRDb2RlOiAnbXItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWF1cml0YW5pYScsIGlzbzNDb2RlOiAnTVJUJywgaXNvMkNvZGU6ICdNUicsIGRhdGFzZXRDb2RlOiAnbXItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01hdXJpdGl1cycsIGlzbzNDb2RlOiAnTVVTJywgaXNvMkNvZGU6ICdNVScsIGRhdGFzZXRDb2RlOiAnbXUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWF1cml0aXVzJywgaXNvM0NvZGU6ICdNVVMnLCBpc28yQ29kZTogJ01VJywgZGF0YXNldENvZGU6ICdtdS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWF5b3R0ZScsIGlzbzNDb2RlOiAnTVlUJywgaXNvMkNvZGU6ICdZVCcsIGRhdGFzZXRDb2RlOiAneXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01leGljbycsIGlzbzNDb2RlOiAnTUVYJywgaXNvMkNvZGU6ICdNWCcsIGRhdGFzZXRDb2RlOiAnbXgtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWV4aWNvJywgaXNvM0NvZGU6ICdNRVgnLCBpc28yQ29kZTogJ01YJywgZGF0YXNldENvZGU6ICdteC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZicsIGlzbzNDb2RlOiAnRlNNJywgaXNvMkNvZGU6ICdGTScsIGRhdGFzZXRDb2RlOiAnZm0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01vbGRvdmEnLCBpc28zQ29kZTogJ01EQScsIGlzbzJDb2RlOiAnTUQnLCBkYXRhc2V0Q29kZTogJ21kLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01vbGRvdmEnLCBpc28zQ29kZTogJ01EQScsIGlzbzJDb2RlOiAnTUQnLCBkYXRhc2V0Q29kZTogJ21kLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdNb25hY28nLCBpc28zQ29kZTogJ01DTycsIGlzbzJDb2RlOiAnTUMnLCBkYXRhc2V0Q29kZTogJ21jLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01vbmFjbycsIGlzbzNDb2RlOiAnTUNPJywgaXNvMkNvZGU6ICdNQycsIGRhdGFzZXRDb2RlOiAnbWMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01vbmdvbGlhJywgaXNvM0NvZGU6ICdNTkcnLCBpc28yQ29kZTogJ01OJywgZGF0YXNldENvZGU6ICdtbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdNb25nb2xpYScsIGlzbzNDb2RlOiAnTU5HJywgaXNvMkNvZGU6ICdNTicsIGRhdGFzZXRDb2RlOiAnbW4tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01vbnRlbmVncm8nLCBpc28zQ29kZTogJ01ORScsIGlzbzJDb2RlOiAnTUUnLCBkYXRhc2V0Q29kZTogJ21lLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01vbnRlbmVncm8nLCBpc28zQ29kZTogJ01ORScsIGlzbzJDb2RlOiAnTUUnLCBkYXRhc2V0Q29kZTogJ21lLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdNb250c2VycmF0JywgaXNvM0NvZGU6ICdNU1InLCBpc28yQ29kZTogJ01TJywgZGF0YXNldENvZGU6ICdtcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTW9yb2NjbycsIGlzbzNDb2RlOiAnTUFSJywgaXNvMkNvZGU6ICdNQScsIGRhdGFzZXRDb2RlOiAnbWEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTW9yb2NjbycsIGlzbzNDb2RlOiAnTUFSJywgaXNvMkNvZGU6ICdNQScsIGRhdGFzZXRDb2RlOiAnbWEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ01vemFtYmlxdWUnLCBpc28zQ29kZTogJ01PWicsIGlzbzJDb2RlOiAnTVonLCBkYXRhc2V0Q29kZTogJ216LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ01vemFtYmlxdWUnLCBpc28zQ29kZTogJ01PWicsIGlzbzJDb2RlOiAnTVonLCBkYXRhc2V0Q29kZTogJ216LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdNeWFubWFyJywgaXNvM0NvZGU6ICdNTVInLCBpc28yQ29kZTogJ01NJywgZGF0YXNldENvZGU6ICdtbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdNeWFubWFyJywgaXNvM0NvZGU6ICdNTVInLCBpc28yQ29kZTogJ01NJywgZGF0YXNldENvZGU6ICdtbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTmFtaWJpYScsIGlzbzNDb2RlOiAnTkFNJywgaXNvMkNvZGU6ICdOQScsIGRhdGFzZXRDb2RlOiAnbmEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTmFtaWJpYScsIGlzbzNDb2RlOiAnTkFNJywgaXNvMkNvZGU6ICdOQScsIGRhdGFzZXRDb2RlOiAnbmEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05hdXJ1JywgaXNvM0NvZGU6ICdOUlUnLCBpc28yQ29kZTogJ05SJywgZGF0YXNldENvZGU6ICduci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOYXVydScsIGlzbzNDb2RlOiAnTlJVJywgaXNvMkNvZGU6ICdOUicsIGRhdGFzZXRDb2RlOiAnbnItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05lcGFsJywgaXNvM0NvZGU6ICdOUEwnLCBpc28yQ29kZTogJ05QJywgZGF0YXNldENvZGU6ICducC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOZXBhbCcsIGlzbzNDb2RlOiAnTlBMJywgaXNvMkNvZGU6ICdOUCcsIGRhdGFzZXRDb2RlOiAnbnAtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05ldGhlcmxhbmRzJywgaXNvM0NvZGU6ICdOTEQnLCBpc28yQ29kZTogJ05MJywgZGF0YXNldENvZGU6ICdubC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOZXRoZXJsYW5kcycsIGlzbzNDb2RlOiAnTkxEJywgaXNvMkNvZGU6ICdOTCcsIGRhdGFzZXRDb2RlOiAnbmwtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05ldyBDYWxlZG9uaWEnLCBpc28zQ29kZTogJ05DTCcsIGlzbzJDb2RlOiAnTkMnLCBkYXRhc2V0Q29kZTogJ25jLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdOZXcgWmVhbGFuZCBEYXRhRnVzaW9uJywgaXNvM0NvZGU6ICdOWkwnLCBpc28yQ29kZTogJ05aJywgZGF0YXNldENvZGU6ICduei1hZGRpdGlvbmFsLWRhdGFmdXNpb24nLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ05ldyBaZWFsYW5kIFBvc3RhbCBBZGRyZXNzJywgaXNvM0NvZGU6ICdOWkwnLCBpc28yQ29kZTogJ05aJywgZGF0YXNldENvZGU6ICduei1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSwgc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOaWNhcmFndWEnLCBpc28zQ29kZTogJ05JQycsIGlzbzJDb2RlOiAnTkknLCBkYXRhc2V0Q29kZTogJ25pLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ05pY2FyYWd1YScsIGlzbzNDb2RlOiAnTklDJywgaXNvMkNvZGU6ICdOSScsIGRhdGFzZXRDb2RlOiAnbmktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05pZ2VyJywgaXNvM0NvZGU6ICdORVInLCBpc28yQ29kZTogJ05FJywgZGF0YXNldENvZGU6ICduZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOaWdlcicsIGlzbzNDb2RlOiAnTkVSJywgaXNvMkNvZGU6ICdORScsIGRhdGFzZXRDb2RlOiAnbmUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05pZ2VyaWEnLCBpc28zQ29kZTogJ05HQScsIGlzbzJDb2RlOiAnTkcnLCBkYXRhc2V0Q29kZTogJ25nLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ05pZ2VyaWEnLCBpc28zQ29kZTogJ05HQScsIGlzbzJDb2RlOiAnTkcnLCBkYXRhc2V0Q29kZTogJ25nLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdOaXVlJywgaXNvM0NvZGU6ICdOSVUnLCBpc28yQ29kZTogJ05VJywgZGF0YXNldENvZGU6ICdudS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdOb3Jmb2xrIElzbGFuZCcsIGlzbzNDb2RlOiAnTkZLJywgaXNvMkNvZGU6ICdORicsIGRhdGFzZXRDb2RlOiAnbmYtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTm9yZm9sayBJc2xhbmQnLCBpc28zQ29kZTogJ05GSycsIGlzbzJDb2RlOiAnTkYnLCBkYXRhc2V0Q29kZTogJ25mLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdOb3J0aCBNYWNlZG9uaWEnLCBpc28zQ29kZTogJ01LRCcsIGlzbzJDb2RlOiAnTUsnLCBkYXRhc2V0Q29kZTogJ21rLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ05vcnRoIE1hY2Vkb25pYScsIGlzbzNDb2RlOiAnTUtEJywgaXNvMkNvZGU6ICdNSycsIGRhdGFzZXRDb2RlOiAnbWstYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcycsIGlzbzNDb2RlOiAnTU5QJywgaXNvMkNvZGU6ICdNUCcsIGRhdGFzZXRDb2RlOiAnbXAtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ05vcndheScsIGlzbzNDb2RlOiAnTk9SJywgaXNvMkNvZGU6ICdOTycsIGRhdGFzZXRDb2RlOiAnbm8tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICd2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnTm9yd2F5JywgaXNvM0NvZGU6ICdOT1InLCBpc28yQ29kZTogJ05PJywgZGF0YXNldENvZGU6ICduby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnT21hbicsIGlzbzNDb2RlOiAnT01OJywgaXNvMkNvZGU6ICdPTScsIGRhdGFzZXRDb2RlOiAnb20tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnT21hbicsIGlzbzNDb2RlOiAnT01OJywgaXNvMkNvZGU6ICdPTScsIGRhdGFzZXRDb2RlOiAnb20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1Bha2lzdGFuJywgaXNvM0NvZGU6ICdQQUsnLCBpc28yQ29kZTogJ1BLJywgZGF0YXNldENvZGU6ICdway1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdQYWtpc3RhbicsIGlzbzNDb2RlOiAnUEFLJywgaXNvMkNvZGU6ICdQSycsIGRhdGFzZXRDb2RlOiAncGstYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1BhbGF1JywgaXNvM0NvZGU6ICdQTFcnLCBpc28yQ29kZTogJ1BXJywgZGF0YXNldENvZGU6ICdwdy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUGFsZXN0aW5lJywgaXNvM0NvZGU6ICdQU0UnLCBpc28yQ29kZTogJ1BTJywgZGF0YXNldENvZGU6ICdwcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUGFuYW1hJywgaXNvM0NvZGU6ICdQQU4nLCBpc28yQ29kZTogJ1BBJywgZGF0YXNldENvZGU6ICdwYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdQYW5hbWEnLCBpc28zQ29kZTogJ1BBTicsIGlzbzJDb2RlOiAnUEEnLCBkYXRhc2V0Q29kZTogJ3BhLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdQYXB1YSBOZXcgR3VpbmVhJywgaXNvM0NvZGU6ICdQTkcnLCBpc28yQ29kZTogJ1BHJywgZGF0YXNldENvZGU6ICdwZy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdQYXB1YSBOZXcgR3VpbmVhJywgaXNvM0NvZGU6ICdQTkcnLCBpc28yQ29kZTogJ1BHJywgZGF0YXNldENvZGU6ICdwZy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUGFyYWd1YXknLCBpc28zQ29kZTogJ1BSWScsIGlzbzJDb2RlOiAnUFknLCBkYXRhc2V0Q29kZTogJ3B5LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1BhcmFndWF5JywgaXNvM0NvZGU6ICdQUlknLCBpc28yQ29kZTogJ1BZJywgZGF0YXNldENvZGU6ICdweS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUGVydScsIGlzbzNDb2RlOiAnUEVSJywgaXNvMkNvZGU6ICdQRScsIGRhdGFzZXRDb2RlOiAncGUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUGVydScsIGlzbzNDb2RlOiAnUEVSJywgaXNvMkNvZGU6ICdQRScsIGRhdGFzZXRDb2RlOiAncGUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1BoaWxpcHBpbmVzJywgaXNvM0NvZGU6ICdQSEwnLCBpc28yQ29kZTogJ1BIJywgZGF0YXNldENvZGU6ICdwaC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdQaGlsaXBwaW5lcycsIGlzbzNDb2RlOiAnUEhMJywgaXNvMkNvZGU6ICdQSCcsIGRhdGFzZXRDb2RlOiAncGgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1BpdGNhaXJuIElzbGFuZHMnLCBpc28zQ29kZTogJ1BDTicsIGlzbzJDb2RlOiAnUE4nLCBkYXRhc2V0Q29kZTogJ3BuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdQb2xhbmQnLCBpc28zQ29kZTogJ1BPTCcsIGlzbzJDb2RlOiAnUEwnLCBkYXRhc2V0Q29kZTogJ3BsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1BvbGFuZCcsIGlzbzNDb2RlOiAnUE9MJywgaXNvMkNvZGU6ICdQTCcsIGRhdGFzZXRDb2RlOiAncGwtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1BvcnR1Z2FsJywgaXNvM0NvZGU6ICdQUlQnLCBpc28yQ29kZTogJ1BUJywgZGF0YXNldENvZGU6ICdwdC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdQb3J0dWdhbCcsIGlzbzNDb2RlOiAnUFJUJywgaXNvMkNvZGU6ICdQVCcsIGRhdGFzZXRDb2RlOiAncHQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1FhdGFyJywgaXNvM0NvZGU6ICdRQVQnLCBpc28yQ29kZTogJ1FBJywgZGF0YXNldENvZGU6ICdxYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdRYXRhcicsIGlzbzNDb2RlOiAnUUFUJywgaXNvMkNvZGU6ICdRQScsIGRhdGFzZXRDb2RlOiAncWEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1JvbWFuaWEnLCBpc28zQ29kZTogJ1JPVScsIGlzbzJDb2RlOiAnUk8nLCBkYXRhc2V0Q29kZTogJ3JvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1JvbWFuaWEnLCBpc28zQ29kZTogJ1JPVScsIGlzbzJDb2RlOiAnUk8nLCBkYXRhc2V0Q29kZTogJ3JvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdSdXNzaWFuIEZlZGVyYXRpb24nLCBpc28zQ29kZTogJ1JVUycsIGlzbzJDb2RlOiAnUlUnLCBkYXRhc2V0Q29kZTogJ3J1LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1J1c3NpYW4gRmVkZXJhdGlvbicsIGlzbzNDb2RlOiAnUlVTJywgaXNvMkNvZGU6ICdSVScsIGRhdGFzZXRDb2RlOiAncnUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1J3YW5kYScsIGlzbzNDb2RlOiAnUldBJywgaXNvMkNvZGU6ICdSVycsIGRhdGFzZXRDb2RlOiAncnctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUndhbmRhJywgaXNvM0NvZGU6ICdSV0EnLCBpc28yQ29kZTogJ1JXJywgZGF0YXNldENvZGU6ICdydy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnUsOpdW5pb24nLCBpc28zQ29kZTogJ1JFVScsIGlzbzJDb2RlOiAnUkUnLCBkYXRhc2V0Q29kZTogJ3JlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTYWludCBCYXJ0aMOpbGVteScsIGlzbzNDb2RlOiAnQkxNJywgaXNvMkNvZGU6ICdCTCcsIGRhdGFzZXRDb2RlOiAnYmwtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1NhaW50IEhlbGVuYScsIGlzbzNDb2RlOiAnU0hOJywgaXNvMkNvZGU6ICdTSCcsIGRhdGFzZXRDb2RlOiAnc2gtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycsIGlzbzNDb2RlOiAnS05BJywgaXNvMkNvZGU6ICdLTicsIGRhdGFzZXRDb2RlOiAna24tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FpbnQgS2l0dHMgYW5kIE5ldmlzJywgaXNvM0NvZGU6ICdLTkEnLCBpc28yQ29kZTogJ0tOJywgZGF0YXNldENvZGU6ICdrbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FpbnQgTHVjaWEnLCBpc28zQ29kZTogJ0xDQScsIGlzbzJDb2RlOiAnTEMnLCBkYXRhc2V0Q29kZTogJ2xjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uJywgaXNvM0NvZGU6ICdTUE0nLCBpc28yQ29kZTogJ1BNJywgZGF0YXNldENvZGU6ICdwbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMnLCBpc28zQ29kZTogJ1ZDVCcsIGlzbzJDb2RlOiAnVkMnLCBkYXRhc2V0Q29kZTogJ3ZjLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzJywgaXNvM0NvZGU6ICdWQ1QnLCBpc28yQ29kZTogJ1ZDJywgZGF0YXNldENvZGU6ICd2Yy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2Ftb2EnLCBpc28zQ29kZTogJ1dTTScsIGlzbzJDb2RlOiAnV1MnLCBkYXRhc2V0Q29kZTogJ3dzLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1NhbW9hJywgaXNvM0NvZGU6ICdXU00nLCBpc28yQ29kZTogJ1dTJywgZGF0YXNldENvZGU6ICd3cy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FuIE1hcmlubycsIGlzbzNDb2RlOiAnU01SJywgaXNvMkNvZGU6ICdTTScsIGRhdGFzZXRDb2RlOiAnc20tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FuIE1hcmlubycsIGlzbzNDb2RlOiAnU01SJywgaXNvMkNvZGU6ICdTTScsIGRhdGFzZXRDb2RlOiAnc20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1NhbyBUb21lIGFuZCBQcmluY2lwZScsIGlzbzNDb2RlOiAnU1RQJywgaXNvMkNvZGU6ICdTVCcsIGRhdGFzZXRDb2RlOiAnc3QtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2FvIFRvbWUgYW5kIFByaW5jaXBlJywgaXNvM0NvZGU6ICdTVFAnLCBpc28yQ29kZTogJ1NUJywgZGF0YXNldENvZGU6ICdzdC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2F1ZGkgQXJhYmlhJywgaXNvM0NvZGU6ICdTQVUnLCBpc28yQ29kZTogJ1NBJywgZGF0YXNldENvZGU6ICdzYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTYXVkaSBBcmFiaWEnLCBpc28zQ29kZTogJ1NBVScsIGlzbzJDb2RlOiAnU0EnLCBkYXRhc2V0Q29kZTogJ3NhLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTZW5lZ2FsJywgaXNvM0NvZGU6ICdTRU4nLCBpc28yQ29kZTogJ1NOJywgZGF0YXNldENvZGU6ICdzbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTZW5lZ2FsJywgaXNvM0NvZGU6ICdTRU4nLCBpc28yQ29kZTogJ1NOJywgZGF0YXNldENvZGU6ICdzbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2VyYmlhJywgaXNvM0NvZGU6ICdTUkInLCBpc28yQ29kZTogJ1JTJywgZGF0YXNldENvZGU6ICdycy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTZXJiaWEnLCBpc28zQ29kZTogJ1NSQicsIGlzbzJDb2RlOiAnUlMnLCBkYXRhc2V0Q29kZTogJ3JzLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTZXljaGVsbGVzJywgaXNvM0NvZGU6ICdTWUMnLCBpc28yQ29kZTogJ1NDJywgZGF0YXNldENvZGU6ICdzYy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTZXljaGVsbGVzJywgaXNvM0NvZGU6ICdTWUMnLCBpc28yQ29kZTogJ1NDJywgZGF0YXNldENvZGU6ICdzYy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2llcnJhIExlb25lJywgaXNvM0NvZGU6ICdTTEUnLCBpc28yQ29kZTogJ1NMJywgZGF0YXNldENvZGU6ICdzbC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTaWVycmEgTGVvbmUnLCBpc28zQ29kZTogJ1NMRScsIGlzbzJDb2RlOiAnU0wnLCBkYXRhc2V0Q29kZTogJ3NsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTaW5nYXBvcmUnLCBpc28zQ29kZTogJ1NHUCcsIGlzbzJDb2RlOiAnU0cnLCBkYXRhc2V0Q29kZTogJ3NnLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1NpbnQgTWFhcnRlbicsIGlzbzNDb2RlOiAnU1hNJywgaXNvMkNvZGU6ICdTWCcsIGRhdGFzZXRDb2RlOiAnc3gtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2ludCBNYWFydGVuJywgaXNvM0NvZGU6ICdTWE0nLCBpc28yQ29kZTogJ1NYJywgZGF0YXNldENvZGU6ICdzeC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2xvdmFraWEnLCBpc28zQ29kZTogJ1NWSycsIGlzbzJDb2RlOiAnU0snLCBkYXRhc2V0Q29kZTogJ3NrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1Nsb3Zha2lhJywgaXNvM0NvZGU6ICdTVksnLCBpc28yQ29kZTogJ1NLJywgZGF0YXNldENvZGU6ICdzay1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU2xvdmVuaWEnLCBpc28zQ29kZTogJ1NWTicsIGlzbzJDb2RlOiAnU0knLCBkYXRhc2V0Q29kZTogJ3NpLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1Nsb3ZlbmlhJywgaXNvM0NvZGU6ICdTVk4nLCBpc28yQ29kZTogJ1NJJywgZGF0YXNldENvZGU6ICdzaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU29sb21vbiBJc2xhbmRzJywgaXNvM0NvZGU6ICdTTEInLCBpc28yQ29kZTogJ1NCJywgZGF0YXNldENvZGU6ICdzYi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb2xvbW9uIElzbGFuZHMnLCBpc28zQ29kZTogJ1NMQicsIGlzbzJDb2RlOiAnU0InLCBkYXRhc2V0Q29kZTogJ3NiLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb21hbGlhJywgaXNvM0NvZGU6ICdTT00nLCBpc28yQ29kZTogJ1NPJywgZGF0YXNldENvZGU6ICdzby1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb21hbGlhJywgaXNvM0NvZGU6ICdTT00nLCBpc28yQ29kZTogJ1NPJywgZGF0YXNldENvZGU6ICdzby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU291dGggQWZyaWNhJywgaXNvM0NvZGU6ICdaQUYnLCBpc28yQ29kZTogJ1pBJywgZGF0YXNldENvZGU6ICd6YS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb3V0aCBBZnJpY2EnLCBpc28zQ29kZTogJ1pBRicsIGlzbzJDb2RlOiAnWkEnLCBkYXRhc2V0Q29kZTogJ3phLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcycsIGlzbzNDb2RlOiAnU0dTJywgaXNvMkNvZGU6ICdHUycsIGRhdGFzZXRDb2RlOiAnZ3MtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1NvdXRoIFN1ZGFuJywgaXNvM0NvZGU6ICdTU0QnLCBpc28yQ29kZTogJ1NTJywgZGF0YXNldENvZGU6ICdzcy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTb3V0aCBTdWRhbicsIGlzbzNDb2RlOiAnU1NEJywgaXNvMkNvZGU6ICdTUycsIGRhdGFzZXRDb2RlOiAnc3MtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1NwYWluJywgaXNvM0NvZGU6ICdFU1AnLCBpc28yQ29kZTogJ0VTJywgZGF0YXNldENvZGU6ICdlcy1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHR5cGVkb3duJ30sXHJcbiAge2NvdW50cnk6ICdTcGFpbicsIGlzbzNDb2RlOiAnRVNQJywgaXNvMkNvZGU6ICdFUycsIGRhdGFzZXRDb2RlOiAnZXMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICd2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU3BhaW4nLCBpc28zQ29kZTogJ0VTUCcsIGlzbzJDb2RlOiAnRVMnLCBkYXRhc2V0Q29kZTogJ2VzLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTcmkgTGFua2EnLCBpc28zQ29kZTogJ0xLQScsIGlzbzJDb2RlOiAnTEsnLCBkYXRhc2V0Q29kZTogJ2xrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1N1ZGFuJywgaXNvM0NvZGU6ICdTRE4nLCBpc28yQ29kZTogJ1NEJywgZGF0YXNldENvZGU6ICdzZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTdWRhbicsIGlzbzNDb2RlOiAnU0ROJywgaXNvMkNvZGU6ICdTRCcsIGRhdGFzZXRDb2RlOiAnc2QtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1N1cmluYW1lJywgaXNvM0NvZGU6ICdTVVInLCBpc28yQ29kZTogJ1NSJywgZGF0YXNldENvZGU6ICdzci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTdXJpbmFtZScsIGlzbzNDb2RlOiAnU1VSJywgaXNvMkNvZGU6ICdTUicsIGRhdGFzZXRDb2RlOiAnc3ItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1N2YWxiYXJkIGFuZCBKYW4gTWF5ZW4gSXNsYW5kcycsIGlzbzNDb2RlOiAnU0pNJywgaXNvMkNvZGU6ICdTSicsIGRhdGFzZXRDb2RlOiAnc2otYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1N3YXppbGFuZCAoRXN3YXRpbmkpJywgaXNvM0NvZGU6ICdTV1onLCBpc28yQ29kZTogJ1NaJywgZGF0YXNldENvZGU6ICdzei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTd2F6aWxhbmQgKEVzd2F0aW5pKScsIGlzbzNDb2RlOiAnU1daJywgaXNvMkNvZGU6ICdTWicsIGRhdGFzZXRDb2RlOiAnc3otYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1N3ZWRlbicsIGlzbzNDb2RlOiAnU1dFJywgaXNvMkNvZGU6ICdTRScsIGRhdGFzZXRDb2RlOiAnc2UtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxyXG4gIHtjb3VudHJ5OiAnU3dlZGVuJywgaXNvM0NvZGU6ICdTV0UnLCBpc28yQ29kZTogJ1NFJywgZGF0YXNldENvZGU6ICdzZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3ZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdTd2VkZW4nLCBpc28zQ29kZTogJ1NXRScsIGlzbzJDb2RlOiAnU0UnLCBkYXRhc2V0Q29kZTogJ3NlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdTd2l0emVybGFuZCcsIGlzbzNDb2RlOiAnQ0hFJywgaXNvMkNvZGU6ICdDSCcsIGRhdGFzZXRDb2RlOiAnY2gtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxyXG4gIHtjb3VudHJ5OiAnU3dpdHplcmxhbmQnLCBpc28zQ29kZTogJ0NIRScsIGlzbzJDb2RlOiAnQ0gnLCBkYXRhc2V0Q29kZTogJ2NoLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAndmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1N3aXR6ZXJsYW5kJywgaXNvM0NvZGU6ICdDSEUnLCBpc28yQ29kZTogJ0NIJywgZGF0YXNldENvZGU6ICdjaC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnU3lyaWEnLCBpc28zQ29kZTogJ1NZUicsIGlzbzJDb2RlOiAnU1knLCBkYXRhc2V0Q29kZTogJ3N5LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1N5cmlhJywgaXNvM0NvZGU6ICdTWVInLCBpc28yQ29kZTogJ1NZJywgZGF0YXNldENvZGU6ICdzeS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVGFpd2FuJywgaXNvM0NvZGU6ICdUV04nLCBpc28yQ29kZTogJ1RXJywgZGF0YXNldENvZGU6ICd0dy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdUYWl3YW4nLCBpc28zQ29kZTogJ1RXTicsIGlzbzJDb2RlOiAnVFcnLCBkYXRhc2V0Q29kZTogJ3R3LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdUYWppa2lzdGFuJywgaXNvM0NvZGU6ICdUSksnLCBpc28yQ29kZTogJ1RKJywgZGF0YXNldENvZGU6ICd0ai1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdUYWppa2lzdGFuJywgaXNvM0NvZGU6ICdUSksnLCBpc28yQ29kZTogJ1RKJywgZGF0YXNldENvZGU6ICd0ai1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVGFuemFuaWEnLCBpc28zQ29kZTogJ1RaQScsIGlzbzJDb2RlOiAnVFonLCBkYXRhc2V0Q29kZTogJ3R6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1RhbnphbmlhJywgaXNvM0NvZGU6ICdUWkEnLCBpc28yQ29kZTogJ1RaJywgZGF0YXNldENvZGU6ICd0ei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVGhhaWxhbmQnLCBpc28zQ29kZTogJ1RIQScsIGlzbzJDb2RlOiAnVEgnLCBkYXRhc2V0Q29kZTogJ3RoLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1RoYWlsYW5kJywgaXNvM0NvZGU6ICdUSEEnLCBpc28yQ29kZTogJ1RIJywgZGF0YXNldENvZGU6ICd0aC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVGltb3ItTGVzdGUnLCBpc28zQ29kZTogJ1RMUycsIGlzbzJDb2RlOiAnVEwnLCBkYXRhc2V0Q29kZTogJ3RsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1RpbW9yLUxlc3RlJywgaXNvM0NvZGU6ICdUTFMnLCBpc28yQ29kZTogJ1RMJywgZGF0YXNldENvZGU6ICd0bC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVG9nbycsIGlzbzNDb2RlOiAnVEdPJywgaXNvMkNvZGU6ICdURycsIGRhdGFzZXRDb2RlOiAndGctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVG9nbycsIGlzbzNDb2RlOiAnVEdPJywgaXNvMkNvZGU6ICdURycsIGRhdGFzZXRDb2RlOiAndGctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1Rva2VsYXUnLCBpc28zQ29kZTogJ1RLTCcsIGlzbzJDb2RlOiAnVEsnLCBkYXRhc2V0Q29kZTogJ3RrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1Rva2VsYXUnLCBpc28zQ29kZTogJ1RLTCcsIGlzbzJDb2RlOiAnVEsnLCBkYXRhc2V0Q29kZTogJ3RrLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdUb25nYScsIGlzbzNDb2RlOiAnVE9OJywgaXNvMkNvZGU6ICdUTycsIGRhdGFzZXRDb2RlOiAndG8tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVG9uZ2EnLCBpc28zQ29kZTogJ1RPTicsIGlzbzJDb2RlOiAnVE8nLCBkYXRhc2V0Q29kZTogJ3RvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdUcmluaWRhZCBhbmQgVG9iYWdvJywgaXNvM0NvZGU6ICdUVE8nLCBpc28yQ29kZTogJ1RUJywgZGF0YXNldENvZGU6ICd0dC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdUcmluaWRhZCBhbmQgVG9iYWdvJywgaXNvM0NvZGU6ICdUVE8nLCBpc28yQ29kZTogJ1RUJywgZGF0YXNldENvZGU6ICd0dC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVHVuaXNpYScsIGlzbzNDb2RlOiAnVFVOJywgaXNvMkNvZGU6ICdUTicsIGRhdGFzZXRDb2RlOiAndG4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVHVuaXNpYScsIGlzbzNDb2RlOiAnVFVOJywgaXNvMkNvZGU6ICdUTicsIGRhdGFzZXRDb2RlOiAndG4tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1R1cmtleScsIGlzbzNDb2RlOiAnVFVSJywgaXNvMkNvZGU6ICdUUicsIGRhdGFzZXRDb2RlOiAndHItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVHVya2V5JywgaXNvM0NvZGU6ICdUVVInLCBpc28yQ29kZTogJ1RSJywgZGF0YXNldENvZGU6ICd0ci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVHVya2lzaCBSZXB1YmxpYyBvZiBOb3J0aGVybiBDeXBydXMnLCBpc28zQ29kZTogJ05DWScsIGlzbzJDb2RlOiAnQ1knLCBkYXRhc2V0Q29kZTogJ255LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdUdXJrbWVuaXN0YW4nLCBpc28zQ29kZTogJ1RLTScsIGlzbzJDb2RlOiAnVE0nLCBkYXRhc2V0Q29kZTogJ3RtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1R1cmttZW5pc3RhbicsIGlzbzNDb2RlOiAnVEtNJywgaXNvMkNvZGU6ICdUTScsIGRhdGFzZXRDb2RlOiAndG0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1R1cmtzIGFuZCBDYWljb3MgSXNsYW5kcycsIGlzbzNDb2RlOiAnVENBJywgaXNvMkNvZGU6ICdUQycsIGRhdGFzZXRDb2RlOiAndGMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1R1dmFsdScsIGlzbzNDb2RlOiAnVFVWJywgaXNvMkNvZGU6ICdUVicsIGRhdGFzZXRDb2RlOiAndHYtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVHV2YWx1JywgaXNvM0NvZGU6ICdUVVYnLCBpc28yQ29kZTogJ1RWJywgZGF0YXNldENvZGU6ICd0di1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVWdhbmRhJywgaXNvM0NvZGU6ICdVR0EnLCBpc28yQ29kZTogJ1VHJywgZGF0YXNldENvZGU6ICd1Zy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdVZ2FuZGEnLCBpc28zQ29kZTogJ1VHQScsIGlzbzJDb2RlOiAnVUcnLCBkYXRhc2V0Q29kZTogJ3VnLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdVa3JhaW5lJywgaXNvM0NvZGU6ICdVS1InLCBpc28yQ29kZTogJ1VBJywgZGF0YXNldENvZGU6ICd1YS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdVa3JhaW5lJywgaXNvM0NvZGU6ICdVS1InLCBpc28yQ29kZTogJ1VBJywgZGF0YXNldENvZGU6ICd1YS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnLCBpc28zQ29kZTogJ0FSRScsIGlzbzJDb2RlOiAnQUUnLCBkYXRhc2V0Q29kZTogJ2FlLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJywgaXNvM0NvZGU6ICdBUkUnLCBpc28yQ29kZTogJ0FFJywgZGF0YXNldENvZGU6ICdhZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVW5pdGVkIEtpbmdkb20nLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogWydnYi1hZGRyZXNzJ10sIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6IFsnZ2ItYWRkaXRpb25hbC1idXNpbmVzcycsICdnYi1hZGRpdGlvbmFsLW11bHRpcGxlcmVzaWRlbmNlJywgJ2diLWFkZGl0aW9uYWwtbm90eWV0YnVpbHQnXSwgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEFkZHJlc3NCYXNlIFByZW1pdW0nLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZHJlc3MtYWRkcmVzc2Jhc2UnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlLCBsb29rdXAnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEFkZHJlc3NCYXNlIFByZW1pdW0gd2l0aCBJc2xhbmRzJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWFkZHJlc3NiYXNlaXNsYW5kcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUsIGxvb2t1cCd9LFxyXG4gIHtjb3VudHJ5OiAnVW5pdGVkIEtpbmdkb20gQnVzaW5lc3MgTmFtZXMnLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZGl0aW9uYWwtYnVzaW5lc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEVsZWN0cmljaXR5JywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWVsZWN0cmljaXR5Jywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSwgbG9va3VwJ30sXHJcbiAge2NvdW50cnk6ICdVbml0ZWQgS2luZ2RvbSBHYXMnLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZGl0aW9uYWwtZ2FzJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSwgbG9va3VwJ30sXHJcbiAge2NvdW50cnk6ICdVbml0ZWQgS2luZ2RvbSBTdHJlZXQgTGV2ZWwnLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZHJlc3Mtc3RyZWV0bGV2ZWwnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEV4dGVuZGVkIEJ1c2luZXNzJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWJ1c2luZXNzZXh0ZW5kZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlLCBsb29rdXAnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEN5bXJhZWcgKFdlbHNoIExhbmd1YWdlKSBQb3N0YWwgQWRkcmVzcycsIGlzbzNDb2RlOiAnR0JSJywgaXNvMkNvZGU6ICdHQicsIGRhdGFzZXRDb2RlOiAnZ2ItYWRkcmVzcy13YWxlcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScsIGlzbzNDb2RlOiAnVVNBJywgaXNvMkNvZGU6ICdVUycsIGRhdGFzZXRDb2RlOiAndXMtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUsIHNpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVXJ1Z3VheScsIGlzbzNDb2RlOiAnVVJZJywgaXNvMkNvZGU6ICdVWScsIGRhdGFzZXRDb2RlOiAndXktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVXJ1Z3VheScsIGlzbzNDb2RlOiAnVVJZJywgaXNvMkNvZGU6ICdVWScsIGRhdGFzZXRDb2RlOiAndXktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1V6YmVraXN0YW4nLCBpc28zQ29kZTogJ1VaQicsIGlzbzJDb2RlOiAnVVonLCBkYXRhc2V0Q29kZTogJ3V6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1V6YmVraXN0YW4nLCBpc28zQ29kZTogJ1VaQicsIGlzbzJDb2RlOiAnVVonLCBkYXRhc2V0Q29kZTogJ3V6LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdWYW51YXR1JywgaXNvM0NvZGU6ICdWVVQnLCBpc28yQ29kZTogJ1ZVJywgZGF0YXNldENvZGU6ICd2dS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdWYW51YXR1JywgaXNvM0NvZGU6ICdWVVQnLCBpc28yQ29kZTogJ1ZVJywgZGF0YXNldENvZGU6ICd2dS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVmF0aWNhbiBDaXR5IChIb2x5IFNlZSknLCBpc28zQ29kZTogJ1ZBVCcsIGlzbzJDb2RlOiAnVkEnLCBkYXRhc2V0Q29kZTogJ3ZhLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1ZhdGljYW4gQ2l0eSAoSG9seSBTZWUpJywgaXNvM0NvZGU6ICdWQVQnLCBpc28yQ29kZTogJ1ZBJywgZGF0YXNldENvZGU6ICd2YS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVmVuZXp1ZWxhJywgaXNvM0NvZGU6ICdWRU4nLCBpc28yQ29kZTogJ1ZFJywgZGF0YXNldENvZGU6ICd2ZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdWZW5lenVlbGEnLCBpc28zQ29kZTogJ1ZFTicsIGlzbzJDb2RlOiAnVkUnLCBkYXRhc2V0Q29kZTogJ3ZlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdWaWV0IE5hbScsIGlzbzNDb2RlOiAnVk5NJywgaXNvMkNvZGU6ICdWTicsIGRhdGFzZXRDb2RlOiAndm4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnVmlldCBOYW0nLCBpc28zQ29kZTogJ1ZOTScsIGlzbzJDb2RlOiAnVk4nLCBkYXRhc2V0Q29kZTogJ3ZuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXHJcbiAge2NvdW50cnk6ICdWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCcsIGlzbzNDb2RlOiAnVkdCJywgaXNvMkNvZGU6ICdWRycsIGRhdGFzZXRDb2RlOiAndmctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1ZpcmdpbiBJc2xhbmRzLCBVLlMuJywgaXNvM0NvZGU6ICdWSVInLCBpc28yQ29kZTogJ1ZJJywgZGF0YXNldENvZGU6ICd2aS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnV2FsbGlzIGFuZCBGdXR1bmEgSXNsYW5kcycsIGlzbzNDb2RlOiAnV0xGJywgaXNvMkNvZGU6ICdXRicsIGRhdGFzZXRDb2RlOiAnd2YtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1dlc3Rlcm4gU2FoYXJhJywgaXNvM0NvZGU6ICdFU0gnLCBpc28yQ29kZTogJ0VIJywgZGF0YXNldENvZGU6ICdlaC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdXZXN0ZXJuIFNhaGFyYScsIGlzbzNDb2RlOiAnRVNIJywgaXNvMkNvZGU6ICdFSCcsIGRhdGFzZXRDb2RlOiAnZWgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1llbWVuJywgaXNvM0NvZGU6ICdZRU0nLCBpc28yQ29kZTogJ1lFJywgZGF0YXNldENvZGU6ICd5ZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXHJcbiAge2NvdW50cnk6ICdZZW1lbicsIGlzbzNDb2RlOiAnWUVNJywgaXNvMkNvZGU6ICdZRScsIGRhdGFzZXRDb2RlOiAneWUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcclxuICB7Y291bnRyeTogJ1phbWJpYScsIGlzbzNDb2RlOiAnWk1CJywgaXNvMkNvZGU6ICdaTScsIGRhdGFzZXRDb2RlOiAnem0tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnWmFtYmlhJywgaXNvM0NvZGU6ICdaTUInLCBpc28yQ29kZTogJ1pNJywgZGF0YXNldENvZGU6ICd6bS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxyXG4gIHtjb3VudHJ5OiAnWmltYmFid2UnLCBpc28zQ29kZTogJ1pXRScsIGlzbzJDb2RlOiAnWlcnLCBkYXRhc2V0Q29kZTogJ3p3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcclxuICB7Y291bnRyeTogJ1ppbWJhYndlJywgaXNvM0NvZGU6ICdaV0UnLCBpc28yQ29kZTogJ1pXJywgZGF0YXNldENvZGU6ICd6dy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9XHJcbl07IiwiLy8gVHJhbnNsYXRpb25zXHJcbmV4cG9ydCBjb25zdCB0cmFuc2xhdGlvbnMgPSB7XHJcbiAgLy8gbGFuZ3VhZ2UgLyBjb3VudHJ5IC8gcHJvcGVydHlcclxuICBlbjoge1xyXG4gICAgZ2JyOiB7XHJcbiAgICAgIGxvY2FsaXR5OiAnVG93bi9DaXR5JyxcclxuICAgICAgcmVnaW9uOiAnQ291bnR5JyxcclxuICAgICAgcG9zdGFsX2NvZGU6ICdQb3N0IGNvZGUnXHJcbiAgICB9LFxyXG4gICAgdXNhOiB7XHJcbiAgICAgIGxvY2FsaXR5OiAnQ2l0eScsXHJcbiAgICAgIHJlZ2lvbjogJ1N0YXRlJyxcclxuICAgICAgcG9zdGFsX2NvZGU6ICdaSVAgY29kZSdcclxuICAgIH1cclxuICB9XHJcbiAgLy8gQWRkIG90aGVyIGxhbmd1YWdlcyBiZWxvd1xyXG59OyIsImV4cG9ydCBjbGFzcyBQaWNrbGlzdCB7XHJcbiAgaXRlbXM6IFBpY2tsaXN0SXRlbVtdO1xyXG4gIGN1cnJlbnRJdGVtO1xyXG4gIGxpc3Q6IEhUTUxEaXZFbGVtZW50O1xyXG4gIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgc2l6ZSA9IDA7XHJcbiAgbWF4U3VnZ2VzdGlvbnMgPSAyNTtcclxuICBzaG93OiAoaXRlbXM6IFNlYXJjaFJlc3BvbnNlKSA9PiB2b2lkO1xyXG4gIGhpZGU6ICgpID0+IHZvaWQ7XHJcbiAgaGFuZGxlRW1wdHlQaWNrbGlzdDogKGl0ZW1zOiBTZWFyY2hSZXNwb25zZSkgPT4gdm9pZDtcclxuICBoYW5kbGVFbXB0eVBpY2tsaXN0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgcmVmaW5lOiBSZWZpbmVtZW50O1xyXG4gIHVzZUFkZHJlc3NFbnRlcmVkOiBVc2VBZGRyZXNzRW50ZXJlZDtcclxuICBjcmVhdGVMaXN0OiAoKSA9PiBIVE1MRGl2RWxlbWVudDtcclxuICBjcmVhdGVMaXN0SXRlbTogKGl0ZW06IFBpY2tsaXN0SXRlbSkgPT4gSFRNTERpdkVsZW1lbnQ7XHJcbiAgdGFiQ291bnQ6IG51bWJlcjtcclxuICByZXNldFRhYkNvdW50OiAoKSA9PiB2b2lkO1xyXG4gIGtleXVwOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XHJcbiAgYWRkTWF0Y2hpbmdFbXBoYXNpczogKGl0ZW0pID0+IHN0cmluZztcclxuICBsaXN0ZW46IChyb3cpID0+IHZvaWQ7XHJcbiAgY2hlY2tFbnRlcjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xyXG4gIHBpY2s6IChpdGVtKSA9PiB2b2lkO1xyXG4gIHNjcm9sbEludG9WaWV3SWZOZWVkZWQ6ICgpID0+IHZvaWQ7XHJcbiAgZGlzcGxheVN1Z2dlc3Rpb25zSGVhZGVyOiAoKSA9PiB2b2lkO1xyXG4gIGRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlcjogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFkZHJlc3NWYWxpZGF0aW9uUmVzdWx0IHtcclxuICBmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyO1xyXG4gIGxhc3RBZGRyZXNzRmllbGQ7XHJcbiAgZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkOiBib29sZWFuO1xyXG4gIHNob3c6IChkYXRhKSA9PiB2b2lkO1xyXG4gIGhpZGU6ICgpID0+IHZvaWQ7XHJcbiAgY3JlYXRlQWRkcmVzc0xpbmU6IENyZWF0ZUFkZHJlc3NMaW5lO1xyXG4gIGNyZWF0ZUZvcm1hdHRlZEFkZHJlc3NDb250YWluZXI6ICgpID0+IHZvaWQ7XHJcbiAgY3JlYXRlSGVhZGluZzogKCkgPT4gdm9pZDtcclxuICB1cGRhdGVIZWFkaW5nOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIGNhbGN1bGF0ZUlmQWRkcmVzc0xpbmVHZW5lcmF0aW9uUmVxdWlyZWQ6ICgpID0+IHZvaWQ7XHJcbiAgdXBkYXRlQWRkcmVzc0xpbmU6IChrZXk6IHN0cmluZywgYWRkcmVzc0xpbmVPYmplY3QsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHVwZGF0ZUxhYmVsOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZztcclxuICBjcmVhdGVTZWFyY2hBZ2Fpbkxpbms6ICgpID0+IHZvaWQ7XHJcbiAgcmVuZGVySW5wdXRMaXN0OiAoaW5wdXRBcnJheSkgPT4gdm9pZDtcclxuICBoYW5kbGVWYWxpZGF0ZVJlc3BvbnNlOiAocmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jbGFzcyBDcmVhdGVBZGRyZXNzTGluZSB7XHJcbiAgaW5wdXQ6IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpID0+IEhUTUxEaXZFbGVtZW50O1xyXG4gIGxhYmVsOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXNwb25zZSB7XHJcbiAgcmVzdWx0Pzoge1xyXG4gICAgc3VnZ2VzdGlvbnM6IFBpY2tsaXN0SXRlbVtdO1xyXG4gICAgc3VnZ2VzdGlvbnNfcHJvbXB0Pzogc3RyaW5nO1xyXG4gICAgc3VnZ2VzdGlvbnNfa2V5Pzogc3RyaW5nO1xyXG4gICAgY29uZmlkZW5jZTogc3RyaW5nO1xyXG4gICAgYWRkcmVzcz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQaWNrbGlzdEl0ZW0ge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBmb3JtYXQ/OiBzdHJpbmc7XHJcbiAgbWF0Y2hlZD86IG51bWJlcltdW107XHJcbiAgZ2xvYmFsX2FkZHJlc3Nfa2V5Pzogc3RyaW5nO1xyXG4gIGFkZGl0aW9uYWxfYXR0cmlidXRlcz86IHtuYW1lOiBzdHJpbmcsIFZhbHVlOiBzdHJpbmd9W107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VBZGRyZXNzRW50ZXJlZCB7XHJcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgY3JlYXRlOiAoY29uZmlkZW5jZTogc3RyaW5nKSA9PiBIVE1MRGl2RWxlbWVudDtcclxuICBkZXN0cm95OiAoKSA9PiB2b2lkO1xyXG4gIGNsaWNrOiAoKSA9PiB2b2lkO1xyXG4gIGZvcm1hdE1hbnVhbEFkZHJlc3NMaW5lOiAobGluZXMsIGkpID0+IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVmaW5lbWVudCB7XHJcbiAgZWxlbWVudDogSFRNTElucHV0RWxlbWVudDtcclxuICBpc05lZWRlZDogKHJlc3BvbnNlOiBTZWFyY2hSZXNwb25zZSkgPT4gYm9vbGVhbjtcclxuICBjcmVhdGVJbnB1dDogKHByb21wdDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4gdm9pZDtcclxuICBlbnRlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlYXJjaFNwaW5uZXIge1xyXG4gIHNob3c6ICgpID0+IHZvaWQ7XHJcbiAgaGlkZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFBvd2VyZWRCeUxvZ28ge1xyXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gIGNyZWF0ZTogKHBpY2tsaXN0KSA9PiBIVE1MRGl2RWxlbWVudDtcclxuICBkZXN0cm95OiAocGlja2xpc3QpID0+IHZvaWQ7XHJcbiAgc3ZnOiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgRXZlbnRGYWN0b3J5IGZyb20gJy4vZXZlbnQtZmFjdG9yeSc7XHJcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XHJcbmltcG9ydCB7QWRkcmVzc1NlYXJjaE9wdGlvbnMsIEFkZHJlc3NWYWxpZGF0aW9uTW9kZSwgZGVmYXVsdHN9IGZyb20gJy4vc2VhcmNoLW9wdGlvbnMnO1xyXG5pbXBvcnQge2RhdGFzZXRDb2Rlc30gZnJvbSAnLi9kYXRhc2V0cy1jb2Rlcyc7XHJcbmltcG9ydCB7dHJhbnNsYXRpb25zfSBmcm9tICcuL3RyYW5zbGF0aW9ucyc7XHJcbmltcG9ydCB7QWRkcmVzc1ZhbGlkYXRpb25SZXN1bHQsIFBpY2tsaXN0LCBQaWNrbGlzdEl0ZW0sIFBvd2VyZWRCeUxvZ28sIFNlYXJjaFJlc3BvbnNlfSBmcm9tICcuL2NsYXNzLXR5cGVzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkZHJlc3NWYWxpZGF0aW9uIHtcclxuICBwdWJsaWMgb3B0aW9uczogQWRkcmVzc1NlYXJjaE9wdGlvbnM7XHJcbiAgcHVibGljIHNlYXJjaFR5cGU6IEFkZHJlc3NWYWxpZGF0aW9uTW9kZTtcclxuICBwdWJsaWMgZXZlbnRzO1xyXG4gIHB1YmxpYyByZXF1ZXN0OiBSZXF1ZXN0O1xyXG5cclxuICBwcml2YXRlIGJhc2VVcmwgPSAnaHR0cHM6Ly9hcGkuZXhwZXJpYW5hcGVydHVyZS5pby8nO1xyXG4gIHByaXZhdGUgc2VhcmNoRW5kcG9pbnQgPSAnYWRkcmVzcy9zZWFyY2gvdjEnO1xyXG4gIHByaXZhdGUgdmFsaWRhdGVFbmRwb2ludCA9ICdhZGRyZXNzL3ZhbGlkYXRlL3YxJztcclxuICBwcml2YXRlIHByb21wdHNldEVuZHBvaW50ID0gJ2FkZHJlc3MvcHJvbXB0c2V0cy92MSc7XHJcbiAgcHJpdmF0ZSBzdGVwSW5FbmRwb2ludCA9ICdhZGRyZXNzL3N1Z2dlc3Rpb25zL3N0ZXBpbi92MSc7XHJcbiAgcHJpdmF0ZSByZWZpbmVFbmRwb2ludCA9ICdhZGRyZXNzL3N1Z2dlc3Rpb25zL3JlZmluZS92MSc7XHJcbiAgcHJpdmF0ZSBlbnJpY2htZW50RW5kcG9pbnQgPSAnZW5yaWNobWVudC92Mic7XHJcblxyXG4gIHByaXZhdGUgcGlja2xpc3Q6IFBpY2tsaXN0O1xyXG4gIHByaXZhdGUgaW5wdXRzOiBIVE1MSW5wdXRFbGVtZW50W107XHJcbiAgcHJpdmF0ZSBsYXN0U2VhcmNoVGVybTogc3RyaW5nO1xyXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZztcclxuICBwcml2YXRlIGN1cnJlbnRDb3VudHJ5Q29kZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgY3VycmVudERhdGFTZXQ6IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gIHByaXZhdGUgaGFzU2VhcmNoSW5wdXRCZWVuUmVzZXQ6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBjb3VudHJ5Q29kZU1hcHBpbmc7XHJcbiAgcHJpdmF0ZSBsb29rdXBGbjtcclxuICBwcml2YXRlIGtleVVwRm47XHJcbiAgcHJpdmF0ZSBjaGVja1RhYkZuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBZGRyZXNzU2VhcmNoT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50RmFjdG9yeSgpO1xyXG5cclxuICAgIHRoaXMuc2V0dXAoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wdGlvbnMudG9rZW4gPSB0b2tlbjtcclxuICAgIHRoaXMuc2V0dXAoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWFyY2hUeXBlKHNlYXJjaFR5cGU6IEFkZHJlc3NWYWxpZGF0aW9uTW9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hUeXBlID0gc2VhcmNoVHlwZTtcclxuICAgIHRoaXMuZ2xvYmFsUmVzZXQoKTtcclxuICAgIHRoaXMuc2V0SW5wdXRzKCk7XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXNlYXJjaC10eXBlLWNoYW5nZScsIHNlYXJjaFR5cGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVucmljaG1lbnREYXRhKGdsb2JhbEFkZHJlc3NLZXk6IHN0cmluZykge1xyXG4gICAgaWYgKGdsb2JhbEFkZHJlc3NLZXkpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICBjb3VudHJ5X2lzbzogdGhpcy5jdXJyZW50Q291bnRyeUNvZGUsXHJcbiAgICAgICAga2V5czoge1xyXG4gICAgICAgICAgZ2xvYmFsX2FkZHJlc3Nfa2V5OiBnbG9iYWxBZGRyZXNzS2V5XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgICAgICBnZW9jb2RlczogWydsYXRpdHVkZScsICdsb25naXR1ZGUnLCAnbWF0Y2hfbGV2ZWwnXVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncHJlLWVucmljaG1lbnQnKTtcclxuICAgICAgdGhpcy5yZXF1ZXN0LnNlbmQodGhpcy5iYXNlVXJsICsgdGhpcy5lbnJpY2htZW50RW5kcG9pbnQsICdQT1NUJywgdGhpcy5oYW5kbGVFbnJpY2htZW50UmVzdWx0LmJpbmQodGhpcyksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgdG9rZW4gYW5kIHByb2NlZWQgaWYgaXQncyBwcmVzZW50XHJcbiAgICBpZiAodGhpcy50b2tlbikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaElucHV0QmVlblJlc2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IFJlcXVlc3QgY2xhc3MgZm9yIHVzZSB3aGVuIG1ha2luZyBBUEkgY2FsbHNcclxuICAgICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcyk7XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIGNvdW50cnkgbGlzdFxyXG4gICAgICB0aGlzLnNldENvdW50cnlMaXN0KCk7XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIGlucHV0IGZpZWxkcyBmb3IgdGhpcyBzZWFyY2ggdHlwZVxyXG4gICAgICB0aGlzLnNldElucHV0cygpO1xyXG5cclxuICAgICAgLy8gU2V0dXAgYSBwaWNrbGlzdCBvYmplY3RcclxuICAgICAgdGhpcy5jcmVhdGVQaWNrbGlzdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVHJpZ2dlciBhIDQwMSBVbmF1dGhvcml6ZWQgZXZlbnQgaWYgYSB0b2tlbiBkb2VzIG5vdCBleGlzdFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3JlcXVlc3QtZXJyb3ItNDAxJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVFbnJpY2htZW50UmVzdWx0KHJlc3BvbnNlKSB7XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LWVucmljaG1lbnQnLCByZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhcmFtZXRlcihuYW1lKTogc3RyaW5nIHtcclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJyk7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ1tcXFxcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyksXHJcbiAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICByZXR1cm4gcmVzdWx0cyA9PT0gbnVsbCA/ICcnIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gVHJ5IGFuZCBnZXQgdG9rZW4gZnJvbSB0aGUgcXVlcnkgc3RyaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgcHJvdmlkZWRcclxuICBwcml2YXRlIGdldCB0b2tlbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudG9rZW4pIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnRva2VuID0gdGhpcy5nZXRQYXJhbWV0ZXIoJ3Rva2VuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRva2VuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRPcHRpb25zKGN1c3RvbU9wdGlvbnMpOiBBZGRyZXNzU2VhcmNoT3B0aW9ucyB7XHJcbiAgICBjb25zdCBpbnN0YW5jZTogQWRkcmVzc1NlYXJjaE9wdGlvbnMgPSBjdXN0b21PcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIGluc3RhbmNlLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWFyY2hUeXBlID0gaW5zdGFuY2Uuc2VhcmNoVHlwZSB8fCBkZWZhdWx0cy5zZWFyY2hUeXBlO1xyXG4gICAgaW5zdGFuY2Uuc2VhcmNoVHlwZSA9IGluc3RhbmNlLnNlYXJjaFR5cGUgfHwgZGVmYXVsdHMuc2VhcmNoVHlwZTtcclxuICAgIGluc3RhbmNlLmxhbmd1YWdlID0gaW5zdGFuY2UubGFuZ3VhZ2UgfHwgZGVmYXVsdHMubGFuZ3VhZ2U7XHJcbiAgICBpbnN0YW5jZS51c2VTcGlubmVyID0gaW5zdGFuY2UudXNlU3Bpbm5lciB8fCBkZWZhdWx0cy51c2VTcGlubmVyO1xyXG4gICAgaW5zdGFuY2UuYXBwbHlGb2N1cyA9ICh0eXBlb2YgaW5zdGFuY2UuYXBwbHlGb2N1cyAhPT0gJ3VuZGVmaW5lZCcpID8gaW5zdGFuY2UuYXBwbHlGb2N1cyA6IGRlZmF1bHRzLmlucHV0LmFwcGx5Rm9jdXM7XHJcbiAgICBpbnN0YW5jZS5wbGFjZWhvbGRlclRleHQgPSBpbnN0YW5jZS5wbGFjZWhvbGRlclRleHQgfHwgZGVmYXVsdHMuaW5wdXQucGxhY2Vob2xkZXJUZXh0O1xyXG4gICAgaW5zdGFuY2Uuc2VhcmNoQWdhaW4gPSBpbnN0YW5jZS5zZWFyY2hBZ2FpbiB8fCB7fTtcclxuICAgIGluc3RhbmNlLnNlYXJjaEFnYWluLnZpc2libGUgPSAodHlwZW9mIGluc3RhbmNlLnNlYXJjaEFnYWluLnZpc2libGUgIT09ICd1bmRlZmluZWQnKSA/IGluc3RhbmNlLnNlYXJjaEFnYWluLnZpc2libGUgOiBkZWZhdWx0cy5zZWFyY2hBZ2Fpbi52aXNpYmxlO1xyXG4gICAgaW5zdGFuY2Uuc2VhcmNoQWdhaW4udGV4dCA9IGluc3RhbmNlLnNlYXJjaEFnYWluLnRleHQgfHwgZGVmYXVsdHMuc2VhcmNoQWdhaW4udGV4dDtcclxuICAgIGluc3RhbmNlLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIgPSBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyIHx8IGRlZmF1bHRzLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXI7XHJcbiAgICBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnNob3dIZWFkaW5nID0gKHR5cGVvZiBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnNob3dIZWFkaW5nICE9PSAndW5kZWZpbmVkJykgPyBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnNob3dIZWFkaW5nIDogZGVmYXVsdHMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZztcclxuICAgIGluc3RhbmNlLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuaGVhZGluZ1R5cGUgPSBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmhlYWRpbmdUeXBlIHx8IGRlZmF1bHRzLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuaGVhZGluZ1R5cGU7XHJcbiAgICBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnZhbGlkYXRlZEhlYWRpbmdUZXh0ID0gaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci52YWxpZGF0ZWRIZWFkaW5nVGV4dCB8fCBkZWZhdWx0cy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnZhbGlkYXRlZEhlYWRpbmdUZXh0O1xyXG4gICAgaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5tYW51YWxIZWFkaW5nVGV4dCA9IGluc3RhbmNlLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIubWFudWFsSGVhZGluZ1RleHQgfHwgZGVmYXVsdHMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5tYW51YWxIZWFkaW5nVGV4dDtcclxuICAgIGluc3RhbmNlLnVzZUFkZHJlc3NFbnRlcmVkVGV4dCA9IGluc3RhbmNlLnVzZUFkZHJlc3NFbnRlcmVkVGV4dCB8fCBkZWZhdWx0cy51c2VBZGRyZXNzRW50ZXJlZFRleHQ7XHJcbiAgICBpbnN0YW5jZS5lbGVtZW50cyA9IGluc3RhbmNlLmVsZW1lbnRzIHx8IHt9O1xyXG5cclxuICAgIHJldHVybiBpbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJvbXB0c2V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudENvdW50cnlDb2RlKSB7XHJcbiAgICAgIC8vIFVzaW5nIHRoZSBjb3VudHJ5IGNvZGUgYW5kIHRoZSBzZWFyY2ggdHlwZSwgbG9va3VwIHdoYXQgdGhlIHJlbGV2YW50IGRhdGFzZXQgY29kZSBzaG91bGQgYmVcclxuICAgICAgdGhpcy5jdXJyZW50RGF0YVNldCA9IHRoaXMubG9va3VwRGF0YXNldENvZGUoKTtcclxuICAgICAgaWYgKHRoaXMuY3VycmVudERhdGFTZXQpIHtcclxuXHJcbiAgICAgICAgLy8vIFRlbXBvcmFyeSBtZWFzdXJlIHVudGlsIHRoZSBwcm9tcHRzZXQgZW5kcG9pbnQgc3VwcG9ydHMgQXV0b2NvbXBsZXRlIGFuZCBWYWxpZGF0ZVxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5BVVRPQ09NUExFVEUpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oYW5kbGVQcm9tcHRzZXRSZXN1bHQoe3Jlc3VsdDoge2xpbmVzOiBbe2V4YW1wbGU6IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlclRleHQsIHByb21wdDogJ0FkZHJlc3MnLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjB9XX19KSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5WQUxJREFURSkge1xyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBbXHJcbiAgICAgICAgICAgIHtwcm9tcHQ6ICdBZGRyZXNzIGxpbmUgMScsIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MH0sXHJcbiAgICAgICAgICAgIHtwcm9tcHQ6ICdBZGRyZXNzIGxpbmUgMicsIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MH0sXHJcbiAgICAgICAgICAgIHtwcm9tcHQ6ICdBZGRyZXNzIGxpbmUgMycsIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MH0sXHJcbiAgICAgICAgICAgIHtwcm9tcHQ6IHRoaXMucmVzdWx0LmNyZWF0ZUFkZHJlc3NMaW5lLmxhYmVsKCdsb2NhbGl0eScpLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjB9LFxyXG4gICAgICAgICAgICB7cHJvbXB0OiB0aGlzLnJlc3VsdC5jcmVhdGVBZGRyZXNzTGluZS5sYWJlbCgncmVnaW9uJyksIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MH0sXHJcbiAgICAgICAgICAgIHtwcm9tcHQ6IHRoaXMucmVzdWx0LmNyZWF0ZUFkZHJlc3NMaW5lLmxhYmVsKCdwb3N0YWxfY29kZScpLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjB9XHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhhbmRsZVByb21wdHNldFJlc3VsdCh7cmVzdWx0OiB7bGluZXN9fSkpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgIGNvdW50cnlfaXNvOiB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSxcclxuICAgICAgICAgIGRhdGFzZXRzOiBBcnJheS5pc0FycmF5KHRoaXMuY3VycmVudERhdGFTZXQpID8gdGhpcy5jdXJyZW50RGF0YVNldCA6IFt0aGlzLmN1cnJlbnREYXRhU2V0XSxcclxuICAgICAgICAgIHNlYXJjaF90eXBlOiB0aGlzLnNlYXJjaFR5cGUsXHJcbiAgICAgICAgICBwcm9tcHRfc2V0OiAnb3B0aW1hbCdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3ByZS1wcm9tcHRzZXQtY2hlY2snKTtcclxuICAgICAgICB0aGlzLnJlcXVlc3Quc2VuZCh0aGlzLmJhc2VVcmwgKyB0aGlzLnByb21wdHNldEVuZHBvaW50LCAnUE9TVCcsIHRoaXMuaGFuZGxlUHJvbXB0c2V0UmVzdWx0LmJpbmQodGhpcyksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb29rdXBEYXRhc2V0Q29kZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBpdGVtID0gZGF0YXNldENvZGVzLmZpbmQoZGF0YXNldCA9PiBkYXRhc2V0LmlzbzNDb2RlID09PSB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSAmJiBkYXRhc2V0LnNlYXJjaFR5cGUuaW5jbHVkZXModGhpcy5zZWFyY2hUeXBlKSk7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICByZXR1cm4gaXRlbS5kYXRhc2V0Q29kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlUHJvbXB0c2V0UmVzdWx0KHJlc3BvbnNlKTogdm9pZCB7XHJcbiAgICAvLyBSZW1vdmUgYW55IGN1cnJlbnRseSBkaXNwbGF5ZWQgcGlja2xpc3Qgd2hlbiB0aGUgcHJvbXB0c2V0IGNoYW5nZXNcclxuICAgIHRoaXMucGlja2xpc3QuaGlkZSgpO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgYSBuZXcgZXZlbnQgdG8gbm90aWZ5IHN1YnNjcmliZXJzXHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXByb21wdHNldC1jaGVjaycsIHJlc3BvbnNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbnB1dHMoaW5wdXRzID0gdGhpcy5vcHRpb25zLmVsZW1lbnRzLmlucHV0cyk6IHZvaWQge1xyXG4gICAgLy8gSWYgYWRkcmVzcyBpbnB1dHMgZXhpc3QgdGhlbiByZWdpc3RlciB0aGVzZSB3aXRoIGV2ZW50IGxpc3RlbmVycywgb3RoZXJ3aXNlIGNhbGwgdGhlIHByb21wdHNldCBlbmRwb2ludCB0byByZXRyaWV2ZSB0aGVtXHJcbiAgICBpZiAoaW5wdXRzKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJJbnB1dHMoaW5wdXRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE1ha2UgYW4gQVBJIGNhbGwgdG8gZ2V0IHRoZSBwcm9tcHRzZXQgZm9yIHRoaXMgY291bnRyeS9kYXRhc2V0L2VuZ2luZVxyXG4gICAgICB0aGlzLmdldFByb21wdHNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5TSU5HTEVMSU5FIHx8IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFKSB7XHJcbiAgICAgIC8vIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGxvb2t1cCBidXR0b25cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbGVtZW50cy5sb29rdXBCdXR0b24pIHtcclxuICAgICAgICB0aGlzLmxvb2t1cEZuID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuZWxlbWVudHMubG9va3VwQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5sb29rdXBGbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVnaXN0ZXJJbnB1dHMoaW5wdXRzOiBIVE1MSW5wdXRFbGVtZW50W10pIHtcclxuICAgIC8vIElmIG5ldyBpbnB1dHMgaGF2ZSBiZWVuIHByb3ZpZGVkLCBlbnN1cmUgd2UgdXBkYXRlIHRoZSBlbGVtZW50cyBhcnJheSB0byBjYXB0dXJlIHRoZW1cclxuICAgIHRoaXMuaW5wdXRzID0gQXJyYXkuZnJvbShpbnB1dHMpO1xyXG5cclxuICAgIHRoaXMuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xyXG4gICAgICAvLyBEaXNhYmxlIGF1dG9jb21wbGV0ZSBvbiB0aGUgZm9ybSBmaWVsZFxyXG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICduZXctcGFzc3dvcmQnKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5BVVRPQ09NUExFVEUpIHtcclxuICAgICAgICAvLyBCaW5kIGFuIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBpbnB1dFxyXG4gICAgICAgIHRoaXMua2V5VXBGbiA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmtleVVwRm4pO1xyXG4gICAgICAgIHRoaXMuY2hlY2tUYWJGbiA9IHRoaXMuY2hlY2tUYWIuYmluZCh0aGlzKTtcclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5jaGVja1RhYkZuKTtcclxuICAgICAgICAvLyBTZXQgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGlucHV0XHJcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicsIHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlclRleHQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBCaW5kIGFuIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBpbnB1dCB0byBhbGxvdyB1c2VycyB0byB0cmF2ZXJzZSB1cCBhbmQgZG93biB0aGUgcGlja2xpc3QgdXNpbmcgdGhlIGtleWJvYXJkXHJcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlib2FyZEV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jb3VudHJ5Q29kZU1hcHBpbmcgPSB0aGlzLm9wdGlvbnMuY291bnRyeUNvZGVNYXBwaW5nIHx8IHt9O1xyXG5cclxuICAgIC8vIEFwcGx5IGZvY3VzIHRvIHRoZSBmaXJzdCBpbnB1dFxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBseUZvY3VzKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRzWzBdLmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvdW50cnlMaXN0KCk6IHZvaWQge1xyXG4gICAgLy8gU2V0IHRoZSBpbml0aWFsIGNvdW50cnkgY29kZSBmcm9tIGVpdGhlciB0aGUgdmFsdWUgb2YgYSBjb3VudHJ5IGxpc3QgSFRNTCBlbGVtZW50IG9yIGEgc3RhdGljIGNvdW50cnkgY29kZVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbGVtZW50cy5jb3VudHJ5TGlzdCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSA9IHRoaXMub3B0aW9ucy5lbGVtZW50cy5jb3VudHJ5TGlzdC52YWx1ZTtcclxuXHJcbiAgICAgIC8vIExpc3RlbiBmb3Igd2hlbiBhIGNvdW50cnkgaXMgY2hhbmdlZCBhbmQgY2FsbCB0aGUgcHJvbXB0c2V0IGVuZHBvaW50XHJcbiAgICAgIHRoaXMub3B0aW9ucy5lbGVtZW50cy5jb3VudHJ5TGlzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmhhbmRsZUNvdW50cnlMaXN0Q2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY291bnRyeUNvZGUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Q291bnRyeUNvZGUgPSB0aGlzLm9wdGlvbnMuY291bnRyeUNvZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgY291bnRyeSBjb2RlIG9yIGEgY291bnRyeSBsaXN0IGVsZW1lbnQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFdoZW4gYSBjb3VudHJ5IGZyb20gdGhlIGxpc3QgaXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBjdXJyZW50IGNvdW50cnkgY29kZSBhbmQgY2FsbCB0aGUgcHJvbXB0c2V0IGVuZHBvaW50IGFnYWluXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb3VudHJ5TGlzdENoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudENvdW50cnlDb2RlID0gdGhpcy5vcHRpb25zLmVsZW1lbnRzLmNvdW50cnlMaXN0LnZhbHVlO1xyXG4gICAgdGhpcy5nZXRQcm9tcHRzZXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVTZWFyY2hEYXRhRm9yQXBpQ2FsbCgpOiBzdHJpbmcge1xyXG4gICAgLy8gSWYgYSBkYXRhc2V0IGNvZGUgaGFzbid0IGJlZW4gc2V0IHlldCwgdHJ5IGFuZCBsb29rIGl0IHVwXHJcbiAgICBpZiAoIXRoaXMuY3VycmVudERhdGFTZXQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50RGF0YVNldCA9IHRoaXMubG9va3VwRGF0YXNldENvZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBjb3VudHJ5X2lzbzogdGhpcy5jdXJyZW50Q291bnRyeUNvZGUsXHJcbiAgICAgIGNvbXBvbmVudHM6IHt1bnNwZWNpZmllZDogW3RoaXMuY3VycmVudFNlYXJjaFRlcm1dfSxcclxuICAgICAgZGF0YXNldHM6IEFycmF5LmlzQXJyYXkodGhpcy5jdXJyZW50RGF0YVNldCkgPyB0aGlzLmN1cnJlbnREYXRhU2V0IDogW3RoaXMuY3VycmVudERhdGFTZXRdLFxyXG4gICAgICBtYXhfc3VnZ2VzdGlvbnM6ICh0aGlzLm9wdGlvbnMubWF4U3VnZ2VzdGlvbnMgfHwgdGhpcy5waWNrbGlzdC5tYXhTdWdnZXN0aW9ucylcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlNJTkdMRUxJTkUgfHwgdGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuVkFMSURBVEUpIHtcclxuICAgICAgZGF0YVsnb3B0aW9ucyddID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdmbGF0dGVuJyxcclxuICAgICAgICAgIFZhbHVlOiAndHJ1ZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdpbnRlbnNpdHknLFxyXG4gICAgICAgICAgVmFsdWU6ICdjbG9zZSdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdwcm9tcHRfc2V0JyxcclxuICAgICAgICAgIFZhbHVlOiAnZGVmYXVsdCdcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuU0lOR0xFTElORSkge1xyXG4gICAgICAgIGRhdGFbJ29wdGlvbnMnXS5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6ICdzZWFyY2hfdHlwZScsXHJcbiAgICAgICAgICBWYWx1ZTogJ3NpbmdsZWxpbmUnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5WQUxJREFURSkge1xyXG4gICAgICAgIGRhdGFbJ2xheW91dHMnXSA9IFsnZGVmYXVsdCddO1xyXG4gICAgICAgIGRhdGFbJ2xheW91dF9mb3JtYXQnXSA9ICdkZWZhdWx0JztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb24pIHtcclxuICAgICAgZGF0YVsnbG9jYXRpb24nXSA9IHRoaXMub3B0aW9ucy5sb2NhdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIEFsbG93IHRoZSBrZXlib2FyZCB0byBiZSB1c2VkIHRvIGVpdGhlciB0cmF2ZXJzZSB1cCBhbmQgZG93biB0aGUgcGlja2xpc3QgYW5kIHNlbGVjdCBhbiBpdGVtLCBvciB0cmlnZ2VyIGEgbmV3IHNlYXJjaFxyXG4gIHByaXZhdGUgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZXZlbnQpO1xyXG5cclxuICAgIC8vIElmIGEgcGlja2xpc3QgaXMgcG9wdWxhdGVkIHRoZW4gdHJpZ2dlciBpdHMga2V5dXAgZXZlbnQgdG8gc2VsZWN0IGFuIGl0ZW1cclxuICAgIGlmICh0aGlzLnBpY2tsaXN0LnNpemUpIHtcclxuICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicgfHwga2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5rZXl1cChldmVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPdGhlcndpc2UsIGVuYWJsZSBwcmVzc2luZyAnZW50ZXInIHRvIHRyaWdnZXIgYSBuZXcgc2VhcmNoXHJcbiAgICAgIGlmIChrZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaChldmVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNYWluIGZ1bmN0aW9uIHRvIHNlYXJjaCBmb3IgYW4gYWRkcmVzcyBmcm9tIGFuIGlucHV0IHN0cmluZ1xyXG4gIHByaXZhdGUgc2VhcmNoKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSB0aGlzLmlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQudmFsdWUpLmpvaW4oJywnKTtcclxuXHJcbiAgICAvLyBHcmFiIHRoZSBjb3VudHJ5IElTTyBjb2RlIGFuZCAoaWYgaXQgaXMgcHJlc2VudCkgdGhlIGRhdGFzZXQgbmFtZSBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudHJ5TGlzdCAoZm9ybWF0OiB7Y291bnRyeUlzb0NvZGV9O3tkYXRhc2V0fSlcclxuICAgIGNvbnN0IGN1cnJlbnRDb3VudHJ5SW5mbyA9IHRoaXMuY291bnRyeUNvZGVNYXBwaW5nW3RoaXMuY3VycmVudENvdW50cnlDb2RlXSB8fCB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZTtcclxuICAgIGNvbnN0IGNvdW50cnlDb2RlQW5kRGF0YXNldCA9IGN1cnJlbnRDb3VudHJ5SW5mby5zcGxpdCgnOycpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudENvdW50cnlDb2RlID0gY291bnRyeUNvZGVBbmREYXRhc2V0WzBdO1xyXG4gICAgaWYgKGNvdW50cnlDb2RlQW5kRGF0YXNldFsxXSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnREYXRhU2V0ID0gY291bnRyeUNvZGVBbmREYXRhc2V0WzFdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIChSZS0pc2V0IHRoZSBwcm9wZXJ0eSBzdGF0aW5nIHdoZXRoZXIgdGhlIHNlYXJjaCBpbnB1dCBoYXMgYmVlbiByZXNldC5cclxuICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBpbnN0YW5jZXMgd2hlbiB0aGUgc2VhcmNoIGlucHV0IGlzIGFsc28gYW4gYWRkcmVzc1xyXG4gICAgLy8gb3V0cHV0IGZpZWxkLiBBZnRlciBhbiBhZGRyZXNzIGhhcyBiZWVuIHJldHVybmVkLCB5b3UgZG9uJ3Qgd2FudCBhIG5ldyBcclxuICAgIC8vIHNlYXJjaCBiZWluZyB0cmlnZ2VyZWQgdW50aWwgdGhlIGZpZWxkIGhhcyBiZWVuIGNsZWFyZWQuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50U2VhcmNoVGVybSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5oYXNTZWFyY2hJbnB1dEJlZW5SZXNldCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgc2VhcmNoaW5nIGlzIHBlcm1pdHRlZFxyXG4gICAgaWYgKHRoaXMuY2FuU2VhcmNoKCkpIHtcclxuICAgICAgLy8gQWJvcnQgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzXHJcbiAgICAgIGlmICh0aGlzLnJlcXVlc3QuY3VycmVudFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnJlcXVlc3QuY3VycmVudFJlcXVlc3QuYWJvcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlyZSBhbiBldmVudCBiZWZvcmUgYSBzZWFyY2ggdGFrZXMgcGxhY2VcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncHJlLXNlYXJjaCcsIHRoaXMuY3VycmVudFNlYXJjaFRlcm0pO1xyXG5cclxuICAgICAgLy8gQ29uc3RydWN0IHRoZSBuZXcgU2VhcmNoIFVSTCBhbmQgZGF0YVxyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZW5lcmF0ZVNlYXJjaERhdGFGb3JBcGlDYWxsKCk7XHJcblxyXG4gICAgICAvLyBTdG9yZSB0aGUgbGFzdCBzZWFyY2ggdGVybVxyXG4gICAgICB0aGlzLmxhc3RTZWFyY2hUZXJtID0gdGhpcy5jdXJyZW50U2VhcmNoVGVybTtcclxuXHJcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxyXG4gICAgICB0aGlzLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gU2hvdyBhbiBpbmxpbmUgc3Bpbm5lciB3aGlsc3Qgc2VhcmNoaW5nXHJcbiAgICAgIHRoaXMuc2VhcmNoU3Bpbm5lci5zaG93KCk7XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIEFQSSBVUkwsIGhlYWRlcnMgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgc2VhcmNoIHR5cGVcclxuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlVXJsICsgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFID8gdGhpcy52YWxpZGF0ZUVuZHBvaW50IDogdGhpcy5zZWFyY2hFbmRwb2ludCk7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5WQUxJREFURSA/IFt7a2V5OiAnQWRkLU1ldGFkYXRhJywgdmFsdWU6IHRydWV9XSA6IFtdO1xyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFID8gdGhpcy5yZXN1bHQuaGFuZGxlVmFsaWRhdGVSZXNwb25zZSA6IHRoaXMucGlja2xpc3Quc2hvdztcclxuXHJcbiAgICAgIC8vIEluaXRpYXRlIG5ldyBTZWFyY2ggcmVxdWVzdFxyXG4gICAgICB0aGlzLnJlcXVlc3Quc2VuZCh1cmwsICdQT1NUJywgY2FsbGJhY2ssIGRhdGEsIGhlYWRlcnMpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hUZXJtICE9PSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtKSB7XHJcbiAgICAgIC8vIENsZWFyIHRoZSBwaWNrbGlzdCBpZiB0aGUgc2VhcmNoIHRlcm0gaXMgY2xlYXJlZC9lbXB0eVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gcmV0dXJuIGEgY29uc2lzdGVudCBrZXkgbmFtZVxyXG4gIHByaXZhdGUgZ2V0S2V5KHtrZXl9KTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgIHJldHVybiAnQXJyb3dEb3duJztcclxuICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICByZXR1cm4gJ0Fycm93VXAnO1xyXG4gICAgICBjYXNlICdTcGFjZWJhcic6XHJcbiAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgIHJldHVybiAnICc7XHJcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XHJcbiAgICAgIGNhc2UgJ0VzYyc6XHJcbiAgICAgICAgcmV0dXJuICdFc2NhcGUnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhblNlYXJjaCgpOiBib29sZWFuIHtcclxuICAgIC8vIElmIHNlYXJjaGluZyBvbiB0aGlzIGluc3RhbmNlIGlzIGVuYWJsZWQsIGFuZFxyXG4gICAgcmV0dXJuICh0aGlzLm9wdGlvbnMuZW5hYmxlZCAmJlxyXG4gICAgICAvLyBJZiBzZWFyY2ggdGVybSBpcyBub3QgZW1wdHksIGFuZFxyXG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtICE9PSAnJyAmJlxyXG4gICAgICAvLyBJZiB0aGUgc2VhcmNoIHRlcm0gaXMgYXQgbGVhc3QgNCBjaGFyYWN0ZXJzXHJcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0ubGVuZ3RoID4gMyAmJlxyXG4gICAgICAvLyBJZiBzZWFyY2ggdGVybSBpcyBub3QgdGhlIHNhbWUgYXMgcHJldmlvdXMgc2VhcmNoIHRlcm0sIGFuZFxyXG4gICAgICB0aGlzLmxhc3RTZWFyY2hUZXJtICE9PSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtICYmXHJcbiAgICAgIC8vIElmIHRoZSBjb3VudHJ5IGlzIG5vdCBlbXB0eSwgYW5kXHJcbiAgICAgIHRoaXMuY3VycmVudENvdW50cnlDb2RlICYmXHJcbiAgICAgIC8vIElmIHNlYXJjaCBpbnB1dCBoYXMgYmVlbiByZXNldCAoaWYgYXBwbGljYWJsZSlcclxuICAgICAgdGhpcy5oYXNTZWFyY2hJbnB1dEJlZW5SZXNldCA9PT0gdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBvd2VyZWRCeUxvZ286IFBvd2VyZWRCeUxvZ28gPSB7XHJcbiAgICBlbGVtZW50OiBudWxsLFxyXG4gICAgLy8gQ3JlYXRlIGEgXCJQb3dlcmVkIGJ5IEV4cGVyaWFuXCIgZm9vdGVyXHJcbiAgICBjcmVhdGUocGlja2xpc3QpIHtcclxuICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICB0ZXh0OiBgJHt0aGlzLnN2Z30gPGVtPlBvd2VyZWQgYnkgRXhwZXJpYW48L2VtPmAsXHJcbiAgICAgICAgZm9ybWF0OiAnJ1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBsaXN0SXRlbSA9IHBpY2tsaXN0LmNyZWF0ZUxpc3RJdGVtKGl0ZW0pO1xyXG4gICAgICBsaXN0SXRlbS5jbGFzc0xpc3QuYWRkKCdwb3dlcmVkLWJ5LWV4cGVyaWFuJyk7XHJcbiAgICAgIHBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChsaXN0SXRlbSk7XHJcbiAgICAgIHJldHVybiBsaXN0SXRlbTtcclxuICAgIH0sXHJcbiAgICAvLyBEZXN0cm95IHRoZSBcIlBvd2VyZWQgYnkgRXhwZXJpYW5cIiBmb290ZXJcclxuICAgIGRlc3Ryb3kocGlja2xpc3QpIHtcclxuICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xyXG4gICAgICAgIHBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHN2ZzogYDxzdmcgY2xhc3M9XCJleHBlcmlhbi1sb2dvXCIgdmVyc2lvbj1cIjEuMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMTIwIDEyMFwiIHN0eWxlPVwiXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIlBvd2VyZWQgYnkgRXhwZXJpYW5cIj5cclxuICAgICAgICAgICAgPHRpdGxlPkV4cGVyaWFuIGxvZ288L3RpdGxlPlxyXG4gICAgICAgICAgICA8Zz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0eWxlPVwiZmlsbDogIzBFNkVCNlwiIGQ9XCJNNTYuMSwyN2gtMTNjLTMuOSwwLTctMy4xLTctN1Y3YzAtMy45LDMuMS03LDctN2gxM2MzLjksMCw3LDMuMSw3LDd2MTNDNjMuMSwyMy44LDYwLDI3LDU2LjEsMjdcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGw6ICM3MjIxN0JcIiBkPVwiTTIyLjUsNTYuMUg3LjljLTQuMywwLTcuOS0zLjUtNy45LTcuOVYzMy42YzAtNC4zLDMuNS03LjksNy45LTcuOWgxNC42YzQuMywwLDcuOSwzLjUsNy45LDcuOXYxNC42QzMwLjQsNTIuNiwyNi44LDU2LjEsMjIuNSw1Ni4xXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggc3R5bGU9XCJmaWxsOiAjQjEyMzg0XCIgZD1cIk0yMS4xLDg2LjRoLTguOWMtMi43LDAtNC44LTIuMS00LjgtNC44di04LjljMC0yLjcsMi4yLTQuOCw0LjgtNC44aDguOWMyLjcsMCw0LjgsMi4yLDQuOCw0Ljh2OC45QzI1LjksODQuMywyMy43LDg2LjQsMjEuMSw4Ni40XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggc3R5bGU9XCJmaWxsOiAjRTcyODg3XCIgZD1cIk00NS4xLDExNC43SDM0LjVjLTMuMSwwLTUuNy0yLjUtNS43LTUuN1Y5OC40YzAtMy4xLDIuNS01LjcsNS43LTUuN2gxMC42YzMuMSwwLDUuNywyLjUsNS43LDUuN1YxMDlDNTAuNywxMTIuMSw0OC4yLDExNC43LDQ1LjEsMTE0LjdcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGw6ICNFNzI4ODdcIiBkPVwiTTgzLjgsMzIuM2gtNy4zYy0yLjIsMC0zLjktMS44LTMuOS0zLjl2LTcuM2MwLTIuMiwxLjgtMy45LDMuOS0zLjloNy4zYzIuMiwwLDMuOSwxLjgsMy45LDMuOXY3LjNDODcuNywzMC41LDg1LjksMzIuMyw4My44LDMyLjNcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGw6ICMwMDQ2OTFcIiBkPVwiTTgxLjcsNjEuOEM4MS41LDUxLjEsNzIsNDIsNjAuNyw0MkM0OSw0MiwzOS42LDUxLjMsMzkuNiw2Mi45QzM5LjYsNzQuNiw0OSw4NCw2MC43LDg0YzUuNiwwLDEwLjgtMi4yLDE0LjYtNS45YzAuNy0wLjcsMS4yLTEuNiwxLjItMi42YzAtMS45LTEuNi0zLjUtMy41LTMuNWMtMS4xLDAtMiwwLjctMi44LDEuNGMtMi40LDIuNS01LjksMy43LTkuNSwzLjdjLTcsMC0xMi43LTQuOC0xMy45LTExLjVoMzEuNWMwLDAsMCwwLDAuMSwwaDAuMWMwLjEsMCwwLjEsMCwwLjIsMGMwLjEsMCwwLjIsMCwwLjQtMC4xQzgwLjQsNjUsODEuNyw2My42LDgxLjcsNjEuOHogTTYwLjcsNDguOWM2LjMsMCwxMS42LDQuMSwxMy40LDkuN0g0Ny4zQzQ5LjEsNTMsNTQuMyw0OC45LDYwLjcsNDguOXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICA8L3N2Zz5gXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQaWNrbGlzdCgpIHtcclxuICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IFBpY2tsaXN0IGNsYXNzIGFuZCBzZXQgdGhlIHByb3BlcnRpZXMgYmVsb3dcclxuICAgIHRoaXMucGlja2xpc3QgPSBuZXcgUGlja2xpc3QoKTtcclxuXHJcbiAgICAvLyBTZXQgaW5pdGlhbCBtYXggc2l6ZVxyXG4gICAgdGhpcy5waWNrbGlzdC5tYXhTdWdnZXN0aW9ucyA9IDI1O1xyXG4gICAgLy8gVGFiIGNvdW50IHVzZWQgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cclxuICAgIHRoaXMucGlja2xpc3QudGFiQ291bnQgPSAtMTtcclxuICAgIC8vIFJlbmRlciBhIHBpY2tsaXN0IG9mIHNlYXJjaCByZXN1bHRzXHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC5zaG93ID0gKGl0ZW1zOiBTZWFyY2hSZXNwb25zZSkgPT4ge1xyXG4gICAgICAvLyBTdG9yZSB0aGUgcGlja2xpc3QgaXRlbXNcclxuICAgICAgdGhpcy5waWNrbGlzdC5pdGVtcyA9IGl0ZW1zPy5yZXN1bHQuc3VnZ2VzdGlvbnM7XHJcblxyXG4gICAgICAvLyBSZXNldCBhbnkgcHJldmlvdXNseSBzZWxlY3RlZCBjdXJyZW50IGl0ZW1cclxuICAgICAgdGhpcy5waWNrbGlzdC5jdXJyZW50SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAvLyBVcGRhdGUgcGlja2xpc3Qgc2l6ZVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnNpemUgPSB0aGlzLnBpY2tsaXN0Lml0ZW1zPy5sZW5ndGg7XHJcblxyXG4gICAgICAvLyBSZXNldCB0aGUgcGlja2xpc3QgdGFiIGNvdW50ICh1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uKVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnJlc2V0VGFiQ291bnQoKTtcclxuXHJcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxyXG4gICAgICB0aGlzLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gR2V0L0NyZWF0ZSBwaWNrbGlzdCBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QgPSB0aGlzLnBpY2tsaXN0Lmxpc3QgfHwgdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0KCk7XHJcblxyXG4gICAgICAvLyBFbnN1cmUgcHJldmlvdXMgcmVzdWx0cyBhcmUgY2xlYXJlZFxyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgIHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuZGVzdHJveSgpO1xyXG5cclxuICAgICAgLy8gRmlyZSBhbiBldmVudCBiZWZvcmUgcGlja2xpc3QgaXMgY3JlYXRlZFxyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtcGlja2xpc3QtY3JlYXRlJywgdGhpcy5waWNrbGlzdC5pdGVtcyk7XHJcblxyXG4gICAgICBpZiAodGhpcy5waWNrbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIElmIGEgcGlja2xpc3QgbmVlZHMgXCJyZWZpbmluZ1wiIHRoZW4gcHJlcGVuZCBhIHRleHRib3ggdG8gYWxsb3cgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgc2VsZWN0aW9uXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2xpc3QucmVmaW5lLmlzTmVlZGVkKGl0ZW1zKSkge1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5yZWZpbmUuY3JlYXRlSW5wdXQoaXRlbXMucmVzdWx0LnN1Z2dlc3Rpb25zX3Byb21wdCwgaXRlbXMucmVzdWx0LnN1Z2dlc3Rpb25zX2tleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuVkFMSURBVEUpIHtcclxuICAgICAgICAgIHRoaXMucGlja2xpc3QuZGlzcGxheVN1Z2dlc3Rpb25zSGVhZGVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYW5kIHNob3cgcmVzdWx0c1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtL3JvdyBpbiB0aGUgcGlja2xpc3RcclxuICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0SXRlbShpdGVtKTtcclxuICAgICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5hcHBlbmRDaGlsZChsaXN0SXRlbSk7XHJcblxyXG4gICAgICAgICAgLy8gTGlzdGVuIGZvciBzZWxlY3Rpb24gb24gdGhpcyBpdGVtXHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3RlbihsaXN0SXRlbSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5WQUxJREFURSkge1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5kaXNwbGF5VXNlQWRkcmVzc0VudGVyZWRGb290ZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGlja2xpc3Quc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QuaGFuZGxlRW1wdHlQaWNrbGlzdChpdGVtcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBhIFwiUG93ZXJlZCBieSBFeHBlcmlhblwiIGxvZ28gdG8gdGhlIHBpY2tsaXN0IGZvb3RlclxyXG4gICAgICB0aGlzLnBvd2VyZWRCeUxvZ28uZWxlbWVudCA9IHRoaXMucG93ZXJlZEJ5TG9nby5lbGVtZW50IHx8IHRoaXMucG93ZXJlZEJ5TG9nby5jcmVhdGUodGhpcy5waWNrbGlzdCk7XHJcblxyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IGFmdGVyIHBpY2tsaXN0IGlzIGNyZWF0ZWRcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncG9zdC1waWNrbGlzdC1jcmVhdGUnLCB0aGlzLnBpY2tsaXN0Lml0ZW1zKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gUmVtb3ZlIHRoZSBwaWNrbGlzdFxyXG4gICAgdGhpcy5waWNrbGlzdC5oaWRlID0gKCkgPT4ge1xyXG4gICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBwaWNrbGlzdCBpdGVtXHJcbiAgICAgIHRoaXMucGlja2xpc3QuY3VycmVudEl0ZW0gPSBudWxsO1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIFwidXNlIGFkZHJlc3MgZW50ZXJlZFwiIG9wdGlvbiB0b29cclxuICAgICAgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5kZXN0cm95KCk7XHJcbiAgICAgIC8vIFJlbW92ZSB0aGUgXCJQb3dlcmVkIGJ5IEV4cGVyaWFuXCIgbG9nb1xyXG4gICAgICB0aGlzLnBvd2VyZWRCeUxvZ28uZGVzdHJveSh0aGlzLnBpY2tsaXN0KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmlucHV0cykge1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2xhc3MgZGVub3RpbmcgYSBwaWNrbGlzdCAtIGlmIFNpbmdsZWxpbmUgbW9kZSBpcyB1c2VkLCB0aGVuIGl0IGlzIHRoZSBsYXN0IGlucHV0IGZpZWxkLCBvdGhlcndpc2UgdXNlIHRoZSBmaXJzdCBvbmVcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlNJTkdMRUxJTkUgPyB0aGlzLmlucHV0cy5sZW5ndGggLSAxIDogMDtcclxuICAgICAgICB0aGlzLmlucHV0c1twb3NpdGlvbl0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvd2luZy1zdWdnZXN0aW9ucycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSZW1vdmUgdGhlIG1haW4gcGlja2xpc3QgY29udGFpbmVyXHJcbiAgICAgIGlmICh0aGlzLnBpY2tsaXN0Lmxpc3QpIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LmNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC5oYW5kbGVFbXB0eVBpY2tsaXN0ID0gKGl0ZW1zOiBTZWFyY2hSZXNwb25zZSkgPT4ge1xyXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbS9yb3cgaW4gdGhlIHBpY2tsaXN0IHNob3dpbmcgXCJObyBtYXRjaGVzXCIgdGhhdCBhbGxvd3MgdGhlIFwidXNlIGFkZHJlc3MgZW50ZXJlZFwiIG9wdGlvblxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmVsZW1lbnQgPSB0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmVsZW1lbnQgfHwgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5jcmVhdGUoaXRlbXMucmVzdWx0Py5jb25maWRlbmNlKTtcclxuXHJcbiAgICAgIHRoaXMucGlja2xpc3Quc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xyXG5cclxuICAgICAgLy8gUHJvdmlkZSBpbXBsZW1lbnRpbmcgc2VhcmNoIHR5cGVzIHdpdGggYSBtZWFucyBvZiBpbnZva2luZyBhIGN1c3RvbSBjYWxsYmFja1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMucGlja2xpc3QuaGFuZGxlRW1wdHlQaWNrbGlzdENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5oYW5kbGVFbXB0eVBpY2tsaXN0Q2FsbGJhY2soKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQcmVwZW5kIGEgdGl0bGUgYmVmb3JlIHRoZSBzdWdnZXN0aW9uc1xyXG4gICAgdGhpcy5waWNrbGlzdC5kaXNwbGF5U3VnZ2VzdGlvbnNIZWFkZXIgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRpdGxlRGl2ID0gKDxIVE1MRWxlbWVudD5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3Qtc3VnZ2VzdGlvbnMtaGVhZGVyJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xyXG4gICAgICB0aXRsZURpdi5jbGFzc0xpc3QuYWRkKCdwaWNrbGlzdC1zdWdnZXN0aW9ucy1oZWFkZXInKTtcclxuICAgICAgdGl0bGVEaXYuaW5uZXJUZXh0ID0gJ1N1Z2dlc3Rpb25zOic7XHJcbiAgICAgIHRoaXMucGlja2xpc3QubGlzdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aXRsZURpdiwgdGhpcy5waWNrbGlzdC5saXN0KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQXBwZW5kIGEgZm9vdGVyIGF0IHRoZSBib3R0b20gb2YgdGhlIHBpY2tsaXN0IHByb3ZpZGluZyBhbiBvcHRpb24gdG8gXCJ1c2UgYWRkcmVzcyBlbnRlcmVkXCJcclxuICAgIHRoaXMucGlja2xpc3QuZGlzcGxheVVzZUFkZHJlc3NFbnRlcmVkRm9vdGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250YWluZXJEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3QtdXNlLWVudGVyZWQtY29udGFpbmVyJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCdwaWNrbGlzdC11c2UtZW50ZXJlZC1jb250YWluZXInKTtcclxuICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lckRpdiwgdGhpcy5waWNrbGlzdC5saXN0Lm5leHRFbGVtZW50U2libGluZyk7XHJcblxyXG4gICAgICBjb25zdCB0aXRsZURpdiA9ICg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpY2tsaXN0LXVzZS1lbnRlcmVkLWhlYWRlcicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuICAgICAgdGl0bGVEaXYuY2xhc3NMaXN0LmFkZCgncGlja2xpc3QtdXNlLWVudGVyZWQtaGVhZGVyJyk7XHJcbiAgICAgIHRpdGxlRGl2LmlubmVyVGV4dCA9ICdPciB1c2UgYWRkcmVzcyBlbnRlcmVkOic7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XHJcblxyXG4gICAgICBjb25zdCBpdGVtRGl2ID0gKDxIVE1MRWxlbWVudD5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3QtdXNlLWVudGVyZWQtb3B0aW9uJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xyXG4gICAgICBpdGVtRGl2LmNsYXNzTGlzdC5hZGQoJ3BpY2tsaXN0LXVzZS1lbnRlcmVkLW9wdGlvbicpO1xyXG4gICAgICBpdGVtRGl2LmlubmVyVGV4dCA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0ucmVwbGFjZSgvLCsvZywgJywgJyk7XHJcbiAgICAgIGl0ZW1EaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmNsaWNrKTtcclxuICAgICAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGl0ZW1EaXYpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJZiB0aGUgcGlja2xpc3QgY29udGFpbmVyIGlzIG91dCBvZiBib3VuZHMgdG8gdGhlIHRvcCBvciBib3R0b20sIHRoZW4gc2Nyb2xsIGl0IGludG8gdmlld1xyXG4gICAgdGhpcy5waWNrbGlzdC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBvdXRPZkJvdW5kc1RvcCA9IHRoaXMucGlja2xpc3QuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8IDA7XHJcbiAgICAgIGNvbnN0IG91dE9mQm91bmRzQm90dG9tID0gdGhpcy5waWNrbGlzdC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tID4gd2luZG93LmlubmVySGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKG91dE9mQm91bmRzVG9wIHx8IG91dE9mQm91bmRzQm90dG9tKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5jb250YWluZXIuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkID0ge1xyXG4gICAgICBlbGVtZW50OiBudWxsLFxyXG4gICAgICAvLyBDcmVhdGUgYSBcInVzZSBhZGRyZXNzIGVudGVyZWRcIiBvcHRpb25cclxuICAgICAgY3JlYXRlOiAoY29uZmlkZW5jZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcclxuICAgICAgICAgIHRleHQ6IGAke2NvbmZpZGVuY2V9ICR7dGhpcy5vcHRpb25zLnVzZUFkZHJlc3NFbnRlcmVkVGV4dH1gXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMucGlja2xpc3QuY3JlYXRlTGlzdEl0ZW0oaXRlbSk7XHJcbiAgICAgICAgbGlzdEl0ZW0uY2xhc3NMaXN0LmFkZCgndXNlLWFkZHJlc3MtZW50ZXJlZCcpO1xyXG4gICAgICAgIGxpc3RJdGVtLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnRW50ZXIgYWRkcmVzcyBtYW51YWxseScpO1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QubGlzdCA9IHRoaXMucGlja2xpc3QubGlzdCB8fCB0aGlzLnBpY2tsaXN0LmNyZWF0ZUxpc3QoKTtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobGlzdEl0ZW0sIHRoaXMucGlja2xpc3QuY29udGFpbmVyLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIGxpc3RJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5jbGljayk7XHJcbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xyXG4gICAgICB9LFxyXG4gICAgICAvLyBEZXN0cm95IHRoZSBcInVzZSBhZGRyZXNzIGVudGVyZWRcIiBvcHRpb25cclxuICAgICAgZGVzdHJveTogKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuZWxlbWVudCk7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAvLyBVc2UgdGhlIGFkZHJlc3MgZW50ZXJlZCBhcyB0aGUgRm9ybWF0dGVkIGFkZHJlc3NcclxuICAgICAgY2xpY2s6ICgpID0+IHtcclxuICAgICAgICBjb25zdCBpbnB1dERhdGEgPSB7XHJcbiAgICAgICAgICByZXN1bHQ6IHtcclxuICAgICAgICAgICAgY29uZmlkZW5jZTogJ05vIG1hdGNoZXMnLFxyXG4gICAgICAgICAgICBhZGRyZXNzOiB7XHJcbiAgICAgICAgICAgICAgYWRkcmVzc19saW5lXzE6ICcnLFxyXG4gICAgICAgICAgICAgIGFkZHJlc3NfbGluZV8yOiAnJyxcclxuICAgICAgICAgICAgICBhZGRyZXNzX2xpbmVfMzogJycsXHJcbiAgICAgICAgICAgICAgbG9jYWxpdHk6ICcnLFxyXG4gICAgICAgICAgICAgIHJlZ2lvbjogJycsXHJcbiAgICAgICAgICAgICAgcG9zdGFsX2NvZGU6ICcnLFxyXG4gICAgICAgICAgICAgIGNvdW50cnk6ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2VhcmNoVGVybSkge1xyXG4gICAgICAgICAgLy8gVHJ5IGFuZCBzcGxpdCBpbnRvIGxpbmVzIGJ5IHVzaW5nIGNvbW1hIGRlbGltaXRlclxyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICBpZiAobGluZXNbMF0pIHtcclxuICAgICAgICAgICAgaW5wdXREYXRhLnJlc3VsdC5hZGRyZXNzLmFkZHJlc3NfbGluZV8xID0gbGluZXNbMF07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGluZXNbMV0pIHtcclxuICAgICAgICAgICAgaW5wdXREYXRhLnJlc3VsdC5hZGRyZXNzLmFkZHJlc3NfbGluZV8yID0gbGluZXNbMV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGluZXNbMl0pIHtcclxuICAgICAgICAgICAgaW5wdXREYXRhLnJlc3VsdC5hZGRyZXNzLmFkZHJlc3NfbGluZV8zID0gbGluZXNbMl07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMzsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlucHV0RGF0YS5yZXN1bHQuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMyArPSBsaW5lc1tpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzdWx0LnNob3coaW5wdXREYXRhKTtcclxuICAgICAgICB0aGlzLnJlc3VsdC51cGRhdGVIZWFkaW5nKHRoaXMub3B0aW9ucy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLm1hbnVhbEhlYWRpbmdUZXh0KTtcclxuICAgICAgfSxcclxuICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYW4gYWRkcmVzcyBsaW5lIG9iamVjdCB3aXRoIHRoZSBrZXkgYXMgdGhlIGxhYmVsXHJcbiAgICAgIGZvcm1hdE1hbnVhbEFkZHJlc3NMaW5lOiBmdW5jdGlvbiAobGluZXMsIGkpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBkZWZhdWx0cy5hZGRyZXNzTGluZUxhYmVsc1tpXTtcclxuICAgICAgICBjb25zdCBsaW5lT2JqZWN0ID0ge307XHJcbiAgICAgICAgbGluZU9iamVjdFtrZXldID0gbGluZXNbaV0gfHwgJyc7XHJcbiAgICAgICAgcmV0dXJuIGxpbmVPYmplY3Q7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBwaWNrbGlzdCBsaXN0IChhbmQgY29udGFpbmVyKSBhbmQgaW5qZWN0IGFmdGVyIHRoZSBpbnB1dFxyXG4gICAgdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0ID0gKCkgPT4ge1xyXG4gICAgICAvLyBJZiBTaW5nbGVsaW5lIG1vZGUgaXMgdXNlZCwgdGhlbiBhcHBlbmQgdGhlIHBpY2tsaXN0IGFmdGVyIHRoZSBsYXN0IGlucHV0IGZpZWxkLCBvdGhlcndpc2UgdXNlIHRoZSBmaXJzdCBvbmVcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5TSU5HTEVMSU5FID8gdGhpcy5pbnB1dHMubGVuZ3RoIC0gMSA6IDA7XHJcblxyXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2FkZHJlc3MtcGlja2xpc3QtY29udGFpbmVyJyk7XHJcbiAgICAgIHRoaXMucGlja2xpc3QuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cclxuICAgICAgLy8gSW5zZXJ0IHRoZSBwaWNrbGlzdCBjb250YWluZXIgYWZ0ZXIgdGhlIGlucHV0XHJcbiAgICAgIHRoaXMuaW5wdXRzW3Bvc2l0aW9uXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBpY2tsaXN0LmNvbnRhaW5lciwgdGhpcy5pbnB1dHNbcG9zaXRpb25dLm5leHRFbGVtZW50U2libGluZyk7XHJcblxyXG4gICAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGxpc3QuY2xhc3NMaXN0LmFkZCgnYWRkcmVzcy1waWNrbGlzdCcpO1xyXG4gICAgICAvLyBBcHBlbmQgdGhlIHBpY2tsaXN0IHRvIHRoZSBpbm5lciB3cmFwcGVyXHJcbiAgICAgIHRoaXMucGlja2xpc3QuY29udGFpbmVyLmFwcGVuZENoaWxkKGxpc3QpO1xyXG5cclxuICAgICAgLy8gQWRkIGEgY2xhc3MgdG8gdGhlIGlucHV0IHRvIGRlbm90ZSB0aGF0IGEgcGlja2xpc3Qgd2l0aCBzdWdnZXN0aW9ucyBpcyBiZWluZyBzaG93blxyXG4gICAgICB0aGlzLmlucHV0c1twb3NpdGlvbl0uY2xhc3NMaXN0LmFkZCgnc2hvd2luZy1zdWdnZXN0aW9ucycpO1xyXG5cclxuICAgICAgbGlzdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5waWNrbGlzdC5jaGVja0VudGVyKTtcclxuICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIG5ldyBwaWNrbGlzdCBpdGVtL3Jvd1xyXG4gICAgdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0SXRlbSA9IChpdGVtOiBQaWNrbGlzdEl0ZW0pID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIHJvdy5pbm5lckhUTUwgPSB0aGlzLnBpY2tsaXN0LmFkZE1hdGNoaW5nRW1waGFzaXMoaXRlbSk7XHJcblxyXG4gICAgICAvLyBTdG9yZSB0aGUgRm9ybWF0IFVSTCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB1c2UgdGhlIGdsb2JhbF9hZGRyZXNzX2tleSBhcyBhIFwicmVmaW5lbWVudFwiIHByb3BlcnR5XHJcbiAgICAgIGlmIChpdGVtLmZvcm1hdCkge1xyXG4gICAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2Zvcm1hdCcsIGl0ZW0uZm9ybWF0KTtcclxuICAgICAgfSBlbHNlIGlmIChpdGVtLmdsb2JhbF9hZGRyZXNzX2tleSkge1xyXG4gICAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ3JlZmluZScsIGl0ZW0uZ2xvYmFsX2FkZHJlc3Nfa2V5KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcm93O1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBpY2tsaXN0LnJlZmluZSA9IHtcclxuICAgICAgZWxlbWVudDogbnVsbCxcclxuICAgICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwaWNrbGlzdCBuZWVkcyByZWZpbmluZy4gVGhpcyBoYXBwZW5zIGFmdGVyIGFuIGl0ZW0gaGFzIGJlZW4gXCJzdGVwcGVkIGludG9cIiBidXQgaGFzIGFuIHVucmVzb2x2YWJsZSByYW5nZS5cclxuICAgICAgLy8gVGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgc2VsZWN0aW9uIChlLmcuIGJ1aWxkaW5nIG51bWJlcikuXHJcbiAgICAgIGlzTmVlZGVkOiAocmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVHlwZSAhPT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLkFVVE9DT01QTEVURSAmJiAocmVzcG9uc2UucmVzdWx0LmNvbmZpZGVuY2UgPT09ICdQcmVtaXNlcyBwYXJ0aWFsJyB8fCByZXNwb25zZS5yZXN1bHQuY29uZmlkZW5jZSA9PT0gJ1N0cmVldCBwYXJ0aWFsJyB8fCByZXNwb25zZS5yZXN1bHQuY29uZmlkZW5jZSA9PT0gJ011bHRpcGxlIG1hdGNoZXMnKTtcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlSW5wdXQ6IChwcm9tcHQ6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3QtcmVmaW5lbWVudC1ib3gnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICByb3cuY2xhc3NMaXN0LmFkZCgncGlja2xpc3QtcmVmaW5lbWVudC1ib3gnKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpY2tsaXN0LXJlZmluZW1lbnQtYm94IGlucHV0JykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKSk7XHJcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgcHJvbXB0KTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2tleScsIGtleSk7XHJcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnbmV3LXBhc3N3b3JkJyk7XHJcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGlja2xpc3QucmVmaW5lLmVudGVyLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QucmVmaW5lLmVsZW1lbnQgPSBpbnB1dDtcclxuXHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gKDxIVE1MQnV0dG9uRWxlbWVudD5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3QtcmVmaW5lbWVudC1ib3ggYnV0dG9uJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJykpO1xyXG4gICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSAnUmVmaW5lJztcclxuICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2tsaXN0LnJlZmluZS5lbnRlcik7XHJcblxyXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJvdywgdGhpcy5waWNrbGlzdC5saXN0KTtcclxuXHJcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZW50ZXI6IChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyBBbGxvdyBhIG5ldyByZWZpbmVtZW50IGVudHJ5IGlmIHRoZSBlbnRlciBrZXkgd2FzIHVzZWQgaW5zaWRlIHRoZSB0ZXh0Ym94IG9yIHRoZSBidXR0b24gd2FzIGNsaWNrZWRcclxuICAgICAgICBpZiAoKGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiBldmVudC5rZXkgPT09ICdFbnRlcicpIHx8IGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAvLyBJZiBhIHBpY2tsaXN0IGl0ZW0gaXMgY3VycmVudGx5IHNlbGVjdGVkLCB0aGVuIHBvdGVudGlhbGx5IHVzZSB0aGlzIGluc3RlYWQgb2Ygd2hhdCdzIGluIHRoZSBpbnB1dCBmaWVsZFxyXG4gICAgICAgICAgaWYgKHRoaXMucGlja2xpc3QuY3VycmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrbGlzdC5jaGVja0VudGVyKGV2ZW50IGFzIEtleWJvYXJkRXZlbnQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgLy8gVGFrZSB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgZmllbGQgYW5kIHVzZSB0aGlzIHRvIGZ1cnRoZXIgcmVmaW5lIHRoZSBhZGRyZXNzXHJcbiAgICAgICAgICBpZiAodGhpcy5waWNrbGlzdC5yZWZpbmUuZWxlbWVudC52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe3JlZmluZW1lbnQ6IHRoaXMucGlja2xpc3QucmVmaW5lLmVsZW1lbnQudmFsdWV9KTtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5waWNrbGlzdC5yZWZpbmUuZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3Quc2VuZChgJHt0aGlzLmJhc2VVcmx9JHt0aGlzLnJlZmluZUVuZHBvaW50fS8ke2tleX1gLCAnUE9TVCcsIHRoaXMucmVzdWx0LmhhbmRsZVZhbGlkYXRlUmVzcG9uc2UsIGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrbGlzdC5zaXplICYmIGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdFbnRlcicpKSB7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0LmtleXVwKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC5yZXNldFRhYkNvdW50ID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLnBpY2tsaXN0LnRhYkNvdW50ID0gLTE7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEtleWJvYXJkIG5hdmlnYXRpb25cclxuICAgIHRoaXMucGlja2xpc3Qua2V5dXAgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnBpY2tsaXN0Lmxpc3QpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucGlja2xpc3QuY2hlY2tFbnRlcihldmVudCk7XHJcblxyXG4gICAgICAvLyBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgYWRkcmVzc2VzIGluIHRoZSBwaWNrbGlzdFxyXG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSB0aGlzLnBpY2tsaXN0Lmxpc3QucXVlcnlTZWxlY3RvckFsbCgnZGl2Jyk7XHJcbiAgICAgIGxldCBmaXJzdEFkZHJlc3M7XHJcbiAgICAgIGxldCBsYXN0QWRkcmVzcztcclxuXHJcbiAgICAgIC8vIElmIHRoZSBwaWNrbGlzdCBpcyBlbXB0eSwganVzdCByZXR1cm5cclxuICAgICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNldCB0aGUgdGFiQ291bnQgYmFzZWQgb24gcHJldmlvdXMgYW5kIGRpcmVjdGlvblxyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LnRhYkNvdW50LS07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QudGFiQ291bnQrKztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2V0IHRvcCBhbmQgYm90dG9tIHBvc2l0aW9ucyBhbmQgZW5hYmxlIHdyYXAtYXJvdW5kXHJcbiAgICAgIGlmICh0aGlzLnBpY2tsaXN0LnRhYkNvdW50IDwgMCkge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QudGFiQ291bnQgPSBhZGRyZXNzZXMubGVuZ3RoIC0gMTtcclxuICAgICAgICBsYXN0QWRkcmVzcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucGlja2xpc3QudGFiQ291bnQgPiBhZGRyZXNzZXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QudGFiQ291bnQgPSAwO1xyXG4gICAgICAgIGZpcnN0QWRkcmVzcyA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgYWRkcmVzc1xyXG4gICAgICBjb25zdCBjdXJyZW50bHlIaWdobGlnaHRlZCA9IGFkZHJlc3Nlc1t0aGlzLnBpY2tsaXN0LnRhYkNvdW50XTtcclxuICAgICAgLy8gUmVtb3ZlIGFueSBwcmV2aW91c2x5IGhpZ2hsaWdodGVkIG9uZXNcclxuICAgICAgY29uc3QgcHJldmlvdXNseUhpZ2hsaWdodGVkID0gdGhpcy5waWNrbGlzdC5saXN0LnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3RlZCcpO1xyXG4gICAgICBpZiAocHJldmlvdXNseUhpZ2hsaWdodGVkKSB7XHJcbiAgICAgICAgcHJldmlvdXNseUhpZ2hsaWdodGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XHJcbiAgICAgIH1cclxuICAgICAgY3VycmVudGx5SGlnaGxpZ2h0ZWQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuICAgICAgLy8gU2V0IHRoZSBjdXJyZW50SXRlbSBvbiB0aGUgcGlja2xpc3QgdG8gdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBhZGRyZXNzXHJcbiAgICAgIHRoaXMucGlja2xpc3QuY3VycmVudEl0ZW0gPSBjdXJyZW50bHlIaWdobGlnaHRlZDtcclxuXHJcbiAgICAgIC8vIFNjcm9sbCBhZGRyZXNzIGludG8gdmlldywgaWYgcmVxdWlyZWRcclxuICAgICAgY29uc3QgYWRkcmVzc0xpc3RDb29yZHMgPSB7XHJcbiAgICAgICAgdG9wOiB0aGlzLnBpY2tsaXN0Lmxpc3Qub2Zmc2V0VG9wLFxyXG4gICAgICAgIGJvdHRvbTogdGhpcy5waWNrbGlzdC5saXN0Lm9mZnNldFRvcCArIHRoaXMucGlja2xpc3QubGlzdC5vZmZzZXRIZWlnaHQsXHJcbiAgICAgICAgc2Nyb2xsVG9wOiB0aGlzLnBpY2tsaXN0Lmxpc3Quc2Nyb2xsVG9wLFxyXG4gICAgICAgIHNlbGVjdGVkVG9wOiBjdXJyZW50bHlIaWdobGlnaHRlZC5vZmZzZXRUb3AsXHJcbiAgICAgICAgc2VsZWN0ZWRCb3R0b206IGN1cnJlbnRseUhpZ2hsaWdodGVkLm9mZnNldFRvcCArIGN1cnJlbnRseUhpZ2hsaWdodGVkLm9mZnNldEhlaWdodCxcclxuICAgICAgICBzY3JvbGxBbW91bnQ6IGN1cnJlbnRseUhpZ2hsaWdodGVkLm9mZnNldEhlaWdodFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoZmlyc3RBZGRyZXNzKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAobGFzdEFkZHJlc3MpIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3Quc2Nyb2xsVG9wID0gOTk5O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGFkZHJlc3NMaXN0Q29vcmRzLnNlbGVjdGVkQm90dG9tICsgYWRkcmVzc0xpc3RDb29yZHMuc2Nyb2xsQW1vdW50ID4gYWRkcmVzc0xpc3RDb29yZHMuYm90dG9tKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnNjcm9sbFRvcCA9IGFkZHJlc3NMaXN0Q29vcmRzLnNjcm9sbFRvcCArIGFkZHJlc3NMaXN0Q29vcmRzLnNjcm9sbEFtb3VudDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhZGRyZXNzTGlzdENvb3Jkcy5zZWxlY3RlZFRvcCAtIGFkZHJlc3NMaXN0Q29vcmRzLnNjcm9sbEFtb3VudCAtIGFkZHJlc3NMaXN0Q29vcmRzLnRvcCA8IGFkZHJlc3NMaXN0Q29vcmRzLnNjcm9sbFRvcCkge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5zY3JvbGxUb3AgPSBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxUb3AgLSBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxBbW91bnQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIGVtcGhhc2lzIHRvIHRoZSBwaWNrbGlzdCBpdGVtcyBoaWdobGlnaHRpbmcgdGhlIG1hdGNoXHJcbiAgICB0aGlzLnBpY2tsaXN0LmFkZE1hdGNoaW5nRW1waGFzaXMgPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICBjb25zdCBoaWdobGlnaHRzID0gaXRlbS5tYXRjaGVkIHx8IFtdO1xyXG4gICAgICBsZXQgbGFiZWwgPSBpdGVtLnRleHQ7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlnaGxpZ2h0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gJzxiPicgKyBsYWJlbC5zdWJzdHJpbmcoaGlnaGxpZ2h0c1tpXVswXSwgaGlnaGxpZ2h0c1tpXVsxXSkgKyAnPC9iPic7XHJcbiAgICAgICAgbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMCwgaGlnaGxpZ2h0c1tpXVswXSkgKyByZXBsYWNlbWVudCArIGxhYmVsLnN1YnN0cmluZyhoaWdobGlnaHRzW2ldWzFdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBMaXN0ZW4gdG8gYSBwaWNrbGlzdCBzZWxlY3Rpb25cclxuICAgIHRoaXMucGlja2xpc3QubGlzdGVuID0gKHJvdykgPT4ge1xyXG4gICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2tsaXN0LnBpY2suYmluZChudWxsLCByb3cpKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC5jaGVja0VudGVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnVGFiJykge1xyXG4gICAgICAgIGxldCBwaWNrbGlzdEl0ZW07XHJcbiAgICAgICAgLy8gSWYgcGlja2xpc3QgY29udGFpbnMgMSBhZGRyZXNzIHRoZW4gdXNlIHRoaXMgb25lIHRvIGZvcm1hdFxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tsaXN0LnNpemUgPT09IDEpIHtcclxuICAgICAgICAgIHBpY2tsaXN0SXRlbSA9IHRoaXMucGlja2xpc3QubGlzdC5xdWVyeVNlbGVjdG9yQWxsKCdkaXYnKVswXTtcclxuICAgICAgICB9IC8vIEVsc2UgdXNlIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgb25lIHdoZW4gbmF2aWdhdGlvbiB1c2luZyBrZXlib2FyZFxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGlja2xpc3QuY3VycmVudEl0ZW0pIHtcclxuICAgICAgICAgIHBpY2tsaXN0SXRlbSA9IHRoaXMucGlja2xpc3QuY3VycmVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwaWNrbGlzdEl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMucGlja2xpc3QucGljayhwaWNrbGlzdEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBIb3cgdG8gaGFuZGxlIGEgcGlja2xpc3Qgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnBpY2tsaXN0LnBpY2sgPSAoaXRlbSkgPT4ge1xyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IHdoZW4gYW4gYWRkcmVzcyBpcyBwaWNrZWRcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncG9zdC1waWNrbGlzdC1zZWxlY3Rpb24nLCBpdGVtKTtcclxuXHJcbiAgICAgIC8vIEdldCBhIGZpbmFsIGFkZHJlc3MgdXNpbmcgcGlja2xpc3QgaXRlbSB1bmxlc3MgaXQgbmVlZHMgcmVmaW5lbWVudFxyXG4gICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ2Zvcm1hdCcpKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtYXQoaXRlbS5nZXRBdHRyaWJ1dGUoJ2Zvcm1hdCcpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlZmluZShpdGVtLmdldEF0dHJpYnV0ZSgncmVmaW5lJykpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXQodXJsOiBzdHJpbmcpIHtcclxuICAgIC8vIFRyaWdnZXIgYW4gZXZlbnRcclxuICAgIHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3ByZS1mb3JtYXR0aW5nLXNlYXJjaCcsIHVybCk7XHJcblxyXG4gICAgLy8gSGlkZSB0aGUgc2VhcmNoaW5nIHNwaW5uZXJcclxuICAgIHRoaXMuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XHJcblxyXG4gICAgLy8gSW5pdGlhdGUgYSBuZXcgRm9ybWF0IHJlcXVlc3RcclxuICAgIHRoaXMucmVxdWVzdC5zZW5kKHVybCwgJ0dFVCcsIHRoaXMucmVzdWx0LnNob3csIHVuZGVmaW5lZCwgW3trZXk6ICdBZGQtTWV0YWRhdGEnLCB2YWx1ZTogdHJ1ZX0vKiwge2tleTogJ0FkZC1Db21wb25lbnRzJywgdmFsdWU6IHRydWV9Ki9dKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmaW5lKGtleTogc3RyaW5nKSB7XHJcbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtcmVmaW5lbWVudCcsIGtleSk7XHJcblxyXG4gICAgLy8gSGlkZSB0aGUgc2VhcmNoaW5nIHNwaW5uZXJcclxuICAgIHRoaXMuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XHJcblxyXG4gICAgLy8gSW5pdGlhdGUgYSBuZXcgU3RlcC1pbiByZXF1ZXN0IHVzaW5nIHRoZSBnbG9iYWwgYWRkcmVzcyBrZXlcclxuICAgIHRoaXMucmVxdWVzdC5zZW5kKGAke3RoaXMuYmFzZVVybH0ke3RoaXMuc3RlcEluRW5kcG9pbnR9LyR7a2V5fWAsICdHRVQnLCB0aGlzLnBpY2tsaXN0LnNob3cpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXN1bHQ6IEFkZHJlc3NWYWxpZGF0aW9uUmVzdWx0ID0ge1xyXG4gICAgZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcjogbnVsbCxcclxuICAgIGxhc3RBZGRyZXNzRmllbGQ6IG51bGwsXHJcbiAgICBnZW5lcmF0ZUFkZHJlc3NMaW5lUmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgLy8gUmVuZGVyIGEgRm9ybWF0dGVkIGFkZHJlc3NcclxuICAgIHNob3c6IChkYXRhOiBTZWFyY2hSZXNwb25zZSkgPT4ge1xyXG4gICAgICAvLyBIaWRlIHRoZSBpbmxpbmUgc2VhcmNoIHNwaW5uZXJcclxuICAgICAgdGhpcy5zZWFyY2hTcGlubmVyLmhpZGUoKTtcclxuXHJcbiAgICAgIC8vIEhpZGUgdGhlIHBpY2tsaXN0XHJcbiAgICAgIHRoaXMucGlja2xpc3QuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gQ2xlYXIgdGhlIHByZXZpb3VzIHNlYXJjaCB0ZXJtXHJcbiAgICAgIHRoaXMubGFzdFNlYXJjaFRlcm0gPSAnJztcclxuXHJcbiAgICAgIC8vIEFsbG93IEF1dG9jb21wbGV0ZSB0aHJvdWdoIGFzIGl0IHdpbGwgbmVlZCB0byBjcmVhdGUgdGhlIGFkZGl0aW9uYWwgb3V0cHV0IGZpZWxkcyBmb3IgdGhlIGZpbmFsIGFkZHJlc3MuXHJcbiAgICAgIC8vIE90aGVyd2lzZSwgb25seSByZW5kZXIgdGhlIGZpbmFsIGFkZHJlc3MgaWYgdGhlcmUgYXJlIHJlc3VsdHMgYXZhaWxhYmxlLlxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuQVVUT0NPTVBMRVRFIHx8IChkYXRhLnJlc3VsdC5hZGRyZXNzICYmIGRhdGEucmVzdWx0LmNvbmZpZGVuY2UgIT09ICdObyBtYXRjaGVzJykpIHtcclxuXHJcbiAgICAgICAgLy8gQ2xlYXIgc2VhcmNoIGlucHV0KHMpXHJcbiAgICAgICAgdGhpcy5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiBpbnB1dC52YWx1ZSA9ICcnKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGlmIHdlIG5lZWRlZCB0byBnZW5lcmF0ZSB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgaW5wdXQgZmllbGRzIGxhdGVyXHJcbiAgICAgICAgdGhpcy5yZXN1bHQuY2FsY3VsYXRlSWZBZGRyZXNzTGluZUdlbmVyYXRpb25SZXF1aXJlZCgpO1xyXG5cclxuICAgICAgICAvLyBHZXQgZm9ybWF0dGVkIGFkZHJlc3MgY29udGFpbmVyIGVsZW1lbnRcclxuICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIGNvbnRhaW5lciBpZiB3ZSdyZSBjcmVhdGluZyBpbnB1dHMuIE90aGVyd2lzZSB0aGUgdXNlciB3aWxsIGhhdmUgdGhlaXIgb3duIGNvbnRhaW5lci5cclxuICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyID0gdGhpcy5vcHRpb25zLmVsZW1lbnRzLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXI7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyICYmIHRoaXMucmVzdWx0LmdlbmVyYXRlQWRkcmVzc0xpbmVSZXF1aXJlZCkge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHQuY3JlYXRlRm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTG9vcCBvdmVyIGVhY2ggZm9ybWF0dGVkIGFkZHJlc3MgY29tcG9uZW50XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBPYmplY3Qua2V5cyhkYXRhLnJlc3VsdC5hZGRyZXNzKS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZGF0YS5yZXN1bHQuYWRkcmVzcylbaV07XHJcbiAgICAgICAgICBjb25zdCBhZGRyZXNzQ29tcG9uZW50ID0gZGF0YS5yZXN1bHQuYWRkcmVzc1trZXldO1xyXG4gICAgICAgICAgLy8gQmluZCB0aGUgYWRkcmVzcyBlbGVtZW50IHRvIHRoZSB1c2VyJ3MgYWRkcmVzcyBmaWVsZCAob3IgY3JlYXRlIGEgbmV3IG9uZSlcclxuICAgICAgICAgIHRoaXMucmVzdWx0LnVwZGF0ZUFkZHJlc3NMaW5lKGtleSwgYWRkcmVzc0NvbXBvbmVudCwgJ2FkZHJlc3MtbGluZS1pbnB1dCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSGlkZSBjb3VudHJ5IGFuZCBhZGRyZXNzIHNlYXJjaCBmaWVsZHMgKGlmIHRoZXkgaGF2ZSBhICd0b2dnbGUnIGNsYXNzKVxyXG4gICAgICAgIHRoaXMudG9nZ2xlU2VhcmNoSW5wdXRzKCdoaWRlJyk7XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSB1c2VycyB0byBzZWFyY2ggYWdhaW4gc3Vic2VxdWVudGx5XHJcbiAgICAgICAgdGhpcy5oYXNTZWFyY2hJbnB1dEJlZW5SZXNldCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIElmIGFuIGFkZHJlc3MgbGluZSBpcyBhbHNvIHRoZSBtYWluIHNlYXJjaCBpbnB1dCwgc2V0IHByb3BlcnR5IHRvIGZhbHNlLlxyXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHR5cGluZyBpbiB0aGUgZmllbGQgYWdhaW4gKGFmdGVyIGFuIGFkZHJlc3MgaGFzIGJlZW5cclxuICAgICAgICAvLyByZXR1cm5lZCkgd2lsbCBub3QgdHJpZ2dlciBhIG5ldyBzZWFyY2guXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLkFVVE9DT01QTEVURSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IGluIHRoaXMub3B0aW9ucy5lbGVtZW50cykge1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMub3B0aW9ucy5lbGVtZW50cywgZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAvLyBFeGNsdWRpbmcgdGhlIGlucHV0IGl0c2VsZiwgZG9lcyBhbm90aGVyIGVsZW1lbnQgbWF0Y2ggdGhlIGlucHV0IGZpZWxkP1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSAnaW5wdXQnICYmIHRoaXMub3B0aW9ucy5lbGVtZW50c1tlbGVtZW50XSA9PT0gdGhpcy5pbnB1dHNbMF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2VhcmNoSW5wdXRCZWVuUmVzZXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSAnU2VhcmNoIGFnYWluJyBsaW5rIGFuZCBpbnNlcnQgaW50byBET01cclxuICAgICAgICB0aGlzLnJlc3VsdC5jcmVhdGVTZWFyY2hBZ2FpbkxpbmsoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRmlyZSBhbiBldmVudCB0byBzYXkgd2UndmUgZ290IHRoZSBmb3JtYXR0ZWQgYWRkcmVzc1xyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LWZvcm1hdHRpbmctc2VhcmNoJywgZGF0YSk7XHJcbiAgICB9LFxyXG4gICAgaGlkZTogKCkgPT4ge1xyXG4gICAgICAvLyBEZWxldGUgdGhlIGZvcm1hdHRlZCBhZGRyZXNzIGNvbnRhaW5lclxyXG4gICAgICBpZiAodGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIERlbGV0ZSB0aGUgc2VhcmNoIGFnYWluIGxpbmtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWFyY2hBZ2Fpbi5saW5rKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEFnYWluLmxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm9wdGlvbnMuc2VhcmNoQWdhaW4ubGluayk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnNlYXJjaEFnYWluLmxpbmsgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIHZhbHVlIGZyb20gdXNlcidzIHJlc3VsdCBmaWVsZFxyXG4gICAgICAvLyBMb29wIG92ZXIgdGhlaXIgZWxlbWVudHNcclxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IGluIHRoaXMub3B0aW9ucy5lbGVtZW50cykge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vcHRpb25zLmVsZW1lbnRzLCBlbGVtZW50KSkge1xyXG4gICAgICAgICAgLy8gSWYgaXQgbWF0Y2hlcyBhbiBcImFkZHJlc3NcIiBlbGVtZW50XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZmF1bHRzLmFkZHJlc3NMaW5lTGFiZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gZGVmYXVsdHMuYWRkcmVzc0xpbmVMYWJlbHNbaV07XHJcbiAgICAgICAgICAgIC8vIE9ubHkgcmVzZXQgdGhlIHZhbHVlIGlmIGl0J3Mgbm90IGFuIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgIGlmIChsYWJlbCA9PT0gZWxlbWVudCAmJiB0aGlzLm9wdGlvbnMuZWxlbWVudHNbZWxlbWVudF0gIT09IHRoaXMuaW5wdXRzWzBdKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVsZW1lbnRzW2VsZW1lbnRdLnZhbHVlID0gJyc7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjcmVhdGVBZGRyZXNzTGluZToge1xyXG4gICAgICAvLyBDcmVhdGUgYW4gaW5wdXQgdG8gc3RvcmUgdGhlIGFkZHJlc3MgbGluZVxyXG4gICAgICBpbnB1dDogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZXJcclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxhYmVsXHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xyXG4gICAgICAgIGxhYmVsLmlubmVySFRNTCA9IGtleS5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKSAvLyBBZGQgc3BhY2UgYmVmb3JlIGNhcGl0YWwgTGV0dGVyc1xyXG4gICAgICAgICAgLnJlcGxhY2UoLyhbMC05XSkvZywgJyAkMScpIC8vIEFkZCBzcGFjZSBiZWZvcmUgbnVtYmVyc1xyXG4gICAgICAgICAgLnJlcGxhY2UoL14uLywgZnVuY3Rpb24gKHN0cikge3JldHVybiBzdHIudG9VcHBlckNhc2UoKTt9KTsgLy8gTWFrZSBmaXJzdCBsZXR0ZXIgb2Ygd29yZCBhIGNhcGl0YWwgbGV0dGVyXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dFxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGtleSk7XHJcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIENyZWF0ZSB0aGUgYWRkcmVzcyBsaW5lIGxhYmVsIGJhc2VkIG9uIHRoZSBjb3VudHJ5IGFuZCBsYW5ndWFnZVxyXG4gICAgICBsYWJlbDogKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgbGV0IGxhYmVsID0ga2V5O1xyXG4gICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgY291bnRyeSA9IHRoaXMuY3VycmVudENvdW50cnlDb2RlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZExhYmVsID0gdHJhbnNsYXRpb25zW2xhbmd1YWdlXVtjb3VudHJ5XVtrZXldO1xyXG4gICAgICAgICAgICBpZiAodHJhbnNsYXRlZExhYmVsKSB7XHJcbiAgICAgICAgICAgICAgbGFiZWwgPSB0cmFuc2xhdGVkTGFiZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gVHJhbnNsYXRpb24gZG9lc24ndCBleGlzdCBmb3Iga2V5XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8vIENyZWF0ZSB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgY29udGFpbmVyIGFuZCBpbmplY3QgYWZ0ZXIgdGhlIGlucHV0XHJcbiAgICBjcmVhdGVGb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyOiAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZm9ybWF0dGVkLWFkZHJlc3MnKTtcclxuXHJcbiAgICAgIC8vIElmIFNpbmdsZWxpbmUgbW9kZSBpcyB1c2VkLCB0aGVuIGFwcGVuZCB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgYWZ0ZXIgdGhlIGxhc3QgaW5wdXQgZmllbGQsIG90aGVyd2lzZSB1c2UgdGhlIGZpcnN0IG9uZVxyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlNJTkdMRUxJTkUgPyB0aGlzLmlucHV0cy5sZW5ndGggLSAxIDogMDtcclxuXHJcbiAgICAgIC8vIEluc2VydCB0aGUgY29udGFpbmVyIGFmdGVyIHRoZSBpbnB1dFxyXG4gICAgICB0aGlzLmlucHV0c1twb3NpdGlvbl0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLmlucHV0c1twb3NpdGlvbl0ubmV4dFNpYmxpbmcpO1xyXG4gICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgfSxcclxuICAgIC8vIENyZWF0ZSBhIGhlYWRpbmcgZm9yIHRoZSBmb3JtYXR0ZWQgYWRkcmVzcyBjb250YWluZXJcclxuICAgIGNyZWF0ZUhlYWRpbmc6ICgpID0+IHtcclxuICAgICAgLy8gQ3JlYXRlIGEgaGVhZGluZyBmb3IgdGhlIGZvcm1hdHRlZCBhZGRyZXNzXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZykge1xyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMub3B0aW9ucy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmhlYWRpbmdUeXBlKTtcclxuICAgICAgICBoZWFkaW5nLmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnZhbGlkYXRlZEhlYWRpbmdUZXh0O1xyXG4gICAgICAgIHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvLyBVcGRhdGUgdGhlIGhlYWRpbmcgdGV4dCBpbiB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgY29udGFpbmVyXHJcbiAgICB1cGRhdGVIZWFkaW5nOiAodGV4dCkgPT4ge1xyXG4gICAgICAvL0NoYW5nZSB0aGUgaGVhZGluZyB0ZXh0IHRvIFwiTWFudWFsIGFkZHJlc3MgZW50ZXJlZFwiXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZykge1xyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IodGhpcy5vcHRpb25zLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuaGVhZGluZ1R5cGUpO1xyXG4gICAgICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGV4dDtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGNhbGN1bGF0ZUlmQWRkcmVzc0xpbmVHZW5lcmF0aW9uUmVxdWlyZWQ6ICgpID0+IHtcclxuICAgICAgdGhpcy5yZXN1bHQuZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkID0gdHJ1ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWZhdWx0cy5hZGRyZXNzTGluZUxhYmVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGRlZmF1bHRzLmFkZHJlc3NMaW5lTGFiZWxzW2ldO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWxlbWVudHNba2V5XSkge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHQuZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB1cGRhdGVBZGRyZXNzTGluZTogKGtleTogc3RyaW5nLCBhZGRyZXNzTGluZU9iamVjdCwgY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgLy8gRWl0aGVyIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSB1c2VyJ3MgYWRkcmVzcyBmaWVsZCBvciBjcmVhdGUgYSBuZXcgZmllbGQgZm9yIHRoZW1cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbGVtZW50c1trZXldKSB7XHJcbiAgICAgICAgY29uc3QgYWRkcmVzc0ZpZWxkID0gdGhpcy5vcHRpb25zLmVsZW1lbnRzW2tleV07XHJcbiAgICAgICAgdGhpcy5yZXN1bHQudXBkYXRlTGFiZWwoa2V5KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBhZGRyZXNzTGluZU9iamVjdDtcclxuICAgICAgICAvLyBJZiBhIHZhbHVlIGlzIGFscmVhZHkgcHJlc2VudCwgcHJlcGVuZCBhIGNvbW1hIGFuZCBzcGFjZVxyXG4gICAgICAgIGlmIChhZGRyZXNzRmllbGQudmFsdWUgJiYgdmFsdWUpIHtcclxuICAgICAgICAgIHZhbHVlID0gJywgJyArIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEZWNpZGUgd2hhdCBwcm9wZXJ0eSBvZiB0aGUgbm9kZSB3ZSBuZWVkIHRvIHVwZGF0ZS4gaS5lLiBpZiBpdCdzIG5vdCBhIGZvcm0gZmllbGQsIHVwZGF0ZSB0aGUgaW5uZXJUZXh0LlxyXG4gICAgICAgIGlmIChhZGRyZXNzRmllbGQubm9kZU5hbWUgPT09ICdJTlBVVCcgfHwgYWRkcmVzc0ZpZWxkLm5vZGVOYW1lID09PSAnVEVYVEFSRUEnIHx8IGFkZHJlc3NGaWVsZC5ub2RlTmFtZSA9PT0gJ1NFTEVDVCcpIHtcclxuICAgICAgICAgIGFkZHJlc3NGaWVsZC52YWx1ZSArPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWRkcmVzc0ZpZWxkLmlubmVyVGV4dCArPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3RvcmUgYSByZWNvcmQgb2YgdGhlaXIgbGFzdCBhZGRyZXNzIGZpZWxkXHJcbiAgICAgICAgdGhpcy5yZXN1bHQubGFzdEFkZHJlc3NGaWVsZCA9IGFkZHJlc3NGaWVsZDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc3VsdC5nZW5lcmF0ZUFkZHJlc3NMaW5lUmVxdWlyZWQpIHtcclxuICAgICAgICAvLyBDcmVhdGUgYW4gaW5wdXQgdG8gc3RvcmUgdGhlIGFkZHJlc3MgbGluZVxyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5yZXN1bHQuY3JlYXRlQWRkcmVzc0xpbmUubGFiZWwoa2V5KTtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMucmVzdWx0LmNyZWF0ZUFkZHJlc3NMaW5lLmlucHV0KGxhYmVsLCBhZGRyZXNzTGluZU9iamVjdCwgY2xhc3NOYW1lKTtcclxuICAgICAgICAvLyBJbnNlcnQgaW50byBET01cclxuICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmFwcGVuZENoaWxkKGZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8vIFVwZGF0ZSB0aGUgbGFiZWwgaWYgdHJhbnNsYXRpb24gaXMgcHJlc2VudFxyXG4gICAgdXBkYXRlTGFiZWw6IChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBsZXQgbGFiZWwgPSBrZXk7XHJcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5vcHRpb25zLmxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBpZiAodHJhbnNsYXRpb25zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRMYWJlbCA9IHRyYW5zbGF0aW9uc1tsYW5ndWFnZV1bY291bnRyeV1ba2V5XTtcclxuICAgICAgICAgIGlmICh0cmFuc2xhdGVkTGFiZWwpIHtcclxuICAgICAgICAgICAgbGFiZWwgPSB0cmFuc2xhdGVkTGFiZWw7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsYWJlbCcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmIChsYWJlbHNbaV0uaHRtbEZvciA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbHNbaV0uaW5uZXJIVE1MID0gdHJhbnNsYXRlZExhYmVsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIFRyYW5zbGF0aW9uIGRvZXNuJ3QgZXhpc3QgZm9yIGtleVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9LFxyXG4gICAgLy8gQ3JlYXRlIHRoZSAnU2VhcmNoIGFnYWluJyBsaW5rIHRoYXQgcmVzZXRzIHRoZSBzZWFyY2hcclxuICAgIGNyZWF0ZVNlYXJjaEFnYWluTGluazogKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEFnYWluLnZpc2libGUpIHtcclxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XHJcbiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtYWdhaW4tYnV0dG9uJyk7XHJcbiAgICAgICAgbGluay5pbm5lclRleHQgPSB0aGlzLm9wdGlvbnMuc2VhcmNoQWdhaW4udGV4dDtcclxuICAgICAgICAvLyBCaW5kIGV2ZW50IGxpc3RlbmVyXHJcbiAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZ2xvYmFsUmVzZXQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGxpbmsgZWxlbWVudFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5zZWFyY2hBZ2Fpbi5saW5rID0gbGluaztcclxuXHJcbiAgICAgICAgLy8gSW5zZXJ0IGludG8gdGhlIGZvcm1hdHRlZCBhZGRyZXNzIGNvbnRhaW5lclxyXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHQubGFzdEFkZHJlc3NGaWVsZCkge1xyXG4gICAgICAgICAgLy8gSW5zZXJ0IGFmdGVyIGxhc3QgYWRkcmVzcyBmaWVsZFxyXG4gICAgICAgICAgdGhpcy5yZXN1bHQubGFzdEFkZHJlc3NGaWVsZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsaW5rLCB0aGlzLnJlc3VsdC5sYXN0QWRkcmVzc0ZpZWxkLm5leHRTaWJsaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvLyBXcml0ZSB0aGUgbGlzdCBvZiBoaWRkZW4gYWRkcmVzcyBsaW5lIGlucHV0cyB0byB0aGUgRE9NXHJcbiAgICByZW5kZXJJbnB1dExpc3Q6IChpbnB1dEFycmF5KSA9PiB7XHJcbiAgICAgIGlmIChpbnB1dEFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuYXBwZW5kQ2hpbGQoaW5wdXRBcnJheVtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gZWl0aGVyIHNob3cgYSBwaWNrbGlzdCBvciBhIHZlcmlmaWVkIHJlc3VsdCBmcm9tIGEgVmFsaWRhdGUgcmVzcG9uc2VcclxuICAgIGhhbmRsZVZhbGlkYXRlUmVzcG9uc2U6IChyZXNwb25zZTogU2VhcmNoUmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdC5jb25maWRlbmNlID09PSAnVmVyaWZpZWQgbWF0Y2gnKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGFuIGFkZHJlc3MsIHRoZW4gdXNlIHRoaXMgZGlyZWN0bHkgaW4gdGhlIHJlc3VsdFxyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQuYWRkcmVzcykge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHQuc2hvdyhyZXNwb25zZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5yZXN1bHQuc3VnZ2VzdGlvbnMpIHtcclxuICAgICAgICAgIC8vIElmIHRoZSB2ZXJpZmllZCBtYXRjaCBzdGlsbCBjb250YWlucyBhIHN1Z2dlc3Rpb24sIHRoZW4gd2UgbmVlZCB0byBmb3JtYXQgdGhpcyBmaXJzdFxyXG4gICAgICAgICAgdGhpcy5mb3JtYXQocmVzcG9uc2UucmVzdWx0LnN1Z2dlc3Rpb25zWzBdLmZvcm1hdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnJlc3VsdC5zdWdnZXN0aW9ucykge1xyXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIG5lZWRzIHRvIHBpY2sgYSBzdWdnZXN0aW9uLCB0aGVuIGRpc3BsYXkgdGhlIHBpY2tsaXN0XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5zaG93KHJlc3BvbnNlKTtcclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5yZXN1bHQuY29uZmlkZW5jZSA9PT0gJ05vIG1hdGNoZXMnKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIHRoZW4gYWxsb3cgXCJ1c2UgYWRkcmVzcyBlbnRlcmVkXCJcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LmhhbmRsZUVtcHR5UGlja2xpc3QocmVzcG9uc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBjaGVja1RhYihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZXZlbnQpO1xyXG4gICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcclxuICAgICAgdGhpcy5waWNrbGlzdC5rZXl1cChldmVudCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIC8vIFByZXZlbnQgYW4gJ0VudGVyJyBrZXlwcmVzcyBvbiB0aGUgaW5wdXQgc3VibWl0dGluZyB0aGUgZm9ybVxyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWFyY2hTcGlubmVyID0ge1xyXG4gICAgc2hvdzogKCkgPT4ge1xyXG4gICAgICAvLyBSZXR1cm4gaWYgd2UncmUgbm90IGRpc3BsYXlpbmcgYSBzcGlubmVyXHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnVzZVNwaW5uZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ3JlYXRlIHRoZSBzcGlubmVyIGNvbnRhaW5lclxyXG4gICAgICBjb25zdCBzcGlubmVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIHNwaW5uZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbG9hZGVyJyk7XHJcbiAgICAgIHNwaW5uZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbG9hZGVyLWlubGluZScpO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIHRoZSBzcGlubmVyXHJcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCdzcGlubmVyJyk7XHJcbiAgICAgIHNwaW5uZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bpbm5lcik7XHJcblxyXG4gICAgICAvLyBJbnNlcnQgdGhlIHNwaW5uZXIgYWZ0ZXIgdGhlIGZpZWxkXHJcbiAgICAgIHRoaXMuaW5wdXRzWzBdLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShzcGlubmVyQ29udGFpbmVyLCB0aGlzLmlucHV0c1swXS5uZXh0U2libGluZyk7XHJcbiAgICB9LFxyXG5cclxuICAgIGhpZGU6ICgpID0+IHtcclxuICAgICAgLy8gUmV0dXJuIGlmIHdlJ3JlIG5vdCBkaXNwbGF5aW5nIGEgc3Bpbm5lclxyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy51c2VTcGlubmVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNwaW5uZXIgPSB0aGlzLmlucHV0c1swXS5wYXJlbnROb2RlPy5xdWVyeVNlbGVjdG9yKCcubG9hZGVyLWlubGluZScpO1xyXG4gICAgICBpZiAoc3Bpbm5lcikge1xyXG4gICAgICAgIHRoaXMuaW5wdXRzWzBdLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHNwaW5uZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8gVG9nZ2xlIHRoZSBcImhpZGRlblwiIGNsYXNzIHRvIGVpdGhlciBzaG93IG9yIGhpZGUgdGhlIGlucHV0IGFuZCBjb3VudHJ5IGZpZWxkKHMpXHJcbiAgcHJpdmF0ZSB0b2dnbGVTZWFyY2hJbnB1dHMoc3RhdGU6ICdzaG93JyB8ICdoaWRlJykge1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBzdGF0ZSA9PT0gJ3Nob3cnID8gJ3JlbW92ZScgOiAnYWRkJztcclxuICAgIHRoaXMub3B0aW9ucy5lbGVtZW50cy5pbnB1dHM/LmZvckVhY2goaW5wdXQgPT4gaW5wdXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcudG9nZ2xlJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0W21vZGlmaWVyXSgnaGlkZGVuJykpKTtcclxuICAgIHRoaXMub3B0aW9ucy5lbGVtZW50cy5jb3VudHJ5TGlzdD8ucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcudG9nZ2xlJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0W21vZGlmaWVyXSgnaGlkZGVuJykpO1xyXG4gICAgdGhpcy5vcHRpb25zLmVsZW1lbnRzLmxvb2t1cEJ1dHRvbj8ucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcudG9nZ2xlJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0W21vZGlmaWVyXSgnaGlkZGVuJykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnbG9iYWxSZXNldChldmVudD8pIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gICAgLy8gRW5hYmxlIHNlYXJjaGluZ1xyXG4gICAgdGhpcy5vcHRpb25zLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgLy8gSGlkZSBmb3JtYXR0ZWQgYWRkcmVzc1xyXG4gICAgdGhpcy5yZXN1bHQuaGlkZSgpO1xyXG4gICAgLy8gUmVzZXQgc2VhcmNoIGlucHV0IGJhY2tcclxuICAgIHRoaXMuaGFzU2VhcmNoSW5wdXRCZWVuUmVzZXQgPSB0cnVlO1xyXG5cclxuICAgIC8vIENsZWFyIHRoZSBpbnB1dCBmaWVsZChzKVxyXG4gICAgdGhpcy5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiBpbnB1dC52YWx1ZSA9ICcnKTtcclxuICAgIC8vIFJlbW92ZSB0aGUgcGlja2xpc3QgKGlmIHByZXNlbnQpXHJcbiAgICB0aGlzLnBpY2tsaXN0LmhpZGUoKTtcclxuICAgIC8vIFNob3cgc2VhcmNoIGlucHV0XHJcbiAgICB0aGlzLnRvZ2dsZVNlYXJjaElucHV0cygnc2hvdycpO1xyXG4gICAgLy8gQXBwbHkgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuaW5wdXRzWzBdLmZvY3VzKCk7XHJcblxyXG4gICAgLy8gRmlyZSBhbiBldmVudCBhZnRlciBhIHJlc2V0XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXJlc2V0Jyk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCBBZGRyZXNzVmFsaWRhdGlvbiBmcm9tICcuL2FkZHJlc3Mtc2VhcmNoJztcclxuXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgIEFkZHJlc3NWYWxpZGF0aW9uOiBhbnk7XHJcbiAgfVxyXG59XHJcblxyXG53aW5kb3cuQWRkcmVzc1ZhbGlkYXRpb24gPSBBZGRyZXNzVmFsaWRhdGlvbjsiXSwibmFtZXMiOlsiQWRkcmVzc1ZhbGlkYXRpb25Nb2RlIiwiY29sbGVjdGlvbiIsIm9uIiwiZXZlbnQiLCJhY3Rpb24iLCJ0aGlzIiwicHVzaCIsInRyaWdnZXIiLCJkYXRhIiwiaSIsImxlbmd0aCIsImFyZ3MiLCJhIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlIiwiaW5zdGFuY2UiLCJzZW5kIiwidXJsIiwibWV0aG9kIiwiY2FsbGJhY2siLCJoZWFkZXJzIiwiY3VycmVudFJlcXVlc3QiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJ0aW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIm9wdGlvbnMiLCJ0b2tlbiIsImZvckVhY2giLCJoZWFkZXIiLCJrZXkiLCJ2YWx1ZSIsIm9ubG9hZCIsInhociIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInNlYXJjaFNwaW5uZXIiLCJoaWRlIiwiZXZlbnRzIiwib25lcnJvciIsIm9udGltZW91dCIsImRlZmF1bHRzIiwic2VhcmNoVHlwZSIsIkFVVE9DT01QTEVURSIsImlucHV0IiwicGxhY2Vob2xkZXJUZXh0IiwiYXBwbHlGb2N1cyIsImZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIiLCJzaG93SGVhZGluZyIsImhlYWRpbmdUeXBlIiwidmFsaWRhdGVkSGVhZGluZ1RleHQiLCJtYW51YWxIZWFkaW5nVGV4dCIsInNlYXJjaEFnYWluIiwidmlzaWJsZSIsInRleHQiLCJ1c2VBZGRyZXNzRW50ZXJlZFRleHQiLCJ1c2VTcGlubmVyIiwibGFuZ3VhZ2UiLCJhZGRyZXNzTGluZUxhYmVscyIsImRhdGFzZXRDb2RlcyIsImNvdW50cnkiLCJpc28zQ29kZSIsImlzbzJDb2RlIiwiZGF0YXNldENvZGUiLCJ0cmFuc2xhdGlvbnMiLCJlbiIsImdiciIsImxvY2FsaXR5IiwicmVnaW9uIiwicG9zdGFsX2NvZGUiLCJ1c2EiLCJzaXplIiwibWF4U3VnZ2VzdGlvbnMiLCJiYXNlVXJsIiwic2VhcmNoRW5kcG9pbnQiLCJ2YWxpZGF0ZUVuZHBvaW50IiwicHJvbXB0c2V0RW5kcG9pbnQiLCJzdGVwSW5FbmRwb2ludCIsInJlZmluZUVuZHBvaW50IiwiZW5yaWNobWVudEVuZHBvaW50IiwicG93ZXJlZEJ5TG9nbyIsImVsZW1lbnQiLCJjcmVhdGUiLCJwaWNrbGlzdCIsIml0ZW0iLCJzdmciLCJmb3JtYXQiLCJsaXN0SXRlbSIsImNyZWF0ZUxpc3RJdGVtIiwiY2xhc3NMaXN0IiwiYWRkIiwibGlzdCIsInBhcmVudE5vZGUiLCJhcHBlbmRDaGlsZCIsImRlc3Ryb3kiLCJyZW1vdmVDaGlsZCIsInVuZGVmaW5lZCIsInJlc3VsdCIsImxhc3RBZGRyZXNzRmllbGQiLCJnZW5lcmF0ZUFkZHJlc3NMaW5lUmVxdWlyZWQiLCJzaG93IiwibGFzdFNlYXJjaFRlcm0iLCJhZGRyZXNzIiwiY29uZmlkZW5jZSIsImlucHV0cyIsImNhbGN1bGF0ZUlmQWRkcmVzc0xpbmVHZW5lcmF0aW9uUmVxdWlyZWQiLCJlbGVtZW50cyIsImNyZWF0ZUZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIiLCJPYmplY3QiLCJrZXlzIiwiYWRkcmVzc0NvbXBvbmVudCIsInVwZGF0ZUFkZHJlc3NMaW5lIiwidG9nZ2xlU2VhcmNoSW5wdXRzIiwiaGFzU2VhcmNoSW5wdXRCZWVuUmVzZXQiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJjcmVhdGVTZWFyY2hBZ2FpbkxpbmsiLCJsaW5rIiwiY3JlYXRlQWRkcmVzc0xpbmUiLCJjbGFzc05hbWUiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJsYWJlbCIsImlubmVySFRNTCIsInJlcGxhY2UiLCJzdHIiLCJ0b1VwcGVyQ2FzZSIsInNldEF0dHJpYnV0ZSIsInRvTG93ZXJDYXNlIiwiY3VycmVudENvdW50cnlDb2RlIiwidHJhbnNsYXRlZExhYmVsIiwiY29udGFpbmVyIiwicG9zaXRpb24iLCJTSU5HTEVMSU5FIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJjcmVhdGVIZWFkaW5nIiwiaGVhZGluZyIsInVwZGF0ZUhlYWRpbmciLCJxdWVyeVNlbGVjdG9yIiwiYWRkcmVzc0xpbmVPYmplY3QiLCJhZGRyZXNzRmllbGQiLCJ1cGRhdGVMYWJlbCIsIm5vZGVOYW1lIiwiaW5uZXJUZXh0IiwiZmllbGQiLCJsYWJlbHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImh0bWxGb3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZ2xvYmFsUmVzZXQiLCJiaW5kIiwicmVuZGVySW5wdXRMaXN0IiwiaW5wdXRBcnJheSIsImhhbmRsZVZhbGlkYXRlUmVzcG9uc2UiLCJyZXNwb25zZSIsInN1Z2dlc3Rpb25zIiwiaGFuZGxlRW1wdHlQaWNrbGlzdCIsInNwaW5uZXJDb250YWluZXIiLCJzcGlubmVyIiwibWVyZ2VEZWZhdWx0T3B0aW9ucyIsInNldHVwIiwic2V0VG9rZW4iLCJzZXRTZWFyY2hUeXBlIiwic2V0SW5wdXRzIiwiZ2V0RW5yaWNobWVudERhdGEiLCJnbG9iYWxBZGRyZXNzS2V5IiwiY291bnRyeV9pc28iLCJnbG9iYWxfYWRkcmVzc19rZXkiLCJhdHRyaWJ1dGVzIiwiZ2VvY29kZXMiLCJyZXF1ZXN0IiwiaGFuZGxlRW5yaWNobWVudFJlc3VsdCIsInN0cmluZ2lmeSIsInNldENvdW50cnlMaXN0IiwiY3JlYXRlUGlja2xpc3QiLCJzZXRUaW1lb3V0IiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsInJlc3VsdHMiLCJSZWdFeHAiLCJleGVjIiwibG9jYXRpb24iLCJzZWFyY2giLCJkZWNvZGVVUklDb21wb25lbnQiLCJjdXN0b21PcHRpb25zIiwiZW5hYmxlZCIsImdldFByb21wdHNldCIsImN1cnJlbnREYXRhU2V0IiwibG9va3VwRGF0YXNldENvZGUiLCJoYW5kbGVQcm9tcHRzZXRSZXN1bHQiLCJsaW5lcyIsImV4YW1wbGUiLCJwcm9tcHQiLCJzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoIiwiVkFMSURBVEUiLCJkYXRhc2V0cyIsIkFycmF5IiwiaXNBcnJheSIsInNlYXJjaF90eXBlIiwicHJvbXB0X3NldCIsImZpbmQiLCJkYXRhc2V0IiwiaW5jbHVkZXMiLCJyZWdpc3RlcklucHV0cyIsImxvb2t1cEJ1dHRvbiIsImxvb2t1cEZuIiwiZnJvbSIsImtleVVwRm4iLCJjaGVja1RhYkZuIiwiY2hlY2tUYWIiLCJoYW5kbGVLZXlib2FyZEV2ZW50IiwiY291bnRyeUNvZGVNYXBwaW5nIiwiZm9jdXMiLCJjb3VudHJ5TGlzdCIsImhhbmRsZUNvdW50cnlMaXN0Q2hhbmdlIiwiY291bnRyeUNvZGUiLCJFcnJvciIsImdlbmVyYXRlU2VhcmNoRGF0YUZvckFwaUNhbGwiLCJjb21wb25lbnRzIiwidW5zcGVjaWZpZWQiLCJjdXJyZW50U2VhcmNoVGVybSIsIm1heF9zdWdnZXN0aW9ucyIsIlZhbHVlIiwicHJldmVudERlZmF1bHQiLCJnZXRLZXkiLCJrZXl1cCIsIm1hcCIsImpvaW4iLCJjb3VudHJ5Q29kZUFuZERhdGFzZXQiLCJzcGxpdCIsImNhblNlYXJjaCIsImFib3J0IiwiUGlja2xpc3QiLCJ0YWJDb3VudCIsIml0ZW1zIiwiY3VycmVudEl0ZW0iLCJyZXNldFRhYkNvdW50IiwiY3JlYXRlTGlzdCIsInVzZUFkZHJlc3NFbnRlcmVkIiwicmVmaW5lIiwiaXNOZWVkZWQiLCJjcmVhdGVJbnB1dCIsInN1Z2dlc3Rpb25zX3Byb21wdCIsInN1Z2dlc3Rpb25zX2tleSIsImRpc3BsYXlTdWdnZXN0aW9uc0hlYWRlciIsImxpc3RlbiIsImRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlciIsInNjcm9sbEludG9WaWV3SWZOZWVkZWQiLCJyZW1vdmUiLCJoYW5kbGVFbXB0eVBpY2tsaXN0Q2FsbGJhY2siLCJ0aXRsZURpdiIsImNvbnRhaW5lckRpdiIsIm5leHRFbGVtZW50U2libGluZyIsIml0ZW1EaXYiLCJjbGljayIsIm91dE9mQm91bmRzVG9wIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG9wIiwib3V0T2ZCb3VuZHNCb3R0b20iLCJib3R0b20iLCJ3aW5kb3ciLCJpbm5lckhlaWdodCIsInNjcm9sbEludG9WaWV3IiwiZmlyc3RDaGlsZCIsImlucHV0RGF0YSIsImFkZHJlc3NfbGluZV8xIiwiYWRkcmVzc19saW5lXzIiLCJhZGRyZXNzX2xpbmVfMyIsImZvcm1hdE1hbnVhbEFkZHJlc3NMaW5lIiwibGluZU9iamVjdCIsImNoZWNrRW50ZXIiLCJyb3ciLCJhZGRNYXRjaGluZ0VtcGhhc2lzIiwiZW50ZXIiLCJidXR0b24iLCJLZXlib2FyZEV2ZW50IiwiTW91c2VFdmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInJlZmluZW1lbnQiLCJnZXRBdHRyaWJ1dGUiLCJmaXJzdEFkZHJlc3MiLCJsYXN0QWRkcmVzcyIsImFkZHJlc3NlcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjdXJyZW50bHlIaWdobGlnaHRlZCIsInByZXZpb3VzbHlIaWdobGlnaHRlZCIsImFkZHJlc3NMaXN0Q29vcmRzIiwib2Zmc2V0VG9wIiwib2Zmc2V0SGVpZ2h0Iiwic2Nyb2xsVG9wIiwiaGlnaGxpZ2h0cyIsIm1hdGNoZWQiLCJyZXBsYWNlbWVudCIsInN1YnN0cmluZyIsInBpY2siLCJwaWNrbGlzdEl0ZW0iLCJzdGF0ZSIsIm1vZGlmaWVyIiwiQWRkcmVzc1ZhbGlkYXRpb24iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +!function(){"use strict";var e,s=function(){function e(){this.collection={}}return e.prototype.on=function(e,s){this.collection[e]=this.collection[e]||[],this.collection[e].push(s)},e.prototype.trigger=function(e,s){if(this.collection[e])for(var o=0;o=200&&d.currentRequest.status<400){var s=JSON.parse(d.currentRequest.responseText);o(s)}else d.instance.searchSpinner.hide(),d.instance.events.trigger("request-error",e),d.instance.events.trigger("request-error-".concat(d.currentRequest.status),e)},this.currentRequest.onerror=function(e){d.instance.searchSpinner.hide(),d.instance.events.trigger("request-error",e)},this.currentRequest.ontimeout=function(e){d.instance.searchSpinner.hide(),d.instance.events.trigger("request-timeout",e)},this.currentRequest.send(t)},e}();!function(e){e.AUTOCOMPLETE="autocomplete",e.SINGLELINE="singleline",e.VALIDATE="validate"}(e||(e={}));var a={enableWhat3Words:!0,searchType:e.AUTOCOMPLETE,input:{placeholderText:"Start typing an address...",applyFocus:!1},formattedAddressContainer:{showHeading:!1,headingType:"h3",validatedHeadingText:"Validated address",manualHeadingText:"Manual address entered"},searchAgain:{visible:!0,text:"Search again"},useAddressEnteredText:" - Use address entered or try again...",useSpinner:!1,language:"en",addressLineLabels:["address_line_1","address_line_2","address_line_3","locality","region","postal_code","country"]},d=[{country:"Afghanistan",iso3Code:"AFG",iso2Code:"AF",datasetCode:"af-address-ed",searchType:"singleline, validate"},{country:"Afghanistan",iso3Code:"AFG",iso2Code:"AF",datasetCode:"af-address-eh",searchType:"autocomplete"},{country:"Albania",iso3Code:"ALB",iso2Code:"AL",datasetCode:"al-address-ed",searchType:"singleline, validate"},{country:"Albania",iso3Code:"ALB",iso2Code:"AL",datasetCode:"al-address-eh",searchType:"autocomplete"},{country:"Algeria",iso3Code:"DZA",iso2Code:"DZ",datasetCode:"dz-address-ed",searchType:"singleline, validate"},{country:"Algeria",iso3Code:"DZA",iso2Code:"DZ",datasetCode:"dz-address-eh",searchType:"autocomplete"},{country:"American Samoa",iso3Code:"ASM",iso2Code:"AS",datasetCode:"as-address-eh",searchType:"autocomplete"},{country:"Andorra",iso3Code:"AND",iso2Code:"AD",datasetCode:"ad-address-ed",searchType:"singleline, validate"},{country:"Andorra",iso3Code:"AND",iso2Code:"AD",datasetCode:"ad-address-eh",searchType:"autocomplete"},{country:"Angola",iso3Code:"AGO",iso2Code:"AO",datasetCode:"ao-address-ed",searchType:"singleline, validate"},{country:"Angola",iso3Code:"AGO",iso2Code:"AO",datasetCode:"ao-address-eh",searchType:"autocomplete"},{country:"Anguilla",iso3Code:"AIA",iso2Code:"AI",datasetCode:"ai-address-eh",searchType:"autocomplete"},{country:"Antarctica",iso3Code:"ATA",iso2Code:"AQ",datasetCode:"aq-address-ed",searchType:"singleline, validate"},{country:"Antigua and Barbuda",iso3Code:"ATG",iso2Code:"AG",datasetCode:"ag-address-ed",searchType:"singleline, validate"},{country:"Antigua and Barbuda",iso3Code:"ATG",iso2Code:"AG",datasetCode:"ag-address-eh",searchType:"autocomplete"},{country:"Argentina",iso3Code:"ARG",iso2Code:"AR",datasetCode:"ar-address-ed",searchType:"singleline, validate"},{country:"Argentina",iso3Code:"ARG",iso2Code:"AR",datasetCode:"ar-address-eh",searchType:"autocomplete"},{country:"Armenia",iso3Code:"ARM",iso2Code:"AM",datasetCode:"am-address-ed",searchType:"singleline, validate"},{country:"Armenia",iso3Code:"ARM",iso2Code:"AM",datasetCode:"am-address-eh",searchType:"autocomplete"},{country:"Aruba",iso3Code:"ABW",iso2Code:"AW",datasetCode:"aw-address-ed",searchType:"singleline, validate"},{country:"Aruba",iso3Code:"ABW",iso2Code:"AW",datasetCode:"aw-address-eh",searchType:"autocomplete"},{country:"Australia DataFusion",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address-datafusion",searchType:"autocomplete, singleline, typedown"},{country:"Australia Geocoded National Address",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address-gnaf",searchType:"autocomplete, singleline, typedown, validate"},{country:"Australia Postal Address",iso3Code:"AUS",iso2Code:"AU",datasetCode:"au-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Austria",iso3Code:"AUT",iso2Code:"AT",datasetCode:"at-address-eh",searchType:"autocomplete"},{country:"Austria",iso3Code:"AUT",iso2Code:"AT",datasetCode:"az-address-ed",searchType:"singleline, validate"},{country:"Azerbaijan",iso3Code:"AZE",iso2Code:"AZ",datasetCode:"az-address-ed",searchType:"singleline, validate"},{country:"Azerbaijan",iso3Code:"AZE",iso2Code:"AZ",datasetCode:"az-address-eh",searchType:"autocomplete"},{country:"Bahamas",iso3Code:"BHS",iso2Code:"BS",datasetCode:"bs-address-ed",searchType:"singleline, validate"},{country:"Bahamas",iso3Code:"BHS",iso2Code:"BS",datasetCode:"bs-address-eh",searchType:"autocomplete"},{country:"Bahrain",iso3Code:"BHR",iso2Code:"BH",datasetCode:"bh-address-ed",searchType:"singleline, validate"},{country:"Bahrain",iso3Code:"BHR",iso2Code:"BH",datasetCode:"bh-address-eh",searchType:"autocomplete"},{country:"Bangladesh",iso3Code:"BGD",iso2Code:"BD",datasetCode:"bd-address-ed",searchType:"singleline, validate"},{country:"Bangladesh",iso3Code:"BGD",iso2Code:"BD",datasetCode:"bd-address-eh",searchType:"autocomplete"},{country:"Barbados",iso3Code:"BRB",iso2Code:"BB",datasetCode:"bb-address-ed",searchType:"singleline, validate"},{country:"Barbados",iso3Code:"BRB",iso2Code:"BB",datasetCode:"bb-address-eh",searchType:"autocomplete"},{country:"Belarus",iso3Code:"BLR",iso2Code:"BY",datasetCode:"by-address-ed",searchType:"singleline, validate"},{country:"Belarus",iso3Code:"BLR",iso2Code:"BY",datasetCode:"by-address-eh",searchType:"autocomplete"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address",searchType:"singleline, typedown"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address-ed",searchType:" validate"},{country:"Belgium",iso3Code:"BEL",iso2Code:"BE",datasetCode:"be-address-eh",searchType:"autocomplete"},{country:"Belize",iso3Code:"BLZ",iso2Code:"BZ",datasetCode:"bz-address-ed",searchType:"singleline, validate"},{country:"Belize",iso3Code:"BLZ",iso2Code:"BZ",datasetCode:"bz-address-eh",searchType:"autocomplete"},{country:"Benin",iso3Code:"BEN",iso2Code:"BJ",datasetCode:"bj-address-ed",searchType:"singleline, validate"},{country:"Benin",iso3Code:"BEN",iso2Code:"BJ",datasetCode:"bj-address-eh",searchType:"autocomplete"},{country:"Bermuda",iso3Code:"BMU",iso2Code:"BM",datasetCode:"bm-address-ed",searchType:"singleline, validate"},{country:"Bermuda",iso3Code:"BMU",iso2Code:"BM",datasetCode:"bm-address-eh",searchType:"autocomplete"},{country:"Bhutan",iso3Code:"BTN",iso2Code:"BT",datasetCode:"bt-address-ed",searchType:"singleline, validate"},{country:"Bhutan",iso3Code:"BTN",iso2Code:"BT",datasetCode:"bt-address-eh",searchType:"autocomplete"},{country:"Bolivia",iso3Code:"BOL",iso2Code:"BO",datasetCode:"bo-address-ed",searchType:"singleline, validate"},{country:"Bolivia",iso3Code:"BOL",iso2Code:"BO",datasetCode:"bo-address-eh",searchType:"autocomplete"},{country:"Bonaire, Sint Eustatius and Saba",iso3Code:"BES",iso2Code:"BQ",datasetCode:"bq-address-ed",searchType:"singleline, validate"},{country:"Bonaire, Sint Eustatius and Saba",iso3Code:"BES",iso2Code:"BQ",datasetCode:"bq-address-eh",searchType:"autocomplete"},{country:"Bosnia and Herzegovina",iso3Code:"BIH",iso2Code:"BA",datasetCode:"ba-address-ed",searchType:"singleline, validate"},{country:"Bosnia and Herzegovina",iso3Code:"BIH",iso2Code:"BA",datasetCode:"ba-address-eh",searchType:"autocomplete"},{country:"Botswana",iso3Code:"BWA",iso2Code:"BW",datasetCode:"bw-address-ed",searchType:"singleline, validate"},{country:"Botswana",iso3Code:"BWA",iso2Code:"BW",datasetCode:"bw-address-eh",searchType:"autocomplete"},{country:"Brazil",iso3Code:"BRA",iso2Code:"BR",datasetCode:"br-address-ed",searchType:"singleline, validate"},{country:"Brazil",iso3Code:"BRA",iso2Code:"BR",datasetCode:"br-address-eh",searchType:"autocomplete"},{country:"Brunei Darussalam",iso3Code:"BRN",iso2Code:"BN",datasetCode:"bn-address-ed",searchType:"singleline, validate"},{country:"Brunei Darussalam",iso3Code:"BRN",iso2Code:"BN",datasetCode:"bn-address-eh",searchType:"autocomplete"},{country:"Bulgaria",iso3Code:"BGR",iso2Code:"BG",datasetCode:"bg-address-ed",searchType:"singleline, validate"},{country:"Bulgaria",iso3Code:"BGR",iso2Code:"BG",datasetCode:"bg-address-eh",searchType:"autocomplete"},{country:"Burkina Faso",iso3Code:"BFA",iso2Code:"BF",datasetCode:"bf-address-ed",searchType:"singleline, validate"},{country:"Burkina Faso",iso3Code:"BFA",iso2Code:"BF",datasetCode:"bf-address-eh",searchType:"autocomplete"},{country:"Burundi",iso3Code:"BDI",iso2Code:"BI",datasetCode:"bi-address-eh",searchType:"autocomplete"},{country:"Cambodia",iso3Code:"KHM",iso2Code:"KH",datasetCode:"kh-address-ed",searchType:"singleline, validate"},{country:"Cambodia",iso3Code:"KHM",iso2Code:"KH",datasetCode:"kh-address-eh",searchType:"autocomplete"},{country:"Cameroon",iso3Code:"CMR",iso2Code:"CM",datasetCode:"cm-address-ed",searchType:"singleline, validate"},{country:"Cameroon",iso3Code:"CMR",iso2Code:"CM",datasetCode:"cm-address-eh",searchType:"autocomplete"},{country:"Canada",iso3Code:"CAN",iso2Code:"CA",datasetCode:"ca-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Cape Verde",iso3Code:"CPV",iso2Code:"CV",datasetCode:"cv-address-ed",searchType:"singleline, validate"},{country:"Cape Verde",iso3Code:"CPV",iso2Code:"CV",datasetCode:"cv-address-eh",searchType:"autocomplete"},{country:"Cayman Islands",iso3Code:"CYM",iso2Code:"KY",datasetCode:"ky-address-ed",searchType:"singleline, validate"},{country:"Cayman Islands",iso3Code:"CYM",iso2Code:"KY",datasetCode:"ky-address-eh",searchType:"autocomplete"},{country:"Central African Republic",iso3Code:"CAF",iso2Code:"CF",datasetCode:"cf-address-ed",searchType:"singleline, validate"},{country:"Central African Republic",iso3Code:"CAF",iso2Code:"CF",datasetCode:"cf-address-eh",searchType:"autocomplete"},{country:"Chad",iso3Code:"TCD",iso2Code:"TD",datasetCode:"td-address-ed",searchType:"singleline, validate"},{country:"Chad",iso3Code:"TCD",iso2Code:"TD",datasetCode:"td-address-eh",searchType:"autocomplete"},{country:"Chile",iso3Code:"CHL",iso2Code:"CL",datasetCode:"cl-address-ed",searchType:"singleline, validate"},{country:"Chile",iso3Code:"CHL",iso2Code:"CL",datasetCode:"cl-address-eh",searchType:"autocomplete"},{country:"China",iso3Code:"CHN",iso2Code:"CN",datasetCode:"cn-address-ed",searchType:"singleline, validate"},{country:"China",iso3Code:"CHN",iso2Code:"CN",datasetCode:"cn-address-eh",searchType:"autocomplete"},{country:"Christmas Island",iso3Code:"CXR",iso2Code:"CX",datasetCode:"cx-address-eh",searchType:"autocomplete"},{country:"Cocos Island",iso3Code:"CCK",iso2Code:"CC",datasetCode:"cc-address-eh",searchType:"autocomplete"},{country:"Colombia",iso3Code:"COL",iso2Code:"CO",datasetCode:"co-address-ed",searchType:"singleline, validate"},{country:"Colombia",iso3Code:"COL",iso2Code:"CO",datasetCode:"co-address-eh",searchType:"autocomplete"},{country:"Comoros",iso3Code:"COM",iso2Code:"KM",datasetCode:"km-address-ed",searchType:"singleline, validate"},{country:"Comoros",iso3Code:"COM",iso2Code:"KM",datasetCode:"km-address-eh",searchType:"autocomplete"},{country:"Congo",iso3Code:"COG",iso2Code:"CG",datasetCode:"cg-address-ed",searchType:"singleline, validate"},{country:"Congo",iso3Code:"COG",iso2Code:"CG",datasetCode:"cg-address-eh",searchType:"autocomplete"},{country:"Congo, The Democratic Republic of the",iso3Code:"COD",iso2Code:"CD",datasetCode:"cd-address-ed",searchType:"singleline, validate"},{country:"Congo, The Democratic Republic of the",iso3Code:"COD",iso2Code:"CD",datasetCode:"cd-address-eh",searchType:"autocomplete"},{country:"Cook Islands",iso3Code:"COK",iso2Code:"CK",datasetCode:"ck-address-ed",searchType:"singleline, validate"},{country:"Cook Islands",iso3Code:"COK",iso2Code:"CK",datasetCode:"ck-address-eh",searchType:"autocomplete"},{country:"Costa Rica",iso3Code:"CRI",iso2Code:"CR",datasetCode:"cr-address-ed",searchType:"singleline, validate"},{country:"Costa Rica",iso3Code:"CRI",iso2Code:"CR",datasetCode:"cr-address-eh",searchType:"autocomplete"},{country:"Croatia",iso3Code:"HRV",iso2Code:"HR",datasetCode:"hr-address-ed",searchType:"singleline, validate"},{country:"Croatia",iso3Code:"HRV",iso2Code:"HR",datasetCode:"hr-address-eh",searchType:"autocomplete"},{country:"Cuba",iso3Code:"CUB",iso2Code:"CU",datasetCode:"cu-address-ed",searchType:"singleline, validate"},{country:"Cuba",iso3Code:"CUB",iso2Code:"CU",datasetCode:"cu-address-eh",searchType:"autocomplete"},{country:"Curaçao",iso3Code:"CUW",iso2Code:"CW",datasetCode:"cw-address-ed",searchType:"singleline, validate"},{country:"Curaçao",iso3Code:"CUW",iso2Code:"CW",datasetCode:"cw-address-eh",searchType:"autocomplete"},{country:"Cyprus",iso3Code:"CYP",iso2Code:"CY",datasetCode:"cy-address-ed",searchType:"singleline, validate"},{country:"Cyprus",iso3Code:"CYP",iso2Code:"CY",datasetCode:"cy-address-eh",searchType:"autocomplete"},{country:"Czech Republic",iso3Code:"CZE",iso2Code:"CZ",datasetCode:"cz-address-ed",searchType:"singleline, validate"},{country:"Czech Republic",iso3Code:"CZE",iso2Code:"CZ",datasetCode:"cz-address-eh",searchType:"autocomplete"},{country:"Côte d'Ivoire",iso3Code:"CIV",iso2Code:"CI",datasetCode:"ci-address-ed",searchType:"singleline, validate"},{country:"Côte d'Ivoire",iso3Code:"CIV",iso2Code:"CI",datasetCode:"ci-address-eh",searchType:"autocomplete"},{country:"Denmark",iso3Code:"DNK",iso2Code:"DK",datasetCode:"dk-address-ed",searchType:"singleline, validate"},{country:"Denmark",iso3Code:"DNK",iso2Code:"DK",datasetCode:"dk-address-eh",searchType:"autocomplete"},{country:"Djibouti",iso3Code:"DJI",iso2Code:"DJ",datasetCode:"dj-address-ed",searchType:"singleline, validate"},{country:"Djibouti",iso3Code:"DJI",iso2Code:"DJ",datasetCode:"dj-address-eh",searchType:"autocomplete"},{country:"Dominica",iso3Code:"DMA",iso2Code:"DM",datasetCode:"dm-address-ed",searchType:"singleline, validate"},{country:"Dominica",iso3Code:"DMA",iso2Code:"DM",datasetCode:"dm-address-eh",searchType:"autocomplete"},{country:"Dominican Republic",iso3Code:"DOM",iso2Code:"DO",datasetCode:"do-address-ed",searchType:"singleline, validate"},{country:"Dominican Republic",iso3Code:"DOM",iso2Code:"DO",datasetCode:"do-address-eh",searchType:"autocomplete"},{country:"Ecuador",iso3Code:"ECU",iso2Code:"EC",datasetCode:"ec-address-ed",searchType:"singleline, validate"},{country:"Ecuador",iso3Code:"ECU",iso2Code:"EC",datasetCode:"ec-address-eh",searchType:"autocomplete"},{country:"Egypt",iso3Code:"EGY",iso2Code:"EG",datasetCode:"eg-address-ed",searchType:"singleline, validate"},{country:"Egypt",iso3Code:"EGY",iso2Code:"EG",datasetCode:"eg-address-eh",searchType:"autocomplete"},{country:"El Salvador",iso3Code:"SLV",iso2Code:"SV",datasetCode:"sv-address-ed",searchType:"singleline, validate"},{country:"El Salvador",iso3Code:"SLV",iso2Code:"SV",datasetCode:"sv-address-eh",searchType:"autocomplete"},{country:"Equatorial Guinea",iso3Code:"GNQ",iso2Code:"GQ",datasetCode:"gq-address-ed",searchType:"singleline, validate"},{country:"Equatorial Guinea",iso3Code:"GNQ",iso2Code:"GQ",datasetCode:"gq-address-eh",searchType:"autocomplete"},{country:"Eritrea",iso3Code:"ERI",iso2Code:"ER",datasetCode:"er-address-ed",searchType:"singleline, validate"},{country:"Eritrea",iso3Code:"ERI",iso2Code:"ER",datasetCode:"er-address-eh",searchType:"autocomplete"},{country:"Estonia",iso3Code:"EST",iso2Code:"EE",datasetCode:"ee-address-ed",searchType:"singleline, validate"},{country:"Estonia",iso3Code:"EST",iso2Code:"EE",datasetCode:"ee-address-eh",searchType:"autocomplete"},{country:"Ethiopia",iso3Code:"ETH",iso2Code:"ET",datasetCode:"et-address-ed",searchType:"singleline, validate"},{country:"Ethiopia",iso3Code:"ETH",iso2Code:"ET",datasetCode:"et-address-eh",searchType:"autocomplete"},{country:"Falkland Islands (Malvinas)",iso3Code:"FLK",iso2Code:"FK",datasetCode:"fk-address-eh",searchType:"autocomplete"},{country:"Faroe Islands",iso3Code:"FRO",iso2Code:"FO",datasetCode:"fo-address-ed",searchType:"singleline, validate"},{country:"Faroe Islands",iso3Code:"FRO",iso2Code:"FO",datasetCode:"fo-address-eh",searchType:"autocomplete"},{country:"Fiji",iso3Code:"FJI",iso2Code:"FJ",datasetCode:"fj-address-ed",searchType:"singleline, validate"},{country:"Fiji",iso3Code:"FJI",iso2Code:"FJ",datasetCode:"fj-address-eh",searchType:"autocomplete"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address",searchType:"singleline, typedown"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address-ed",searchType:"validate"},{country:"Finland",iso3Code:"FIN",iso2Code:"FI",datasetCode:"fi-address-eh",searchType:"autocomplete"},{country:"France Street Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-address-streetlevel",searchType:"singleline, typedown, validate"},{country:"France Sub-Premises Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-additional-hexaline3",searchType:"autocomplete, singleline, typedown"},{country:"France Premises Level",iso3Code:"FRA",iso2Code:"FR",datasetCode:"fr-address",searchType:"singleline, typedown, validate"},{country:"French Guiana",iso3Code:"GUF",iso2Code:"GF",datasetCode:"gf-address-eh",searchType:"autocomplete"},{country:"French Polynesia",iso3Code:"PYF",iso2Code:"PF",datasetCode:"pf-address-eh",searchType:"autocomplete"},{country:"Gabon",iso3Code:"GAB",iso2Code:"GA",datasetCode:"ga-address-ed",searchType:"singleline, validate"},{country:"Gabon",iso3Code:"GAB",iso2Code:"GA",datasetCode:"ga-address-eh",searchType:"autocomplete"},{country:"Gambia",iso3Code:"GMB",iso2Code:"GM",datasetCode:"gm-address-ed",searchType:"singleline, validate"},{country:"Gambia",iso3Code:"GMB",iso2Code:"GM",datasetCode:"gm-address-eh",searchType:"autocomplete"},{country:"Georgia",iso3Code:"GEO",iso2Code:"GE",datasetCode:"ge-address-ed",searchType:"singleline, validate"},{country:"Georgia",iso3Code:"GEO",iso2Code:"GE",datasetCode:"ge-address-eh",searchType:"autocomplete"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address",searchType:"singleline, typedown, validate"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address-ed",searchType:"validate"},{country:"Germany",iso3Code:"DEU",iso2Code:"DE",datasetCode:"de-address-eh",searchType:"autocomplete"},{country:"Ghana",iso3Code:"GHA",iso2Code:"GH",datasetCode:"gh-address-ed",searchType:"singleline, validate"},{country:"Ghana",iso3Code:"GHA",iso2Code:"GH",datasetCode:"gh-address-eh",searchType:"autocomplete"},{country:"Gibraltar",iso3Code:"GIB",iso2Code:"GI",datasetCode:"gi-address-eh",searchType:"autocomplete"},{country:"Greece",iso3Code:"GRC",iso2Code:"GR",datasetCode:"gr-address-ed",searchType:"singleline, validate"},{country:"Greece",iso3Code:"GRC",iso2Code:"GR",datasetCode:"gr-address-eh",searchType:"autocomplete"},{country:"Greenland",iso3Code:"GRL",iso2Code:"GL",datasetCode:"gl-address-ed",searchType:"singleline, validate"},{country:"Greenland",iso3Code:"GRL",iso2Code:"GL",datasetCode:"gl-address-eh",searchType:"autocomplete"},{country:"Grenada",iso3Code:"GRD",iso2Code:"GD",datasetCode:"gd-address-ed",searchType:"singleline, validate"},{country:"Grenada",iso3Code:"GRD",iso2Code:"GD",datasetCode:"gd-address-eh",searchType:"autocomplete"},{country:"Guadeloupe",iso3Code:"GLP",iso2Code:"GP",datasetCode:"gp-address-eh",searchType:"autocomplete"},{country:"Guam",iso3Code:"GUM",iso2Code:"GU",datasetCode:"gu-address-eh",searchType:"autocomplete"},{country:"Guatemala",iso3Code:"GTM",iso2Code:"GT",datasetCode:"gt-address-ed",searchType:"singleline, validate"},{country:"Guatemala",iso3Code:"GTM",iso2Code:"GT",datasetCode:"gt-address-eh",searchType:"autocomplete"},{country:"Guinea",iso3Code:"GIN",iso2Code:"GN",datasetCode:"gn-address-ed",searchType:"singleline, validate"},{country:"Guinea",iso3Code:"GIN",iso2Code:"GN",datasetCode:"gn-address-eh",searchType:"autocomplete"},{country:"Guinea-Bissau",iso3Code:"GNB",iso2Code:"GW",datasetCode:"gw-address-ed",searchType:"singleline, validate"},{country:"Guinea-Bissau",iso3Code:"GNB",iso2Code:"GW",datasetCode:"gw-address-eh",searchType:"autocomplete"},{country:"Guyana",iso3Code:"GUY",iso2Code:"GY",datasetCode:"gy-address-ed",searchType:"singleline, validate"},{country:"Guyana",iso3Code:"GUY",iso2Code:"GY",datasetCode:"gy-address-eh",searchType:"autocomplete"},{country:"Haiti",iso3Code:"HTI",iso2Code:"HT",datasetCode:"ht-address-ed",searchType:"singleline, validate"},{country:"Haiti",iso3Code:"HTI",iso2Code:"HT",datasetCode:"ht-address-eh",searchType:"autocomplete"},{country:"Honduras",iso3Code:"HND",iso2Code:"HN",datasetCode:"hn-address-ed",searchType:"singleline, validate"},{country:"Honduras",iso3Code:"HND",iso2Code:"HN",datasetCode:"hn-address-eh",searchType:"autocomplete"},{country:"Hong Kong",iso3Code:"HKG",iso2Code:"HK",datasetCode:"hk-address-ed",searchType:"singleline, validate"},{country:"Hong Kong",iso3Code:"HKG",iso2Code:"HK",datasetCode:"hk-address-eh",searchType:"autocomplete"},{country:"Hungary",iso3Code:"HUN",iso2Code:"HU",datasetCode:"hu-address-ed",searchType:"singleline, validate"},{country:"Hungary",iso3Code:"HUN",iso2Code:"HU",datasetCode:"hu-address-eh",searchType:"autocomplete"},{country:"Iceland",iso3Code:"ISL",iso2Code:"IS",datasetCode:"is-address-ed",searchType:"singleline, validate"},{country:"Iceland",iso3Code:"ISL",iso2Code:"IS",datasetCode:"is-address-eh",searchType:"autocomplete"},{country:"India",iso3Code:"IND",iso2Code:"IN",datasetCode:"in-address-ed",searchType:"singleline, validate"},{country:"India",iso3Code:"IND",iso2Code:"IN",datasetCode:"in-address-eh",searchType:"autocomplete"},{country:"Indonesia",iso3Code:"IDN",iso2Code:"ID",datasetCode:"id-address-ed",searchType:"singleline, validate"},{country:"Indonesia",iso3Code:"IDN",iso2Code:"ID",datasetCode:"id-address-eh",searchType:"autocomplete"},{country:"Iran, Islamic Republic of",iso3Code:"IRN",iso2Code:"IR",datasetCode:"ir-address-ed",searchType:"singleline, validate"},{country:"Iran, Islamic Republic of",iso3Code:"IRN",iso2Code:"IR",datasetCode:"ir-address-eh",searchType:"autocomplete"},{country:"Iraq",iso3Code:"IRQ",iso2Code:"IQ",datasetCode:"iq-address-ed",searchType:"singleline, validate"},{country:"Iraq",iso3Code:"IRQ",iso2Code:"IQ",datasetCode:"iq-address-eh",searchType:"autocomplete"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address",searchType:"singleline, typedown"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-ed",searchType:"singleline, validate"},{country:"Ireland",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-eh",searchType:"autocomplete"},{country:"Ireland Eircode",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-additional-eircode",searchType:"autocomplete"},{country:"Ireland ECAD",iso3Code:"IRL",iso2Code:"IE",datasetCode:"ie-address-ecad",searchType:"autocomplete"},{country:"Israel",iso3Code:"ISR",iso2Code:"IL",datasetCode:"il-address-ed",searchType:"singleline, validate"},{country:"Israel",iso3Code:"ISR",iso2Code:"IL",datasetCode:"il-address-eh",searchType:"autocomplete"},{country:"Italy",iso3Code:"ITA",iso2Code:"IT",datasetCode:"it-address-ed",searchType:"singleline, validate"},{country:"Italy",iso3Code:"ITA",iso2Code:"IT",datasetCode:"it-address-eh",searchType:"autocomplete"},{country:"Jamaica",iso3Code:"JAM",iso2Code:"JM",datasetCode:"jm-address-ed",searchType:"singleline, validate"},{country:"Jamaica",iso3Code:"JAM",iso2Code:"JM",datasetCode:"jm-address-eh",searchType:"autocomplete"},{country:"Japan",iso3Code:"JPN",iso2Code:"JP",datasetCode:"jp-address-ed",searchType:"singleline, validate"},{country:"Japan",iso3Code:"JPN",iso2Code:"JP",datasetCode:"jp-address",searchType:"singleline, validate"},{country:"Jordan",iso3Code:"JOR",iso2Code:"JO",datasetCode:"jo-address-ed",searchType:"singleline, validate"},{country:"Jordan",iso3Code:"JOR",iso2Code:"JO",datasetCode:"jo-address-eh",searchType:"autocomplete"},{country:"Kazakhstan",iso3Code:"KAZ",iso2Code:"KZ",datasetCode:"kz-address-ed",searchType:"singleline, validate"},{country:"Kazakhstan",iso3Code:"KAZ",iso2Code:"KZ",datasetCode:"kz-address-eh",searchType:"autocomplete"},{country:"Kenya",iso3Code:"KEN",iso2Code:"KE",datasetCode:"ke-address-ed",searchType:"singleline, validate"},{country:"Kenya",iso3Code:"KEN",iso2Code:"KE",datasetCode:"ke-address-eh",searchType:"autocomplete"},{country:"Kiribati",iso3Code:"KIR",iso2Code:"KI",datasetCode:"ki-address-ed",searchType:"singleline, validate"},{country:"Kiribati",iso3Code:"KIR",iso2Code:"KI",datasetCode:"ki-address-eh",searchType:"autocomplete"},{country:"Korea, Democratic People's Republic of",iso3Code:"PRK",iso2Code:"KP",datasetCode:"kp-address-ed",searchType:"singleline, validate"},{country:"Korea, Democratic People's Republic of",iso3Code:"PRK",iso2Code:"KP",datasetCode:"kp-address-eh",searchType:"autocomplete"},{country:"Korea, Republic of",iso3Code:"KOR",iso2Code:"KR",datasetCode:"kr-address-ed",searchType:"singleline, validate"},{country:"Korea, Republic of",iso3Code:"KOR",iso2Code:"KR",datasetCode:"kr-address-eh",searchType:"autocomplete"},{country:"Kosovo",iso3Code:"KOS",iso2Code:"XK",datasetCode:"kv-address-eh",searchType:"autocomplete"},{country:"Kuwait",iso3Code:"KWT",iso2Code:"KW",datasetCode:"kw-address-ed",searchType:"singleline, validate"},{country:"Kuwait",iso3Code:"KWT",iso2Code:"KW",datasetCode:"kw-address-eh",searchType:"autocomplete"},{country:"Kyrgyzstan",iso3Code:"KGZ",iso2Code:"KG",datasetCode:"kg-address-ed",searchType:"singleline, validate"},{country:"Kyrgyzstan",iso3Code:"KGZ",iso2Code:"KG",datasetCode:"kg-address-eh",searchType:"autocomplete"},{country:"Laos",iso3Code:"LAO",iso2Code:"LA",datasetCode:"la-address-ed",searchType:"singleline, validate"},{country:"Laos",iso3Code:"LAO",iso2Code:"LA",datasetCode:"la-address-eh",searchType:"autocomplete"},{country:"Latvia",iso3Code:"LVA",iso2Code:"LV",datasetCode:"lv-address-ed",searchType:"singleline, validate"},{country:"Latvia",iso3Code:"LVA",iso2Code:"LV",datasetCode:"lv-address-eh",searchType:"autocomplete"},{country:"Lebanon",iso3Code:"LBN",iso2Code:"LB",datasetCode:"lb-address-ed",searchType:"singleline, validate"},{country:"Lebanon",iso3Code:"LBN",iso2Code:"LB",datasetCode:"lb-address-eh",searchType:"autocomplete"},{country:"Lesotho",iso3Code:"LSO",iso2Code:"LS",datasetCode:"ls-address-ed",searchType:"singleline, validate"},{country:"Lesotho",iso3Code:"LSO",iso2Code:"LS",datasetCode:"ls-address-eh",searchType:"autocomplete"},{country:"Liberia",iso3Code:"LBR",iso2Code:"LR",datasetCode:"lr-address-ed",searchType:"singleline, validate"},{country:"Liberia",iso3Code:"LBR",iso2Code:"LR",datasetCode:"lr-address-eh",searchType:"autocomplete"},{country:"Libya",iso3Code:"LBY",iso2Code:"LY",datasetCode:"ly-address-ed",searchType:"singleline, validate"},{country:"Libya",iso3Code:"LBY",iso2Code:"LY",datasetCode:"ly-address-eh",searchType:"autocomplete"},{country:"Liechtenstein",iso3Code:"LIE",iso2Code:"LI",datasetCode:"li-address-ed",searchType:"singleline, validate"},{country:"Liechtenstein",iso3Code:"LIE",iso2Code:"LI",datasetCode:"li-address-eh",searchType:"autocomplete"},{country:"Lithuania",iso3Code:"LTU",iso2Code:"LT",datasetCode:"lt-address-ed",searchType:"singleline, validate"},{country:"Lithuania",iso3Code:"LTU",iso2Code:"LT",datasetCode:"lt-address-eh",searchType:"autocomplete"},{country:"Luxembourg",iso3Code:"LUX",iso2Code:"LU",datasetCode:"lu-address-ed",searchType:"singleline, validate"},{country:"Luxembourg",iso3Code:"LUX",iso2Code:"LU",datasetCode:"lu-address-eh",searchType:"autocomplete"},{country:"Macau",iso3Code:"MAC",iso2Code:"MO",datasetCode:"lv-address-ed",searchType:"singleline, validate"},{country:"Macau",iso3Code:"MAC",iso2Code:"MO",datasetCode:"lv-address-eh",searchType:"autocomplete"},{country:"Madagascar",iso3Code:"MDG",iso2Code:"MG",datasetCode:"mo-address-ed",searchType:"singleline, validate"},{country:"Madagascar",iso3Code:"MDG",iso2Code:"MG",datasetCode:"mo-address-eh",searchType:"autocomplete"},{country:"Malawi",iso3Code:"MWI",iso2Code:"MW",datasetCode:"mw-address-ed",searchType:"singleline, validate"},{country:"Malawi",iso3Code:"MWI",iso2Code:"MW",datasetCode:"mw-address-eh",searchType:"autocomplete"},{country:"Malaysia",iso3Code:"MYS",iso2Code:"MY",datasetCode:"my-address-ed",searchType:"singleline, validate"},{country:"Malaysia",iso3Code:"MYS",iso2Code:"MY",datasetCode:"my-address-eh",searchType:"autocomplete"},{country:"Maldives",iso3Code:"MDV",iso2Code:"MV",datasetCode:"mv-address-ed",searchType:"singleline, validate"},{country:"Maldives",iso3Code:"MDV",iso2Code:"MV",datasetCode:"mv-address-eh",searchType:"autocomplete"},{country:"Mali",iso3Code:"MLI",iso2Code:"ML",datasetCode:"ml-address-ed",searchType:"singleline, validate"},{country:"Mali",iso3Code:"MLI",iso2Code:"ML",datasetCode:"ml-address-eh",searchType:"autocomplete"},{country:"Malta",iso3Code:"MLT",iso2Code:"MT",datasetCode:"mt-address-ed",searchType:"singleline, validate"},{country:"Malta",iso3Code:"MLT",iso2Code:"MT",datasetCode:"mt-address-eh",searchType:"autocomplete"},{country:"Marshall Islands",iso3Code:"MHL",iso2Code:"MH",datasetCode:"mh-address-eh",searchType:"autocomplete"},{country:"Martinique",iso3Code:"MTQ",iso2Code:"MQ",datasetCode:"mq-address-eh",searchType:"autocomplete"},{country:"Mauritania",iso3Code:"MRT",iso2Code:"MR",datasetCode:"mr-address-ed",searchType:"singleline, validate"},{country:"Mauritania",iso3Code:"MRT",iso2Code:"MR",datasetCode:"mr-address-eh",searchType:"autocomplete"},{country:"Mauritius",iso3Code:"MUS",iso2Code:"MU",datasetCode:"mu-address-ed",searchType:"singleline, validate"},{country:"Mauritius",iso3Code:"MUS",iso2Code:"MU",datasetCode:"mu-address-eh",searchType:"autocomplete"},{country:"Mayotte",iso3Code:"MYT",iso2Code:"YT",datasetCode:"yt-address-eh",searchType:"autocomplete"},{country:"Mexico",iso3Code:"MEX",iso2Code:"MX",datasetCode:"mx-address-ed",searchType:"singleline, validate"},{country:"Mexico",iso3Code:"MEX",iso2Code:"MX",datasetCode:"mx-address-eh",searchType:"autocomplete"},{country:"Micronesia, Federated States of",iso3Code:"FSM",iso2Code:"FM",datasetCode:"fm-address-eh",searchType:"autocomplete"},{country:"Moldova",iso3Code:"MDA",iso2Code:"MD",datasetCode:"md-address-ed",searchType:"singleline, validate"},{country:"Moldova",iso3Code:"MDA",iso2Code:"MD",datasetCode:"md-address-eh",searchType:"autocomplete"},{country:"Monaco",iso3Code:"MCO",iso2Code:"MC",datasetCode:"mc-address-ed",searchType:"singleline, validate"},{country:"Monaco",iso3Code:"MCO",iso2Code:"MC",datasetCode:"mc-address-eh",searchType:"autocomplete"},{country:"Mongolia",iso3Code:"MNG",iso2Code:"MN",datasetCode:"mn-address-ed",searchType:"singleline, validate"},{country:"Mongolia",iso3Code:"MNG",iso2Code:"MN",datasetCode:"mn-address-eh",searchType:"autocomplete"},{country:"Montenegro",iso3Code:"MNE",iso2Code:"ME",datasetCode:"me-address-ed",searchType:"singleline, validate"},{country:"Montenegro",iso3Code:"MNE",iso2Code:"ME",datasetCode:"me-address-eh",searchType:"autocomplete"},{country:"Montserrat",iso3Code:"MSR",iso2Code:"MS",datasetCode:"ms-address-eh",searchType:"autocomplete"},{country:"Morocco",iso3Code:"MAR",iso2Code:"MA",datasetCode:"ma-address-ed",searchType:"singleline, validate"},{country:"Morocco",iso3Code:"MAR",iso2Code:"MA",datasetCode:"ma-address-eh",searchType:"autocomplete"},{country:"Mozambique",iso3Code:"MOZ",iso2Code:"MZ",datasetCode:"mz-address-ed",searchType:"singleline, validate"},{country:"Mozambique",iso3Code:"MOZ",iso2Code:"MZ",datasetCode:"mz-address-eh",searchType:"autocomplete"},{country:"Myanmar",iso3Code:"MMR",iso2Code:"MM",datasetCode:"mm-address-ed",searchType:"singleline, validate"},{country:"Myanmar",iso3Code:"MMR",iso2Code:"MM",datasetCode:"mm-address-eh",searchType:"autocomplete"},{country:"Namibia",iso3Code:"NAM",iso2Code:"NA",datasetCode:"na-address-ed",searchType:"singleline, validate"},{country:"Namibia",iso3Code:"NAM",iso2Code:"NA",datasetCode:"na-address-eh",searchType:"autocomplete"},{country:"Nauru",iso3Code:"NRU",iso2Code:"NR",datasetCode:"nr-address-ed",searchType:"singleline, validate"},{country:"Nauru",iso3Code:"NRU",iso2Code:"NR",datasetCode:"nr-address-eh",searchType:"autocomplete"},{country:"Nepal",iso3Code:"NPL",iso2Code:"NP",datasetCode:"np-address-ed",searchType:"singleline, validate"},{country:"Nepal",iso3Code:"NPL",iso2Code:"NP",datasetCode:"np-address-eh",searchType:"autocomplete"},{country:"Netherlands",iso3Code:"NLD",iso2Code:"NL",datasetCode:"nl-address-ed",searchType:"singleline, validate"},{country:"Netherlands",iso3Code:"NLD",iso2Code:"NL",datasetCode:"nl-address-eh",searchType:"autocomplete"},{country:"New Caledonia",iso3Code:"NCL",iso2Code:"NC",datasetCode:"nc-address-eh",searchType:"autocomplete"},{country:"New Zealand DataFusion",iso3Code:"NZL",iso2Code:"NZ",datasetCode:"nz-additional-datafusion",searchType:"autocomplete, singleline, typedown, validate"},{country:"New Zealand Postal Address",iso3Code:"NZL",iso2Code:"NZ",datasetCode:"nz-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Nicaragua",iso3Code:"NIC",iso2Code:"NI",datasetCode:"ni-address-ed",searchType:"singleline, validate"},{country:"Nicaragua",iso3Code:"NIC",iso2Code:"NI",datasetCode:"ni-address-eh",searchType:"autocomplete"},{country:"Niger",iso3Code:"NER",iso2Code:"NE",datasetCode:"ne-address-ed",searchType:"singleline, validate"},{country:"Niger",iso3Code:"NER",iso2Code:"NE",datasetCode:"ne-address-eh",searchType:"autocomplete"},{country:"Nigeria",iso3Code:"NGA",iso2Code:"NG",datasetCode:"ng-address-ed",searchType:"singleline, validate"},{country:"Nigeria",iso3Code:"NGA",iso2Code:"NG",datasetCode:"ng-address-eh",searchType:"autocomplete"},{country:"Niue",iso3Code:"NIU",iso2Code:"NU",datasetCode:"nu-address-ed",searchType:"singleline, validate"},{country:"Norfolk Island",iso3Code:"NFK",iso2Code:"NF",datasetCode:"nf-address-ed",searchType:"singleline, validate"},{country:"Norfolk Island",iso3Code:"NFK",iso2Code:"NF",datasetCode:"nf-address-eh",searchType:"autocomplete"},{country:"North Macedonia",iso3Code:"MKD",iso2Code:"MK",datasetCode:"mk-address-ed",searchType:"singleline, validate"},{country:"North Macedonia",iso3Code:"MKD",iso2Code:"MK",datasetCode:"mk-address-eh",searchType:"autocomplete"},{country:"Northern Mariana Islands",iso3Code:"MNP",iso2Code:"MP",datasetCode:"mp-address-eh",searchType:"autocomplete"},{country:"Norway",iso3Code:"NOR",iso2Code:"NO",datasetCode:"no-address-ed",searchType:"validate"},{country:"Norway",iso3Code:"NOR",iso2Code:"NO",datasetCode:"no-address-eh",searchType:"autocomplete"},{country:"Oman",iso3Code:"OMN",iso2Code:"OM",datasetCode:"om-address-ed",searchType:"singleline, validate"},{country:"Oman",iso3Code:"OMN",iso2Code:"OM",datasetCode:"om-address-eh",searchType:"autocomplete"},{country:"Pakistan",iso3Code:"PAK",iso2Code:"PK",datasetCode:"pk-address-ed",searchType:"singleline, validate"},{country:"Pakistan",iso3Code:"PAK",iso2Code:"PK",datasetCode:"pk-address-eh",searchType:"autocomplete"},{country:"Palau",iso3Code:"PLW",iso2Code:"PW",datasetCode:"pw-address-eh",searchType:"autocomplete"},{country:"Palestine",iso3Code:"PSE",iso2Code:"PS",datasetCode:"ps-address-eh",searchType:"autocomplete"},{country:"Panama",iso3Code:"PAN",iso2Code:"PA",datasetCode:"pa-address-ed",searchType:"singleline, validate"},{country:"Panama",iso3Code:"PAN",iso2Code:"PA",datasetCode:"pa-address-eh",searchType:"autocomplete"},{country:"Papua New Guinea",iso3Code:"PNG",iso2Code:"PG",datasetCode:"pg-address-ed",searchType:"singleline, validate"},{country:"Papua New Guinea",iso3Code:"PNG",iso2Code:"PG",datasetCode:"pg-address-eh",searchType:"autocomplete"},{country:"Paraguay",iso3Code:"PRY",iso2Code:"PY",datasetCode:"py-address-ed",searchType:"singleline, validate"},{country:"Paraguay",iso3Code:"PRY",iso2Code:"PY",datasetCode:"py-address-eh",searchType:"autocomplete"},{country:"Peru",iso3Code:"PER",iso2Code:"PE",datasetCode:"pe-address-ed",searchType:"singleline, validate"},{country:"Peru",iso3Code:"PER",iso2Code:"PE",datasetCode:"pe-address-eh",searchType:"autocomplete"},{country:"Philippines",iso3Code:"PHL",iso2Code:"PH",datasetCode:"ph-address-ed",searchType:"singleline, validate"},{country:"Philippines",iso3Code:"PHL",iso2Code:"PH",datasetCode:"ph-address-eh",searchType:"autocomplete"},{country:"Pitcairn Islands",iso3Code:"PCN",iso2Code:"PN",datasetCode:"pn-address-eh",searchType:"autocomplete"},{country:"Poland",iso3Code:"POL",iso2Code:"PL",datasetCode:"pl-address-ed",searchType:"singleline, validate"},{country:"Poland",iso3Code:"POL",iso2Code:"PL",datasetCode:"pl-address-eh",searchType:"autocomplete"},{country:"Portugal",iso3Code:"PRT",iso2Code:"PT",datasetCode:"pt-address-ed",searchType:"singleline, validate"},{country:"Portugal",iso3Code:"PRT",iso2Code:"PT",datasetCode:"pt-address-eh",searchType:"autocomplete"},{country:"Qatar",iso3Code:"QAT",iso2Code:"QA",datasetCode:"qa-address-ed",searchType:"singleline, validate"},{country:"Qatar",iso3Code:"QAT",iso2Code:"QA",datasetCode:"qa-address-eh",searchType:"autocomplete"},{country:"Romania",iso3Code:"ROU",iso2Code:"RO",datasetCode:"ro-address-ed",searchType:"singleline, validate"},{country:"Romania",iso3Code:"ROU",iso2Code:"RO",datasetCode:"ro-address-eh",searchType:"autocomplete"},{country:"Russian Federation",iso3Code:"RUS",iso2Code:"RU",datasetCode:"ru-address-ed",searchType:"singleline, validate"},{country:"Russian Federation",iso3Code:"RUS",iso2Code:"RU",datasetCode:"ru-address-eh",searchType:"autocomplete"},{country:"Rwanda",iso3Code:"RWA",iso2Code:"RW",datasetCode:"rw-address-ed",searchType:"singleline, validate"},{country:"Rwanda",iso3Code:"RWA",iso2Code:"RW",datasetCode:"rw-address-eh",searchType:"autocomplete"},{country:"Réunion",iso3Code:"REU",iso2Code:"RE",datasetCode:"re-address-eh",searchType:"autocomplete"},{country:"Saint Barthélemy",iso3Code:"BLM",iso2Code:"BL",datasetCode:"bl-address-eh",searchType:"autocomplete"},{country:"Saint Helena",iso3Code:"SHN",iso2Code:"SH",datasetCode:"sh-address-eh",searchType:"autocomplete"},{country:"Saint Kitts and Nevis",iso3Code:"KNA",iso2Code:"KN",datasetCode:"kn-address-ed",searchType:"singleline, validate"},{country:"Saint Kitts and Nevis",iso3Code:"KNA",iso2Code:"KN",datasetCode:"kn-address-eh",searchType:"autocomplete"},{country:"Saint Lucia",iso3Code:"LCA",iso2Code:"LC",datasetCode:"lc-address-eh",searchType:"autocomplete"},{country:"Saint Pierre and Miquelon",iso3Code:"SPM",iso2Code:"PM",datasetCode:"pm-address-eh",searchType:"autocomplete"},{country:"Saint Vincent and the Grenadines",iso3Code:"VCT",iso2Code:"VC",datasetCode:"vc-address-ed",searchType:"singleline, validate"},{country:"Saint Vincent and the Grenadines",iso3Code:"VCT",iso2Code:"VC",datasetCode:"vc-address-eh",searchType:"autocomplete"},{country:"Samoa",iso3Code:"WSM",iso2Code:"WS",datasetCode:"ws-address-ed",searchType:"singleline, validate"},{country:"Samoa",iso3Code:"WSM",iso2Code:"WS",datasetCode:"ws-address-eh",searchType:"autocomplete"},{country:"San Marino",iso3Code:"SMR",iso2Code:"SM",datasetCode:"sm-address-ed",searchType:"singleline, validate"},{country:"San Marino",iso3Code:"SMR",iso2Code:"SM",datasetCode:"sm-address-eh",searchType:"autocomplete"},{country:"Sao Tome and Principe",iso3Code:"STP",iso2Code:"ST",datasetCode:"st-address-ed",searchType:"singleline, validate"},{country:"Sao Tome and Principe",iso3Code:"STP",iso2Code:"ST",datasetCode:"st-address-eh",searchType:"autocomplete"},{country:"Saudi Arabia",iso3Code:"SAU",iso2Code:"SA",datasetCode:"sa-address-ed",searchType:"singleline, validate"},{country:"Saudi Arabia",iso3Code:"SAU",iso2Code:"SA",datasetCode:"sa-address-eh",searchType:"autocomplete"},{country:"Senegal",iso3Code:"SEN",iso2Code:"SN",datasetCode:"sn-address-ed",searchType:"singleline, validate"},{country:"Senegal",iso3Code:"SEN",iso2Code:"SN",datasetCode:"sn-address-eh",searchType:"autocomplete"},{country:"Serbia",iso3Code:"SRB",iso2Code:"RS",datasetCode:"rs-address-ed",searchType:"singleline, validate"},{country:"Serbia",iso3Code:"SRB",iso2Code:"RS",datasetCode:"rs-address-eh",searchType:"autocomplete"},{country:"Seychelles",iso3Code:"SYC",iso2Code:"SC",datasetCode:"sc-address-ed",searchType:"singleline, validate"},{country:"Seychelles",iso3Code:"SYC",iso2Code:"SC",datasetCode:"sc-address-eh",searchType:"autocomplete"},{country:"Sierra Leone",iso3Code:"SLE",iso2Code:"SL",datasetCode:"sl-address-ed",searchType:"singleline, validate"},{country:"Sierra Leone",iso3Code:"SLE",iso2Code:"SL",datasetCode:"sl-address-eh",searchType:"autocomplete"},{country:"Singapore",iso3Code:"SGP",iso2Code:"SG",datasetCode:"sg-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Sint Maarten",iso3Code:"SXM",iso2Code:"SX",datasetCode:"sx-address-ed",searchType:"singleline, validate"},{country:"Sint Maarten",iso3Code:"SXM",iso2Code:"SX",datasetCode:"sx-address-eh",searchType:"autocomplete"},{country:"Slovakia",iso3Code:"SVK",iso2Code:"SK",datasetCode:"sk-address-ed",searchType:"singleline, validate"},{country:"Slovakia",iso3Code:"SVK",iso2Code:"SK",datasetCode:"sk-address-eh",searchType:"autocomplete"},{country:"Slovenia",iso3Code:"SVN",iso2Code:"SI",datasetCode:"si-address-ed",searchType:"singleline, validate"},{country:"Slovenia",iso3Code:"SVN",iso2Code:"SI",datasetCode:"si-address-eh",searchType:"autocomplete"},{country:"Solomon Islands",iso3Code:"SLB",iso2Code:"SB",datasetCode:"sb-address-ed",searchType:"singleline, validate"},{country:"Solomon Islands",iso3Code:"SLB",iso2Code:"SB",datasetCode:"sb-address-eh",searchType:"autocomplete"},{country:"Somalia",iso3Code:"SOM",iso2Code:"SO",datasetCode:"so-address-ed",searchType:"singleline, validate"},{country:"Somalia",iso3Code:"SOM",iso2Code:"SO",datasetCode:"so-address-eh",searchType:"autocomplete"},{country:"South Africa",iso3Code:"ZAF",iso2Code:"ZA",datasetCode:"za-address-ed",searchType:"singleline, validate"},{country:"South Africa",iso3Code:"ZAF",iso2Code:"ZA",datasetCode:"za-address-eh",searchType:"autocomplete"},{country:"South Georgia and the South Sandwich Islands",iso3Code:"SGS",iso2Code:"GS",datasetCode:"gs-address-eh",searchType:"autocomplete"},{country:"South Sudan",iso3Code:"SSD",iso2Code:"SS",datasetCode:"ss-address-ed",searchType:"singleline, validate"},{country:"South Sudan",iso3Code:"SSD",iso2Code:"SS",datasetCode:"ss-address-eh",searchType:"autocomplete"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address",searchType:"singleline, typedown"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address-ed",searchType:"validate"},{country:"Spain",iso3Code:"ESP",iso2Code:"ES",datasetCode:"es-address-eh",searchType:"autocomplete"},{country:"Sri Lanka",iso3Code:"LKA",iso2Code:"LK",datasetCode:"lk-address-ed",searchType:"singleline, validate"},{country:"Sudan",iso3Code:"SDN",iso2Code:"SD",datasetCode:"sd-address-ed",searchType:"singleline, validate"},{country:"Sudan",iso3Code:"SDN",iso2Code:"SD",datasetCode:"sd-address-eh",searchType:"autocomplete"},{country:"Suriname",iso3Code:"SUR",iso2Code:"SR",datasetCode:"sr-address-ed",searchType:"singleline, validate"},{country:"Suriname",iso3Code:"SUR",iso2Code:"SR",datasetCode:"sr-address-eh",searchType:"autocomplete"},{country:"Svalbard and Jan Mayen Islands",iso3Code:"SJM",iso2Code:"SJ",datasetCode:"sj-address-eh",searchType:"autocomplete"},{country:"Swaziland (Eswatini)",iso3Code:"SWZ",iso2Code:"SZ",datasetCode:"sz-address-ed",searchType:"singleline, validate"},{country:"Swaziland (Eswatini)",iso3Code:"SWZ",iso2Code:"SZ",datasetCode:"sz-address-eh",searchType:"autocomplete"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address",searchType:"singleline, typedown"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address-ed",searchType:"validate"},{country:"Sweden",iso3Code:"SWE",iso2Code:"SE",datasetCode:"se-address-eh",searchType:"autocomplete"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address",searchType:"singleline, typedown"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address-ed",searchType:"validate"},{country:"Switzerland",iso3Code:"CHE",iso2Code:"CH",datasetCode:"ch-address-eh",searchType:"autocomplete"},{country:"Syria",iso3Code:"SYR",iso2Code:"SY",datasetCode:"sy-address-ed",searchType:"singleline, validate"},{country:"Syria",iso3Code:"SYR",iso2Code:"SY",datasetCode:"sy-address-eh",searchType:"autocomplete"},{country:"Taiwan",iso3Code:"TWN",iso2Code:"TW",datasetCode:"tw-address-ed",searchType:"singleline, validate"},{country:"Taiwan",iso3Code:"TWN",iso2Code:"TW",datasetCode:"tw-address-eh",searchType:"autocomplete"},{country:"Tajikistan",iso3Code:"TJK",iso2Code:"TJ",datasetCode:"tj-address-ed",searchType:"singleline, validate"},{country:"Tajikistan",iso3Code:"TJK",iso2Code:"TJ",datasetCode:"tj-address-eh",searchType:"autocomplete"},{country:"Tanzania",iso3Code:"TZA",iso2Code:"TZ",datasetCode:"tz-address-ed",searchType:"singleline, validate"},{country:"Tanzania",iso3Code:"TZA",iso2Code:"TZ",datasetCode:"tz-address-eh",searchType:"autocomplete"},{country:"Thailand",iso3Code:"THA",iso2Code:"TH",datasetCode:"th-address-ed",searchType:"singleline, validate"},{country:"Thailand",iso3Code:"THA",iso2Code:"TH",datasetCode:"th-address-eh",searchType:"autocomplete"},{country:"Timor-Leste",iso3Code:"TLS",iso2Code:"TL",datasetCode:"tl-address-ed",searchType:"singleline, validate"},{country:"Timor-Leste",iso3Code:"TLS",iso2Code:"TL",datasetCode:"tl-address-eh",searchType:"autocomplete"},{country:"Togo",iso3Code:"TGO",iso2Code:"TG",datasetCode:"tg-address-ed",searchType:"singleline, validate"},{country:"Togo",iso3Code:"TGO",iso2Code:"TG",datasetCode:"tg-address-eh",searchType:"autocomplete"},{country:"Tokelau",iso3Code:"TKL",iso2Code:"TK",datasetCode:"tk-address-ed",searchType:"singleline, validate"},{country:"Tokelau",iso3Code:"TKL",iso2Code:"TK",datasetCode:"tk-address-eh",searchType:"autocomplete"},{country:"Tonga",iso3Code:"TON",iso2Code:"TO",datasetCode:"to-address-ed",searchType:"singleline, validate"},{country:"Tonga",iso3Code:"TON",iso2Code:"TO",datasetCode:"to-address-eh",searchType:"autocomplete"},{country:"Trinidad and Tobago",iso3Code:"TTO",iso2Code:"TT",datasetCode:"tt-address-ed",searchType:"singleline, validate"},{country:"Trinidad and Tobago",iso3Code:"TTO",iso2Code:"TT",datasetCode:"tt-address-eh",searchType:"autocomplete"},{country:"Tunisia",iso3Code:"TUN",iso2Code:"TN",datasetCode:"tn-address-ed",searchType:"singleline, validate"},{country:"Tunisia",iso3Code:"TUN",iso2Code:"TN",datasetCode:"tn-address-eh",searchType:"autocomplete"},{country:"Turkey",iso3Code:"TUR",iso2Code:"TR",datasetCode:"tr-address-ed",searchType:"singleline, validate"},{country:"Turkey",iso3Code:"TUR",iso2Code:"TR",datasetCode:"tr-address-eh",searchType:"autocomplete"},{country:"Turkish Republic of Northern Cyprus",iso3Code:"NCY",iso2Code:"CY",datasetCode:"ny-address-eh",searchType:"autocomplete"},{country:"Turkmenistan",iso3Code:"TKM",iso2Code:"TM",datasetCode:"tm-address-ed",searchType:"singleline, validate"},{country:"Turkmenistan",iso3Code:"TKM",iso2Code:"TM",datasetCode:"tm-address-eh",searchType:"autocomplete"},{country:"Turks and Caicos Islands",iso3Code:"TCA",iso2Code:"TC",datasetCode:"tc-address-eh",searchType:"autocomplete"},{country:"Tuvalu",iso3Code:"TUV",iso2Code:"TV",datasetCode:"tv-address-ed",searchType:"singleline, validate"},{country:"Tuvalu",iso3Code:"TUV",iso2Code:"TV",datasetCode:"tv-address-eh",searchType:"autocomplete"},{country:"Uganda",iso3Code:"UGA",iso2Code:"UG",datasetCode:"ug-address-ed",searchType:"singleline, validate"},{country:"Uganda",iso3Code:"UGA",iso2Code:"UG",datasetCode:"ug-address-eh",searchType:"autocomplete"},{country:"Ukraine",iso3Code:"UKR",iso2Code:"UA",datasetCode:"ua-address-ed",searchType:"singleline, validate"},{country:"Ukraine",iso3Code:"UKR",iso2Code:"UA",datasetCode:"ua-address-eh",searchType:"autocomplete"},{country:"United Arab Emirates",iso3Code:"ARE",iso2Code:"AE",datasetCode:"ae-address-ed",searchType:"singleline, validate"},{country:"United Arab Emirates",iso3Code:"ARE",iso2Code:"AE",datasetCode:"ae-address-eh",searchType:"autocomplete"},{country:"United Kingdom",iso3Code:"GBR",iso2Code:"GB",datasetCode:["gb-address"],searchType:"autocomplete"},{country:"United Kingdom",iso3Code:"GBR",iso2Code:"GB",datasetCode:["gb-additional-business","gb-additional-multipleresidence","gb-additional-notyetbuilt"],searchType:"singleline"},{country:"United Kingdom AddressBase Premium",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-addressbase",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom AddressBase Premium with Islands",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-addressbaseislands",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Business Names",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-business",searchType:"singleline, typedown"},{country:"United Kingdom Electricity",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-electricity",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Gas",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-gas",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Street Level",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-streetlevel",searchType:"singleline, typedown"},{country:"United Kingdom Extended Business",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-additional-businessextended",searchType:"singleline, typedown, validate, lookup"},{country:"United Kingdom Cymraeg (Welsh Language) Postal Address",iso3Code:"GBR",iso2Code:"GB",datasetCode:"gb-address-wales",searchType:"singleline, typedown, validate"},{country:"United States of America",iso3Code:"USA",iso2Code:"US",datasetCode:"us-address",searchType:"autocomplete, singleline, typedown, validate"},{country:"Uruguay",iso3Code:"URY",iso2Code:"UY",datasetCode:"uy-address-ed",searchType:"singleline, validate"},{country:"Uruguay",iso3Code:"URY",iso2Code:"UY",datasetCode:"uy-address-eh",searchType:"autocomplete"},{country:"Uzbekistan",iso3Code:"UZB",iso2Code:"UZ",datasetCode:"uz-address-ed",searchType:"singleline, validate"},{country:"Uzbekistan",iso3Code:"UZB",iso2Code:"UZ",datasetCode:"uz-address-eh",searchType:"autocomplete"},{country:"Vanuatu",iso3Code:"VUT",iso2Code:"VU",datasetCode:"vu-address-ed",searchType:"singleline, validate"},{country:"Vanuatu",iso3Code:"VUT",iso2Code:"VU",datasetCode:"vu-address-eh",searchType:"autocomplete"},{country:"Vatican City (Holy See)",iso3Code:"VAT",iso2Code:"VA",datasetCode:"va-address-ed",searchType:"singleline, validate"},{country:"Vatican City (Holy See)",iso3Code:"VAT",iso2Code:"VA",datasetCode:"va-address-eh",searchType:"autocomplete"},{country:"Venezuela",iso3Code:"VEN",iso2Code:"VE",datasetCode:"ve-address-ed",searchType:"singleline, validate"},{country:"Venezuela",iso3Code:"VEN",iso2Code:"VE",datasetCode:"ve-address-eh",searchType:"autocomplete"},{country:"Viet Nam",iso3Code:"VNM",iso2Code:"VN",datasetCode:"vn-address-ed",searchType:"singleline, validate"},{country:"Viet Nam",iso3Code:"VNM",iso2Code:"VN",datasetCode:"vn-address-eh",searchType:"autocomplete"},{country:"Virgin Islands, British",iso3Code:"VGB",iso2Code:"VG",datasetCode:"vg-address-eh",searchType:"autocomplete"},{country:"Virgin Islands, U.S.",iso3Code:"VIR",iso2Code:"VI",datasetCode:"vi-address-eh",searchType:"autocomplete"},{country:"Wallis and Futuna Islands",iso3Code:"WLF",iso2Code:"WF",datasetCode:"wf-address-eh",searchType:"autocomplete"},{country:"Western Sahara",iso3Code:"ESH",iso2Code:"EH",datasetCode:"eh-address-ed",searchType:"singleline, validate"},{country:"Western Sahara",iso3Code:"ESH",iso2Code:"EH",datasetCode:"eh-address-eh",searchType:"autocomplete"},{country:"Yemen",iso3Code:"YEM",iso2Code:"YE",datasetCode:"ye-address-ed",searchType:"singleline, validate"},{country:"Yemen",iso3Code:"YEM",iso2Code:"YE",datasetCode:"ye-address-eh",searchType:"autocomplete"},{country:"Zambia",iso3Code:"ZMB",iso2Code:"ZM",datasetCode:"zm-address-ed",searchType:"singleline, validate"},{country:"Zambia",iso3Code:"ZMB",iso2Code:"ZM",datasetCode:"zm-address-eh",searchType:"autocomplete"},{country:"Zimbabwe",iso3Code:"ZWE",iso2Code:"ZW",datasetCode:"zw-address-ed",searchType:"singleline, validate"},{country:"Zimbabwe",iso3Code:"ZWE",iso2Code:"ZW",datasetCode:"zw-address-eh",searchType:"autocomplete"}],i={en:{gbr:{locality:"Town/City",region:"County",postal_code:"Post code"},usa:{locality:"City",region:"State",postal_code:"ZIP code"}}},r=function(){this.size=0,this.maxSuggestions=25},n=function(){function s(s){var t=this;this.baseUrl="https://api.experianaperture.io/",this.searchEndpoint="address/search/v1",this.lookupEndpoint="address/lookup/v2",this.validateEndpoint="address/validate/v1",this.promptsetEndpoint="address/promptsets/v1",this.stepInEndpoint="address/suggestions/stepin/v1",this.refineEndpoint="address/suggestions/refine/v1",this.enrichmentEndpoint="enrichment/v2",this.what3WordCountries=["GBR"],this.what3WordsKeyword="what3words",this.poweredByLogo={element:null,create:function(e){var s={text:"".concat(this.svg," Powered by Experian"),format:""},o=e.createListItem(s);return o.classList.add("powered-by-experian"),e.list.parentNode.appendChild(o),o},destroy:function(e){this.element&&(e.list.parentNode.removeChild(this.element),this.element=void 0)},svg:''},this.result={formattedAddressContainer:null,lastAddressField:null,generateAddressLineRequired:!1,show:function(s){if(t.searchSpinner.hide(),t.picklist.hide(),t.lastSearchTerm="",t.searchType===e.AUTOCOMPLETE||s.result.address&&"No matches"!==s.result.confidence){t.inputs.forEach((function(e){return e.value=""})),t.result.calculateIfAddressLineGenerationRequired(),t.result.formattedAddressContainer=t.options.elements.formattedAddressContainer,!t.result.formattedAddressContainer&&t.result.generateAddressLineRequired&&t.result.createFormattedAddressContainer();for(var o=0;o0)for(var s=0;s?/";:£§º©®\s]+[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+|[^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3}[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3}[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3})$/.test(this.currentSearchTerm)&&this.options.enableWhat3Words&&this.what3WordCountries.indexOf(this.currentCountryCode)>-1?this.isWhat3Words=!0:this.isWhat3Words=!1,this.events.trigger("pre-search",this.currentSearchTerm);var t=this.isWhat3Words?this.generateLookupDataForApiCall(this.currentSearchTerm,!0):this.generateSearchDataForApiCall();this.lastSearchTerm=this.currentSearchTerm,this.searchSpinner.hide(),this.searchSpinner.show();var a=void 0,d=void 0,i=void 0;this.isWhat3Words?(a=this.baseUrl+this.lookupEndpoint,d=[],i=this.picklist.showWhat3Words):(a=this.baseUrl+(this.searchType===e.VALIDATE?this.validateEndpoint:this.searchEndpoint),d=this.searchType===e.VALIDATE?[{key:"Add-Metadata",value:!0}]:[],i=this.searchType===e.VALIDATE?this.result.handleValidateResponse:this.picklist.show),this.request.send(a,"POST",i,t,d)}else this.lastSearchTerm!==this.currentSearchTerm&&this.picklist.hide()},s.prototype.getKey=function(e){var s=e.key;switch(s){case"Down":case"ArrowDown":return"ArrowDown";case"Up":case"ArrowUp":return"ArrowUp";case"Spacebar":case" ":return" ";case"Escape":case"Esc":return"Escape";default:return s}},s.prototype.canSearch=function(){return this.options.enabled&&""!==this.currentSearchTerm&&this.currentSearchTerm.length>3&&this.lastSearchTerm!==this.currentSearchTerm&&this.currentCountryCode&&!0===this.hasSearchInputBeenReset},s.prototype.createPicklist=function(){var s=this;this.picklist=new r,this.picklist.maxSuggestions=25,this.picklist.tabCount=-1,this.picklist.show=function(o){var t;s.picklist.items=null==o?void 0:o.result.suggestions,s.picklist.handleCommonShowPicklistLogic(),(null===(t=s.picklist.items)||void 0===t?void 0:t.length)>0?(s.picklist.refine.isNeeded(o)&&s.picklist.refine.createInput(o.result.suggestions_prompt,o.result.suggestions_key),s.searchType===e.VALIDATE&&s.picklist.displaySuggestionsHeader(),s.picklist.items.forEach((function(e){var o=s.picklist.createListItem(e);s.picklist.list.appendChild(o),s.picklist.listen(o)})),s.searchType===e.VALIDATE&&s.picklist.displayUseAddressEnteredFooter(),s.picklist.scrollIntoViewIfNeeded()):s.picklist.handleEmptyPicklist(o),s.poweredByLogo.element=s.poweredByLogo.element||s.poweredByLogo.create(s.picklist),s.events.trigger("post-picklist-create",s.picklist.items)},this.picklist.showWhat3Words=function(e){var o;s.picklist.what3wordsItems=null==e?void 0:e.result.suggestions,s.picklist.handleCommonShowPicklistLogic(),(null===(o=s.picklist.what3wordsItems)||void 0===o?void 0:o.length)>0?(s.picklist.what3wordsItems.forEach((function(e){var o=s.picklist.createWhat3WordsListItem(e);s.picklist.list.appendChild(o),s.picklist.listen(o)})),s.picklist.scrollIntoViewIfNeeded()):s.picklist.handleEmptyPicklist(e),s.poweredByLogo.element=s.poweredByLogo.element||s.poweredByLogo.create(s.picklist),s.events.trigger("post-picklist-create",s.picklist.items)},this.picklist.showLookup=function(e){var o;s.isWhat3Words=!1,s.picklist.lookupItems=null==e?void 0:e.result.addresses,s.picklist.handleCommonShowPicklistLogic(),(null===(o=s.picklist.lookupItems)||void 0===o?void 0:o.length)>0?(s.picklist.lookupItems.forEach((function(e){var o=s.picklist.createLookupListItem(e);s.picklist.list.appendChild(o),s.picklist.listen(o)})),s.picklist.scrollIntoViewIfNeeded()):s.picklist.handleEmptyPicklist(e),s.poweredByLogo.element=s.poweredByLogo.element||s.poweredByLogo.create(s.picklist),s.events.trigger("post-picklist-create",s.picklist.items)},this.picklist.handleCommonShowPicklistLogic=function(){var e;s.picklist.currentItem=null,s.picklist.size=null===(e=s.picklist.items)||void 0===e?void 0:e.length,s.picklist.resetTabCount(),s.searchSpinner.hide(),s.picklist.list=s.picklist.list||s.picklist.createList(),s.picklist.list.innerHTML="",s.picklist.useAddressEntered.destroy(),s.events.trigger("pre-picklist-create",s.picklist.items)},this.picklist.hide=function(){if(s.picklist.currentItem=null,s.picklist.useAddressEntered.destroy(),s.poweredByLogo.destroy(s.picklist),s.inputs){var o=s.searchType===e.SINGLELINE?s.inputs.length-1:0;s.inputs[o].classList.remove("showing-suggestions")}s.picklist.list&&(s.picklist.container.remove(),s.picklist.list=void 0)},this.picklist.handleEmptyPicklist=function(e){var o;s.picklist.useAddressEntered.element=s.picklist.useAddressEntered.element||s.picklist.useAddressEntered.create(null===(o=e.result)||void 0===o?void 0:o.confidence),s.picklist.scrollIntoViewIfNeeded(),"function"==typeof s.picklist.handleEmptyPicklistCallback&&s.picklist.handleEmptyPicklistCallback()},this.picklist.displaySuggestionsHeader=function(){var e=document.querySelector(".picklist-suggestions-header")||document.createElement("div");e.classList.add("picklist-suggestions-header"),e.innerText="Suggestions:",s.picklist.list.parentNode.insertBefore(e,s.picklist.list)},this.picklist.displayUseAddressEnteredFooter=function(){var e=document.querySelector(".picklist-use-entered-container")||document.createElement("div");e.classList.add("picklist-use-entered-container"),s.picklist.list.parentNode.insertBefore(e,s.picklist.list.nextElementSibling);var o=document.querySelector(".picklist-use-entered-header")||document.createElement("div");o.classList.add("picklist-use-entered-header"),o.innerText="Or use address entered:",e.appendChild(o);var t=document.querySelector(".picklist-use-entered-option")||document.createElement("div");t.classList.add("picklist-use-entered-option"),t.innerText=s.currentSearchTerm.replace(/,+/g,", "),t.addEventListener("click",s.picklist.useAddressEntered.click),e.appendChild(t)},this.picklist.scrollIntoViewIfNeeded=function(){var e=s.picklist.container.getBoundingClientRect().top<0,o=s.picklist.container.getBoundingClientRect().bottom>window.innerHeight;(e||o)&&s.picklist.container.scrollIntoView()},this.picklist.useAddressEntered={element:null,create:function(e){var o={text:"".concat(e," ").concat(s.options.useAddressEnteredText)},t=s.picklist.createListItem(o);return t.classList.add("use-address-entered"),t.setAttribute("title","Enter address manually"),s.picklist.list=s.picklist.list||s.picklist.createList(),s.picklist.list.parentNode.insertBefore(t,s.picklist.container.firstChild),t.addEventListener("click",s.picklist.useAddressEntered.click),t},destroy:function(){s.picklist.useAddressEntered.element&&(s.picklist.list.parentNode.removeChild(s.picklist.useAddressEntered.element),s.picklist.useAddressEntered.element=void 0)},click:function(){var e={result:{confidence:"No matches",address:{address_line_1:"",address_line_2:"",address_line_3:"",locality:"",region:"",postal_code:"",country:""}}};if(s.currentSearchTerm){var o=s.currentSearchTerm.split(",");o[0]&&(e.result.address.address_line_1=o[0]),o[1]&&(e.result.address.address_line_2=o[1]),o[2]&&(e.result.address.address_line_3=o[2]);for(var t=3;ta.length-1&&(s.picklist.tabCount=0,o=!0);var d=a[s.picklist.tabCount],i=s.picklist.list.querySelector(".selected");i&&i.classList.remove("selected"),d.classList.add("selected"),s.picklist.currentItem=d;var r=s.picklist.list.offsetTop,n=s.picklist.list.offsetTop+s.picklist.list.offsetHeight,c=s.picklist.list.scrollTop,l=d.offsetTop,C=d.offsetTop+d.offsetHeight,u=d.offsetHeight;o?s.picklist.list.scrollTop=0:t?s.picklist.list.scrollTop=999:C+u>n?s.picklist.list.scrollTop=c+u:l-u-r";o=o.substring(0,s[t][0])+a+o.substring(s[t][1])}return o},this.picklist.listen=function(e){e.addEventListener("click",s.picklist.pick.bind(null,e))},this.picklist.checkEnter=function(e){if("Enter"===e.key||"Tab"===e.key){var o=void 0;1===s.picklist.size?o=s.picklist.list.querySelectorAll("div")[0]:s.picklist.currentItem&&(o=s.picklist.currentItem),o&&s.picklist.pick(o)}},this.picklist.pick=function(e){s.events.trigger("post-picklist-selection",e);var o=e.getElementsByTagName("div");s.isWhat3Words?s.lookup(o[0].innerHTML):e.getAttribute("format")?s.format(e.getAttribute("format")):s.refine(e.getAttribute("refine"))}},s.prototype.format=function(e){this.events.trigger("pre-formatting-search",e),this.searchSpinner.hide(),this.request.send(e,"GET",this.result.show,void 0,[{key:"Add-Metadata",value:!0}])},s.prototype.refine=function(e){this.events.trigger("pre-refinement",e),this.searchSpinner.hide(),this.request.send("".concat(this.baseUrl).concat(this.stepInEndpoint,"/").concat(e),"GET",this.picklist.show)},s.prototype.lookup=function(e){this.events.trigger("pre-lookup",e),this.searchSpinner.hide();var s=this.generateLookupDataForApiCall(e,!1),o=this.baseUrl+this.lookupEndpoint,t=this.picklist.showLookup;this.request.send(o,"POST",t,s,[{key:"Add-Addresses",value:!0}])},s.prototype.checkTab=function(e){var s=this.getKey(e);"Tab"!==s?"Enter"===s&&e.preventDefault():this.picklist.keyup(e)},s.prototype.toggleSearchInputs=function(e){var s,o,t,a="show"===e?"remove":"add";null===(s=this.options.elements.inputs)||void 0===s||s.forEach((function(e){return e.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")}))})),null===(o=this.options.elements.countryList)||void 0===o||o.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")})),null===(t=this.options.elements.lookupButton)||void 0===t||t.parentNode.querySelectorAll(".toggle").forEach((function(e){return e.classList[a]("hidden")}))},s.prototype.globalReset=function(e){e&&e.preventDefault(),this.options.enabled=!0,this.result.hide(),this.hasSearchInputBeenReset=!0,this.inputs.forEach((function(e){return e.value=""})),this.picklist.hide(),this.toggleSearchInputs("show"),this.inputs[0].focus(),this.events.trigger("post-reset")},s}();window.AddressValidation=n}(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Z0JBQy9GLENBQUNrQixRQUFTLGFBQWNDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQ25HLENBQUNrQixRQUFTLGFBQWNDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQ25HLENBQUNrQixRQUFTLE9BQVFDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQzdGLENBQUNrQixRQUFTLE9BQVFDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQzdGLENBQUNrQixRQUFTLFNBQVVDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQy9GLENBQUNrQixRQUFTLFNBQVVDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQy9GLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQ2hHLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQ2hHLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQ2hHLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQ2hHLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQ2hHLENBQUNrQixRQUFTLFVBQVdDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksZ0JBQ2hHLENBQUNrQixRQUFTLFFBQVNDLFNBQVUsTUFBT0MsU0FBVSxLQUFNQyxZQUFhLGdCQUFpQnJCLFdBQVksd0JBQzlGLENBQUNrQixRQUFTLFFBQVNDLFNBQVUsTUFBT0MsU0FBVSxL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VSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsYUFBY0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDbkcsQ0FBQ2tCLFFBQVMsYUFBY0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDbkcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDaEcsQ0FBQ2tCLFFBQVMsVUFBV0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDaEcsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDOUYsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDOUYsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDOUYsQ0FBQ2tCLFFBQVMsUUFBU0MsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDOUYsQ0FBQ2tCLFFBQVMsY0FBZUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSx3QkFDcEcsQ0FBQ2tCLFFBQVMsY0FBZUMsU0FBVSxNQUFPQyxTQUFVLEtBQU1DLFlBQWEsZ0JBQWlCckIsV0FBWSxnQkFDcEcsQ0FBQ2tCLFFBQVMsZ0JBQWlCQyxTQUFVLE1BQU9DLFNBQVUsS0FBTUMsWUFBYSxnQkFBaUJyQixXQUFZLGdC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aUJBQWlCLFdBQVcxUixTQUFRLFNBQUEyRCxHQUFXLE9BQUFBLEVBQVFRLFVBQVV1TyxHQUFVLGFBQ3ZGLFFBQWxDLEVBQUFsVSxLQUFLc0IsUUFBUXNGLFNBQVNxRyxvQkFBWSxTQUFFbkgsV0FBV29OLGlCQUFpQixXQUFXMVIsU0FBUSxTQUFBMkQsR0FBVyxPQUFBQSxFQUFRUSxVQUFVdU8sR0FBVSxjQUdwSCxZQUFBeEssWUFBUixTQUFvQjVKLEdBQ2RBLEdBQ0ZBLEVBQU00TyxpQkFHUjFPLEtBQUtzQixRQUFRd0ssU0FBVSxFQUV2QjlMLEtBQUttRyxPQUFPaEUsT0FFWm5DLEtBQUttSCx5QkFBMEIsRUFHL0JuSCxLQUFLMEcsT0FBT2xGLFNBQVEsU0FBQW1CLEdBQVMsT0FBQUEsRUFBTWhCLE1BQVEsTUFFM0MzQixLQUFLcUYsU0FBU2xELE9BRWRuQyxLQUFLa0gsbUJBQW1CLFFBRXhCbEgsS0FBSzBHLE9BQU8sR0FBRytHLFFBR2Z6TixLQUFLb0MsT0FBT2xDLFFBQVEsZUFFeEIsRUFqNENBLEdDQ0F3UixPQUFPeUMsa0JBQW9CLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9leHBlcmlhbi1hZGRyZXNzLXZhbGlkYXRpb24vLi9zcmMvdHMvZXZlbnQtZmFjdG9yeS50cyIsIndlYnBhY2s6Ly9leHBlcmlhbi1hZGRyZXNzLXZhbGlkYXRpb24vLi9zcmMvdHMvc2VhcmNoLW9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZXhwZXJpYW4tYWRkcmVzcy12YWxpZGF0aW9uLy4vc3JjL3RzL3JlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vZXhwZXJpYW4tYWRkcmVzcy12YWxpZGF0aW9uLy4vc3JjL3RzL2RhdGFzZXRzLWNvZGVzLnRzIiwid2VicGFjazovL2V4cGVyaWFuLWFkZHJlc3MtdmFsaWRhdGlvbi8uL3NyYy90cy90cmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZXhwZXJpYW4tYWRkcmVzcy12YWxpZGF0aW9uLy4vc3JjL3RzL2NsYXNzLXR5cGVzLnRzIiwid2VicGFjazovL2V4cGVyaWFuLWFkZHJlc3MtdmFsaWRhdGlvbi8uL3NyYy90cy9hZGRyZXNzLXNlYXJjaC50cyIsIndlYnBhY2s6Ly9leHBlcmlhbi1hZGRyZXNzLXZhbGlkYXRpb24vLi9zcmMvdHMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZXRob2QgZXZlbnQgbGlzdGVuZXIgKHB1Yi9zdWIgdHlwZSB0aGluZylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXZlbnRGYWN0b3J5IHtcbiAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0byBob2xkIHRoZSBjb2xsZWN0aW9uIG9mIGV2ZW50c1xuICBjb2xsZWN0aW9uID0ge307XG5cbiAgLy8gU3Vic2NyaWJlIGEgbmV3IGV2ZW50XG4gIG9uKGV2ZW50LCBhY3Rpb24pIHtcbiAgICAvLyBDcmVhdGUgdGhlIHByb3BlcnR5IGFycmF5IG9uIHRoZSBjb2xsZWN0aW9uIG9iamVjdFxuICAgIHRoaXMuY29sbGVjdGlvbltldmVudF0gPSB0aGlzLmNvbGxlY3Rpb25bZXZlbnRdIHx8IFtdO1xuICAgIC8vIFB1c2ggYSBuZXcgYWN0aW9uIGZvciB0aGlzIGV2ZW50IG9udG8gdGhlIGFycmF5XG4gICAgdGhpcy5jb2xsZWN0aW9uW2V2ZW50XS5wdXNoKGFjdGlvbik7XG4gIH1cblxuICAvLyBQdWJsaXNoICh0cmlnZ2VyKSBhbiBldmVudFxuICB0cmlnZ2VyKGV2ZW50LCBkYXRhKSB7XG4gICAgLy8gSWYgdGhpcyBldmVudCBpcyBpbiBvdXIgY29sbGVjdGlvbiAoaS5lLiBhbnlvbmUncyBzdWJzY3JpYmVkKVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25bZXZlbnRdKSB7XG4gICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBhY3Rpb25zIGZvciB0aGlzIGV2ZW50XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sbGVjdGlvbltldmVudF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFycmF5IHdpdGggZGVmYXVsdCBkYXRhIGFzIDFzdCBpdGVtXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbZGF0YV07XG5cbiAgICAgICAgLy8gTG9vcCBvdmVyIGFkZGl0aW9uYWwgYXJncyBhbmQgYWRkIHRvIGFycmF5XG4gICAgICAgIGZvciAobGV0IGEgPSAyOyBhIDwgYXJndW1lbnRzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1thXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIGVhY2ggYWN0aW9uIGZvciB0aGlzIGV2ZW50IHR5cGUsIHBhc3NpbmcgdGhlIGFyZ3NcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25bZXZlbnRdW2ldLmFwcGx5KHRoaXMuY29sbGVjdGlvbiwgYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBXaGF0IHRvIGRvPyBVbmNvbW1lbnQgdGhlIGJlbG93IHRvIHNob3cgZXJyb3JzIGluIHlvdXIgZXZlbnQgYWN0aW9uc1xuICAgICAgICAgIC8vY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzU2VhcmNoT3B0aW9ucyB7XHJcbiAgZW5hYmxlZDogYm9vbGVhbjtcclxuICB0b2tlbjogc3RyaW5nO1xyXG4gIGVuYWJsZVdoYXQzV29yZHM6IGJvb2xlYW47XHJcbiAgc2VhcmNoVHlwZTogQWRkcmVzc1ZhbGlkYXRpb25Nb2RlO1xyXG4gIG1heFN1Z2dlc3Rpb25zOiBudW1iZXI7XHJcbiAgbGFuZ3VhZ2U6IHN0cmluZztcclxuICBsb2NhdGlvbjogc3RyaW5nO1xyXG4gIHVzZVNwaW5uZXI6IGJvb2xlYW47XHJcbiAgY291bnRyeUNvZGU/OiBzdHJpbmc7XHJcbiAgY291bnRyeUNvZGVNYXBwaW5nPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICBhcHBseUZvY3VzOiBib29sZWFuO1xyXG4gIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xyXG4gIHVzZUFkZHJlc3NFbnRlcmVkVGV4dDogc3RyaW5nO1xyXG4gIHNlYXJjaEFnYWluOiB7IHZpc2libGU/OiBib29sZWFuLCB0ZXh0Pzogc3RyaW5nLCBsaW5rPzogSFRNTEJ1dHRvbkVsZW1lbnQgfTtcclxuICBmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyOiB7IHNob3dIZWFkaW5nOiBib29sZWFuLCBoZWFkaW5nVHlwZTogc3RyaW5nLCB2YWxpZGF0ZWRIZWFkaW5nVGV4dDogc3RyaW5nLCBtYW51YWxIZWFkaW5nVGV4dDogc3RyaW5nIH07XHJcbiAgZWxlbWVudHM6IHsgaW5wdXQ/OiBIVE1MSW5wdXRFbGVtZW50LCBpbnB1dHM/OiBIVE1MSW5wdXRFbGVtZW50W10sIGNvdW50cnlMaXN0PzogSFRNTFNlbGVjdEVsZW1lbnQsIGFkZHJlc3NfbGluZV8xPzogSFRNTElucHV0RWxlbWVudCwgYWRkcmVzc19saW5lXzI/OiBIVE1MSW5wdXRFbGVtZW50LCBhZGRyZXNzX2xpbmVfMz86IEhUTUxJbnB1dEVsZW1lbnQsIGxvY2FsaXR5PzogSFRNTElucHV0RWxlbWVudCwgcmVnaW9uPzogSFRNTElucHV0RWxlbWVudCwgcG9zdGFsX2NvZGU/OiBIVE1MSW5wdXRFbGVtZW50LCBjb3VudHJ5PzogSFRNTElucHV0RWxlbWVudCwgZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcj86IEhUTUxFbGVtZW50LCBsb29rdXBCdXR0b24/OiBIVE1MQnV0dG9uRWxlbWVudCB9O1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUge1xyXG4gIEFVVE9DT01QTEVURSA9ICdhdXRvY29tcGxldGUnLFxyXG4gIFNJTkdMRUxJTkUgPSAnc2luZ2xlbGluZScsXHJcbiAgVkFMSURBVEUgPSAndmFsaWRhdGUnXHJcbn1cclxuXHJcbi8vIERlZmF1bHQgc2V0dGluZ3NcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRzID0ge1xyXG4gIGVuYWJsZVdoYXQzV29yZHM6IHRydWUsXHJcbiAgc2VhcmNoVHlwZTogQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLkFVVE9DT01QTEVURSxcclxuICBpbnB1dDogeyBwbGFjZWhvbGRlclRleHQ6ICdTdGFydCB0eXBpbmcgYW4gYWRkcmVzcy4uLicsIGFwcGx5Rm9jdXM6IGZhbHNlIH0sXHJcbiAgZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcjogeyBzaG93SGVhZGluZzogZmFsc2UsIGhlYWRpbmdUeXBlOiAnaDMnLCB2YWxpZGF0ZWRIZWFkaW5nVGV4dDogJ1ZhbGlkYXRlZCBhZGRyZXNzJywgbWFudWFsSGVhZGluZ1RleHQ6ICdNYW51YWwgYWRkcmVzcyBlbnRlcmVkJyB9LFxyXG4gIHNlYXJjaEFnYWluOiB7IHZpc2libGU6IHRydWUsIHRleHQ6ICdTZWFyY2ggYWdhaW4nIH0sXHJcbiAgdXNlQWRkcmVzc0VudGVyZWRUZXh0OiAnPGVtPiAtIFVzZSBhZGRyZXNzIGVudGVyZWQgb3IgdHJ5IGFnYWluLi4uPC9lbT4nLFxyXG4gIHVzZVNwaW5uZXI6IGZhbHNlLFxyXG4gIGxhbmd1YWdlOiAnZW4nLFxyXG4gIGFkZHJlc3NMaW5lTGFiZWxzOiBbXHJcbiAgICAnYWRkcmVzc19saW5lXzEnLFxyXG4gICAgJ2FkZHJlc3NfbGluZV8yJyxcclxuICAgICdhZGRyZXNzX2xpbmVfMycsXHJcbiAgICAnbG9jYWxpdHknLFxyXG4gICAgJ3JlZ2lvbicsXHJcbiAgICAncG9zdGFsX2NvZGUnLFxyXG4gICAgJ2NvdW50cnknXHJcbiAgXVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3Qge1xuICBpbnN0YW5jZTtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2UpIHtcbiAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFJlcXVlc3Q7XG5cblxuICBwdWJsaWMgc2VuZCh1cmw6IHN0cmluZywgbWV0aG9kOiAnR0VUJyB8ICdQT1NUJywgY2FsbGJhY2s6IChkYXRhOiBvYmplY3QpID0+IHZvaWQsIGRhdGE/OiBzdHJpbmcsIGhlYWRlcnM6IHtrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW59W10gPSBbXSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgIHRoaXMuY3VycmVudFJlcXVlc3QudGltZW91dCA9IDUwMDA7IC8vIDUgc2Vjb25kc1xuICAgIHRoaXMuY3VycmVudFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignYXV0aC10b2tlbicsIHRoaXMuaW5zdGFuY2Uub3B0aW9ucy50b2tlbik7XG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIHRoaXMuY3VycmVudFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcblxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIGhlYWRlcnMgaWYgc3VwcGxpZWRcbiAgICBoZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHRoaXMuY3VycmVudFJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIua2V5LCBoZWFkZXIudmFsdWUpKTtcblxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Qub25sb2FkID0gKHhocikgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiB0aGlzLmN1cnJlbnRSZXF1ZXN0LnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLmN1cnJlbnRSZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UgcmVhY2hlZCBvdXIgdGFyZ2V0IHNlcnZlciwgYnV0IGl0IHJldHVybmVkIGFuIGVycm9yXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XG5cbiAgICAgICAgLy8gRmlyZSBhbiBldmVudCB0byBub3RpZnkgdXNlcnMgb2YgYSBnZW5lcmFsIGVycm9yXG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZXZlbnRzLnRyaWdnZXIoJ3JlcXVlc3QtZXJyb3InLCB4aHIpO1xuICAgICAgICAvLyBGaXJlIGFuIGV2ZW50IGZvciB0aGUgc3BlY2lmaWMgc3RhdHVzIGNvZGVcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5ldmVudHMudHJpZ2dlcihgcmVxdWVzdC1lcnJvci0ke3RoaXMuY3VycmVudFJlcXVlc3Quc3RhdHVzfWAsIHhocik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Qub25lcnJvciA9ICh4aHIpID0+IHtcbiAgICAgIC8vIFRoZXJlIHdhcyBhIGNvbm5lY3Rpb24gZXJyb3Igb2Ygc29tZSBzb3J0XG4gICAgICAvLyBIaWRlIHRoZSBpbmxpbmUgc2VhcmNoIHNwaW5uZXJcbiAgICAgIHRoaXMuaW5zdGFuY2Uuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XG5cbiAgICAgIC8vIEZpcmUgYW4gZXZlbnQgdG8gbm90aWZ5IHVzZXJzIG9mIGFuIGVycm9yXG4gICAgICB0aGlzLmluc3RhbmNlLmV2ZW50cy50cmlnZ2VyKCdyZXF1ZXN0LWVycm9yJywgeGhyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdC5vbnRpbWVvdXQgPSAoeGhyKSA9PiB7XG4gICAgICAvLyBUaGVyZSB3YXMgYSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxuICAgICAgdGhpcy5pbnN0YW5jZS5zZWFyY2hTcGlubmVyLmhpZGUoKTtcblxuICAgICAgLy8gRmlyZSBhbiBldmVudCB0byBub3RpZnkgdXNlcnMgb2YgdGhlIHRpbWVvdXRcbiAgICAgIHRoaXMuaW5zdGFuY2UuZXZlbnRzLnRyaWdnZXIoJ3JlcXVlc3QtdGltZW91dCcsIHhocik7XG4gICAgfTtcblxuICAgIHRoaXMuY3VycmVudFJlcXVlc3Quc2VuZChkYXRhKTtcbiAgfVxufSIsImV4cG9ydCBjb25zdCBkYXRhc2V0Q29kZXMgPSBbXG4gIHtjb3VudHJ5OiAnQWZnaGFuaXN0YW4nLCBpc28zQ29kZTogJ0FGRycsIGlzbzJDb2RlOiAnQUYnLCBkYXRhc2V0Q29kZTogJ2FmLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBZmdoYW5pc3RhbicsIGlzbzNDb2RlOiAnQUZHJywgaXNvMkNvZGU6ICdBRicsIGRhdGFzZXRDb2RlOiAnYWYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBbGJhbmlhJywgaXNvM0NvZGU6ICdBTEInLCBpc28yQ29kZTogJ0FMJywgZGF0YXNldENvZGU6ICdhbC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQWxiYW5pYScsIGlzbzNDb2RlOiAnQUxCJywgaXNvMkNvZGU6ICdBTCcsIGRhdGFzZXRDb2RlOiAnYWwtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBbGdlcmlhJywgaXNvM0NvZGU6ICdEWkEnLCBpc28yQ29kZTogJ0RaJywgZGF0YXNldENvZGU6ICdkei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQWxnZXJpYScsIGlzbzNDb2RlOiAnRFpBJywgaXNvMkNvZGU6ICdEWicsIGRhdGFzZXRDb2RlOiAnZHotYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBbWVyaWNhbiBTYW1vYScsIGlzbzNDb2RlOiAnQVNNJywgaXNvMkNvZGU6ICdBUycsIGRhdGFzZXRDb2RlOiAnYXMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBbmRvcnJhJywgaXNvM0NvZGU6ICdBTkQnLCBpc28yQ29kZTogJ0FEJywgZGF0YXNldENvZGU6ICdhZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQW5kb3JyYScsIGlzbzNDb2RlOiAnQU5EJywgaXNvMkNvZGU6ICdBRCcsIGRhdGFzZXRDb2RlOiAnYWQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBbmdvbGEnLCBpc28zQ29kZTogJ0FHTycsIGlzbzJDb2RlOiAnQU8nLCBkYXRhc2V0Q29kZTogJ2FvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBbmdvbGEnLCBpc28zQ29kZTogJ0FHTycsIGlzbzJDb2RlOiAnQU8nLCBkYXRhc2V0Q29kZTogJ2FvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQW5ndWlsbGEnLCBpc28zQ29kZTogJ0FJQScsIGlzbzJDb2RlOiAnQUknLCBkYXRhc2V0Q29kZTogJ2FpLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQW50YXJjdGljYScsIGlzbzNDb2RlOiAnQVRBJywgaXNvMkNvZGU6ICdBUScsIGRhdGFzZXRDb2RlOiAnYXEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0FudGlndWEgYW5kIEJhcmJ1ZGEnLCBpc28zQ29kZTogJ0FURycsIGlzbzJDb2RlOiAnQUcnLCBkYXRhc2V0Q29kZTogJ2FnLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBbnRpZ3VhIGFuZCBCYXJidWRhJywgaXNvM0NvZGU6ICdBVEcnLCBpc28yQ29kZTogJ0FHJywgZGF0YXNldENvZGU6ICdhZy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0FyZ2VudGluYScsIGlzbzNDb2RlOiAnQVJHJywgaXNvMkNvZGU6ICdBUicsIGRhdGFzZXRDb2RlOiAnYXItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0FyZ2VudGluYScsIGlzbzNDb2RlOiAnQVJHJywgaXNvMkNvZGU6ICdBUicsIGRhdGFzZXRDb2RlOiAnYXItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBcm1lbmlhJywgaXNvM0NvZGU6ICdBUk0nLCBpc28yQ29kZTogJ0FNJywgZGF0YXNldENvZGU6ICdhbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQXJtZW5pYScsIGlzbzNDb2RlOiAnQVJNJywgaXNvMkNvZGU6ICdBTScsIGRhdGFzZXRDb2RlOiAnYW0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdBcnViYScsIGlzbzNDb2RlOiAnQUJXJywgaXNvMkNvZGU6ICdBVycsIGRhdGFzZXRDb2RlOiAnYXctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0FydWJhJywgaXNvM0NvZGU6ICdBQlcnLCBpc28yQ29kZTogJ0FXJywgZGF0YXNldENvZGU6ICdhdy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0F1c3RyYWxpYSBEYXRhRnVzaW9uJywgaXNvM0NvZGU6ICdBVVMnLCBpc28yQ29kZTogJ0FVJywgZGF0YXNldENvZGU6ICdhdS1hZGRyZXNzLWRhdGFmdXNpb24nLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxuICB7Y291bnRyeTogJ0F1c3RyYWxpYSBHZW9jb2RlZCBOYXRpb25hbCBBZGRyZXNzJywgaXNvM0NvZGU6ICdBVVMnLCBpc28yQ29kZTogJ0FVJywgZGF0YXNldENvZGU6ICdhdS1hZGRyZXNzLWduYWYnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBdXN0cmFsaWEgUG9zdGFsIEFkZHJlc3MnLCBpc28zQ29kZTogJ0FVUycsIGlzbzJDb2RlOiAnQVUnLCBkYXRhc2V0Q29kZTogJ2F1LWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBdXN0cmlhJywgaXNvM0NvZGU6ICdBVVQnLCBpc28yQ29kZTogJ0FUJywgZGF0YXNldENvZGU6ICdhdC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0F1c3RyaWEnLCBpc28zQ29kZTogJ0FVVCcsIGlzbzJDb2RlOiAnQVQnLCBkYXRhc2V0Q29kZTogJ2F6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdBemVyYmFpamFuJywgaXNvM0NvZGU6ICdBWkUnLCBpc28yQ29kZTogJ0FaJywgZGF0YXNldENvZGU6ICdhei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQXplcmJhaWphbicsIGlzbzNDb2RlOiAnQVpFJywgaXNvMkNvZGU6ICdBWicsIGRhdGFzZXRDb2RlOiAnYXotYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCYWhhbWFzJywgaXNvM0NvZGU6ICdCSFMnLCBpc28yQ29kZTogJ0JTJywgZGF0YXNldENvZGU6ICdicy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmFoYW1hcycsIGlzbzNDb2RlOiAnQkhTJywgaXNvMkNvZGU6ICdCUycsIGRhdGFzZXRDb2RlOiAnYnMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCYWhyYWluJywgaXNvM0NvZGU6ICdCSFInLCBpc28yQ29kZTogJ0JIJywgZGF0YXNldENvZGU6ICdiaC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmFocmFpbicsIGlzbzNDb2RlOiAnQkhSJywgaXNvMkNvZGU6ICdCSCcsIGRhdGFzZXRDb2RlOiAnYmgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCYW5nbGFkZXNoJywgaXNvM0NvZGU6ICdCR0QnLCBpc28yQ29kZTogJ0JEJywgZGF0YXNldENvZGU6ICdiZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmFuZ2xhZGVzaCcsIGlzbzNDb2RlOiAnQkdEJywgaXNvMkNvZGU6ICdCRCcsIGRhdGFzZXRDb2RlOiAnYmQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCYXJiYWRvcycsIGlzbzNDb2RlOiAnQlJCJywgaXNvMkNvZGU6ICdCQicsIGRhdGFzZXRDb2RlOiAnYmItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0JhcmJhZG9zJywgaXNvM0NvZGU6ICdCUkInLCBpc28yQ29kZTogJ0JCJywgZGF0YXNldENvZGU6ICdiYi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0JlbGFydXMnLCBpc28zQ29kZTogJ0JMUicsIGlzbzJDb2RlOiAnQlknLCBkYXRhc2V0Q29kZTogJ2J5LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdCZWxhcnVzJywgaXNvM0NvZGU6ICdCTFInLCBpc28yQ29kZTogJ0JZJywgZGF0YXNldENvZGU6ICdieS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0JlbGdpdW0nLCBpc28zQ29kZTogJ0JFTCcsIGlzbzJDb2RlOiAnQkUnLCBkYXRhc2V0Q29kZTogJ2JlLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcbiAge2NvdW50cnk6ICdCZWxnaXVtJywgaXNvM0NvZGU6ICdCRUwnLCBpc28yQ29kZTogJ0JFJywgZGF0YXNldENvZGU6ICdiZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJyB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0JlbGdpdW0nLCBpc28zQ29kZTogJ0JFTCcsIGlzbzJDb2RlOiAnQkUnLCBkYXRhc2V0Q29kZTogJ2JlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQmVsaXplJywgaXNvM0NvZGU6ICdCTFonLCBpc28yQ29kZTogJ0JaJywgZGF0YXNldENvZGU6ICdiei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmVsaXplJywgaXNvM0NvZGU6ICdCTFonLCBpc28yQ29kZTogJ0JaJywgZGF0YXNldENvZGU6ICdiei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0JlbmluJywgaXNvM0NvZGU6ICdCRU4nLCBpc28yQ29kZTogJ0JKJywgZGF0YXNldENvZGU6ICdiai1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmVuaW4nLCBpc28zQ29kZTogJ0JFTicsIGlzbzJDb2RlOiAnQkonLCBkYXRhc2V0Q29kZTogJ2JqLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQmVybXVkYScsIGlzbzNDb2RlOiAnQk1VJywgaXNvMkNvZGU6ICdCTScsIGRhdGFzZXRDb2RlOiAnYm0tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0Jlcm11ZGEnLCBpc28zQ29kZTogJ0JNVScsIGlzbzJDb2RlOiAnQk0nLCBkYXRhc2V0Q29kZTogJ2JtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQmh1dGFuJywgaXNvM0NvZGU6ICdCVE4nLCBpc28yQ29kZTogJ0JUJywgZGF0YXNldENvZGU6ICdidC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQmh1dGFuJywgaXNvM0NvZGU6ICdCVE4nLCBpc28yQ29kZTogJ0JUJywgZGF0YXNldENvZGU6ICdidC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0JvbGl2aWEnLCBpc28zQ29kZTogJ0JPTCcsIGlzbzJDb2RlOiAnQk8nLCBkYXRhc2V0Q29kZTogJ2JvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdCb2xpdmlhJywgaXNvM0NvZGU6ICdCT0wnLCBpc28yQ29kZTogJ0JPJywgZGF0YXNldENvZGU6ICdiby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0JvbmFpcmUsIFNpbnQgRXVzdGF0aXVzIGFuZCBTYWJhJywgaXNvM0NvZGU6ICdCRVMnLCBpc28yQ29kZTogJ0JRJywgZGF0YXNldENvZGU6ICdicS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQm9uYWlyZSwgU2ludCBFdXN0YXRpdXMgYW5kIFNhYmEnLCBpc28zQ29kZTogJ0JFUycsIGlzbzJDb2RlOiAnQlEnLCBkYXRhc2V0Q29kZTogJ2JxLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYScsIGlzbzNDb2RlOiAnQklIJywgaXNvMkNvZGU6ICdCQScsIGRhdGFzZXRDb2RlOiAnYmEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEnLCBpc28zQ29kZTogJ0JJSCcsIGlzbzJDb2RlOiAnQkEnLCBkYXRhc2V0Q29kZTogJ2JhLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQm90c3dhbmEnLCBpc28zQ29kZTogJ0JXQScsIGlzbzJDb2RlOiAnQlcnLCBkYXRhc2V0Q29kZTogJ2J3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdCb3Rzd2FuYScsIGlzbzNDb2RlOiAnQldBJywgaXNvMkNvZGU6ICdCVycsIGRhdGFzZXRDb2RlOiAnYnctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCcmF6aWwnLCBpc28zQ29kZTogJ0JSQScsIGlzbzJDb2RlOiAnQlInLCBkYXRhc2V0Q29kZTogJ2JyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdCcmF6aWwnLCBpc28zQ29kZTogJ0JSQScsIGlzbzJDb2RlOiAnQlInLCBkYXRhc2V0Q29kZTogJ2JyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQnJ1bmVpIERhcnVzc2FsYW0nLCBpc28zQ29kZTogJ0JSTicsIGlzbzJDb2RlOiAnQk4nLCBkYXRhc2V0Q29kZTogJ2JuLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdCcnVuZWkgRGFydXNzYWxhbScsIGlzbzNDb2RlOiAnQlJOJywgaXNvMkNvZGU6ICdCTicsIGRhdGFzZXRDb2RlOiAnYm4tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCdWxnYXJpYScsIGlzbzNDb2RlOiAnQkdSJywgaXNvMkNvZGU6ICdCRycsIGRhdGFzZXRDb2RlOiAnYmctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0J1bGdhcmlhJywgaXNvM0NvZGU6ICdCR1InLCBpc28yQ29kZTogJ0JHJywgZGF0YXNldENvZGU6ICdiZy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0J1cmtpbmEgRmFzbycsIGlzbzNDb2RlOiAnQkZBJywgaXNvMkNvZGU6ICdCRicsIGRhdGFzZXRDb2RlOiAnYmYtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0J1cmtpbmEgRmFzbycsIGlzbzNDb2RlOiAnQkZBJywgaXNvMkNvZGU6ICdCRicsIGRhdGFzZXRDb2RlOiAnYmYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdCdXJ1bmRpJywgaXNvM0NvZGU6ICdCREknLCBpc28yQ29kZTogJ0JJJywgZGF0YXNldENvZGU6ICdiaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0NhbWJvZGlhJywgaXNvM0NvZGU6ICdLSE0nLCBpc28yQ29kZTogJ0tIJywgZGF0YXNldENvZGU6ICdraC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2FtYm9kaWEnLCBpc28zQ29kZTogJ0tITScsIGlzbzJDb2RlOiAnS0gnLCBkYXRhc2V0Q29kZTogJ2toLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2FtZXJvb24nLCBpc28zQ29kZTogJ0NNUicsIGlzbzJDb2RlOiAnQ00nLCBkYXRhc2V0Q29kZTogJ2NtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdDYW1lcm9vbicsIGlzbzNDb2RlOiAnQ01SJywgaXNvMkNvZGU6ICdDTScsIGRhdGFzZXRDb2RlOiAnY20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDYW5hZGEnLCBpc28zQ29kZTogJ0NBTicsIGlzbzJDb2RlOiAnQ0EnLCBkYXRhc2V0Q29kZTogJ2NhLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdDYXBlIFZlcmRlJywgaXNvM0NvZGU6ICdDUFYnLCBpc28yQ29kZTogJ0NWJywgZGF0YXNldENvZGU6ICdjdi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2FwZSBWZXJkZScsIGlzbzNDb2RlOiAnQ1BWJywgaXNvMkNvZGU6ICdDVicsIGRhdGFzZXRDb2RlOiAnY3YtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDYXltYW4gSXNsYW5kcycsIGlzbzNDb2RlOiAnQ1lNJywgaXNvMkNvZGU6ICdLWScsIGRhdGFzZXRDb2RlOiAna3ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0NheW1hbiBJc2xhbmRzJywgaXNvM0NvZGU6ICdDWU0nLCBpc28yQ29kZTogJ0tZJywgZGF0YXNldENvZGU6ICdreS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYycsIGlzbzNDb2RlOiAnQ0FGJywgaXNvMkNvZGU6ICdDRicsIGRhdGFzZXRDb2RlOiAnY2YtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYycsIGlzbzNDb2RlOiAnQ0FGJywgaXNvMkNvZGU6ICdDRicsIGRhdGFzZXRDb2RlOiAnY2YtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDaGFkJywgaXNvM0NvZGU6ICdUQ0QnLCBpc28yQ29kZTogJ1REJywgZGF0YXNldENvZGU6ICd0ZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2hhZCcsIGlzbzNDb2RlOiAnVENEJywgaXNvMkNvZGU6ICdURCcsIGRhdGFzZXRDb2RlOiAndGQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDaGlsZScsIGlzbzNDb2RlOiAnQ0hMJywgaXNvMkNvZGU6ICdDTCcsIGRhdGFzZXRDb2RlOiAnY2wtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0NoaWxlJywgaXNvM0NvZGU6ICdDSEwnLCBpc28yQ29kZTogJ0NMJywgZGF0YXNldENvZGU6ICdjbC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0NoaW5hJywgaXNvM0NvZGU6ICdDSE4nLCBpc28yQ29kZTogJ0NOJywgZGF0YXNldENvZGU6ICdjbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2hpbmEnLCBpc28zQ29kZTogJ0NITicsIGlzbzJDb2RlOiAnQ04nLCBkYXRhc2V0Q29kZTogJ2NuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQ2hyaXN0bWFzIElzbGFuZCcsIGlzbzNDb2RlOiAnQ1hSJywgaXNvMkNvZGU6ICdDWCcsIGRhdGFzZXRDb2RlOiAnY3gtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDb2NvcyBJc2xhbmQnLCBpc28zQ29kZTogJ0NDSycsIGlzbzJDb2RlOiAnQ0MnLCBkYXRhc2V0Q29kZTogJ2NjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnQ29sb21iaWEnLCBpc28zQ29kZTogJ0NPTCcsIGlzbzJDb2RlOiAnQ08nLCBkYXRhc2V0Q29kZTogJ2NvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdDb2xvbWJpYScsIGlzbzNDb2RlOiAnQ09MJywgaXNvMkNvZGU6ICdDTycsIGRhdGFzZXRDb2RlOiAnY28tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDb21vcm9zJywgaXNvM0NvZGU6ICdDT00nLCBpc28yQ29kZTogJ0tNJywgZGF0YXNldENvZGU6ICdrbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ29tb3JvcycsIGlzbzNDb2RlOiAnQ09NJywgaXNvMkNvZGU6ICdLTScsIGRhdGFzZXRDb2RlOiAna20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDb25nbycsIGlzbzNDb2RlOiAnQ09HJywgaXNvMkNvZGU6ICdDRycsIGRhdGFzZXRDb2RlOiAnY2ctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0NvbmdvJywgaXNvM0NvZGU6ICdDT0cnLCBpc28yQ29kZTogJ0NHJywgZGF0YXNldENvZGU6ICdjZy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0NvbmdvLCBUaGUgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUnLCBpc28zQ29kZTogJ0NPRCcsIGlzbzJDb2RlOiAnQ0QnLCBkYXRhc2V0Q29kZTogJ2NkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdDb25nbywgVGhlIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlJywgaXNvM0NvZGU6ICdDT0QnLCBpc28yQ29kZTogJ0NEJywgZGF0YXNldENvZGU6ICdjZC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0Nvb2sgSXNsYW5kcycsIGlzbzNDb2RlOiAnQ09LJywgaXNvMkNvZGU6ICdDSycsIGRhdGFzZXRDb2RlOiAnY2stYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0Nvb2sgSXNsYW5kcycsIGlzbzNDb2RlOiAnQ09LJywgaXNvMkNvZGU6ICdDSycsIGRhdGFzZXRDb2RlOiAnY2stYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDb3N0YSBSaWNhJywgaXNvM0NvZGU6ICdDUkknLCBpc28yQ29kZTogJ0NSJywgZGF0YXNldENvZGU6ICdjci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ29zdGEgUmljYScsIGlzbzNDb2RlOiAnQ1JJJywgaXNvMkNvZGU6ICdDUicsIGRhdGFzZXRDb2RlOiAnY3ItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDcm9hdGlhJywgaXNvM0NvZGU6ICdIUlYnLCBpc28yQ29kZTogJ0hSJywgZGF0YXNldENvZGU6ICdoci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ3JvYXRpYScsIGlzbzNDb2RlOiAnSFJWJywgaXNvMkNvZGU6ICdIUicsIGRhdGFzZXRDb2RlOiAnaHItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDdWJhJywgaXNvM0NvZGU6ICdDVUInLCBpc28yQ29kZTogJ0NVJywgZGF0YXNldENvZGU6ICdjdS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnQ3ViYScsIGlzbzNDb2RlOiAnQ1VCJywgaXNvMkNvZGU6ICdDVScsIGRhdGFzZXRDb2RlOiAnY3UtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDdXJhw6dhbycsIGlzbzNDb2RlOiAnQ1VXJywgaXNvMkNvZGU6ICdDVycsIGRhdGFzZXRDb2RlOiAnY3ctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0N1cmHDp2FvJywgaXNvM0NvZGU6ICdDVVcnLCBpc28yQ29kZTogJ0NXJywgZGF0YXNldENvZGU6ICdjdy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0N5cHJ1cycsIGlzbzNDb2RlOiAnQ1lQJywgaXNvMkNvZGU6ICdDWScsIGRhdGFzZXRDb2RlOiAnY3ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0N5cHJ1cycsIGlzbzNDb2RlOiAnQ1lQJywgaXNvMkNvZGU6ICdDWScsIGRhdGFzZXRDb2RlOiAnY3ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdDemVjaCBSZXB1YmxpYycsIGlzbzNDb2RlOiAnQ1pFJywgaXNvMkNvZGU6ICdDWicsIGRhdGFzZXRDb2RlOiAnY3otYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0N6ZWNoIFJlcHVibGljJywgaXNvM0NvZGU6ICdDWkUnLCBpc28yQ29kZTogJ0NaJywgZGF0YXNldENvZGU6ICdjei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0PDtHRlIGRcXCdJdm9pcmUnLCBpc28zQ29kZTogJ0NJVicsIGlzbzJDb2RlOiAnQ0knLCBkYXRhc2V0Q29kZTogJ2NpLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdDw7R0ZSBkXFwnSXZvaXJlJywgaXNvM0NvZGU6ICdDSVYnLCBpc28yQ29kZTogJ0NJJywgZGF0YXNldENvZGU6ICdjaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0Rlbm1hcmsnLCBpc28zQ29kZTogJ0ROSycsIGlzbzJDb2RlOiAnREsnLCBkYXRhc2V0Q29kZTogJ2RrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdEZW5tYXJrJywgaXNvM0NvZGU6ICdETksnLCBpc28yQ29kZTogJ0RLJywgZGF0YXNldENvZGU6ICdkay1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0RqaWJvdXRpJywgaXNvM0NvZGU6ICdESkknLCBpc28yQ29kZTogJ0RKJywgZGF0YXNldENvZGU6ICdkai1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnRGppYm91dGknLCBpc28zQ29kZTogJ0RKSScsIGlzbzJDb2RlOiAnREonLCBkYXRhc2V0Q29kZTogJ2RqLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRG9taW5pY2EnLCBpc28zQ29kZTogJ0RNQScsIGlzbzJDb2RlOiAnRE0nLCBkYXRhc2V0Q29kZTogJ2RtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdEb21pbmljYScsIGlzbzNDb2RlOiAnRE1BJywgaXNvMkNvZGU6ICdETScsIGRhdGFzZXRDb2RlOiAnZG0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdEb21pbmljYW4gUmVwdWJsaWMnLCBpc28zQ29kZTogJ0RPTScsIGlzbzJDb2RlOiAnRE8nLCBkYXRhc2V0Q29kZTogJ2RvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdEb21pbmljYW4gUmVwdWJsaWMnLCBpc28zQ29kZTogJ0RPTScsIGlzbzJDb2RlOiAnRE8nLCBkYXRhc2V0Q29kZTogJ2RvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRWN1YWRvcicsIGlzbzNDb2RlOiAnRUNVJywgaXNvMkNvZGU6ICdFQycsIGRhdGFzZXRDb2RlOiAnZWMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0VjdWFkb3InLCBpc28zQ29kZTogJ0VDVScsIGlzbzJDb2RlOiAnRUMnLCBkYXRhc2V0Q29kZTogJ2VjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRWd5cHQnLCBpc28zQ29kZTogJ0VHWScsIGlzbzJDb2RlOiAnRUcnLCBkYXRhc2V0Q29kZTogJ2VnLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdFZ3lwdCcsIGlzbzNDb2RlOiAnRUdZJywgaXNvMkNvZGU6ICdFRycsIGRhdGFzZXRDb2RlOiAnZWctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdFbCBTYWx2YWRvcicsIGlzbzNDb2RlOiAnU0xWJywgaXNvMkNvZGU6ICdTVicsIGRhdGFzZXRDb2RlOiAnc3YtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0VsIFNhbHZhZG9yJywgaXNvM0NvZGU6ICdTTFYnLCBpc28yQ29kZTogJ1NWJywgZGF0YXNldENvZGU6ICdzdi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0VxdWF0b3JpYWwgR3VpbmVhJywgaXNvM0NvZGU6ICdHTlEnLCBpc28yQ29kZTogJ0dRJywgZGF0YXNldENvZGU6ICdncS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnRXF1YXRvcmlhbCBHdWluZWEnLCBpc28zQ29kZTogJ0dOUScsIGlzbzJDb2RlOiAnR1EnLCBkYXRhc2V0Q29kZTogJ2dxLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRXJpdHJlYScsIGlzbzNDb2RlOiAnRVJJJywgaXNvMkNvZGU6ICdFUicsIGRhdGFzZXRDb2RlOiAnZXItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0VyaXRyZWEnLCBpc28zQ29kZTogJ0VSSScsIGlzbzJDb2RlOiAnRVInLCBkYXRhc2V0Q29kZTogJ2VyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRXN0b25pYScsIGlzbzNDb2RlOiAnRVNUJywgaXNvMkNvZGU6ICdFRScsIGRhdGFzZXRDb2RlOiAnZWUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0VzdG9uaWEnLCBpc28zQ29kZTogJ0VTVCcsIGlzbzJDb2RlOiAnRUUnLCBkYXRhc2V0Q29kZTogJ2VlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRXRoaW9waWEnLCBpc28zQ29kZTogJ0VUSCcsIGlzbzJDb2RlOiAnRVQnLCBkYXRhc2V0Q29kZTogJ2V0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdFdGhpb3BpYScsIGlzbzNDb2RlOiAnRVRIJywgaXNvMkNvZGU6ICdFVCcsIGRhdGFzZXRDb2RlOiAnZXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyknLCBpc28zQ29kZTogJ0ZMSycsIGlzbzJDb2RlOiAnRksnLCBkYXRhc2V0Q29kZTogJ2ZrLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRmFyb2UgSXNsYW5kcycsIGlzbzNDb2RlOiAnRlJPJywgaXNvMkNvZGU6ICdGTycsIGRhdGFzZXRDb2RlOiAnZm8tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0Zhcm9lIElzbGFuZHMnLCBpc28zQ29kZTogJ0ZSTycsIGlzbzJDb2RlOiAnRk8nLCBkYXRhc2V0Q29kZTogJ2ZvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRmlqaScsIGlzbzNDb2RlOiAnRkpJJywgaXNvMkNvZGU6ICdGSicsIGRhdGFzZXRDb2RlOiAnZmotYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0ZpamknLCBpc28zQ29kZTogJ0ZKSScsIGlzbzJDb2RlOiAnRkonLCBkYXRhc2V0Q29kZTogJ2ZqLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnRmlubGFuZCcsIGlzbzNDb2RlOiAnRklOJywgaXNvMkNvZGU6ICdGSScsIGRhdGFzZXRDb2RlOiAnZmktYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxuICB7Y291bnRyeTogJ0ZpbmxhbmQnLCBpc28zQ29kZTogJ0ZJTicsIGlzbzJDb2RlOiAnRkknLCBkYXRhc2V0Q29kZTogJ2ZpLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAndmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdGaW5sYW5kJywgaXNvM0NvZGU6ICdGSU4nLCBpc28yQ29kZTogJ0ZJJywgZGF0YXNldENvZGU6ICdmaS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0ZyYW5jZSBTdHJlZXQgTGV2ZWwnLCBpc28zQ29kZTogJ0ZSQScsIGlzbzJDb2RlOiAnRlInLCBkYXRhc2V0Q29kZTogJ2ZyLWFkZHJlc3Mtc3RyZWV0bGV2ZWwnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnRnJhbmNlIFN1Yi1QcmVtaXNlcyBMZXZlbCcsIGlzbzNDb2RlOiAnRlJBJywgaXNvMkNvZGU6ICdGUicsIGRhdGFzZXRDb2RlOiAnZnItYWRkaXRpb25hbC1oZXhhbGluZTMnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxuICB7Y291bnRyeTogJ0ZyYW5jZSBQcmVtaXNlcyBMZXZlbCcsIGlzbzNDb2RlOiAnRlJBJywgaXNvMkNvZGU6ICdGUicsIGRhdGFzZXRDb2RlOiAnZnItYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdGcmVuY2ggR3VpYW5hJywgaXNvM0NvZGU6ICdHVUYnLCBpc28yQ29kZTogJ0dGJywgZGF0YXNldENvZGU6ICdnZi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0ZyZW5jaCBQb2x5bmVzaWEnLCBpc28zQ29kZTogJ1BZRicsIGlzbzJDb2RlOiAnUEYnLCBkYXRhc2V0Q29kZTogJ3BmLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR2Fib24nLCBpc28zQ29kZTogJ0dBQicsIGlzbzJDb2RlOiAnR0EnLCBkYXRhc2V0Q29kZTogJ2dhLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHYWJvbicsIGlzbzNDb2RlOiAnR0FCJywgaXNvMkNvZGU6ICdHQScsIGRhdGFzZXRDb2RlOiAnZ2EtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdHYW1iaWEnLCBpc28zQ29kZTogJ0dNQicsIGlzbzJDb2RlOiAnR00nLCBkYXRhc2V0Q29kZTogJ2dtLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHYW1iaWEnLCBpc28zQ29kZTogJ0dNQicsIGlzbzJDb2RlOiAnR00nLCBkYXRhc2V0Q29kZTogJ2dtLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR2VvcmdpYScsIGlzbzNDb2RlOiAnR0VPJywgaXNvMkNvZGU6ICdHRScsIGRhdGFzZXRDb2RlOiAnZ2UtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0dlb3JnaWEnLCBpc28zQ29kZTogJ0dFTycsIGlzbzJDb2RlOiAnR0UnLCBkYXRhc2V0Q29kZTogJ2dlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR2VybWFueScsIGlzbzNDb2RlOiAnREVVJywgaXNvMkNvZGU6ICdERScsIGRhdGFzZXRDb2RlOiAnZGUtYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHZXJtYW55JywgaXNvM0NvZGU6ICdERVUnLCBpc28yQ29kZTogJ0RFJywgZGF0YXNldENvZGU6ICdkZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3ZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnR2VybWFueScsIGlzbzNDb2RlOiAnREVVJywgaXNvMkNvZGU6ICdERScsIGRhdGFzZXRDb2RlOiAnZGUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdHaGFuYScsIGlzbzNDb2RlOiAnR0hBJywgaXNvMkNvZGU6ICdHSCcsIGRhdGFzZXRDb2RlOiAnZ2gtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0doYW5hJywgaXNvM0NvZGU6ICdHSEEnLCBpc28yQ29kZTogJ0dIJywgZGF0YXNldENvZGU6ICdnaC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0dpYnJhbHRhcicsIGlzbzNDb2RlOiAnR0lCJywgaXNvMkNvZGU6ICdHSScsIGRhdGFzZXRDb2RlOiAnZ2ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdHcmVlY2UnLCBpc28zQ29kZTogJ0dSQycsIGlzbzJDb2RlOiAnR1InLCBkYXRhc2V0Q29kZTogJ2dyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHcmVlY2UnLCBpc28zQ29kZTogJ0dSQycsIGlzbzJDb2RlOiAnR1InLCBkYXRhc2V0Q29kZTogJ2dyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR3JlZW5sYW5kJywgaXNvM0NvZGU6ICdHUkwnLCBpc28yQ29kZTogJ0dMJywgZGF0YXNldENvZGU6ICdnbC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnR3JlZW5sYW5kJywgaXNvM0NvZGU6ICdHUkwnLCBpc28yQ29kZTogJ0dMJywgZGF0YXNldENvZGU6ICdnbC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0dyZW5hZGEnLCBpc28zQ29kZTogJ0dSRCcsIGlzbzJDb2RlOiAnR0QnLCBkYXRhc2V0Q29kZTogJ2dkLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHcmVuYWRhJywgaXNvM0NvZGU6ICdHUkQnLCBpc28yQ29kZTogJ0dEJywgZGF0YXNldENvZGU6ICdnZC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0d1YWRlbG91cGUnLCBpc28zQ29kZTogJ0dMUCcsIGlzbzJDb2RlOiAnR1AnLCBkYXRhc2V0Q29kZTogJ2dwLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR3VhbScsIGlzbzNDb2RlOiAnR1VNJywgaXNvMkNvZGU6ICdHVScsIGRhdGFzZXRDb2RlOiAnZ3UtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdHdWF0ZW1hbGEnLCBpc28zQ29kZTogJ0dUTScsIGlzbzJDb2RlOiAnR1QnLCBkYXRhc2V0Q29kZTogJ2d0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHdWF0ZW1hbGEnLCBpc28zQ29kZTogJ0dUTScsIGlzbzJDb2RlOiAnR1QnLCBkYXRhc2V0Q29kZTogJ2d0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnR3VpbmVhJywgaXNvM0NvZGU6ICdHSU4nLCBpc28yQ29kZTogJ0dOJywgZGF0YXNldENvZGU6ICdnbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnR3VpbmVhJywgaXNvM0NvZGU6ICdHSU4nLCBpc28yQ29kZTogJ0dOJywgZGF0YXNldENvZGU6ICdnbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0d1aW5lYS1CaXNzYXUnLCBpc28zQ29kZTogJ0dOQicsIGlzbzJDb2RlOiAnR1cnLCBkYXRhc2V0Q29kZTogJ2d3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdHdWluZWEtQmlzc2F1JywgaXNvM0NvZGU6ICdHTkInLCBpc28yQ29kZTogJ0dXJywgZGF0YXNldENvZGU6ICdndy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0d1eWFuYScsIGlzbzNDb2RlOiAnR1VZJywgaXNvMkNvZGU6ICdHWScsIGRhdGFzZXRDb2RlOiAnZ3ktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0d1eWFuYScsIGlzbzNDb2RlOiAnR1VZJywgaXNvMkNvZGU6ICdHWScsIGRhdGFzZXRDb2RlOiAnZ3ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdIYWl0aScsIGlzbzNDb2RlOiAnSFRJJywgaXNvMkNvZGU6ICdIVCcsIGRhdGFzZXRDb2RlOiAnaHQtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0hhaXRpJywgaXNvM0NvZGU6ICdIVEknLCBpc28yQ29kZTogJ0hUJywgZGF0YXNldENvZGU6ICdodC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0hvbmR1cmFzJywgaXNvM0NvZGU6ICdITkQnLCBpc28yQ29kZTogJ0hOJywgZGF0YXNldENvZGU6ICdobi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSG9uZHVyYXMnLCBpc28zQ29kZTogJ0hORCcsIGlzbzJDb2RlOiAnSE4nLCBkYXRhc2V0Q29kZTogJ2huLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnSG9uZyBLb25nJywgaXNvM0NvZGU6ICdIS0cnLCBpc28yQ29kZTogJ0hLJywgZGF0YXNldENvZGU6ICdoay1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSG9uZyBLb25nJywgaXNvM0NvZGU6ICdIS0cnLCBpc28yQ29kZTogJ0hLJywgZGF0YXNldENvZGU6ICdoay1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0h1bmdhcnknLCBpc28zQ29kZTogJ0hVTicsIGlzbzJDb2RlOiAnSFUnLCBkYXRhc2V0Q29kZTogJ2h1LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdIdW5nYXJ5JywgaXNvM0NvZGU6ICdIVU4nLCBpc28yQ29kZTogJ0hVJywgZGF0YXNldENvZGU6ICdodS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0ljZWxhbmQnLCBpc28zQ29kZTogJ0lTTCcsIGlzbzJDb2RlOiAnSVMnLCBkYXRhc2V0Q29kZTogJ2lzLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdJY2VsYW5kJywgaXNvM0NvZGU6ICdJU0wnLCBpc28yQ29kZTogJ0lTJywgZGF0YXNldENvZGU6ICdpcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0luZGlhJywgaXNvM0NvZGU6ICdJTkQnLCBpc28yQ29kZTogJ0lOJywgZGF0YXNldENvZGU6ICdpbi1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSW5kaWEnLCBpc28zQ29kZTogJ0lORCcsIGlzbzJDb2RlOiAnSU4nLCBkYXRhc2V0Q29kZTogJ2luLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnSW5kb25lc2lhJywgaXNvM0NvZGU6ICdJRE4nLCBpc28yQ29kZTogJ0lEJywgZGF0YXNldENvZGU6ICdpZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSW5kb25lc2lhJywgaXNvM0NvZGU6ICdJRE4nLCBpc28yQ29kZTogJ0lEJywgZGF0YXNldENvZGU6ICdpZC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0lyYW4sIElzbGFtaWMgUmVwdWJsaWMgb2YnLCBpc28zQ29kZTogJ0lSTicsIGlzbzJDb2RlOiAnSVInLCBkYXRhc2V0Q29kZTogJ2lyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdJcmFuLCBJc2xhbWljIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdJUk4nLCBpc28yQ29kZTogJ0lSJywgZGF0YXNldENvZGU6ICdpci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0lyYXEnLCBpc28zQ29kZTogJ0lSUScsIGlzbzJDb2RlOiAnSVEnLCBkYXRhc2V0Q29kZTogJ2lxLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdJcmFxJywgaXNvM0NvZGU6ICdJUlEnLCBpc28yQ29kZTogJ0lRJywgZGF0YXNldENvZGU6ICdpcS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0lyZWxhbmQnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcbiAge2NvdW50cnk6ICdJcmVsYW5kJywgaXNvM0NvZGU6ICdJUkwnLCBpc28yQ29kZTogJ0lFJywgZGF0YXNldENvZGU6ICdpZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSXJlbGFuZCcsIGlzbzNDb2RlOiAnSVJMJywgaXNvMkNvZGU6ICdJRScsIGRhdGFzZXRDb2RlOiAnaWUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdJcmVsYW5kIEVpcmNvZGUnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZGl0aW9uYWwtZWlyY29kZScsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdJcmVsYW5kIEVDQUQnLCBpc28zQ29kZTogJ0lSTCcsIGlzbzJDb2RlOiAnSUUnLCBkYXRhc2V0Q29kZTogJ2llLWFkZHJlc3MtZWNhZCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdJc3JhZWwnLCBpc28zQ29kZTogJ0lTUicsIGlzbzJDb2RlOiAnSUwnLCBkYXRhc2V0Q29kZTogJ2lsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdJc3JhZWwnLCBpc28zQ29kZTogJ0lTUicsIGlzbzJDb2RlOiAnSUwnLCBkYXRhc2V0Q29kZTogJ2lsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnSXRhbHknLCBpc28zQ29kZTogJ0lUQScsIGlzbzJDb2RlOiAnSVQnLCBkYXRhc2V0Q29kZTogJ2l0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdJdGFseScsIGlzbzNDb2RlOiAnSVRBJywgaXNvMkNvZGU6ICdJVCcsIGRhdGFzZXRDb2RlOiAnaXQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdKYW1haWNhJywgaXNvM0NvZGU6ICdKQU0nLCBpc28yQ29kZTogJ0pNJywgZGF0YXNldENvZGU6ICdqbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSmFtYWljYScsIGlzbzNDb2RlOiAnSkFNJywgaXNvMkNvZGU6ICdKTScsIGRhdGFzZXRDb2RlOiAnam0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdKYXBhbicsIGlzbzNDb2RlOiAnSlBOJywgaXNvMkNvZGU6ICdKUCcsIGRhdGFzZXRDb2RlOiAnanAtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0phcGFuJywgaXNvM0NvZGU6ICdKUE4nLCBpc28yQ29kZTogJ0pQJywgZGF0YXNldENvZGU6ICdqcC1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSm9yZGFuJywgaXNvM0NvZGU6ICdKT1InLCBpc28yQ29kZTogJ0pPJywgZGF0YXNldENvZGU6ICdqby1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnSm9yZGFuJywgaXNvM0NvZGU6ICdKT1InLCBpc28yQ29kZTogJ0pPJywgZGF0YXNldENvZGU6ICdqby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0themFraHN0YW4nLCBpc28zQ29kZTogJ0tBWicsIGlzbzJDb2RlOiAnS1onLCBkYXRhc2V0Q29kZTogJ2t6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdLYXpha2hzdGFuJywgaXNvM0NvZGU6ICdLQVonLCBpc28yQ29kZTogJ0taJywgZGF0YXNldENvZGU6ICdrei1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0tlbnlhJywgaXNvM0NvZGU6ICdLRU4nLCBpc28yQ29kZTogJ0tFJywgZGF0YXNldENvZGU6ICdrZS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnS2VueWEnLCBpc28zQ29kZTogJ0tFTicsIGlzbzJDb2RlOiAnS0UnLCBkYXRhc2V0Q29kZTogJ2tlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnS2lyaWJhdGknLCBpc28zQ29kZTogJ0tJUicsIGlzbzJDb2RlOiAnS0knLCBkYXRhc2V0Q29kZTogJ2tpLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdLaXJpYmF0aScsIGlzbzNDb2RlOiAnS0lSJywgaXNvMkNvZGU6ICdLSScsIGRhdGFzZXRDb2RlOiAna2ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdLb3JlYSwgRGVtb2NyYXRpYyBQZW9wbGVcXCdzIFJlcHVibGljIG9mJywgaXNvM0NvZGU6ICdQUksnLCBpc28yQ29kZTogJ0tQJywgZGF0YXNldENvZGU6ICdrcC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnS29yZWEsIERlbW9jcmF0aWMgUGVvcGxlXFwncyBSZXB1YmxpYyBvZicsIGlzbzNDb2RlOiAnUFJLJywgaXNvMkNvZGU6ICdLUCcsIGRhdGFzZXRDb2RlOiAna3AtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdLb3JlYSwgUmVwdWJsaWMgb2YnLCBpc28zQ29kZTogJ0tPUicsIGlzbzJDb2RlOiAnS1InLCBkYXRhc2V0Q29kZTogJ2tyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdLb3JlYSwgUmVwdWJsaWMgb2YnLCBpc28zQ29kZTogJ0tPUicsIGlzbzJDb2RlOiAnS1InLCBkYXRhc2V0Q29kZTogJ2tyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnS29zb3ZvJywgaXNvM0NvZGU6ICdLT1MnLCBpc28yQ29kZTogJ1hLJywgZGF0YXNldENvZGU6ICdrdi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ0t1d2FpdCcsIGlzbzNDb2RlOiAnS1dUJywgaXNvMkNvZGU6ICdLVycsIGRhdGFzZXRDb2RlOiAna3ctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0t1d2FpdCcsIGlzbzNDb2RlOiAnS1dUJywgaXNvMkNvZGU6ICdLVycsIGRhdGFzZXRDb2RlOiAna3ctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdLeXJneXpzdGFuJywgaXNvM0NvZGU6ICdLR1onLCBpc28yQ29kZTogJ0tHJywgZGF0YXNldENvZGU6ICdrZy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnS3lyZ3l6c3RhbicsIGlzbzNDb2RlOiAnS0daJywgaXNvMkNvZGU6ICdLRycsIGRhdGFzZXRDb2RlOiAna2ctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdMYW9zJywgaXNvM0NvZGU6ICdMQU8nLCBpc28yQ29kZTogJ0xBJywgZGF0YXNldENvZGU6ICdsYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTGFvcycsIGlzbzNDb2RlOiAnTEFPJywgaXNvMkNvZGU6ICdMQScsIGRhdGFzZXRDb2RlOiAnbGEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdMYXR2aWEnLCBpc28zQ29kZTogJ0xWQScsIGlzbzJDb2RlOiAnTFYnLCBkYXRhc2V0Q29kZTogJ2x2LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdMYXR2aWEnLCBpc28zQ29kZTogJ0xWQScsIGlzbzJDb2RlOiAnTFYnLCBkYXRhc2V0Q29kZTogJ2x2LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTGViYW5vbicsIGlzbzNDb2RlOiAnTEJOJywgaXNvMkNvZGU6ICdMQicsIGRhdGFzZXRDb2RlOiAnbGItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0xlYmFub24nLCBpc28zQ29kZTogJ0xCTicsIGlzbzJDb2RlOiAnTEInLCBkYXRhc2V0Q29kZTogJ2xiLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTGVzb3RobycsIGlzbzNDb2RlOiAnTFNPJywgaXNvMkNvZGU6ICdMUycsIGRhdGFzZXRDb2RlOiAnbHMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0xlc290aG8nLCBpc28zQ29kZTogJ0xTTycsIGlzbzJDb2RlOiAnTFMnLCBkYXRhc2V0Q29kZTogJ2xzLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTGliZXJpYScsIGlzbzNDb2RlOiAnTEJSJywgaXNvMkNvZGU6ICdMUicsIGRhdGFzZXRDb2RlOiAnbHItYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0xpYmVyaWEnLCBpc28zQ29kZTogJ0xCUicsIGlzbzJDb2RlOiAnTFInLCBkYXRhc2V0Q29kZTogJ2xyLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTGlieWEnLCBpc28zQ29kZTogJ0xCWScsIGlzbzJDb2RlOiAnTFknLCBkYXRhc2V0Q29kZTogJ2x5LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdMaWJ5YScsIGlzbzNDb2RlOiAnTEJZJywgaXNvMkNvZGU6ICdMWScsIGRhdGFzZXRDb2RlOiAnbHktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdMaWVjaHRlbnN0ZWluJywgaXNvM0NvZGU6ICdMSUUnLCBpc28yQ29kZTogJ0xJJywgZGF0YXNldENvZGU6ICdsaS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTGllY2h0ZW5zdGVpbicsIGlzbzNDb2RlOiAnTElFJywgaXNvMkNvZGU6ICdMSScsIGRhdGFzZXRDb2RlOiAnbGktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdMaXRodWFuaWEnLCBpc28zQ29kZTogJ0xUVScsIGlzbzJDb2RlOiAnTFQnLCBkYXRhc2V0Q29kZTogJ2x0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdMaXRodWFuaWEnLCBpc28zQ29kZTogJ0xUVScsIGlzbzJDb2RlOiAnTFQnLCBkYXRhc2V0Q29kZTogJ2x0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTHV4ZW1ib3VyZycsIGlzbzNDb2RlOiAnTFVYJywgaXNvMkNvZGU6ICdMVScsIGRhdGFzZXRDb2RlOiAnbHUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ0x1eGVtYm91cmcnLCBpc28zQ29kZTogJ0xVWCcsIGlzbzJDb2RlOiAnTFUnLCBkYXRhc2V0Q29kZTogJ2x1LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTWFjYXUnLCBpc28zQ29kZTogJ01BQycsIGlzbzJDb2RlOiAnTU8nLCBkYXRhc2V0Q29kZTogJ2x2LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNYWNhdScsIGlzbzNDb2RlOiAnTUFDJywgaXNvMkNvZGU6ICdNTycsIGRhdGFzZXRDb2RlOiAnbHYtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNYWRhZ2FzY2FyJywgaXNvM0NvZGU6ICdNREcnLCBpc28yQ29kZTogJ01HJywgZGF0YXNldENvZGU6ICdtby1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTWFkYWdhc2NhcicsIGlzbzNDb2RlOiAnTURHJywgaXNvMkNvZGU6ICdNRycsIGRhdGFzZXRDb2RlOiAnbW8tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNYWxhd2knLCBpc28zQ29kZTogJ01XSScsIGlzbzJDb2RlOiAnTVcnLCBkYXRhc2V0Q29kZTogJ213LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNYWxhd2knLCBpc28zQ29kZTogJ01XSScsIGlzbzJDb2RlOiAnTVcnLCBkYXRhc2V0Q29kZTogJ213LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTWFsYXlzaWEnLCBpc28zQ29kZTogJ01ZUycsIGlzbzJDb2RlOiAnTVknLCBkYXRhc2V0Q29kZTogJ215LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNYWxheXNpYScsIGlzbzNDb2RlOiAnTVlTJywgaXNvMkNvZGU6ICdNWScsIGRhdGFzZXRDb2RlOiAnbXktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNYWxkaXZlcycsIGlzbzNDb2RlOiAnTURWJywgaXNvMkNvZGU6ICdNVicsIGRhdGFzZXRDb2RlOiAnbXYtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01hbGRpdmVzJywgaXNvM0NvZGU6ICdNRFYnLCBpc28yQ29kZTogJ01WJywgZGF0YXNldENvZGU6ICdtdi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01hbGknLCBpc28zQ29kZTogJ01MSScsIGlzbzJDb2RlOiAnTUwnLCBkYXRhc2V0Q29kZTogJ21sLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNYWxpJywgaXNvM0NvZGU6ICdNTEknLCBpc28yQ29kZTogJ01MJywgZGF0YXNldENvZGU6ICdtbC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01hbHRhJywgaXNvM0NvZGU6ICdNTFQnLCBpc28yQ29kZTogJ01UJywgZGF0YXNldENvZGU6ICdtdC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTWFsdGEnLCBpc28zQ29kZTogJ01MVCcsIGlzbzJDb2RlOiAnTVQnLCBkYXRhc2V0Q29kZTogJ210LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTWFyc2hhbGwgSXNsYW5kcycsIGlzbzNDb2RlOiAnTUhMJywgaXNvMkNvZGU6ICdNSCcsIGRhdGFzZXRDb2RlOiAnbWgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNYXJ0aW5pcXVlJywgaXNvM0NvZGU6ICdNVFEnLCBpc28yQ29kZTogJ01RJywgZGF0YXNldENvZGU6ICdtcS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01hdXJpdGFuaWEnLCBpc28zQ29kZTogJ01SVCcsIGlzbzJDb2RlOiAnTVInLCBkYXRhc2V0Q29kZTogJ21yLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNYXVyaXRhbmlhJywgaXNvM0NvZGU6ICdNUlQnLCBpc28yQ29kZTogJ01SJywgZGF0YXNldENvZGU6ICdtci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01hdXJpdGl1cycsIGlzbzNDb2RlOiAnTVVTJywgaXNvMkNvZGU6ICdNVScsIGRhdGFzZXRDb2RlOiAnbXUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01hdXJpdGl1cycsIGlzbzNDb2RlOiAnTVVTJywgaXNvMkNvZGU6ICdNVScsIGRhdGFzZXRDb2RlOiAnbXUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNYXlvdHRlJywgaXNvM0NvZGU6ICdNWVQnLCBpc28yQ29kZTogJ1lUJywgZGF0YXNldENvZGU6ICd5dC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01leGljbycsIGlzbzNDb2RlOiAnTUVYJywgaXNvMkNvZGU6ICdNWCcsIGRhdGFzZXRDb2RlOiAnbXgtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01leGljbycsIGlzbzNDb2RlOiAnTUVYJywgaXNvMkNvZGU6ICdNWCcsIGRhdGFzZXRDb2RlOiAnbXgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNaWNyb25lc2lhLCBGZWRlcmF0ZWQgU3RhdGVzIG9mJywgaXNvM0NvZGU6ICdGU00nLCBpc28yQ29kZTogJ0ZNJywgZGF0YXNldENvZGU6ICdmbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01vbGRvdmEnLCBpc28zQ29kZTogJ01EQScsIGlzbzJDb2RlOiAnTUQnLCBkYXRhc2V0Q29kZTogJ21kLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNb2xkb3ZhJywgaXNvM0NvZGU6ICdNREEnLCBpc28yQ29kZTogJ01EJywgZGF0YXNldENvZGU6ICdtZC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01vbmFjbycsIGlzbzNDb2RlOiAnTUNPJywgaXNvMkNvZGU6ICdNQycsIGRhdGFzZXRDb2RlOiAnbWMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01vbmFjbycsIGlzbzNDb2RlOiAnTUNPJywgaXNvMkNvZGU6ICdNQycsIGRhdGFzZXRDb2RlOiAnbWMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdNb25nb2xpYScsIGlzbzNDb2RlOiAnTU5HJywgaXNvMkNvZGU6ICdNTicsIGRhdGFzZXRDb2RlOiAnbW4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01vbmdvbGlhJywgaXNvM0NvZGU6ICdNTkcnLCBpc28yQ29kZTogJ01OJywgZGF0YXNldENvZGU6ICdtbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01vbnRlbmVncm8nLCBpc28zQ29kZTogJ01ORScsIGlzbzJDb2RlOiAnTUUnLCBkYXRhc2V0Q29kZTogJ21lLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdNb250ZW5lZ3JvJywgaXNvM0NvZGU6ICdNTkUnLCBpc28yQ29kZTogJ01FJywgZGF0YXNldENvZGU6ICdtZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ01vbnRzZXJyYXQnLCBpc28zQ29kZTogJ01TUicsIGlzbzJDb2RlOiAnTVMnLCBkYXRhc2V0Q29kZTogJ21zLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTW9yb2NjbycsIGlzbzNDb2RlOiAnTUFSJywgaXNvMkNvZGU6ICdNQScsIGRhdGFzZXRDb2RlOiAnbWEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01vcm9jY28nLCBpc28zQ29kZTogJ01BUicsIGlzbzJDb2RlOiAnTUEnLCBkYXRhc2V0Q29kZTogJ21hLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTW96YW1iaXF1ZScsIGlzbzNDb2RlOiAnTU9aJywgaXNvMkNvZGU6ICdNWicsIGRhdGFzZXRDb2RlOiAnbXotYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ01vemFtYmlxdWUnLCBpc28zQ29kZTogJ01PWicsIGlzbzJDb2RlOiAnTVonLCBkYXRhc2V0Q29kZTogJ216LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTXlhbm1hcicsIGlzbzNDb2RlOiAnTU1SJywgaXNvMkNvZGU6ICdNTScsIGRhdGFzZXRDb2RlOiAnbW0tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ015YW5tYXInLCBpc28zQ29kZTogJ01NUicsIGlzbzJDb2RlOiAnTU0nLCBkYXRhc2V0Q29kZTogJ21tLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTmFtaWJpYScsIGlzbzNDb2RlOiAnTkFNJywgaXNvMkNvZGU6ICdOQScsIGRhdGFzZXRDb2RlOiAnbmEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05hbWliaWEnLCBpc28zQ29kZTogJ05BTScsIGlzbzJDb2RlOiAnTkEnLCBkYXRhc2V0Q29kZTogJ25hLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTmF1cnUnLCBpc28zQ29kZTogJ05SVScsIGlzbzJDb2RlOiAnTlInLCBkYXRhc2V0Q29kZTogJ25yLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdOYXVydScsIGlzbzNDb2RlOiAnTlJVJywgaXNvMkNvZGU6ICdOUicsIGRhdGFzZXRDb2RlOiAnbnItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdOZXBhbCcsIGlzbzNDb2RlOiAnTlBMJywgaXNvMkNvZGU6ICdOUCcsIGRhdGFzZXRDb2RlOiAnbnAtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05lcGFsJywgaXNvM0NvZGU6ICdOUEwnLCBpc28yQ29kZTogJ05QJywgZGF0YXNldENvZGU6ICducC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ05ldGhlcmxhbmRzJywgaXNvM0NvZGU6ICdOTEQnLCBpc28yQ29kZTogJ05MJywgZGF0YXNldENvZGU6ICdubC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTmV0aGVybGFuZHMnLCBpc28zQ29kZTogJ05MRCcsIGlzbzJDb2RlOiAnTkwnLCBkYXRhc2V0Q29kZTogJ25sLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTmV3IENhbGVkb25pYScsIGlzbzNDb2RlOiAnTkNMJywgaXNvMkNvZGU6ICdOQycsIGRhdGFzZXRDb2RlOiAnbmMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdOZXcgWmVhbGFuZCBEYXRhRnVzaW9uJywgaXNvM0NvZGU6ICdOWkwnLCBpc28yQ29kZTogJ05aJywgZGF0YXNldENvZGU6ICduei1hZGRpdGlvbmFsLWRhdGFmdXNpb24nLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlLCBzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdOZXcgWmVhbGFuZCBQb3N0YWwgQWRkcmVzcycsIGlzbzNDb2RlOiAnTlpMJywgaXNvMkNvZGU6ICdOWicsIGRhdGFzZXRDb2RlOiAnbnotYWRkcmVzcycsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUsIHNpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05pY2FyYWd1YScsIGlzbzNDb2RlOiAnTklDJywgaXNvMkNvZGU6ICdOSScsIGRhdGFzZXRDb2RlOiAnbmktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05pY2FyYWd1YScsIGlzbzNDb2RlOiAnTklDJywgaXNvMkNvZGU6ICdOSScsIGRhdGFzZXRDb2RlOiAnbmktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdOaWdlcicsIGlzbzNDb2RlOiAnTkVSJywgaXNvMkNvZGU6ICdORScsIGRhdGFzZXRDb2RlOiAnbmUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05pZ2VyJywgaXNvM0NvZGU6ICdORVInLCBpc28yQ29kZTogJ05FJywgZGF0YXNldENvZGU6ICduZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ05pZ2VyaWEnLCBpc28zQ29kZTogJ05HQScsIGlzbzJDb2RlOiAnTkcnLCBkYXRhc2V0Q29kZTogJ25nLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdOaWdlcmlhJywgaXNvM0NvZGU6ICdOR0EnLCBpc28yQ29kZTogJ05HJywgZGF0YXNldENvZGU6ICduZy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ05pdWUnLCBpc28zQ29kZTogJ05JVScsIGlzbzJDb2RlOiAnTlUnLCBkYXRhc2V0Q29kZTogJ251LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdOb3Jmb2xrIElzbGFuZCcsIGlzbzNDb2RlOiAnTkZLJywgaXNvMkNvZGU6ICdORicsIGRhdGFzZXRDb2RlOiAnbmYtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05vcmZvbGsgSXNsYW5kJywgaXNvM0NvZGU6ICdORksnLCBpc28yQ29kZTogJ05GJywgZGF0YXNldENvZGU6ICduZi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ05vcnRoIE1hY2Vkb25pYScsIGlzbzNDb2RlOiAnTUtEJywgaXNvMkNvZGU6ICdNSycsIGRhdGFzZXRDb2RlOiAnbWstYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ05vcnRoIE1hY2Vkb25pYScsIGlzbzNDb2RlOiAnTUtEJywgaXNvMkNvZGU6ICdNSycsIGRhdGFzZXRDb2RlOiAnbWstYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMnLCBpc28zQ29kZTogJ01OUCcsIGlzbzJDb2RlOiAnTVAnLCBkYXRhc2V0Q29kZTogJ21wLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnTm9yd2F5JywgaXNvM0NvZGU6ICdOT1InLCBpc28yQ29kZTogJ05PJywgZGF0YXNldENvZGU6ICduby1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3ZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnTm9yd2F5JywgaXNvM0NvZGU6ICdOT1InLCBpc28yQ29kZTogJ05PJywgZGF0YXNldENvZGU6ICduby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ09tYW4nLCBpc28zQ29kZTogJ09NTicsIGlzbzJDb2RlOiAnT00nLCBkYXRhc2V0Q29kZTogJ29tLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdPbWFuJywgaXNvM0NvZGU6ICdPTU4nLCBpc28yQ29kZTogJ09NJywgZGF0YXNldENvZGU6ICdvbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1Bha2lzdGFuJywgaXNvM0NvZGU6ICdQQUsnLCBpc28yQ29kZTogJ1BLJywgZGF0YXNldENvZGU6ICdway1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnUGFraXN0YW4nLCBpc28zQ29kZTogJ1BBSycsIGlzbzJDb2RlOiAnUEsnLCBkYXRhc2V0Q29kZTogJ3BrLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnUGFsYXUnLCBpc28zQ29kZTogJ1BMVycsIGlzbzJDb2RlOiAnUFcnLCBkYXRhc2V0Q29kZTogJ3B3LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnUGFsZXN0aW5lJywgaXNvM0NvZGU6ICdQU0UnLCBpc28yQ29kZTogJ1BTJywgZGF0YXNldENvZGU6ICdwcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1BhbmFtYScsIGlzbzNDb2RlOiAnUEFOJywgaXNvMkNvZGU6ICdQQScsIGRhdGFzZXRDb2RlOiAncGEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1BhbmFtYScsIGlzbzNDb2RlOiAnUEFOJywgaXNvMkNvZGU6ICdQQScsIGRhdGFzZXRDb2RlOiAncGEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdQYXB1YSBOZXcgR3VpbmVhJywgaXNvM0NvZGU6ICdQTkcnLCBpc28yQ29kZTogJ1BHJywgZGF0YXNldENvZGU6ICdwZy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnUGFwdWEgTmV3IEd1aW5lYScsIGlzbzNDb2RlOiAnUE5HJywgaXNvMkNvZGU6ICdQRycsIGRhdGFzZXRDb2RlOiAncGctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdQYXJhZ3VheScsIGlzbzNDb2RlOiAnUFJZJywgaXNvMkNvZGU6ICdQWScsIGRhdGFzZXRDb2RlOiAncHktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1BhcmFndWF5JywgaXNvM0NvZGU6ICdQUlknLCBpc28yQ29kZTogJ1BZJywgZGF0YXNldENvZGU6ICdweS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1BlcnUnLCBpc28zQ29kZTogJ1BFUicsIGlzbzJDb2RlOiAnUEUnLCBkYXRhc2V0Q29kZTogJ3BlLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdQZXJ1JywgaXNvM0NvZGU6ICdQRVInLCBpc28yQ29kZTogJ1BFJywgZGF0YXNldENvZGU6ICdwZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1BoaWxpcHBpbmVzJywgaXNvM0NvZGU6ICdQSEwnLCBpc28yQ29kZTogJ1BIJywgZGF0YXNldENvZGU6ICdwaC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnUGhpbGlwcGluZXMnLCBpc28zQ29kZTogJ1BITCcsIGlzbzJDb2RlOiAnUEgnLCBkYXRhc2V0Q29kZTogJ3BoLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnUGl0Y2Fpcm4gSXNsYW5kcycsIGlzbzNDb2RlOiAnUENOJywgaXNvMkNvZGU6ICdQTicsIGRhdGFzZXRDb2RlOiAncG4tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdQb2xhbmQnLCBpc28zQ29kZTogJ1BPTCcsIGlzbzJDb2RlOiAnUEwnLCBkYXRhc2V0Q29kZTogJ3BsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdQb2xhbmQnLCBpc28zQ29kZTogJ1BPTCcsIGlzbzJDb2RlOiAnUEwnLCBkYXRhc2V0Q29kZTogJ3BsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnUG9ydHVnYWwnLCBpc28zQ29kZTogJ1BSVCcsIGlzbzJDb2RlOiAnUFQnLCBkYXRhc2V0Q29kZTogJ3B0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdQb3J0dWdhbCcsIGlzbzNDb2RlOiAnUFJUJywgaXNvMkNvZGU6ICdQVCcsIGRhdGFzZXRDb2RlOiAncHQtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdRYXRhcicsIGlzbzNDb2RlOiAnUUFUJywgaXNvMkNvZGU6ICdRQScsIGRhdGFzZXRDb2RlOiAncWEtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1FhdGFyJywgaXNvM0NvZGU6ICdRQVQnLCBpc28yQ29kZTogJ1FBJywgZGF0YXNldENvZGU6ICdxYS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1JvbWFuaWEnLCBpc28zQ29kZTogJ1JPVScsIGlzbzJDb2RlOiAnUk8nLCBkYXRhc2V0Q29kZTogJ3JvLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdSb21hbmlhJywgaXNvM0NvZGU6ICdST1UnLCBpc28yQ29kZTogJ1JPJywgZGF0YXNldENvZGU6ICdyby1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1J1c3NpYW4gRmVkZXJhdGlvbicsIGlzbzNDb2RlOiAnUlVTJywgaXNvMkNvZGU6ICdSVScsIGRhdGFzZXRDb2RlOiAncnUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1J1c3NpYW4gRmVkZXJhdGlvbicsIGlzbzNDb2RlOiAnUlVTJywgaXNvMkNvZGU6ICdSVScsIGRhdGFzZXRDb2RlOiAncnUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdSd2FuZGEnLCBpc28zQ29kZTogJ1JXQScsIGlzbzJDb2RlOiAnUlcnLCBkYXRhc2V0Q29kZTogJ3J3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdSd2FuZGEnLCBpc28zQ29kZTogJ1JXQScsIGlzbzJDb2RlOiAnUlcnLCBkYXRhc2V0Q29kZTogJ3J3LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnUsOpdW5pb24nLCBpc28zQ29kZTogJ1JFVScsIGlzbzJDb2RlOiAnUkUnLCBkYXRhc2V0Q29kZTogJ3JlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2FpbnQgQmFydGjDqWxlbXknLCBpc28zQ29kZTogJ0JMTScsIGlzbzJDb2RlOiAnQkwnLCBkYXRhc2V0Q29kZTogJ2JsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2FpbnQgSGVsZW5hJywgaXNvM0NvZGU6ICdTSE4nLCBpc28yQ29kZTogJ1NIJywgZGF0YXNldENvZGU6ICdzaC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycsIGlzbzNDb2RlOiAnS05BJywgaXNvMkNvZGU6ICdLTicsIGRhdGFzZXRDb2RlOiAna24tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycsIGlzbzNDb2RlOiAnS05BJywgaXNvMkNvZGU6ICdLTicsIGRhdGFzZXRDb2RlOiAna24tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTYWludCBMdWNpYScsIGlzbzNDb2RlOiAnTENBJywgaXNvMkNvZGU6ICdMQycsIGRhdGFzZXRDb2RlOiAnbGMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uJywgaXNvM0NvZGU6ICdTUE0nLCBpc28yQ29kZTogJ1BNJywgZGF0YXNldENvZGU6ICdwbS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzJywgaXNvM0NvZGU6ICdWQ1QnLCBpc28yQ29kZTogJ1ZDJywgZGF0YXNldENvZGU6ICd2Yy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMnLCBpc28zQ29kZTogJ1ZDVCcsIGlzbzJDb2RlOiAnVkMnLCBkYXRhc2V0Q29kZTogJ3ZjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2Ftb2EnLCBpc28zQ29kZTogJ1dTTScsIGlzbzJDb2RlOiAnV1MnLCBkYXRhc2V0Q29kZTogJ3dzLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTYW1vYScsIGlzbzNDb2RlOiAnV1NNJywgaXNvMkNvZGU6ICdXUycsIGRhdGFzZXRDb2RlOiAnd3MtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTYW4gTWFyaW5vJywgaXNvM0NvZGU6ICdTTVInLCBpc28yQ29kZTogJ1NNJywgZGF0YXNldENvZGU6ICdzbS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2FuIE1hcmlubycsIGlzbzNDb2RlOiAnU01SJywgaXNvMkNvZGU6ICdTTScsIGRhdGFzZXRDb2RlOiAnc20tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUnLCBpc28zQ29kZTogJ1NUUCcsIGlzbzJDb2RlOiAnU1QnLCBkYXRhc2V0Q29kZTogJ3N0LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTYW8gVG9tZSBhbmQgUHJpbmNpcGUnLCBpc28zQ29kZTogJ1NUUCcsIGlzbzJDb2RlOiAnU1QnLCBkYXRhc2V0Q29kZTogJ3N0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2F1ZGkgQXJhYmlhJywgaXNvM0NvZGU6ICdTQVUnLCBpc28yQ29kZTogJ1NBJywgZGF0YXNldENvZGU6ICdzYS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2F1ZGkgQXJhYmlhJywgaXNvM0NvZGU6ICdTQVUnLCBpc28yQ29kZTogJ1NBJywgZGF0YXNldENvZGU6ICdzYS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NlbmVnYWwnLCBpc28zQ29kZTogJ1NFTicsIGlzbzJDb2RlOiAnU04nLCBkYXRhc2V0Q29kZTogJ3NuLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTZW5lZ2FsJywgaXNvM0NvZGU6ICdTRU4nLCBpc28yQ29kZTogJ1NOJywgZGF0YXNldENvZGU6ICdzbi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NlcmJpYScsIGlzbzNDb2RlOiAnU1JCJywgaXNvMkNvZGU6ICdSUycsIGRhdGFzZXRDb2RlOiAncnMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1NlcmJpYScsIGlzbzNDb2RlOiAnU1JCJywgaXNvMkNvZGU6ICdSUycsIGRhdGFzZXRDb2RlOiAncnMtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTZXljaGVsbGVzJywgaXNvM0NvZGU6ICdTWUMnLCBpc28yQ29kZTogJ1NDJywgZGF0YXNldENvZGU6ICdzYy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2V5Y2hlbGxlcycsIGlzbzNDb2RlOiAnU1lDJywgaXNvMkNvZGU6ICdTQycsIGRhdGFzZXRDb2RlOiAnc2MtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTaWVycmEgTGVvbmUnLCBpc28zQ29kZTogJ1NMRScsIGlzbzJDb2RlOiAnU0wnLCBkYXRhc2V0Q29kZTogJ3NsLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTaWVycmEgTGVvbmUnLCBpc28zQ29kZTogJ1NMRScsIGlzbzJDb2RlOiAnU0wnLCBkYXRhc2V0Q29kZTogJ3NsLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2luZ2Fwb3JlJywgaXNvM0NvZGU6ICdTR1AnLCBpc28yQ29kZTogJ1NHJywgZGF0YXNldENvZGU6ICdzZy1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSwgc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2ludCBNYWFydGVuJywgaXNvM0NvZGU6ICdTWE0nLCBpc28yQ29kZTogJ1NYJywgZGF0YXNldENvZGU6ICdzeC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2ludCBNYWFydGVuJywgaXNvM0NvZGU6ICdTWE0nLCBpc28yQ29kZTogJ1NYJywgZGF0YXNldENvZGU6ICdzeC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1Nsb3Zha2lhJywgaXNvM0NvZGU6ICdTVksnLCBpc28yQ29kZTogJ1NLJywgZGF0YXNldENvZGU6ICdzay1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU2xvdmFraWEnLCBpc28zQ29kZTogJ1NWSycsIGlzbzJDb2RlOiAnU0snLCBkYXRhc2V0Q29kZTogJ3NrLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU2xvdmVuaWEnLCBpc28zQ29kZTogJ1NWTicsIGlzbzJDb2RlOiAnU0knLCBkYXRhc2V0Q29kZTogJ3NpLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTbG92ZW5pYScsIGlzbzNDb2RlOiAnU1ZOJywgaXNvMkNvZGU6ICdTSScsIGRhdGFzZXRDb2RlOiAnc2ktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTb2xvbW9uIElzbGFuZHMnLCBpc28zQ29kZTogJ1NMQicsIGlzbzJDb2RlOiAnU0InLCBkYXRhc2V0Q29kZTogJ3NiLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTb2xvbW9uIElzbGFuZHMnLCBpc28zQ29kZTogJ1NMQicsIGlzbzJDb2RlOiAnU0InLCBkYXRhc2V0Q29kZTogJ3NiLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU29tYWxpYScsIGlzbzNDb2RlOiAnU09NJywgaXNvMkNvZGU6ICdTTycsIGRhdGFzZXRDb2RlOiAnc28tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1NvbWFsaWEnLCBpc28zQ29kZTogJ1NPTScsIGlzbzJDb2RlOiAnU08nLCBkYXRhc2V0Q29kZTogJ3NvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU291dGggQWZyaWNhJywgaXNvM0NvZGU6ICdaQUYnLCBpc28yQ29kZTogJ1pBJywgZGF0YXNldENvZGU6ICd6YS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU291dGggQWZyaWNhJywgaXNvM0NvZGU6ICdaQUYnLCBpc28yQ29kZTogJ1pBJywgZGF0YXNldENvZGU6ICd6YS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzJywgaXNvM0NvZGU6ICdTR1MnLCBpc28yQ29kZTogJ0dTJywgZGF0YXNldENvZGU6ICdncy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NvdXRoIFN1ZGFuJywgaXNvM0NvZGU6ICdTU0QnLCBpc28yQ29kZTogJ1NTJywgZGF0YXNldENvZGU6ICdzcy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU291dGggU3VkYW4nLCBpc28zQ29kZTogJ1NTRCcsIGlzbzJDb2RlOiAnU1MnLCBkYXRhc2V0Q29kZTogJ3NzLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU3BhaW4nLCBpc28zQ29kZTogJ0VTUCcsIGlzbzJDb2RlOiAnRVMnLCBkYXRhc2V0Q29kZTogJ2VzLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcbiAge2NvdW50cnk6ICdTcGFpbicsIGlzbzNDb2RlOiAnRVNQJywgaXNvMkNvZGU6ICdFUycsIGRhdGFzZXRDb2RlOiAnZXMtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICd2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1NwYWluJywgaXNvM0NvZGU6ICdFU1AnLCBpc28yQ29kZTogJ0VTJywgZGF0YXNldENvZGU6ICdlcy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1NyaSBMYW5rYScsIGlzbzNDb2RlOiAnTEtBJywgaXNvMkNvZGU6ICdMSycsIGRhdGFzZXRDb2RlOiAnbGstYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1N1ZGFuJywgaXNvM0NvZGU6ICdTRE4nLCBpc28yQ29kZTogJ1NEJywgZGF0YXNldENvZGU6ICdzZC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU3VkYW4nLCBpc28zQ29kZTogJ1NETicsIGlzbzJDb2RlOiAnU0QnLCBkYXRhc2V0Q29kZTogJ3NkLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU3VyaW5hbWUnLCBpc28zQ29kZTogJ1NVUicsIGlzbzJDb2RlOiAnU1InLCBkYXRhc2V0Q29kZTogJ3NyLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTdXJpbmFtZScsIGlzbzNDb2RlOiAnU1VSJywgaXNvMkNvZGU6ICdTUicsIGRhdGFzZXRDb2RlOiAnc3ItYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTdmFsYmFyZCBhbmQgSmFuIE1heWVuIElzbGFuZHMnLCBpc28zQ29kZTogJ1NKTScsIGlzbzJDb2RlOiAnU0onLCBkYXRhc2V0Q29kZTogJ3NqLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU3dhemlsYW5kIChFc3dhdGluaSknLCBpc28zQ29kZTogJ1NXWicsIGlzbzJDb2RlOiAnU1onLCBkYXRhc2V0Q29kZTogJ3N6LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTd2F6aWxhbmQgKEVzd2F0aW5pKScsIGlzbzNDb2RlOiAnU1daJywgaXNvMkNvZGU6ICdTWicsIGRhdGFzZXRDb2RlOiAnc3otYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdTd2VkZW4nLCBpc28zQ29kZTogJ1NXRScsIGlzbzJDb2RlOiAnU0UnLCBkYXRhc2V0Q29kZTogJ3NlLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcbiAge2NvdW50cnk6ICdTd2VkZW4nLCBpc28zQ29kZTogJ1NXRScsIGlzbzJDb2RlOiAnU0UnLCBkYXRhc2V0Q29kZTogJ3NlLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAndmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdTd2VkZW4nLCBpc28zQ29kZTogJ1NXRScsIGlzbzJDb2RlOiAnU0UnLCBkYXRhc2V0Q29kZTogJ3NlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnU3dpdHplcmxhbmQnLCBpc28zQ29kZTogJ0NIRScsIGlzbzJDb2RlOiAnQ0gnLCBkYXRhc2V0Q29kZTogJ2NoLWFkZHJlc3MnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24nfSxcbiAge2NvdW50cnk6ICdTd2l0emVybGFuZCcsIGlzbzNDb2RlOiAnQ0hFJywgaXNvMkNvZGU6ICdDSCcsIGRhdGFzZXRDb2RlOiAnY2gtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICd2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1N3aXR6ZXJsYW5kJywgaXNvM0NvZGU6ICdDSEUnLCBpc28yQ29kZTogJ0NIJywgZGF0YXNldENvZGU6ICdjaC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1N5cmlhJywgaXNvM0NvZGU6ICdTWVInLCBpc28yQ29kZTogJ1NZJywgZGF0YXNldENvZGU6ICdzeS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnU3lyaWEnLCBpc28zQ29kZTogJ1NZUicsIGlzbzJDb2RlOiAnU1knLCBkYXRhc2V0Q29kZTogJ3N5LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVGFpd2FuJywgaXNvM0NvZGU6ICdUV04nLCBpc28yQ29kZTogJ1RXJywgZGF0YXNldENvZGU6ICd0dy1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVGFpd2FuJywgaXNvM0NvZGU6ICdUV04nLCBpc28yQ29kZTogJ1RXJywgZGF0YXNldENvZGU6ICd0dy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1RhamlraXN0YW4nLCBpc28zQ29kZTogJ1RKSycsIGlzbzJDb2RlOiAnVEonLCBkYXRhc2V0Q29kZTogJ3RqLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdUYWppa2lzdGFuJywgaXNvM0NvZGU6ICdUSksnLCBpc28yQ29kZTogJ1RKJywgZGF0YXNldENvZGU6ICd0ai1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1RhbnphbmlhJywgaXNvM0NvZGU6ICdUWkEnLCBpc28yQ29kZTogJ1RaJywgZGF0YXNldENvZGU6ICd0ei1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVGFuemFuaWEnLCBpc28zQ29kZTogJ1RaQScsIGlzbzJDb2RlOiAnVFonLCBkYXRhc2V0Q29kZTogJ3R6LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVGhhaWxhbmQnLCBpc28zQ29kZTogJ1RIQScsIGlzbzJDb2RlOiAnVEgnLCBkYXRhc2V0Q29kZTogJ3RoLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdUaGFpbGFuZCcsIGlzbzNDb2RlOiAnVEhBJywgaXNvMkNvZGU6ICdUSCcsIGRhdGFzZXRDb2RlOiAndGgtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdUaW1vci1MZXN0ZScsIGlzbzNDb2RlOiAnVExTJywgaXNvMkNvZGU6ICdUTCcsIGRhdGFzZXRDb2RlOiAndGwtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1RpbW9yLUxlc3RlJywgaXNvM0NvZGU6ICdUTFMnLCBpc28yQ29kZTogJ1RMJywgZGF0YXNldENvZGU6ICd0bC1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1RvZ28nLCBpc28zQ29kZTogJ1RHTycsIGlzbzJDb2RlOiAnVEcnLCBkYXRhc2V0Q29kZTogJ3RnLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdUb2dvJywgaXNvM0NvZGU6ICdUR08nLCBpc28yQ29kZTogJ1RHJywgZGF0YXNldENvZGU6ICd0Zy1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1Rva2VsYXUnLCBpc28zQ29kZTogJ1RLTCcsIGlzbzJDb2RlOiAnVEsnLCBkYXRhc2V0Q29kZTogJ3RrLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdUb2tlbGF1JywgaXNvM0NvZGU6ICdUS0wnLCBpc28yQ29kZTogJ1RLJywgZGF0YXNldENvZGU6ICd0ay1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1RvbmdhJywgaXNvM0NvZGU6ICdUT04nLCBpc28yQ29kZTogJ1RPJywgZGF0YXNldENvZGU6ICd0by1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVG9uZ2EnLCBpc28zQ29kZTogJ1RPTicsIGlzbzJDb2RlOiAnVE8nLCBkYXRhc2V0Q29kZTogJ3RvLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVHJpbmlkYWQgYW5kIFRvYmFnbycsIGlzbzNDb2RlOiAnVFRPJywgaXNvMkNvZGU6ICdUVCcsIGRhdGFzZXRDb2RlOiAndHQtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1RyaW5pZGFkIGFuZCBUb2JhZ28nLCBpc28zQ29kZTogJ1RUTycsIGlzbzJDb2RlOiAnVFQnLCBkYXRhc2V0Q29kZTogJ3R0LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVHVuaXNpYScsIGlzbzNDb2RlOiAnVFVOJywgaXNvMkNvZGU6ICdUTicsIGRhdGFzZXRDb2RlOiAndG4tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1R1bmlzaWEnLCBpc28zQ29kZTogJ1RVTicsIGlzbzJDb2RlOiAnVE4nLCBkYXRhc2V0Q29kZTogJ3RuLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVHVya2V5JywgaXNvM0NvZGU6ICdUVVInLCBpc28yQ29kZTogJ1RSJywgZGF0YXNldENvZGU6ICd0ci1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVHVya2V5JywgaXNvM0NvZGU6ICdUVVInLCBpc28yQ29kZTogJ1RSJywgZGF0YXNldENvZGU6ICd0ci1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1R1cmtpc2ggUmVwdWJsaWMgb2YgTm9ydGhlcm4gQ3lwcnVzJywgaXNvM0NvZGU6ICdOQ1knLCBpc28yQ29kZTogJ0NZJywgZGF0YXNldENvZGU6ICdueS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1R1cmttZW5pc3RhbicsIGlzbzNDb2RlOiAnVEtNJywgaXNvMkNvZGU6ICdUTScsIGRhdGFzZXRDb2RlOiAndG0tYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1R1cmttZW5pc3RhbicsIGlzbzNDb2RlOiAnVEtNJywgaXNvMkNvZGU6ICdUTScsIGRhdGFzZXRDb2RlOiAndG0tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMnLCBpc28zQ29kZTogJ1RDQScsIGlzbzJDb2RlOiAnVEMnLCBkYXRhc2V0Q29kZTogJ3RjLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVHV2YWx1JywgaXNvM0NvZGU6ICdUVVYnLCBpc28yQ29kZTogJ1RWJywgZGF0YXNldENvZGU6ICd0di1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVHV2YWx1JywgaXNvM0NvZGU6ICdUVVYnLCBpc28yQ29kZTogJ1RWJywgZGF0YXNldENvZGU6ICd0di1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1VnYW5kYScsIGlzbzNDb2RlOiAnVUdBJywgaXNvMkNvZGU6ICdVRycsIGRhdGFzZXRDb2RlOiAndWctYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1VnYW5kYScsIGlzbzNDb2RlOiAnVUdBJywgaXNvMkNvZGU6ICdVRycsIGRhdGFzZXRDb2RlOiAndWctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdVa3JhaW5lJywgaXNvM0NvZGU6ICdVS1InLCBpc28yQ29kZTogJ1VBJywgZGF0YXNldENvZGU6ICd1YS1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVWtyYWluZScsIGlzbzNDb2RlOiAnVUtSJywgaXNvMkNvZGU6ICdVQScsIGRhdGFzZXRDb2RlOiAndWEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdVbml0ZWQgQXJhYiBFbWlyYXRlcycsIGlzbzNDb2RlOiAnQVJFJywgaXNvMkNvZGU6ICdBRScsIGRhdGFzZXRDb2RlOiAnYWUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBBcmFiIEVtaXJhdGVzJywgaXNvM0NvZGU6ICdBUkUnLCBpc28yQ29kZTogJ0FFJywgZGF0YXNldENvZGU6ICdhZS1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6IFsnZ2ItYWRkcmVzcyddLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVW5pdGVkIEtpbmdkb20nLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogWydnYi1hZGRpdGlvbmFsLWJ1c2luZXNzJywgJ2diLWFkZGl0aW9uYWwtbXVsdGlwbGVyZXNpZGVuY2UnLCAnZ2ItYWRkaXRpb25hbC1ub3R5ZXRidWlsdCddLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSd9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEFkZHJlc3NCYXNlIFByZW1pdW0nLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZHJlc3MtYWRkcmVzc2Jhc2UnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlLCBsb29rdXAnfSxcbiAge2NvdW50cnk6ICdVbml0ZWQgS2luZ2RvbSBBZGRyZXNzQmFzZSBQcmVtaXVtIHdpdGggSXNsYW5kcycsIGlzbzNDb2RlOiAnR0JSJywgaXNvMkNvZGU6ICdHQicsIGRhdGFzZXRDb2RlOiAnZ2ItYWRkaXRpb25hbC1hZGRyZXNzYmFzZWlzbGFuZHMnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlLCBsb29rdXAnfSxcbiAge2NvdW50cnk6ICdVbml0ZWQgS2luZ2RvbSBCdXNpbmVzcyBOYW1lcycsIGlzbzNDb2RlOiAnR0JSJywgaXNvMkNvZGU6ICdHQicsIGRhdGFzZXRDb2RlOiAnZ2ItYWRkaXRpb25hbC1idXNpbmVzcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEVsZWN0cmljaXR5JywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWVsZWN0cmljaXR5Jywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHR5cGVkb3duLCB2YWxpZGF0ZSwgbG9va3VwJ30sXG4gIHtjb3VudHJ5OiAnVW5pdGVkIEtpbmdkb20gR2FzJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWdhcycsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93biwgdmFsaWRhdGUsIGxvb2t1cCd9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIFN0cmVldCBMZXZlbCcsIGlzbzNDb2RlOiAnR0JSJywgaXNvMkNvZGU6ICdHQicsIGRhdGFzZXRDb2RlOiAnZ2ItYWRkcmVzcy1zdHJlZXRsZXZlbCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB0eXBlZG93bid9LFxuICB7Y291bnRyeTogJ1VuaXRlZCBLaW5nZG9tIEV4dGVuZGVkIEJ1c2luZXNzJywgaXNvM0NvZGU6ICdHQlInLCBpc28yQ29kZTogJ0dCJywgZGF0YXNldENvZGU6ICdnYi1hZGRpdGlvbmFsLWJ1c2luZXNzZXh0ZW5kZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlLCBsb29rdXAnfSxcbiAge2NvdW50cnk6ICdVbml0ZWQgS2luZ2RvbSBDeW1yYWVnIChXZWxzaCBMYW5ndWFnZSkgUG9zdGFsIEFkZHJlc3MnLCBpc28zQ29kZTogJ0dCUicsIGlzbzJDb2RlOiAnR0InLCBkYXRhc2V0Q29kZTogJ2diLWFkZHJlc3Mtd2FsZXMnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJywgaXNvM0NvZGU6ICdVU0EnLCBpc28yQ29kZTogJ1VTJywgZGF0YXNldENvZGU6ICd1cy1hZGRyZXNzJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSwgc2luZ2xlbGluZSwgdHlwZWRvd24sIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnVXJ1Z3VheScsIGlzbzNDb2RlOiAnVVJZJywgaXNvMkNvZGU6ICdVWScsIGRhdGFzZXRDb2RlOiAndXktYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1VydWd1YXknLCBpc28zQ29kZTogJ1VSWScsIGlzbzJDb2RlOiAnVVknLCBkYXRhc2V0Q29kZTogJ3V5LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVXpiZWtpc3RhbicsIGlzbzNDb2RlOiAnVVpCJywgaXNvMkNvZGU6ICdVWicsIGRhdGFzZXRDb2RlOiAndXotYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1V6YmVraXN0YW4nLCBpc28zQ29kZTogJ1VaQicsIGlzbzJDb2RlOiAnVVonLCBkYXRhc2V0Q29kZTogJ3V6LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVmFudWF0dScsIGlzbzNDb2RlOiAnVlVUJywgaXNvMkNvZGU6ICdWVScsIGRhdGFzZXRDb2RlOiAndnUtYWRkcmVzcy1lZCcsIHNlYXJjaFR5cGU6ICdzaW5nbGVsaW5lLCB2YWxpZGF0ZSd9LFxuICB7Y291bnRyeTogJ1ZhbnVhdHUnLCBpc28zQ29kZTogJ1ZVVCcsIGlzbzJDb2RlOiAnVlUnLCBkYXRhc2V0Q29kZTogJ3Z1LWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVmF0aWNhbiBDaXR5IChIb2x5IFNlZSknLCBpc28zQ29kZTogJ1ZBVCcsIGlzbzJDb2RlOiAnVkEnLCBkYXRhc2V0Q29kZTogJ3ZhLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdWYXRpY2FuIENpdHkgKEhvbHkgU2VlKScsIGlzbzNDb2RlOiAnVkFUJywgaXNvMkNvZGU6ICdWQScsIGRhdGFzZXRDb2RlOiAndmEtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdWZW5lenVlbGEnLCBpc28zQ29kZTogJ1ZFTicsIGlzbzJDb2RlOiAnVkUnLCBkYXRhc2V0Q29kZTogJ3ZlLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdWZW5lenVlbGEnLCBpc28zQ29kZTogJ1ZFTicsIGlzbzJDb2RlOiAnVkUnLCBkYXRhc2V0Q29kZTogJ3ZlLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnVmlldCBOYW0nLCBpc28zQ29kZTogJ1ZOTScsIGlzbzJDb2RlOiAnVk4nLCBkYXRhc2V0Q29kZTogJ3ZuLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdWaWV0IE5hbScsIGlzbzNDb2RlOiAnVk5NJywgaXNvMkNvZGU6ICdWTicsIGRhdGFzZXRDb2RlOiAndm4tYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCcsIGlzbzNDb2RlOiAnVkdCJywgaXNvMkNvZGU6ICdWRycsIGRhdGFzZXRDb2RlOiAndmctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdWaXJnaW4gSXNsYW5kcywgVS5TLicsIGlzbzNDb2RlOiAnVklSJywgaXNvMkNvZGU6ICdWSScsIGRhdGFzZXRDb2RlOiAndmktYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdXYWxsaXMgYW5kIEZ1dHVuYSBJc2xhbmRzJywgaXNvM0NvZGU6ICdXTEYnLCBpc28yQ29kZTogJ1dGJywgZGF0YXNldENvZGU6ICd3Zi1hZGRyZXNzLWVoJywgc2VhcmNoVHlwZTogJ2F1dG9jb21wbGV0ZSd9LFxuICB7Y291bnRyeTogJ1dlc3Rlcm4gU2FoYXJhJywgaXNvM0NvZGU6ICdFU0gnLCBpc28yQ29kZTogJ0VIJywgZGF0YXNldENvZGU6ICdlaC1hZGRyZXNzLWVkJywgc2VhcmNoVHlwZTogJ3NpbmdsZWxpbmUsIHZhbGlkYXRlJ30sXG4gIHtjb3VudHJ5OiAnV2VzdGVybiBTYWhhcmEnLCBpc28zQ29kZTogJ0VTSCcsIGlzbzJDb2RlOiAnRUgnLCBkYXRhc2V0Q29kZTogJ2VoLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnWWVtZW4nLCBpc28zQ29kZTogJ1lFTScsIGlzbzJDb2RlOiAnWUUnLCBkYXRhc2V0Q29kZTogJ3llLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdZZW1lbicsIGlzbzNDb2RlOiAnWUVNJywgaXNvMkNvZGU6ICdZRScsIGRhdGFzZXRDb2RlOiAneWUtYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfSxcbiAge2NvdW50cnk6ICdaYW1iaWEnLCBpc28zQ29kZTogJ1pNQicsIGlzbzJDb2RlOiAnWk0nLCBkYXRhc2V0Q29kZTogJ3ptLWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdaYW1iaWEnLCBpc28zQ29kZTogJ1pNQicsIGlzbzJDb2RlOiAnWk0nLCBkYXRhc2V0Q29kZTogJ3ptLWFkZHJlc3MtZWgnLCBzZWFyY2hUeXBlOiAnYXV0b2NvbXBsZXRlJ30sXG4gIHtjb3VudHJ5OiAnWmltYmFid2UnLCBpc28zQ29kZTogJ1pXRScsIGlzbzJDb2RlOiAnWlcnLCBkYXRhc2V0Q29kZTogJ3p3LWFkZHJlc3MtZWQnLCBzZWFyY2hUeXBlOiAnc2luZ2xlbGluZSwgdmFsaWRhdGUnfSxcbiAge2NvdW50cnk6ICdaaW1iYWJ3ZScsIGlzbzNDb2RlOiAnWldFJywgaXNvMkNvZGU6ICdaVycsIGRhdGFzZXRDb2RlOiAnenctYWRkcmVzcy1laCcsIHNlYXJjaFR5cGU6ICdhdXRvY29tcGxldGUnfVxuXTsiLCIvLyBUcmFuc2xhdGlvbnNcbmV4cG9ydCBjb25zdCB0cmFuc2xhdGlvbnMgPSB7XG4gIC8vIGxhbmd1YWdlIC8gY291bnRyeSAvIHByb3BlcnR5XG4gIGVuOiB7XG4gICAgZ2JyOiB7XG4gICAgICBsb2NhbGl0eTogJ1Rvd24vQ2l0eScsXG4gICAgICByZWdpb246ICdDb3VudHknLFxuICAgICAgcG9zdGFsX2NvZGU6ICdQb3N0IGNvZGUnXG4gICAgfSxcbiAgICB1c2E6IHtcbiAgICAgIGxvY2FsaXR5OiAnQ2l0eScsXG4gICAgICByZWdpb246ICdTdGF0ZScsXG4gICAgICBwb3N0YWxfY29kZTogJ1pJUCBjb2RlJ1xuICAgIH1cbiAgfVxuICAvLyBBZGQgb3RoZXIgbGFuZ3VhZ2VzIGJlbG93XG59OyIsImV4cG9ydCBjbGFzcyBQaWNrbGlzdCB7XHJcbiAgaXRlbXM6IFBpY2tsaXN0SXRlbVtdO1xyXG4gIHdoYXQzd29yZHNJdGVtczogV2hhdDNXb3Jkc1BpY2tMaXN0W107XHJcbiAgbG9va3VwSXRlbXM6IExvb2t1cEFkZHJlc3NbXTtcclxuICBjdXJyZW50SXRlbTtcclxuICBsaXN0OiBIVE1MRGl2RWxlbWVudDtcclxuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIHNpemUgPSAwO1xyXG4gIG1heFN1Z2dlc3Rpb25zID0gMjU7XHJcbiAgc2hvdzogKGl0ZW1zOiBTZWFyY2hSZXNwb25zZSkgPT4gdm9pZDtcclxuICBzaG93V2hhdDNXb3JkczogKGl0ZW1zOiBMb29rdXBXM1dSZXNwb25zZSkgPT4gdm9pZDtcclxuICBzaG93TG9va3VwOiAoaXRlbXM6IExvb2t1cFYyUmVzcG9uc2UpID0+IHZvaWQ7XHJcbiAgaGlkZTogKCkgPT4gdm9pZDtcclxuICBoYW5kbGVFbXB0eVBpY2tsaXN0OiAoaXRlbXM6IFNlYXJjaFJlc3BvbnNlIHwgTG9va3VwVzNXUmVzcG9uc2UgfCBMb29rdXBWMlJlc3BvbnNlKSA9PiB2b2lkO1xyXG4gIGhhbmRsZUVtcHR5UGlja2xpc3RDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICBoYW5kbGVDb21tb25TaG93UGlja2xpc3RMb2dpYzogKCkgPT4gdm9pZDtcclxuICByZWZpbmU6IFJlZmluZW1lbnQ7XHJcbiAgdXNlQWRkcmVzc0VudGVyZWQ6IFVzZUFkZHJlc3NFbnRlcmVkO1xyXG4gIGNyZWF0ZUxpc3Q6ICgpID0+IEhUTUxEaXZFbGVtZW50O1xyXG4gIGNyZWF0ZUxpc3RJdGVtOiAoaXRlbTogUGlja2xpc3RJdGVtKSA9PiBIVE1MRGl2RWxlbWVudDtcclxuICBjcmVhdGVMb29rdXBMaXN0SXRlbTogKGl0ZW06IExvb2t1cEFkZHJlc3MpID0+IEhUTUxEaXZFbGVtZW50O1xyXG4gIGNyZWF0ZVdoYXQzV29yZHNMaXN0SXRlbTogKGl0ZW06IFdoYXQzV29yZHNQaWNrTGlzdCkgPT4gSFRNTERpdkVsZW1lbnQ7XHJcbiAgdGFiQ291bnQ6IG51bWJlcjtcclxuICByZXNldFRhYkNvdW50OiAoKSA9PiB2b2lkO1xyXG4gIGtleXVwOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XHJcbiAgYWRkTWF0Y2hpbmdFbXBoYXNpczogKGl0ZW0pID0+IHN0cmluZztcclxuICBsaXN0ZW46IChyb3cpID0+IHZvaWQ7XHJcbiAgY2hlY2tFbnRlcjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xyXG4gIHBpY2s6IChpdGVtKSA9PiB2b2lkO1xyXG4gIHNjcm9sbEludG9WaWV3SWZOZWVkZWQ6ICgpID0+IHZvaWQ7XHJcbiAgZGlzcGxheVN1Z2dlc3Rpb25zSGVhZGVyOiAoKSA9PiB2b2lkO1xyXG4gIGRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlcjogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFkZHJlc3NWYWxpZGF0aW9uUmVzdWx0IHtcclxuICBmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyO1xyXG4gIGxhc3RBZGRyZXNzRmllbGQ7XHJcbiAgZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkOiBib29sZWFuO1xyXG4gIHNob3c6IChkYXRhKSA9PiB2b2lkO1xyXG4gIGhpZGU6ICgpID0+IHZvaWQ7XHJcbiAgY3JlYXRlQWRkcmVzc0xpbmU6IENyZWF0ZUFkZHJlc3NMaW5lO1xyXG4gIGNyZWF0ZUZvcm1hdHRlZEFkZHJlc3NDb250YWluZXI6ICgpID0+IHZvaWQ7XHJcbiAgY3JlYXRlSGVhZGluZzogKCkgPT4gdm9pZDtcclxuICB1cGRhdGVIZWFkaW5nOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIGNhbGN1bGF0ZUlmQWRkcmVzc0xpbmVHZW5lcmF0aW9uUmVxdWlyZWQ6ICgpID0+IHZvaWQ7XHJcbiAgdXBkYXRlQWRkcmVzc0xpbmU6IChrZXk6IHN0cmluZywgYWRkcmVzc0xpbmVPYmplY3QsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB2b2lkO1xyXG4gIHVwZGF0ZUxhYmVsOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZztcclxuICBjcmVhdGVTZWFyY2hBZ2Fpbkxpbms6ICgpID0+IHZvaWQ7XHJcbiAgcmVuZGVySW5wdXRMaXN0OiAoaW5wdXRBcnJheSkgPT4gdm9pZDtcclxuICBoYW5kbGVWYWxpZGF0ZVJlc3BvbnNlOiAocmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jbGFzcyBDcmVhdGVBZGRyZXNzTGluZSB7XHJcbiAgaW5wdXQ6IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpID0+IEhUTUxEaXZFbGVtZW50O1xyXG4gIGxhYmVsOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXNwb25zZSB7XHJcbiAgcmVzdWx0Pzoge1xyXG4gICAgc3VnZ2VzdGlvbnM6IFBpY2tsaXN0SXRlbVtdO1xyXG4gICAgc3VnZ2VzdGlvbnNfcHJvbXB0Pzogc3RyaW5nO1xyXG4gICAgc3VnZ2VzdGlvbnNfa2V5Pzogc3RyaW5nO1xyXG4gICAgY29uZmlkZW5jZTogc3RyaW5nO1xyXG4gICAgYWRkcmVzcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cFczV1Jlc3BvbnNlIHtcclxuICByZXN1bHQ/OiB7XHJcbiAgICBtb3JlX3Jlc3VsdHNfYXZhaWxhYmxlOiBib29sZWFuO1xyXG4gICAgc3VnZ2VzdGlvbnM6IFdoYXQzV29yZHNQaWNrTGlzdFtdO1xyXG4gICAgY29uZmlkZW5jZTogc3RyaW5nO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBWMlJlc3BvbnNlIHtcclxuICByZXN1bHQ/OiB7XHJcbiAgICBtb3JlX3Jlc3VsdHNfYXZhaWxhYmxlOiBib29sZWFuO1xyXG4gICAgY29uZmlkZW5jZTogc3RyaW5nO1xyXG4gICAgYWRkcmVzc2VzOiBMb29rdXBBZGRyZXNzW107XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cEFkZHJlc3Mge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBnbG9iYWxfYWRkcmVzc19rZXk6IHN0cmluZztcclxuICBmb3JtYXQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXaGF0M1dvcmRzUGlja0xpc3Qge1xyXG4gIHdoYXQzd29yZHM6IFdoYXQzV29yZHNTdWdnZXN0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdoYXQzV29yZHNTdWdnZXN0aW9uIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tsaXN0SXRlbSB7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG4gIGZvcm1hdD86IHN0cmluZztcclxuICBtYXRjaGVkPzogbnVtYmVyW11bXTtcclxuICBnbG9iYWxfYWRkcmVzc19rZXk/OiBzdHJpbmc7XHJcbiAgYWRkaXRpb25hbF9hdHRyaWJ1dGVzPzogeyBuYW1lOiBzdHJpbmcsIFZhbHVlOiBzdHJpbmcgfVtdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlQWRkcmVzc0VudGVyZWQge1xyXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gIGNyZWF0ZTogKGNvbmZpZGVuY2U6IHN0cmluZykgPT4gSFRNTERpdkVsZW1lbnQ7XHJcbiAgZGVzdHJveTogKCkgPT4gdm9pZDtcclxuICBjbGljazogKCkgPT4gdm9pZDtcclxuICBmb3JtYXRNYW51YWxBZGRyZXNzTGluZTogKGxpbmVzLCBpKSA9PiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVmaW5lbWVudCB7XHJcbiAgZWxlbWVudDogSFRNTElucHV0RWxlbWVudDtcclxuICBpc05lZWRlZDogKHJlc3BvbnNlOiBTZWFyY2hSZXNwb25zZSkgPT4gYm9vbGVhbjtcclxuICBjcmVhdGVJbnB1dDogKHByb21wdDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4gdm9pZDtcclxuICBlbnRlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlYXJjaFNwaW5uZXIge1xyXG4gIHNob3c6ICgpID0+IHZvaWQ7XHJcbiAgaGlkZTogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFBvd2VyZWRCeUxvZ28ge1xyXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gIGNyZWF0ZTogKHBpY2tsaXN0KSA9PiBIVE1MRGl2RWxlbWVudDtcclxuICBkZXN0cm95OiAocGlja2xpc3QpID0+IHZvaWQ7XHJcbiAgc3ZnOiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgRXZlbnRGYWN0b3J5IGZyb20gJy4vZXZlbnQtZmFjdG9yeSc7XHJcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XHJcbmltcG9ydCB7IEFkZHJlc3NTZWFyY2hPcHRpb25zLCBBZGRyZXNzVmFsaWRhdGlvbk1vZGUsIGRlZmF1bHRzIH0gZnJvbSAnLi9zZWFyY2gtb3B0aW9ucyc7XHJcbmltcG9ydCB7IGRhdGFzZXRDb2RlcyB9IGZyb20gJy4vZGF0YXNldHMtY29kZXMnO1xyXG5pbXBvcnQgeyB0cmFuc2xhdGlvbnMgfSBmcm9tICcuL3RyYW5zbGF0aW9ucyc7XHJcbmltcG9ydCB7IEFkZHJlc3NWYWxpZGF0aW9uUmVzdWx0LCBMb29rdXBBZGRyZXNzLCBMb29rdXBWMlJlc3BvbnNlLCBMb29rdXBXM1dSZXNwb25zZSwgUGlja2xpc3QsIFBpY2tsaXN0SXRlbSwgUG93ZXJlZEJ5TG9nbywgU2VhcmNoUmVzcG9uc2UsIFdoYXQzV29yZHNQaWNrTGlzdCB9IGZyb20gJy4vY2xhc3MtdHlwZXMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkcmVzc1ZhbGlkYXRpb24ge1xyXG4gIHB1YmxpYyBvcHRpb25zOiBBZGRyZXNzU2VhcmNoT3B0aW9ucztcclxuICBwdWJsaWMgc2VhcmNoVHlwZTogQWRkcmVzc1ZhbGlkYXRpb25Nb2RlO1xyXG4gIHB1YmxpYyBldmVudHM7XHJcbiAgcHVibGljIHJlcXVlc3Q6IFJlcXVlc3Q7XHJcblxyXG4gIHByaXZhdGUgYmFzZVVybCA9ICdodHRwczovL2FwaS5leHBlcmlhbmFwZXJ0dXJlLmlvLyc7XHJcbiAgcHJpdmF0ZSBzZWFyY2hFbmRwb2ludCA9ICdhZGRyZXNzL3NlYXJjaC92MSc7XHJcbiAgcHJpdmF0ZSBsb29rdXBFbmRwb2ludCA9ICdhZGRyZXNzL2xvb2t1cC92Mic7XHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuZHBvaW50ID0gJ2FkZHJlc3MvdmFsaWRhdGUvdjEnO1xyXG4gIHByaXZhdGUgcHJvbXB0c2V0RW5kcG9pbnQgPSAnYWRkcmVzcy9wcm9tcHRzZXRzL3YxJztcclxuICBwcml2YXRlIHN0ZXBJbkVuZHBvaW50ID0gJ2FkZHJlc3Mvc3VnZ2VzdGlvbnMvc3RlcGluL3YxJztcclxuICBwcml2YXRlIHJlZmluZUVuZHBvaW50ID0gJ2FkZHJlc3Mvc3VnZ2VzdGlvbnMvcmVmaW5lL3YxJztcclxuICBwcml2YXRlIGVucmljaG1lbnRFbmRwb2ludCA9ICdlbnJpY2htZW50L3YyJztcclxuXHJcbiAgcHJpdmF0ZSB3aGF0M1dvcmRDb3VudHJpZXMgPSBbJ0dCUiddO1xyXG4gIHByaXZhdGUgd2hhdDNXb3Jkc0tleXdvcmQgPSAnd2hhdDN3b3Jkcyc7XHJcblxyXG4gIHByaXZhdGUgcGlja2xpc3Q6IFBpY2tsaXN0O1xyXG4gIHByaXZhdGUgaW5wdXRzOiBIVE1MSW5wdXRFbGVtZW50W107XHJcbiAgcHJpdmF0ZSBsYXN0U2VhcmNoVGVybTogc3RyaW5nO1xyXG4gIHByaXZhdGUgY3VycmVudFNlYXJjaFRlcm06IHN0cmluZztcclxuICBwcml2YXRlIGN1cnJlbnRDb3VudHJ5Q29kZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgY3VycmVudERhdGFTZXQ6IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gIHByaXZhdGUgaGFzU2VhcmNoSW5wdXRCZWVuUmVzZXQ6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBjb3VudHJ5Q29kZU1hcHBpbmc7XHJcbiAgcHJpdmF0ZSBsb29rdXBGbjtcclxuICBwcml2YXRlIGtleVVwRm47XHJcbiAgcHJpdmF0ZSBjaGVja1RhYkZuO1xyXG4gIHByaXZhdGUgaXNXaGF0M1dvcmRzOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBZGRyZXNzU2VhcmNoT3B0aW9ucykge1xyXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50RmFjdG9yeSgpO1xyXG5cclxuICAgIHRoaXMuc2V0dXAoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wdGlvbnMudG9rZW4gPSB0b2tlbjtcclxuICAgIHRoaXMuc2V0dXAoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWFyY2hUeXBlKHNlYXJjaFR5cGU6IEFkZHJlc3NWYWxpZGF0aW9uTW9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hUeXBlID0gc2VhcmNoVHlwZTtcclxuICAgIHRoaXMuZ2xvYmFsUmVzZXQoKTtcclxuICAgIHRoaXMuc2V0SW5wdXRzKCk7XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXNlYXJjaC10eXBlLWNoYW5nZScsIHNlYXJjaFR5cGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVucmljaG1lbnREYXRhKGdsb2JhbEFkZHJlc3NLZXk6IHN0cmluZykge1xyXG4gICAgaWYgKGdsb2JhbEFkZHJlc3NLZXkpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICBjb3VudHJ5X2lzbzogdGhpcy5jdXJyZW50Q291bnRyeUNvZGUsXHJcbiAgICAgICAga2V5czoge1xyXG4gICAgICAgICAgZ2xvYmFsX2FkZHJlc3Nfa2V5OiBnbG9iYWxBZGRyZXNzS2V5XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhdHRyaWJ1dGVzOiB7XHJcbiAgICAgICAgICBnZW9jb2RlczogWydsYXRpdHVkZScsICdsb25naXR1ZGUnLCAnbWF0Y2hfbGV2ZWwnXVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncHJlLWVucmljaG1lbnQnKTtcclxuICAgICAgdGhpcy5yZXF1ZXN0LnNlbmQodGhpcy5iYXNlVXJsICsgdGhpcy5lbnJpY2htZW50RW5kcG9pbnQsICdQT1NUJywgdGhpcy5oYW5kbGVFbnJpY2htZW50UmVzdWx0LmJpbmQodGhpcyksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgdG9rZW4gYW5kIHByb2NlZWQgaWYgaXQncyBwcmVzZW50XHJcbiAgICBpZiAodGhpcy50b2tlbikge1xyXG4gICAgICB0aGlzLmhhc1NlYXJjaElucHV0QmVlblJlc2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IFJlcXVlc3QgY2xhc3MgZm9yIHVzZSB3aGVuIG1ha2luZyBBUEkgY2FsbHNcclxuICAgICAgdGhpcy5yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodGhpcyk7XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIGNvdW50cnkgbGlzdFxyXG4gICAgICB0aGlzLnNldENvdW50cnlMaXN0KCk7XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIGlucHV0IGZpZWxkcyBmb3IgdGhpcyBzZWFyY2ggdHlwZVxyXG4gICAgICB0aGlzLnNldElucHV0cygpO1xyXG5cclxuICAgICAgLy8gU2V0dXAgYSBwaWNrbGlzdCBvYmplY3RcclxuICAgICAgdGhpcy5jcmVhdGVQaWNrbGlzdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVHJpZ2dlciBhIDQwMSBVbmF1dGhvcml6ZWQgZXZlbnQgaWYgYSB0b2tlbiBkb2VzIG5vdCBleGlzdFxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3JlcXVlc3QtZXJyb3ItNDAxJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVFbnJpY2htZW50UmVzdWx0KHJlc3BvbnNlKSB7XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LWVucmljaG1lbnQnLCByZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhcmFtZXRlcihuYW1lKTogc3RyaW5nIHtcclxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tbXS8sICdcXFxcWycpLnJlcGxhY2UoL1tcXF1dLywgJ1xcXFxdJyk7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ1tcXFxcPyZdJyArIG5hbWUgKyAnPShbXiYjXSopJyksXHJcbiAgICAgIHJlc3VsdHMgPSByZWdleC5leGVjKGxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICByZXR1cm4gcmVzdWx0cyA9PT0gbnVsbCA/ICcnIDogZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMV0ucmVwbGFjZSgvXFwrL2csICcgJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gVHJ5IGFuZCBnZXQgdG9rZW4gZnJvbSB0aGUgcXVlcnkgc3RyaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgcHJvdmlkZWRcclxuICBwcml2YXRlIGdldCB0b2tlbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudG9rZW4pIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnRva2VuID0gdGhpcy5nZXRQYXJhbWV0ZXIoJ3Rva2VuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRva2VuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZURlZmF1bHRPcHRpb25zKGN1c3RvbU9wdGlvbnMpOiBBZGRyZXNzU2VhcmNoT3B0aW9ucyB7XHJcbiAgICBjb25zdCBpbnN0YW5jZTogQWRkcmVzc1NlYXJjaE9wdGlvbnMgPSBjdXN0b21PcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIGluc3RhbmNlLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWFyY2hUeXBlID0gaW5zdGFuY2Uuc2VhcmNoVHlwZSB8fCBkZWZhdWx0cy5zZWFyY2hUeXBlO1xyXG4gICAgaW5zdGFuY2UuZW5hYmxlV2hhdDNXb3JkcyA9IGluc3RhbmNlLmVuYWJsZVdoYXQzV29yZHMgfHwgZGVmYXVsdHMuZW5hYmxlV2hhdDNXb3JkcztcclxuICAgIGluc3RhbmNlLnNlYXJjaFR5cGUgPSBpbnN0YW5jZS5zZWFyY2hUeXBlIHx8IGRlZmF1bHRzLnNlYXJjaFR5cGU7XHJcbiAgICBpbnN0YW5jZS5sYW5ndWFnZSA9IGluc3RhbmNlLmxhbmd1YWdlIHx8IGRlZmF1bHRzLmxhbmd1YWdlO1xyXG4gICAgaW5zdGFuY2UudXNlU3Bpbm5lciA9IGluc3RhbmNlLnVzZVNwaW5uZXIgfHwgZGVmYXVsdHMudXNlU3Bpbm5lcjtcclxuICAgIGluc3RhbmNlLmFwcGx5Rm9jdXMgPSAodHlwZW9mIGluc3RhbmNlLmFwcGx5Rm9jdXMgIT09ICd1bmRlZmluZWQnKSA/IGluc3RhbmNlLmFwcGx5Rm9jdXMgOiBkZWZhdWx0cy5pbnB1dC5hcHBseUZvY3VzO1xyXG4gICAgaW5zdGFuY2UucGxhY2Vob2xkZXJUZXh0ID0gaW5zdGFuY2UucGxhY2Vob2xkZXJUZXh0IHx8IGRlZmF1bHRzLmlucHV0LnBsYWNlaG9sZGVyVGV4dDtcclxuICAgIGluc3RhbmNlLnNlYXJjaEFnYWluID0gaW5zdGFuY2Uuc2VhcmNoQWdhaW4gfHwge307XHJcbiAgICBpbnN0YW5jZS5zZWFyY2hBZ2Fpbi52aXNpYmxlID0gKHR5cGVvZiBpbnN0YW5jZS5zZWFyY2hBZ2Fpbi52aXNpYmxlICE9PSAndW5kZWZpbmVkJykgPyBpbnN0YW5jZS5zZWFyY2hBZ2Fpbi52aXNpYmxlIDogZGVmYXVsdHMuc2VhcmNoQWdhaW4udmlzaWJsZTtcclxuICAgIGluc3RhbmNlLnNlYXJjaEFnYWluLnRleHQgPSBpbnN0YW5jZS5zZWFyY2hBZ2Fpbi50ZXh0IHx8IGRlZmF1bHRzLnNlYXJjaEFnYWluLnRleHQ7XHJcbiAgICBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyID0gaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lciB8fCBkZWZhdWx0cy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyO1xyXG4gICAgaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZyA9ICh0eXBlb2YgaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZyAhPT0gJ3VuZGVmaW5lZCcpID8gaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5zaG93SGVhZGluZyA6IGRlZmF1bHRzLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuc2hvd0hlYWRpbmc7XHJcbiAgICBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmhlYWRpbmdUeXBlID0gaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5oZWFkaW5nVHlwZSB8fCBkZWZhdWx0cy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmhlYWRpbmdUeXBlO1xyXG4gICAgaW5zdGFuY2UuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci52YWxpZGF0ZWRIZWFkaW5nVGV4dCA9IGluc3RhbmNlLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIudmFsaWRhdGVkSGVhZGluZ1RleHQgfHwgZGVmYXVsdHMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci52YWxpZGF0ZWRIZWFkaW5nVGV4dDtcclxuICAgIGluc3RhbmNlLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIubWFudWFsSGVhZGluZ1RleHQgPSBpbnN0YW5jZS5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLm1hbnVhbEhlYWRpbmdUZXh0IHx8IGRlZmF1bHRzLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIubWFudWFsSGVhZGluZ1RleHQ7XHJcbiAgICBpbnN0YW5jZS51c2VBZGRyZXNzRW50ZXJlZFRleHQgPSBpbnN0YW5jZS51c2VBZGRyZXNzRW50ZXJlZFRleHQgfHwgZGVmYXVsdHMudXNlQWRkcmVzc0VudGVyZWRUZXh0O1xyXG4gICAgaW5zdGFuY2UuZWxlbWVudHMgPSBpbnN0YW5jZS5lbGVtZW50cyB8fCB7fTtcclxuXHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByb21wdHNldCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSkge1xyXG4gICAgICAvLyBVc2luZyB0aGUgY291bnRyeSBjb2RlIGFuZCB0aGUgc2VhcmNoIHR5cGUsIGxvb2t1cCB3aGF0IHRoZSByZWxldmFudCBkYXRhc2V0IGNvZGUgc2hvdWxkIGJlXHJcbiAgICAgIHRoaXMuY3VycmVudERhdGFTZXQgPSB0aGlzLmxvb2t1cERhdGFzZXRDb2RlKCk7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnREYXRhU2V0KSB7XHJcblxyXG4gICAgICAgIC8vLyBUZW1wb3JhcnkgbWVhc3VyZSB1bnRpbCB0aGUgcHJvbXB0c2V0IGVuZHBvaW50IHN1cHBvcnRzIEF1dG9jb21wbGV0ZSBhbmQgVmFsaWRhdGVcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuQVVUT0NPTVBMRVRFKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGFuZGxlUHJvbXB0c2V0UmVzdWx0KHsgcmVzdWx0OiB7IGxpbmVzOiBbeyBleGFtcGxlOiB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXJUZXh0LCBwcm9tcHQ6ICdBZGRyZXNzJywgc3VnZ2VzdGVkX2lucHV0X2xlbmd0aDogMTYwIH1dIH0gfSkpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuVkFMSURBVEUpIHtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzID0gW1xyXG4gICAgICAgICAgICB7IHByb21wdDogJ0FkZHJlc3MgbGluZSAxJywgc3VnZ2VzdGVkX2lucHV0X2xlbmd0aDogMTYwIH0sXHJcbiAgICAgICAgICAgIHsgcHJvbXB0OiAnQWRkcmVzcyBsaW5lIDInLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjAgfSxcclxuICAgICAgICAgICAgeyBwcm9tcHQ6ICdBZGRyZXNzIGxpbmUgMycsIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MCB9LFxyXG4gICAgICAgICAgICB7IHByb21wdDogdGhpcy5yZXN1bHQuY3JlYXRlQWRkcmVzc0xpbmUubGFiZWwoJ2xvY2FsaXR5JyksIHN1Z2dlc3RlZF9pbnB1dF9sZW5ndGg6IDE2MCB9LFxyXG4gICAgICAgICAgICB7IHByb21wdDogdGhpcy5yZXN1bHQuY3JlYXRlQWRkcmVzc0xpbmUubGFiZWwoJ3JlZ2lvbicpLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjAgfSxcclxuICAgICAgICAgICAgeyBwcm9tcHQ6IHRoaXMucmVzdWx0LmNyZWF0ZUFkZHJlc3NMaW5lLmxhYmVsKCdwb3N0YWxfY29kZScpLCBzdWdnZXN0ZWRfaW5wdXRfbGVuZ3RoOiAxNjAgfVxyXG4gICAgICAgICAgXTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oYW5kbGVQcm9tcHRzZXRSZXN1bHQoeyByZXN1bHQ6IHsgbGluZXMgfSB9KSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgY291bnRyeV9pc286IHRoaXMuY3VycmVudENvdW50cnlDb2RlLFxyXG4gICAgICAgICAgZGF0YXNldHM6IEFycmF5LmlzQXJyYXkodGhpcy5jdXJyZW50RGF0YVNldCkgPyB0aGlzLmN1cnJlbnREYXRhU2V0IDogW3RoaXMuY3VycmVudERhdGFTZXRdLFxyXG4gICAgICAgICAgc2VhcmNoX3R5cGU6IHRoaXMuc2VhcmNoVHlwZSxcclxuICAgICAgICAgIHByb21wdF9zZXQ6ICdvcHRpbWFsJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncHJlLXByb21wdHNldC1jaGVjaycpO1xyXG4gICAgICAgIHRoaXMucmVxdWVzdC5zZW5kKHRoaXMuYmFzZVVybCArIHRoaXMucHJvbXB0c2V0RW5kcG9pbnQsICdQT1NUJywgdGhpcy5oYW5kbGVQcm9tcHRzZXRSZXN1bHQuYmluZCh0aGlzKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvb2t1cERhdGFzZXRDb2RlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGl0ZW0gPSBkYXRhc2V0Q29kZXMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuaXNvM0NvZGUgPT09IHRoaXMuY3VycmVudENvdW50cnlDb2RlICYmIGRhdGFzZXQuc2VhcmNoVHlwZS5pbmNsdWRlcyh0aGlzLnNlYXJjaFR5cGUpKTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHJldHVybiBpdGVtLmRhdGFzZXRDb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVQcm9tcHRzZXRSZXN1bHQocmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIC8vIFJlbW92ZSBhbnkgY3VycmVudGx5IGRpc3BsYXllZCBwaWNrbGlzdCB3aGVuIHRoZSBwcm9tcHRzZXQgY2hhbmdlc1xyXG4gICAgdGhpcy5waWNrbGlzdC5oaWRlKCk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciBhIG5ldyBldmVudCB0byBub3RpZnkgc3Vic2NyaWJlcnNcclxuICAgIHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3Bvc3QtcHJvbXB0c2V0LWNoZWNrJywgcmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldElucHV0cyhpbnB1dHMgPSB0aGlzLm9wdGlvbnMuZWxlbWVudHMuaW5wdXRzKTogdm9pZCB7XHJcbiAgICAvLyBJZiBhZGRyZXNzIGlucHV0cyBleGlzdCB0aGVuIHJlZ2lzdGVyIHRoZXNlIHdpdGggZXZlbnQgbGlzdGVuZXJzLCBvdGhlcndpc2UgY2FsbCB0aGUgcHJvbXB0c2V0IGVuZHBvaW50IHRvIHJldHJpZXZlIHRoZW1cclxuICAgIGlmIChpbnB1dHMpIHtcclxuICAgICAgdGhpcy5yZWdpc3RlcklucHV0cyhpbnB1dHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTWFrZSBhbiBBUEkgY2FsbCB0byBnZXQgdGhlIHByb21wdHNldCBmb3IgdGhpcyBjb3VudHJ5L2RhdGFzZXQvZW5naW5lXHJcbiAgICAgIHRoaXMuZ2V0UHJvbXB0c2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlNJTkdMRUxJTkUgfHwgdGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuVkFMSURBVEUpIHtcclxuICAgICAgLy8gQmluZCBhbiBldmVudCBsaXN0ZW5lciBvbiB0aGUgbG9va3VwIGJ1dHRvblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVsZW1lbnRzLmxvb2t1cEJ1dHRvbikge1xyXG4gICAgICAgIHRoaXMubG9va3VwRm4gPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5lbGVtZW50cy5sb29rdXBCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmxvb2t1cEZuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWdpc3RlcklucHV0cyhpbnB1dHM6IEhUTUxJbnB1dEVsZW1lbnRbXSkge1xyXG4gICAgLy8gSWYgbmV3IGlucHV0cyBoYXZlIGJlZW4gcHJvdmlkZWQsIGVuc3VyZSB3ZSB1cGRhdGUgdGhlIGVsZW1lbnRzIGFycmF5IHRvIGNhcHR1cmUgdGhlbVxyXG4gICAgdGhpcy5pbnB1dHMgPSBBcnJheS5mcm9tKGlucHV0cyk7XHJcblxyXG4gICAgdGhpcy5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgIC8vIERpc2FibGUgYXV0b2NvbXBsZXRlIG9uIHRoZSBmb3JtIGZpZWxkXHJcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ25ldy1wYXNzd29yZCcpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLkFVVE9DT01QTEVURSkge1xyXG4gICAgICAgIC8vIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGlucHV0XHJcbiAgICAgICAgdGhpcy5rZXlVcEZuID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMua2V5VXBGbik7XHJcbiAgICAgICAgdGhpcy5jaGVja1RhYkZuID0gdGhpcy5jaGVja1RhYi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmNoZWNrVGFiRm4pO1xyXG4gICAgICAgIC8vIFNldCBhIHBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXRcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyVGV4dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEJpbmQgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGlucHV0IHRvIGFsbG93IHVzZXJzIHRvIHRyYXZlcnNlIHVwIGFuZCBkb3duIHRoZSBwaWNrbGlzdCB1c2luZyB0aGUga2V5Ym9hcmRcclxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleWJvYXJkRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvdW50cnlDb2RlTWFwcGluZyA9IHRoaXMub3B0aW9ucy5jb3VudHJ5Q29kZU1hcHBpbmcgfHwge307XHJcblxyXG4gICAgLy8gQXBwbHkgZm9jdXMgdG8gdGhlIGZpcnN0IGlucHV0XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmFwcGx5Rm9jdXMpIHtcclxuICAgICAgdGhpcy5pbnB1dHNbMF0uZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q291bnRyeUxpc3QoKTogdm9pZCB7XHJcbiAgICAvLyBTZXQgdGhlIGluaXRpYWwgY291bnRyeSBjb2RlIGZyb20gZWl0aGVyIHRoZSB2YWx1ZSBvZiBhIGNvdW50cnkgbGlzdCBIVE1MIGVsZW1lbnQgb3IgYSBzdGF0aWMgY291bnRyeSBjb2RlXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmVsZW1lbnRzLmNvdW50cnlMaXN0KSB7XHJcbiAgICAgIHRoaXMuY3VycmVudENvdW50cnlDb2RlID0gdGhpcy5vcHRpb25zLmVsZW1lbnRzLmNvdW50cnlMaXN0LnZhbHVlO1xyXG5cclxuICAgICAgLy8gTGlzdGVuIGZvciB3aGVuIGEgY291bnRyeSBpcyBjaGFuZ2VkIGFuZCBjYWxsIHRoZSBwcm9tcHRzZXQgZW5kcG9pbnRcclxuICAgICAgdGhpcy5vcHRpb25zLmVsZW1lbnRzLmNvdW50cnlMaXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuaGFuZGxlQ291bnRyeUxpc3RDaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb3VudHJ5Q29kZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSA9IHRoaXMub3B0aW9ucy5jb3VudHJ5Q29kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBjb3VudHJ5IGNvZGUgb3IgYSBjb3VudHJ5IGxpc3QgZWxlbWVudCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gV2hlbiBhIGNvdW50cnkgZnJvbSB0aGUgbGlzdCBpcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIGN1cnJlbnQgY291bnRyeSBjb2RlIGFuZCBjYWxsIHRoZSBwcm9tcHRzZXQgZW5kcG9pbnQgYWdhaW5cclxuICBwcml2YXRlIGhhbmRsZUNvdW50cnlMaXN0Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50Q291bnRyeUNvZGUgPSB0aGlzLm9wdGlvbnMuZWxlbWVudHMuY291bnRyeUxpc3QudmFsdWU7XHJcbiAgICB0aGlzLmdldFByb21wdHNldCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVNlYXJjaERhdGFGb3JBcGlDYWxsKCk6IHN0cmluZyB7XHJcbiAgICAvLyBJZiBhIGRhdGFzZXQgY29kZSBoYXNuJ3QgYmVlbiBzZXQgeWV0LCB0cnkgYW5kIGxvb2sgaXQgdXBcclxuICAgIGlmICghdGhpcy5jdXJyZW50RGF0YVNldCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnREYXRhU2V0ID0gdGhpcy5sb29rdXBEYXRhc2V0Q29kZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIGNvdW50cnlfaXNvOiB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSxcclxuICAgICAgY29tcG9uZW50czogeyB1bnNwZWNpZmllZDogW3RoaXMuY3VycmVudFNlYXJjaFRlcm1dIH0sXHJcbiAgICAgIGRhdGFzZXRzOiBBcnJheS5pc0FycmF5KHRoaXMuY3VycmVudERhdGFTZXQpID8gdGhpcy5jdXJyZW50RGF0YVNldCA6IFt0aGlzLmN1cnJlbnREYXRhU2V0XSxcclxuICAgICAgbWF4X3N1Z2dlc3Rpb25zOiAodGhpcy5vcHRpb25zLm1heFN1Z2dlc3Rpb25zIHx8IHRoaXMucGlja2xpc3QubWF4U3VnZ2VzdGlvbnMpXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5TSU5HTEVMSU5FIHx8IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFKSB7XHJcbiAgICAgIGRhdGFbJ29wdGlvbnMnXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnZmxhdHRlbicsXHJcbiAgICAgICAgICBWYWx1ZTogJ3RydWUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnaW50ZW5zaXR5JyxcclxuICAgICAgICAgIFZhbHVlOiAnY2xvc2UnXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAncHJvbXB0X3NldCcsXHJcbiAgICAgICAgICBWYWx1ZTogJ2RlZmF1bHQnXHJcbiAgICAgICAgfVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlNJTkdMRUxJTkUpIHtcclxuICAgICAgICBkYXRhWydvcHRpb25zJ10ucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiAnc2VhcmNoX3R5cGUnLFxyXG4gICAgICAgICAgVmFsdWU6ICdzaW5nbGVsaW5lJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuVkFMSURBVEUpIHtcclxuICAgICAgICBkYXRhWydsYXlvdXRzJ10gPSBbJ2RlZmF1bHQnXTtcclxuICAgICAgICBkYXRhWydsYXlvdXRfZm9ybWF0J10gPSAnZGVmYXVsdCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9uKSB7XHJcbiAgICAgIGRhdGFbJ2xvY2F0aW9uJ10gPSB0aGlzLm9wdGlvbnMubG9jYXRpb247XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTG9va3VwRGF0YUZvckFwaUNhbGwoaW5wdXQ6IHN0cmluZywgc2hvdWxkR2V0U3VnZ2VzdGlvbnM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgLy8gSWYgYSBkYXRhc2V0IGNvZGUgaGFzbid0IGJlZW4gc2V0IHlldCwgdHJ5IGFuZCBsb29rIGl0IHVwXHJcbiAgICBpZiAoIXRoaXMuY3VycmVudERhdGFTZXQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50RGF0YVNldCA9IHRoaXMubG9va3VwRGF0YXNldENvZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBjb3VudHJ5X2lzbzogdGhpcy5jdXJyZW50Q291bnRyeUNvZGUsXHJcbiAgICAgIGRhdGFzZXRzOiBBcnJheS5pc0FycmF5KHRoaXMuY3VycmVudERhdGFTZXQpID8gdGhpcy5jdXJyZW50RGF0YVNldCA6IFt0aGlzLmN1cnJlbnREYXRhU2V0XSxcclxuICAgICAgbWF4X3N1Z2dlc3Rpb25zOiAodGhpcy5vcHRpb25zLm1heFN1Z2dlc3Rpb25zIHx8IHRoaXMucGlja2xpc3QubWF4U3VnZ2VzdGlvbnMpLFxyXG4gICAgICBrZXk6IHtcclxuICAgICAgICB0eXBlOiB0aGlzLndoYXQzV29yZHNLZXl3b3JkLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmdldFdoYXQzV29yZHNMb29rdXBWYWx1ZShpbnB1dCwgc2hvdWxkR2V0U3VnZ2VzdGlvbnMpLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0V2hhdDNXb3Jkc0xvb2t1cFZhbHVlKGlucHV0OiBzdHJpbmcsIHNob3VsZEdldFN1Z2dlc3Rpb25zOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKCcvLy8nKSAmJiBzaG91bGRHZXRTdWdnZXN0aW9ucykge1xyXG4gICAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnB1dDtcclxuICB9XHJcblxyXG4gIC8vIEFsbG93IHRoZSBrZXlib2FyZCB0byBiZSB1c2VkIHRvIGVpdGhlciB0cmF2ZXJzZSB1cCBhbmQgZG93biB0aGUgcGlja2xpc3QgYW5kIHNlbGVjdCBhbiBpdGVtLCBvciB0cmlnZ2VyIGEgbmV3IHNlYXJjaFxyXG4gIHByaXZhdGUgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZXZlbnQpO1xyXG5cclxuICAgIC8vIElmIGEgcGlja2xpc3QgaXMgcG9wdWxhdGVkIHRoZW4gdHJpZ2dlciBpdHMga2V5dXAgZXZlbnQgdG8gc2VsZWN0IGFuIGl0ZW1cclxuICAgIGlmICh0aGlzLnBpY2tsaXN0LnNpemUpIHtcclxuICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicgfHwga2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5rZXl1cChldmVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPdGhlcndpc2UsIGVuYWJsZSBwcmVzc2luZyAnZW50ZXInIHRvIHRyaWdnZXIgYSBuZXcgc2VhcmNoXHJcbiAgICAgIGlmIChrZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaChldmVudCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNYWluIGZ1bmN0aW9uIHRvIHNlYXJjaCBmb3IgYW4gYWRkcmVzcyBmcm9tIGFuIGlucHV0IHN0cmluZ1xyXG4gIHByaXZhdGUgc2VhcmNoKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSB0aGlzLmlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQudmFsdWUpLmpvaW4oJywnKTtcclxuXHJcbiAgICAvLyBHcmFiIHRoZSBjb3VudHJ5IElTTyBjb2RlIGFuZCAoaWYgaXQgaXMgcHJlc2VudCkgdGhlIGRhdGFzZXQgbmFtZSBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudHJ5TGlzdCAoZm9ybWF0OiB7Y291bnRyeUlzb0NvZGV9O3tkYXRhc2V0fSlcclxuICAgIGNvbnN0IGN1cnJlbnRDb3VudHJ5SW5mbyA9IHRoaXMuY291bnRyeUNvZGVNYXBwaW5nW3RoaXMuY3VycmVudENvdW50cnlDb2RlXSB8fCB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZTtcclxuICAgIGNvbnN0IGNvdW50cnlDb2RlQW5kRGF0YXNldCA9IGN1cnJlbnRDb3VudHJ5SW5mby5zcGxpdCgnOycpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudENvdW50cnlDb2RlID0gY291bnRyeUNvZGVBbmREYXRhc2V0WzBdO1xyXG4gICAgaWYgKGNvdW50cnlDb2RlQW5kRGF0YXNldFsxXSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnREYXRhU2V0ID0gY291bnRyeUNvZGVBbmREYXRhc2V0WzFdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIChSZS0pc2V0IHRoZSBwcm9wZXJ0eSBzdGF0aW5nIHdoZXRoZXIgdGhlIHNlYXJjaCBpbnB1dCBoYXMgYmVlbiByZXNldC5cclxuICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBpbnN0YW5jZXMgd2hlbiB0aGUgc2VhcmNoIGlucHV0IGlzIGFsc28gYW4gYWRkcmVzc1xyXG4gICAgLy8gb3V0cHV0IGZpZWxkLiBBZnRlciBhbiBhZGRyZXNzIGhhcyBiZWVuIHJldHVybmVkLCB5b3UgZG9uJ3Qgd2FudCBhIG5ldyBcclxuICAgIC8vIHNlYXJjaCBiZWluZyB0cmlnZ2VyZWQgdW50aWwgdGhlIGZpZWxkIGhhcyBiZWVuIGNsZWFyZWQuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50U2VhcmNoVGVybSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5oYXNTZWFyY2hJbnB1dEJlZW5SZXNldCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgc2VhcmNoaW5nIGlzIHBlcm1pdHRlZFxyXG4gICAgaWYgKHRoaXMuY2FuU2VhcmNoKCkpIHtcclxuICAgICAgLy8gQWJvcnQgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzXHJcbiAgICAgIGlmICh0aGlzLnJlcXVlc3QuY3VycmVudFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLnJlcXVlc3QuY3VycmVudFJlcXVlc3QuYWJvcnQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVnZXggdGhhdCBjaGVja3MgaWYgdGhlIGlucHV0IGlzIHRoZSBmb3JtYXQgZm9yIGEgd2hhdDN3b3JkcyBzZWFyY2guIEV4OiAvLy9hLmIuY1xyXG4gICAgICBjb25zdCByZWdleCA9IC9eXFwvezAsfSg/OlteMC05YH4hQCMkJV4mKigpK1xcLV89W3tcXF19XFxcXHwnPCwuPj8vXCI7OsKjwqfCusKpwq5cXHNdK1su772h44CC772l44O777iS4Z+U1onhgYvblOGNouClpF1bXjAtOWB+IUAjJCVeJiooKStcXC1fPVt7XFxdfVxcXFx8JzwsLj4/L1wiOzrCo8KnwrrCqcKuXFxzXStbLu+9oeOAgu+9peODu++4kuGflNaJ4YGL25ThjaLgpaRdW14wLTlgfiFAIyQlXiYqKCkrXFwtXz1be1xcXX1cXFxcfCc8LC4+Py9cIjs6wqPCp8K6wqnCrlxcc10rfFteMC05YH4hQCMkJV4mKigpK1xcLV89W3tcXF19XFxcXHwnPCwuPj8vXCI7OsKjwqfCusKpwq5cXHNdKyhbXFx1MDAyMFxcdTAwQTBdW14wLTlgfiFAIyQlXiYqKCkrXFwtXz1be1xcXX1cXFxcfCc8LC4+Py9cIjs6wqPCp8K6wqnCrlxcc10rKXsxLDN9Wy7vvaHjgILvvaXjg7vvuJLhn5TWieGBi9uU4Y2i4KWkXVteMC05YH4hQCMkJV4mKigpK1xcLV89W3tcXF19XFxcXHwnPCwuPj8vXCI7OsKjwqfCusKpwq5cXHNdKyhbXFx1MDAyMFxcdTAwQTBdW14wLTlgfiFAIyQlXiYqKCkrXFwtXz1be1xcXX1cXFxcfCc8LC4+Py9cIjs6wqPCp8K6wqnCrlxcc10rKXsxLDN9Wy7vvaHjgILvvaXjg7vvuJLhn5TWieGBi9uU4Y2i4KWkXVteMC05YH4hQCMkJV4mKigpK1xcLV89W3tcXF19XFxcXHwnPCwuPj8vXCI7OsKjwqfCusKpwq5cXHNdKyhbXFx1MDAyMFxcdTAwQTBdW14wLTlgfiFAIyQlXiYqKCkrXFwtXz1be1xcXX1cXFxcfCc8LC4+Py9cIjs6wqPCp8K6wqnCrlxcc10rKXsxLDN9KSQvO1xyXG5cclxuICAgICAgaWYgKHJlZ2V4LnRlc3QodGhpcy5jdXJyZW50U2VhcmNoVGVybSkgJiYgdGhpcy5vcHRpb25zLmVuYWJsZVdoYXQzV29yZHMgJiYgdGhpcy53aGF0M1dvcmRDb3VudHJpZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZSkgPiAtMSkge1xyXG4gICAgICAgIHRoaXMuaXNXaGF0M1dvcmRzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzV2hhdDNXb3JkcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IGJlZm9yZSBhIHNlYXJjaCB0YWtlcyBwbGFjZVxyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtc2VhcmNoJywgdGhpcy5jdXJyZW50U2VhcmNoVGVybSk7XHJcblxyXG4gICAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBTZWFyY2ggVVJMIGFuZCBkYXRhXHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmlzV2hhdDNXb3JkcyA/IHRoaXMuZ2VuZXJhdGVMb29rdXBEYXRhRm9yQXBpQ2FsbCh0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLCB0cnVlKSA6IHRoaXMuZ2VuZXJhdGVTZWFyY2hEYXRhRm9yQXBpQ2FsbCgpO1xyXG5cclxuICAgICAgLy8gU3RvcmUgdGhlIGxhc3Qgc2VhcmNoIHRlcm1cclxuICAgICAgdGhpcy5sYXN0U2VhcmNoVGVybSA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm07XHJcblxyXG4gICAgICAvLyBIaWRlIHRoZSBpbmxpbmUgc2VhcmNoIHNwaW5uZXJcclxuICAgICAgdGhpcy5zZWFyY2hTcGlubmVyLmhpZGUoKTtcclxuXHJcbiAgICAgIC8vIFNob3cgYW4gaW5saW5lIHNwaW5uZXIgd2hpbHN0IHNlYXJjaGluZ1xyXG4gICAgICB0aGlzLnNlYXJjaFNwaW5uZXIuc2hvdygpO1xyXG5cclxuICAgICAgbGV0IHVybCwgaGVhZGVycywgY2FsbGJhY2s7XHJcbiAgICAgIC8vIFNldCB0aGUgQVBJIFVSTCwgaGVhZGVycyBhbmQgY2FsbGJhY2sgZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSBzZWFyY2ggdHlwZVxyXG4gICAgICBpZiAodGhpcy5pc1doYXQzV29yZHMpIHtcclxuICAgICAgICB1cmwgPSB0aGlzLmJhc2VVcmwgKyB0aGlzLmxvb2t1cEVuZHBvaW50O1xyXG4gICAgICAgIGhlYWRlcnMgPSBbXTtcclxuICAgICAgICBjYWxsYmFjayA9IHRoaXMucGlja2xpc3Quc2hvd1doYXQzV29yZHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXJsID0gdGhpcy5iYXNlVXJsICsgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFID8gdGhpcy52YWxpZGF0ZUVuZHBvaW50IDogdGhpcy5zZWFyY2hFbmRwb2ludCk7XHJcbiAgICAgICAgaGVhZGVycyA9IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFID8gW3sga2V5OiAnQWRkLU1ldGFkYXRhJywgdmFsdWU6IHRydWUgfV0gOiBbXTtcclxuICAgICAgICBjYWxsYmFjayA9IHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFID8gdGhpcy5yZXN1bHQuaGFuZGxlVmFsaWRhdGVSZXNwb25zZSA6IHRoaXMucGlja2xpc3Quc2hvdztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSW5pdGlhdGUgbmV3IFNlYXJjaCByZXF1ZXN0XHJcbiAgICAgIHRoaXMucmVxdWVzdC5zZW5kKHVybCwgJ1BPU1QnLCBjYWxsYmFjaywgZGF0YSwgaGVhZGVycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hUZXJtICE9PSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtKSB7XHJcbiAgICAgIC8vIENsZWFyIHRoZSBwaWNrbGlzdCBpZiB0aGUgc2VhcmNoIHRlcm0gaXMgY2xlYXJlZC9lbXB0eVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gcmV0dXJuIGEgY29uc2lzdGVudCBrZXkgbmFtZVxyXG4gIHByaXZhdGUgZ2V0S2V5KHsga2V5IH0pOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgcmV0dXJuICdBcnJvd0Rvd24nO1xyXG4gICAgICBjYXNlICdVcCc6XHJcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgIHJldHVybiAnQXJyb3dVcCc7XHJcbiAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcclxuICAgICAgY2FzZSAnICc6XHJcbiAgICAgICAgcmV0dXJuICcgJztcclxuICAgICAgY2FzZSAnRXNjYXBlJzpcclxuICAgICAgY2FzZSAnRXNjJzpcclxuICAgICAgICByZXR1cm4gJ0VzY2FwZSc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FuU2VhcmNoKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gSWYgc2VhcmNoaW5nIG9uIHRoaXMgaW5zdGFuY2UgaXMgZW5hYmxlZCwgYW5kXHJcbiAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5lbmFibGVkICYmXHJcbiAgICAgIC8vIElmIHNlYXJjaCB0ZXJtIGlzIG5vdCBlbXB0eSwgYW5kXHJcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gIT09ICcnICYmXHJcbiAgICAgIC8vIElmIHRoZSBzZWFyY2ggdGVybSBpcyBhdCBsZWFzdCA0IGNoYXJhY3RlcnNcclxuICAgICAgdGhpcy5jdXJyZW50U2VhcmNoVGVybS5sZW5ndGggPiAzICYmXHJcbiAgICAgIC8vIElmIHNlYXJjaCB0ZXJtIGlzIG5vdCB0aGUgc2FtZSBhcyBwcmV2aW91cyBzZWFyY2ggdGVybSwgYW5kXHJcbiAgICAgIHRoaXMubGFzdFNlYXJjaFRlcm0gIT09IHRoaXMuY3VycmVudFNlYXJjaFRlcm0gJiZcclxuICAgICAgLy8gSWYgdGhlIGNvdW50cnkgaXMgbm90IGVtcHR5LCBhbmRcclxuICAgICAgdGhpcy5jdXJyZW50Q291bnRyeUNvZGUgJiZcclxuICAgICAgLy8gSWYgc2VhcmNoIGlucHV0IGhhcyBiZWVuIHJlc2V0IChpZiBhcHBsaWNhYmxlKVxyXG4gICAgICB0aGlzLmhhc1NlYXJjaElucHV0QmVlblJlc2V0ID09PSB0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG93ZXJlZEJ5TG9nbzogUG93ZXJlZEJ5TG9nbyA9IHtcclxuICAgIGVsZW1lbnQ6IG51bGwsXHJcbiAgICAvLyBDcmVhdGUgYSBcIlBvd2VyZWQgYnkgRXhwZXJpYW5cIiBmb290ZXJcclxuICAgIGNyZWF0ZShwaWNrbGlzdCkge1xyXG4gICAgICBjb25zdCBpdGVtID0ge1xyXG4gICAgICAgIHRleHQ6IGAke3RoaXMuc3ZnfSA8ZW0+UG93ZXJlZCBieSBFeHBlcmlhbjwvZW0+YCxcclxuICAgICAgICBmb3JtYXQ6ICcnXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGxpc3RJdGVtID0gcGlja2xpc3QuY3JlYXRlTGlzdEl0ZW0oaXRlbSk7XHJcbiAgICAgIGxpc3RJdGVtLmNsYXNzTGlzdC5hZGQoJ3Bvd2VyZWQtYnktZXhwZXJpYW4nKTtcclxuICAgICAgcGlja2xpc3QubGlzdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGxpc3RJdGVtKTtcclxuICAgICAgcmV0dXJuIGxpc3RJdGVtO1xyXG4gICAgfSxcclxuICAgIC8vIERlc3Ryb3kgdGhlIFwiUG93ZXJlZCBieSBFeHBlcmlhblwiIGZvb3RlclxyXG4gICAgZGVzdHJveShwaWNrbGlzdCkge1xyXG4gICAgICBpZiAodGhpcy5lbGVtZW50KSB7XHJcbiAgICAgICAgcGlja2xpc3QubGlzdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgc3ZnOiBgPHN2ZyBjbGFzcz1cImV4cGVyaWFuLWxvZ29cIiB2ZXJzaW9uPVwiMS4xXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAxMjAgMTIwXCIgc3R5bGU9XCJcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIHJvbGU9XCJpbWdcIiBhcmlhLWxhYmVsPVwiUG93ZXJlZCBieSBFeHBlcmlhblwiPlxyXG4gICAgICAgICAgICA8dGl0bGU+RXhwZXJpYW4gbG9nbzwvdGl0bGU+XHJcbiAgICAgICAgICAgIDxnPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggc3R5bGU9XCJmaWxsOiAjMEU2RUI2XCIgZD1cIk01Ni4xLDI3aC0xM2MtMy45LDAtNy0zLjEtNy03VjdjMC0zLjksMy4xLTcsNy03aDEzYzMuOSwwLDcsMy4xLDcsN3YxM0M2My4xLDIzLjgsNjAsMjcsNTYuMSwyN1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0eWxlPVwiZmlsbDogIzcyMjE3QlwiIGQ9XCJNMjIuNSw1Ni4xSDcuOWMtNC4zLDAtNy45LTMuNS03LjktNy45VjMzLjZjMC00LjMsMy41LTcuOSw3LjktNy45aDE0LjZjNC4zLDAsNy45LDMuNSw3LjksNy45djE0LjZDMzAuNCw1Mi42LDI2LjgsNTYuMSwyMi41LDU2LjFcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGw6ICNCMTIzODRcIiBkPVwiTTIxLjEsODYuNGgtOC45Yy0yLjcsMC00LjgtMi4xLTQuOC00Ljh2LTguOWMwLTIuNywyLjItNC44LDQuOC00LjhoOC45YzIuNywwLDQuOCwyLjIsNC44LDQuOHY4LjlDMjUuOSw4NC4zLDIzLjcsODYuNCwyMS4xLDg2LjRcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHlsZT1cImZpbGw6ICNFNzI4ODdcIiBkPVwiTTQ1LjEsMTE0LjdIMzQuNWMtMy4xLDAtNS43LTIuNS01LjctNS43Vjk4LjRjMC0zLjEsMi41LTUuNyw1LjctNS43aDEwLjZjMy4xLDAsNS43LDIuNSw1LjcsNS43VjEwOUM1MC43LDExMi4xLDQ4LjIsMTE0LjcsNDUuMSwxMTQuN1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0eWxlPVwiZmlsbDogI0U3Mjg4N1wiIGQ9XCJNODMuOCwzMi4zaC03LjNjLTIuMiwwLTMuOS0xLjgtMy45LTMuOXYtNy4zYzAtMi4yLDEuOC0zLjksMy45LTMuOWg3LjNjMi4yLDAsMy45LDEuOCwzLjksMy45djcuM0M4Ny43LDMwLjUsODUuOSwzMi4zLDgzLjgsMzIuM1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0eWxlPVwiZmlsbDogIzAwNDY5MVwiIGQ9XCJNODEuNyw2MS44QzgxLjUsNTEuMSw3Miw0Miw2MC43LDQyQzQ5LDQyLDM5LjYsNTEuMywzOS42LDYyLjlDMzkuNiw3NC42LDQ5LDg0LDYwLjcsODRjNS42LDAsMTAuOC0yLjIsMTQuNi01LjljMC43LTAuNywxLjItMS42LDEuMi0yLjZjMC0xLjktMS42LTMuNS0zLjUtMy41Yy0xLjEsMC0yLDAuNy0yLjgsMS40Yy0yLjQsMi41LTUuOSwzLjctOS41LDMuN2MtNywwLTEyLjctNC44LTEzLjktMTEuNWgzMS41YzAsMCwwLDAsMC4xLDBoMC4xYzAuMSwwLDAuMSwwLDAuMiwwYzAuMSwwLDAuMiwwLDAuNC0wLjFDODAuNCw2NSw4MS43LDYzLjYsODEuNyw2MS44eiBNNjAuNyw0OC45YzYuMywwLDExLjYsNC4xLDEzLjQsOS43SDQ3LjNDNDkuMSw1Myw1NC4zLDQ4LjksNjAuNyw0OC45elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgIDwvc3ZnPmBcclxuICB9O1xyXG5cclxuICBwcml2YXRlIGNyZWF0ZVBpY2tsaXN0KCkge1xyXG4gICAgLy8gSW5zdGFudGlhdGUgYSBuZXcgUGlja2xpc3QgY2xhc3MgYW5kIHNldCB0aGUgcHJvcGVydGllcyBiZWxvd1xyXG4gICAgdGhpcy5waWNrbGlzdCA9IG5ldyBQaWNrbGlzdCgpO1xyXG5cclxuICAgIC8vIFNldCBpbml0aWFsIG1heCBzaXplXHJcbiAgICB0aGlzLnBpY2tsaXN0Lm1heFN1Z2dlc3Rpb25zID0gMjU7XHJcbiAgICAvLyBUYWIgY291bnQgdXNlZCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgdGhpcy5waWNrbGlzdC50YWJDb3VudCA9IC0xO1xyXG4gICAgLy8gUmVuZGVyIGEgcGlja2xpc3Qgb2Ygc2VhcmNoIHJlc3VsdHNcclxuXHJcbiAgICB0aGlzLnBpY2tsaXN0LnNob3cgPSAoaXRlbXM6IFNlYXJjaFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIC8vIFN0b3JlIHRoZSBwaWNrbGlzdCBpdGVtc1xyXG4gICAgICB0aGlzLnBpY2tsaXN0Lml0ZW1zID0gaXRlbXM/LnJlc3VsdC5zdWdnZXN0aW9ucztcclxuXHJcbiAgICAgIHRoaXMucGlja2xpc3QuaGFuZGxlQ29tbW9uU2hvd1BpY2tsaXN0TG9naWMoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBpY2tsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gSWYgYSBwaWNrbGlzdCBuZWVkcyBcInJlZmluaW5nXCIgdGhlbiBwcmVwZW5kIGEgdGV4dGJveCB0byBhbGxvdyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBzZWxlY3Rpb25cclxuICAgICAgICBpZiAodGhpcy5waWNrbGlzdC5yZWZpbmUuaXNOZWVkZWQoaXRlbXMpKSB7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0LnJlZmluZS5jcmVhdGVJbnB1dChpdGVtcy5yZXN1bHQuc3VnZ2VzdGlvbnNfcHJvbXB0LCBpdGVtcy5yZXN1bHQuc3VnZ2VzdGlvbnNfa2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5WQUxJREFURSkge1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5kaXNwbGF5U3VnZ2VzdGlvbnNIZWFkZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbmQgc2hvdyByZXN1bHRzXHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0vcm93IGluIHRoZSBwaWNrbGlzdFxyXG4gICAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0LmNyZWF0ZUxpc3RJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LmFwcGVuZENoaWxkKGxpc3RJdGVtKTtcclxuXHJcbiAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHNlbGVjdGlvbiBvbiB0aGlzIGl0ZW1cclxuICAgICAgICAgIHRoaXMucGlja2xpc3QubGlzdGVuKGxpc3RJdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVHlwZSA9PT0gQWRkcmVzc1ZhbGlkYXRpb25Nb2RlLlZBTElEQVRFKSB7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0LmRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5oYW5kbGVFbXB0eVBpY2tsaXN0KGl0ZW1zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIGEgXCJQb3dlcmVkIGJ5IEV4cGVyaWFuXCIgbG9nbyB0byB0aGUgcGlja2xpc3QgZm9vdGVyXHJcbiAgICAgIHRoaXMucG93ZXJlZEJ5TG9nby5lbGVtZW50ID0gdGhpcy5wb3dlcmVkQnlMb2dvLmVsZW1lbnQgfHwgdGhpcy5wb3dlcmVkQnlMb2dvLmNyZWF0ZSh0aGlzLnBpY2tsaXN0KTtcclxuXHJcbiAgICAgIC8vIEZpcmUgYW4gZXZlbnQgYWZ0ZXIgcGlja2xpc3QgaXMgY3JlYXRlZFxyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXBpY2tsaXN0LWNyZWF0ZScsIHRoaXMucGlja2xpc3QuaXRlbXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBpY2tsaXN0LnNob3dXaGF0M1dvcmRzID0gKGl0ZW1zOiBMb29rdXBXM1dSZXNwb25zZSkgPT4ge1xyXG4gICAgICAvLyBTdG9yZSB0aGUgcGlja2xpc3QgaXRlbXNcclxuICAgICAgdGhpcy5waWNrbGlzdC53aGF0M3dvcmRzSXRlbXMgPSBpdGVtcz8ucmVzdWx0LnN1Z2dlc3Rpb25zO1xyXG5cclxuICAgICAgdGhpcy5waWNrbGlzdC5oYW5kbGVDb21tb25TaG93UGlja2xpc3RMb2dpYygpO1xyXG5cclxuICAgICAgaWYgKHRoaXMucGlja2xpc3Qud2hhdDN3b3Jkc0l0ZW1zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFuZCBzaG93IHJlc3VsdHNcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LndoYXQzd29yZHNJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0vcm93IGluIHRoZSBwaWNrbGlzdFxyXG4gICAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0LmNyZWF0ZVdoYXQzV29yZHNMaXN0SXRlbShpdGVtKTtcclxuICAgICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5hcHBlbmRDaGlsZChsaXN0SXRlbSk7XHJcblxyXG4gICAgICAgICAgLy8gTGlzdGVuIGZvciBzZWxlY3Rpb24gb24gdGhpcyBpdGVtXHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3RlbihsaXN0SXRlbSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGlja2xpc3Quc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QuaGFuZGxlRW1wdHlQaWNrbGlzdChpdGVtcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBhIFwiUG93ZXJlZCBieSBFeHBlcmlhblwiIGxvZ28gdG8gdGhlIHBpY2tsaXN0IGZvb3RlclxyXG4gICAgICB0aGlzLnBvd2VyZWRCeUxvZ28uZWxlbWVudCA9IHRoaXMucG93ZXJlZEJ5TG9nby5lbGVtZW50IHx8IHRoaXMucG93ZXJlZEJ5TG9nby5jcmVhdGUodGhpcy5waWNrbGlzdCk7XHJcblxyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IGFmdGVyIHBpY2tsaXN0IGlzIGNyZWF0ZWRcclxuICAgICAgdGhpcy5ldmVudHMudHJpZ2dlcigncG9zdC1waWNrbGlzdC1jcmVhdGUnLCB0aGlzLnBpY2tsaXN0Lml0ZW1zKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC5zaG93TG9va3VwID0gKGl0ZW1zOiBMb29rdXBWMlJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIC8vIFNldCBpc1doYXQzV29yZHMgdG8gXCJmYWxzZVwiIGFzIHdlIGFyZSBubyBsb25nZXIgc2hvd2luZyB3aGF0M3dvcmRzIGFkZHJlc3NlcyBcclxuICAgICAgdGhpcy5pc1doYXQzV29yZHMgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHRoZSBwaWNrbGlzdCBpdGVtc1xyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxvb2t1cEl0ZW1zID0gaXRlbXM/LnJlc3VsdC5hZGRyZXNzZXM7XHJcblxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmhhbmRsZUNvbW1vblNob3dQaWNrbGlzdExvZ2ljKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5waWNrbGlzdC5sb29rdXBJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbmQgc2hvdyByZXN1bHRzXHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5sb29rdXBJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0vcm93IGluIHRoZSBwaWNrbGlzdFxyXG4gICAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0LmNyZWF0ZUxvb2t1cExpc3RJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LmFwcGVuZENoaWxkKGxpc3RJdGVtKTtcclxuXHJcbiAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHNlbGVjdGlvbiBvbiB0aGlzIGl0ZW1cclxuICAgICAgICAgIHRoaXMucGlja2xpc3QubGlzdGVuKGxpc3RJdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5oYW5kbGVFbXB0eVBpY2tsaXN0KGl0ZW1zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIGEgXCJQb3dlcmVkIGJ5IEV4cGVyaWFuXCIgbG9nbyB0byB0aGUgcGlja2xpc3QgZm9vdGVyXHJcbiAgICAgIHRoaXMucG93ZXJlZEJ5TG9nby5lbGVtZW50ID0gdGhpcy5wb3dlcmVkQnlMb2dvLmVsZW1lbnQgfHwgdGhpcy5wb3dlcmVkQnlMb2dvLmNyZWF0ZSh0aGlzLnBpY2tsaXN0KTtcclxuXHJcbiAgICAgIC8vIEZpcmUgYW4gZXZlbnQgYWZ0ZXIgcGlja2xpc3QgaXMgY3JlYXRlZFxyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwb3N0LXBpY2tsaXN0LWNyZWF0ZScsIHRoaXMucGlja2xpc3QuaXRlbXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBpY2tsaXN0LmhhbmRsZUNvbW1vblNob3dQaWNrbGlzdExvZ2ljID0gKCkgPT4ge1xyXG4gICAgICAvLyBSZXNldCBhbnkgcHJldmlvdXNseSBzZWxlY3RlZCBjdXJyZW50IGl0ZW1cclxuICAgICAgdGhpcy5waWNrbGlzdC5jdXJyZW50SXRlbSA9IG51bGw7XHJcblxyXG4gICAgICAvLyBVcGRhdGUgcGlja2xpc3Qgc2l6ZVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnNpemUgPSB0aGlzLnBpY2tsaXN0Lml0ZW1zPy5sZW5ndGg7XHJcblxyXG4gICAgICAvLyBSZXNldCB0aGUgcGlja2xpc3QgdGFiIGNvdW50ICh1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uKVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnJlc2V0VGFiQ291bnQoKTtcclxuXHJcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxyXG4gICAgICB0aGlzLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gR2V0L0NyZWF0ZSBwaWNrbGlzdCBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QgPSB0aGlzLnBpY2tsaXN0Lmxpc3QgfHwgdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0KCk7XHJcblxyXG4gICAgICAvLyBFbnN1cmUgcHJldmlvdXMgcmVzdWx0cyBhcmUgY2xlYXJlZFxyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgIHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuZGVzdHJveSgpO1xyXG5cclxuICAgICAgLy8gRmlyZSBhbiBldmVudCBiZWZvcmUgcGlja2xpc3QgaXMgY3JlYXRlZFxyXG4gICAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtcGlja2xpc3QtY3JlYXRlJywgdGhpcy5waWNrbGlzdC5pdGVtcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFJlbW92ZSB0aGUgcGlja2xpc3RcclxuICAgIHRoaXMucGlja2xpc3QuaGlkZSA9ICgpID0+IHtcclxuICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgcGlja2xpc3QgaXRlbVxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmN1cnJlbnRJdGVtID0gbnVsbDtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBcInVzZSBhZGRyZXNzIGVudGVyZWRcIiBvcHRpb24gdG9vXHJcbiAgICAgIHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuZGVzdHJveSgpO1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIFwiUG93ZXJlZCBieSBFeHBlcmlhblwiIGxvZ29cclxuICAgICAgdGhpcy5wb3dlcmVkQnlMb2dvLmRlc3Ryb3kodGhpcy5waWNrbGlzdCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5pbnB1dHMpIHtcclxuICAgICAgICAvLyBSZW1vdmUgdGhlIGNsYXNzIGRlbm90aW5nIGEgcGlja2xpc3QgLSBpZiBTaW5nbGVsaW5lIG1vZGUgaXMgdXNlZCwgdGhlbiBpdCBpcyB0aGUgbGFzdCBpbnB1dCBmaWVsZCwgb3RoZXJ3aXNlIHVzZSB0aGUgZmlyc3Qgb25lXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5TSU5HTEVMSU5FID8gdGhpcy5pbnB1dHMubGVuZ3RoIC0gMSA6IDA7XHJcbiAgICAgICAgdGhpcy5pbnB1dHNbcG9zaXRpb25dLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3dpbmctc3VnZ2VzdGlvbnMnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVtb3ZlIHRoZSBtYWluIHBpY2tsaXN0IGNvbnRhaW5lclxyXG4gICAgICBpZiAodGhpcy5waWNrbGlzdC5saXN0KSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucGlja2xpc3QuaGFuZGxlRW1wdHlQaWNrbGlzdCA9IChpdGVtczogU2VhcmNoUmVzcG9uc2UgfCBMb29rdXBXM1dSZXNwb25zZSB8IExvb2t1cFYyUmVzcG9uc2UpID0+IHtcclxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0vcm93IGluIHRoZSBwaWNrbGlzdCBzaG93aW5nIFwiTm8gbWF0Y2hlc1wiIHRoYXQgYWxsb3dzIHRoZSBcInVzZSBhZGRyZXNzIGVudGVyZWRcIiBvcHRpb25cclxuICAgICAgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5lbGVtZW50ID0gdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5lbGVtZW50IHx8IHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuY3JlYXRlKGl0ZW1zLnJlc3VsdD8uY29uZmlkZW5jZSk7XHJcblxyXG4gICAgICB0aGlzLnBpY2tsaXN0LnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTtcclxuXHJcbiAgICAgIC8vIFByb3ZpZGUgaW1wbGVtZW50aW5nIHNlYXJjaCB0eXBlcyB3aXRoIGEgbWVhbnMgb2YgaW52b2tpbmcgYSBjdXN0b20gY2FsbGJhY2tcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnBpY2tsaXN0LmhhbmRsZUVtcHR5UGlja2xpc3RDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QuaGFuZGxlRW1wdHlQaWNrbGlzdENhbGxiYWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gUHJlcGVuZCBhIHRpdGxlIGJlZm9yZSB0aGUgc3VnZ2VzdGlvbnNcclxuICAgIHRoaXMucGlja2xpc3QuZGlzcGxheVN1Z2dlc3Rpb25zSGVhZGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCB0aXRsZURpdiA9ICg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpY2tsaXN0LXN1Z2dlc3Rpb25zLWhlYWRlcicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuICAgICAgdGl0bGVEaXYuY2xhc3NMaXN0LmFkZCgncGlja2xpc3Qtc3VnZ2VzdGlvbnMtaGVhZGVyJyk7XHJcbiAgICAgIHRpdGxlRGl2LmlubmVyVGV4dCA9ICdTdWdnZXN0aW9uczonO1xyXG4gICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGl0bGVEaXYsIHRoaXMucGlja2xpc3QubGlzdCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFwcGVuZCBhIGZvb3RlciBhdCB0aGUgYm90dG9tIG9mIHRoZSBwaWNrbGlzdCBwcm92aWRpbmcgYW4gb3B0aW9uIHRvIFwidXNlIGFkZHJlc3MgZW50ZXJlZFwiXHJcbiAgICB0aGlzLnBpY2tsaXN0LmRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlciA9ICgpID0+IHtcclxuICAgICAgY29uc3QgY29udGFpbmVyRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpY2tsaXN0LXVzZS1lbnRlcmVkLWNvbnRhaW5lcicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBjb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgncGlja2xpc3QtdXNlLWVudGVyZWQtY29udGFpbmVyJyk7XHJcbiAgICAgIHRoaXMucGlja2xpc3QubGlzdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250YWluZXJEaXYsIHRoaXMucGlja2xpc3QubGlzdC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG5cclxuICAgICAgY29uc3QgdGl0bGVEaXYgPSAoPEhUTUxFbGVtZW50PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waWNrbGlzdC11c2UtZW50ZXJlZC1oZWFkZXInKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XHJcbiAgICAgIHRpdGxlRGl2LmNsYXNzTGlzdC5hZGQoJ3BpY2tsaXN0LXVzZS1lbnRlcmVkLWhlYWRlcicpO1xyXG4gICAgICB0aXRsZURpdi5pbm5lclRleHQgPSAnT3IgdXNlIGFkZHJlc3MgZW50ZXJlZDonO1xyXG4gICAgICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xyXG5cclxuICAgICAgY29uc3QgaXRlbURpdiA9ICg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBpY2tsaXN0LXVzZS1lbnRlcmVkLW9wdGlvbicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuICAgICAgaXRlbURpdi5jbGFzc0xpc3QuYWRkKCdwaWNrbGlzdC11c2UtZW50ZXJlZC1vcHRpb24nKTtcclxuICAgICAgaXRlbURpdi5pbm5lclRleHQgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnJlcGxhY2UoLywrL2csICcsICcpO1xyXG4gICAgICBpdGVtRGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5jbGljayk7XHJcbiAgICAgIGNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChpdGVtRGl2KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gSWYgdGhlIHBpY2tsaXN0IGNvbnRhaW5lciBpcyBvdXQgb2YgYm91bmRzIHRvIHRoZSB0b3Agb3IgYm90dG9tLCB0aGVuIHNjcm9sbCBpdCBpbnRvIHZpZXdcclxuICAgIHRoaXMucGlja2xpc3Quc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCA9ICgpID0+IHtcclxuICAgICAgY29uc3Qgb3V0T2ZCb3VuZHNUb3AgPSB0aGlzLnBpY2tsaXN0LmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPCAwO1xyXG4gICAgICBjb25zdCBvdXRPZkJvdW5kc0JvdHRvbSA9IHRoaXMucGlja2xpc3QuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSA+IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcbiAgICAgIGlmIChvdXRPZkJvdW5kc1RvcCB8fCBvdXRPZkJvdW5kc0JvdHRvbSkge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QuY29udGFpbmVyLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZCA9IHtcclxuICAgICAgZWxlbWVudDogbnVsbCxcclxuICAgICAgLy8gQ3JlYXRlIGEgXCJ1c2UgYWRkcmVzcyBlbnRlcmVkXCIgb3B0aW9uXHJcbiAgICAgIGNyZWF0ZTogKGNvbmZpZGVuY2U6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XHJcbiAgICAgICAgICB0ZXh0OiBgJHtjb25maWRlbmNlfSAke3RoaXMub3B0aW9ucy51c2VBZGRyZXNzRW50ZXJlZFRleHR9YFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0LmNyZWF0ZUxpc3RJdGVtKGl0ZW0pO1xyXG4gICAgICAgIGxpc3RJdGVtLmNsYXNzTGlzdC5hZGQoJ3VzZS1hZGRyZXNzLWVudGVyZWQnKTtcclxuICAgICAgICBsaXN0SXRlbS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ0VudGVyIGFkZHJlc3MgbWFudWFsbHknKTtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QgPSB0aGlzLnBpY2tsaXN0Lmxpc3QgfHwgdGhpcy5waWNrbGlzdC5jcmVhdGVMaXN0KCk7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGxpc3RJdGVtLCB0aGlzLnBpY2tsaXN0LmNvbnRhaW5lci5maXJzdENoaWxkKTtcclxuICAgICAgICBsaXN0SXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja2xpc3QudXNlQWRkcmVzc0VudGVyZWQuY2xpY2spO1xyXG4gICAgICAgIHJldHVybiBsaXN0SXRlbTtcclxuICAgICAgfSxcclxuICAgICAgLy8gRGVzdHJveSB0aGUgXCJ1c2UgYWRkcmVzcyBlbnRlcmVkXCIgb3B0aW9uXHJcbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5lbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBpY2tsaXN0LnVzZUFkZHJlc3NFbnRlcmVkLmVsZW1lbnQpO1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC51c2VBZGRyZXNzRW50ZXJlZC5lbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgLy8gVXNlIHRoZSBhZGRyZXNzIGVudGVyZWQgYXMgdGhlIEZvcm1hdHRlZCBhZGRyZXNzXHJcbiAgICAgIGNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXREYXRhID0ge1xyXG4gICAgICAgICAgcmVzdWx0OiB7XHJcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6ICdObyBtYXRjaGVzJyxcclxuICAgICAgICAgICAgYWRkcmVzczoge1xyXG4gICAgICAgICAgICAgIGFkZHJlc3NfbGluZV8xOiAnJyxcclxuICAgICAgICAgICAgICBhZGRyZXNzX2xpbmVfMjogJycsXHJcbiAgICAgICAgICAgICAgYWRkcmVzc19saW5lXzM6ICcnLFxyXG4gICAgICAgICAgICAgIGxvY2FsaXR5OiAnJyxcclxuICAgICAgICAgICAgICByZWdpb246ICcnLFxyXG4gICAgICAgICAgICAgIHBvc3RhbF9jb2RlOiAnJyxcclxuICAgICAgICAgICAgICBjb3VudHJ5OiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNlYXJjaFRlcm0pIHtcclxuICAgICAgICAgIC8vIFRyeSBhbmQgc3BsaXQgaW50byBsaW5lcyBieSB1c2luZyBjb21tYSBkZWxpbWl0ZXJcclxuICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5jdXJyZW50U2VhcmNoVGVybS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgaWYgKGxpbmVzWzBdKSB7XHJcbiAgICAgICAgICAgIGlucHV0RGF0YS5yZXN1bHQuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMSA9IGxpbmVzWzBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxpbmVzWzFdKSB7XHJcbiAgICAgICAgICAgIGlucHV0RGF0YS5yZXN1bHQuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMiA9IGxpbmVzWzFdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGxpbmVzWzJdKSB7XHJcbiAgICAgICAgICAgIGlucHV0RGF0YS5yZXN1bHQuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMyA9IGxpbmVzWzJdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDM7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpbnB1dERhdGEucmVzdWx0LmFkZHJlc3MuYWRkcmVzc19saW5lXzMgKz0gbGluZXNbaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc3VsdC5zaG93KGlucHV0RGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZXN1bHQudXBkYXRlSGVhZGluZyh0aGlzLm9wdGlvbnMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5tYW51YWxIZWFkaW5nVGV4dCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGFuIGFkZHJlc3MgbGluZSBvYmplY3Qgd2l0aCB0aGUga2V5IGFzIHRoZSBsYWJlbFxyXG4gICAgICBmb3JtYXRNYW51YWxBZGRyZXNzTGluZTogZnVuY3Rpb24gKGxpbmVzLCBpKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gZGVmYXVsdHMuYWRkcmVzc0xpbmVMYWJlbHNbaV07XHJcbiAgICAgICAgY29uc3QgbGluZU9iamVjdCA9IHt9O1xyXG4gICAgICAgIGxpbmVPYmplY3Rba2V5XSA9IGxpbmVzW2ldIHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBsaW5lT2JqZWN0O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgcGlja2xpc3QgbGlzdCAoYW5kIGNvbnRhaW5lcikgYW5kIGluamVjdCBhZnRlciB0aGUgaW5wdXRcclxuICAgIHRoaXMucGlja2xpc3QuY3JlYXRlTGlzdCA9ICgpID0+IHtcclxuICAgICAgLy8gSWYgU2luZ2xlbGluZSBtb2RlIGlzIHVzZWQsIHRoZW4gYXBwZW5kIHRoZSBwaWNrbGlzdCBhZnRlciB0aGUgbGFzdCBpbnB1dCBmaWVsZCwgb3RoZXJ3aXNlIHVzZSB0aGUgZmlyc3Qgb25lXHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuU0lOR0xFTElORSA/IHRoaXMuaW5wdXRzLmxlbmd0aCAtIDEgOiAwO1xyXG5cclxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdhZGRyZXNzLXBpY2tsaXN0LWNvbnRhaW5lcicpO1xyXG4gICAgICB0aGlzLnBpY2tsaXN0LmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuXHJcbiAgICAgIC8vIEluc2VydCB0aGUgcGlja2xpc3QgY29udGFpbmVyIGFmdGVyIHRoZSBpbnB1dFxyXG4gICAgICB0aGlzLmlucHV0c1twb3NpdGlvbl0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5waWNrbGlzdC5jb250YWluZXIsIHRoaXMuaW5wdXRzW3Bvc2l0aW9uXS5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG5cclxuICAgICAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBsaXN0LmNsYXNzTGlzdC5hZGQoJ2FkZHJlc3MtcGlja2xpc3QnKTtcclxuICAgICAgLy8gQXBwZW5kIHRoZSBwaWNrbGlzdCB0byB0aGUgaW5uZXIgd3JhcHBlclxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmNvbnRhaW5lci5hcHBlbmRDaGlsZChsaXN0KTtcclxuXHJcbiAgICAgIC8vIEFkZCBhIGNsYXNzIHRvIHRoZSBpbnB1dCB0byBkZW5vdGUgdGhhdCBhIHBpY2tsaXN0IHdpdGggc3VnZ2VzdGlvbnMgaXMgYmVpbmcgc2hvd25cclxuICAgICAgdGhpcy5pbnB1dHNbcG9zaXRpb25dLmNsYXNzTGlzdC5hZGQoJ3Nob3dpbmctc3VnZ2VzdGlvbnMnKTtcclxuXHJcbiAgICAgIGxpc3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGlja2xpc3QuY2hlY2tFbnRlcik7XHJcbiAgICAgIHJldHVybiBsaXN0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBuZXcgcGlja2xpc3QgaXRlbS9yb3dcclxuICAgIHRoaXMucGlja2xpc3QuY3JlYXRlTGlzdEl0ZW0gPSAoaXRlbTogUGlja2xpc3RJdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICByb3cuaW5uZXJIVE1MID0gdGhpcy5waWNrbGlzdC5hZGRNYXRjaGluZ0VtcGhhc2lzKGl0ZW0pO1xyXG5cclxuICAgICAgLy8gU3RvcmUgdGhlIEZvcm1hdCBVUkwgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgdXNlIHRoZSBnbG9iYWxfYWRkcmVzc19rZXkgYXMgYSBcInJlZmluZW1lbnRcIiBwcm9wZXJ0eVxyXG4gICAgICBpZiAoaXRlbS5mb3JtYXQpIHtcclxuICAgICAgICByb3cuc2V0QXR0cmlidXRlKCdmb3JtYXQnLCBpdGVtLmZvcm1hdCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5nbG9iYWxfYWRkcmVzc19rZXkpIHtcclxuICAgICAgICByb3cuc2V0QXR0cmlidXRlKCdyZWZpbmUnLCBpdGVtLmdsb2JhbF9hZGRyZXNzX2tleSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJvdztcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBpY2tsaXN0IGl0ZW0vcm93IGZvciB3aGF0M3dvcmRzXHJcbiAgICB0aGlzLnBpY2tsaXN0LmNyZWF0ZVdoYXQzV29yZHNMaXN0SXRlbSA9IChpdGVtOiBXaGF0M1dvcmRzUGlja0xpc3QpID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgIHJvdy5jbGFzc05hbWUgPSB0aGlzLndoYXQzV29yZHNLZXl3b3JkO1xyXG4gICAgICBuYW1lLmNsYXNzTmFtZSA9ICd3aGF0M1dvcmRzLW5hbWUnO1xyXG4gICAgICBkZXNjcmlwdGlvbi5jbGFzc05hbWUgPSAnd2hhdDNXb3Jkcy1kZXNjcmlwdGlvbic7XHJcblxyXG4gICAgICBuYW1lLmlubmVySFRNTCA9ICcvLy8nICsgaXRlbS53aGF0M3dvcmRzLm5hbWU7XHJcbiAgICAgIGRlc2NyaXB0aW9uLmlubmVySFRNTCA9IGl0ZW0ud2hhdDN3b3Jkcy5kZXNjcmlwdGlvbjtcclxuXHJcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChuYW1lKTtcclxuICAgICAgcm93LmFwcGVuZENoaWxkKGRlc2NyaXB0aW9uKTtcclxuXHJcbiAgICAgIHJldHVybiByb3c7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvLyBDcmVhdGUgYSBuZXcgcGlja2xpc3QgaXRlbS9yb3cgZm9yIGxvb2t1cCBpdGVtc1xyXG4gICAgdGhpcy5waWNrbGlzdC5jcmVhdGVMb29rdXBMaXN0SXRlbSA9IChpdGVtOiBMb29rdXBBZGRyZXNzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgcm93LmlubmVySFRNTCA9IGl0ZW0udGV4dDtcclxuXHJcbiAgICAgIC8vIFN0b3JlIHRoZSBGb3JtYXQgVVJMIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHVzZSB0aGUgZ2xvYmFsX2FkZHJlc3Nfa2V5IGFzIGEgXCJyZWZpbmVtZW50XCIgcHJvcGVydHlcclxuICAgICAgaWYgKGl0ZW0uZm9ybWF0KSB7XHJcbiAgICAgICAgcm93LnNldEF0dHJpYnV0ZSgnZm9ybWF0JywgaXRlbS5mb3JtYXQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2xvYmFsX2FkZHJlc3Nfa2V5KSB7XHJcbiAgICAgICAgcm93LnNldEF0dHJpYnV0ZSgncmVmaW5lJywgaXRlbS5nbG9iYWxfYWRkcmVzc19rZXkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByb3c7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucGlja2xpc3QucmVmaW5lID0ge1xyXG4gICAgICBlbGVtZW50OiBudWxsLFxyXG4gICAgICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBpY2tsaXN0IG5lZWRzIHJlZmluaW5nLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgYW4gaXRlbSBoYXMgYmVlbiBcInN0ZXBwZWQgaW50b1wiIGJ1dCBoYXMgYW4gdW5yZXNvbHZhYmxlIHJhbmdlLlxyXG4gICAgICAvLyBUaGUgdXNlciBpcyBwcm9tcHRlZCB0byBlbnRlciB0aGVpciBzZWxlY3Rpb24gKGUuZy4gYnVpbGRpbmcgbnVtYmVyKS5cclxuICAgICAgaXNOZWVkZWQ6IChyZXNwb25zZTogU2VhcmNoUmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hUeXBlICE9PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuQVVUT0NPTVBMRVRFICYmIChyZXNwb25zZS5yZXN1bHQuY29uZmlkZW5jZSA9PT0gJ1ByZW1pc2VzIHBhcnRpYWwnIHx8IHJlc3BvbnNlLnJlc3VsdC5jb25maWRlbmNlID09PSAnU3RyZWV0IHBhcnRpYWwnIHx8IHJlc3BvbnNlLnJlc3VsdC5jb25maWRlbmNlID09PSAnTXVsdGlwbGUgbWF0Y2hlcycpO1xyXG4gICAgICB9LFxyXG4gICAgICBjcmVhdGVJbnB1dDogKHByb21wdDogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waWNrbGlzdC1yZWZpbmVtZW50LWJveCcpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHJvdy5jbGFzc0xpc3QuYWRkKCdwaWNrbGlzdC1yZWZpbmVtZW50LWJveCcpO1xyXG5cclxuICAgICAgICBjb25zdCBpbnB1dCA9ICg8SFRNTElucHV0RWxlbWVudD5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGlja2xpc3QtcmVmaW5lbWVudC1ib3ggaW5wdXQnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpKTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBwcm9tcHQpO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgna2V5Jywga2V5KTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICduZXctcGFzc3dvcmQnKTtcclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5waWNrbGlzdC5yZWZpbmUuZW50ZXIuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5yZWZpbmUuZWxlbWVudCA9IGlucHV0O1xyXG5cclxuICAgICAgICBjb25zdCBidXR0b24gPSAoPEhUTUxCdXR0b25FbGVtZW50PmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5waWNrbGlzdC1yZWZpbmVtZW50LWJveCBidXR0b24nKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKSk7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9ICdSZWZpbmUnO1xyXG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja2xpc3QucmVmaW5lLmVudGVyKTtcclxuXHJcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocm93LCB0aGlzLnBpY2tsaXN0Lmxpc3QpO1xyXG5cclxuICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlbnRlcjogKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIEFsbG93IGEgbmV3IHJlZmluZW1lbnQgZW50cnkgaWYgdGhlIGVudGVyIGtleSB3YXMgdXNlZCBpbnNpZGUgdGhlIHRleHRib3ggb3IgdGhlIGJ1dHRvbiB3YXMgY2xpY2tlZFxyXG4gICAgICAgIGlmICgoZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2ZW50LmtleSA9PT0gJ0VudGVyJykgfHwgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgIC8vIElmIGEgcGlja2xpc3QgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHRoZW4gcG90ZW50aWFsbHkgdXNlIHRoaXMgaW5zdGVhZCBvZiB3aGF0J3MgaW4gdGhlIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICBpZiAodGhpcy5waWNrbGlzdC5jdXJyZW50SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLnBpY2tsaXN0LmNoZWNrRW50ZXIoZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAvLyBUYWtlIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBmaWVsZCBhbmQgdXNlIHRoaXMgdG8gZnVydGhlciByZWZpbmUgdGhlIGFkZHJlc3NcclxuICAgICAgICAgIGlmICh0aGlzLnBpY2tsaXN0LnJlZmluZS5lbGVtZW50LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IHJlZmluZW1lbnQ6IHRoaXMucGlja2xpc3QucmVmaW5lLmVsZW1lbnQudmFsdWUgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMucGlja2xpc3QucmVmaW5lLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdrZXknKTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LnNlbmQoYCR7dGhpcy5iYXNlVXJsfSR7dGhpcy5yZWZpbmVFbmRwb2ludH0vJHtrZXl9YCwgJ1BPU1QnLCB0aGlzLnJlc3VsdC5oYW5kbGVWYWxpZGF0ZVJlc3BvbnNlLCBkYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2xpc3Quc2l6ZSAmJiBldmVudCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHwgZXZlbnQua2V5ID09PSAnRW50ZXInKSkge1xyXG4gICAgICAgICAgdGhpcy5waWNrbGlzdC5rZXl1cChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucGlja2xpc3QucmVzZXRUYWJDb3VudCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5waWNrbGlzdC50YWJDb3VudCA9IC0xO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uXHJcbiAgICB0aGlzLnBpY2tsaXN0LmtleXVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5waWNrbGlzdC5saXN0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnBpY2tsaXN0LmNoZWNrRW50ZXIoZXZlbnQpO1xyXG5cclxuICAgICAgLy8gR2V0IGEgbGlzdCBvZiBhbGwgdGhlIGFkZHJlc3NlcyBpbiB0aGUgcGlja2xpc3RcclxuICAgICAgY29uc3QgYWRkcmVzc2VzID0gdGhpcy5waWNrbGlzdC5saXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpO1xyXG4gICAgICBsZXQgZmlyc3RBZGRyZXNzO1xyXG4gICAgICBsZXQgbGFzdEFkZHJlc3M7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgcGlja2xpc3QgaXMgZW1wdHksIGp1c3QgcmV0dXJuXHJcbiAgICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTZXQgdGhlIHRhYkNvdW50IGJhc2VkIG9uIHByZXZpb3VzIGFuZCBkaXJlY3Rpb25cclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC50YWJDb3VudC0tO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LnRhYkNvdW50Kys7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNldCB0b3AgYW5kIGJvdHRvbSBwb3NpdGlvbnMgYW5kIGVuYWJsZSB3cmFwLWFyb3VuZFxyXG4gICAgICBpZiAodGhpcy5waWNrbGlzdC50YWJDb3VudCA8IDApIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LnRhYkNvdW50ID0gYWRkcmVzc2VzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgbGFzdEFkZHJlc3MgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnBpY2tsaXN0LnRhYkNvdW50ID4gYWRkcmVzc2VzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0LnRhYkNvdW50ID0gMDtcclxuICAgICAgICBmaXJzdEFkZHJlc3MgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBIaWdobGlnaHQgdGhlIHNlbGVjdGVkIGFkZHJlc3NcclxuICAgICAgY29uc3QgY3VycmVudGx5SGlnaGxpZ2h0ZWQgPSBhZGRyZXNzZXNbdGhpcy5waWNrbGlzdC50YWJDb3VudF07XHJcbiAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBoaWdobGlnaHRlZCBvbmVzXHJcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlIaWdobGlnaHRlZCA9IHRoaXMucGlja2xpc3QubGlzdC5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0ZWQnKTtcclxuICAgICAgaWYgKHByZXZpb3VzbHlIaWdobGlnaHRlZCkge1xyXG4gICAgICAgIHByZXZpb3VzbHlIaWdobGlnaHRlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnRseUhpZ2hsaWdodGVkLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcbiAgICAgIC8vIFNldCB0aGUgY3VycmVudEl0ZW0gb24gdGhlIHBpY2tsaXN0IHRvIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgYWRkcmVzc1xyXG4gICAgICB0aGlzLnBpY2tsaXN0LmN1cnJlbnRJdGVtID0gY3VycmVudGx5SGlnaGxpZ2h0ZWQ7XHJcblxyXG4gICAgICAvLyBTY3JvbGwgYWRkcmVzcyBpbnRvIHZpZXcsIGlmIHJlcXVpcmVkXHJcbiAgICAgIGNvbnN0IGFkZHJlc3NMaXN0Q29vcmRzID0ge1xyXG4gICAgICAgIHRvcDogdGhpcy5waWNrbGlzdC5saXN0Lm9mZnNldFRvcCxcclxuICAgICAgICBib3R0b206IHRoaXMucGlja2xpc3QubGlzdC5vZmZzZXRUb3AgKyB0aGlzLnBpY2tsaXN0Lmxpc3Qub2Zmc2V0SGVpZ2h0LFxyXG4gICAgICAgIHNjcm9sbFRvcDogdGhpcy5waWNrbGlzdC5saXN0LnNjcm9sbFRvcCxcclxuICAgICAgICBzZWxlY3RlZFRvcDogY3VycmVudGx5SGlnaGxpZ2h0ZWQub2Zmc2V0VG9wLFxyXG4gICAgICAgIHNlbGVjdGVkQm90dG9tOiBjdXJyZW50bHlIaWdobGlnaHRlZC5vZmZzZXRUb3AgKyBjdXJyZW50bHlIaWdobGlnaHRlZC5vZmZzZXRIZWlnaHQsXHJcbiAgICAgICAgc2Nyb2xsQW1vdW50OiBjdXJyZW50bHlIaWdobGlnaHRlZC5vZmZzZXRIZWlnaHRcclxuICAgICAgfTtcclxuICAgICAgaWYgKGZpcnN0QWRkcmVzcykge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGxhc3RBZGRyZXNzKSB7XHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5saXN0LnNjcm9sbFRvcCA9IDk5OTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhZGRyZXNzTGlzdENvb3Jkcy5zZWxlY3RlZEJvdHRvbSArIGFkZHJlc3NMaXN0Q29vcmRzLnNjcm9sbEFtb3VudCA+IGFkZHJlc3NMaXN0Q29vcmRzLmJvdHRvbSkge1xyXG4gICAgICAgIHRoaXMucGlja2xpc3QubGlzdC5zY3JvbGxUb3AgPSBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxUb3AgKyBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxBbW91bnQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYWRkcmVzc0xpc3RDb29yZHMuc2VsZWN0ZWRUb3AgLSBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxBbW91bnQgLSBhZGRyZXNzTGlzdENvb3Jkcy50b3AgPCBhZGRyZXNzTGlzdENvb3Jkcy5zY3JvbGxUb3ApIHtcclxuICAgICAgICB0aGlzLnBpY2tsaXN0Lmxpc3Quc2Nyb2xsVG9wID0gYWRkcmVzc0xpc3RDb29yZHMuc2Nyb2xsVG9wIC0gYWRkcmVzc0xpc3RDb29yZHMuc2Nyb2xsQW1vdW50O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCBlbXBoYXNpcyB0byB0aGUgcGlja2xpc3QgaXRlbXMgaGlnaGxpZ2h0aW5nIHRoZSBtYXRjaFxyXG4gICAgdGhpcy5waWNrbGlzdC5hZGRNYXRjaGluZ0VtcGhhc2lzID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgY29uc3QgaGlnaGxpZ2h0cyA9IGl0ZW0ubWF0Y2hlZCB8fCBbXTtcclxuICAgICAgbGV0IGxhYmVsID0gaXRlbS50ZXh0O1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZ2hsaWdodHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9ICc8Yj4nICsgbGFiZWwuc3Vic3RyaW5nKGhpZ2hsaWdodHNbaV1bMF0sIGhpZ2hsaWdodHNbaV1bMV0pICsgJzwvYj4nO1xyXG4gICAgICAgIGxhYmVsID0gbGFiZWwuc3Vic3RyaW5nKDAsIGhpZ2hsaWdodHNbaV1bMF0pICsgcmVwbGFjZW1lbnQgKyBsYWJlbC5zdWJzdHJpbmcoaGlnaGxpZ2h0c1tpXVsxXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gTGlzdGVuIHRvIGEgcGlja2xpc3Qgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnBpY2tsaXN0Lmxpc3RlbiA9IChyb3cpID0+IHtcclxuICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrbGlzdC5waWNrLmJpbmQobnVsbCwgcm93KSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucGlja2xpc3QuY2hlY2tFbnRlciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcclxuICAgICAgICBsZXQgcGlja2xpc3RJdGVtO1xyXG4gICAgICAgIC8vIElmIHBpY2tsaXN0IGNvbnRhaW5zIDEgYWRkcmVzcyB0aGVuIHVzZSB0aGlzIG9uZSB0byBmb3JtYXRcclxuICAgICAgICBpZiAodGhpcy5waWNrbGlzdC5zaXplID09PSAxKSB7XHJcbiAgICAgICAgICBwaWNrbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0Lmxpc3QucXVlcnlTZWxlY3RvckFsbCgnZGl2JylbMF07XHJcbiAgICAgICAgfSAvLyBFbHNlIHVzZSB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIG9uZSB3aGVuIG5hdmlnYXRpb24gdXNpbmcga2V5Ym9hcmRcclxuICAgICAgICBlbHNlIGlmICh0aGlzLnBpY2tsaXN0LmN1cnJlbnRJdGVtKSB7XHJcbiAgICAgICAgICBwaWNrbGlzdEl0ZW0gPSB0aGlzLnBpY2tsaXN0LmN1cnJlbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGlja2xpc3RJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLnBpY2tsaXN0LnBpY2socGlja2xpc3RJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gSG93IHRvIGhhbmRsZSBhIHBpY2tsaXN0IHNlbGVjdGlvblxyXG4gICAgdGhpcy5waWNrbGlzdC5waWNrID0gKGl0ZW0pID0+IHtcclxuICAgICAgLy8gRmlyZSBhbiBldmVudCB3aGVuIGFuIGFkZHJlc3MgaXMgcGlja2VkXHJcbiAgICAgIHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3Bvc3QtcGlja2xpc3Qtc2VsZWN0aW9uJywgaXRlbSk7XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGl0ZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaXNXaGF0M1dvcmRzKSB7XHJcbiAgICAgICAgdGhpcy5sb29rdXAoZWxlbWVudHNbMF0uaW5uZXJIVE1MKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBHZXQgYSBmaW5hbCBhZGRyZXNzIHVzaW5nIHBpY2tsaXN0IGl0ZW0gdW5sZXNzIGl0IG5lZWRzIHJlZmluZW1lbnRcclxuICAgICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ2Zvcm1hdCcpKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1hdChpdGVtLmdldEF0dHJpYnV0ZSgnZm9ybWF0JykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlZmluZShpdGVtLmdldEF0dHJpYnV0ZSgncmVmaW5lJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9ybWF0KHVybDogc3RyaW5nKSB7XHJcbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtZm9ybWF0dGluZy1zZWFyY2gnLCB1cmwpO1xyXG5cclxuICAgIC8vIEhpZGUgdGhlIHNlYXJjaGluZyBzcGlubmVyXHJcbiAgICB0aGlzLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgIC8vIEluaXRpYXRlIGEgbmV3IEZvcm1hdCByZXF1ZXN0XHJcbiAgICB0aGlzLnJlcXVlc3Quc2VuZCh1cmwsICdHRVQnLCB0aGlzLnJlc3VsdC5zaG93LCB1bmRlZmluZWQsIFt7IGtleTogJ0FkZC1NZXRhZGF0YScsIHZhbHVlOiB0cnVlIH0vKiwge2tleTogJ0FkZC1Db21wb25lbnRzJywgdmFsdWU6IHRydWV9Ki9dKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmaW5lKGtleTogc3RyaW5nKSB7XHJcbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtcmVmaW5lbWVudCcsIGtleSk7XHJcblxyXG4gICAgLy8gSGlkZSB0aGUgc2VhcmNoaW5nIHNwaW5uZXJcclxuICAgIHRoaXMuc2VhcmNoU3Bpbm5lci5oaWRlKCk7XHJcblxyXG4gICAgLy8gSW5pdGlhdGUgYSBuZXcgU3RlcC1pbiByZXF1ZXN0IHVzaW5nIHRoZSBnbG9iYWwgYWRkcmVzcyBrZXlcclxuICAgIHRoaXMucmVxdWVzdC5zZW5kKGAke3RoaXMuYmFzZVVybH0ke3RoaXMuc3RlcEluRW5kcG9pbnR9LyR7a2V5fWAsICdHRVQnLCB0aGlzLnBpY2tsaXN0LnNob3cpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgbG9va3VwKGtleTogc3RyaW5nKSB7XHJcbiAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50XHJcbiAgICB0aGlzLmV2ZW50cy50cmlnZ2VyKCdwcmUtbG9va3VwJywga2V5KTtcclxuXHJcbiAgICAvLyBIaWRlIHRoZSBzZWFyY2hpbmcgc3Bpbm5lclxyXG4gICAgdGhpcy5zZWFyY2hTcGlubmVyLmhpZGUoKTtcclxuXHJcbiAgICAvL0dldCB0aGUgbG9va3VwIHJlcXVldFxyXG4gICAgY29uc3QgbG9va3VwVjJSZXF1ZXN0ID0gdGhpcy5nZW5lcmF0ZUxvb2t1cERhdGFGb3JBcGlDYWxsKGtleSwgZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIHRoaXMubG9va3VwRW5kcG9pbnQ7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gW3sga2V5OiAnQWRkLUFkZHJlc3NlcycsIHZhbHVlOiB0cnVlIH1dO1xyXG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnBpY2tsaXN0LnNob3dMb29rdXA7XHJcblxyXG4gICAgLy8gSW5pdGlhdGUgbmV3IFNlYXJjaCByZXF1ZXN0XHJcbiAgICB0aGlzLnJlcXVlc3Quc2VuZCh1cmwsICdQT1NUJywgY2FsbGJhY2ssIGxvb2t1cFYyUmVxdWVzdCwgaGVhZGVycyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc3VsdDogQWRkcmVzc1ZhbGlkYXRpb25SZXN1bHQgPSB7XHJcbiAgICBmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyOiBudWxsLFxyXG4gICAgbGFzdEFkZHJlc3NGaWVsZDogbnVsbCxcclxuICAgIGdlbmVyYXRlQWRkcmVzc0xpbmVSZXF1aXJlZDogZmFsc2UsXHJcbiAgICAvLyBSZW5kZXIgYSBGb3JtYXR0ZWQgYWRkcmVzc1xyXG4gICAgc2hvdzogKGRhdGE6IFNlYXJjaFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIC8vIEhpZGUgdGhlIGlubGluZSBzZWFyY2ggc3Bpbm5lclxyXG4gICAgICB0aGlzLnNlYXJjaFNwaW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgLy8gSGlkZSB0aGUgcGlja2xpc3RcclxuICAgICAgdGhpcy5waWNrbGlzdC5oaWRlKCk7XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgc2VhcmNoIHRlcm1cclxuICAgICAgdGhpcy5sYXN0U2VhcmNoVGVybSA9ICcnO1xyXG5cclxuICAgICAgLy8gQWxsb3cgQXV0b2NvbXBsZXRlIHRocm91Z2ggYXMgaXQgd2lsbCBuZWVkIHRvIGNyZWF0ZSB0aGUgYWRkaXRpb25hbCBvdXRwdXQgZmllbGRzIGZvciB0aGUgZmluYWwgYWRkcmVzcy5cclxuICAgICAgLy8gT3RoZXJ3aXNlLCBvbmx5IHJlbmRlciB0aGUgZmluYWwgYWRkcmVzcyBpZiB0aGVyZSBhcmUgcmVzdWx0cyBhdmFpbGFibGUuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5BVVRPQ09NUExFVEUgfHwgKGRhdGEucmVzdWx0LmFkZHJlc3MgJiYgZGF0YS5yZXN1bHQuY29uZmlkZW5jZSAhPT0gJ05vIG1hdGNoZXMnKSkge1xyXG5cclxuICAgICAgICAvLyBDbGVhciBzZWFyY2ggaW5wdXQocylcclxuICAgICAgICB0aGlzLmlucHV0cy5mb3JFYWNoKGlucHV0ID0+IGlucHV0LnZhbHVlID0gJycpO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgaWYgd2UgbmVlZGVkIHRvIGdlbmVyYXRlIHRoZSBmb3JtYXR0ZWQgYWRkcmVzcyBpbnB1dCBmaWVsZHMgbGF0ZXJcclxuICAgICAgICB0aGlzLnJlc3VsdC5jYWxjdWxhdGVJZkFkZHJlc3NMaW5lR2VuZXJhdGlvblJlcXVpcmVkKCk7XHJcblxyXG4gICAgICAgIC8vIEdldCBmb3JtYXR0ZWQgYWRkcmVzcyBjb250YWluZXIgZWxlbWVudFxyXG4gICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgY29udGFpbmVyIGlmIHdlJ3JlIGNyZWF0aW5nIGlucHV0cy4gT3RoZXJ3aXNlIHRoZSB1c2VyIHdpbGwgaGF2ZSB0aGVpciBvd24gY29udGFpbmVyLlxyXG4gICAgICAgIHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIgPSB0aGlzLm9wdGlvbnMuZWxlbWVudHMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcjtcclxuICAgICAgICBpZiAoIXRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIgJiYgdGhpcy5yZXN1bHQuZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdC5jcmVhdGVGb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBMb29wIG92ZXIgZWFjaCBmb3JtYXR0ZWQgYWRkcmVzcyBjb21wb25lbnRcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE9iamVjdC5rZXlzKGRhdGEucmVzdWx0LmFkZHJlc3MpLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhkYXRhLnJlc3VsdC5hZGRyZXNzKVtpXTtcclxuICAgICAgICAgIGNvbnN0IGFkZHJlc3NDb21wb25lbnQgPSBkYXRhLnJlc3VsdC5hZGRyZXNzW2tleV07XHJcbiAgICAgICAgICAvLyBCaW5kIHRoZSBhZGRyZXNzIGVsZW1lbnQgdG8gdGhlIHVzZXIncyBhZGRyZXNzIGZpZWxkIChvciBjcmVhdGUgYSBuZXcgb25lKVxyXG4gICAgICAgICAgdGhpcy5yZXN1bHQudXBkYXRlQWRkcmVzc0xpbmUoa2V5LCBhZGRyZXNzQ29tcG9uZW50LCAnYWRkcmVzcy1saW5lLWlucHV0Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBIaWRlIGNvdW50cnkgYW5kIGFkZHJlc3Mgc2VhcmNoIGZpZWxkcyAoaWYgdGhleSBoYXZlIGEgJ3RvZ2dsZScgY2xhc3MpXHJcbiAgICAgICAgdGhpcy50b2dnbGVTZWFyY2hJbnB1dHMoJ2hpZGUnKTtcclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHVzZXJzIHRvIHNlYXJjaCBhZ2FpbiBzdWJzZXF1ZW50bHlcclxuICAgICAgICB0aGlzLmhhc1NlYXJjaElucHV0QmVlblJlc2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSWYgYW4gYWRkcmVzcyBsaW5lIGlzIGFsc28gdGhlIG1haW4gc2VhcmNoIGlucHV0LCBzZXQgcHJvcGVydHkgdG8gZmFsc2UuXHJcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdHlwaW5nIGluIHRoZSBmaWVsZCBhZ2FpbiAoYWZ0ZXIgYW4gYWRkcmVzcyBoYXMgYmVlblxyXG4gICAgICAgIC8vIHJldHVybmVkKSB3aWxsIG5vdCB0cmlnZ2VyIGEgbmV3IHNlYXJjaC5cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUeXBlID09PSBBZGRyZXNzVmFsaWRhdGlvbk1vZGUuQVVUT0NPTVBMRVRFKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgaW4gdGhpcy5vcHRpb25zLmVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vcHRpb25zLmVsZW1lbnRzLCBlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIC8vIEV4Y2x1ZGluZyB0aGUgaW5wdXQgaXRzZWxmLCBkb2VzIGFub3RoZXIgZWxlbWVudCBtYXRjaCB0aGUgaW5wdXQgZmllbGQ/XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09ICdpbnB1dCcgJiYgdGhpcy5vcHRpb25zLmVsZW1lbnRzW2VsZW1lbnRdID09PSB0aGlzLmlucHV0c1swXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTZWFyY2hJbnB1dEJlZW5SZXNldCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlICdTZWFyY2ggYWdhaW4nIGxpbmsgYW5kIGluc2VydCBpbnRvIERPTVxyXG4gICAgICAgIHRoaXMucmVzdWx0LmNyZWF0ZVNlYXJjaEFnYWluTGluaygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGaXJlIGFuIGV2ZW50IHRvIHNheSB3ZSd2ZSBnb3QgdGhlIGZvcm1hdHRlZCBhZGRyZXNzXHJcbiAgICAgIHRoaXMuZXZlbnRzLnRyaWdnZXIoJ3Bvc3QtZm9ybWF0dGluZy1zZWFyY2gnLCBkYXRhKTtcclxuICAgIH0sXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgIC8vIERlbGV0ZSB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgY29udGFpbmVyXHJcbiAgICAgIGlmICh0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyKSB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMucmVzdWx0LmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRGVsZXRlIHRoZSBzZWFyY2ggYWdhaW4gbGlua1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNlYXJjaEFnYWluLmxpbmspIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VhcmNoQWdhaW4ubGluay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMub3B0aW9ucy5zZWFyY2hBZ2Fpbi5saW5rKTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VhcmNoQWdhaW4ubGluayA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICAvLyBSZW1vdmUgcHJldmlvdXMgdmFsdWUgZnJvbSB1c2VyJ3MgcmVzdWx0IGZpZWxkXHJcbiAgICAgIC8vIExvb3Agb3ZlciB0aGVpciBlbGVtZW50c1xyXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgaW4gdGhpcy5vcHRpb25zLmVsZW1lbnRzKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9wdGlvbnMuZWxlbWVudHMsIGVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAvLyBJZiBpdCBtYXRjaGVzIGFuIFwiYWRkcmVzc1wiIGVsZW1lbnRcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVmYXVsdHMuYWRkcmVzc0xpbmVMYWJlbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBkZWZhdWx0cy5hZGRyZXNzTGluZUxhYmVsc1tpXTtcclxuICAgICAgICAgICAgLy8gT25seSByZXNldCB0aGUgdmFsdWUgaWYgaXQncyBub3QgYW4gaW5wdXQgZmllbGRcclxuICAgICAgICAgICAgaWYgKGxhYmVsID09PSBlbGVtZW50ICYmIHRoaXMub3B0aW9ucy5lbGVtZW50c1tlbGVtZW50XSAhPT0gdGhpcy5pbnB1dHNbMF0pIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZWxlbWVudHNbZWxlbWVudF0udmFsdWUgPSAnJztcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGNyZWF0ZUFkZHJlc3NMaW5lOiB7XHJcbiAgICAgIC8vIENyZWF0ZSBhbiBpbnB1dCB0byBzdG9yZSB0aGUgYWRkcmVzcyBsaW5lXHJcbiAgICAgIGlucHV0OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgd3JhcHBlclxyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbGFiZWxcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICAgICAgbGFiZWwuaW5uZXJIVE1MID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgJyAkMScpIC8vIEFkZCBzcGFjZSBiZWZvcmUgY2FwaXRhbCBMZXR0ZXJzXHJcbiAgICAgICAgICAucmVwbGFjZSgvKFswLTldKS9nLCAnICQxJykgLy8gQWRkIHNwYWNlIGJlZm9yZSBudW1iZXJzXHJcbiAgICAgICAgICAucmVwbGFjZSgvXi4vLCBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBzdHIudG9VcHBlckNhc2UoKTsgfSk7IC8vIE1ha2UgZmlyc3QgbGV0dGVyIG9mIHdvcmQgYSBjYXBpdGFsIGxldHRlclxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXRcclxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQnKTtcclxuICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBrZXkpO1xyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICByZXR1cm4gZGl2O1xyXG4gICAgICB9LFxyXG4gICAgICAvLyBDcmVhdGUgdGhlIGFkZHJlc3MgbGluZSBsYWJlbCBiYXNlZCBvbiB0aGUgY291bnRyeSBhbmQgbGFuZ3VhZ2VcclxuICAgICAgbGFiZWw6IChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBsYWJlbCA9IGtleTtcclxuICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmN1cnJlbnRDb3VudHJ5Q29kZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICh0cmFuc2xhdGlvbnMpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRMYWJlbCA9IHRyYW5zbGF0aW9uc1tsYW5ndWFnZV1bY291bnRyeV1ba2V5XTtcclxuICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZWRMYWJlbCkge1xyXG4gICAgICAgICAgICAgIGxhYmVsID0gdHJhbnNsYXRlZExhYmVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFRyYW5zbGF0aW9uIGRvZXNuJ3QgZXhpc3QgZm9yIGtleVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvLyBDcmVhdGUgdGhlIGZvcm1hdHRlZCBhZGRyZXNzIGNvbnRhaW5lciBhbmQgaW5qZWN0IGFmdGVyIHRoZSBpbnB1dFxyXG4gICAgY3JlYXRlRm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcjogKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2Zvcm1hdHRlZC1hZGRyZXNzJyk7XHJcblxyXG4gICAgICAvLyBJZiBTaW5nbGVsaW5lIG1vZGUgaXMgdXNlZCwgdGhlbiBhcHBlbmQgdGhlIGZvcm1hdHRlZCBhZGRyZXNzIGFmdGVyIHRoZSBsYXN0IGlucHV0IGZpZWxkLCBvdGhlcndpc2UgdXNlIHRoZSBmaXJzdCBvbmVcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnNlYXJjaFR5cGUgPT09IEFkZHJlc3NWYWxpZGF0aW9uTW9kZS5TSU5HTEVMSU5FID8gdGhpcy5pbnB1dHMubGVuZ3RoIC0gMSA6IDA7XHJcblxyXG4gICAgICAvLyBJbnNlcnQgdGhlIGNvbnRhaW5lciBhZnRlciB0aGUgaW5wdXRcclxuICAgICAgdGhpcy5pbnB1dHNbcG9zaXRpb25dLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgdGhpcy5pbnB1dHNbcG9zaXRpb25dLm5leHRTaWJsaW5nKTtcclxuICAgICAgdGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIH0sXHJcbiAgICAvLyBDcmVhdGUgYSBoZWFkaW5nIGZvciB0aGUgZm9ybWF0dGVkIGFkZHJlc3MgY29udGFpbmVyXHJcbiAgICBjcmVhdGVIZWFkaW5nOiAoKSA9PiB7XHJcbiAgICAgIC8vIENyZWF0ZSBhIGhlYWRpbmcgZm9yIHRoZSBmb3JtYXR0ZWQgYWRkcmVzc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuc2hvd0hlYWRpbmcpIHtcclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLm9wdGlvbnMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5oZWFkaW5nVHlwZSk7XHJcbiAgICAgICAgaGVhZGluZy5pbm5lckhUTUwgPSB0aGlzLm9wdGlvbnMuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci52YWxpZGF0ZWRIZWFkaW5nVGV4dDtcclxuICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmFwcGVuZENoaWxkKGhlYWRpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLy8gVXBkYXRlIHRoZSBoZWFkaW5nIHRleHQgaW4gdGhlIGZvcm1hdHRlZCBhZGRyZXNzIGNvbnRhaW5lclxyXG4gICAgdXBkYXRlSGVhZGluZzogKHRleHQpID0+IHtcclxuICAgICAgLy9DaGFuZ2UgdGhlIGhlYWRpbmcgdGV4dCB0byBcIk1hbnVhbCBhZGRyZXNzIGVudGVyZWRcIlxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdHRlZEFkZHJlc3NDb250YWluZXIuc2hvd0hlYWRpbmcpIHtcclxuICAgICAgICBjb25zdCBoZWFkaW5nID0gdGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKHRoaXMub3B0aW9ucy5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmhlYWRpbmdUeXBlKTtcclxuICAgICAgICBoZWFkaW5nLmlubmVySFRNTCA9IHRleHQ7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjYWxjdWxhdGVJZkFkZHJlc3NMaW5lR2VuZXJhdGlvblJlcXVpcmVkOiAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzdWx0LmdlbmVyYXRlQWRkcmVzc0xpbmVSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVmYXVsdHMuYWRkcmVzc0xpbmVMYWJlbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBkZWZhdWx0cy5hZGRyZXNzTGluZUxhYmVsc1tpXTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVsZW1lbnRzW2tleV0pIHtcclxuICAgICAgICAgIHRoaXMucmVzdWx0LmdlbmVyYXRlQWRkcmVzc0xpbmVSZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlQWRkcmVzc0xpbmU6IChrZXk6IHN0cmluZywgYWRkcmVzc0xpbmVPYmplY3QsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIC8vIEVpdGhlciBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgdXNlcidzIGFkZHJlc3MgZmllbGQgb3IgY3JlYXRlIGEgbmV3IGZpZWxkIGZvciB0aGVtXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWxlbWVudHNba2V5XSkge1xyXG4gICAgICAgIGNvbnN0IGFkZHJlc3NGaWVsZCA9IHRoaXMub3B0aW9ucy5lbGVtZW50c1trZXldO1xyXG4gICAgICAgIHRoaXMucmVzdWx0LnVwZGF0ZUxhYmVsKGtleSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gYWRkcmVzc0xpbmVPYmplY3Q7XHJcbiAgICAgICAgLy8gSWYgYSB2YWx1ZSBpcyBhbHJlYWR5IHByZXNlbnQsIHByZXBlbmQgYSBjb21tYSBhbmQgc3BhY2VcclxuICAgICAgICBpZiAoYWRkcmVzc0ZpZWxkLnZhbHVlICYmIHZhbHVlKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9ICcsICcgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRGVjaWRlIHdoYXQgcHJvcGVydHkgb2YgdGhlIG5vZGUgd2UgbmVlZCB0byB1cGRhdGUuIGkuZS4gaWYgaXQncyBub3QgYSBmb3JtIGZpZWxkLCB1cGRhdGUgdGhlIGlubmVyVGV4dC5cclxuICAgICAgICBpZiAoYWRkcmVzc0ZpZWxkLm5vZGVOYW1lID09PSAnSU5QVVQnIHx8IGFkZHJlc3NGaWVsZC5ub2RlTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCBhZGRyZXNzRmllbGQubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XHJcbiAgICAgICAgICBhZGRyZXNzRmllbGQudmFsdWUgKz0gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFkZHJlc3NGaWVsZC5pbm5lclRleHQgKz0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFN0b3JlIGEgcmVjb3JkIG9mIHRoZWlyIGxhc3QgYWRkcmVzcyBmaWVsZFxyXG4gICAgICAgIHRoaXMucmVzdWx0Lmxhc3RBZGRyZXNzRmllbGQgPSBhZGRyZXNzRmllbGQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHQuZ2VuZXJhdGVBZGRyZXNzTGluZVJlcXVpcmVkKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHRvIHN0b3JlIHRoZSBhZGRyZXNzIGxpbmVcclxuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMucmVzdWx0LmNyZWF0ZUFkZHJlc3NMaW5lLmxhYmVsKGtleSk7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLnJlc3VsdC5jcmVhdGVBZGRyZXNzTGluZS5pbnB1dChsYWJlbCwgYWRkcmVzc0xpbmVPYmplY3QsIGNsYXNzTmFtZSk7XHJcbiAgICAgICAgLy8gSW5zZXJ0IGludG8gRE9NXHJcbiAgICAgICAgdGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5hcHBlbmRDaGlsZChmaWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAvLyBVcGRhdGUgdGhlIGxhYmVsIGlmIHRyYW5zbGF0aW9uIGlzIHByZXNlbnRcclxuICAgIHVwZGF0ZUxhYmVsOiAoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgbGV0IGxhYmVsID0ga2V5O1xyXG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5jdXJyZW50Q291bnRyeUNvZGUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgaWYgKHRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkTGFiZWwgPSB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdW2NvdW50cnldW2tleV07XHJcbiAgICAgICAgICBpZiAodHJhbnNsYXRlZExhYmVsKSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gdHJhbnNsYXRlZExhYmVsO1xyXG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGFiZWwnKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBpZiAobGFiZWxzW2ldLmh0bWxGb3IgPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgbGFiZWxzW2ldLmlubmVySFRNTCA9IHRyYW5zbGF0ZWRMYWJlbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyBUcmFuc2xhdGlvbiBkb2Vzbid0IGV4aXN0IGZvciBrZXlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfSxcclxuICAgIC8vIENyZWF0ZSB0aGUgJ1NlYXJjaCBhZ2FpbicgbGluayB0aGF0IHJlc2V0cyB0aGUgc2VhcmNoXHJcbiAgICBjcmVhdGVTZWFyY2hBZ2Fpbkxpbms6ICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWFyY2hBZ2Fpbi52aXNpYmxlKSB7XHJcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xyXG4gICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLWFnYWluLWJ1dHRvbicpO1xyXG4gICAgICAgIGxpbmsuaW5uZXJUZXh0ID0gdGhpcy5vcHRpb25zLnNlYXJjaEFnYWluLnRleHQ7XHJcbiAgICAgICAgLy8gQmluZCBldmVudCBsaXN0ZW5lclxyXG4gICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmdsb2JhbFJlc2V0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBsaW5rIGVsZW1lbnRcclxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VhcmNoQWdhaW4ubGluayA9IGxpbms7XHJcblxyXG4gICAgICAgIC8vIEluc2VydCBpbnRvIHRoZSBmb3JtYXR0ZWQgYWRkcmVzcyBjb250YWluZXJcclxuICAgICAgICBpZiAodGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lcikge1xyXG4gICAgICAgICAgdGhpcy5yZXN1bHQuZm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0Lmxhc3RBZGRyZXNzRmllbGQpIHtcclxuICAgICAgICAgIC8vIEluc2VydCBhZnRlciBsYXN0IGFkZHJlc3MgZmllbGRcclxuICAgICAgICAgIHRoaXMucmVzdWx0Lmxhc3RBZGRyZXNzRmllbGQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobGluaywgdGhpcy5yZXN1bHQubGFzdEFkZHJlc3NGaWVsZC5uZXh0U2libGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgLy8gV3JpdGUgdGhlIGxpc3Qgb2YgaGlkZGVuIGFkZHJlc3MgbGluZSBpbnB1dHMgdG8gdGhlIERPTVxyXG4gICAgcmVuZGVySW5wdXRMaXN0OiAoaW5wdXRBcnJheSkgPT4ge1xyXG4gICAgICBpZiAoaW5wdXRBcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdC5mb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyLmFwcGVuZENoaWxkKGlucHV0QXJyYXlbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIGVpdGhlciBzaG93IGEgcGlja2xpc3Qgb3IgYSB2ZXJpZmllZCByZXN1bHQgZnJvbSBhIFZhbGlkYXRlIHJlc3BvbnNlXHJcbiAgICBoYW5kbGVWYWxpZGF0ZVJlc3BvbnNlOiAocmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQuY29uZmlkZW5jZSA9PT0gJ1ZlcmlmaWVkIG1hdGNoJykge1xyXG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBjb250YWlucyBhbiBhZGRyZXNzLCB0aGVuIHVzZSB0aGlzIGRpcmVjdGx5IGluIHRoZSByZXN1bHRcclxuICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0LmFkZHJlc3MpIHtcclxuICAgICAgICAgIHRoaXMucmVzdWx0LnNob3cocmVzcG9uc2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UucmVzdWx0LnN1Z2dlc3Rpb25zKSB7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgdmVyaWZpZWQgbWF0Y2ggc3RpbGwgY29udGFpbnMgYSBzdWdnZXN0aW9uLCB0aGVuIHdlIG5lZWQgdG8gZm9ybWF0IHRoaXMgZmlyc3RcclxuICAgICAgICAgIHRoaXMuZm9ybWF0KHJlc3BvbnNlLnJlc3VsdC5zdWdnZXN0aW9uc1swXS5mb3JtYXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5yZXN1bHQuc3VnZ2VzdGlvbnMpIHtcclxuICAgICAgICAvLyBJZiB0aGUgdXNlciBuZWVkcyB0byBwaWNrIGEgc3VnZ2VzdGlvbiwgdGhlbiBkaXNwbGF5IHRoZSBwaWNrbGlzdFxyXG4gICAgICAgIHRoaXMucGlja2xpc3Quc2hvdyhyZXNwb25zZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UucmVzdWx0LmNvbmZpZGVuY2UgPT09ICdObyBtYXRjaGVzJykge1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVzLCB0aGVuIGFsbG93IFwidXNlIGFkZHJlc3MgZW50ZXJlZFwiXHJcbiAgICAgICAgdGhpcy5waWNrbGlzdC5oYW5kbGVFbXB0eVBpY2tsaXN0KHJlc3BvbnNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgY2hlY2tUYWIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KGV2ZW50KTtcclxuICAgIGlmIChrZXkgPT09ICdUYWInKSB7XHJcbiAgICAgIHRoaXMucGlja2xpc3Qua2V5dXAoZXZlbnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICAvLyBQcmV2ZW50IGFuICdFbnRlcicga2V5cHJlc3Mgb24gdGhlIGlucHV0IHN1Ym1pdHRpbmcgdGhlIGZvcm1cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VhcmNoU3Bpbm5lciA9IHtcclxuICAgIHNob3c6ICgpID0+IHtcclxuICAgICAgLy8gUmV0dXJuIGlmIHdlJ3JlIG5vdCBkaXNwbGF5aW5nIGEgc3Bpbm5lclxyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy51c2VTcGlubmVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIENyZWF0ZSB0aGUgc3Bpbm5lciBjb250YWluZXJcclxuICAgICAgY29uc3Qgc3Bpbm5lckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBzcGlubmVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xvYWRlcicpO1xyXG4gICAgICBzcGlubmVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xvYWRlci1pbmxpbmUnKTtcclxuXHJcbiAgICAgIC8vIENyZWF0ZSB0aGUgc3Bpbm5lclxyXG4gICAgICBjb25zdCBzcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIHNwaW5uZXIuY2xhc3NMaXN0LmFkZCgnc3Bpbm5lcicpO1xyXG4gICAgICBzcGlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHNwaW5uZXIpO1xyXG5cclxuICAgICAgLy8gSW5zZXJ0IHRoZSBzcGlubmVyIGFmdGVyIHRoZSBmaWVsZFxyXG4gICAgICB0aGlzLmlucHV0c1swXS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoc3Bpbm5lckNvbnRhaW5lciwgdGhpcy5pbnB1dHNbMF0ubmV4dFNpYmxpbmcpO1xyXG4gICAgfSxcclxuXHJcbiAgICBoaWRlOiAoKSA9PiB7XHJcbiAgICAgIC8vIFJldHVybiBpZiB3ZSdyZSBub3QgZGlzcGxheWluZyBhIHNwaW5uZXJcclxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlU3Bpbm5lcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzcGlubmVyID0gdGhpcy5pbnB1dHNbMF0ucGFyZW50Tm9kZT8ucXVlcnlTZWxlY3RvcignLmxvYWRlci1pbmxpbmUnKTtcclxuICAgICAgaWYgKHNwaW5uZXIpIHtcclxuICAgICAgICB0aGlzLmlucHV0c1swXS5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChzcGlubmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIFRvZ2dsZSB0aGUgXCJoaWRkZW5cIiBjbGFzcyB0byBlaXRoZXIgc2hvdyBvciBoaWRlIHRoZSBpbnB1dCBhbmQgY291bnRyeSBmaWVsZChzKVxyXG4gIHByaXZhdGUgdG9nZ2xlU2VhcmNoSW5wdXRzKHN0YXRlOiAnc2hvdycgfCAnaGlkZScpIHtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gc3RhdGUgPT09ICdzaG93JyA/ICdyZW1vdmUnIDogJ2FkZCc7XHJcbiAgICB0aGlzLm9wdGlvbnMuZWxlbWVudHMuaW5wdXRzPy5mb3JFYWNoKGlucHV0ID0+IGlucHV0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLnRvZ2dsZScpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdFttb2RpZmllcl0oJ2hpZGRlbicpKSk7XHJcbiAgICB0aGlzLm9wdGlvbnMuZWxlbWVudHMuY291bnRyeUxpc3Q/LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLnRvZ2dsZScpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdFttb2RpZmllcl0oJ2hpZGRlbicpKTtcclxuICAgIHRoaXMub3B0aW9ucy5lbGVtZW50cy5sb29rdXBCdXR0b24/LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLnRvZ2dsZScpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdFttb2RpZmllcl0oJ2hpZGRlbicpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2xvYmFsUmVzZXQoZXZlbnQ/KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIC8vIEVuYWJsZSBzZWFyY2hpbmdcclxuICAgIHRoaXMub3B0aW9ucy5lbmFibGVkID0gdHJ1ZTtcclxuICAgIC8vIEhpZGUgZm9ybWF0dGVkIGFkZHJlc3NcclxuICAgIHRoaXMucmVzdWx0LmhpZGUoKTtcclxuICAgIC8vIFJlc2V0IHNlYXJjaCBpbnB1dCBiYWNrXHJcbiAgICB0aGlzLmhhc1NlYXJjaElucHV0QmVlblJlc2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBDbGVhciB0aGUgaW5wdXQgZmllbGQocylcclxuICAgIHRoaXMuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4gaW5wdXQudmFsdWUgPSAnJyk7XHJcbiAgICAvLyBSZW1vdmUgdGhlIHBpY2tsaXN0IChpZiBwcmVzZW50KVxyXG4gICAgdGhpcy5waWNrbGlzdC5oaWRlKCk7XHJcbiAgICAvLyBTaG93IHNlYXJjaCBpbnB1dFxyXG4gICAgdGhpcy50b2dnbGVTZWFyY2hJbnB1dHMoJ3Nob3cnKTtcclxuICAgIC8vIEFwcGx5IGZvY3VzIHRvIGlucHV0XHJcbiAgICB0aGlzLmlucHV0c1swXS5mb2N1cygpO1xyXG5cclxuICAgIC8vIEZpcmUgYW4gZXZlbnQgYWZ0ZXIgYSByZXNldFxyXG4gICAgdGhpcy5ldmVudHMudHJpZ2dlcigncG9zdC1yZXNldCcpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgQWRkcmVzc1ZhbGlkYXRpb24gZnJvbSAnLi9hZGRyZXNzLXNlYXJjaCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgQWRkcmVzc1ZhbGlkYXRpb246IGFueTtcbiAgfVxufVxuXG53aW5kb3cuQWRkcmVzc1ZhbGlkYXRpb24gPSBBZGRyZXNzVmFsaWRhdGlvbjsiXSwibmFtZXMiOlsiQWRkcmVzc1ZhbGlkYXRpb25Nb2RlIiwiY29sbGVjdGlvbiIsIm9uIiwiZXZlbnQiLCJhY3Rpb24iLCJ0aGlzIiwicHVzaCIsInRyaWdnZXIiLCJkYXRhIiwiaSIsImxlbmd0aCIsImFyZ3MiLCJhIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJlIiwiaW5zdGFuY2UiLCJzZW5kIiwidXJsIiwibWV0aG9kIiwiY2FsbGJhY2siLCJoZWFkZXJzIiwiY3VycmVudFJlcXVlc3QiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJ0aW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIm9wdGlvbnMiLCJ0b2tlbiIsImZvckVhY2giLCJoZWFkZXIiLCJrZXkiLCJ2YWx1ZSIsIm9ubG9hZCIsInhociIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInNlYXJjaFNwaW5uZXIiLCJoaWRlIiwiZXZlbnRzIiwib25lcnJvciIsIm9udGltZW91dCIsImRlZmF1bHRzIiwiZW5hYmxlV2hhdDNXb3JkcyIsInNlYXJjaFR5cGUiLCJBVVRPQ09NUExFVEUiLCJpbnB1dCIsInBsYWNlaG9sZGVyVGV4dCIsImFwcGx5Rm9jdXMiLCJmb3JtYXR0ZWRBZGRyZXNzQ29udGFpbmVyIiwic2hvd0hlYWRpbmciLCJoZWFkaW5nVHlwZSIsInZhbGlkYXRlZEhlYWRpbmdUZXh0IiwibWFudWFsSGVhZGluZ1RleHQiLCJzZWFyY2hBZ2FpbiIsInZpc2libGUiLCJ0ZXh0IiwidXNlQWRkcmVzc0VudGVyZWRUZXh0IiwidXNlU3Bpbm5lciIsImxhbmd1YWdlIiwiYWRkcmVzc0xpbmVMYWJlbHMiLCJkYXRhc2V0Q29kZXMiLCJjb3VudHJ5IiwiaXNvM0NvZGUiLCJpc28yQ29kZSIsImRhdGFzZXRDb2RlIiwidHJhbnNsYXRpb25zIiwiZW4iLCJnYnIiLCJsb2NhbGl0eSIsInJlZ2lvbiIsInBvc3RhbF9jb2RlIiwidXNhIiwic2l6ZSIsIm1heFN1Z2dlc3Rpb25zIiwiYmFzZVVybCIsInNlYXJjaEVuZHBvaW50IiwibG9va3VwRW5kcG9pbnQiLCJ2YWxpZGF0ZUVuZHBvaW50IiwicHJvbXB0c2V0RW5kcG9pbnQiLCJzdGVwSW5FbmRwb2ludCIsInJlZmluZUVuZHBvaW50IiwiZW5yaWNobWVudEVuZHBvaW50Iiwid2hhdDNXb3JkQ291bnRyaWVzIiwid2hhdDNXb3Jkc0tleXdvcmQiLCJwb3dlcmVkQnlMb2dvIiwiZWxlbWVudCIsImNyZWF0ZSIsInBpY2tsaXN0IiwiaXRlbSIsInN2ZyIsImZvcm1hdCIsImxpc3RJdGVtIiwiY3JlYXRlTGlzdEl0ZW0iLCJjbGFzc0xpc3QiLCJhZGQiLCJsaXN0IiwicGFyZW50Tm9kZSIsImFwcGVuZENoaWxkIiwiZGVzdHJveSIsInJlbW92ZUNoaWxkIiwidW5kZWZpbmVkIiwicmVzdWx0IiwibGFzdEFkZHJlc3NGaWVsZCIsImdlbmVyYXRlQWRkcmVzc0xpbmVSZXF1aXJlZCIsInNob3ciLCJsYXN0U2VhcmNoVGVybSIsImFkZHJlc3MiLCJjb25maWRlbmNlIiwiaW5wdXRzIiwiY2FsY3VsYXRlSWZBZGRyZXNzTGluZUdlbmVyYXRpb25SZXF1aXJlZCIsImVsZW1lbnRzIiwiY3JlYXRlRm9ybWF0dGVkQWRkcmVzc0NvbnRhaW5lciIsIk9iamVjdCIsImtleXMiLCJhZGRyZXNzQ29tcG9uZW50IiwidXBkYXRlQWRkcmVzc0xpbmUiLCJ0b2dnbGVTZWFyY2hJbnB1dHMiLCJoYXNTZWFyY2hJbnB1dEJlZW5SZXNldCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImNyZWF0ZVNlYXJjaEFnYWluTGluayIsImxpbmsiLCJjcmVhdGVBZGRyZXNzTGluZSIsImNsYXNzTmFtZSIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImxhYmVsIiwiaW5uZXJIVE1MIiwicmVwbGFjZSIsInN0ciIsInRvVXBwZXJDYXNlIiwic2V0QXR0cmlidXRlIiwidG9Mb3dlckNhc2UiLCJjdXJyZW50Q291bnRyeUNvZGUiLCJ0cmFuc2xhdGVkTGFiZWwiLCJjb250YWluZXIiLCJwb3NpdGlvbiIsIlNJTkdMRUxJTkUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsImNyZWF0ZUhlYWRpbmciLCJoZWFkaW5nIiwidXBkYXRlSGVhZGluZyIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRyZXNzTGluZU9iamVjdCIsImFkZHJlc3NGaWVsZCIsInVwZGF0ZUxhYmVsIiwibm9kZU5hbWUiLCJpbm5lclRleHQiLCJmaWVsZCIsImxhYmVscyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaHRtbEZvciIsImFkZEV2ZW50TGlzdGVuZXIiLCJnbG9iYWxSZXNldCIsImJpbmQiLCJyZW5kZXJJbnB1dExpc3QiLCJpbnB1dEFycmF5IiwiaGFuZGxlVmFsaWRhdGVSZXNwb25zZSIsInJlc3BvbnNlIiwic3VnZ2VzdGlvbnMiLCJoYW5kbGVFbXB0eVBpY2tsaXN0Iiwic3Bpbm5lckNvbnRhaW5lciIsInNwaW5uZXIiLCJtZXJnZURlZmF1bHRPcHRpb25zIiwic2V0dXAiLCJzZXRUb2tlbiIsInNldFNlYXJjaFR5cGUiLCJzZXRJbnB1dHMiLCJnZXRFbnJpY2htZW50RGF0YSIsImdsb2JhbEFkZHJlc3NLZXkiLCJjb3VudHJ5X2lzbyIsImdsb2JhbF9hZGRyZXNzX2tleSIsImF0dHJpYnV0ZXMiLCJnZW9jb2RlcyIsInJlcXVlc3QiLCJoYW5kbGVFbnJpY2htZW50UmVzdWx0Iiwic3RyaW5naWZ5Iiwic2V0Q291bnRyeUxpc3QiLCJjcmVhdGVQaWNrbGlzdCIsInNldFRpbWVvdXQiLCJnZXRQYXJhbWV0ZXIiLCJuYW1lIiwicmVzdWx0cyIsIlJlZ0V4cCIsImV4ZWMiLCJsb2NhdGlvbiIsInNlYXJjaCIsImRlY29kZVVSSUNvbXBvbmVudCIsImN1c3RvbU9wdGlvbnMiLCJlbmFibGVkIiwiZ2V0UHJvbXB0c2V0IiwiY3VycmVudERhdGFTZXQiLCJsb29rdXBEYXRhc2V0Q29kZSIsImhhbmRsZVByb21wdHNldFJlc3VsdCIsImxpbmVzIiwiZXhhbXBsZSIsInByb21wdCIsInN1Z2dlc3RlZF9pbnB1dF9sZW5ndGgiLCJWQUxJREFURSIsImRhdGFzZXRzIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VhcmNoX3R5cGUiLCJwcm9tcHRfc2V0IiwiZmluZCIsImRhdGFzZXQiLCJpbmNsdWRlcyIsInJlZ2lzdGVySW5wdXRzIiwibG9va3VwQnV0dG9uIiwibG9va3VwRm4iLCJmcm9tIiwia2V5VXBGbiIsImNoZWNrVGFiRm4iLCJjaGVja1RhYiIsImhhbmRsZUtleWJvYXJkRXZlbnQiLCJjb3VudHJ5Q29kZU1hcHBpbmciLCJmb2N1cyIsImNvdW50cnlMaXN0IiwiaGFuZGxlQ291bnRyeUxpc3RDaGFuZ2UiLCJjb3VudHJ5Q29kZSIsIkVycm9yIiwiZ2VuZXJhdGVTZWFyY2hEYXRhRm9yQXBpQ2FsbCIsImNvbXBvbmVudHMiLCJ1bnNwZWNpZmllZCIsImN1cnJlbnRTZWFyY2hUZXJtIiwibWF4X3N1Z2dlc3Rpb25zIiwiVmFsdWUiLCJnZW5lcmF0ZUxvb2t1cERhdGFGb3JBcGlDYWxsIiwic2hvdWxkR2V0U3VnZ2VzdGlvbnMiLCJ0eXBlIiwiZ2V0V2hhdDNXb3Jkc0xvb2t1cFZhbHVlIiwic3RhcnRzV2l0aCIsInNsaWNlIiwicHJldmVudERlZmF1bHQiLCJnZXRLZXkiLCJrZXl1cCIsIm1hcCIsImpvaW4iLCJjb3VudHJ5Q29kZUFuZERhdGFzZXQiLCJzcGxpdCIsImNhblNlYXJjaCIsImFib3J0IiwidGVzdCIsImluZGV4T2YiLCJpc1doYXQzV29yZHMiLCJzaG93V2hhdDNXb3JkcyIsIlBpY2tsaXN0IiwidGFiQ291bnQiLCJpdGVtcyIsImhhbmRsZUNvbW1vblNob3dQaWNrbGlzdExvZ2ljIiwicmVmaW5lIiwiaXNOZWVkZWQiLCJjcmVhdGVJbnB1dCIsInN1Z2dlc3Rpb25zX3Byb21wdCIsInN1Z2dlc3Rpb25zX2tleSIsImRpc3BsYXlTdWdnZXN0aW9uc0hlYWRlciIsImxpc3RlbiIsImRpc3BsYXlVc2VBZGRyZXNzRW50ZXJlZEZvb3RlciIsInNjcm9sbEludG9WaWV3SWZOZWVkZWQiLCJ3aGF0M3dvcmRzSXRlbXMiLCJjcmVhdGVXaGF0M1dvcmRzTGlzdEl0ZW0iLCJzaG93TG9va3VwIiwibG9va3VwSXRlbXMiLCJhZGRyZXNzZXMiLCJjcmVhdGVMb29rdXBMaXN0SXRlbSIsImN1cnJlbnRJdGVtIiwicmVzZXRUYWJDb3VudCIsImNyZWF0ZUxpc3QiLCJ1c2VBZGRyZXNzRW50ZXJlZCIsInJlbW92ZSIsImhhbmRsZUVtcHR5UGlja2xpc3RDYWxsYmFjayIsInRpdGxlRGl2IiwiY29udGFpbmVyRGl2IiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaXRlbURpdiIsImNsaWNrIiwib3V0T2ZCb3VuZHNUb3AiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b3AiLCJvdXRPZkJvdW5kc0JvdHRvbSIsImJvdHRvbSIsIndpbmRvdyIsImlubmVySGVpZ2h0Iiwic2Nyb2xsSW50b1ZpZXciLCJmaXJzdENoaWxkIiwiaW5wdXREYXRhIiwiYWRkcmVzc19saW5lXzEiLCJhZGRyZXNzX2xpbmVfMiIsImFkZHJlc3NfbGluZV8zIiwiZm9ybWF0TWFudWFsQWRkcmVzc0xpbmUiLCJsaW5lT2JqZWN0IiwiY2hlY2tFbnRlciIsInJvdyIsImFkZE1hdGNoaW5nRW1waGFzaXMiLCJkZXNjcmlwdGlvbiIsIndoYXQzd29yZHMiLCJlbnRlciIsImJ1dHRvbiIsIktleWJvYXJkRXZlbnQiLCJNb3VzZUV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwicmVmaW5lbWVudCIsImdldEF0dHJpYnV0ZSIsImZpcnN0QWRkcmVzcyIsImxhc3RBZGRyZXNzIiwicXVlcnlTZWxlY3RvckFsbCIsImN1cnJlbnRseUhpZ2hsaWdodGVkIiwicHJldmlvdXNseUhpZ2hsaWdodGVkIiwiYWRkcmVzc0xpc3RDb29yZHMiLCJvZmZzZXRUb3AiLCJvZmZzZXRIZWlnaHQiLCJzY3JvbGxUb3AiLCJoaWdobGlnaHRzIiwibWF0Y2hlZCIsInJlcGxhY2VtZW50Iiwic3Vic3RyaW5nIiwicGljayIsInBpY2tsaXN0SXRlbSIsImxvb2t1cCIsImxvb2t1cFYyUmVxdWVzdCIsInN0YXRlIiwibW9kaWZpZXIiLCJBZGRyZXNzVmFsaWRhdGlvbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dist/lib/address-search.d.ts b/dist/lib/address-search.d.ts index c1e9ce3..d34724b 100644 --- a/dist/lib/address-search.d.ts +++ b/dist/lib/address-search.d.ts @@ -7,11 +7,14 @@ export default class AddressValidation { request: Request; private baseUrl; private searchEndpoint; + private lookupEndpoint; private validateEndpoint; private promptsetEndpoint; private stepInEndpoint; private refineEndpoint; private enrichmentEndpoint; + private what3WordCountries; + private what3WordsKeyword; private picklist; private inputs; private lastSearchTerm; @@ -23,6 +26,7 @@ export default class AddressValidation { private lookupFn; private keyUpFn; private checkTabFn; + private isWhat3Words; constructor(options: AddressSearchOptions); setToken(token: string): void; setSearchType(searchType: AddressValidationMode): void; @@ -40,6 +44,8 @@ export default class AddressValidation { private setCountryList; private handleCountryListChange; private generateSearchDataForApiCall; + private generateLookupDataForApiCall; + private getWhat3WordsLookupValue; private handleKeyboardEvent; private search; private getKey; @@ -48,6 +54,7 @@ export default class AddressValidation { private createPicklist; private format; private refine; + private lookup; private result; private checkTab; private searchSpinner; diff --git a/dist/lib/class-types.d.ts b/dist/lib/class-types.d.ts index 9d18ea3..dae381c 100644 --- a/dist/lib/class-types.d.ts +++ b/dist/lib/class-types.d.ts @@ -1,18 +1,25 @@ export declare class Picklist { items: PicklistItem[]; + what3wordsItems: What3WordsPickList[]; + lookupItems: LookupAddress[]; currentItem: any; list: HTMLDivElement; container: HTMLElement; size: number; maxSuggestions: number; show: (items: SearchResponse) => void; + showWhat3Words: (items: LookupW3WResponse) => void; + showLookup: (items: LookupV2Response) => void; hide: () => void; - handleEmptyPicklist: (items: SearchResponse) => void; + handleEmptyPicklist: (items: SearchResponse | LookupW3WResponse | LookupV2Response) => void; handleEmptyPicklistCallback: () => void; + handleCommonShowPicklistLogic: () => void; refine: Refinement; useAddressEntered: UseAddressEntered; createList: () => HTMLDivElement; createListItem: (item: PicklistItem) => HTMLDivElement; + createLookupListItem: (item: LookupAddress) => HTMLDivElement; + createWhat3WordsListItem: (item: What3WordsPickList) => HTMLDivElement; tabCount: number; resetTabCount: () => void; keyup: (event: KeyboardEvent) => void; @@ -56,6 +63,32 @@ export interface SearchResponse { }; }; } +export interface LookupW3WResponse { + result?: { + more_results_available: boolean; + suggestions: What3WordsPickList[]; + confidence: string; + }; +} +export interface LookupV2Response { + result?: { + more_results_available: boolean; + confidence: string; + addresses: LookupAddress[]; + }; +} +export interface LookupAddress { + text: string; + global_address_key: string; + format: string; +} +export interface What3WordsPickList { + what3words: What3WordsSuggestion; +} +export interface What3WordsSuggestion { + name: string; + description: string; +} export interface PicklistItem { text: string; format?: string; diff --git a/dist/lib/search-options.d.ts b/dist/lib/search-options.d.ts index 3944980..c941083 100644 --- a/dist/lib/search-options.d.ts +++ b/dist/lib/search-options.d.ts @@ -1,6 +1,7 @@ export interface AddressSearchOptions { enabled: boolean; token: string; + enableWhat3Words: boolean; searchType: AddressValidationMode; maxSuggestions: number; language: string; @@ -45,6 +46,7 @@ export declare enum AddressValidationMode { VALIDATE = "validate" } export declare const defaults: { + enableWhat3Words: boolean; searchType: AddressValidationMode; input: { placeholderText: string; diff --git a/index.html b/index.html index d07d468..886cd1d 100644 --- a/index.html +++ b/index.html @@ -1,538 +1,538 @@ - - - - - Experian Address Validation - sample page - - - - - - - - - - - - - - -
-

Experian Address Validation

-
- -
-

Welcome to our Experian Address Validation demo. Here you can try some of our available search types.

- - -
- -
-
- - - - -
- - - -
-
- -
- - -
-
- -
- - -
- - -
- - - - - + + + + + Experian Address Validation - sample page + + + + + + + + + + + + + + +
+

Experian Address Validation

+
+ +
+

Welcome to our Experian Address Validation demo. Here you can try some of our available search types.

+ + +
+ +
+
+ + + + +
+ + + +
+
+ +
+ + +
+
+ +
+ + +
+ + +
+ + + + + diff --git a/src/css/experian-address-validation.css b/src/css/experian-address-validation.css index 41dd090..5f8862c 100644 --- a/src/css/experian-address-validation.css +++ b/src/css/experian-address-validation.css @@ -1,164 +1,194 @@ -*, -*::before, -*::after { - box-sizing: border-box; -} - -.hidden { - display: none; -} - -/* Loading spinner styles */ -@-webkit-keyframes spinner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes spinner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.loader { - margin: auto; - overflow: hidden; -} -.loader.loader-overlay { - position: absolute; - z-index: 999; - top: 0; - left: 0; - right: 0; - bottom: 0; - margin-top: 0; - margin-bottom: 0; - width: 100%; - height: 14em; - pointer-events: none; -} -.loader .spinner { - font-size: 1em; - border-radius: 50%; - border-top: 1.1em solid rgba(1, 92, 174, 0.2); - border-right: 1.1em solid rgba(1, 92, 174, 0.2); - border-bottom: 1.1em solid rgba(1, 92, 174, 0.2); - border-left: 1.1em solid #1d4f91; - height: 8em; - width: 8em; - margin: 2em auto; - position: relative; - text-indent: -9999em; - -webkit-animation: spinner .8s infinite linear; - animation: spinner .8s infinite linear; -} -.loader.loader-inline { - height: 0; - overflow: visible; - text-align: right; -} -.loader.loader-inline .spinner { - border-width: 1.5em; - display: inline-block; - font-size: 2px; - margin: 0 5em; - top: -27px; - z-index: 9; -} - -input.showing-suggestions { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} - -.address-picklist-container { - position: absolute; - width: 100%; - border: 2px solid #1d4f91; -} -.address-picklist { - background-color: white; - max-height: 150px; - overflow: auto; - overflow-x: hidden; - padding: 0; -} -.picklist-refinement-box { - display: flex; - align-items: center; - background-color: white; - padding: 5px 11px; - border-bottom: 1px solid #1d4f91; -} -.picklist-refinement-box button { - margin-top: 0; - margin-left: 1em; - border-radius: 4px; - padding: 8px 14px; - color: white; - background-color: #426da9; - border: 1px solid transparent; - font-size: 14px; - line-height: 16px; -} -.address-picklist div, -.use-address-entered, -.powered-by-experian, -.picklist-suggestions-header, -.picklist-use-entered-header, -.picklist-use-entered-option { - color: #575755; - font-size: 14px; - line-height: 1.4; - padding: 5px 11px; -} - -.address-picklist div { - padding-left: 20px; - position: relative; -} - -.use-address-entered, -.powered-by-experian { - background-color: white; - border-top: 1px solid #1d4f91; - margin-top: 0; - padding-top: 7px; - display: flex; - align-items: center; -} -.use-address-entered:hover { - background-color: #f4f4f4; - cursor: pointer; -} - -.picklist-use-entered-container { - background-color: white; -} -.picklist-use-entered-header, .picklist-suggestions-header { - background-color: #eaeaea; - font-weight: 600; -} -.picklist-use-entered-option { - padding-left: 20px; -} - -.picklist-use-entered-option:hover, .address-picklist div:not(.selected):hover { - background-color: #e0effb; -} -.address-picklist .selected { - background-color: #426da9; - cursor: pointer; - border-left: 4px solid #e63888; - color: white; -} +*, +*::before, +*::after { + box-sizing: border-box; +} + +.hidden { + display: none; +} + +/* Loading spinner styles */ +@-webkit-keyframes spinner { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.loader { + margin: auto; + overflow: hidden; +} + +.loader.loader-overlay { + position: absolute; + z-index: 999; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin-top: 0; + margin-bottom: 0; + width: 100%; + height: 14em; + pointer-events: none; +} + +.loader .spinner { + font-size: 1em; + border-radius: 50%; + border-top: 1.1em solid rgba(1, 92, 174, 0.2); + border-right: 1.1em solid rgba(1, 92, 174, 0.2); + border-bottom: 1.1em solid rgba(1, 92, 174, 0.2); + border-left: 1.1em solid #1d4f91; + height: 8em; + width: 8em; + margin: 2em auto; + position: relative; + text-indent: -9999em; + -webkit-animation: spinner .8s infinite linear; + animation: spinner .8s infinite linear; +} + +.loader.loader-inline { + height: 0; + overflow: visible; + text-align: right; +} + +.loader.loader-inline .spinner { + border-width: 1.5em; + display: inline-block; + font-size: 2px; + margin: 0 5em; + top: -27px; + z-index: 9; +} + +input.showing-suggestions { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.address-picklist-container { + position: absolute; + width: 100%; + border: 2px solid #1d4f91; +} + +.address-picklist { + background-color: white; + max-height: 150px; + overflow: auto; + overflow-x: hidden; + padding: 0; +} + +.picklist-refinement-box { + display: flex; + align-items: center; + background-color: white; + padding: 5px 11px; + border-bottom: 1px solid #1d4f91; +} + +.picklist-refinement-box button { + margin-top: 0; + margin-left: 1em; + border-radius: 4px; + padding: 8px 14px; + color: white; + background-color: #426da9; + border: 1px solid transparent; + font-size: 14px; + line-height: 16px; +} + +.address-picklist div, +.use-address-entered, +.powered-by-experian, +.picklist-suggestions-header, +.picklist-use-entered-header, +.picklist-use-entered-option { + color: #575755; + font-size: 14px; + line-height: 1.4; + padding: 5px 11px; +} + +.address-picklist div { + padding-left: 20px; + position: relative; +} + +.use-address-entered, +.powered-by-experian { + background-color: white; + border-top: 1px solid #1d4f91; + margin-top: 0; + padding-top: 7px; + display: flex; + align-items: center; +} + +.use-address-entered:hover { + background-color: #f4f4f4; + cursor: pointer; +} + +.picklist-use-entered-container { + background-color: white; +} + +.picklist-use-entered-header, +.picklist-suggestions-header { + background-color: #eaeaea; + font-weight: 600; +} + +.picklist-use-entered-option { + padding-left: 20px; +} + +.picklist-use-entered-option:hover, +.address-picklist div:not(.selected):hover { + background-color: #e0effb; +} + +.address-picklist .selected { + background-color: #426da9; + cursor: pointer; + border-left: 4px solid #e63888; + color: white; +} + +.picklist-use-entered-option, +.address-picklist div:not(.selected) .what3Words-name { + font-weight: bold; + padding-bottom: 0px; +} + +.picklist-use-entered-option, +.address-picklist div:not(.selected) .what3Words-description { + font-style: italic; + padding-top: 0px; + font-size: 12px; +} \ No newline at end of file diff --git a/src/ts/address-search.ts b/src/ts/address-search.ts index e583988..72f3887 100644 --- a/src/ts/address-search.ts +++ b/src/ts/address-search.ts @@ -1,1240 +1,1417 @@ -import EventFactory from './event-factory'; -import Request from './request'; -import {AddressSearchOptions, AddressValidationMode, defaults} from './search-options'; -import {datasetCodes} from './datasets-codes'; -import {translations} from './translations'; -import {AddressValidationResult, Picklist, PicklistItem, PoweredByLogo, SearchResponse} from './class-types'; - -export default class AddressValidation { - public options: AddressSearchOptions; - public searchType: AddressValidationMode; - public events; - public request: Request; - - private baseUrl = 'https://api.experianaperture.io/'; - private searchEndpoint = 'address/search/v1'; - private validateEndpoint = 'address/validate/v1'; - private promptsetEndpoint = 'address/promptsets/v1'; - private stepInEndpoint = 'address/suggestions/stepin/v1'; - private refineEndpoint = 'address/suggestions/refine/v1'; - private enrichmentEndpoint = 'enrichment/v2'; - - private picklist: Picklist; - private inputs: HTMLInputElement[]; - private lastSearchTerm: string; - private currentSearchTerm: string; - private currentCountryCode: string; - private currentDataSet: string | string[]; - private hasSearchInputBeenReset: boolean; - private countryCodeMapping; - private lookupFn; - private keyUpFn; - private checkTabFn; - - constructor(options: AddressSearchOptions) { - this.options = this.mergeDefaultOptions(options); - - this.events = new EventFactory(); - - this.setup(); - } - - public setToken(token: string): void { - this.options.token = token; - this.setup(); - } - - public setSearchType(searchType: AddressValidationMode): void { - this.searchType = searchType; - this.globalReset(); - this.setInputs(); - this.events.trigger('post-search-type-change', searchType); - } - - public getEnrichmentData(globalAddressKey: string) { - if (globalAddressKey) { - const data = { - country_iso: this.currentCountryCode, - keys: { - global_address_key: globalAddressKey - }, - attributes: { - geocodes: ['latitude', 'longitude', 'match_level'] - } - }; - this.events.trigger('pre-enrichment'); - this.request.send(this.baseUrl + this.enrichmentEndpoint, 'POST', this.handleEnrichmentResult.bind(this), JSON.stringify(data)); - } - } - - private setup(): void { - // Get token and proceed if it's present - if (this.token) { - this.hasSearchInputBeenReset = true; - - // Instantiate a new Request class for use when making API calls - this.request = new Request(this); - - // Set the country list - this.setCountryList(); - - // Set the input fields for this search type - this.setInputs(); - - // Setup a picklist object - this.createPicklist(); - } else { - // Trigger a 401 Unauthorized event if a token does not exist - setTimeout(() => this.events.trigger('request-error-401')); - } - } - - private handleEnrichmentResult(response) { - this.events.trigger('post-enrichment', response); - } - - private getParameter(name): string { - name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); - const regex = new RegExp('[\\?&]' + name + '=([^&#]*)'), - results = regex.exec(location.search); - return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); - } - - // Try and get token from the query string if it's not already provided - private get token(): string { - if (!this.options.token) { - this.options.token = this.getParameter('token'); - } - return this.options.token; - } - - private mergeDefaultOptions(customOptions): AddressSearchOptions { - const instance: AddressSearchOptions = customOptions || {}; - - instance.enabled = true; - this.searchType = instance.searchType || defaults.searchType; - instance.searchType = instance.searchType || defaults.searchType; - instance.language = instance.language || defaults.language; - instance.useSpinner = instance.useSpinner || defaults.useSpinner; - instance.applyFocus = (typeof instance.applyFocus !== 'undefined') ? instance.applyFocus : defaults.input.applyFocus; - instance.placeholderText = instance.placeholderText || defaults.input.placeholderText; - instance.searchAgain = instance.searchAgain || {}; - instance.searchAgain.visible = (typeof instance.searchAgain.visible !== 'undefined') ? instance.searchAgain.visible : defaults.searchAgain.visible; - instance.searchAgain.text = instance.searchAgain.text || defaults.searchAgain.text; - instance.formattedAddressContainer = instance.formattedAddressContainer || defaults.formattedAddressContainer; - instance.formattedAddressContainer.showHeading = (typeof instance.formattedAddressContainer.showHeading !== 'undefined') ? instance.formattedAddressContainer.showHeading : defaults.formattedAddressContainer.showHeading; - instance.formattedAddressContainer.headingType = instance.formattedAddressContainer.headingType || defaults.formattedAddressContainer.headingType; - instance.formattedAddressContainer.validatedHeadingText = instance.formattedAddressContainer.validatedHeadingText || defaults.formattedAddressContainer.validatedHeadingText; - instance.formattedAddressContainer.manualHeadingText = instance.formattedAddressContainer.manualHeadingText || defaults.formattedAddressContainer.manualHeadingText; - instance.useAddressEnteredText = instance.useAddressEnteredText || defaults.useAddressEnteredText; - instance.elements = instance.elements || {}; - - return instance; - } - - private getPromptset(): void { - if (this.currentCountryCode) { - // Using the country code and the search type, lookup what the relevant dataset code should be - this.currentDataSet = this.lookupDatasetCode(); - if (this.currentDataSet) { - - /// Temporary measure until the promptset endpoint supports Autocomplete and Validate - if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { - setTimeout(() => this.handlePromptsetResult({result: {lines: [{example: this.options.placeholderText, prompt: 'Address', suggested_input_length: 160}]}})); - return; - } else if (this.searchType === AddressValidationMode.VALIDATE) { - const lines = [ - {prompt: 'Address line 1', suggested_input_length: 160}, - {prompt: 'Address line 2', suggested_input_length: 160}, - {prompt: 'Address line 3', suggested_input_length: 160}, - {prompt: this.result.createAddressLine.label('locality'), suggested_input_length: 160}, - {prompt: this.result.createAddressLine.label('region'), suggested_input_length: 160}, - {prompt: this.result.createAddressLine.label('postal_code'), suggested_input_length: 160} - ]; - setTimeout(() => this.handlePromptsetResult({result: {lines}})); - return; - } - - const data = { - country_iso: this.currentCountryCode, - datasets: Array.isArray(this.currentDataSet) ? this.currentDataSet : [this.currentDataSet], - search_type: this.searchType, - prompt_set: 'optimal' - }; - this.events.trigger('pre-promptset-check'); - this.request.send(this.baseUrl + this.promptsetEndpoint, 'POST', this.handlePromptsetResult.bind(this), JSON.stringify(data)); - } - } - } - - private lookupDatasetCode(): string | string[] { - const item = datasetCodes.find(dataset => dataset.iso3Code === this.currentCountryCode && dataset.searchType.includes(this.searchType)); - if (item) { - return item.datasetCode; - } - } - - private handlePromptsetResult(response): void { - // Remove any currently displayed picklist when the promptset changes - this.picklist.hide(); - - // Trigger a new event to notify subscribers - this.events.trigger('post-promptset-check', response); - } - - public setInputs(inputs = this.options.elements.inputs): void { - // If address inputs exist then register these with event listeners, otherwise call the promptset endpoint to retrieve them - if (inputs) { - this.registerInputs(inputs); - } else { - // Make an API call to get the promptset for this country/dataset/engine - this.getPromptset(); - } - - if (this.searchType === AddressValidationMode.SINGLELINE || this.searchType === AddressValidationMode.VALIDATE) { - // Bind an event listener on the lookup button - if (this.options.elements.lookupButton) { - this.lookupFn = this.search.bind(this); - this.options.elements.lookupButton.addEventListener('click', this.lookupFn); - } - } - } - - private registerInputs(inputs: HTMLInputElement[]) { - // If new inputs have been provided, ensure we update the elements array to capture them - this.inputs = Array.from(inputs); - - this.inputs.forEach(input => { - // Disable autocomplete on the form field - input.setAttribute('autocomplete', 'new-password'); - - if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { - // Bind an event listener on the input - this.keyUpFn = this.search.bind(this); - input.addEventListener('keyup', this.keyUpFn); - this.checkTabFn = this.checkTab.bind(this); - input.addEventListener('keydown', this.checkTabFn); - // Set a placeholder for the input - input.setAttribute('placeholder', this.options.placeholderText); - } - - // Bind an event listener on the input to allow users to traverse up and down the picklist using the keyboard - input.addEventListener('keyup', this.handleKeyboardEvent.bind(this)); - }); - - this.countryCodeMapping = this.options.countryCodeMapping || {}; - - // Apply focus to the first input - if (this.options.applyFocus) { - this.inputs[0].focus(); - } - } - - private setCountryList(): void { - // Set the initial country code from either the value of a country list HTML element or a static country code - if (this.options.elements.countryList) { - this.currentCountryCode = this.options.elements.countryList.value; - - // Listen for when a country is changed and call the promptset endpoint - this.options.elements.countryList.addEventListener('change', this.handleCountryListChange.bind(this)); - } else if (this.options.countryCode) { - this.currentCountryCode = this.options.countryCode; - } else { - throw new Error('Please provide a country code or a country list element'); - } - } - - // When a country from the list is changed, update the current country code and call the promptset endpoint again - private handleCountryListChange(): void { - this.currentCountryCode = this.options.elements.countryList.value; - this.getPromptset(); - } - - private generateSearchDataForApiCall(): string { - // If a dataset code hasn't been set yet, try and look it up - if (!this.currentDataSet) { - this.currentDataSet = this.lookupDatasetCode(); - } - - const data = { - country_iso: this.currentCountryCode, - components: {unspecified: [this.currentSearchTerm]}, - datasets: Array.isArray(this.currentDataSet) ? this.currentDataSet : [this.currentDataSet], - max_suggestions: (this.options.maxSuggestions || this.picklist.maxSuggestions) - }; - - if (this.searchType === AddressValidationMode.SINGLELINE || this.searchType === AddressValidationMode.VALIDATE) { - data['options'] = [ - { - name: 'flatten', - Value: 'true' - }, - { - name: 'intensity', - Value: 'close' - }, - { - name: 'prompt_set', - Value: 'default' - } - ]; - - if (this.searchType === AddressValidationMode.SINGLELINE) { - data['options'].push({ - name: 'search_type', - Value: 'singleline' - }); - } - - if (this.searchType === AddressValidationMode.VALIDATE) { - data['layouts'] = ['default']; - data['layout_format'] = 'default'; - } - } - - if (this.options.location) { - data['location'] = this.options.location; - } - return JSON.stringify(data); - } - - // Allow the keyboard to be used to either traverse up and down the picklist and select an item, or trigger a new search - private handleKeyboardEvent(event: KeyboardEvent): void { - event.preventDefault(); - - // Handle keyboard navigation - const key = this.getKey(event); - - // If a picklist is populated then trigger its keyup event to select an item - if (this.picklist.size) { - if (key === 'ArrowUp' || key === 'ArrowDown' || key === 'Enter') { - this.picklist.keyup(event); - return; - } - } else { - // Otherwise, enable pressing 'enter' to trigger a new search - if (key === 'Enter') { - this.search(event); - return; - } - } - } - - // Main function to search for an address from an input string - private search(event: KeyboardEvent): void { - event.preventDefault(); - - this.currentSearchTerm = this.inputs.map(input => input.value).join(','); - - // Grab the country ISO code and (if it is present) the dataset name from the current value of the countryList (format: {countryIsoCode};{dataset}) - const currentCountryInfo = this.countryCodeMapping[this.currentCountryCode] || this.currentCountryCode; - const countryCodeAndDataset = currentCountryInfo.split(';'); - - this.currentCountryCode = countryCodeAndDataset[0]; - if (countryCodeAndDataset[1]) { - this.currentDataSet = countryCodeAndDataset[1]; - } - - // (Re-)set the property stating whether the search input has been reset. - // This is needed for instances when the search input is also an address - // output field. After an address has been returned, you don't want a new - // search being triggered until the field has been cleared. - if (this.currentSearchTerm === '') { - this.hasSearchInputBeenReset = true; - } - - // Check if searching is permitted - if (this.canSearch()) { - // Abort any outstanding requests - if (this.request.currentRequest) { - this.request.currentRequest.abort(); - } - - // Fire an event before a search takes place - this.events.trigger('pre-search', this.currentSearchTerm); - - // Construct the new Search URL and data - const data = this.generateSearchDataForApiCall(); - - // Store the last search term - this.lastSearchTerm = this.currentSearchTerm; - - // Hide the inline search spinner - this.searchSpinner.hide(); - - // Show an inline spinner whilst searching - this.searchSpinner.show(); - - // Set the API URL, headers and callback function depending on the search type - const url = this.baseUrl + (this.searchType === AddressValidationMode.VALIDATE ? this.validateEndpoint : this.searchEndpoint); - const headers = this.searchType === AddressValidationMode.VALIDATE ? [{key: 'Add-Metadata', value: true}] : []; - const callback = this.searchType === AddressValidationMode.VALIDATE ? this.result.handleValidateResponse : this.picklist.show; - - // Initiate new Search request - this.request.send(url, 'POST', callback, data, headers); - } else if (this.lastSearchTerm !== this.currentSearchTerm) { - // Clear the picklist if the search term is cleared/empty - this.picklist.hide(); - } - } - - // Helper method to return a consistent key name - private getKey({key}): string { - switch (key) { - case 'Down': - case 'ArrowDown': - return 'ArrowDown'; - case 'Up': - case 'ArrowUp': - return 'ArrowUp'; - case 'Spacebar': - case ' ': - return ' '; - case 'Escape': - case 'Esc': - return 'Escape'; - default: - return key; - } - } - - private canSearch(): boolean { - // If searching on this instance is enabled, and - return (this.options.enabled && - // If search term is not empty, and - this.currentSearchTerm !== '' && - // If the search term is at least 4 characters - this.currentSearchTerm.length > 3 && - // If search term is not the same as previous search term, and - this.lastSearchTerm !== this.currentSearchTerm && - // If the country is not empty, and - this.currentCountryCode && - // If search input has been reset (if applicable) - this.hasSearchInputBeenReset === true); - } - - private poweredByLogo: PoweredByLogo = { - element: null, - // Create a "Powered by Experian" footer - create(picklist) { - const item = { - text: `${this.svg} Powered by Experian`, - format: '' - }; - const listItem = picklist.createListItem(item); - listItem.classList.add('powered-by-experian'); - picklist.list.parentNode.appendChild(listItem); - return listItem; - }, - // Destroy the "Powered by Experian" footer - destroy(picklist) { - if (this.element) { - picklist.list.parentNode.removeChild(this.element); - this.element = undefined; - } - }, - svg: `` - }; - - private createPicklist() { - // Instantiate a new Picklist class and set the properties below - this.picklist = new Picklist(); - - // Set initial max size - this.picklist.maxSuggestions = 25; - // Tab count used for keyboard navigation - this.picklist.tabCount = -1; - // Render a picklist of search results - - this.picklist.show = (items: SearchResponse) => { - // Store the picklist items - this.picklist.items = items?.result.suggestions; - - // Reset any previously selected current item - this.picklist.currentItem = null; - - // Update picklist size - this.picklist.size = this.picklist.items?.length; - - // Reset the picklist tab count (used for keyboard navigation) - this.picklist.resetTabCount(); - - // Hide the inline search spinner - this.searchSpinner.hide(); - - // Get/Create picklist container element - this.picklist.list = this.picklist.list || this.picklist.createList(); - - // Ensure previous results are cleared - this.picklist.list.innerHTML = ''; - this.picklist.useAddressEntered.destroy(); - - // Fire an event before picklist is created - this.events.trigger('pre-picklist-create', this.picklist.items); - - if (this.picklist.items?.length > 0) { - // If a picklist needs "refining" then prepend a textbox to allow the user to enter their selection - if (this.picklist.refine.isNeeded(items)) { - this.picklist.refine.createInput(items.result.suggestions_prompt, items.result.suggestions_key); - } - - if (this.searchType === AddressValidationMode.VALIDATE) { - this.picklist.displaySuggestionsHeader(); - } - - // Iterate over and show results - this.picklist.items.forEach(item => { - // Create a new item/row in the picklist - const listItem = this.picklist.createListItem(item); - this.picklist.list.appendChild(listItem); - - // Listen for selection on this item - this.picklist.listen(listItem); - }); - - if (this.searchType === AddressValidationMode.VALIDATE) { - this.picklist.displayUseAddressEnteredFooter(); - } - - this.picklist.scrollIntoViewIfNeeded(); - } else { - this.picklist.handleEmptyPicklist(items); - } - - // Add a "Powered by Experian" logo to the picklist footer - this.poweredByLogo.element = this.poweredByLogo.element || this.poweredByLogo.create(this.picklist); - - // Fire an event after picklist is created - this.events.trigger('post-picklist-create', this.picklist.items); - }; - - // Remove the picklist - this.picklist.hide = () => { - // Clear the current picklist item - this.picklist.currentItem = null; - // Remove the "use address entered" option too - this.picklist.useAddressEntered.destroy(); - // Remove the "Powered by Experian" logo - this.poweredByLogo.destroy(this.picklist); - - if (this.inputs) { - // Remove the class denoting a picklist - if Singleline mode is used, then it is the last input field, otherwise use the first one - const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; - this.inputs[position].classList.remove('showing-suggestions'); - } - - // Remove the main picklist container - if (this.picklist.list) { - this.picklist.container.remove(); - this.picklist.list = undefined; - } - }; - - this.picklist.handleEmptyPicklist = (items: SearchResponse) => { - // Create a new item/row in the picklist showing "No matches" that allows the "use address entered" option - this.picklist.useAddressEntered.element = this.picklist.useAddressEntered.element || this.picklist.useAddressEntered.create(items.result?.confidence); - - this.picklist.scrollIntoViewIfNeeded(); - - // Provide implementing search types with a means of invoking a custom callback - if (typeof this.picklist.handleEmptyPicklistCallback === 'function') { - this.picklist.handleEmptyPicklistCallback(); - } - }; - - // Prepend a title before the suggestions - this.picklist.displaySuggestionsHeader = () => { - const titleDiv = (document.querySelector('.picklist-suggestions-header') || document.createElement('div')); - titleDiv.classList.add('picklist-suggestions-header'); - titleDiv.innerText = 'Suggestions:'; - this.picklist.list.parentNode.insertBefore(titleDiv, this.picklist.list); - }; - - // Append a footer at the bottom of the picklist providing an option to "use address entered" - this.picklist.displayUseAddressEnteredFooter = () => { - const containerDiv = document.querySelector('.picklist-use-entered-container') || document.createElement('div'); - containerDiv.classList.add('picklist-use-entered-container'); - this.picklist.list.parentNode.insertBefore(containerDiv, this.picklist.list.nextElementSibling); - - const titleDiv = (document.querySelector('.picklist-use-entered-header') || document.createElement('div')); - titleDiv.classList.add('picklist-use-entered-header'); - titleDiv.innerText = 'Or use address entered:'; - containerDiv.appendChild(titleDiv); - - const itemDiv = (document.querySelector('.picklist-use-entered-option') || document.createElement('div')); - itemDiv.classList.add('picklist-use-entered-option'); - itemDiv.innerText = this.currentSearchTerm.replace(/,+/g, ', '); - itemDiv.addEventListener('click', this.picklist.useAddressEntered.click); - containerDiv.appendChild(itemDiv); - }; - - // If the picklist container is out of bounds to the top or bottom, then scroll it into view - this.picklist.scrollIntoViewIfNeeded = () => { - const outOfBoundsTop = this.picklist.container.getBoundingClientRect().top < 0; - const outOfBoundsBottom = this.picklist.container.getBoundingClientRect().bottom > window.innerHeight; - - if (outOfBoundsTop || outOfBoundsBottom) { - this.picklist.container.scrollIntoView(); - } - }; - - this.picklist.useAddressEntered = { - element: null, - // Create a "use address entered" option - create: (confidence: string) => { - const item = { - text: `${confidence} ${this.options.useAddressEnteredText}` - }; - const listItem = this.picklist.createListItem(item); - listItem.classList.add('use-address-entered'); - listItem.setAttribute('title', 'Enter address manually'); - this.picklist.list = this.picklist.list || this.picklist.createList(); - this.picklist.list.parentNode.insertBefore(listItem, this.picklist.container.firstChild); - listItem.addEventListener('click', this.picklist.useAddressEntered.click); - return listItem; - }, - // Destroy the "use address entered" option - destroy: () => { - if (this.picklist.useAddressEntered.element) { - this.picklist.list.parentNode.removeChild(this.picklist.useAddressEntered.element); - this.picklist.useAddressEntered.element = undefined; - } - }, - // Use the address entered as the Formatted address - click: () => { - const inputData = { - result: { - confidence: 'No matches', - address: { - address_line_1: '', - address_line_2: '', - address_line_3: '', - locality: '', - region: '', - postal_code: '', - country: '' - } - } - }; - - if (this.currentSearchTerm) { - // Try and split into lines by using comma delimiter - const lines = this.currentSearchTerm.split(','); - if (lines[0]) { - inputData.result.address.address_line_1 = lines[0]; - } - if (lines[1]) { - inputData.result.address.address_line_2 = lines[1]; - } - if (lines[2]) { - inputData.result.address.address_line_3 = lines[2]; - } - for (let i = 3; i < lines.length; i++) { - inputData.result.address.address_line_3 += lines[i]; - } - } - - this.result.show(inputData); - this.result.updateHeading(this.options.formattedAddressContainer.manualHeadingText); - }, - // Create and return an address line object with the key as the label - formatManualAddressLine: function (lines, i) { - const key = defaults.addressLineLabels[i]; - const lineObject = {}; - lineObject[key] = lines[i] || ''; - return lineObject; - } - }; - - // Create the picklist list (and container) and inject after the input - this.picklist.createList = () => { - // If Singleline mode is used, then append the picklist after the last input field, otherwise use the first one - const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; - - const container = document.createElement('div'); - container.classList.add('address-picklist-container'); - this.picklist.container = container; - - // Insert the picklist container after the input - this.inputs[position].parentNode.insertBefore(this.picklist.container, this.inputs[position].nextElementSibling); - - const list = document.createElement('div'); - list.classList.add('address-picklist'); - // Append the picklist to the inner wrapper - this.picklist.container.appendChild(list); - - // Add a class to the input to denote that a picklist with suggestions is being shown - this.inputs[position].classList.add('showing-suggestions'); - - list.addEventListener('keydown', this.picklist.checkEnter); - return list; - }; - - // Create a new picklist item/row - this.picklist.createListItem = (item: PicklistItem) => { - const row = document.createElement('div'); - row.innerHTML = this.picklist.addMatchingEmphasis(item); - - // Store the Format URL if it exists, otherwise use the global_address_key as a "refinement" property - if (item.format) { - row.setAttribute('format', item.format); - } else if (item.global_address_key) { - row.setAttribute('refine', item.global_address_key); - } - return row; - }; - - this.picklist.refine = { - element: null, - // Returns whether the picklist needs refining. This happens after an item has been "stepped into" but has an unresolvable range. - // The user is prompted to enter their selection (e.g. building number). - isNeeded: (response: SearchResponse) => { - return this.searchType !== AddressValidationMode.AUTOCOMPLETE && (response.result.confidence === 'Premises partial' || response.result.confidence === 'Street partial' || response.result.confidence === 'Multiple matches'); - }, - createInput: (prompt: string, key: string) => { - const row = document.querySelector('.picklist-refinement-box') || document.createElement('div'); - row.classList.add('picklist-refinement-box'); - - const input = (document.querySelector('.picklist-refinement-box input') || document.createElement('input')); - input.setAttribute('type', 'text'); - input.setAttribute('placeholder', prompt); - input.setAttribute('key', key); - input.setAttribute('autocomplete', 'new-password'); - input.addEventListener('keydown', this.picklist.refine.enter.bind(this)); - this.picklist.refine.element = input; - - const button = (document.querySelector('.picklist-refinement-box button') || document.createElement('button')); - button.innerText = 'Refine'; - button.addEventListener('click', this.picklist.refine.enter); - - row.appendChild(input); - row.appendChild(button); - this.picklist.list.parentNode.insertBefore(row, this.picklist.list); - - input.focus(); - }, - enter: (event: Event) => { - // Allow a new refinement entry if the enter key was used inside the textbox or the button was clicked - if ((event instanceof KeyboardEvent && event.key === 'Enter') || event instanceof MouseEvent) { - event.preventDefault(); - - // If a picklist item is currently selected, then potentially use this instead of what's in the input field - if (this.picklist.currentItem) { - this.picklist.checkEnter(event as KeyboardEvent); - return; - } - - event.stopPropagation(); - - // Take the value from the input field and use this to further refine the address - if (this.picklist.refine.element.value) { - const data = JSON.stringify({refinement: this.picklist.refine.element.value}); - const key = this.picklist.refine.element.getAttribute('key'); - this.request.send(`${this.baseUrl}${this.refineEndpoint}/${key}`, 'POST', this.result.handleValidateResponse, data); - } - } else if (this.picklist.size && event instanceof KeyboardEvent && (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'Enter')) { - this.picklist.keyup(event); - } - } - }; - - this.picklist.resetTabCount = () => { - this.picklist.tabCount = -1; - }; - - // Keyboard navigation - this.picklist.keyup = (event: KeyboardEvent) => { - if (!this.picklist.list) { - return; - } - - this.picklist.checkEnter(event); - - // Get a list of all the addresses in the picklist - const addresses = this.picklist.list.querySelectorAll('div'); - let firstAddress; - let lastAddress; - - // If the picklist is empty, just return - if (addresses.length === 0) { - return; - } - - // Set the tabCount based on previous and direction - if (event.key === 'ArrowUp') { - this.picklist.tabCount--; - } - else if (event.key === 'ArrowDown') { - this.picklist.tabCount++; - } - - // Set top and bottom positions and enable wrap-around - if (this.picklist.tabCount < 0) { - this.picklist.tabCount = addresses.length - 1; - lastAddress = true; - } - if (this.picklist.tabCount > addresses.length - 1) { - this.picklist.tabCount = 0; - firstAddress = true; - } - - // Highlight the selected address - const currentlyHighlighted = addresses[this.picklist.tabCount]; - // Remove any previously highlighted ones - const previouslyHighlighted = this.picklist.list.querySelector('.selected'); - if (previouslyHighlighted) { - previouslyHighlighted.classList.remove('selected'); - } - currentlyHighlighted.classList.add('selected'); - // Set the currentItem on the picklist to the currently highlighted address - this.picklist.currentItem = currentlyHighlighted; - - // Scroll address into view, if required - const addressListCoords = { - top: this.picklist.list.offsetTop, - bottom: this.picklist.list.offsetTop + this.picklist.list.offsetHeight, - scrollTop: this.picklist.list.scrollTop, - selectedTop: currentlyHighlighted.offsetTop, - selectedBottom: currentlyHighlighted.offsetTop + currentlyHighlighted.offsetHeight, - scrollAmount: currentlyHighlighted.offsetHeight - }; - if (firstAddress) { - this.picklist.list.scrollTop = 0; - } - else if (lastAddress) { - this.picklist.list.scrollTop = 999; - } - else if (addressListCoords.selectedBottom + addressListCoords.scrollAmount > addressListCoords.bottom) { - this.picklist.list.scrollTop = addressListCoords.scrollTop + addressListCoords.scrollAmount; - } - else if (addressListCoords.selectedTop - addressListCoords.scrollAmount - addressListCoords.top < addressListCoords.scrollTop) { - this.picklist.list.scrollTop = addressListCoords.scrollTop - addressListCoords.scrollAmount; - } - }; - - // Add emphasis to the picklist items highlighting the match - this.picklist.addMatchingEmphasis = function (item) { - const highlights = item.matched || []; - let label = item.text; - for (let i = 0; i < highlights.length; i++) { - const replacement = '' + label.substring(highlights[i][0], highlights[i][1]) + ''; - label = label.substring(0, highlights[i][0]) + replacement + label.substring(highlights[i][1]); - } - - return label; - }; - - // Listen to a picklist selection - this.picklist.listen = (row) => { - row.addEventListener('click', this.picklist.pick.bind(null, row)); - }; - - this.picklist.checkEnter = (event: KeyboardEvent) => { - if (event.key === 'Enter' || event.key === 'Tab') { - let picklistItem; - // If picklist contains 1 address then use this one to format - if (this.picklist.size === 1) { - picklistItem = this.picklist.list.querySelectorAll('div')[0]; - } // Else use the currently highlighted one when navigation using keyboard - else if (this.picklist.currentItem) { - picklistItem = this.picklist.currentItem; - } - if (picklistItem) { - this.picklist.pick(picklistItem); - } - } - }; - - // How to handle a picklist selection - this.picklist.pick = (item) => { - // Fire an event when an address is picked - this.events.trigger('post-picklist-selection', item); - - // Get a final address using picklist item unless it needs refinement - if (item.getAttribute('format')) { - this.format(item.getAttribute('format')); - } else { - this.refine(item.getAttribute('refine')); - } - }; - } - - private format(url: string) { - // Trigger an event - this.events.trigger('pre-formatting-search', url); - - // Hide the searching spinner - this.searchSpinner.hide(); - - // Initiate a new Format request - this.request.send(url, 'GET', this.result.show, undefined, [{key: 'Add-Metadata', value: true}/*, {key: 'Add-Components', value: true}*/]); - } - - private refine(key: string) { - // Trigger an event - this.events.trigger('pre-refinement', key); - - // Hide the searching spinner - this.searchSpinner.hide(); - - // Initiate a new Step-in request using the global address key - this.request.send(`${this.baseUrl}${this.stepInEndpoint}/${key}`, 'GET', this.picklist.show); - } - - private result: AddressValidationResult = { - formattedAddressContainer: null, - lastAddressField: null, - generateAddressLineRequired: false, - // Render a Formatted address - show: (data: SearchResponse) => { - // Hide the inline search spinner - this.searchSpinner.hide(); - - // Hide the picklist - this.picklist.hide(); - - // Clear the previous search term - this.lastSearchTerm = ''; - - // Allow Autocomplete through as it will need to create the additional output fields for the final address. - // Otherwise, only render the final address if there are results available. - if (this.searchType === AddressValidationMode.AUTOCOMPLETE || (data.result.address && data.result.confidence !== 'No matches')) { - - // Clear search input(s) - this.inputs.forEach(input => input.value = ''); - - // Calculate if we needed to generate the formatted address input fields later - this.result.calculateIfAddressLineGenerationRequired(); - - // Get formatted address container element - // Only create a container if we're creating inputs. Otherwise the user will have their own container. - this.result.formattedAddressContainer = this.options.elements.formattedAddressContainer; - if (!this.result.formattedAddressContainer && this.result.generateAddressLineRequired) { - this.result.createFormattedAddressContainer(); - } - - // Loop over each formatted address component - for (let i = 0; i < Object.keys(data.result.address).length; i++) { - const key = Object.keys(data.result.address)[i]; - const addressComponent = data.result.address[key]; - // Bind the address element to the user's address field (or create a new one) - this.result.updateAddressLine(key, addressComponent, 'address-line-input'); - } - - // Hide country and address search fields (if they have a 'toggle' class) - this.toggleSearchInputs('hide'); - - // Enable users to search again subsequently - this.hasSearchInputBeenReset = true; - - // If an address line is also the main search input, set property to false. - // This ensures that typing in the field again (after an address has been - // returned) will not trigger a new search. - if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { - for (const element in this.options.elements) { - if (Object.prototype.hasOwnProperty.call(this.options.elements, element)) { - // Excluding the input itself, does another element match the input field? - if (element !== 'input' && this.options.elements[element] === this.inputs[0]) { - this.hasSearchInputBeenReset = false; - break; - } - } - } - } - - // Create the 'Search again' link and insert into DOM - this.result.createSearchAgainLink(); - } - - // Fire an event to say we've got the formatted address - this.events.trigger('post-formatting-search', data); - }, - hide: () => { - // Delete the formatted address container - if (this.result.formattedAddressContainer) { - this.result.formattedAddressContainer.parentNode.removeChild(this.result.formattedAddressContainer); - this.result.formattedAddressContainer = undefined; - } - // Delete the search again link - if (this.options.searchAgain.link) { - this.options.searchAgain.link.parentNode.removeChild(this.options.searchAgain.link); - this.options.searchAgain.link = undefined; - } - // Remove previous value from user's result field - // Loop over their elements - for (const element in this.options.elements) { - if (Object.prototype.hasOwnProperty.call(this.options.elements, element)) { - // If it matches an "address" element - for (let i = 0; i < defaults.addressLineLabels.length; i++) { - const label = defaults.addressLineLabels[i]; - // Only reset the value if it's not an input field - if (label === element && this.options.elements[element] !== this.inputs[0]) { - this.options.elements[element].value = ''; - break; - } - } - } - } - }, - createAddressLine: { - // Create an input to store the address line - input: (key: string, value: string, className: string) => { - // Create a wrapper - const div = document.createElement('div'); - div.classList.add(className); - - // Create the label - const label = document.createElement('label'); - label.innerHTML = key.replace(/([A-Z])/g, ' $1') // Add space before capital Letters - .replace(/([0-9])/g, ' $1') // Add space before numbers - .replace(/^./, function (str) {return str.toUpperCase();}); // Make first letter of word a capital letter - div.appendChild(label); - - // Create the input - const input = document.createElement('input'); - input.setAttribute('type', 'text'); - input.setAttribute('name', key); - input.setAttribute('value', value); - div.appendChild(input); - return div; - }, - // Create the address line label based on the country and language - label: (key: string) => { - let label = key; - const language = this.options.language.toLowerCase(); - const country = this.currentCountryCode.toLowerCase(); - if (translations) { - try { - const translatedLabel = translations[language][country][key]; - if (translatedLabel) { - label = translatedLabel; - } - } catch (e) { - // Translation doesn't exist for key - } - } - return label; - } - }, - // Create the formatted address container and inject after the input - createFormattedAddressContainer: () => { - const container = document.createElement('div'); - container.classList.add('formatted-address'); - - // If Singleline mode is used, then append the formatted address after the last input field, otherwise use the first one - const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; - - // Insert the container after the input - this.inputs[position].parentNode.insertBefore(container, this.inputs[position].nextSibling); - this.result.formattedAddressContainer = container; - }, - // Create a heading for the formatted address container - createHeading: () => { - // Create a heading for the formatted address - if (this.options.formattedAddressContainer.showHeading) { - const heading = document.createElement(this.options.formattedAddressContainer.headingType); - heading.innerHTML = this.options.formattedAddressContainer.validatedHeadingText; - this.result.formattedAddressContainer.appendChild(heading); - } - }, - // Update the heading text in the formatted address container - updateHeading: (text) => { - //Change the heading text to "Manual address entered" - if (this.options.formattedAddressContainer.showHeading) { - const heading = this.result.formattedAddressContainer.querySelector(this.options.formattedAddressContainer.headingType); - heading.innerHTML = text; - } - }, - calculateIfAddressLineGenerationRequired: () => { - this.result.generateAddressLineRequired = true; - for (let i = 0; i < defaults.addressLineLabels.length; i++) { - const key = defaults.addressLineLabels[i]; - if (this.options.elements[key]) { - this.result.generateAddressLineRequired = false; - break; - } - } - }, - updateAddressLine: (key: string, addressLineObject, className: string) => { - // Either append the result to the user's address field or create a new field for them - if (this.options.elements[key]) { - const addressField = this.options.elements[key]; - this.result.updateLabel(key); - let value = addressLineObject; - // If a value is already present, prepend a comma and space - if (addressField.value && value) { - value = ', ' + value; - } - // Decide what property of the node we need to update. i.e. if it's not a form field, update the innerText. - if (addressField.nodeName === 'INPUT' || addressField.nodeName === 'TEXTAREA' || addressField.nodeName === 'SELECT') { - addressField.value += value; - } else { - addressField.innerText += value; - } - // Store a record of their last address field - this.result.lastAddressField = addressField; - } else if (this.result.generateAddressLineRequired) { - // Create an input to store the address line - const label = this.result.createAddressLine.label(key); - const field = this.result.createAddressLine.input(label, addressLineObject, className); - // Insert into DOM - this.result.formattedAddressContainer.appendChild(field); - } - }, - // Update the label if translation is present - updateLabel: (key: string) => { - let label = key; - const language = this.options.language.toLowerCase(); - const country = this.currentCountryCode.toLowerCase(); - if (translations) { - try { - const translatedLabel = translations[language][country][key]; - if (translatedLabel) { - label = translatedLabel; - const labels = document.getElementsByTagName('label'); - for (let i = 0; i < labels.length; i++) { - if (labels[i].htmlFor === key) { - labels[i].innerHTML = translatedLabel; - } - } - } - } catch (e) { - // Translation doesn't exist for key - } - } - return label; - }, - // Create the 'Search again' link that resets the search - createSearchAgainLink: () => { - if (this.options.searchAgain.visible) { - const link = document.createElement('button'); - link.setAttribute('type', 'button'); - link.classList.add('search-again-button'); - link.innerText = this.options.searchAgain.text; - // Bind event listener - link.addEventListener('click', this.globalReset.bind(this)); - // Store a reference to the link element - this.options.searchAgain.link = link; - - // Insert into the formatted address container - if (this.result.formattedAddressContainer) { - this.result.formattedAddressContainer.appendChild(link); - } else if (this.result.lastAddressField) { - // Insert after last address field - this.result.lastAddressField.parentNode.insertBefore(link, this.result.lastAddressField.nextSibling); - } - } - }, - // Write the list of hidden address line inputs to the DOM - renderInputList: (inputArray) => { - if (inputArray.length > 0) { - for (let i = 0; i < inputArray.length; i++) { - this.result.formattedAddressContainer.appendChild(inputArray[i]); - } - } - }, - // Decide whether to either show a picklist or a verified result from a Validate response - handleValidateResponse: (response: SearchResponse) => { - if (response.result.confidence === 'Verified match') { - // If the response contains an address, then use this directly in the result - if (response.result.address) { - this.result.show(response); - } else if (response.result.suggestions) { - // If the verified match still contains a suggestion, then we need to format this first - this.format(response.result.suggestions[0].format); - } - } else if (response.result.suggestions) { - // If the user needs to pick a suggestion, then display the picklist - this.picklist.show(response); - } else if (response.result.confidence === 'No matches') { - // If there are no matches, then allow "use address entered" - this.picklist.handleEmptyPicklist(response); - } - } - }; - - private checkTab(event: KeyboardEvent): void { - const key = this.getKey(event); - if (key === 'Tab') { - this.picklist.keyup(event); - return; - } else if (key === 'Enter') { - // Prevent an 'Enter' keypress on the input submitting the form - event.preventDefault(); - } - } - - private searchSpinner = { - show: () => { - // Return if we're not displaying a spinner - if (!this.options.useSpinner) { - return; - } - // Create the spinner container - const spinnerContainer = document.createElement('div'); - spinnerContainer.classList.add('loader'); - spinnerContainer.classList.add('loader-inline'); - - // Create the spinner - const spinner = document.createElement('div'); - spinner.classList.add('spinner'); - spinnerContainer.appendChild(spinner); - - // Insert the spinner after the field - this.inputs[0].parentNode?.insertBefore(spinnerContainer, this.inputs[0].nextSibling); - }, - - hide: () => { - // Return if we're not displaying a spinner - if (!this.options.useSpinner) { - return; - } - const spinner = this.inputs[0].parentNode?.querySelector('.loader-inline'); - if (spinner) { - this.inputs[0].parentNode?.removeChild(spinner); - } - } - }; - - // Toggle the "hidden" class to either show or hide the input and country field(s) - private toggleSearchInputs(state: 'show' | 'hide') { - const modifier = state === 'show' ? 'remove' : 'add'; - this.options.elements.inputs?.forEach(input => input.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden'))); - this.options.elements.countryList?.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden')); - this.options.elements.lookupButton?.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden')); - } - - private globalReset(event?) { - if (event) { - event.preventDefault(); - } - // Enable searching - this.options.enabled = true; - // Hide formatted address - this.result.hide(); - // Reset search input back - this.hasSearchInputBeenReset = true; - - // Clear the input field(s) - this.inputs.forEach(input => input.value = ''); - // Remove the picklist (if present) - this.picklist.hide(); - // Show search input - this.toggleSearchInputs('show'); - // Apply focus to input - this.inputs[0].focus(); - - // Fire an event after a reset - this.events.trigger('post-reset'); - } -} +import EventFactory from './event-factory'; +import Request from './request'; +import { AddressSearchOptions, AddressValidationMode, defaults } from './search-options'; +import { datasetCodes } from './datasets-codes'; +import { translations } from './translations'; +import { AddressValidationResult, LookupAddress, LookupV2Response, LookupW3WResponse, Picklist, PicklistItem, PoweredByLogo, SearchResponse, What3WordsPickList } from './class-types'; + +export default class AddressValidation { + public options: AddressSearchOptions; + public searchType: AddressValidationMode; + public events; + public request: Request; + + private baseUrl = 'https://api.experianaperture.io/'; + private searchEndpoint = 'address/search/v1'; + private lookupEndpoint = 'address/lookup/v2'; + private validateEndpoint = 'address/validate/v1'; + private promptsetEndpoint = 'address/promptsets/v1'; + private stepInEndpoint = 'address/suggestions/stepin/v1'; + private refineEndpoint = 'address/suggestions/refine/v1'; + private enrichmentEndpoint = 'enrichment/v2'; + + private what3WordCountries = ['GBR']; + private what3WordsKeyword = 'what3words'; + + private picklist: Picklist; + private inputs: HTMLInputElement[]; + private lastSearchTerm: string; + private currentSearchTerm: string; + private currentCountryCode: string; + private currentDataSet: string | string[]; + private hasSearchInputBeenReset: boolean; + private countryCodeMapping; + private lookupFn; + private keyUpFn; + private checkTabFn; + private isWhat3Words: boolean; + + constructor(options: AddressSearchOptions) { + this.options = this.mergeDefaultOptions(options); + + this.events = new EventFactory(); + + this.setup(); + } + + public setToken(token: string): void { + this.options.token = token; + this.setup(); + } + + public setSearchType(searchType: AddressValidationMode): void { + this.searchType = searchType; + this.globalReset(); + this.setInputs(); + this.events.trigger('post-search-type-change', searchType); + } + + public getEnrichmentData(globalAddressKey: string) { + if (globalAddressKey) { + const data = { + country_iso: this.currentCountryCode, + keys: { + global_address_key: globalAddressKey + }, + attributes: { + geocodes: ['latitude', 'longitude', 'match_level'] + } + }; + this.events.trigger('pre-enrichment'); + this.request.send(this.baseUrl + this.enrichmentEndpoint, 'POST', this.handleEnrichmentResult.bind(this), JSON.stringify(data)); + } + } + + private setup(): void { + // Get token and proceed if it's present + if (this.token) { + this.hasSearchInputBeenReset = true; + + // Instantiate a new Request class for use when making API calls + this.request = new Request(this); + + // Set the country list + this.setCountryList(); + + // Set the input fields for this search type + this.setInputs(); + + // Setup a picklist object + this.createPicklist(); + } else { + // Trigger a 401 Unauthorized event if a token does not exist + setTimeout(() => this.events.trigger('request-error-401')); + } + } + + private handleEnrichmentResult(response) { + this.events.trigger('post-enrichment', response); + } + + private getParameter(name): string { + name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]'); + const regex = new RegExp('[\\?&]' + name + '=([^&#]*)'), + results = regex.exec(location.search); + return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); + } + + // Try and get token from the query string if it's not already provided + private get token(): string { + if (!this.options.token) { + this.options.token = this.getParameter('token'); + } + return this.options.token; + } + + private mergeDefaultOptions(customOptions): AddressSearchOptions { + const instance: AddressSearchOptions = customOptions || {}; + + instance.enabled = true; + this.searchType = instance.searchType || defaults.searchType; + instance.enableWhat3Words = instance.enableWhat3Words || defaults.enableWhat3Words; + instance.searchType = instance.searchType || defaults.searchType; + instance.language = instance.language || defaults.language; + instance.useSpinner = instance.useSpinner || defaults.useSpinner; + instance.applyFocus = (typeof instance.applyFocus !== 'undefined') ? instance.applyFocus : defaults.input.applyFocus; + instance.placeholderText = instance.placeholderText || defaults.input.placeholderText; + instance.searchAgain = instance.searchAgain || {}; + instance.searchAgain.visible = (typeof instance.searchAgain.visible !== 'undefined') ? instance.searchAgain.visible : defaults.searchAgain.visible; + instance.searchAgain.text = instance.searchAgain.text || defaults.searchAgain.text; + instance.formattedAddressContainer = instance.formattedAddressContainer || defaults.formattedAddressContainer; + instance.formattedAddressContainer.showHeading = (typeof instance.formattedAddressContainer.showHeading !== 'undefined') ? instance.formattedAddressContainer.showHeading : defaults.formattedAddressContainer.showHeading; + instance.formattedAddressContainer.headingType = instance.formattedAddressContainer.headingType || defaults.formattedAddressContainer.headingType; + instance.formattedAddressContainer.validatedHeadingText = instance.formattedAddressContainer.validatedHeadingText || defaults.formattedAddressContainer.validatedHeadingText; + instance.formattedAddressContainer.manualHeadingText = instance.formattedAddressContainer.manualHeadingText || defaults.formattedAddressContainer.manualHeadingText; + instance.useAddressEnteredText = instance.useAddressEnteredText || defaults.useAddressEnteredText; + instance.elements = instance.elements || {}; + + return instance; + } + + private getPromptset(): void { + if (this.currentCountryCode) { + // Using the country code and the search type, lookup what the relevant dataset code should be + this.currentDataSet = this.lookupDatasetCode(); + if (this.currentDataSet) { + + /// Temporary measure until the promptset endpoint supports Autocomplete and Validate + if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { + setTimeout(() => this.handlePromptsetResult({ result: { lines: [{ example: this.options.placeholderText, prompt: 'Address', suggested_input_length: 160 }] } })); + return; + } else if (this.searchType === AddressValidationMode.VALIDATE) { + const lines = [ + { prompt: 'Address line 1', suggested_input_length: 160 }, + { prompt: 'Address line 2', suggested_input_length: 160 }, + { prompt: 'Address line 3', suggested_input_length: 160 }, + { prompt: this.result.createAddressLine.label('locality'), suggested_input_length: 160 }, + { prompt: this.result.createAddressLine.label('region'), suggested_input_length: 160 }, + { prompt: this.result.createAddressLine.label('postal_code'), suggested_input_length: 160 } + ]; + setTimeout(() => this.handlePromptsetResult({ result: { lines } })); + return; + } + + const data = { + country_iso: this.currentCountryCode, + datasets: Array.isArray(this.currentDataSet) ? this.currentDataSet : [this.currentDataSet], + search_type: this.searchType, + prompt_set: 'optimal' + }; + this.events.trigger('pre-promptset-check'); + this.request.send(this.baseUrl + this.promptsetEndpoint, 'POST', this.handlePromptsetResult.bind(this), JSON.stringify(data)); + } + } + } + + private lookupDatasetCode(): string | string[] { + const item = datasetCodes.find(dataset => dataset.iso3Code === this.currentCountryCode && dataset.searchType.includes(this.searchType)); + if (item) { + return item.datasetCode; + } + } + + private handlePromptsetResult(response): void { + // Remove any currently displayed picklist when the promptset changes + this.picklist.hide(); + + // Trigger a new event to notify subscribers + this.events.trigger('post-promptset-check', response); + } + + public setInputs(inputs = this.options.elements.inputs): void { + // If address inputs exist then register these with event listeners, otherwise call the promptset endpoint to retrieve them + if (inputs) { + this.registerInputs(inputs); + } else { + // Make an API call to get the promptset for this country/dataset/engine + this.getPromptset(); + } + + if (this.searchType === AddressValidationMode.SINGLELINE || this.searchType === AddressValidationMode.VALIDATE) { + // Bind an event listener on the lookup button + if (this.options.elements.lookupButton) { + this.lookupFn = this.search.bind(this); + this.options.elements.lookupButton.addEventListener('click', this.lookupFn); + } + } + } + + private registerInputs(inputs: HTMLInputElement[]) { + // If new inputs have been provided, ensure we update the elements array to capture them + this.inputs = Array.from(inputs); + + this.inputs.forEach(input => { + // Disable autocomplete on the form field + input.setAttribute('autocomplete', 'new-password'); + + if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { + // Bind an event listener on the input + this.keyUpFn = this.search.bind(this); + input.addEventListener('keyup', this.keyUpFn); + this.checkTabFn = this.checkTab.bind(this); + input.addEventListener('keydown', this.checkTabFn); + // Set a placeholder for the input + input.setAttribute('placeholder', this.options.placeholderText); + } + + // Bind an event listener on the input to allow users to traverse up and down the picklist using the keyboard + input.addEventListener('keyup', this.handleKeyboardEvent.bind(this)); + }); + + this.countryCodeMapping = this.options.countryCodeMapping || {}; + + // Apply focus to the first input + if (this.options.applyFocus) { + this.inputs[0].focus(); + } + } + + private setCountryList(): void { + // Set the initial country code from either the value of a country list HTML element or a static country code + if (this.options.elements.countryList) { + this.currentCountryCode = this.options.elements.countryList.value; + + // Listen for when a country is changed and call the promptset endpoint + this.options.elements.countryList.addEventListener('change', this.handleCountryListChange.bind(this)); + } else if (this.options.countryCode) { + this.currentCountryCode = this.options.countryCode; + } else { + throw new Error('Please provide a country code or a country list element'); + } + } + + // When a country from the list is changed, update the current country code and call the promptset endpoint again + private handleCountryListChange(): void { + this.currentCountryCode = this.options.elements.countryList.value; + this.getPromptset(); + } + + private generateSearchDataForApiCall(): string { + // If a dataset code hasn't been set yet, try and look it up + if (!this.currentDataSet) { + this.currentDataSet = this.lookupDatasetCode(); + } + + const data = { + country_iso: this.currentCountryCode, + components: { unspecified: [this.currentSearchTerm] }, + datasets: Array.isArray(this.currentDataSet) ? this.currentDataSet : [this.currentDataSet], + max_suggestions: (this.options.maxSuggestions || this.picklist.maxSuggestions) + }; + + if (this.searchType === AddressValidationMode.SINGLELINE || this.searchType === AddressValidationMode.VALIDATE) { + data['options'] = [ + { + name: 'flatten', + Value: 'true' + }, + { + name: 'intensity', + Value: 'close' + }, + { + name: 'prompt_set', + Value: 'default' + } + ]; + + if (this.searchType === AddressValidationMode.SINGLELINE) { + data['options'].push({ + name: 'search_type', + Value: 'singleline' + }); + } + + if (this.searchType === AddressValidationMode.VALIDATE) { + data['layouts'] = ['default']; + data['layout_format'] = 'default'; + } + } + + if (this.options.location) { + data['location'] = this.options.location; + } + return JSON.stringify(data); + } + + private generateLookupDataForApiCall(input: string, shouldGetSuggestions: boolean): string { + // If a dataset code hasn't been set yet, try and look it up + if (!this.currentDataSet) { + this.currentDataSet = this.lookupDatasetCode(); + } + + const data = { + country_iso: this.currentCountryCode, + datasets: Array.isArray(this.currentDataSet) ? this.currentDataSet : [this.currentDataSet], + max_suggestions: (this.options.maxSuggestions || this.picklist.maxSuggestions), + key: { + type: this.what3WordsKeyword, + value: this.getWhat3WordsLookupValue(input, shouldGetSuggestions), + } + }; + + return JSON.stringify(data); + } + + private getWhat3WordsLookupValue(input: string, shouldGetSuggestions: boolean): string { + if (input.startsWith('///') && shouldGetSuggestions) { + input = input.slice(3); + } + + return input; + } + + // Allow the keyboard to be used to either traverse up and down the picklist and select an item, or trigger a new search + private handleKeyboardEvent(event: KeyboardEvent): void { + event.preventDefault(); + + // Handle keyboard navigation + const key = this.getKey(event); + + // If a picklist is populated then trigger its keyup event to select an item + if (this.picklist.size) { + if (key === 'ArrowUp' || key === 'ArrowDown' || key === 'Enter') { + this.picklist.keyup(event); + return; + } + } else { + // Otherwise, enable pressing 'enter' to trigger a new search + if (key === 'Enter') { + this.search(event); + return; + } + } + } + + // Main function to search for an address from an input string + private search(event: KeyboardEvent): void { + event.preventDefault(); + + this.currentSearchTerm = this.inputs.map(input => input.value).join(','); + + // Grab the country ISO code and (if it is present) the dataset name from the current value of the countryList (format: {countryIsoCode};{dataset}) + const currentCountryInfo = this.countryCodeMapping[this.currentCountryCode] || this.currentCountryCode; + const countryCodeAndDataset = currentCountryInfo.split(';'); + + this.currentCountryCode = countryCodeAndDataset[0]; + if (countryCodeAndDataset[1]) { + this.currentDataSet = countryCodeAndDataset[1]; + } + + // (Re-)set the property stating whether the search input has been reset. + // This is needed for instances when the search input is also an address + // output field. After an address has been returned, you don't want a new + // search being triggered until the field has been cleared. + if (this.currentSearchTerm === '') { + this.hasSearchInputBeenReset = true; + } + + // Check if searching is permitted + if (this.canSearch()) { + // Abort any outstanding requests + if (this.request.currentRequest) { + this.request.currentRequest.abort(); + } + + // Regex that checks if the input is the format for a what3words search. Ex: ///a.b.c + const regex = /^\/{0,}(?:[^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+|[^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3}[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3}[.。。・・︒។։။۔።।][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+([\u0020\u00A0][^0-9`~!@#$%^&*()+\-_=[{\]}\\|'<,.>?/";:£§º©®\s]+){1,3})$/; + + if (regex.test(this.currentSearchTerm) && this.options.enableWhat3Words && this.what3WordCountries.indexOf(this.currentCountryCode) > -1) { + this.isWhat3Words = true; + } + else { + this.isWhat3Words = false; + } + + // Fire an event before a search takes place + this.events.trigger('pre-search', this.currentSearchTerm); + + // Construct the new Search URL and data + const data = this.isWhat3Words ? this.generateLookupDataForApiCall(this.currentSearchTerm, true) : this.generateSearchDataForApiCall(); + + // Store the last search term + this.lastSearchTerm = this.currentSearchTerm; + + // Hide the inline search spinner + this.searchSpinner.hide(); + + // Show an inline spinner whilst searching + this.searchSpinner.show(); + + let url, headers, callback; + // Set the API URL, headers and callback function depending on the search type + if (this.isWhat3Words) { + url = this.baseUrl + this.lookupEndpoint; + headers = []; + callback = this.picklist.showWhat3Words; + } else { + url = this.baseUrl + (this.searchType === AddressValidationMode.VALIDATE ? this.validateEndpoint : this.searchEndpoint); + headers = this.searchType === AddressValidationMode.VALIDATE ? [{ key: 'Add-Metadata', value: true }] : []; + callback = this.searchType === AddressValidationMode.VALIDATE ? this.result.handleValidateResponse : this.picklist.show; + } + + // Initiate new Search request + this.request.send(url, 'POST', callback, data, headers); + + } else if (this.lastSearchTerm !== this.currentSearchTerm) { + // Clear the picklist if the search term is cleared/empty + this.picklist.hide(); + } + } + + // Helper method to return a consistent key name + private getKey({ key }): string { + switch (key) { + case 'Down': + case 'ArrowDown': + return 'ArrowDown'; + case 'Up': + case 'ArrowUp': + return 'ArrowUp'; + case 'Spacebar': + case ' ': + return ' '; + case 'Escape': + case 'Esc': + return 'Escape'; + default: + return key; + } + } + + private canSearch(): boolean { + // If searching on this instance is enabled, and + return (this.options.enabled && + // If search term is not empty, and + this.currentSearchTerm !== '' && + // If the search term is at least 4 characters + this.currentSearchTerm.length > 3 && + // If search term is not the same as previous search term, and + this.lastSearchTerm !== this.currentSearchTerm && + // If the country is not empty, and + this.currentCountryCode && + // If search input has been reset (if applicable) + this.hasSearchInputBeenReset === true); + } + + private poweredByLogo: PoweredByLogo = { + element: null, + // Create a "Powered by Experian" footer + create(picklist) { + const item = { + text: `${this.svg} Powered by Experian`, + format: '' + }; + const listItem = picklist.createListItem(item); + listItem.classList.add('powered-by-experian'); + picklist.list.parentNode.appendChild(listItem); + return listItem; + }, + // Destroy the "Powered by Experian" footer + destroy(picklist) { + if (this.element) { + picklist.list.parentNode.removeChild(this.element); + this.element = undefined; + } + }, + svg: `` + }; + + private createPicklist() { + // Instantiate a new Picklist class and set the properties below + this.picklist = new Picklist(); + + // Set initial max size + this.picklist.maxSuggestions = 25; + // Tab count used for keyboard navigation + this.picklist.tabCount = -1; + // Render a picklist of search results + + this.picklist.show = (items: SearchResponse) => { + // Store the picklist items + this.picklist.items = items?.result.suggestions; + + this.picklist.handleCommonShowPicklistLogic(); + + if (this.picklist.items?.length > 0) { + // If a picklist needs "refining" then prepend a textbox to allow the user to enter their selection + if (this.picklist.refine.isNeeded(items)) { + this.picklist.refine.createInput(items.result.suggestions_prompt, items.result.suggestions_key); + } + + if (this.searchType === AddressValidationMode.VALIDATE) { + this.picklist.displaySuggestionsHeader(); + } + + // Iterate over and show results + this.picklist.items.forEach(item => { + // Create a new item/row in the picklist + const listItem = this.picklist.createListItem(item); + this.picklist.list.appendChild(listItem); + + // Listen for selection on this item + this.picklist.listen(listItem); + }); + + if (this.searchType === AddressValidationMode.VALIDATE) { + this.picklist.displayUseAddressEnteredFooter(); + } + + this.picklist.scrollIntoViewIfNeeded(); + } else { + this.picklist.handleEmptyPicklist(items); + } + + // Add a "Powered by Experian" logo to the picklist footer + this.poweredByLogo.element = this.poweredByLogo.element || this.poweredByLogo.create(this.picklist); + + // Fire an event after picklist is created + this.events.trigger('post-picklist-create', this.picklist.items); + }; + + this.picklist.showWhat3Words = (items: LookupW3WResponse) => { + // Store the picklist items + this.picklist.what3wordsItems = items?.result.suggestions; + + this.picklist.handleCommonShowPicklistLogic(); + + if (this.picklist.what3wordsItems?.length > 0) { + // Iterate over and show results + this.picklist.what3wordsItems.forEach(item => { + // Create a new item/row in the picklist + const listItem = this.picklist.createWhat3WordsListItem(item); + this.picklist.list.appendChild(listItem); + + // Listen for selection on this item + this.picklist.listen(listItem); + }); + + this.picklist.scrollIntoViewIfNeeded(); + } else { + this.picklist.handleEmptyPicklist(items); + } + + // Add a "Powered by Experian" logo to the picklist footer + this.poweredByLogo.element = this.poweredByLogo.element || this.poweredByLogo.create(this.picklist); + + // Fire an event after picklist is created + this.events.trigger('post-picklist-create', this.picklist.items); + }; + + this.picklist.showLookup = (items: LookupV2Response) => { + // Set isWhat3Words to "false" as we are no longer showing what3words addresses + this.isWhat3Words = false; + + // Store the picklist items + this.picklist.lookupItems = items?.result.addresses; + + this.picklist.handleCommonShowPicklistLogic(); + + if (this.picklist.lookupItems?.length > 0) { + // Iterate over and show results + this.picklist.lookupItems.forEach(item => { + // Create a new item/row in the picklist + const listItem = this.picklist.createLookupListItem(item); + this.picklist.list.appendChild(listItem); + + // Listen for selection on this item + this.picklist.listen(listItem); + }); + + this.picklist.scrollIntoViewIfNeeded(); + } else { + this.picklist.handleEmptyPicklist(items); + } + + // Add a "Powered by Experian" logo to the picklist footer + this.poweredByLogo.element = this.poweredByLogo.element || this.poweredByLogo.create(this.picklist); + + // Fire an event after picklist is created + this.events.trigger('post-picklist-create', this.picklist.items); + }; + + this.picklist.handleCommonShowPicklistLogic = () => { + // Reset any previously selected current item + this.picklist.currentItem = null; + + // Update picklist size + this.picklist.size = this.picklist.items?.length; + + // Reset the picklist tab count (used for keyboard navigation) + this.picklist.resetTabCount(); + + // Hide the inline search spinner + this.searchSpinner.hide(); + + // Get/Create picklist container element + this.picklist.list = this.picklist.list || this.picklist.createList(); + + // Ensure previous results are cleared + this.picklist.list.innerHTML = ''; + this.picklist.useAddressEntered.destroy(); + + // Fire an event before picklist is created + this.events.trigger('pre-picklist-create', this.picklist.items); + }; + + // Remove the picklist + this.picklist.hide = () => { + // Clear the current picklist item + this.picklist.currentItem = null; + // Remove the "use address entered" option too + this.picklist.useAddressEntered.destroy(); + // Remove the "Powered by Experian" logo + this.poweredByLogo.destroy(this.picklist); + + if (this.inputs) { + // Remove the class denoting a picklist - if Singleline mode is used, then it is the last input field, otherwise use the first one + const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; + this.inputs[position].classList.remove('showing-suggestions'); + } + + // Remove the main picklist container + if (this.picklist.list) { + this.picklist.container.remove(); + this.picklist.list = undefined; + } + }; + + this.picklist.handleEmptyPicklist = (items: SearchResponse | LookupW3WResponse | LookupV2Response) => { + // Create a new item/row in the picklist showing "No matches" that allows the "use address entered" option + this.picklist.useAddressEntered.element = this.picklist.useAddressEntered.element || this.picklist.useAddressEntered.create(items.result?.confidence); + + this.picklist.scrollIntoViewIfNeeded(); + + // Provide implementing search types with a means of invoking a custom callback + if (typeof this.picklist.handleEmptyPicklistCallback === 'function') { + this.picklist.handleEmptyPicklistCallback(); + } + }; + + // Prepend a title before the suggestions + this.picklist.displaySuggestionsHeader = () => { + const titleDiv = (document.querySelector('.picklist-suggestions-header') || document.createElement('div')); + titleDiv.classList.add('picklist-suggestions-header'); + titleDiv.innerText = 'Suggestions:'; + this.picklist.list.parentNode.insertBefore(titleDiv, this.picklist.list); + }; + + // Append a footer at the bottom of the picklist providing an option to "use address entered" + this.picklist.displayUseAddressEnteredFooter = () => { + const containerDiv = document.querySelector('.picklist-use-entered-container') || document.createElement('div'); + containerDiv.classList.add('picklist-use-entered-container'); + this.picklist.list.parentNode.insertBefore(containerDiv, this.picklist.list.nextElementSibling); + + const titleDiv = (document.querySelector('.picklist-use-entered-header') || document.createElement('div')); + titleDiv.classList.add('picklist-use-entered-header'); + titleDiv.innerText = 'Or use address entered:'; + containerDiv.appendChild(titleDiv); + + const itemDiv = (document.querySelector('.picklist-use-entered-option') || document.createElement('div')); + itemDiv.classList.add('picklist-use-entered-option'); + itemDiv.innerText = this.currentSearchTerm.replace(/,+/g, ', '); + itemDiv.addEventListener('click', this.picklist.useAddressEntered.click); + containerDiv.appendChild(itemDiv); + }; + + // If the picklist container is out of bounds to the top or bottom, then scroll it into view + this.picklist.scrollIntoViewIfNeeded = () => { + const outOfBoundsTop = this.picklist.container.getBoundingClientRect().top < 0; + const outOfBoundsBottom = this.picklist.container.getBoundingClientRect().bottom > window.innerHeight; + + if (outOfBoundsTop || outOfBoundsBottom) { + this.picklist.container.scrollIntoView(); + } + }; + + this.picklist.useAddressEntered = { + element: null, + // Create a "use address entered" option + create: (confidence: string) => { + const item = { + text: `${confidence} ${this.options.useAddressEnteredText}` + }; + const listItem = this.picklist.createListItem(item); + listItem.classList.add('use-address-entered'); + listItem.setAttribute('title', 'Enter address manually'); + this.picklist.list = this.picklist.list || this.picklist.createList(); + this.picklist.list.parentNode.insertBefore(listItem, this.picklist.container.firstChild); + listItem.addEventListener('click', this.picklist.useAddressEntered.click); + return listItem; + }, + // Destroy the "use address entered" option + destroy: () => { + if (this.picklist.useAddressEntered.element) { + this.picklist.list.parentNode.removeChild(this.picklist.useAddressEntered.element); + this.picklist.useAddressEntered.element = undefined; + } + }, + // Use the address entered as the Formatted address + click: () => { + const inputData = { + result: { + confidence: 'No matches', + address: { + address_line_1: '', + address_line_2: '', + address_line_3: '', + locality: '', + region: '', + postal_code: '', + country: '' + } + } + }; + + if (this.currentSearchTerm) { + // Try and split into lines by using comma delimiter + const lines = this.currentSearchTerm.split(','); + if (lines[0]) { + inputData.result.address.address_line_1 = lines[0]; + } + if (lines[1]) { + inputData.result.address.address_line_2 = lines[1]; + } + if (lines[2]) { + inputData.result.address.address_line_3 = lines[2]; + } + for (let i = 3; i < lines.length; i++) { + inputData.result.address.address_line_3 += lines[i]; + } + } + + this.result.show(inputData); + this.result.updateHeading(this.options.formattedAddressContainer.manualHeadingText); + }, + // Create and return an address line object with the key as the label + formatManualAddressLine: function (lines, i) { + const key = defaults.addressLineLabels[i]; + const lineObject = {}; + lineObject[key] = lines[i] || ''; + return lineObject; + } + }; + + // Create the picklist list (and container) and inject after the input + this.picklist.createList = () => { + // If Singleline mode is used, then append the picklist after the last input field, otherwise use the first one + const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; + + const container = document.createElement('div'); + container.classList.add('address-picklist-container'); + this.picklist.container = container; + + // Insert the picklist container after the input + this.inputs[position].parentNode.insertBefore(this.picklist.container, this.inputs[position].nextElementSibling); + + const list = document.createElement('div'); + list.classList.add('address-picklist'); + // Append the picklist to the inner wrapper + this.picklist.container.appendChild(list); + + // Add a class to the input to denote that a picklist with suggestions is being shown + this.inputs[position].classList.add('showing-suggestions'); + + list.addEventListener('keydown', this.picklist.checkEnter); + return list; + }; + + // Create a new picklist item/row + this.picklist.createListItem = (item: PicklistItem) => { + const row = document.createElement('div'); + row.innerHTML = this.picklist.addMatchingEmphasis(item); + + // Store the Format URL if it exists, otherwise use the global_address_key as a "refinement" property + if (item.format) { + row.setAttribute('format', item.format); + } else if (item.global_address_key) { + row.setAttribute('refine', item.global_address_key); + } + return row; + }; + + // Create a new picklist item/row for what3words + this.picklist.createWhat3WordsListItem = (item: What3WordsPickList) => { + const row = document.createElement('div'); + const name = document.createElement('div'); + const description = document.createElement('div'); + + row.className = this.what3WordsKeyword; + name.className = 'what3Words-name'; + description.className = 'what3Words-description'; + + name.innerHTML = '///' + item.what3words.name; + description.innerHTML = item.what3words.description; + + row.appendChild(name); + row.appendChild(description); + + return row; + }; + + + // Create a new picklist item/row for lookup items + this.picklist.createLookupListItem = (item: LookupAddress) => { + const row = document.createElement('div'); + + row.innerHTML = item.text; + + // Store the Format URL if it exists, otherwise use the global_address_key as a "refinement" property + if (item.format) { + row.setAttribute('format', item.format); + } else if (item.global_address_key) { + row.setAttribute('refine', item.global_address_key); + } + return row; + }; + + this.picklist.refine = { + element: null, + // Returns whether the picklist needs refining. This happens after an item has been "stepped into" but has an unresolvable range. + // The user is prompted to enter their selection (e.g. building number). + isNeeded: (response: SearchResponse) => { + return this.searchType !== AddressValidationMode.AUTOCOMPLETE && (response.result.confidence === 'Premises partial' || response.result.confidence === 'Street partial' || response.result.confidence === 'Multiple matches'); + }, + createInput: (prompt: string, key: string) => { + const row = document.querySelector('.picklist-refinement-box') || document.createElement('div'); + row.classList.add('picklist-refinement-box'); + + const input = (document.querySelector('.picklist-refinement-box input') || document.createElement('input')); + input.setAttribute('type', 'text'); + input.setAttribute('placeholder', prompt); + input.setAttribute('key', key); + input.setAttribute('autocomplete', 'new-password'); + input.addEventListener('keydown', this.picklist.refine.enter.bind(this)); + this.picklist.refine.element = input; + + const button = (document.querySelector('.picklist-refinement-box button') || document.createElement('button')); + button.innerText = 'Refine'; + button.addEventListener('click', this.picklist.refine.enter); + + row.appendChild(input); + row.appendChild(button); + this.picklist.list.parentNode.insertBefore(row, this.picklist.list); + + input.focus(); + }, + enter: (event: Event) => { + // Allow a new refinement entry if the enter key was used inside the textbox or the button was clicked + if ((event instanceof KeyboardEvent && event.key === 'Enter') || event instanceof MouseEvent) { + event.preventDefault(); + + // If a picklist item is currently selected, then potentially use this instead of what's in the input field + if (this.picklist.currentItem) { + this.picklist.checkEnter(event as KeyboardEvent); + return; + } + + event.stopPropagation(); + + // Take the value from the input field and use this to further refine the address + if (this.picklist.refine.element.value) { + const data = JSON.stringify({ refinement: this.picklist.refine.element.value }); + const key = this.picklist.refine.element.getAttribute('key'); + this.request.send(`${this.baseUrl}${this.refineEndpoint}/${key}`, 'POST', this.result.handleValidateResponse, data); + } + } else if (this.picklist.size && event instanceof KeyboardEvent && (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'Enter')) { + this.picklist.keyup(event); + } + } + }; + + this.picklist.resetTabCount = () => { + this.picklist.tabCount = -1; + }; + + // Keyboard navigation + this.picklist.keyup = (event: KeyboardEvent) => { + if (!this.picklist.list) { + return; + } + + this.picklist.checkEnter(event); + + // Get a list of all the addresses in the picklist + const addresses = this.picklist.list.querySelectorAll('div'); + let firstAddress; + let lastAddress; + + // If the picklist is empty, just return + if (addresses.length === 0) { + return; + } + + // Set the tabCount based on previous and direction + if (event.key === 'ArrowUp') { + this.picklist.tabCount--; + } + else if (event.key === 'ArrowDown') { + this.picklist.tabCount++; + } + + // Set top and bottom positions and enable wrap-around + if (this.picklist.tabCount < 0) { + this.picklist.tabCount = addresses.length - 1; + lastAddress = true; + } + if (this.picklist.tabCount > addresses.length - 1) { + this.picklist.tabCount = 0; + firstAddress = true; + } + + // Highlight the selected address + const currentlyHighlighted = addresses[this.picklist.tabCount]; + // Remove any previously highlighted ones + const previouslyHighlighted = this.picklist.list.querySelector('.selected'); + if (previouslyHighlighted) { + previouslyHighlighted.classList.remove('selected'); + } + currentlyHighlighted.classList.add('selected'); + // Set the currentItem on the picklist to the currently highlighted address + this.picklist.currentItem = currentlyHighlighted; + + // Scroll address into view, if required + const addressListCoords = { + top: this.picklist.list.offsetTop, + bottom: this.picklist.list.offsetTop + this.picklist.list.offsetHeight, + scrollTop: this.picklist.list.scrollTop, + selectedTop: currentlyHighlighted.offsetTop, + selectedBottom: currentlyHighlighted.offsetTop + currentlyHighlighted.offsetHeight, + scrollAmount: currentlyHighlighted.offsetHeight + }; + if (firstAddress) { + this.picklist.list.scrollTop = 0; + } + else if (lastAddress) { + this.picklist.list.scrollTop = 999; + } + else if (addressListCoords.selectedBottom + addressListCoords.scrollAmount > addressListCoords.bottom) { + this.picklist.list.scrollTop = addressListCoords.scrollTop + addressListCoords.scrollAmount; + } + else if (addressListCoords.selectedTop - addressListCoords.scrollAmount - addressListCoords.top < addressListCoords.scrollTop) { + this.picklist.list.scrollTop = addressListCoords.scrollTop - addressListCoords.scrollAmount; + } + }; + + // Add emphasis to the picklist items highlighting the match + this.picklist.addMatchingEmphasis = function (item) { + const highlights = item.matched || []; + let label = item.text; + for (let i = 0; i < highlights.length; i++) { + const replacement = '' + label.substring(highlights[i][0], highlights[i][1]) + ''; + label = label.substring(0, highlights[i][0]) + replacement + label.substring(highlights[i][1]); + } + + return label; + }; + + // Listen to a picklist selection + this.picklist.listen = (row) => { + row.addEventListener('click', this.picklist.pick.bind(null, row)); + }; + + this.picklist.checkEnter = (event: KeyboardEvent) => { + if (event.key === 'Enter' || event.key === 'Tab') { + let picklistItem; + // If picklist contains 1 address then use this one to format + if (this.picklist.size === 1) { + picklistItem = this.picklist.list.querySelectorAll('div')[0]; + } // Else use the currently highlighted one when navigation using keyboard + else if (this.picklist.currentItem) { + picklistItem = this.picklist.currentItem; + } + if (picklistItem) { + this.picklist.pick(picklistItem); + } + } + }; + + // How to handle a picklist selection + this.picklist.pick = (item) => { + // Fire an event when an address is picked + this.events.trigger('post-picklist-selection', item); + + const elements = item.getElementsByTagName('div'); + + if (this.isWhat3Words) { + this.lookup(elements[0].innerHTML); + } + else { + // Get a final address using picklist item unless it needs refinement + if (item.getAttribute('format')) { + this.format(item.getAttribute('format')); + } else { + this.refine(item.getAttribute('refine')); + } + } + }; + } + + private format(url: string) { + // Trigger an event + this.events.trigger('pre-formatting-search', url); + + // Hide the searching spinner + this.searchSpinner.hide(); + + // Initiate a new Format request + this.request.send(url, 'GET', this.result.show, undefined, [{ key: 'Add-Metadata', value: true }/*, {key: 'Add-Components', value: true}*/]); + } + + private refine(key: string) { + // Trigger an event + this.events.trigger('pre-refinement', key); + + // Hide the searching spinner + this.searchSpinner.hide(); + + // Initiate a new Step-in request using the global address key + this.request.send(`${this.baseUrl}${this.stepInEndpoint}/${key}`, 'GET', this.picklist.show); + } + + + private lookup(key: string) { + // Trigger an event + this.events.trigger('pre-lookup', key); + + // Hide the searching spinner + this.searchSpinner.hide(); + + //Get the lookup requet + const lookupV2Request = this.generateLookupDataForApiCall(key, false); + + const url = this.baseUrl + this.lookupEndpoint; + const headers = [{ key: 'Add-Addresses', value: true }]; + const callback = this.picklist.showLookup; + + // Initiate new Search request + this.request.send(url, 'POST', callback, lookupV2Request, headers); + } + + private result: AddressValidationResult = { + formattedAddressContainer: null, + lastAddressField: null, + generateAddressLineRequired: false, + // Render a Formatted address + show: (data: SearchResponse) => { + // Hide the inline search spinner + this.searchSpinner.hide(); + + // Hide the picklist + this.picklist.hide(); + + // Clear the previous search term + this.lastSearchTerm = ''; + + // Allow Autocomplete through as it will need to create the additional output fields for the final address. + // Otherwise, only render the final address if there are results available. + if (this.searchType === AddressValidationMode.AUTOCOMPLETE || (data.result.address && data.result.confidence !== 'No matches')) { + + // Clear search input(s) + this.inputs.forEach(input => input.value = ''); + + // Calculate if we needed to generate the formatted address input fields later + this.result.calculateIfAddressLineGenerationRequired(); + + // Get formatted address container element + // Only create a container if we're creating inputs. Otherwise the user will have their own container. + this.result.formattedAddressContainer = this.options.elements.formattedAddressContainer; + if (!this.result.formattedAddressContainer && this.result.generateAddressLineRequired) { + this.result.createFormattedAddressContainer(); + } + + // Loop over each formatted address component + for (let i = 0; i < Object.keys(data.result.address).length; i++) { + const key = Object.keys(data.result.address)[i]; + const addressComponent = data.result.address[key]; + // Bind the address element to the user's address field (or create a new one) + this.result.updateAddressLine(key, addressComponent, 'address-line-input'); + } + + // Hide country and address search fields (if they have a 'toggle' class) + this.toggleSearchInputs('hide'); + + // Enable users to search again subsequently + this.hasSearchInputBeenReset = true; + + // If an address line is also the main search input, set property to false. + // This ensures that typing in the field again (after an address has been + // returned) will not trigger a new search. + if (this.searchType === AddressValidationMode.AUTOCOMPLETE) { + for (const element in this.options.elements) { + if (Object.prototype.hasOwnProperty.call(this.options.elements, element)) { + // Excluding the input itself, does another element match the input field? + if (element !== 'input' && this.options.elements[element] === this.inputs[0]) { + this.hasSearchInputBeenReset = false; + break; + } + } + } + } + + // Create the 'Search again' link and insert into DOM + this.result.createSearchAgainLink(); + } + + // Fire an event to say we've got the formatted address + this.events.trigger('post-formatting-search', data); + }, + hide: () => { + // Delete the formatted address container + if (this.result.formattedAddressContainer) { + this.result.formattedAddressContainer.parentNode.removeChild(this.result.formattedAddressContainer); + this.result.formattedAddressContainer = undefined; + } + // Delete the search again link + if (this.options.searchAgain.link) { + this.options.searchAgain.link.parentNode.removeChild(this.options.searchAgain.link); + this.options.searchAgain.link = undefined; + } + // Remove previous value from user's result field + // Loop over their elements + for (const element in this.options.elements) { + if (Object.prototype.hasOwnProperty.call(this.options.elements, element)) { + // If it matches an "address" element + for (let i = 0; i < defaults.addressLineLabels.length; i++) { + const label = defaults.addressLineLabels[i]; + // Only reset the value if it's not an input field + if (label === element && this.options.elements[element] !== this.inputs[0]) { + this.options.elements[element].value = ''; + break; + } + } + } + } + }, + createAddressLine: { + // Create an input to store the address line + input: (key: string, value: string, className: string) => { + // Create a wrapper + const div = document.createElement('div'); + div.classList.add(className); + + // Create the label + const label = document.createElement('label'); + label.innerHTML = key.replace(/([A-Z])/g, ' $1') // Add space before capital Letters + .replace(/([0-9])/g, ' $1') // Add space before numbers + .replace(/^./, function (str) { return str.toUpperCase(); }); // Make first letter of word a capital letter + div.appendChild(label); + + // Create the input + const input = document.createElement('input'); + input.setAttribute('type', 'text'); + input.setAttribute('name', key); + input.setAttribute('value', value); + div.appendChild(input); + return div; + }, + // Create the address line label based on the country and language + label: (key: string) => { + let label = key; + const language = this.options.language.toLowerCase(); + const country = this.currentCountryCode.toLowerCase(); + if (translations) { + try { + const translatedLabel = translations[language][country][key]; + if (translatedLabel) { + label = translatedLabel; + } + } catch (e) { + // Translation doesn't exist for key + } + } + return label; + } + }, + // Create the formatted address container and inject after the input + createFormattedAddressContainer: () => { + const container = document.createElement('div'); + container.classList.add('formatted-address'); + + // If Singleline mode is used, then append the formatted address after the last input field, otherwise use the first one + const position = this.searchType === AddressValidationMode.SINGLELINE ? this.inputs.length - 1 : 0; + + // Insert the container after the input + this.inputs[position].parentNode.insertBefore(container, this.inputs[position].nextSibling); + this.result.formattedAddressContainer = container; + }, + // Create a heading for the formatted address container + createHeading: () => { + // Create a heading for the formatted address + if (this.options.formattedAddressContainer.showHeading) { + const heading = document.createElement(this.options.formattedAddressContainer.headingType); + heading.innerHTML = this.options.formattedAddressContainer.validatedHeadingText; + this.result.formattedAddressContainer.appendChild(heading); + } + }, + // Update the heading text in the formatted address container + updateHeading: (text) => { + //Change the heading text to "Manual address entered" + if (this.options.formattedAddressContainer.showHeading) { + const heading = this.result.formattedAddressContainer.querySelector(this.options.formattedAddressContainer.headingType); + heading.innerHTML = text; + } + }, + calculateIfAddressLineGenerationRequired: () => { + this.result.generateAddressLineRequired = true; + for (let i = 0; i < defaults.addressLineLabels.length; i++) { + const key = defaults.addressLineLabels[i]; + if (this.options.elements[key]) { + this.result.generateAddressLineRequired = false; + break; + } + } + }, + updateAddressLine: (key: string, addressLineObject, className: string) => { + // Either append the result to the user's address field or create a new field for them + if (this.options.elements[key]) { + const addressField = this.options.elements[key]; + this.result.updateLabel(key); + let value = addressLineObject; + // If a value is already present, prepend a comma and space + if (addressField.value && value) { + value = ', ' + value; + } + // Decide what property of the node we need to update. i.e. if it's not a form field, update the innerText. + if (addressField.nodeName === 'INPUT' || addressField.nodeName === 'TEXTAREA' || addressField.nodeName === 'SELECT') { + addressField.value += value; + } else { + addressField.innerText += value; + } + // Store a record of their last address field + this.result.lastAddressField = addressField; + } else if (this.result.generateAddressLineRequired) { + // Create an input to store the address line + const label = this.result.createAddressLine.label(key); + const field = this.result.createAddressLine.input(label, addressLineObject, className); + // Insert into DOM + this.result.formattedAddressContainer.appendChild(field); + } + }, + // Update the label if translation is present + updateLabel: (key: string) => { + let label = key; + const language = this.options.language.toLowerCase(); + const country = this.currentCountryCode.toLowerCase(); + if (translations) { + try { + const translatedLabel = translations[language][country][key]; + if (translatedLabel) { + label = translatedLabel; + const labels = document.getElementsByTagName('label'); + for (let i = 0; i < labels.length; i++) { + if (labels[i].htmlFor === key) { + labels[i].innerHTML = translatedLabel; + } + } + } + } catch (e) { + // Translation doesn't exist for key + } + } + return label; + }, + // Create the 'Search again' link that resets the search + createSearchAgainLink: () => { + if (this.options.searchAgain.visible) { + const link = document.createElement('button'); + link.setAttribute('type', 'button'); + link.classList.add('search-again-button'); + link.innerText = this.options.searchAgain.text; + // Bind event listener + link.addEventListener('click', this.globalReset.bind(this)); + // Store a reference to the link element + this.options.searchAgain.link = link; + + // Insert into the formatted address container + if (this.result.formattedAddressContainer) { + this.result.formattedAddressContainer.appendChild(link); + } else if (this.result.lastAddressField) { + // Insert after last address field + this.result.lastAddressField.parentNode.insertBefore(link, this.result.lastAddressField.nextSibling); + } + } + }, + // Write the list of hidden address line inputs to the DOM + renderInputList: (inputArray) => { + if (inputArray.length > 0) { + for (let i = 0; i < inputArray.length; i++) { + this.result.formattedAddressContainer.appendChild(inputArray[i]); + } + } + }, + // Decide whether to either show a picklist or a verified result from a Validate response + handleValidateResponse: (response: SearchResponse) => { + if (response.result.confidence === 'Verified match') { + // If the response contains an address, then use this directly in the result + if (response.result.address) { + this.result.show(response); + } else if (response.result.suggestions) { + // If the verified match still contains a suggestion, then we need to format this first + this.format(response.result.suggestions[0].format); + } + } else if (response.result.suggestions) { + // If the user needs to pick a suggestion, then display the picklist + this.picklist.show(response); + } else if (response.result.confidence === 'No matches') { + // If there are no matches, then allow "use address entered" + this.picklist.handleEmptyPicklist(response); + } + } + }; + + private checkTab(event: KeyboardEvent): void { + const key = this.getKey(event); + if (key === 'Tab') { + this.picklist.keyup(event); + return; + } else if (key === 'Enter') { + // Prevent an 'Enter' keypress on the input submitting the form + event.preventDefault(); + } + } + + private searchSpinner = { + show: () => { + // Return if we're not displaying a spinner + if (!this.options.useSpinner) { + return; + } + // Create the spinner container + const spinnerContainer = document.createElement('div'); + spinnerContainer.classList.add('loader'); + spinnerContainer.classList.add('loader-inline'); + + // Create the spinner + const spinner = document.createElement('div'); + spinner.classList.add('spinner'); + spinnerContainer.appendChild(spinner); + + // Insert the spinner after the field + this.inputs[0].parentNode?.insertBefore(spinnerContainer, this.inputs[0].nextSibling); + }, + + hide: () => { + // Return if we're not displaying a spinner + if (!this.options.useSpinner) { + return; + } + const spinner = this.inputs[0].parentNode?.querySelector('.loader-inline'); + if (spinner) { + this.inputs[0].parentNode?.removeChild(spinner); + } + } + }; + + // Toggle the "hidden" class to either show or hide the input and country field(s) + private toggleSearchInputs(state: 'show' | 'hide') { + const modifier = state === 'show' ? 'remove' : 'add'; + this.options.elements.inputs?.forEach(input => input.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden'))); + this.options.elements.countryList?.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden')); + this.options.elements.lookupButton?.parentNode.querySelectorAll('.toggle').forEach(element => element.classList[modifier]('hidden')); + } + + private globalReset(event?) { + if (event) { + event.preventDefault(); + } + // Enable searching + this.options.enabled = true; + // Hide formatted address + this.result.hide(); + // Reset search input back + this.hasSearchInputBeenReset = true; + + // Clear the input field(s) + this.inputs.forEach(input => input.value = ''); + // Remove the picklist (if present) + this.picklist.hide(); + // Show search input + this.toggleSearchInputs('show'); + // Apply focus to input + this.inputs[0].focus(); + + // Fire an event after a reset + this.events.trigger('post-reset'); + } +} diff --git a/src/ts/class-types.ts b/src/ts/class-types.ts index 8a4ee19..9799e04 100644 --- a/src/ts/class-types.ts +++ b/src/ts/class-types.ts @@ -1,94 +1,132 @@ -export class Picklist { - items: PicklistItem[]; - currentItem; - list: HTMLDivElement; - container: HTMLElement; - size = 0; - maxSuggestions = 25; - show: (items: SearchResponse) => void; - hide: () => void; - handleEmptyPicklist: (items: SearchResponse) => void; - handleEmptyPicklistCallback: () => void; - refine: Refinement; - useAddressEntered: UseAddressEntered; - createList: () => HTMLDivElement; - createListItem: (item: PicklistItem) => HTMLDivElement; - tabCount: number; - resetTabCount: () => void; - keyup: (event: KeyboardEvent) => void; - addMatchingEmphasis: (item) => string; - listen: (row) => void; - checkEnter: (event: KeyboardEvent) => void; - pick: (item) => void; - scrollIntoViewIfNeeded: () => void; - displaySuggestionsHeader: () => void; - displayUseAddressEnteredFooter: () => void; -} - -export class AddressValidationResult { - formattedAddressContainer; - lastAddressField; - generateAddressLineRequired: boolean; - show: (data) => void; - hide: () => void; - createAddressLine: CreateAddressLine; - createFormattedAddressContainer: () => void; - createHeading: () => void; - updateHeading: (text: string) => void; - calculateIfAddressLineGenerationRequired: () => void; - updateAddressLine: (key: string, addressLineObject, className: string) => void; - updateLabel: (key: string) => string; - createSearchAgainLink: () => void; - renderInputList: (inputArray) => void; - handleValidateResponse: (response: SearchResponse) => void; -} - -class CreateAddressLine { - input: (key: string, value: string, className: string) => HTMLDivElement; - label: (key: string) => string; -} - -export interface SearchResponse { - result?: { - suggestions: PicklistItem[]; - suggestions_prompt?: string; - suggestions_key?: string; - confidence: string; - address?: {[key: string]: string}; - } -} - -export interface PicklistItem { - text: string; - format?: string; - matched?: number[][]; - global_address_key?: string; - additional_attributes?: {name: string, Value: string}[]; -} - -export class UseAddressEntered { - element: HTMLElement; - create: (confidence: string) => HTMLDivElement; - destroy: () => void; - click: () => void; - formatManualAddressLine: (lines, i) => {[key: string]: string}; -} - -export class Refinement { - element: HTMLInputElement; - isNeeded: (response: SearchResponse) => boolean; - createInput: (prompt: string, key: string) => void; - enter: (event: Event) => void; -} - -export class SearchSpinner { - show: () => void; - hide: () => void; -} - -export class PoweredByLogo { - element: HTMLElement; - create: (picklist) => HTMLDivElement; - destroy: (picklist) => void; - svg: string; +export class Picklist { + items: PicklistItem[]; + what3wordsItems: What3WordsPickList[]; + lookupItems: LookupAddress[]; + currentItem; + list: HTMLDivElement; + container: HTMLElement; + size = 0; + maxSuggestions = 25; + show: (items: SearchResponse) => void; + showWhat3Words: (items: LookupW3WResponse) => void; + showLookup: (items: LookupV2Response) => void; + hide: () => void; + handleEmptyPicklist: (items: SearchResponse | LookupW3WResponse | LookupV2Response) => void; + handleEmptyPicklistCallback: () => void; + handleCommonShowPicklistLogic: () => void; + refine: Refinement; + useAddressEntered: UseAddressEntered; + createList: () => HTMLDivElement; + createListItem: (item: PicklistItem) => HTMLDivElement; + createLookupListItem: (item: LookupAddress) => HTMLDivElement; + createWhat3WordsListItem: (item: What3WordsPickList) => HTMLDivElement; + tabCount: number; + resetTabCount: () => void; + keyup: (event: KeyboardEvent) => void; + addMatchingEmphasis: (item) => string; + listen: (row) => void; + checkEnter: (event: KeyboardEvent) => void; + pick: (item) => void; + scrollIntoViewIfNeeded: () => void; + displaySuggestionsHeader: () => void; + displayUseAddressEnteredFooter: () => void; +} + +export class AddressValidationResult { + formattedAddressContainer; + lastAddressField; + generateAddressLineRequired: boolean; + show: (data) => void; + hide: () => void; + createAddressLine: CreateAddressLine; + createFormattedAddressContainer: () => void; + createHeading: () => void; + updateHeading: (text: string) => void; + calculateIfAddressLineGenerationRequired: () => void; + updateAddressLine: (key: string, addressLineObject, className: string) => void; + updateLabel: (key: string) => string; + createSearchAgainLink: () => void; + renderInputList: (inputArray) => void; + handleValidateResponse: (response: SearchResponse) => void; +} + +class CreateAddressLine { + input: (key: string, value: string, className: string) => HTMLDivElement; + label: (key: string) => string; +} + +export interface SearchResponse { + result?: { + suggestions: PicklistItem[]; + suggestions_prompt?: string; + suggestions_key?: string; + confidence: string; + address?: { [key: string]: string }; + } +} + +export interface LookupW3WResponse { + result?: { + more_results_available: boolean; + suggestions: What3WordsPickList[]; + confidence: string; + } +} + +export interface LookupV2Response { + result?: { + more_results_available: boolean; + confidence: string; + addresses: LookupAddress[]; + } +} + +export interface LookupAddress { + text: string; + global_address_key: string; + format: string; +} + +export interface What3WordsPickList { + what3words: What3WordsSuggestion; +} + +export interface What3WordsSuggestion { + name: string; + description: string +} + +export interface PicklistItem { + text: string; + format?: string; + matched?: number[][]; + global_address_key?: string; + additional_attributes?: { name: string, Value: string }[]; +} + +export class UseAddressEntered { + element: HTMLElement; + create: (confidence: string) => HTMLDivElement; + destroy: () => void; + click: () => void; + formatManualAddressLine: (lines, i) => { [key: string]: string }; +} + +export class Refinement { + element: HTMLInputElement; + isNeeded: (response: SearchResponse) => boolean; + createInput: (prompt: string, key: string) => void; + enter: (event: Event) => void; +} + +export class SearchSpinner { + show: () => void; + hide: () => void; +} + +export class PoweredByLogo { + element: HTMLElement; + create: (picklist) => HTMLDivElement; + destroy: (picklist) => void; + svg: string; } \ No newline at end of file diff --git a/src/ts/search-options.ts b/src/ts/search-options.ts index 3812ebb..8525d02 100644 --- a/src/ts/search-options.ts +++ b/src/ts/search-options.ts @@ -1,43 +1,45 @@ -export interface AddressSearchOptions { - enabled: boolean; - token: string; - searchType: AddressValidationMode; - maxSuggestions: number; - language: string; - location: string; - useSpinner: boolean; - countryCode?: string; - countryCodeMapping?: {[key: string]: string}; - applyFocus: boolean; - placeholderText: string; - useAddressEnteredText: string; - searchAgain: {visible?: boolean, text?: string, link?: HTMLButtonElement}; - formattedAddressContainer: {showHeading: boolean, headingType: string, validatedHeadingText: string, manualHeadingText: string}; - elements: {input?: HTMLInputElement, inputs?: HTMLInputElement[], countryList?: HTMLSelectElement, address_line_1?: HTMLInputElement, address_line_2?: HTMLInputElement, address_line_3?: HTMLInputElement, locality?: HTMLInputElement, region?: HTMLInputElement, postal_code?: HTMLInputElement, country?: HTMLInputElement, formattedAddressContainer?: HTMLElement, lookupButton?: HTMLButtonElement}; -} - -export enum AddressValidationMode { - AUTOCOMPLETE = 'autocomplete', - SINGLELINE = 'singleline', - VALIDATE = 'validate' -} - -// Default settings -export const defaults = { - searchType: AddressValidationMode.AUTOCOMPLETE, - input: {placeholderText: 'Start typing an address...', applyFocus: false}, - formattedAddressContainer: {showHeading: false, headingType: 'h3', validatedHeadingText: 'Validated address', manualHeadingText: 'Manual address entered'}, - searchAgain: {visible: true, text: 'Search again'}, - useAddressEnteredText: ' - Use address entered or try again...', - useSpinner: false, - language: 'en', - addressLineLabels: [ - 'address_line_1', - 'address_line_2', - 'address_line_3', - 'locality', - 'region', - 'postal_code', - 'country' - ] +export interface AddressSearchOptions { + enabled: boolean; + token: string; + enableWhat3Words: boolean; + searchType: AddressValidationMode; + maxSuggestions: number; + language: string; + location: string; + useSpinner: boolean; + countryCode?: string; + countryCodeMapping?: { [key: string]: string }; + applyFocus: boolean; + placeholderText: string; + useAddressEnteredText: string; + searchAgain: { visible?: boolean, text?: string, link?: HTMLButtonElement }; + formattedAddressContainer: { showHeading: boolean, headingType: string, validatedHeadingText: string, manualHeadingText: string }; + elements: { input?: HTMLInputElement, inputs?: HTMLInputElement[], countryList?: HTMLSelectElement, address_line_1?: HTMLInputElement, address_line_2?: HTMLInputElement, address_line_3?: HTMLInputElement, locality?: HTMLInputElement, region?: HTMLInputElement, postal_code?: HTMLInputElement, country?: HTMLInputElement, formattedAddressContainer?: HTMLElement, lookupButton?: HTMLButtonElement }; +} + +export enum AddressValidationMode { + AUTOCOMPLETE = 'autocomplete', + SINGLELINE = 'singleline', + VALIDATE = 'validate' +} + +// Default settings +export const defaults = { + enableWhat3Words: true, + searchType: AddressValidationMode.AUTOCOMPLETE, + input: { placeholderText: 'Start typing an address...', applyFocus: false }, + formattedAddressContainer: { showHeading: false, headingType: 'h3', validatedHeadingText: 'Validated address', manualHeadingText: 'Manual address entered' }, + searchAgain: { visible: true, text: 'Search again' }, + useAddressEnteredText: ' - Use address entered or try again...', + useSpinner: false, + language: 'en', + addressLineLabels: [ + 'address_line_1', + 'address_line_2', + 'address_line_3', + 'locality', + 'region', + 'postal_code', + 'country' + ] }; \ No newline at end of file