@ditojs/admin 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- (function(n,N){typeof exports=="object"&&typeof module<"u"?module.exports=N(require("vue"),require("vue-router"),require("@kyvg/vue3-notification"),require("@ditojs/utils"),require("nanoid"),require("vue-demi"),require("focus-trap"),require("@vueuse/core"),require("sortablejs"),require("codeflask"),require("tinycolor2"),require("@lk77/vue3-color"),require("@tiptap/vue-3"),require("@tiptap/extension-document"),require("@tiptap/extension-text"),require("@tiptap/extension-bold"),require("@tiptap/extension-code"),require("@tiptap/extension-italic"),require("@tiptap/extension-link"),require("@tiptap/extension-strike"),require("@tiptap/extension-underline"),require("@tiptap/extension-blockquote"),require("@tiptap/extension-code-block"),require("@tiptap/extension-hard-break"),require("@tiptap/extension-heading"),require("@tiptap/extension-paragraph"),require("@tiptap/extension-horizontal-rule"),require("@tiptap/extension-ordered-list"),require("@tiptap/extension-bullet-list"),require("@tiptap/extension-list-item"),require("@tiptap/extension-history"),require("vue-multiselect"),require("filesize-parser"),require("filesize"),require("vue-upload-component")):typeof define=="function"&&define.amd?define(["vue","vue-router","@kyvg/vue3-notification","@ditojs/utils","nanoid","vue-demi","focus-trap","@vueuse/core","sortablejs","codeflask","tinycolor2","@lk77/vue3-color","@tiptap/vue-3","@tiptap/extension-document","@tiptap/extension-text","@tiptap/extension-bold","@tiptap/extension-code","@tiptap/extension-italic","@tiptap/extension-link","@tiptap/extension-strike","@tiptap/extension-underline","@tiptap/extension-blockquote","@tiptap/extension-code-block","@tiptap/extension-hard-break","@tiptap/extension-heading","@tiptap/extension-paragraph","@tiptap/extension-horizontal-rule","@tiptap/extension-ordered-list","@tiptap/extension-bullet-list","@tiptap/extension-list-item","@tiptap/extension-history","vue-multiselect","filesize-parser","filesize","vue-upload-component"],N):(n=typeof globalThis<"u"?globalThis:n||self,n["dito-admin"]=N(n.vue,n["vue-router"],n["@kyvg/vue3-notification"],n["@ditojs/utils"],n.nanoid,n["vue-demi"],n["focus-trap"],n["@vueuse/core"],n.sortablejs,n.codeflask,n.tinycolor2,n["@lk77/vue3-color"],n["@tiptap/vue-3"],n["@tiptap/extension-document"],n["@tiptap/extension-text"],n["@tiptap/extension-bold"],n["@tiptap/extension-code"],n["@tiptap/extension-italic"],n["@tiptap/extension-link"],n["@tiptap/extension-strike"],n["@tiptap/extension-underline"],n["@tiptap/extension-blockquote"],n["@tiptap/extension-code-block"],n["@tiptap/extension-hard-break"],n["@tiptap/extension-heading"],n["@tiptap/extension-paragraph"],n["@tiptap/extension-horizontal-rule"],n["@tiptap/extension-ordered-list"],n["@tiptap/extension-bullet-list"],n["@tiptap/extension-list-item"],n["@tiptap/extension-history"],n["vue-multiselect"],n["filesize-parser"],n.filesize,n["vue-upload-component"]))})(this,function(n,N,M,d,qt,L,zt,I,At,Ut,de,Ht,G,Wt,Kt,Yt,Jt,Qt,Gt,Xt,Zt,vt,xt,en,tn,nn,on,sn,an,rn,ln,cn,dn,hn,pn){"use strict";var pc=Object.defineProperty;var uc=(n,N,M)=>N in n?pc(n,N,{enumerable:!0,configurable:!0,writable:!0,value:M}):n[N]=M;var Te=(n,N,M)=>(uc(n,typeof N!="symbol"?N+"":N,M),M);const _e=n.reactive({title:"",routeComponents:[],user:null,loadCache:{},activeLabel:null,clipboardData:null});function F(e,t){return e?`${e}/${t}`:t}function un(e){const t=d.parseDataPath(e);return t==null||t.pop(),t}function he(e,t=!1){return t?un(e):d.parseDataPath(e)}function mn(e,t=!1){return d.normalizeDataPath(he(e,t))}function je(e,t=!1){const o=he(e,t);if(o){let s;do s=o.pop();while(s!=null&&d.isInteger(+s));if(s!=null)return o}return null}function fn(e,t=!1){return d.normalizeDataPath(je(e,t))}function pe(e,t,o=!1){const s=he(t,o);return s?d.getValueAtDataPath(e,s):null}function ue(e,t,o=!1){const s=je(t,o);return s?d.getValueAtDataPath(e,s):null}function Re(e){const t=d.parseDataPath(e);return t[t.length-1]}function gn(e){const t=Re(e);return t==null||d.isInteger(+t)?null:t}function me(e){const t=Re(e),o=t==null?null:+t;return d.isInteger(o)?o:null}let bn=0;function yn(e,t="id"){e[t]=`@${++bn}`}function X(e){return/^@/.test(e)}function kn(e,t="id"){return(e==null?void 0:e[t])!=null&&Object.keys(e).length===1}const{hasOwnProperty:Cn}=Object.prototype,fe=new WeakMap;function B(e,t,o){const s=fe.get(n.toRaw(e)),a=s[t];return a!==void 0||Cn.call(s,t)?a:d.isFunction(o)?o():o}function $n(e,t,o){fe.get(n.toRaw(e))[t]=o}class V{constructor(t,o){o=o?d.isFunction(o)?o():{...o}:{},o.nested??(o.nested=!0),o.component=t;const s=Object.setPrototypeOf(o,t);fe.set(this,s)}static get(t,o){return o instanceof V?o:new V(t,o)}get nested(){return B(this,"nested",!0)}get value(){return B(this,"value",void 0)}get dataPath(){return B(this,"dataPath","")}get name(){return B(this,"name",()=>gn(this.dataPath))}get index(){return B(this,"index",()=>me(this.dataPath))}get itemDataPath(){return mn(this.dataPath,this.nested)}get parentItemDataPath(){return fn(this.dataPath,this.nested)}get itemIndex(){return me(this.itemDataPath)}get parentItemIndex(){return me(this.parentItemDataPath)}get item(){return B(this,"data",()=>pe(this.rootItem,this.dataPath,this.nested))}get parentItem(){const t=ue(this.rootItem,this.dataPath,this.nested)||null;return t!==this.item?t:null}get rootItem(){return B(this,"rootData",null)}get processedItem(){return B(this,"processedData",null)}get clipboardItem(){return B(this,"clipboardData",null)}get user(){return B(this,"user",null)}get api(){return B(this,"api",null)}get views(){return B(this,"views",null)}get itemLabel(){return B(this,"itemLabel",null)}get formLabel(){return B(this,"formLabel",null)}get component(){return B(this,"component",null)}get schemaComponent(){return B(this,"schemaComponent",null)}get formComponent(){return B(this,"formComponent",null)}get viewComponent(){return B(this,"viewComponent",null)}get dialogComponent(){return B(this,"dialogComponent",null)}get panelComponent(){return B(this,"panelComponent",null)}get resourceComponent(){return B(this,"resourceComponent",null)}get sourceComponent(){return B(this,"sourceComponent",null)}get option(){return B(this,"option",void 0)}get options(){return B(this,"options",void 0)}get query(){return B(this,"query",void 0)}get error(){return B(this,"error",void 0)}get wasNotified(){return B(this,"wasNotified",!1)}get request(){return t=>this.component.request(t)}get format(){return(t,o)=>this.component.format(t,o)}get navigate(){return t=>this.component.navigate(t)}get download(){return t=>this.component.download(t)}get getResourceUrl(){return t=>this.component.getResourceUrl(t)}get notify(){return t=>{this.component.notify(t),$n(this,"wasNotified",!0)}}}const Bn={data(){return{listeners:null}},methods:{on(e,t){if(d.isArray(e))for(const o of e)this.on(o,t);else if(d.isPlainObject(e))for(const o in e)this.on(o,e[o]);else{const o=this.listeners||(this.listeners=Object.create(null)),{callbacks:s}=o[e]||(o[e]={callbacks:[],queue:[]});s.push(t)}return this},once(e,t){const o=(...s)=>(this.off(e,o),t.apply(this,s));return o.callback=t,this.on(e,o)},off(e,t){var o;if(!arguments.length)delete this.listeners;else if(d.isArray(e))for(const s of e)this.off(s,t);else if(d.isPlainObject(e))for(const s in e)this.off(s,e[s]);else{const s=(o=this.listeners)==null?void 0:o[e];if(s)if(!t)delete this.listeners[e];else{const{callbacks:a}=s,i=a.findIndex(r=>r===t||r.callback===t);i!==-1&&a.splice(i,1)}}return this},emit(e,...t){var s;const o=(s=this.listeners)==null?void 0:s[e];if(o){const{queue:a,callbacks:i}=o;return new Promise(r=>{const l=async()=>{const c=a.shift();if(c){let h;for(const p of i)try{const u=await p.apply(this,c.args);u!==void 0&&(h=u)}catch(u){console.error(`Error during event handler for '${e}':`,u)}c.resolve(h),l()}};a.push({args:t,resolve:r}),a.length===1&&l()})}},hasListeners(e){var t;if(d.isArray(e)){for(const o of e)if(!this.hasListeners(o))return!1;return e.length>0}else return!!((t=this.listeners)!=null&&t[e])},delegate(e,t){if(t)if(d.isArray(e))for(const o of e)this.delegate(o,t);else this.on(e,(...o)=>t.emit(e,...o));return this}}},ge={Boolean:d.isBoolean,Number:d.isNumber,String:d.isString,Date:d.isDate,Array:d.isArray,Object:d.isObject,RegExp:d.isRegExp,Function:d.isFunction},Dn={Boolean:e=>!!e,Number:e=>+e,String:e=>String(e),Date:e=>d.isDate(e)?e:new Date(e),Array:e=>d.isArray(e)?e:d.isString(e)?e.split(","):d.asArray(e),Object:e=>d.isObject(e)?e:e===!0?{}:null,RegExp:e=>d.isRegExp(e)?e:new RegExp(e)};function be(e,t){var o;if(e&&t!=null){for(const s of e)if((o=ge[s.name])!=null&&o.call(ge,t))return!0}return!1}function wn(e,t){const o=e&&Dn[e.name||e];return o?o(t):t}function Me(e){return!!T(e.resource)}function T(e,t={}){var a;const{parent:o,...s}=t;return e=d.isObject(e)?{...s,...e}:d.isString(e)?{...s,path:e}:null,e&&o!==void 0&&e.parent===void 0&&!((a=e.path)!=null&&a.startsWith("/"))&&(e.parent=o,e.path||(e.path=".")),e}function ye(e,t){return e!=null&&(t==null?void 0:t.type)==="collection"?{type:"member",...d.pickBy(t,(o,s)=>["method","path","parent"].includes(s)),id:`${e}`}:null}const Ie={mixins:[Bn],inject:["api","$verbs","$views","$isPopulated","$parentComponent","$schemaComponent","$routeComponent","$dataComponent","$sourceComponent","$resourceComponent","$dialogComponent","$panelComponent","$tabComponent"],provide(){return this.providesData?{$parentComponent:()=>this,$dataComponent:()=>this}:{$parentComponent:()=>this}},data(){return{appState:_e,overrides:null}},computed:{providesData(){return!1},sourceSchema(){var e;return(e=this.meta)==null?void 0:e.schema},user(){return _e.user},verbs(){return this.$verbs()},views(){return this.$views()},isPopulated(){return this.$isPopulated()},locale(){return this.api.locale},context(){return new V(this,{nested:!1})},rootComponent(){return this.$root.$refs.root},parentComponent(){return this.$parentComponent()},schemaComponent(){return this.$schemaComponent()},routeComponent(){return this.$routeComponent()},formComponent(){const e=this.routeComponent;return e!=null&&e.isForm?e:null},viewComponent(){const e=this.routeComponent;return e!=null&&e.isView?e:null},dataComponent(){return this.providesData?this:this.$dataComponent()},sourceComponent(){return this.$sourceComponent()},resourceComponent(){return this.$resourceComponent()},dialogComponent(){return this.$dialogComponent()},panelComponent(){return this.$panelComponent()},tabComponent(){return this.$tabComponent()},parentSchemaComponent(){var e;return(e=this.schemaComponent)==null?void 0:e.parentComponent.schemaComponent},parentRouteComponent(){var e;return(e=this.routeComponent)==null?void 0:e.parentComponent.routeComponent},parentFormComponent(){var e;return(e=this.formComponent)==null?void 0:e.parentComponent.formComponent},rootData(){var e;return(e=this.dataComponent)==null?void 0:e.data}},beforeCreate(){const e=Vn++;Object.defineProperty(this,"$uid",{get(){return e}})},methods:{getStore(e){return this.store[e]},setStore(e,t){return this.store[e]=t,t},getChildStore(e){return this.getStore(e)||this.setStore(e,n.reactive({}))},getSchemaValue(e,{type:t,default:o,schema:s=this.schema,callback:a=!0}={}){const i=t&&d.asArray(t);let r=s?d.isArray(e)?d.getValueAtDataPath(s,e,()=>{}):s[e]:void 0;if(r===void 0&&o!==void 0)return a&&d.isFunction(o)&&!be(i,o)&&(o=o.call(this,this.context)),o;if(be(i,r))return r;if(a&&d.isFunction(r)&&(r=r.call(this,this.context)),i&&r!=null&&!be(i,r))for(const l of i){const c=wn(l,r);if(c!==r)return c}return r},getLabel(e,t){return e?this.getSchemaValue("label",{type:String,schema:e})||d.labelize(t||e.name):d.labelize(t)||""},labelize:d.labelize,getButtonAttributes(e,t){const o=this.verbs[e]||e;return{class:`dito-button-${o}`,title:(t==null?void 0:t.text)||d.labelize(o)}},getQueryLink(e){return{query:e,hash:this.$route.hash}},shouldRender(e=null){return!!e&&this.getSchemaValue("if",{type:Boolean,default:!0,schema:e})},getResourcePath(e){var t;return e=T(e),e.parent===void 0&&(e.parent=(t=this.dataComponent)==null?void 0:t.resource),this.api.resources.any(T(e))},getResourceUrl(e){const t=this.getResourcePath(e);return t?this.api.getApiUrl({url:t,query:e.query}):null},async sendRequest({method:e,url:t,resource:o,query:s,data:a,internal:i}){t||(t=this.getResourcePath(o)),e||(e=o==null?void 0:o.method);const r=!i&&this.api.isApiUrl(t);r&&await this.rootComponent.ensureUser();const l=await this.api.request({method:e,url:t,data:a,query:s});return r&&e==="patch"&&d.equals(o,ye(this.user.id,this.api.users))&&await this.rootComponent.fetchUser(),l},showDialog({components:e,buttons:t,data:o,settings:s}){return this.rootComponent.showDialog({components:e,buttons:t,data:o,settings:s})},request({cache:e,...t}){const o=e&&{global:this.appState,local:this.dataComponent}[e],s=o==null?void 0:o.loadCache,a=s&&`${t.method||"get"} ${t.url} ${JSON.stringify(t.query||t.params||"")} ${JSON.stringify(t.data||"")}`;if(s&&a in s)return s[a];const i=this.sendRequest(t).then(r=>r.data).catch(r=>{var c;const l=(c=r.response)==null?void 0:c.data;throw l?Object.assign(new Error(l.message),l):r});return s&&(s[a]=i),i},format(e,{locale:t=this.api.locale,defaults:o=this.api.formats,...s}={}){return d.format(e,{locale:t,defaults:o,...s})},async navigate(e){return this.$router.push(e)},download(e={}){d.isString(e)&&(e={url:e});const t=document.createElement("a");t.href=this.api.getApiUrl(e),t.download=e.filename??null;const{body:o}=document;o.appendChild(t),t.click(),o.removeChild(t)},notify(e){this.rootComponent.notify(e)},closeNotifications(){this.rootComponent.closeNotifications()},setupSchemaFields(){this.setupMethods(),this.setupComputed(),this.setupEvents()},setupMethods(){for(const[e,t]of Object.entries(this.schema.methods||{}))d.isFunction(t)?this[e]=t:console.error(`Invalid method definition: ${e}: ${t}`)},setupComputed(){for(const[e,t]of Object.entries(this.schema.computed||{})){const o=d.isFunction(t)?{get:t}:d.isObject(t)&&d.isFunction(t.get)?t:null;o?Object.defineProperty(this,e,o):console.error(`Invalid computed property definition: ${e}: ${t}`)}},setupEvents(){const{watch:e,events:t}=this.schema;if(e){const s=d.isFunction(e)?e.call(this):e;d.isObject(s)&&this.$nextTick(()=>{for(const[a,i]of Object.entries(s)){const r=this.schemaComponent.getComponentByName(a)?`data.${a}`:a;this.$watch(r,i)}})}const o=(s,a,i)=>{d.isFunction(i)?this.on(d.hyphenate(a),i):console.error(`Invalid event definition: ${s}: ${i}`)};if(t)for(const[s,a]of Object.entries(t))o(s,s,a);for(const[s,a]of Object.entries(this.schema))/^on[A-Z]/.test(s)&&o(s,s.slice(2),a)},async emitEvent(e,{context:t=null,parent:o=null}={}){const s=this.hasListeners(e),a=o==null?void 0:o.hasListeners(e);if(s||a){["load","change"].includes(e)&&await this.$nextTick();const i=()=>t=V.get(this,t),r=s?await this.emit(e,i()):void 0;return a&&r!==!1&&o.emit(e,i()),r}},emitSchemaEvent(e,t){return this.schemaComponent.emitEvent(e,t)}}};let Vn=0;const Sn=Object.freeze(Object.defineProperty({__proto__:null,creditcard:{validate:e=>d.isCreditCard(e),message:"is invalid"},decimals:{validate:(e,t)=>{const o=t==="*"?"+":`{1,${t}}`;return new RegExp(`^[-+]?\\d*(\\.\\d${o})?$`).test(e)},message:(e,t)=>`must be numeric and may contain ${!t||t==="*"?"":t} decimal points`},domain:{validate:e=>d.isDomain(e),message:"is not a domain"},email:{validate:e=>d.isEmail(e),message:"must be a valid email"},hostname:{validate:e=>d.isHostname(e),message:"is not a host name"},integer:{validate:e=>d.isInteger(e),message:"must be whole number"},max:{validate:(e,t)=>e<=t,message(e,t){return`must be ${t} or less`}},min:{validate:(e,t)=>e>=t,message(e,t){return`must be ${t} or more`}},password:{validate:()=>!0},range:{validate:(e,[t,o])=>e>=t&&e<=o,message(e,[t,o]){return`must be between ${t} and ${o}`}},required:{validate:(e,t,{password:o})=>e!=null&&e!==""||o&&e===void 0,message:"is required",nullish:!0},url:{validate:e=>d.isUrl(e),message:"is not a valid URL"}},Symbol.toStringTag,{value:"Module"})),Pn={emits:["errors"],data(){return{isTouched:!1,isDirty:!1,isValidated:!1,isValid:!1,errors:null}},methods:{resetValidation(){this.isTouched=!1,this.isDirty=!1,this.isValidated=!1,this.isValid=!1,this.clearErrors()},validate(e=!0){let t=!0;e&&this.clearErrors();const{value:o}=this;for(const[s,a]of Object.entries(this.validations)){const i=Sn[s];if(i&&(i.nullish||o!=null)){const{validate:r,message:l}=i;if(!r(o,a,this.validations)&&(t=!1,e)){const c=d.isFunction(l)?l(o,a,this):l;this.addError(c,!0)}}}return e&&(this.isValidated=!0,this.isValid=t),t},verify(){return this.validate(!1)},markTouched(){this.isTouched=!0},markDirty(){this.isDirty=!0,this.isValidated=!1,this.isValid=!1,this.clearErrors()},addError(e,t=!1){this.errors||(this.errors=[]),t&&(e=`The ${this.label||this.placeholder||this.name} field ${e}.`),this.errors.push(e),this.$emit("errors",this.errors)},showValidationErrors(e,t){this.errors=[];for(const{message:o}of e)this.addError(o,!0);return t&&this.focus(),!0},getErrors(){return this.errors?[...this.errors]:null},clearErrors(){this.errors=null,this.$emit("errors",this.errors)}}};function y(e,{type:t,default:o,get:s,set:a,callback:i=!0}={}){d.isString(e)&&e.includes(".")&&(e=d.parseDataPath(e));const r=d.normalizeDataPath(e);return{get(){const l=!s||s.length>0?this.overrides&&r in this.overrides?this.overrides[r]:this.getSchemaValue(e,{type:t,default:o,callback:i}):void 0;return s?s.call(this,l):l},set(l){a?a.call(this,l):(this.overrides||(this.overrides={}),this.overrides[r]=l)}}}function ke(e,{default:t,get:o,set:s}={}){return{get(){let a=this.getStore(e);return a===void 0&&t!==void 0&&(a=d.isFunction(t)?t.call(this,this.context):t,this[e]=a,this.getStore(e)),o?o.call(this,a):a},set(a){(!s||(a=s.call(this,a))!==void 0)&&this.setStore(e,a)}}}const H={mixins:[Pn],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},data(){return{parsedValue:null,focused:!1}},computed:{name(){return this.schema.name},type(){return this.schema.type},context(){return new V(this,{nested:this.nested})},value:{get(){const e=nt(this.schema,this.data,this.name,this.dataPath,{component:this}),{format:t}=this.schema;return t?t.call(this,new V(this,{value:e})):e},set(e){const{parse:t}=this.schema;this.parsedValue=t?t.call(this,new V(this,{value:e})):e,this.data[this.name]=this.parsedValue}},item(){return pe(this.rootItem,this.dataPath,this.nested)},parentItem(){return ue(this.rootItem,this.dataPath,this.nested)},rootItem(){return this.rootData},processedItem(){const{schemaComponent:e}=this;return pe(e.processedItem,this.dataPath.slice(e.dataPath.length),this.nested)},label:y("label",{type:[String,Boolean],get(e){return d.isString(e)?e:e!==!1&&this.$options.generateLabel?this.getLabel(this.schema):null}}),width:y("width",{type:[String,Number]}),visible:y("visible",{type:Boolean,default(){return this.$options.defaultVisible}}),exclude:y("exclude",{type:Boolean,default:!1}),required:y("required",{type:Boolean,default:!1}),readonly:y("readonly",{type:Boolean,default:!1}),autofocus:y("autofocus",{type:Boolean,default:!1}),clearable:y("clearable",{type:Boolean,default:!1}),placeholder:y("placeholder",{type:String}),autocomplete:y("autocomplete",{type:String}),events(){const{onFocus:e,onBlur:t,onInput:o,onChange:s}=this;return{onFocus:e,onBlur:t,onInput:o,onChange:s}},attributes(){const{nativeField:e,textField:t}=this.$options,o={...this.events,disabled:this.disabled};return e&&(o.name=this.name,this.label&&(o.title=this.label),o.readonly=this.readonly,o.autofocus=this.autofocus,t&&(o.placeholder=this.placeholder,o.autocomplete=this.autocomplete)),o},validations(){const e={...this.getValidations()};this.required&&(e.required=!0);for(const[t,o]of Object.entries(this.schema.rules||{}))o===void 0?delete e[t]:e[t]=o;return e},showClearButton(){return this.clearable&&this.value!=null}},created(){this._register(!0),this.setupSchemaFields()},beforeUnmount(){this._register(!1)},methods:{_register(e){this.nested&&this.schemaComponent._registerComponent(this,e)},getValidations(){return null},focusElement(){const[e]=d.asArray(this.$refs.element);e&&this.$nextTick(()=>{var t,o;e.focus(),this.disabled&&((o=(t=e.$el||e).scrollIntoView)==null||o.call(t))})},focus(){var e;this.schemaComponent.focus(),(e=this.tabComponent)==null||e.focus(),this.focusElement()},clear(){this.value=null,this.onChange()},onFocus(){this.focused=!0,this.markTouched(),this.emitEvent("focus")},onBlur(){this.focused=!1,this.validate(),this.emitEvent("blur")},onInput(){this.markDirty(),this.emitEvent("input")},onChange(){this.markDirty(),this.emitEvent("change",{context:this.parsedValue!==void 0?{value:this.parsedValue}:null,parent:this.schemaComponent})}}},qe=new WeakMap;let En=0;function On(e,t){let o=qe.get(e);return o||(o=t||`@${++En}`,qe.set(e,o)),o}class Nn{constructor(){Te(this,"graph",{});Te(this,"references",{})}set(t,o,s){t=d.parseDataPath(t);let a=this.graph;for(const i of t){const r=d.isInteger(+i)?"*":i;a=a[r]??(a[r]={})}a.$settings={...s,...a.$settings,...o}}addSource(t,o){this.set(t,{type:"source",schema:o},{related:!1})}setSourceRelated(t){this.set(t,{related:!0,reference:this.getReferencePrefix(t)})}addRelation(t,o,s){this.set(t,{type:"relation",schema:s,internal:!!o,reference:this.getReferencePrefix(o)})}getReferencePrefix(t){var o;return t?(o=this.references)[t]??(o[t]=qt.nanoid(6)):null}flatten(){const t=o=>{const s=[];for(const[a,{$settings:i,...r}]of Object.entries(o)){i&&s.push([a,i]);for(const[l,c]of t(r))s.push([`${a}/${l}`,c])}return s};return t(this.graph)}process(t,o,{target:s}){const a=s==="clipboard";a&&delete o[t.idKey||"id"];for(const[i,r]of this.flatten()){const{type:l,schema:c,internal:h,related:p,reference:u}=r,g=l==="source",f=l==="relation";if(g||f&&h){const m=d.getValueAtDataPath(o,i,()=>null),k=a&&g&&!p,P=a&&(f&&h||g&&p);for(const w of d.asArray(m).flat()){const $=g&&c.idKey||f&&c.relateBy||"id";let S=w==null?void 0:w[$];if(S!=null&&(k&&delete w[$],P||X(S))){X(S)&&(S=S.slice(1));const O=a?$:g?"#id":"#ref",E=a?`@${S}`:u?`${u}-${S}`:S;w[O]=E,O!==$&&delete w[$]}}}}return o}}const ze={},Ae={};function Fn(e,t){ze[e]=t}function Z(e,t=!1){const o=ze[e]||null;if(!o&&!t&&!Ae[e])throw Ae[e]=!0,new Error(`Unknown Dito component type: '${e}'`);return o}function Ln(e){return e?[...Object.values(e.tabs||{}),e]:[]}function Ce(e,t){if(ne(e))return t(e.component,e.name);{const o=Ln(e);for(const s of o)for(const[a,i]of Object.entries(s.components||{})){const r=t(i,a);if(r!==void 0)return r}}}function Tn(e,t){return Ce(e,(o,s)=>t(o,s)?!0:void 0)===!0}function v(e){return d.isObject(e)&&d.isString(e.type)}function _n(e){return v(e)&&e.type==="form"}function Ue(e){return v(e)&&e.type==="view"}function He(e){return e.name||e.label||e.type}async function x(e,t=!1){if(d.isFunction(e)&&(e=e()),d.isPromise(e)&&(e=await e),d.isModule(e)&&(e={...e},!e.name&&(t||e.default))){const o=Object.keys(e);if(o.length===1){const s=o[0];e=e[s],s!=="default"&&(e.name=s)}}return e}async function $e(e,t=x){let o=d.isFunction(e)?e():e;return o=await x(o,!1),d.isArray(o)?o=Object.fromEntries(await d.mapConcurrently(o,async s=>{const a=await t(s,!0);return[a.name,a]})):d.isObject(o)&&(o=Object.fromEntries(await d.mapConcurrently(Object.entries(o),async([s,a])=>{const i=await t(a,!0);return[s,i]}))),o}async function We(e){const{panels:t}=e;t&&(e.panels=await $e(t))}async function ee(e){let{component:t}=e;t&&(t=await x(t,!0),t&&(e.component=n.markRaw({...t,mixins:[Ie,H,...t.mixins||[]]})))}async function Ke(e){await d.mapConcurrently(Object.values(e||{}),ee)}async function jn(e,t,o,s){Je(t,o,s),Be(t,o),await We(o);const a=[];if(Ue(o))ne(o)?await Ye(t,o.component,s,a,0):await te(t,o,a,1);else throw new Error(`Invalid view schema: '${He(o)}'`);return{path:`/${o.path}`,children:a,component:e,meta:{api:t,schema:o}}}async function Ye(e,t,o,s,a){var i,r;Be(e,t),await((r=(i=j(t))==null?void 0:i.processSchema)==null?void 0:r.call(i,e,t,o,s,a))}function Be(e,t){let o=e.defaults[t.type];if(o&&(d.isFunction(o)&&(o=o(t)),d.isObject(o)))for(const[s,a]of Object.entries(o))t[s]===void 0?t[s]=a:t[s]=d.merge(a,t[s])}function Je(e,t,o){t.name=o,t.path||(t.path=e.normalizePath(o))}async function te(e,t,o,s){const a=[];Ce(t,(i,r)=>{a.push(Ye(e,i,r,o,s))}),await Promise.all(a)}async function Rn(e,t,o){const s=async c=>(c=await Mn(c),Be(e,t),c);let{form:a,forms:i,components:r}=t;i?i=t.forms=await $e(i,s):a?a=t.form=await s(a):r&&d.isObject(r)&&(a={components:r}),i||(i={default:a});const l=[];for(const c of Object.values(i))await te(e,c,l,o+1);return l}async function Mn(e){if(e=await x(e,!0),!_n(e))throw new Error(`Invalid form schema: '${He(e)}'`);return await We(e),e}function q(e){return v(e)&&d.isObject(e.form||e.forms||e.components)}function In(e){return v(e)&&Object.keys((e==null?void 0:e.forms)||{}).length>1}function ne(e){return Ue(e)&&d.isObject(e.component)}function Qe(e,t){const{view:o}=e,s=o&&t.views[o];return s&&Ce(s,a=>{if(q(a))return a})||null}function Ge(e,t){return Qe(e,t)?t.views[e.view]:null}function qn(e,t){const o=Ge(e,t);return o?ne(o)?`/${o.path}`:`/${o.path}/${o.path}`:null}function W(e,t,o){const s=Qe(e,t);if(s)e=s;else if(e.view)throw new Error(`Unknown view: '${e.view}'`);let{form:a,forms:i,components:r,compact:l}=e;if(!a&&!i)if(r)a={components:r,compact:l};else return{};return i||(i={default:a}),Object.fromEntries(Object.entries(i).map(([c,h])=>(d.isFunction(h.components)&&(h={...h,components:h.components(t)}),[c,(o==null?void 0:o(h))??h])))}function Xe(e,t){return e[t==null?void 0:t.type]||e.default||null}function De(e,t,o){return Xe(W(e,o),t)}function zn(e){return e.label!==!1}function Ze(e){return!!e.compact}function we(e){return!!(e.inlined||e.components)}function ve(e){var t;return!!(e.nested||((t=j(e))==null?void 0:t.defaultNested)===!0)}function An(e){var t;return!!((t=j(e))!=null&&t.omitPadding)}function xe(e){var s;const t=e.default,o=t!==void 0?t:(s=j(e))==null?void 0:s.defaultValue;return d.isFunction(o)?o(e):d.clone(o)}function et(e){var o;const t=j(e);return!!(t!=null&&t.excludeValue||(o=t==null?void 0:t.ignoreMissingValue)!=null&&o.call(t,e))}function Un(e){const t=o=>Object.values(o||{}).some(zn);return t(e.components)||Object.values(e.tabs||{}).some(t)}function tt(e,t={},o){return oe(e,t,null,null,(i,r,l)=>{!(l in r)&&!et(i)&&(r[l]=xe(i))},null,{component:o,rootData:t})}function nt(e,t,o,s,{component:a=null,rootData:i=a==null?void 0:a.rootData}={}){const{compute:r}=e;if(r){const l=r(V.get(a,{value:t[o],name:o,data:t,dataPath:s,rootData:i}));l!==void 0&&(t[o]=l)}return!(o in t)&&!et(e)&&(t[o]=xe(e)),t[o]}function ot(e,t,o){if(o.schemaOnly){const s={},{idKey:a="id",orderKey:i}=e,r=t[a];return r!==void 0&&(s[a]=r),In(e)&&(s.type=t.type),i&&(s[i]=t[i]),s}else return{...t}}function Hn(e,t,o,s,{component:a,schemaOnly:i,target:r}={}){const l={component:a,schemaOnly:i,target:r,rootData:o},c=ot(t,o,l),h=new Nn;return oe(e,o,s,c,(g,f,m,k,P)=>{let w=nt(g,f,m,k,l);if(d.isArray(w)){const{wrapPrimitives:$,orderKey:S,idKey:O="id"}=g;$?w=w.map(E=>({[$]:E})):w=[...w],S&&r==="clipboard"&&w.sort((E,R)=>{const _=E==null?void 0:E[O],Le=R==null?void 0:R[O];return _==null||X(_)?1:Le==null||X(Le)?-1:_-Le})}P[m]=w},(g,f,m,k,P)=>{const{wrapPrimitives:w,exclude:$,process:S}=g;let O=P[m];const E=j(g),R=()=>V.get(a,{value:O,name:m,data:f,dataPath:k,rootData:l.rootData,processedData:P});if(w&&d.isArray(O)&&(O=O.map(_=>_[w])),S&&(O=S(R())),E!=null&&E.excludeValue||$===!0||d.isFunction($)&&$(R()))delete P[m];else{const _=E==null?void 0:E.processValue;_&&(O=_(g,O,k,h)),P[m]=O}},l),h.process(t,c,l)}function oe(e,t,o,s,a,i,r){const l=c=>{const h=(p,u)=>p!=null?F(p,u):null;if(c)for(const[p,u]of Object.entries(c))if(!ve(u))oe(u,t,o,s,a,i,r);else{const g=h(o,p),f=(k,P=null)=>{var R;const w=P!==null?h(g,P):g,$=V.get(r.component,{data:t,value:k,dataPath:w,index:P,rootData:r.rootData}),O=(((R=j(u))==null?void 0:R.getFormSchemasForProcessing)||W)(u,$),E=Xe(O,k);if(E){const _=s?ot(u,k,r):null;return oe(E,k,w,_,a,i,r)}else return{...k}};a==null||a(u,t,p,g,s);let m=s?s[p]:t[p];m!=null&&q(u)&&(d.isArray(m)?m=s?m.map(f):m.forEach(f):m=f(m),s&&(s[p]=m)),i==null||i(u,t,p,g,s)}};if(l(e.components),e.tabs)for(const c of Object.values(e.tabs))l(c.components);for(const c of lt(e,o))l(c.schema.components);return s||t}function z(e,t){const o=(s,a)=>s.length>0?s.reduce((i,r)=>{const l=a(r);return l&&(i[l.name]=l&&t?{...t,...l}:l),i},{}):null;return d.isArray(e)?o(e,s=>d.isObject(s)?s:{name:d.camelize(s,!1)}):d.isObject(e)?o(Object.entries(e),([s,a])=>d.isObject(a)?{name:s,...a}:d.isString(a)?{name:s,label:a}:null):null}function se(e){return z(e,{type:"button"})}function st(e){return d.isObject(e)?e.type:e}function j(e){return Z(st(e),!0)??null}function at(e){var t,o;return((o=(t=j(e))==null?void 0:t.getSourceType)==null?void 0:o.call(t,st(e)))??null}function rt(e,t,o){return e?{schema:e,dataPath:e.name?F(t,e.name):t,tabComponent:o}:null}function it(e,t,o,s=[]){if(e)for(const[a,i]of Object.entries(e)){const r=rt(i,F(t,a),o);r&&s.push(r)}return s}function lt(e,t,o=null,s=null){var r,l;const a=(l=(r=j(e))==null?void 0:r.getPanelSchema)==null?void 0:l.call(r,e,t,o),i=a?[rt(a,t,s)]:[];return it(e.panels,t,s,i),i}function K(e){return at(e)==="object"}function Y(e){return at(e)==="list"}function ct(e,t){const o=t[e.idKey||"id"];return o!=null?String(o):void 0}function Wn(e,t){return On(t,ct(e,t))}function Kn(e){const{mixins:t}=e;return t||e.extends?Ve({...e},e):e}function Ve(e,t){if(t.extends&&Ve(e,t.extends),t.mixins)for(const o of t.mixins)Ve(e,o);for(const o of Yn)o in t&&(e[o]=t[o]);return e}const Yn=["defaultValue","defaultNested","defaultVisible","generateLabel","excludeValue","ignoreMissingValue","omitPadding","processValue","processSchema","getPanelSchema","getFormSchemasForProcessing","beforeRouteUpdate","beforeRouteLeave"],ae={},C={mixins:[Ie],components:ae,component(e,t){if(t&&(d.isPlainObject(t)&&(t=Kn({extends:this,name:e,...t})),ae[e]=t),!(e in ae))throw new Error(`Component "${e}" not registered`);return ae[e]},methods:{getTypeComponent:Z}};class Jn{hasRole(...t){if(this.roles){for(const o of t)if(this.roles.includes(o))return!0}return!1}}const dt={provide(){return{$schemaParentComponent:()=>this}},data(){return{schemaComponents:[]}},computed:{mainSchemaComponent(){return this.schemaComponents[0]}},methods:{_registerSchemaComponent(e,t){const{schemaComponents:o}=this;t?o.push(e):o.splice(o.indexOf(e),1)}}},ht={mixins:[dt],computed:{errors(){return this.schemaComponents.reduce((e,{errors:t})=>t&&e?e.concat(t):t,null)},isTouched(){return this.schemaComponents.some(e=>e.isTouched)},isDirty(){return this.schemaComponents.some(e=>e.isDirty)},isValid(){return this.schemaComponents.every(e=>e.isValid)},isValidated(){return this.schemaComponents.every(e=>e.isValid)}},methods:{validateAll(e,t=!0){return this.schemaComponents.every(o=>o.validateAll(e,t))},verifyAll(e){return this.schemaComponents.every(t=>t.verifyAll(e))},resetValidation(){this.schemaComponents.forEach(e=>e.resetValidation())},clearErrors(){this.schemaComponents.forEach(e=>e.clearErrors())},showValidationErrors(e,t){this.schemaComponents.forEach(o=>o.showValidationErrors(e,t))}}},pt={mixins:[ht],provide(){return{$routeComponent:()=>this}},data(){return{reload:!1,store:{},loadCache:{}}},computed:{routeComponent(){return this},routeLevel(){let e=0,t=this;for(;t=t.parentComponent.routeComponent;)e++;return e},routeRecord(){return this.$route.matched[this.routeLevel]},isLastRoute(){const{matched:e}=this.$route;return this.routeRecord===e[e.length-1]},isLastUnnestedRoute(){const{matched:e}=this.$route;for(let t=e.length-1;t>=0;t--){const o=e[t];if(!o.meta.nested)return this.routeRecord===o}return!1},isNestedRoute(){return this.meta.nested},isView(){return!1},meta(){return this.routeRecord.meta},path(){return this.getRoutePath(this.routeRecord.path)},label(){return this.getLabel(this.schema)},breadcrumb(){const{breadcrumb:e}=this.schema||{};return e||`${this.breadcrumbPrefix} ${this.label}`},breadcrumbPrefix(){return""},param(){var e;return this.$route.params[(e=this.meta)==null?void 0:e.param]||null},isMutating(){return!1}},beforeRouteUpdate(e,t,o){this==null||this.beforeRouteChange(e,t,o)},beforeRouteLeave(e,t,o){this==null||this.beforeRouteChange(e,t,o)},created(){this.appState.routeComponents.push(this)},unmounted(){const{routeComponents:e}=this.appState;e.splice(e.indexOf(this),1)},methods:{beforeRouteChange(e,t,o){let s=!0;t.path.startsWith(this.path)&&!e.path.startsWith(this.path)&&t.path!==e.path&&(this.isFullRouteChange(e,t)||e.path.length<=t.path.length)&&(this.isMutating?s=this.isValidated||this.validateAll():this.isDirty&&(s=window.confirm(`You have unsaved changes. Do you really want to ${this.verbs.cancel}?`))),o(s)},getRoutePath(e){return this.$route.path.split("/").slice(0,e.split("/").length).join("/")},getChildPath(e){return`${this.path}/${e}`},isFullRouteChange(e,t){const o=this.path.match(/^(\/[^/]*)/)[1];return!d.getCommonPrefix(e.path,t.path).startsWith(o)}}},Qn=["data-resource"];function Gn(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoSchema");return e.user?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.isLastRoute?e.shouldRender(e.viewSchema)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-view dito-scroll-parent","data-resource":e.sourceSchema.path},[n.createVNode(l,{class:"dito-scroll",schema:e.viewSchema,data:e.data,meta:e.meta,store:e.getChildStore(e.name),disabled:e.isLoading,generateLabels:!1,menuHeader:!0},null,8,["schema","data","meta","store","disabled"])],8,Qn)):n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(r,{key:e.name}))],64)):n.createCommentVNode("",!0)}const b=(e,t)=>{const o=e.__vccOpts||e;for(const[s,a]of t)o[s]=a;return o},Xn=C.component("DitoView",{mixins:[pt],provide(){return{$sourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.sourceComponent)||null},$resourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.resourceComponent)||null}}},data(){return{isLoading:!1,data:{}}},computed:{schema(){return this.meta.schema},name(){return this.schema.name},isView(){return!0},isSingleComponentView(){return ne(this.schema)},mainComponent(){return this.mainSchemaComponent.getComponentByDataPath(this.name)},viewSchema(){const{component:e,...t}=this.schema;return this.isSingleComponentView?{...t,components:{[t.name]:{name:t.name,label:!1,...e}}}:t},providesData(){return Tn(this.viewSchema,e=>Me(e))}},watch:{$route(e,t){this.isFullRouteChange(e,t)&&(this.isLoading=!1,this.data={})}},methods:{setData(e){this.data=e},getChildPath(e){return this.isSingleComponentView?this.path:`${this.path}/${e}`},setLoading(e){this.isLoading=!!e}}}),ut=b(Xn,[["render",Gn]]),Tc="";function re(e,{year:t=(e==null?void 0:e.getFullYear())??0,month:o=(e==null?void 0:e.getMonth())??0,day:s=(e==null?void 0:e.getDate())??0,hour:a=(e==null?void 0:e.getHours())??0,minute:i=(e==null?void 0:e.getMinutes())??0,second:r=(e==null?void 0:e.getSeconds())??0,millisecond:l=(e==null?void 0:e.getMilliseconds())??0}={}){return new Date(t,o,s,a,i,r,l)}const Zn={class:"dito-calendar"},vn={class:"dito-calendar-popup"},xn={class:"dito-calendar-inner"},eo={class:"dito-calendar-header"},to={class:"dito-calendar-body"},no={class:"dito-calendar-weekdays"},oo={class:"dito-calendar-dates"},so=["onClick"],ao={class:"dito-calendar-footer"},ro=["title"],io={class:"dito-calendar-header"},lo={class:"dito-calendar-body"},co={class:"dito-calendar-months"},ho=["onClick"],po={class:"dito-calendar-header"},uo={class:"dito-calendar-body"},mo={class:"dito-calendar-years"},fo=["onClick"];function go(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Zn,[n.createElementVNode("div",vn,[n.createElementVNode("div",xn,[a.currentMode==="day"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",eo,[n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>i.stepYear(-1))}),n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>i.stepMonth(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1),n.createElementVNode("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>i.setMode("month"))},n.toDisplayString(i.dateToString(a.currentValue,{month:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>i.stepMonth(1))}),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>i.stepYear(1))})]),n.createElementVNode("div",to,[n.createElementVNode("div",no,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.weekdayNames,r=>(n.openBlock(),n.createElementBlock("span",null,n.toDisplayString(r.short),1))),256))]),n.createElementVNode("div",oo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.dateRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:l=>i.selectDate(r.date,r.state,!0)},n.toDisplayString(r.text),11,so))),256))])]),n.createElementVNode("div",ao,[n.createElementVNode("a",{class:"dito-calendar-select-today",role:"button",title:i.dateToString(new Date,{year:1,month:1,day:1}),onClick:t[6]||(t[6]=r=>i.selectDate(new Date))},null,8,ro)])],64)):a.currentMode==="month"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",io,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>i.stepYear(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>i.setMode("year"))},n.toDisplayString(i.dateToString(a.currentValue,{year:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>i.stepYear(1))})]),n.createElementVNode("div",lo,[n.createElementVNode("div",co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.monthNames,(r,l)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getMonthClass(l)),onClick:c=>i.selectMonth(l)},n.toDisplayString(r.short),11,ho))),256))])])],64)):a.currentMode==="year"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",po,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>i.stepDecade(-1))}),n.createElementVNode("span",null,n.toDisplayString(i.decadeToString(a.currentValue)),1),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>i.stepDecade(1))})]),n.createElementVNode("div",uo,[n.createElementVNode("div",mo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.yearRange,r=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.getYearClass(r)),onClick:l=>i.selectYear(r)},n.toDisplayString(r),11,fo))),256))])])],64)):n.createCommentVNode("",!0)])])])}const _c="",bo={emits:["update:modelValue"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=yo(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||re(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e){this.currentValue=re(this.currentValue,e)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:o,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(o,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e,t,o=!1){t!=="disabled"&&(o?this.setDate({year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}):this.currentValue=e,this.$emit("update:modelValue",this.currentValue))},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1})},selectYear(e){this.setMode("month"),this.setDate({year:e})},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:o,day:s}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:o&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({hor:e,ver:t,enter:o}){const{currentMode:s,currentValue:a}=this;if(e||t){switch(s){case"day":this.setDate({day:a.getDate()+e+t*7});break;case"month":this.setDate({month:a.getMonth()+e+t*6});break;case"year":this.setDate({year:a.getFullYear()+e+t*5});break}return!0}else if(o){switch(s){case"day":this.selectDate(a);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),o=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let h=0;h<10;h++)this.yearRange.push(s+h);let i=new Date(t,o,1).getDay()+1;i===0&&(i=7);const r=this.getDaysInMonth(t,o);if(i>1){const h=this.getYearMonth(t,o-1),p=this.getDaysInMonth(h.year,h.month);for(let u=1;u<i;u++){const g=p-i+u+1,f=new Date(h.year,h.month,g);this.dateRange.push({text:g,date:f,state:this.disabledDate(f)?"disabled":"gray"})}}const l=new Date;for(let h=1;h<=r;h++){const p=new Date(t,o,h),u=f=>f&&f.getDate()===h&&f.getFullYear()===t&&f.getMonth()===o,g=u(this.modelValue)?"active":u(l)?"today":this.disabledDate(p)?"disabled":u(e)?"current":null;this.dateRange.push({text:h,date:p,state:g})}const c=42-this.dateRange.length;if(c>0){const h=this.getYearMonth(t,o+1);for(let p=1;p<=c;p++){const u=new Date(h.year,h.month,p),g=this.disabledDate(u)?"disabled":"gray";this.dateRange.push({text:p,date:u,state:g})}}}}},mt={};function yo(e){let t=mt[e];if(!t){const o=[];for(let a=0;a<7;a++){const i=new Date(0,0,a);o.push({long:i.toLocaleString(e,{weekday:"long"}),short:i.toLocaleString(e,{weekday:"short"})})}const s=[];for(let a=1;a<=12;a++){const i=new Date(0,a,0);s.push({long:i.toLocaleString(e,{month:"long"}),short:i.toLocaleString(e,{month:"short"})})}t=mt[e]={weekdayNames:o,monthNames:s}}return t}const ko=b(bo,[["render",go]]);function ie(e,t){for(const o in t)e.addEventListener(o,t[o],!1);return{remove(){for(const o in t)e.removeEventListener(o,t[o],!1)}}}function Co(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e.keyCode]}function ft(e){const t=Co(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}const $o={class:"dito-trigger-container"};function Bo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",$o,[o.alwaysShow?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="click"?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>i.onClick&&i.onClick(...r))},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="hover"?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>i.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>i.onHover(!1))},[n.renderSlot(e.$slots,"trigger")],34)):o.trigger==="focus"||o.trigger==="always"?(n.openBlock(),n.createElementBlock("div",{key:3,class:n.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:o.transition},{default:n.withCtx(()=>[o.trigger==="hover"?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle),onMouseenter:t[3]||(t[3]=r=>i.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>i.onHover(!1))},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],38)),[[n.vShow,a.showPopup]]):n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:n.normalizeStyle(i.popupStyle)},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],6)),[[n.vShow,a.showPopup]])]),_:3},8,["name"])])}const jc="",Se=b({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${d.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),e&&this.$nextTick(()=>this.updatePosition()))}},mounted(){const{trigger:e,popup:t}=this.$refs;if(this.trigger==="focus"){const o=e.querySelector("input, textarea");o&&(this.focusEvents=ie(o,{focus:()=>{this.showPopup=!0},blur:()=>{this.showPopup=!1}}))}this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=ie(window,{mouseup:o=>{this.showPopup&&!t.contains(o.target)&&!e.contains(o.target)&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},beforeUnmount(){var e,t;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),this.mouseLeaveTimer=null},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const o=d.isString(this.target)?this.$refs[this.target]:this.target;if(o){const m=o===t?e:t.firstElementChild;m&&(m.style.width=getComputedStyle(o).width)}const s=(o||e).getBoundingClientRect(),a=s.left+window.scrollX,i=s.top+window.scrollY,r=s.width,l=s.height,c=t.offsetWidth,h=t.offsetHeight;let[p,u]=this.popupPlacement.split("-")||[];if(this.keepInView){const m=window.innerWidth,k=window.innerHeight;p==="top"?i<h&&(p="bottom"):p==="bottom"?k-i-l<h&&(p="top"):p==="left"?a<c&&(p="right"):p==="right"&&m-a-r<c&&(p="left"),u==="top"?k-i<h&&(u="bottom"):u==="bottom"?i+l<h&&(u="top"):u==="left"?m-a<c&&(u="right"):u==="right"&&a+r<c&&(u="left")}let g=0,f=0;switch(p){case"top":f-=h;break;case"left":g-=c;break;case"right":g+=r;break;case"bottom":f+=l;break}switch(u){case"right":g-=c-r;break;case"bottom":f-=h-l;break}if(this.cover&&(p==="top"?f+=l:p==="bottom"&&(f-=l)),o&&o!==e){const m=e.getBoundingClientRect();g+=a-m.left,f+=i-m.top}t.style.left=`${g}px`,t.style.top=`${f}px`},onClick(){this.disabled||(this.showPopup=!this.showPopup)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Bo]]),Do={class:"dito-input"},wo=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Vo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Do,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>a.currentValue=r),type:o.type,name:o.name,title:o.title,disabled:o.disabled,readonly:o.readonly,autofocus:o.autofocus,placeholder:o.placeholder,autocomplete:o.autocomplete,"aria-label":o.title},e.$attrs),null,16,wo),[[n.vModelDynamic,a.currentValue]])])}const Mc="",J=b({emits:["update:modelValue"],props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{size(){const{size:e,min:t,max:o}=this.$attrs,s=a=>a!=null?`${a}`.length:0;return e||s(t)||s(o)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Vo]]);function So(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Calendar"),c=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(c,n.mergeProps({class:"dito-date-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[4]||(t[4]=h=>a.showPopup=h),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-date-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=h=>i.currentText=h),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=h=>a.inputFocused=!0),onBlur:t[2]||(t[2]=h=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createVNode(l,n.mergeProps({class:"dito-date-picker-popup",ref:"calendar",modelValue:a.currentValue,"onUpdate:modelValue":t[3]||(t[3]=h=>a.currentValue=h)},{locale:o.locale,disabledDate:o.disabledDate}),null,16,["modelValue"])]),_:1},16,["show"])}const qc="",gt=b({components:{Trigger:Se,Calendar:ko,InputField:J},emits:["update:modelValue","update:show","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},locale:{type:String,default:"en-US"},dateFormat:{type:Object,default:()=>d.defaultFormats.date},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return d.format(this.currentValue,{locale:this.locale,date:this.dateFormat,time:!1})||""}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.showPopup=!1,this.$emit("update:modelValue",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("update:modelValue",this.currentValue)))}},methods:{onKeyDown(e){var t;(t=this.$refs.calendar)!=null&&t.navigate(ft(e))&&e.preventDefault()},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",So]]);function bt(e,t,o){const s=window.requestAnimationFrame||function(){return setTimeout(arguments[0],10)};if(o<=0)e.scrollTop=t;else{const i=(t-e.scrollTop)/o*10;s(()=>{e.scrollTop=e.scrollTop+i,e.scrollTop!==t&&bt(e,t,o-10)})}}function Po(e,t,o){if(e.createTextRange){const s=e.createTextRange();s.collapse(!0),s.moveStart("character",t),s.moveEnd("character",o),s.select(),e.focus()}else e.setSelectionRange?(e.focus(),e.setSelectionRange(t,o)):"selectionStart"in e&&(e.selectionStart=t,e.selectionEnd=o,e.focus())}const Eo={class:"dito-time-picker-popup"},Oo={class:"dito-time-picker-panel"},No=["onClick"],Fo={class:"dito-time-picker-panel"},Lo=["onClick"],To={class:"dito-time-picker-panel"},_o=["onClick"];function jo(e,t,o,s,a,i){const r=n.resolveComponent("InputField"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-time-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[6]||(t[6]=c=>a.showPopup=c),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(r,n.mergeProps({class:["dito-time-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[0]||(t[0]=c=>i.currentText=c),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=c=>a.inputFocused=!0),onBlur:t[2]||(t[2]=c=>a.inputFocused=!1),onKeydown:i.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createElementVNode("div",Eo,[n.createElementVNode("div",Oo,[n.createElementVNode("ul",{class:"dito-time-picker-hour",ref:"hour",onMouseover:t[3]||(t[3]=c=>a.selection=0)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(24,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledHour(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.hour===c-1}),onClick:h=>i.hour=c-1},n.toDisplayString(i.leftPad(c-1)),11,No))],64))),64))],544)]),n.createElementVNode("div",Fo,[n.createElementVNode("ul",{class:"dito-time-picker-minute",ref:"minute",onMouseover:t[4]||(t[4]=c=>a.selection=1)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledMinute(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.minute===c-1}),onClick:h=>i.minute=c-1},n.toDisplayString(i.leftPad(c-1)),11,Lo))],64))),64))],544)]),n.createElementVNode("div",To,[n.createElementVNode("ul",{class:"dito-time-picker-second",ref:"second",onMouseover:t[5]||(t[5]=c=>a.selection=2)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledSecond(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:i.second===c-1}),onClick:h=>i.second=c-1},n.toDisplayString(i.leftPad(c-1)),11,_o))],64))),64))],544)])])]),_:1},16,["show"])}const Ac="",yt=b({components:{Trigger:Se,InputField:J},emits:["update:modelValue","update:show","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,selection:0,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return this.currentValue?`${this.leftPad(this.hour)}:${this.leftPad(this.minute)}:${this.leftPad(this.second)}`:""},currentDate(){return this.currentValue||re(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e),this.scrollAll())},currentText:"updateSelection",selection:"updateSelection",show(e){this.showPopup=e},showPopup(e,t){e&&(this.updateSelection(),this.scrollAll(0)),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=re(this.currentDate,{...e,millisecond:0})},updateSelection(e=!1){if(this.showPopup||e){const t=3*this.selection;this.$nextTick(()=>Po(this.$refs.input,t,t+2))}},scrollAll(e=100){const t=(o,s)=>{const a=this.$refs[o];if(a){const i=a.scrollHeight/(a.children.length+6);bt(a,Math.round(s*i),e)}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onKeyDown(e){const t=["hour","minute","second"][this.selection];if(t){const{hor:o,ver:s,enter:a}=ft(e);if(o){const i=this.selection+o;this.selection=i<0?2:i>2?0:i}else if(s){const i=this[t]+s,{length:r}=this.$refs[t].children;this[t]=i<0?i+r:i>=r?i-r:i}a&&(this.showPopup=!1),(o||s||a)&&(this.updateSelection(!0),e.preventDefault())}},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",jo]]),Ro={class:"dito-date-time-picker",ref:"picker"};function Mo(e,t,o,s,a,i){const r=n.resolveComponent("DatePicker"),l=n.resolveComponent("TimePicker");return n.openBlock(),n.createElementBlock("div",Ro,[n.createElementVNode("div",{class:n.normalizeClass(["dito-pickers",{"dito-focus":i.focused}])},[n.createVNode(r,n.mergeProps({ref:"date",modelValue:a.currentValue,"onUpdate:modelValue":t[0]||(t[0]=c=>a.currentValue=c),show:a.showDate,"onUpdate:show":t[1]||(t[1]=c=>a.showDate=c),placement:"bottom-left",target:e.$refs.picker},{transition:o.transition,placeholder:o.placeholder,locale:o.locale,dateFormat:o.dateFormat,disabled:o.disabled},{onFocus:t[2]||(t[2]=c=>a.dateFocused=!0),onBlur:t[3]||(t[3]=c=>a.dateFocused=!1)}),null,16,["modelValue","show","target"]),n.createVNode(l,n.mergeProps({ref:"time",modelValue:a.currentValue,"onUpdate:modelValue":t[4]||(t[4]=c=>a.currentValue=c),show:a.showTime,"onUpdate:show":t[5]||(t[5]=c=>a.showTime=c),placeholder:"",placement:"bottom-right",target:e.$refs.picker},{transition:o.transition,disabled:o.disabled},{onFocus:t[6]||(t[6]=c=>a.timeFocused=!0),onBlur:t[7]||(t[7]=c=>a.timeFocused=!1)}),null,16,["modelValue","show","target"])],2)],512)}const Hc="",Io=b({components:{DatePicker:gt,TimePicker:yt},emits:["update:modelValue","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},dateFormat:{type:Object,default:()=>d.defaultFormats.date},locale:{type:String,default:"en-US"},disabled:{type:Boolean,default:!1}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,dateFocused:!1,timeFocused:!1,changed:!1}},computed:{focused(){return this.dateFocused||this.timeFocused}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e))},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{focus(){this.$refs.date.focus()},blur(){this.$refs.date.blur(),this.$refs.time.blur()}}},[["render",Mo]]);function qo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("i",{class:n.normalizeClass(["dito-icon",`dito-icon-${o.name}`])},null,2)}const Kc="",zo=b({props:{name:{type:String,required:!0}}},[["render",qo]]),Ao={class:"dito-pagination"},Uo={key:0,class:"dito-pagination-total"},Ho={class:"dito-buttons dito-buttons-round"},Wo=["disabled","onClick"],Ko={key:0};function Yo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Ao,[o.showTotal?(n.openBlock(),n.createElementBlock("div",Uo,[o.total>0?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(i.first)+" – "+n.toDisplayString(i.last),1)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("0")],64)),n.createTextVNode("/ "+n.toDisplayString(o.total),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",Ho,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.pageRange,r=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",i.getPageClass(r)]),disabled:r.disabled,onClick:l=>i.onClickPage(r)},[r.text?(n.openBlock(),n.createElementBlock("span",Ko,n.toDisplayString(r.text),1)):n.createCommentVNode("",!0)],10,Wo))),256))])])}const Jc="",Jo=b({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{pageRange:[],showPrev:!0,showNext:!0,numPages:0,currentPageSize:this.pageSize,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.currentPageSize+1},last(){return Math.min(this.first+this.currentPageSize-1,this.total)}},watch:{total:"updatePageRange",showPrev:"updatePageRange",showNext:"updatePageRange",page(e){this.currentPage=e},pageSize(e){this.currentPageSize=e},currentPageSize(e){this.numPages=Math.ceil(this.total/e),this.currentPage>this.numPages&&(this.currentPage=this.numPages),this.updatePageRange()},currentPage(e,t){e!==t&&(this.updatePageRange(),this.$emit("update:page",e))}},created(){this.currentPage=this.page,this.currentPageSize=this.pageSize},mounted(){this.updatePageRange()},methods:{onClickPage(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)},getPageClass(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},updatePageRange(){const{showPrev:e,showNext:t,total:o,currentPageSize:s,currentPage:a}=this,i=e+t+1,r=this.numPages=Math.ceil(o/s);let l=1,c=1;r<=i?c=r:a<=e+1?c=i:a>=r-t?(c=r,l=r-i+1):(l=a-e,c=a+t);const h=[];h.push({index:a-1,type:"prev",disabled:a<=1}),l>=2&&h.push({index:1,text:1}),l>2&&h.push({index:Math.max(1,a-10),type:"ellipsis-prev"});for(let p=l;p<=c;p++)h.push({index:p,text:p,active:p===a});c<r-1&&h.push({index:Math.min(r,a+10),type:"ellipsis-next"}),c<=r-1&&h.push({index:r,text:r}),h.push({index:a+1,type:"next",disabled:a>=r}),this.pageRange=h}}},[["render",Yo]]),Qo={class:"dito-switch-pane"},Go=["id","name","disabled"],Xo=n.createElementVNode("div",{class:"dito-switch-button"},null,-1),Zo={key:0,class:"dito-switch-label"};function vo(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-switch",i.classes]),style:n.normalizeStyle(i.styles)},[n.createElementVNode("div",Qo,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input"},e.$attrs,{"onUpdate:modelValue":t[0]||(t[0]=r=>a.checked=r),type:"checkbox",name:o.name,disabled:o.disabled}),null,16,Go),[[n.vModelCheckbox,a.checked]]),Xo,o.labels?(n.openBlock(),n.createElementBlock("span",Zo,[a.checked?n.renderSlot(e.$slots,"checked",{key:0},()=>[n.createTextVNode(n.toDisplayString(o.labels.checked||"on"),1)]):n.renderSlot(e.$slots,"unchecked",{key:1},()=>[n.createTextVNode(n.toDisplayString(o.labels.unchecked||"off"),1)])])):n.createCommentVNode("",!0)])],6)}const Gc="",xo=b({emits:["update:modelValue","change"],props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){const{checked:e,disabled:t}=this;return{"dito-checked":e,"dito-disabled":t}},styles(){const{labels:{checked:e,unchecked:t}={}}=this,o=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":o?`${o*1.5}rem`:null}}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",vo]]),Zc="";function kt({enabled:e},{slots:t}){return e?n.h(n.Transition,ts,t):t.default()}kt.props={enabled:{type:Boolean,default:!0}};const es=kt,A=(e,t)=>Object.assign(e.style,t),Ct=e=>getComputedStyle(e).height,ts={name:"height",onAfterEnter(e){setTimeout(()=>A(e,{height:"auto"}))},onEnter(e){const{width:t}=getComputedStyle(e);A(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"});const{height:o}=getComputedStyle(e);A(e,{width:null,position:null,visibility:null,height:0}),Ct(e),setTimeout(()=>A(e,{height:o}))},onLeave(e){const{height:t}=getComputedStyle(e);A(e,{height:t}),Ct(e),setTimeout(()=>A(e,{height:0}))}},ns=L.defineComponent({name:"UseFocusTrap",props:["as","options"],setup(e,{slots:t}){let o;const s=L.ref(),a=()=>o&&o.activate(),i=()=>o&&o.deactivate();return L.watch(()=>I.unrefElement(s),r=>{r&&(o=zt.createFocusTrap(r,e.options||{}),a())},{flush:"post"}),L.onScopeDispose(()=>i()),()=>{if(t.default)return L.h(e.as||"div",{ref:s},t.default())}}});function os(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema"),c=n.resolveComponent("UseFocusTrap");return n.openBlock(),n.createElementBlock("div",{class:"dito-dialog",ref:"dialog",role:"dialog","aria-expanded":"true","aria-modal":"true",style:n.normalizeStyle({"--width":`${e.settings.width}px`}),onMouseup:t[1]||(t[1]=(...h)=>e.onMouseUp&&e.onMouseUp(...h))},[n.createVNode(c,{class:"dito-dialog__focus-trap",options:{immediate:!0,fallbackFocus:()=>e.$refs.dialog}},{default:n.withCtx(()=>[n.createElementVNode("form",{class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers((...h)=>e.submit&&e.submit(...h),["prevent"]))},[n.createVNode(l,{class:"dito-scroll",schema:e.schema,data:e.dialogData},{buttons:n.withCtx(()=>[n.createVNode(r,{class:"dito-buttons-large",buttons:e.buttonSchemas,data:e.dialogData},null,8,["buttons","data"])]),_:1},8,["schema","data"])],32)]),_:1},8,["options"])],36)}const vc="",ss=C.component("DitoDialog",{components:{UseFocusTrap:ns},emits:["remove"],provide(){return{$dialogComponent:()=>this}},props:{components:{type:Object,required:!0},buttons:{type:Object,required:!0},promise:{type:Object,required:!0},data:{type:Object,default:()=>({})},settings:{type:Object,default:()=>({width:480,clickToClose:!1})}},data(){const e=d.clone(this.data);for(const t in this.components)t in e||(e[t]=null);return{windowEvents:null,dialogData:e}},computed:{dialogComponent(){return this},schema(){return{components:this.components}},buttonSchemas(){return Object.fromEntries(Object.entries(se(this.buttons)).map(([e,t])=>(e==="cancel"&&!t.events&&(t={...t,events:{click:()=>this.cancel()}}),[e,t])))},hasButtons(){return Object.keys(this.buttonSchemas).length>0},hasCancel(){return!!this.buttonSchemas.cancel}},mounted(){this.windowEvents=ie(window,{keyup:e=>{(this.hasCancel||!this.hasButtons)&&e.keyCode===27&&this.cancel()}})},unmounted(){this.windowEvents.remove()},methods:{remove(){this.$emit("remove")},resolve(e){this.promise.resolve(e),this.remove()},reject(e){this.promise.reject(e),this.remove()},submit(){this.resolve(this.dialogData)},cancel(){this.resolve(null)},close(){this.cancel()},onMouseUp(){this.settings.clickToClose&&this.close()}}}),$t=b(ss,[["render",os]]),Q={data(){return{domHandlers:[]}},beforeUnmount(){for(const{remove:e}of this.domHandlers)e();this.domHandlers=[]},methods:{domOn(e,t,o){const s=ie(e,d.isObject(t)?t:{[t]:o});return this.domHandlers.push(s),s}}},as={class:"dito-root"},rs={class:"dito-page dito-scroll-parent"},is=[n.createElementVNode("span",null,"Login",-1)];function ls(e,t,o,s,a,i){const r=n.resolveComponent("VueNotifications"),l=n.resolveComponent("DitoDialog"),c=n.resolveComponent("DitoMenu"),h=n.resolveComponent("DitoAccount"),p=n.resolveComponent("DitoHeader"),u=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",as,[n.createVNode(r,{class:"dito-notifications",ref:"notifications",position:"top right",classes:"dito-notification"},null,512),n.createVNode(n.TransitionGroup,{name:"dito-dialog"},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.dialogs,(g,f)=>(n.openBlock(),n.createBlock(l,{key:f,components:g.components,buttons:g.buttons,promise:g.promise,data:g.data,settings:g.settings,onRemove:m=>e.removeDialog(f)},null,8,["components","buttons","promise","data","settings","onRemove"]))),128))]),_:1}),n.createVNode(c),n.createElementVNode("main",rs,[n.createVNode(p,{spinner:e.options.spinner,isLoading:e.isLoading},{default:n.withCtx(()=>[e.user?(n.openBlock(),n.createBlock(h,{key:0})):e.allowLogin?(n.openBlock(),n.createElementBlock("a",{key:1,class:"dito-login",onClick:t[0]||(t[0]=g=>e.rootComponent.login())},is)):n.createCommentVNode("",!0)]),_:1},8,["spinner","isLoading"]),n.createVNode(u)])])}const ed="",cs=C.component("DitoRoot",{mixins:[Q],components:{DitoDialog:$t},provide(){return{$views:()=>this.resolvedViews}},props:{unresolvedViews:{type:[Object,Function,Promise],required:!0},options:{type:Object,default:()=>({})}},data(){return{resolvedViews:{},removeRoutes:null,dialogs:{},allowLogin:!1,loadingCount:0}},computed:{notifications(){return this.$refs.notifications},isLoading(){return this.loadingCount>0}},created(){this.appState.title=document.title||"Dito.js Admin",this.appState.routeComponents=[]},async mounted(){this.domOn(document,{click:e=>{e.target.closest(".dito-label")||(this.appState.activeLabel=null)},keyup:e=>{e.code==="Tab"&&(this.appState.activeLabel=null)}});try{this.allowLogin=!1,await this.fetchUser()?await this.resolveViews():await this.login()}catch(e){console.error(e)}this.allowLogin=!0},methods:{notify({type:e="info",title:t,text:o}={}){t||(t={warning:"Warning",error:"Error",info:"Information",success:"Success"}[e]||"Notification"),o=`<p>${d.asArray(o).join("</p> <p>")}</p>`.replace(/\n|\r\n|\r/g,"<br>");const s={warning:"warn",error:"error",info:"log",success:"log"}[e]||"error";console[s](d.stripTags(o));const{notifications:a=!0}=this.api;if(a){const{durationFactor:i=20}=a,r=(40+o.length+t.length)*i;this.$notify({type:e,title:t,text:o,duration:r})}},closeNotifications(){this.notifications.destroyAll()},registerLoading(e){this.loadingCount+=e?1:-1},showDialog({components:e,buttons:t,data:o,settings:s}){return new Promise(async(a,i)=>{const r=[];if(await te(this.api,{components:e},r,0),r.length>0)throw new Error("Dialogs do not support components that produce routes");const l=`dialog-${++ds}`;this.dialogs[l]={components:e,buttons:t,data:o,settings:s,promise:{resolve:a,reject:i}}})},removeDialog(e){delete this.dialogs[e]},async login(){var s,a;this.allowLogin=!0;const{additionalComponents:e,redirectAfterLogin:t}=this.options.login||{},o=await this.showDialog({components:{username:{type:"text",autofocus:!0},password:{type:"password"},...e},buttons:{cancel:{},login:{type:"submit"}}});if(o)try{const i=await this.sendRequest({resource:this.api.users.login,data:o,internal:!0});t?location.replace(t):(this.setUser(i.data.user),await this.resolveViews())}catch(i){const r=(a=(s=i.response)==null?void 0:s.data)==null?void 0:a.error;this.notify({type:"error",title:"Authentication Error",text:r||i}),r||console.error(i,i.response),this.login()}},navigateHome(){return this.navigate("/")},async logout(){try{(await this.sendRequest({resource:this.api.users.logout,internal:!0})).data.success&&(this.setUser(null),this.navigateHome())}catch(e){console.error(e)}},async fetchUser(){let e=null;try{e=(await this.sendRequest({resource:this.api.users.session,internal:!0})).data.user||null}catch(t){this.notify({type:"error",title:"Authentication Error",text:t})}return this.setUser(e),e},setUser(e){this.appState.user=e&&Object.setPrototypeOf(e,Jn.prototype),e||(this.resolvedViews={},this.navigateHome())},async ensureUser(){await this.fetchUser()||await this.login()},async resolveViews(){var o;try{this.resolvedViews=await $e(this.unresolvedViews)}catch(s){return s.request||console.error(s),this.login()}const e=await d.mapConcurrently(Object.entries(this.resolvedViews),([s,a])=>jn(ut,this.api,a,s)),{fullPath:t}=this.$route;(o=this.removeRoutes)==null||o.call(this),this.removeRoutes=hs(this.$router,[{name:"root",path:"/",components:{}},...e]),this.$router.replace(t)}}});let ds=0;function hs(e,t){const o=[];for(const s of t){const a=e.addRoute(s);o.push(a)}return()=>{for(const s of o)s()}}const Pe=b(cs,[["render",ls]]),ps={class:"dito-menu dito-scroll-parent"},us={class:"dito-scroll"};function ms(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("nav",ps,[n.createElementVNode("h1",null,n.toDisplayString(e.appState.title),1),n.createElementVNode("ul",us,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.views,l=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:0,class:"dito-link",to:`/${l.path}`,activeClass:"dito-active"},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l)),1)]),_:2},1032,["to"])):n.createCommentVNode("",!0)]))),256))])])}const td="",fs=C.component("DitoMenu",{}),gs=b(fs,[["render",ms]]),bs={class:"dito-spinner"};function ys(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("div",bs,[n.createElementVNode("div",{class:"v-pulse v-pulse1",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay1])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse2",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay2])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse3",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay3])},null,4)],512)),[[n.vShow,o.loading]])}const nd="",Bt=b({props:{loading:{type:Boolean,default:!0},color:{type:String,default:"#5dc596"},size:{type:String,default:"15px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},data(){return{spinnerStyle:{backgroundColor:this.color,width:this.size,height:this.size,margin:this.margin,borderRadius:this.radius,display:"inline-block",animationName:"v-pulseStretchDelay",animationDuration:"0.75s",animationIterationCount:"infinite",animationTimingFunction:"cubic-bezier(.2,.68,.18,1.08)",animationFillMode:"both"},spinnerDelay1:{animationDelay:"0.12s"},spinnerDelay2:{animationDelay:"0.24s"},spinnerDelay3:{animationDelay:"0.36s"}}}},[["render",ys]]),ks={class:"dito-header"},Cs={class:"dito-trail"};function $s(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoSpinner");return n.openBlock(),n.createElementBlock("nav",ks,[n.createElementVNode("div",Cs,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.trail,(c,h)=>(n.openBlock(),n.createElementBlock("li",null,[h===e.trail.length-1?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(e.getBreadcrumbClass(c))},n.toDisplayString(c.breadcrumb),3)):(n.openBlock(),n.createBlock(r,{key:1,class:"dito-breadcrumb",to:c.path},{default:n.withCtx(()=>[n.createElementVNode("span",{class:n.normalizeClass(e.getBreadcrumbClass(c))},n.toDisplayString(c.breadcrumb),3)]),_:2},1032,["to"]))]))),256))]),e.isLoading?(n.openBlock(),n.createBlock(l,{key:0})):n.createCommentVNode("",!0)]),n.renderSlot(e.$slots,"default")])}const sd="",Bs=C.component("DitoHeader",{components:{DitoSpinner:Bt},props:{spinner:{type:Object,default:null},isLoading:{type:Boolean,default:!1}},computed:{trail(){return this.appState.routeComponents.filter(e=>!!e.routeRecord)}},created(){const{size:e="8px",color:t="#999"}=this.spinner||{},{props:o}=Bt;o.size.default=e,o.color.default=t},methods:{getBreadcrumbClass(e){return{"dito-dirty":e.isDirty}}}}),Ds=b(Bs,[["render",$s]]),Dt={mixins:[Q],data(){return{pulldown:{open:!1,startTime:0,checkTime:!0,events:{mousedown:()=>{this.setPulldownOpen(!1),this.pulldown.handlers.remove()},mouseup:()=>{this.onPulldownMouseUp(null)&&this.pulldown.handlers.remove()}},handlers:null}}},methods:{onPulldownMouseDown(e){e?this.checkTime=!1:(this.setPulldownOpen(!0),this.checkTime=!0)},onPulldownMouseUp(e){const{startTime:t}=this.pulldown;if(!this.checkTime||t&&Date.now()-t>250)return this.setPulldownOpen(!1),e&&this.onPulldownSelect(e),!0},onPulldownSelect(){},setPulldownOpen(e){this.pulldown.open=e,this.pulldown.startTime=e?Date.now():0,e&&(this.pulldown.handlers=this.domOn(document,this.pulldown.events))}}},ws={class:"dito-account"},Vs=["onMousedown","onMouseup"];function Ss(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",ws,[n.createElementVNode("a",{onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},[n.createElementVNode("span",null,n.toDisplayString(e.user.username),1)],32),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{onMousedown:n.withModifiers(c=>e.onPulldownMouseDown(l),["stop"]),onMouseup:c=>e.onPulldownMouseUp(l)},n.toDisplayString(r),41,Vs)]))),256))],2)])}const ad="",Ps=C.component("DitoAccount",{mixins:[Dt],data(){return{items:{settings:"Settings",logout:"Logout"}}},methods:{onPulldownSelect(e){switch(e){case"logout":this.rootComponent.logout();break;case"settings":console.info("TODO: Implement Settings");break}}}}),Es=b(Ps,[["render",Ss]]);function Os(e,t,o,s,a,i){return e.content?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.options.tag||e.tag),{key:0,class:n.normalizeClass(e.classes),style:n.normalizeStyle(e.styles)},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.options.text),1)]),_:1},8,["class","style"])):n.createCommentVNode("",!0)}const Ns=C.component("DitoElement",{props:{tag:{type:String,default:"span"},content:{type:[String,Object],default:null}},computed:{options(){const{content:e}=this;return d.isObject(e)?e:{text:e}},classes(){return{...this.$attrs.class,...wt(this.options.class)}},styles(){return{...this.$attrs.style,...wt(this.options.style)}}}});function wt(e){return d.asArray(e).reduce((t,o)=>(d.isString(o)?t[o]=!0:d.isObject(o)&&Object.assign(t,o),t),{})}const Fs=b(Ns,[["render",Os]]),Ls=["for","innerHTML"];function Ts(e,t,o,s,a,i){const r=n.resolveComponent("DitoElement");return e.text||e.collapsible?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),n.mergeProps({key:0,class:"dito-label"},e.attributes,{class:{"dito-active":e.isActive}}),{default:n.withCtx(()=>[e.collapsible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":!e.collapsed}])},null,2)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.prefixes,(l,c)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-prefix",key:`prefix-${c}`,tag:"span",content:l},null,8,["content"]))),128)),n.createElementVNode("label",{for:e.dataPath,innerHTML:e.text},null,8,Ls),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.suffixes,(l,c)=>(n.openBlock(),n.createBlock(r,{class:"dito-label-suffix",key:`suffix-${c}`,tag:"span",content:l},null,8,["content"]))),128)),n.renderSlot(e.$slots,"edit-buttons")]),_:3},16,["class"])):n.createCommentVNode("",!0)}const rd="",_s=C.component("DitoLabel",{emits:["expand"],props:{label:{type:[String,Object],default:null},dataPath:{type:String,default:null},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1}},computed:{tag(){return this.collapsible?"a":"div"},text(){const{label:e}=this;return d.isObject(e)?e==null?void 0:e.text:e},prefixes(){var e;return d.asArray((e=this.label)==null?void 0:e.prefix)},suffixes(){var e;return d.asArray((e=this.label)==null?void 0:e.suffix)},attributes(){return this.collapsible?{onClick:this.onClick}:{}},isActive(){return this.appState.activeLabel===this}},methods:{onClick(){this.appState.activeLabel=this,this.$emit("expand",this.collapsed)}}}),js=b(_s,[["render",Ts]]),Ee={methods:{getItemFormSchema:De,getItemUid:Wn,getItemId(e,t,o=null){return this.isTransient&&o!==null?String(o):ct(e,t)},getItemDataPath(e,t){let{dataPath:o}=this;return e!==this.schema&&(o=F(o,e.name)),t!=null&&(o=F(o,t)),o},findItemIdIndex(e,t,o){const s=this.isTransient?o:t==null?void 0:t.findIndex((a,i)=>this.getItemId(e,a,i)===o);return s!==-1?s:null},getItemLabel(e,t,{index:o=null,extended:s=!1,asObject:a=!1}={}){const{itemLabel:i}=e;if(!t||!s&&i===!1)return null;let r;const l=()=>r||(r=this.getItemDataPath(e,o));let c;const h=()=>c||(c=this.getLabel(De(e,t,this.context)));let p,u,g;if(d.isFunction(i)){const m=i.call(this,new V(this,{nested:!1,data:t,value:t,index:o,get dataPath(){return l()},get formLabel(){return h()}}));d.isObject(m)?{text:p,prefix:u,suffix:g}=m:p=m,s=!1}else if(d.isString(i)&&!(i in t))p=i;else{const{columns:m}=e,k=d.isString(i)&&i||Y(e)&&m&&Object.keys(m)[0]||"name";p=t[k]}const f=!!p;if(p==null&&(s=!0,p=Y(e)&&o!==null?p=`${o+1}`:""),s){const m=h();m&&(p=`${m} ${f?`'${p}'`:p}`)}return a?{text:p,prefix:u,suffix:g}:p}}},Rs={class:"dito-schema"},Ms={class:"dito-schema-content"};function Is(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTabs"),c=n.resolveComponent("DitoClipboard"),h=n.resolveComponent("DitoPane"),p=n.resolveComponent("TransitionHeight"),u=n.resolveComponent("DitoPanels");return n.openBlock(),n.createElementBlock("div",Rs,[n.createElementVNode("div",Ms,[e.hasLabel||e.hasTabs||e.clipboard?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-schema-header",{"dito-schema-menu-header":e.menuHeader}])},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.dataPath,collapsible:e.collapsible,collapsed:!e.opened,onExpand:e.onExpand},n.createSlots({_:2},[e.inlined?{name:"edit-buttons",fn:n.withCtx(()=>[n.renderSlot(e.$slots,"edit-buttons")]),key:"0"}:void 0]),1032,["label","dataPath","collapsible","collapsed","onExpand"])):n.createCommentVNode("",!0),e.tabs?(n.openBlock(),n.createBlock(l,{key:1,tabs:e.tabs,selectedTab:e.selectedTab},null,8,["tabs","selectedTab"])):n.createCommentVNode("",!0),n.createVNode(c,{clipboard:e.clipboard,dataPath:e.dataPath,data:e.data},null,8,["clipboard","dataPath","data"])],2)):n.createCommentVNode("",!0),e.hasTabs?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(e.tabs,(g,f)=>(n.openBlock(),n.createBlock(h,{class:"dito-pane-tab",ref_for:!0,ref:"tabs",key:f,visible:e.selectedTab===f,tab:f,schema:g,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasMainPane,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["visible","tab","schema","dataPath","data","meta","store","single","disabled","generateLabels"]))),128)):n.createCommentVNode("",!0),n.createVNode(p,{enabled:e.inlined},{default:n.withCtx(()=>[e.hasMainPane&&e.opened?(n.openBlock(),n.createBlock(h,{key:0,class:"dito-pane-main",ref:"components",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasTabs,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","disabled","generateLabels"])):n.createCommentVNode("",!0)]),_:1},8,["enabled"]),!e.inlined&&e.isPopulated?n.renderSlot(e.$slots,"buttons",{key:2}):n.createCommentVNode("",!0)]),e.inlined?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.hasLabel?n.createCommentVNode("",!0):n.renderSlot(e.$slots,"edit-buttons",{key:0})],64)):e.isPopulated?(n.openBlock(),n.createBlock(u,{key:1,panels:e.panelSchemas,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])):n.createCommentVNode("",!0)])}const id="",qs=C.component("DitoSchema",{mixins:[Ee],components:{TransitionHeight:es},provide(){return{$schemaComponent:()=>this}},inject:["$schemaParentComponent"],props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},label:{type:[String,Object],default:null},inlined:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0},hasOwnData:{type:Boolean,default:!1},menuHeader:{type:Boolean,default:!1}},data(){const{data:e}=this.schema;return{...e&&d.isFunction(e)?e.call(this,this.context):e,componentsRegistry:{},panesRegistry:{},panelsRegistry:{}}},computed:{schemaComponent(){return this},parentSchemaComponent(){return this.hasOwnData?null:this.parentComponent.schemaComponent},panelSchemas(){const e=it(this.schema.panels,"");for(const t of this.panes)e.push(...t.panelSchemas);return e},tabs(){return z(this.schema.tabs)},selectedTab(){var o,s;const e=((o=this.$route.hash)==null?void 0:o.slice(1))||null,t=e&&this.shouldRender(this.tabs[e])?e:((s=this.defaultTab)==null?void 0:s.name)||null;return t!==e&&this.$router.replace({hash:`#${t}`}),t},defaultTab(){let e=null;if(this.tabs)for(const t of Object.values(this.tabs)){const{defaultTab:o}=t;if(d.isFunction(o)?o.call(this,this.context):o)return t;e||(e=t)}return e},clipboard(){var e;return(e=this.schema)==null?void 0:e.clipboard},processedData(){return this.processData({target:"server",schemaOnly:!0})},clipboardData(){return{$schema:this.schema.name,...this.processData({target:"clipboard",schemaOnly:!0})}},item(){return this.data},rootItem(){return this.rootData},processedItem(){return this.processedData},clipboardItem(){return this.clipboardData},parentItem(){return ue(this.rootData,this.dataPath,!1)},formLabel(){return this.getLabel(this.getItemFormSchema(this.sourceSchema,this.data,this.context))},isDirty(){return this.someComponent(e=>e.isDirty)},isTouched(){return this.someComponent(e=>e.isTouched)},isValid(){return this.everyComponent(e=>e.isValid)},isValidated(){return this.everyComponent(e=>e.isValidated)},hasData(){return!!this.data},hasLabel(){return!!this.label||this.collapsible},hasTabs(){return!this.inlined&&!!this.tabs},hasMainPane(){const{components:e}=this.schema;return!!e&&Object.keys(e).length>0},opened:ke("opened",{default(){return!this.collapsed}}),components(){return Object.values(this.componentsRegistry)},panes(){return Object.values(this.panesRegistry)},panels(){return Object.values(this.panelsRegistry)},componentsByDataPath(){return this._listEntriesByDataPath(this.componentsRegistry)},panesByDataPath(){return this._listEntriesByDataPath(this.panesRegistry)},panelsByDataPath(){return this._listEntriesByDataPath(this.panelsRegistry)}},created(){this._register(!0),this.setupSchemaFields(),this.delegate("change",this.parentSchemaComponent),this.emitEvent("initialize")},beforeUnmount(){this.emitEvent("destroy"),this._register(!1)},methods:{getComponentsByDataPath(e,t){return this._getEntriesByDataPath(this.componentsByDataPath,e,t)},getComponentByDataPath(e,t){return this.getComponentsByDataPath(e,t)[0]||null},getComponentsByName(e,t){return this._getEntriesByName(this.componentsByDataPath,e,t)},getComponentByName(e,t){return this.getComponentsByName(e,t)[0]||null},getComponents(e,t){return this._getEntries(this.componentsByDataPath,e,t)},getComponent(e,t){return this.getComponents(e,t)[0]||null},getPanelsByDataPath(e,t){return this._getEntriesByDataPath(this.panelsByDataPath,e,t)},getPanelByDataPath(e,t){return this.getPanelsByDataPath(e,t)[0]||null},getPanels(e,t){return this._getEntries(this.panelsByDataPath,e,t)},getPanel(e,t){return this.getPanels(e,t)[0]||null},someComponent(e){return this.isPopulated&&this.components.some(e)},everyComponent(e){return this.isPopulated&&this.components.every(e)},onExpand(e){this.emitEvent("expand",{context:{expand:e}}),(!this.opened||e||this.validateAll())&&(this.opened=e)},onChange(){this.emitEvent("change")},resetValidation(){for(const e of this.components)e.resetValidation()},clearErrors(){for(const e of this.components)e.clearErrors()},focus(){var e;(e=this.parentSchemaComponent)==null||e.focus(),this.opened=!0},validateAll(e,t=!0){const{componentsByDataPath:o}=this;let s;if(e){const r=d.isFunction(e)?e:d.isRegExp(e)?l=>e.test(l):null;s=r?Object.keys(o).filter(r):d.isArray(e)?e:[e]}t&&this.clearErrors();let a=!0,i=!0;s||(s=Object.keys(o));for(const r of s){const l=this.getComponentsByDataPath(r);for(const c of l)c.validate(t)||(t&&i&&c.focus(),i=!1,a=!1)}return t&&!a&&this.notifyErrors(),a},verifyAll(e){return this.validateAll(e,!1)},async showValidationErrors(e,t){var a;this.clearErrors();let o=!0;const s=[];for(const[i,r]of Object.entries(e)){const l=this.hasOwnData?F(this.dataPath,i):i,c=d.parseDataPath(l);let h=!1;const p=this.getComponentsByDataPath(c);for(const u of p)u.showValidationErrors(r,o&&t)&&(h=!0,o=!1);if(!h){const u=c.pop();for(;c.length>0;){const f=this.getComponentsByDataPath(c);for(const m of f)if(await((a=m.navigateToComponent)==null?void 0:a.call(m,l,k=>{let P=!1;for(const w of k){const $=e[w.dataPath];$&&w.showValidationErrors($,o&&t)&&(P=!0,o=!1)}return P})))return;c.pop()}const g=d.labelize(u);for(const f of r){const m=g?`The field ${g}`:`The ${this.formLabel}`;s.push(`${m} ${f.message}`)}}o=!1}o||this.notifyErrors(s.join(`
2
- `))},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,tt(this.schema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={};for(const[o,s]of Object.entries(e))(d.isArray(s)||d.isObject(s))&&this.getComponentsByName(o).some(i=>i.providesData)||(t[o]=s);return t},processData({target:e="clipboard",schemaOnly:t=!0}={}){return Hn(this.schema,this.sourceSchema,this.data,this.dataPath,{component:this,schemaOnly:t,target:e})},_register(e){var t;(t=this.$schemaParentComponent())==null||t._registerSchemaComponent(this,e)},_registerComponent(e,t){var o;this._registerEntry(this.componentsRegistry,e,t),(o=this.parentSchemaComponent)==null||o._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||(t[s]=[])).push(o),t},{})},_getEntries(e,t,o){return d.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t,o):this._getEntriesByName(e,t,o)},_getEntriesByDataPath(e,t,o){return this._filterEntries(e[d.normalizeDataPath(t)]||[],o)},_getEntriesByName(e,t,o){return this._filterEntries(e[F(this.dataPath,t)]||[],o)},_filterEntries(e,t){return t?e.filter(t):e}}}),zs=b(qs,[["render",Is]]);function As(e,t,o,s,a,i){const r=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:n.normalizeClass(["dito-schema-inlined",{"dito-schema-compact":e.isCompact}]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,inlined:!0,disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(r,{key:0,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=c=>e.$emit("delete"))},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","disabled","collapsed","collapsible","class"])}const ld="",Us=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null}},computed:{isCompact(){return Ze(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),Hs=b(Us,[["render",As]]),Ws={key:0,class:"dito-pane"},Ks={key:0,class:"dito-break"},Ys={key:2,class:"dito-break"};function Js(e,t,o,s,a,i){const r=n.resolveComponent("DitoContainer");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",Ws,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:l,dataPath:c,nestedDataPath:h,nested:p,store:u})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[l.break==="before"?(n.openBlock(),n.createElementBlock("div",Ks)):n.createCommentVNode("",!0),e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:h,schema:l,dataPath:c,data:e.data,meta:e.meta,store:u,single:e.isSingleComponent,nested:p,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","nested","disabled","generateLabels"])):n.createCommentVNode("",!0),l.break==="after"?(n.openBlock(),n.createElementBlock("div",Ys)):n.createCommentVNode("",!0)],64))),256))],512)),[[n.vShow,e.visible]]):n.createCommentVNode("",!0)}const cd="",Qs=C.component("DitoPane",{provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0}},computed:{tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){var t,o;const e=(t=this.sourceSchema)==null?void 0:t.wrapPrimitives;return Object.entries(((o=this.schema)==null?void 0:o.components)||{}).map(([s,a])=>{a.name=s;const i=ve(a),r=F(this.dataPath,s);return{schema:a,dataPath:i&&!e?r:this.dataPath,nestedDataPath:r,nested:i,store:i?this.getChildStore(s):this.store}})},panelSchemas(){return this.componentSchemas.flatMap(({schema:e,nestedDataPath:t})=>lt(e,t,this.schemaComponent,this.tabComponent))},isSingleComponent(){return this.single&&this.componentSchemas.length===1}},created(){this._register(!0)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){this.tab&&this.$router.push({hash:`#${this.tab}`})}}}),Gs=b(Qs,[["render",Js]]);function Xs(e){const t=d.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function Zs(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClass]),style:n.normalizeStyle(e.containerStyle)},[e.label?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.labelDataPath,class:n.normalizeClass(e.componentClass)},null,8,["label","dataPath","class"])):n.createCommentVNode("",!0),(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{class:n.normalizeClass(["dito-component",e.componentClass]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:e.single,nested:e.nested,disabled:e.componentDisabled,onErrors:e.onErrors},null,40,["schema","dataPath","data","meta","store","single","nested","disabled","class","onErrors"])),n.createVNode(l,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const dd="",vs=C.component("DitoContainer",{props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},generateLabels:{type:Boolean,default:!0}},data(){return{errors:null}},computed:{context(){return new V(this,{nested:this.nested})},typeComponent(){return Z(this.schema.type)},hasLabel(){var o;const{schema:e}=this,{label:t}=e;return t!==!1&&(!!t||((o=this.typeComponent)==null?void 0:o.generateLabel)&&this.generateLabels)},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},componentWidth:y("width",{type:[String,Number],default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultWidth},get(e){return e===void 0?1:d.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),componentWidthOperator:y("width",{type:String,get(e){return d.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:y("visible",{type:Boolean,default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultVisible}}),componentDisabled:y("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),containerClass(){const{class:e}=this.schema;return{"dito-single":this.single,"dito-omit-padding":An(this.schema),...d.isString(e)?{[e]:!0}:e}},componentBasis(){const e=this.componentWidth,t=[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e):/[a-z]/.test(e)?e:Xs(e)*100;return d.isNumber(t)?`${t}%`:t},containerStyle(){const e=this.componentWidthOperator===">"||this.componentWidth==="fill",t=this.componentWidthOperator==="<";return{flex:`${e?1:0} ${t?1:0} ${this.componentBasis}`}},componentClass(){const e=this.componentBasis==="auto";return{"dito-single":this.single,"dito-disabled":this.componentDisabled,"dito-width-fill":!e||this.componentWidth==="fill","dito-width-auto":e,"dito-has-errors":!!this.errors}}},methods:{onErrors(e){this.errors=e}}}),xs=b(vs,[["render",Zs]]),ea={class:"dito-tabs"};function ta(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",ea,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(l,c)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{class:n.normalizeClass(["dito-link",{"dito-active":e.selectedTab===c}]),key:c,to:{hash:`#${c}`}},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l,c)),1)]),_:2},1032,["to","class"])):n.createCommentVNode("",!0)],64))),256))])}const hd="",na=C.component("DitoTabs",{props:{tabs:{type:Object,default:null},selectedTab:{type:String,default:null}}}),oa=b(na,[["render",ta]]),sa={class:"dito-panel-title"};function aa(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createElementVNode("label",sa,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(l,{class:"dito-panel-schema",schema:e.panelSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled,hasOwnData:e.hasOwnData},{buttons:n.withCtx(()=>[n.createVNode(r,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]])}const pd="",ra=C.component("DitoPanel",{mixins:[ht],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return se(this.schema.buttons)},target(){return this.schema.target||this.dataPath},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:y("visible",{type:Boolean,default:!0})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=d.isFunction(e)?e.call(this,this.context):e)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),ia=b(ra,[["render",aa]]),la={key:0,class:"dito-panels"};function ca(e,t,o,s,a,i){const r=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",la,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:c,tabComponent:h})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:e.getPanelKey(c,h),schema:l,dataPath:c,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled!=null?l.disabled:e.disabled,panelTabComponent:h},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const ud="",da=C.component("DitoPanels",{props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),ha=b(da,[["render",ca]]);function Vt(e){return e&&d.asArray(e).some(t=>t.type!==n.Comment)}function pa(e,t={}){return e=d.isString(e)?n.useSlots()[e]:e,Vt(e==null?void 0:e(t))}const ua={key:0,class:"dito-buttons"},ma={key:0,class:"dito-container"};function fa(e,t,o,s,a,i){var c,h;const r=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",ua,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(p,u)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(p)?(n.openBlock(),n.createBlock(r,{key:u,schema:p,dataPath:u,data:e.data,meta:e.meta,store:e.getChildStore(p.name),disabled:e.disabled,generateLabels:!1},null,8,["schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList((h=(c=e.$slots).default)==null?void 0:h.call(c),p=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(p)?(n.openBlock(),n.createElementBlock("div",ma,[n.createVNode(l,{vnode:p},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const md="",ga=C.component("DitoButtons",{provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[F(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:pa,hasVNodeContent:Vt}}),ba=b(ga,[["render",fa]]);function ya(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),c=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(c,{class:"dito-edit-buttons dito-buttons-round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.isDraggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.isEditable?(n.openBlock(),n.createBlock(r,n.mergeProps({key:1,class:"dito-button",to:{path:e.editPath}},e.getButtonAttributes(e.verbs.edit)),null,16,["to"])):n.createCommentVNode("",!0),e.isCreatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,path:e.createPath,verb:e.verbs.create,text:e.createButtonText},null,8,["schema","path","verb","text"])):n.createCommentVNode("",!0),e.isDeletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=h=>e.$emit("delete"))}),null,16)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store"])}const fd="",ka=C.component("DitoEditButtons",{emits:["delete"],props:{draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null},buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggable(){return this.hasOption("draggable")},isEditable(){return this.hasOption("editable")&&!!this.editPath},isCreatable(){return this.hasOption("creatable")&&!!this.createPath},isDeletable(){return this.hasOption("deletable")},createButtonText(){var e;return((e=this.schema.creatable)==null?void 0:e.label)||this.formLabel&&`${d.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasOption(e){return!!(this[e]&&this.schema[e]!==!1)}}}),Ca=b(ka,[["render",ya]]),$a={class:"dito-create-button"},Ba=["title"],Da=["onMousedown","onMouseup"],wa=["type","title"];function Va(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",$a,[e.showPulldown?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:"button",title:e.labelize(e.verb),onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},n.toDisplayString(e.text),43,Ba),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.forms,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[e.isCreatable(r)?(n.openBlock(),n.createElementBlock("a",{key:0,class:n.normalizeClass(`dito-type-${l}`),onMousedown:n.withModifiers(c=>e.onPulldownMouseDown(l),["stop"]),onMouseup:c=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(r)),43,Da)):n.createCommentVNode("",!0)]))),256))],2)],64)):(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:e.isInlined?"button":"submit",title:e.labelize(e.verb),onClick:t[1]||(t[1]=r=>e.createItem(e.forms.default))},n.toDisplayString(e.text),11,wa))])}const gd="",Sa=C.component("DitoCreateButton",{mixins:[Dt],props:{schema:{type:Object,required:!0},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null}},computed:{forms(){return W(this.schema,this.context)},isInlined(){return we(this.schema)},showPulldown(){return Object.keys(this.forms).length>1||!this.forms.default}},methods:{isCreatable(e){return e.creatable!==!1},createItem(e,t=null){if(this.isCreatable(e))this.isInlined?this.sourceComponent.createItem(e,t):this.$router.push({path:`${this.path}/create`,query:{type:t}});else throw new Error("Not allowed to create item for given form")},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),Pa=b(Sa,[["render",Va]]),Ea={key:0,class:"dito-clipboard dito-buttons dito-buttons-round"},Oa=["disabled"],Na=["disabled"];function Fa(e,t,o,s,a,i){return e.clipboard?(n.openBlock(),n.createElementBlock("div",Ea,[n.createElementVNode("button",{class:"dito-button dito-button-copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...r)=>e.onCopy&&e.onCopy(...r))},null,8,Oa),n.createElementVNode("button",{class:"dito-button dito-button-paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...r)=>e.onPaste&&e.onPaste(...r))},null,8,Na)])):n.createCommentVNode("",!0)}const La=C.component("DitoClipboard",{mixins:[Q],props:{clipboard:{type:[Boolean,Object],default:!1},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null}},data(){return{copyEnabled:!1,pasteEnabled:!1,fixClipboard:!0}},computed:{clipboardOptions(){return d.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>d.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>t}},mounted(){this.domOn(document,{copy:this.checkClipboard}),this.domOn(window,{focus:this.checkClipboard}),this.$watch("data",{immediate:!0,handler:(e,t)=>{e!==t&&this.checkClipboard()}})},methods:{async getClipboardData(e){var a,i,r,l,c;let{clipboardData:t}=this.appState;try{const h=await((i=(a=navigator.clipboard)==null?void 0:a.readText)==null?void 0:i.call(a));this.fixClipboard&&h&&(await((l=(r=navigator.clipboard)==null?void 0:r.writeText)==null?void 0:l.call(r,h)),this.fixClipboard=!1),h&&(t=JSON.parse(h))}catch(h){e&&(console.error(h,h.name,h.message),h.name==="SyntaxError"&&alert(d.deindent`
1
+ (function(n,O){typeof exports=="object"&&typeof module<"u"?module.exports=O(require("vue"),require("vue-router"),require("@kyvg/vue3-notification"),require("@ditojs/utils"),require("nanoid"),require("vue-demi"),require("focus-trap"),require("@vueuse/core"),require("sortablejs"),require("codeflask"),require("tinycolor2"),require("@lk77/vue3-color"),require("@tiptap/vue-3"),require("@tiptap/extension-document"),require("@tiptap/extension-text"),require("@tiptap/extension-bold"),require("@tiptap/extension-code"),require("@tiptap/extension-italic"),require("@tiptap/extension-link"),require("@tiptap/extension-strike"),require("@tiptap/extension-underline"),require("@tiptap/extension-blockquote"),require("@tiptap/extension-code-block"),require("@tiptap/extension-hard-break"),require("@tiptap/extension-heading"),require("@tiptap/extension-paragraph"),require("@tiptap/extension-horizontal-rule"),require("@tiptap/extension-ordered-list"),require("@tiptap/extension-bullet-list"),require("@tiptap/extension-list-item"),require("@tiptap/extension-history"),require("vue-multiselect"),require("filesize-parser"),require("filesize"),require("vue-upload-component")):typeof define=="function"&&define.amd?define(["vue","vue-router","@kyvg/vue3-notification","@ditojs/utils","nanoid","vue-demi","focus-trap","@vueuse/core","sortablejs","codeflask","tinycolor2","@lk77/vue3-color","@tiptap/vue-3","@tiptap/extension-document","@tiptap/extension-text","@tiptap/extension-bold","@tiptap/extension-code","@tiptap/extension-italic","@tiptap/extension-link","@tiptap/extension-strike","@tiptap/extension-underline","@tiptap/extension-blockquote","@tiptap/extension-code-block","@tiptap/extension-hard-break","@tiptap/extension-heading","@tiptap/extension-paragraph","@tiptap/extension-horizontal-rule","@tiptap/extension-ordered-list","@tiptap/extension-bullet-list","@tiptap/extension-list-item","@tiptap/extension-history","vue-multiselect","filesize-parser","filesize","vue-upload-component"],O):(n=typeof globalThis<"u"?globalThis:n||self,n["dito-admin"]=O(n.vue,n["vue-router"],n["@kyvg/vue3-notification"],n["@ditojs/utils"],n.nanoid,n["vue-demi"],n["focus-trap"],n["@vueuse/core"],n.sortablejs,n.codeflask,n.tinycolor2,n["@lk77/vue3-color"],n["@tiptap/vue-3"],n["@tiptap/extension-document"],n["@tiptap/extension-text"],n["@tiptap/extension-bold"],n["@tiptap/extension-code"],n["@tiptap/extension-italic"],n["@tiptap/extension-link"],n["@tiptap/extension-strike"],n["@tiptap/extension-underline"],n["@tiptap/extension-blockquote"],n["@tiptap/extension-code-block"],n["@tiptap/extension-hard-break"],n["@tiptap/extension-heading"],n["@tiptap/extension-paragraph"],n["@tiptap/extension-horizontal-rule"],n["@tiptap/extension-ordered-list"],n["@tiptap/extension-bullet-list"],n["@tiptap/extension-list-item"],n["@tiptap/extension-history"],n["vue-multiselect"],n["filesize-parser"],n.filesize,n["vue-upload-component"]))})(this,function(n,O,R,d,Ut,F,Ht,I,Wt,Kt,ue,Yt,x,Jt,Qt,Gt,Xt,Zt,vt,xt,en,tn,nn,on,sn,an,rn,ln,cn,dn,hn,un,pn,mn,fn){"use strict";var kc=Object.defineProperty;var Cc=(n,O,R)=>O in n?kc(n,O,{enumerable:!0,configurable:!0,writable:!0,value:R}):n[O]=R;var je=(n,O,R)=>(Cc(n,typeof O!="symbol"?O+"":O,R),R);const Me=n.reactive({title:"",routeComponents:[],user:null,loadCache:{},activeLabel:null,clipboardData:null});function L(e,t){return e?`${e}/${t}`:t}function gn(e){const t=d.parseDataPath(e);return t==null||t.pop(),t}function pe(e,t=!1){return t?gn(e):d.parseDataPath(e)}function bn(e,t=!1){return d.normalizeDataPath(pe(e,t))}function Re(e,t=!1){const o=pe(e,t);if(o){let s;do s=o.pop();while(s!=null&&d.isInteger(+s));if(s!=null)return o}return null}function yn(e,t=!1){return d.normalizeDataPath(Re(e,t))}function me(e,t,o=!1){const s=pe(t,o);return s?d.getValueAtDataPath(e,s):null}function fe(e,t,o=!1){const s=Re(t,o);return s?d.getValueAtDataPath(e,s):null}function Ie(e){const t=d.parseDataPath(e);return t[t.length-1]}function kn(e){const t=Ie(e);return t==null||d.isInteger(+t)?null:t}function ge(e){const t=Ie(e),o=t==null?null:+t;return d.isInteger(o)?o:null}let Cn=0;function $n(e,t="id"){e[t]=`@${++Cn}`}function ee(e){return/^@/.test(e)}function Bn(e,t="id"){return(e==null?void 0:e[t])!=null&&Object.keys(e).length===1}const{hasOwnProperty:Dn}=Object.prototype,be=new WeakMap;function B(e,t,o){const s=be.get(n.toRaw(e)),a=s[t];return a!==void 0||Dn.call(s,t)?a:d.isFunction(o)?o():o}function wn(e,t,o){be.get(n.toRaw(e))[t]=o}class V{constructor(t,o){o=o?d.isFunction(o)?o():{...o}:{},o.nested??(o.nested=!0),o.component=t;const s=Object.setPrototypeOf(o,t);be.set(this,s)}static get(t,o){return o instanceof V?o:new V(t,o)}get nested(){return B(this,"nested",!0)}get schema(){return B(this,"schema",null)}get value(){return B(this,"value",void 0)}get dataPath(){return B(this,"dataPath","")}get name(){return B(this,"name",()=>kn(this.dataPath))}get index(){return B(this,"index",()=>ge(this.dataPath))}get itemDataPath(){return bn(this.dataPath,this.nested)}get parentItemDataPath(){return yn(this.dataPath,this.nested)}get itemIndex(){return ge(this.itemDataPath)}get parentItemIndex(){return ge(this.parentItemDataPath)}get item(){return B(this,"data",()=>me(this.rootItem,this.dataPath,this.nested))}get parentItem(){const t=fe(this.rootItem,this.dataPath,this.nested)||null;return t!==this.item?t:null}get rootItem(){return B(this,"rootData",null)}get processedItem(){return B(this,"processedData",null)}get clipboardItem(){return B(this,"clipboardData",null)}get user(){return B(this,"user",null)}get api(){return B(this,"api",null)}get views(){return B(this,"views",null)}get itemLabel(){return B(this,"itemLabel",null)}get formLabel(){return B(this,"formLabel",null)}get component(){return B(this,"component",null)}get schemaComponent(){return B(this,"schemaComponent",null)}get formComponent(){return B(this,"formComponent",null)}get viewComponent(){return B(this,"viewComponent",null)}get dialogComponent(){return B(this,"dialogComponent",null)}get panelComponent(){return B(this,"panelComponent",null)}get resourceComponent(){return B(this,"resourceComponent",null)}get sourceComponent(){return B(this,"sourceComponent",null)}get option(){return B(this,"option",void 0)}get options(){return B(this,"options",void 0)}get query(){return B(this,"query",void 0)}get error(){return B(this,"error",void 0)}get wasNotified(){return B(this,"wasNotified",!1)}get request(){return t=>this.component.request(t)}get format(){return(t,o)=>this.component.format(t,o)}get navigate(){return t=>this.component.navigate(t)}get download(){return t=>this.component.download(t)}get getResourceUrl(){return t=>this.component.getResourceUrl(t)}get notify(){return t=>{this.component.notify(t),wn(this,"wasNotified",!0)}}}const Vn={data(){return{listeners:null}},methods:{on(e,t){if(d.isArray(e))for(const o of e)this.on(o,t);else if(d.isPlainObject(e))for(const o in e)this.on(o,e[o]);else{const o=this.listeners||(this.listeners=Object.create(null)),{callbacks:s}=o[e]||(o[e]={callbacks:[],queue:[]});s.push(t)}return this},once(e,t){const o=(...s)=>(this.off(e,o),t.apply(this,s));return o.callback=t,this.on(e,o)},off(e,t){var o;if(!arguments.length)delete this.listeners;else if(d.isArray(e))for(const s of e)this.off(s,t);else if(d.isPlainObject(e))for(const s in e)this.off(s,e[s]);else{const s=(o=this.listeners)==null?void 0:o[e];if(s)if(!t)delete this.listeners[e];else{const{callbacks:a}=s,r=a.findIndex(i=>i===t||i.callback===t);r!==-1&&a.splice(r,1)}}return this},emit(e,...t){var s;const o=(s=this.listeners)==null?void 0:s[e];if(o){const{queue:a,callbacks:r}=o;return new Promise(i=>{const l=async()=>{const c=a.shift();if(c){let h;for(const u of r)try{const p=await u.apply(this,c.args);p!==void 0&&(h=p)}catch(p){console.error(`Error during event handler for '${e}':`,p)}c.resolve(h),l()}};a.push({args:t,resolve:i}),a.length===1&&l()})}},hasListeners(e){var t;if(d.isArray(e)){for(const o of e)if(!this.hasListeners(o))return!1;return e.length>0}else return!!((t=this.listeners)!=null&&t[e])},delegate(e,t){if(t)if(d.isArray(e))for(const o of e)this.delegate(o,t);else this.on(e,(...o)=>t.emit(e,...o));return this}}},ye={Boolean:d.isBoolean,Number:d.isNumber,String:d.isString,Date:d.isDate,Array:d.isArray,Object:d.isObject,RegExp:d.isRegExp,Function:d.isFunction},Sn={Boolean:e=>!!e,Number:e=>+e,String:e=>String(e),Date:e=>d.isDate(e)?e:new Date(e),Array:e=>d.isArray(e)?e:d.isString(e)?e.split(","):d.asArray(e),Object:e=>d.isObject(e)?e:e===!0?{}:null,RegExp:e=>d.isRegExp(e)?e:new RegExp(e)};function ke(e,t){var o;if(e&&t!=null){for(const s of e)if((o=ye[s.name])!=null&&o.call(ye,t))return!0}return!1}function Pn(e,t){const o=e&&Sn[e.name||e];return o?o(t):t}function qe(e){return!!T(e.resource)}function T(e,t={}){var a;const{parent:o,...s}=t;return e=d.isObject(e)?{...s,...e}:d.isString(e)?{...s,path:e}:null,e&&o!==void 0&&e.parent===void 0&&!((a=e.path)!=null&&a.startsWith("/"))&&(e.parent=o,e.path||(e.path=".")),e}function Ce(e,t){return e!=null&&(t==null?void 0:t.type)==="collection"?{type:"member",...d.pickBy(t,(o,s)=>["method","path","parent"].includes(s)),id:`${e}`}:null}const ze={mixins:[Vn],inject:["api","$verbs","$views","$isPopulated","$parentComponent","$schemaComponent","$routeComponent","$dataComponent","$sourceComponent","$resourceComponent","$dialogComponent","$panelComponent","$tabComponent"],provide(){return this.providesData?{$parentComponent:()=>this,$dataComponent:()=>this}:{$parentComponent:()=>this}},data(){return{appState:Me,overrides:null}},computed:{providesData(){return!1},sourceSchema(){var e;return(e=this.meta)==null?void 0:e.schema},user(){return Me.user},verbs(){return this.$verbs()},views(){return this.$views()},isPopulated(){return this.$isPopulated()},locale(){return this.api.locale},context(){return new V(this,{nested:!1})},rootComponent(){return this.$root.$refs.root},parentComponent(){return this.$parentComponent()},schemaComponent(){return this.$schemaComponent()},routeComponent(){return this.$routeComponent()},formComponent(){const e=this.routeComponent;return e!=null&&e.isForm?e:null},viewComponent(){const e=this.routeComponent;return e!=null&&e.isView?e:null},dataComponent(){return this.providesData?this:this.$dataComponent()},sourceComponent(){return this.$sourceComponent()},resourceComponent(){return this.$resourceComponent()},dialogComponent(){return this.$dialogComponent()},panelComponent(){return this.$panelComponent()},tabComponent(){return this.$tabComponent()},parentSchemaComponent(){var e;return(e=this.schemaComponent)==null?void 0:e.parentComponent.schemaComponent},parentRouteComponent(){var e;return(e=this.routeComponent)==null?void 0:e.parentComponent.routeComponent},parentFormComponent(){var e;return(e=this.formComponent)==null?void 0:e.parentComponent.formComponent},rootData(){var e;return(e=this.dataComponent)==null?void 0:e.data}},beforeCreate(){const e=En++;Object.defineProperty(this,"$uid",{get(){return e}})},methods:{getStore(e){return this.store[e]},setStore(e,t){return this.store[e]=t,t},getChildStore(e){return this.getStore(e)||this.setStore(e,n.reactive({}))},getSchemaValue(e,{type:t,default:o,schema:s=this.schema,callback:a=!0}={}){const r=t&&d.asArray(t);let i=s?d.isArray(e)?d.getValueAtDataPath(s,e,()=>{}):s[e]:void 0;if(i===void 0&&o!==void 0)return a&&d.isFunction(o)&&!ke(r,o)&&(o=o.call(this,this.context)),o;if(ke(r,i))return i;if(a&&d.isFunction(i)&&(i=i.call(this,this.context)),r&&i!=null&&!ke(r,i))for(const l of r){const c=Pn(l,i);if(c!==i)return c}return i},getLabel(e,t){return e?this.getSchemaValue("label",{type:String,schema:e})||d.labelize(t||e.name):d.labelize(t)||""},labelize:d.labelize,getButtonAttributes(e,t){const o=this.verbs[e]||e;return{class:`dito-button-${o}`,title:(t==null?void 0:t.text)||d.labelize(o)}},getQueryLink(e){return{query:e,hash:this.$route.hash}},shouldRender(e=null){return!!e&&this.getSchemaValue("if",{type:Boolean,default:!0,schema:e})},getResourcePath(e){var t;return e=T(e),e.parent===void 0&&(e.parent=(t=this.dataComponent)==null?void 0:t.resource),this.api.resources.any(T(e))},getResourceUrl(e){const t=this.getResourcePath(e);return t?this.api.getApiUrl({url:t,query:e.query}):null},async sendRequest({method:e,url:t,resource:o,query:s,data:a,internal:r}){t||(t=this.getResourcePath(o)),e||(e=o==null?void 0:o.method);const i=!r&&this.api.isApiUrl(t);i&&await this.rootComponent.ensureUser();const l=await this.api.request({method:e,url:t,data:a,query:s});return i&&e==="patch"&&d.equals(o,Ce(this.user.id,this.api.users))&&await this.rootComponent.fetchUser(),l},showDialog({components:e,buttons:t,data:o,settings:s}){return this.rootComponent.showDialog({components:e,buttons:t,data:o,settings:s})},request({cache:e,...t}){const o=e&&{global:this.appState,local:this.dataComponent}[e],s=o==null?void 0:o.loadCache,a=s&&`${t.method||"get"} ${t.url} ${JSON.stringify(t.query||t.params||"")} ${JSON.stringify(t.data||"")}`;if(s&&a in s)return s[a];const r=this.sendRequest(t).then(i=>i.data).catch(i=>{var c;const l=(c=i.response)==null?void 0:c.data;throw l?Object.assign(new Error(l.message),l):i});return s&&(s[a]=r),r},format(e,{locale:t=this.api.locale,defaults:o=this.api.formats,...s}={}){return d.format(e,{locale:t,defaults:o,...s})},async navigate(e){return this.$router.push(e)},download(e={}){d.isString(e)&&(e={url:e});const t=document.createElement("a");t.href=this.api.getApiUrl(e),t.download=e.filename??null;const{body:o}=document;o.appendChild(t),t.click(),o.removeChild(t)},notify(e){this.rootComponent.notify(e)},closeNotifications(){this.rootComponent.closeNotifications()},setupSchemaFields(){this.setupMethods(),this.setupComputed(),this.setupEvents()},setupMethods(){for(const[e,t]of Object.entries(this.schema.methods||{}))d.isFunction(t)?this[e]=t:console.error(`Invalid method definition: ${e}: ${t}`)},setupComputed(){for(const[e,t]of Object.entries(this.schema.computed||{})){const o=d.isFunction(t)?{get:t}:d.isObject(t)&&d.isFunction(t.get)?t:null;o?Object.defineProperty(this,e,o):console.error(`Invalid computed property definition: ${e}: ${t}`)}},setupEvents(){const{watch:e,events:t}=this.schema;if(e){const s=d.isFunction(e)?e.call(this):e;d.isObject(s)&&this.$nextTick(()=>{for(const[a,r]of Object.entries(s)){const i=this.schemaComponent.getComponentByName(a)?`data.${a}`:a;this.$watch(i,r)}})}const o=(s,a,r)=>{d.isFunction(r)?this.on(d.hyphenate(a),r):console.error(`Invalid event definition: ${s}: ${r}`)};if(t)for(const[s,a]of Object.entries(t))o(s,s,a);for(const[s,a]of Object.entries(this.schema))/^on[A-Z]/.test(s)&&o(s,s.slice(2),a)},async emitEvent(e,{context:t=null,parent:o=null}={}){const s=this.hasListeners(e),a=o==null?void 0:o.hasListeners(e);if(s||a){["load","change"].includes(e)&&await this.$nextTick();const r=()=>t=V.get(this,t),i=s?await this.emit(e,r()):void 0;return a&&i!==!1&&o.emit(e,r()),i}},emitSchemaEvent(e,t){return this.schemaComponent.emitEvent(e,t)}}};let En=0;const Nn=Object.freeze(Object.defineProperty({__proto__:null,creditcard:{validate:e=>d.isCreditCard(e),message:"is invalid"},decimals:{validate:(e,t)=>{const o=t==="*"?"+":`{1,${t}}`;return new RegExp(`^[-+]?\\d*(\\.\\d${o})?$`).test(e)},message:(e,t)=>`must be numeric and may contain ${!t||t==="*"?"":t} decimal points`},domain:{validate:e=>d.isDomain(e),message:"is not a domain"},email:{validate:e=>d.isEmail(e),message:"must be a valid email"},hostname:{validate:e=>d.isHostname(e),message:"is not a host name"},integer:{validate:e=>d.isInteger(e),message:"must be whole number"},max:{validate:(e,t)=>e<=t,message(e,t){return`must be ${t} or less`}},min:{validate:(e,t)=>e>=t,message(e,t){return`must be ${t} or more`}},password:{validate:()=>!0},range:{validate:(e,[t,o])=>e>=t&&e<=o,message(e,[t,o]){return`must be between ${t} and ${o}`}},required:{validate:(e,t,{password:o})=>e!=null&&e!==""||o&&e===void 0,message:"is required",nullish:!0},url:{validate:e=>d.isUrl(e),message:"is not a valid URL"}},Symbol.toStringTag,{value:"Module"})),On={emits:["errors"],data(){return{isTouched:!1,isDirty:!1,isValidated:!1,isValid:!1,errors:null}},methods:{resetValidation(){this.isTouched=!1,this.isDirty=!1,this.isValidated=!1,this.isValid=!1,this.clearErrors()},validate(e=!0){let t=!0;e&&this.clearErrors();const{value:o}=this;for(const[s,a]of Object.entries(this.validations)){const r=Nn[s];if(r&&(r.nullish||o!=null)){const{validate:i,message:l}=r;if(!i(o,a,this.validations)&&(t=!1,e)){const c=d.isFunction(l)?l(o,a,this):l;this.addError(c,!0)}}}return e&&(this.isValidated=!0,this.isValid=t),t},verify(){return this.validate(!1)},markTouched(){this.isTouched=!0},markDirty(){this.isDirty=!0,this.isValidated=!1,this.isValid=!1,this.clearErrors()},addError(e,t=!1){this.errors||(this.errors=[]),t&&(e=`The ${this.label||this.placeholder||this.name} field ${e}.`),this.errors.push(e),this.$emit("errors",this.errors)},showValidationErrors(e,t){this.errors=[];for(const{message:o}of e)this.addError(o,!0);return t&&this.focus(),!0},getErrors(){return this.errors?[...this.errors]:null},clearErrors(){this.errors=null,this.$emit("errors",this.errors)}}};function y(e,{type:t,default:o,get:s,set:a,callback:r=!0}={}){d.isString(e)&&e.includes(".")&&(e=d.parseDataPath(e));const i=d.normalizeDataPath(e);return{get(){const l=!s||s.length>0?this.overrides&&i in this.overrides?this.overrides[i]:this.getSchemaValue(e,{type:t,default:o,callback:r}):void 0;return s?s.call(this,l):l},set(l){a?a.call(this,l):(this.overrides||(this.overrides={}),this.overrides[i]=l)}}}function $e(e,{default:t,get:o,set:s}={}){return{get(){let a=this.getStore(e);return a===void 0&&t!==void 0&&(a=d.isFunction(t)?t.call(this,this.context):t,this[e]=a,this.getStore(e)),o?o.call(this,a):a},set(a){(!s||(a=s.call(this,a))!==void 0)&&this.setStore(e,a)}}}const K={mixins:[On],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},data(){return{parsedValue:null,focused:!1}},computed:{name(){return this.schema.name},type(){return this.schema.type},context(){return new V(this,{nested:this.nested})},value:{get(){const e=st(this.schema,this.data,this.name,this.dataPath,{component:this}),{format:t}=this.schema;return t?t.call(this,new V(this,{value:e})):e},set(e){const{parse:t}=this.schema;this.parsedValue=t?t.call(this,new V(this,{value:e})):e,this.data[this.name]=this.parsedValue}},item(){return me(this.rootItem,this.dataPath,this.nested)},parentItem(){return fe(this.rootItem,this.dataPath,this.nested)},rootItem(){return this.rootData},processedItem(){const{schemaComponent:e}=this;return me(e.processedItem,this.dataPath.slice(e.dataPath.length),this.nested)},label:y("label",{type:[String,Boolean],get(e){return d.isString(e)?e:e!==!1&&this.$options.generateLabel?this.getLabel(this.schema):null}}),width:y("width",{type:[String,Number]}),visible:y("visible",{type:Boolean,default(){return this.$options.defaultVisible}}),exclude:y("exclude",{type:Boolean,default:!1}),required:y("required",{type:Boolean,default:!1}),readonly:y("readonly",{type:Boolean,default:!1}),autofocus:y("autofocus",{type:Boolean,default:!1}),clearable:y("clearable",{type:Boolean,default:!1}),placeholder:y("placeholder",{type:String}),autocomplete:y("autocomplete",{type:String}),events(){const{onFocus:e,onBlur:t,onInput:o,onChange:s}=this;return{onFocus:e,onBlur:t,onInput:o,onChange:s}},attributes(){const{nativeField:e,textField:t}=this.$options,o={...this.events,disabled:this.disabled};return e&&(o.name=this.name,this.label&&(o.title=this.label),o.readonly=this.readonly,o.autofocus=this.autofocus,t&&(o.placeholder=this.placeholder,o.autocomplete=this.autocomplete)),o},validations(){const e={...this.getValidations()};this.required&&(e.required=!0);for(const[t,o]of Object.entries(this.schema.rules||{}))o===void 0?delete e[t]:e[t]=o;return e},showClearButton(){return this.clearable&&this.value!=null}},created(){this._register(!0),this.setupSchemaFields()},beforeUnmount(){this._register(!1)},methods:{_register(e){this.nested&&this.schemaComponent._registerComponent(this,e)},getValidations(){return null},focusElement(){const[e]=d.asArray(this.$refs.element);e&&this.$nextTick(()=>{var t,o;e.focus(),this.disabled&&((o=(t=e.$el||e).scrollIntoView)==null||o.call(t))})},focus(){var e;this.schemaComponent.focus(),(e=this.tabComponent)==null||e.focus(),this.focusElement()},clear(){this.value=null,this.onChange()},onFocus(){this.focused=!0,this.markTouched(),this.emitEvent("focus")},onBlur(){this.focused=!1,this.validate(),this.emitEvent("blur")},onInput(){this.markDirty(),this.emitEvent("input")},onChange(){this.markDirty(),this.emitEvent("change",{context:this.parsedValue!==void 0?{value:this.parsedValue}:null,parent:this.schemaComponent})}}},Ae=new WeakMap;let Ln=0;function Fn(e,t){let o=Ae.get(e);return o||(o=t||`@${++Ln}`,Ae.set(e,o)),o}class Tn{constructor(){je(this,"graph",{});je(this,"references",{})}set(t,o,s){t=d.parseDataPath(t);let a=this.graph;for(const r of t){const i=d.isInteger(+r)?"*":r;a=a[i]??(a[i]={})}a.$settings={...s,...a.$settings,...o}}addSource(t,o){this.set(t,{type:"source",schema:o},{related:!1})}setSourceRelated(t){this.set(t,{related:!0,reference:this.getReferencePrefix(t)})}addRelation(t,o,s){this.set(t,{type:"relation",schema:s,internal:!!o,reference:this.getReferencePrefix(o)})}getReferencePrefix(t){var o;return t?(o=this.references)[t]??(o[t]=Ut.nanoid(6)):null}flatten(){const t=o=>{const s=[];for(const[a,{$settings:r,...i}]of Object.entries(o)){r&&s.push([a,r]);for(const[l,c]of t(i))s.push([`${a}/${l}`,c])}return s};return t(this.graph)}process(t,o,{target:s}){const a=s==="clipboard";a&&delete o[t.idKey||"id"];for(const[r,i]of this.flatten()){const{type:l,schema:c,internal:h,related:u,reference:p}=i,g=l==="source",f=l==="relation";if(g||f&&h){const m=d.getValueAtDataPath(o,r,()=>null),k=a&&g&&!u,P=a&&(f&&h||g&&u);for(const w of d.asArray(m).flat()){const $=g&&c.idKey||f&&c.relateBy||"id";let S=w==null?void 0:w[$];if(S!=null&&(k&&delete w[$],P||ee(S))){ee(S)&&(S=S.slice(1));const N=a?$:g?"#id":"#ref",E=a?`@${S}`:p?`${p}-${S}`:S;w[N]=E,N!==$&&delete w[$]}}}}return o}}const Ue={},He={};function _n(e,t){Ue[e]=t}function te(e,t=!1){const o=Ue[e]||null;if(!o&&!t&&!He[e])throw He[e]=!0,new Error(`Unknown Dito component type: '${e}'`);return o}function We(e,t){for(const o of e)if(De(o)){const s=t(o.component,o.name,0);if(s!==void 0)return s}else for(const[s,a]of Object.entries(o.components||{})){const r=t(a,s,1);if(r!==void 0)return r}}function Be(e,t){return e?We([e,...dt(e)],t):void 0}function jn(e,t){return Be(e,o=>t(o)?o:void 0)||null}function Mn(e,t){return Be(e,o=>t(o)?!0:void 0)===!0}function z(e){return d.isObject(e)&&d.isString(e.type)}function Rn(e){return z(e)&&e.type==="form"}function Ke(e){return z(e)&&e.type==="view"}function In(e){return z(e)&&e.type==="tab"}function qn(e){return z(e)&&e.type==="panel"}function ne(e){return e.name||e.label||e.type}async function A(e,t=!1){if(d.isFunction(e)&&(e=e()),d.isPromise(e)&&(e=await e),d.isModule(e)&&(e={...e},!e.name&&(t||e.default))){const o=Object.keys(e);if(o.length===1){const s=o[0];e=e[s],s!=="default"&&(e.name=s)}}return e}async function oe(e,t=A){let o=d.isFunction(e)?e():e;return o=await A(o,!1),d.isArray(o)?o=Object.fromEntries(await d.mapConcurrently(o,async s=>{const a=await t(s,!0);return[a.name,a]})):d.isObject(o)&&(o=Object.fromEntries(await d.mapConcurrently(Object.entries(o),async([s,a])=>{const r=await t(a,!0);return[s,r]}))),o}async function se(e){let{component:t}=e;t&&(t=await A(t,!0),t&&(e.component=n.markRaw({...t,mixins:[ze,K,...t.mixins||[]]})))}async function Ye(e){await d.mapConcurrently(Object.values(e||{}),se)}async function Y(e,t,o,s){const a=[],r=(i,l,c)=>{a.push(zn(e,i,l,o,s+c))};Be(t,r),We(Se(t),r),await Promise.all(a)}async function zn(e,t,o,s,a){var r,i;J(e,t),await Promise.all([d.mapConcurrently(Se(t),l=>Y(e,l,s,a)),await((i=(r=j(t))==null?void 0:r.processSchema)==null?void 0:i.call(r,e,t,o,s,a))])}async function An(e,t,o,s){if(!Ke(o))throw new Error(`Invalid view schema: '${ne(o)}'`);Je(t,o,s),J(t,o),await Ge(t,o);const a=[];return await Y(t,o,a,0),{path:`/${o.path}`,children:a,component:e,meta:{api:t,schema:o}}}function J(e,t){let o=e.defaults[t.type];if(o&&(d.isFunction(o)&&(o=o(t)),d.isObject(o)))for(const[s,a]of Object.entries(o))t[s]===void 0?t[s]=a:t[s]=d.merge(a,t[s])}function Je(e,t,o){t.name=o,t.path||(t.path=e.normalizePath(o))}async function Un(e,t,o){let{form:s,forms:a,components:r}=t;a?a=t.forms=await oe(a,l=>Qe(e,l)):s?s=t.form=await Qe(e,s):r&&d.isObject(r)&&(s={components:r}),a||(a={default:s});const i=[];for(const l of Object.values(a))await Y(e,l,i,o);return i}async function Qe(e,t){if(t=await A(t,!0),!Rn(t))throw new Error(`Invalid form schema: '${ne(t)}'`);return J(e,t),await Ge(e,t),t}async function Hn(e,t){if(t=await A(t,!0),!In(t))throw new Error(`Invalid tab schema: '${ne(t)}'`);return J(e,t),t}async function Wn(e,t){if(t=await A(t,!0),!qn(t))throw new Error(`Invalid panel schema: '${ne(t)}'`);return J(e,t),t}async function Ge(e,t){const{tabs:o,panels:s}=t;o&&(t.tabs=await oe(o,a=>Hn(e,a))),s&&(t.panels=await oe(s,a=>Wn(e,a)))}function q(e){return z(e)&&d.isObject(e.form||e.forms||e.components)}function Kn(e){return z(e)&&Object.keys((e==null?void 0:e.forms)||{}).length>1}function De(e){return Ke(e)&&d.isObject(e.component)}function Xe(e,t){const{view:o}=e,s=o&&t.views[o];return s&&jn(s,q)||null}function Ze(e,t){return Xe(e,t)?t.views[e.view]:null}function Yn(e,t){const o=Ze(e,t);return o?De(o)?`/${o.path}`:`/${o.path}/${o.path}`:null}function Q(e,t,o){const s=Xe(e,t);if(s)e=s;else if(e.view)throw new Error(`Unknown view: '${e.view}'`);let{form:a,forms:r,components:i,compact:l}=e;if(!a&&!r)if(i)a={components:i,compact:l};else return{};return r||(r={default:a}),Object.fromEntries(Object.entries(r).map(([c,h])=>(d.isFunction(h.components)&&(h={...h,components:h.components(t)}),[c,(o==null?void 0:o(h))??h])))}function ve(e,t){return e[t==null?void 0:t.type]||e.default||null}function we(e,t,o){return ve(Q(e,o),t)}function Jn(e){return e.label!==!1}function xe(e){return!!e.compact}function Ve(e){return!!(e.inlined||e.components)}function et(e){var t;return!!(e.nested||((t=j(e))==null?void 0:t.defaultNested)===!0)}function Qn(e){var t;return!!((t=j(e))!=null&&t.omitPadding)}function tt(e){var s;const t=e.default,o=t!==void 0?t:(s=j(e))==null?void 0:s.defaultValue;return d.isFunction(o)?o(e):d.clone(o)}function nt(e){var o;const t=j(e);return!!(t!=null&&t.excludeValue||(o=t==null?void 0:t.ignoreMissingValue)!=null&&o.call(t,e))}function Gn(e){const t=o=>Object.values(o||{}).some(Jn);return t(e.components)||Object.values(e.tabs||{}).some(t)}function ot(e,t={},o){return ae(e,t,null,null,(r,i,l)=>{!(l in i)&&!nt(r)&&(i[l]=tt(r))},null,{component:o,rootData:t})}function st(e,t,o,s,{component:a=null,rootData:r=a==null?void 0:a.rootData}={}){const{compute:i}=e;if(i){const l=i(V.get(a,{schema:e,value:t[o],name:o,data:t,dataPath:s,rootData:r}));l!==void 0&&(t[o]=l)}return!(o in t)&&!nt(e)&&(t[o]=tt(e)),t[o]}function at(e,t,o){if(o.schemaOnly){const s={},{idKey:a="id",orderKey:r}=e,i=t[a];return i!==void 0&&(s[a]=i),Kn(e)&&(s.type=t.type),r&&(s[r]=t[r]),s}else return{...t}}function Xn(e,t,o,s,{component:a,schemaOnly:r,target:i}={}){const l={component:a,schemaOnly:r,target:i,rootData:o},c=at(t,o,l),h=new Tn;return ae(e,o,s,c,(g,f,m,k,P)=>{let w=st(g,f,m,k,l);if(d.isArray(w)){const{wrapPrimitives:$,orderKey:S,idKey:N="id"}=g;$?w=w.map(E=>({[$]:E})):w=[...w],S&&i==="clipboard"&&w.sort((E,M)=>{const _=E==null?void 0:E[N],_e=M==null?void 0:M[N];return _==null||ee(_)?1:_e==null||ee(_e)?-1:_-_e})}P[m]=w},(g,f,m,k,P)=>{const{wrapPrimitives:w,exclude:$,process:S}=g;let N=P[m];const E=j(g),M=()=>V.get(a,{schema:g,value:N,name:m,data:f,dataPath:k,rootData:l.rootData,processedData:P});if(w&&d.isArray(N)&&(N=N.map(_=>_[w])),S&&(N=S(M())),E!=null&&E.excludeValue||$===!0||d.isFunction($)&&$(M()))delete P[m];else{const _=E==null?void 0:E.processValue;_&&(N=_(g,N,k,h)),P[m]=N}},l),h.process(t,c,l)}function ae(e,t,o,s,a,r,i){const l=c=>{const h=(u,p)=>u!=null?L(u,p):null;if(c)for(const[u,p]of Object.entries(c))if(!et(p))ae(p,t,o,s,a,r,i);else{const g=h(o,u),f=(k,P=null)=>{var M;const w=P!==null?h(g,P):g,$=V.get(i.component,{schema:p,data:t,value:k,dataPath:w,index:P,rootData:i.rootData}),N=(((M=j(p))==null?void 0:M.getFormSchemasForProcessing)||Q)(p,$),E=ve(N,k);if(E){const _=s?at(p,k,i):null;return ae(E,k,w,_,a,r,i)}else return{...k}};a==null||a(p,t,u,g,s);let m=s?s[u]:t[u];m!=null&&q(p)&&(d.isArray(m)?m=s?m.map(f):m.forEach(f):m=f(m),s&&(s[u]=m)),r==null||r(p,t,u,g,s)}};l(e.components);for(const c of dt(e))l(c.components);for(const c of Se(e))l(c.components);return s||t}function U(e,t){const o=(s,a)=>s.length>0?s.reduce((r,i)=>{const l=a(i);return l&&(r[l.name]=l&&t?{...t,...l}:l),r},{}):null;return d.isArray(e)?o(e,s=>d.isObject(s)?s:{name:d.camelize(s,!1)}):d.isObject(e)?o(Object.entries(e),([s,a])=>d.isObject(a)?{name:s,...a}:d.isString(a)?{name:s,label:a}:null):null}function re(e){return U(e,{type:"button"})}function rt(e){return d.isObject(e)?e.type:e}function j(e){return te(rt(e),!0)??null}function it(e){var t,o;return((o=(t=j(e))==null?void 0:t.getSourceType)==null?void 0:o.call(t,rt(e)))??null}function lt(e,t=null,o=null){return e?{schema:e,dataPath:t!=null&&e.name?L(t,e.name):t,tabComponent:o}:null}function ct(e,t=null,o=null,s=[]){if(e)for(const[a,r]of Object.entries(e)){const i=lt(r,t!=null?L(t,a):null,o);i&&s.push(i)}return s}function dt(e){return e!=null&&e.tabs?Object.values(e.tabs):[]}function Se(e){return ht(e).map(t=>t.schema)}function ht(e,t=null,o=null,s=null){var i,l;const a=(l=(i=j(e))==null?void 0:i.getPanelSchema)==null?void 0:l.call(i,e,t,o),r=a?[lt(a,t,s)]:[];return ct(e==null?void 0:e.panels,t,s,r),r}function G(e){return it(e)==="object"}function X(e){return it(e)==="list"}function ut(e,t){const o=t[e.idKey||"id"];return o!=null?String(o):void 0}function Zn(e,t){return Fn(t,ut(e,t))}function vn(e){const{mixins:t}=e;return t||e.extends?Pe({...e},e):e}function Pe(e,t){if(t.extends&&Pe(e,t.extends),t.mixins)for(const o of t.mixins)Pe(e,o);for(const o of xn)o in t&&(e[o]=t[o]);return e}const xn=["defaultValue","defaultNested","defaultVisible","generateLabel","excludeValue","ignoreMissingValue","omitPadding","processValue","processSchema","getPanelSchema","getFormSchemasForProcessing","beforeRouteUpdate","beforeRouteLeave"],ie={},C={mixins:[ze],components:ie,component(e,t){if(t&&(d.isPlainObject(t)&&(t=vn({extends:this,name:e,...t})),ie[e]=t),!(e in ie))throw new Error(`Component "${e}" not registered`);return ie[e]},methods:{getTypeComponent:te}};class eo{hasRole(...t){if(this.roles){for(const o of t)if(this.roles.includes(o))return!0}return!1}}const pt={provide(){return{$schemaParentComponent:()=>this}},data(){return{schemaComponents:[]}},computed:{mainSchemaComponent(){return this.schemaComponents[0]}},methods:{_registerSchemaComponent(e,t){const{schemaComponents:o}=this;t?o.push(e):o.splice(o.indexOf(e),1)}}},mt={mixins:[pt],computed:{errors(){return this.schemaComponents.reduce((e,{errors:t})=>t&&e?e.concat(t):t,null)},isTouched(){return this.schemaComponents.some(e=>e.isTouched)},isDirty(){return this.schemaComponents.some(e=>e.isDirty)},isValid(){return this.schemaComponents.every(e=>e.isValid)},isValidated(){return this.schemaComponents.every(e=>e.isValid)}},methods:{validateAll(e,t=!0){return this.schemaComponents.every(o=>o.validateAll(e,t))},verifyAll(e){return this.schemaComponents.every(t=>t.verifyAll(e))},resetValidation(){this.schemaComponents.forEach(e=>e.resetValidation())},clearErrors(){this.schemaComponents.forEach(e=>e.clearErrors())},showValidationErrors(e,t){this.schemaComponents.forEach(o=>o.showValidationErrors(e,t))}}},ft={mixins:[mt],provide(){return{$routeComponent:()=>this}},data(){return{reload:!1,store:{},loadCache:{}}},computed:{routeComponent(){return this},routeLevel(){let e=0,t=this;for(;t=t.parentComponent.routeComponent;)e++;return e},routeRecord(){return this.$route.matched[this.routeLevel]},isLastRoute(){const{matched:e}=this.$route;return this.routeRecord===e[e.length-1]},isLastUnnestedRoute(){const{matched:e}=this.$route;for(let t=e.length-1;t>=0;t--){const o=e[t];if(!o.meta.nested)return this.routeRecord===o}return!1},isNestedRoute(){return this.meta.nested},isView(){return!1},meta(){return this.routeRecord.meta},path(){return this.getRoutePath(this.routeRecord.path)},label(){return this.getLabel(this.schema)},breadcrumb(){const{breadcrumb:e}=this.schema||{};return e||`${this.breadcrumbPrefix} ${this.label}`},breadcrumbPrefix(){return""},param(){var e;return this.$route.params[(e=this.meta)==null?void 0:e.param]||null},isMutating(){return!1}},beforeRouteUpdate(e,t,o){this==null||this.beforeRouteChange(e,t,o)},beforeRouteLeave(e,t,o){this==null||this.beforeRouteChange(e,t,o)},created(){this.appState.routeComponents.push(this)},unmounted(){const{routeComponents:e}=this.appState;e.splice(e.indexOf(this),1)},methods:{beforeRouteChange(e,t,o){let s=!0;t.path.startsWith(this.path)&&!e.path.startsWith(this.path)&&t.path!==e.path&&(this.isFullRouteChange(e,t)||e.path.length<=t.path.length)&&(this.isMutating?s=this.isValidated||this.validateAll():this.isDirty&&(s=window.confirm(`You have unsaved changes. Do you really want to ${this.verbs.cancel}?`))),o(s)},getRoutePath(e){return this.$route.path.split("/").slice(0,e.split("/").length).join("/")},getChildPath(e){return`${this.path}/${e}`},isFullRouteChange(e,t){const o=this.path.match(/^(\/[^/]*)/)[1];return!d.getCommonPrefix(e.path,t.path).startsWith(o)}}},to=["data-resource"];function no(e,t,o,s,a,r){const i=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoSchema");return e.user?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.isLastRoute?e.shouldRender(e.viewSchema)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"dito-view dito-scroll-parent","data-resource":e.sourceSchema.path},[n.createVNode(l,{class:"dito-scroll",schema:e.viewSchema,data:e.data,meta:e.meta,store:e.getChildStore(e.name),disabled:e.isLoading,generateLabels:!1,menuHeader:!0},null,8,["schema","data","meta","store","disabled"])],8,to)):n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(i,{key:e.name}))],64)):n.createCommentVNode("",!0)}const b=(e,t)=>{const o=e.__vccOpts||e;for(const[s,a]of t)o[s]=a;return o},oo=C.component("DitoView",{mixins:[ft],provide(){return{$sourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.sourceComponent)||null},$resourceComponent:()=>{var e;return((e=this.mainComponent)==null?void 0:e.resourceComponent)||null}}},data(){return{isLoading:!1,data:{}}},computed:{schema(){return this.meta.schema},name(){return this.schema.name},isView(){return!0},isSingleComponentView(){return De(this.schema)},mainComponent(){return this.mainSchemaComponent.getComponentByDataPath(this.name)},viewSchema(){const{component:e,...t}=this.schema;return this.isSingleComponentView?{...t,components:{[t.name]:{name:t.name,label:!1,...e}}}:t},providesData(){return Mn(this.viewSchema,qe)}},watch:{$route(e,t){this.isFullRouteChange(e,t)&&(this.isLoading=!1,this.data={})}},methods:{setData(e){this.data=e},getChildPath(e){return this.isSingleComponentView?this.path:`${this.path}/${e}`},setLoading(e){this.isLoading=!!e}}}),gt=b(oo,[["render",no]]),zc="";function le(e,{year:t=(e==null?void 0:e.getFullYear())??0,month:o=(e==null?void 0:e.getMonth())??0,day:s=(e==null?void 0:e.getDate())??0,hour:a=(e==null?void 0:e.getHours())??0,minute:r=(e==null?void 0:e.getMinutes())??0,second:i=(e==null?void 0:e.getSeconds())??0,millisecond:l=(e==null?void 0:e.getMilliseconds())??0}={}){return new Date(t,o,s,a,r,i,l)}const so={class:"dito-calendar"},ao={class:"dito-calendar-popup"},ro={class:"dito-calendar-inner"},io={class:"dito-calendar-header"},lo={class:"dito-calendar-body"},co={class:"dito-calendar-weekdays"},ho={class:"dito-calendar-dates"},uo=["onClick"],po={class:"dito-calendar-footer"},mo=["title"],fo={class:"dito-calendar-header"},go={class:"dito-calendar-body"},bo={class:"dito-calendar-months"},yo=["onClick"],ko={class:"dito-calendar-header"},Co={class:"dito-calendar-body"},$o={class:"dito-calendar-years"},Bo=["onClick"];function Do(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",so,[n.createElementVNode("div",ao,[n.createElementVNode("div",ro,[a.currentMode==="day"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",io,[n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=i=>r.stepYear(-1))}),n.createElementVNode("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=i=>r.stepMonth(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=i=>r.setMode("year"))},n.toDisplayString(r.dateToString(a.currentValue,{year:1})),1),n.createElementVNode("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=i=>r.setMode("month"))},n.toDisplayString(r.dateToString(a.currentValue,{month:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=i=>r.stepMonth(1))}),n.createElementVNode("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=i=>r.stepYear(1))})]),n.createElementVNode("div",lo,[n.createElementVNode("div",co,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.weekdayNames,i=>(n.openBlock(),n.createElementBlock("span",null,n.toDisplayString(i.short),1))),256))]),n.createElementVNode("div",ho,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.dateRange,i=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(i.state&&`dito-calendar-item-${i.state}`),onClick:l=>r.selectDate(i.date,i.state,!0)},n.toDisplayString(i.text),11,uo))),256))])]),n.createElementVNode("div",po,[n.createElementVNode("a",{class:"dito-calendar-select-today",role:"button",title:r.dateToString(new Date,{year:1,month:1,day:1}),onClick:t[6]||(t[6]=i=>r.selectDate(new Date))},null,8,mo)])],64)):a.currentMode==="month"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",fo,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=i=>r.stepYear(-1))}),n.createElementVNode("span",null,[n.createElementVNode("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=i=>r.setMode("year"))},n.toDisplayString(r.dateToString(a.currentValue,{year:1})),1)]),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=i=>r.stepYear(1))})]),n.createElementVNode("div",go,[n.createElementVNode("div",bo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.monthNames,(i,l)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.getMonthClass(l)),onClick:c=>r.selectMonth(l)},n.toDisplayString(i.short),11,yo))),256))])])],64)):a.currentMode==="year"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",ko,[n.createElementVNode("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=i=>r.stepDecade(-1))}),n.createElementVNode("span",null,n.toDisplayString(r.decadeToString(a.currentValue)),1),n.createElementVNode("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=i=>r.stepDecade(1))})]),n.createElementVNode("div",Co,[n.createElementVNode("div",$o,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.yearRange,i=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(r.getYearClass(i)),onClick:l=>r.selectYear(i)},n.toDisplayString(i),11,Bo))),256))])])],64)):n.createCommentVNode("",!0)])])])}const Ac="",wo={emits:["update:modelValue"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=Vo(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e){this.currentValue=le(this.currentValue,e)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:o,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(o,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e,t,o=!1){t!=="disabled"&&(o?this.setDate({year:e.getFullYear(),month:e.getMonth(),day:e.getDate()}):this.currentValue=e,this.$emit("update:modelValue",this.currentValue))},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1})},selectYear(e){this.setMode("month"),this.setDate({year:e})},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:o,day:s}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:o&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({hor:e,ver:t,enter:o}){const{currentMode:s,currentValue:a}=this;if(e||t){switch(s){case"day":this.setDate({day:a.getDate()+e+t*7});break;case"month":this.setDate({month:a.getMonth()+e+t*6});break;case"year":this.setDate({year:a.getFullYear()+e+t*5});break}return!0}else if(o){switch(s){case"day":this.selectDate(a);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),o=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let h=0;h<10;h++)this.yearRange.push(s+h);let r=new Date(t,o,1).getDay()+1;r===0&&(r=7);const i=this.getDaysInMonth(t,o);if(r>1){const h=this.getYearMonth(t,o-1),u=this.getDaysInMonth(h.year,h.month);for(let p=1;p<r;p++){const g=u-r+p+1,f=new Date(h.year,h.month,g);this.dateRange.push({text:g,date:f,state:this.disabledDate(f)?"disabled":"gray"})}}const l=new Date;for(let h=1;h<=i;h++){const u=new Date(t,o,h),p=f=>f&&f.getDate()===h&&f.getFullYear()===t&&f.getMonth()===o,g=p(this.modelValue)?"active":p(l)?"today":this.disabledDate(u)?"disabled":p(e)?"current":null;this.dateRange.push({text:h,date:u,state:g})}const c=42-this.dateRange.length;if(c>0){const h=this.getYearMonth(t,o+1);for(let u=1;u<=c;u++){const p=new Date(h.year,h.month,u),g=this.disabledDate(p)?"disabled":"gray";this.dateRange.push({text:u,date:p,state:g})}}}}},bt={};function Vo(e){let t=bt[e];if(!t){const o=[];for(let a=0;a<7;a++){const r=new Date(0,0,a);o.push({long:r.toLocaleString(e,{weekday:"long"}),short:r.toLocaleString(e,{weekday:"short"})})}const s=[];for(let a=1;a<=12;a++){const r=new Date(0,a,0);s.push({long:r.toLocaleString(e,{month:"long"}),short:r.toLocaleString(e,{month:"short"})})}t=bt[e]={weekdayNames:o,monthNames:s}}return t}const So=b(wo,[["render",Do]]);function ce(e,t){for(const o in t)e.addEventListener(o,t[o],!1);return{remove(){for(const o in t)e.removeEventListener(o,t[o],!1)}}}function Po(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e.keyCode]}function yt(e){const t=Po(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}const Eo={class:"dito-trigger-container"};function No(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",Eo,[o.alwaysShow?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-trigger",r.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="click"?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-trigger",r.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...i)=>r.onClick&&r.onClick(...i))},[n.renderSlot(e.$slots,"trigger")],2)):o.trigger==="hover"?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["dito-trigger",r.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=i=>r.onHover(!0)),onMouseleave:t[2]||(t[2]=i=>r.onHover(!1))},[n.renderSlot(e.$slots,"trigger")],34)):o.trigger==="focus"||o.trigger==="always"?(n.openBlock(),n.createElementBlock("div",{key:3,class:n.normalizeClass(["dito-trigger",r.triggerClass]),ref:"trigger"},[n.renderSlot(e.$slots,"trigger")],2)):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:o.transition},{default:n.withCtx(()=>[o.trigger==="hover"?n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-popup",r.popupClass]),ref:"popup",style:n.normalizeStyle(r.popupStyle),onMouseenter:t[3]||(t[3]=i=>r.onHover(!0)),onMouseleave:t[4]||(t[4]=i=>r.onHover(!1))},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],38)),[[n.vShow,a.showPopup]]):n.withDirectives((n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["dito-popup",r.popupClass]),ref:"popup",style:n.normalizeStyle(r.popupStyle)},[a.showPopup?n.renderSlot(e.$slots,"popup",{key:0}):n.createCommentVNode("",!0)],6)),[[n.vShow,a.showPopup]])]),_:3},8,["name"])])}const Uc="",Ee=b({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${d.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),e&&this.$nextTick(()=>this.updatePosition()))}},mounted(){const{trigger:e,popup:t}=this.$refs;if(this.trigger==="focus"){const o=e.querySelector("input, textarea");o&&(this.focusEvents=ce(o,{focus:()=>{this.showPopup=!0},blur:()=>{this.showPopup=!1}}))}this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=ce(window,{mouseup:o=>{this.showPopup&&!t.contains(o.target)&&!e.contains(o.target)&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},beforeUnmount(){var e,t;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),this.mouseLeaveTimer=null},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const o=d.isString(this.target)?this.$refs[this.target]:this.target;if(o){const m=o===t?e:t.firstElementChild;m&&(m.style.width=getComputedStyle(o).width)}const s=(o||e).getBoundingClientRect(),a=s.left+window.scrollX,r=s.top+window.scrollY,i=s.width,l=s.height,c=t.offsetWidth,h=t.offsetHeight;let[u,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const m=window.innerWidth,k=window.innerHeight;u==="top"?r<h&&(u="bottom"):u==="bottom"?k-r-l<h&&(u="top"):u==="left"?a<c&&(u="right"):u==="right"&&m-a-i<c&&(u="left"),p==="top"?k-r<h&&(p="bottom"):p==="bottom"?r+l<h&&(p="top"):p==="left"?m-a<c&&(p="right"):p==="right"&&a+i<c&&(p="left")}let g=0,f=0;switch(u){case"top":f-=h;break;case"left":g-=c;break;case"right":g+=i;break;case"bottom":f+=l;break}switch(p){case"right":g-=c-i;break;case"bottom":f-=h-l;break}if(this.cover&&(u==="top"?f+=l:u==="bottom"&&(f-=l)),o&&o!==e){const m=e.getBoundingClientRect();g+=a-m.left,f+=r-m.top}t.style.left=`${g}px`,t.style.top=`${f}px`},onClick(){this.disabled||(this.showPopup=!this.showPopup)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",No]]),Oo={class:"dito-input"},Lo=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Fo(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",Oo,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=i=>a.currentValue=i),type:o.type,name:o.name,title:o.title,disabled:o.disabled,readonly:o.readonly,autofocus:o.autofocus,placeholder:o.placeholder,autocomplete:o.autocomplete,"aria-label":o.title},e.$attrs),null,16,Lo),[[n.vModelDynamic,a.currentValue]])])}const Wc="",Z=b({emits:["update:modelValue"],props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{size(){const{size:e,min:t,max:o}=this.$attrs,s=a=>a!=null?`${a}`.length:0;return e||s(t)||s(o)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Fo]]);function To(e,t,o,s,a,r){const i=n.resolveComponent("InputField"),l=n.resolveComponent("Calendar"),c=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(c,n.mergeProps({class:"dito-date-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[4]||(t[4]=h=>a.showPopup=h),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(i,n.mergeProps({class:["dito-date-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:r.currentText,"onUpdate:modelValue":t[0]||(t[0]=h=>r.currentText=h),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=h=>a.inputFocused=!0),onBlur:t[2]||(t[2]=h=>a.inputFocused=!1),onKeydown:r.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createVNode(l,n.mergeProps({class:"dito-date-picker-popup",ref:"calendar",modelValue:a.currentValue,"onUpdate:modelValue":t[3]||(t[3]=h=>a.currentValue=h)},{locale:o.locale,disabledDate:o.disabledDate}),null,16,["modelValue"])]),_:1},16,["show"])}const Yc="",kt=b({components:{Trigger:Ee,Calendar:So,InputField:Z},emits:["update:modelValue","update:show","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},locale:{type:String,default:"en-US"},dateFormat:{type:Object,default:()=>d.defaultFormats.date},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return d.format(this.currentValue,{locale:this.locale,date:this.dateFormat,time:!1})||""}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.showPopup=!1,this.$emit("update:modelValue",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("update:modelValue",this.currentValue)))}},methods:{onKeyDown(e){var t;(t=this.$refs.calendar)!=null&&t.navigate(yt(e))&&e.preventDefault()},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",To]]);function Ct(e,t,o){const s=window.requestAnimationFrame||function(){return setTimeout(arguments[0],10)};if(o<=0)e.scrollTop=t;else{const r=(t-e.scrollTop)/o*10;s(()=>{e.scrollTop=e.scrollTop+r,e.scrollTop!==t&&Ct(e,t,o-10)})}}function _o(e,t,o){if(e.createTextRange){const s=e.createTextRange();s.collapse(!0),s.moveStart("character",t),s.moveEnd("character",o),s.select(),e.focus()}else e.setSelectionRange?(e.focus(),e.setSelectionRange(t,o)):"selectionStart"in e&&(e.selectionStart=t,e.selectionEnd=o,e.focus())}const jo={class:"dito-time-picker-popup"},Mo={class:"dito-time-picker-panel"},Ro=["onClick"],Io={class:"dito-time-picker-panel"},qo=["onClick"],zo={class:"dito-time-picker-panel"},Ao=["onClick"];function Uo(e,t,o,s,a,r){const i=n.resolveComponent("InputField"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,n.mergeProps({class:"dito-time-picker",ref:"trigger",show:a.showPopup,"onUpdate:show":t[6]||(t[6]=c=>a.showPopup=c),trigger:"click"},{transition:o.transition,placement:o.placement,disabled:o.disabled,target:o.target}),{trigger:n.withCtx(()=>[n.createVNode(i,n.mergeProps({class:["dito-time-picker-input",{"dito-focus":a.showPopup}],ref:"input",modelValue:r.currentText,"onUpdate:modelValue":t[0]||(t[0]=c=>r.currentText=c),type:"text",readonly:""},{placeholder:o.placeholder,disabled:o.disabled},{onFocus:t[1]||(t[1]=c=>a.inputFocused=!0),onBlur:t[2]||(t[2]=c=>a.inputFocused=!1),onKeydown:r.onKeyDown}),null,16,["modelValue","class","onKeydown"])]),popup:n.withCtx(()=>[n.createElementVNode("div",jo,[n.createElementVNode("div",Mo,[n.createElementVNode("ul",{class:"dito-time-picker-hour",ref:"hour",onMouseover:t[3]||(t[3]=c=>a.selection=0)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(24,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledHour(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:r.hour===c-1}),onClick:h=>r.hour=c-1},n.toDisplayString(r.leftPad(c-1)),11,Ro))],64))),64))],544)]),n.createElementVNode("div",Io,[n.createElementVNode("ul",{class:"dito-time-picker-minute",ref:"minute",onMouseover:t[4]||(t[4]=c=>a.selection=1)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledMinute(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:r.minute===c-1}),onClick:h=>r.minute=c-1},n.toDisplayString(r.leftPad(c-1)),11,qo))],64))),64))],544)]),n.createElementVNode("div",zo,[n.createElementVNode("ul",{class:"dito-time-picker-second",ref:"second",onMouseover:t[5]||(t[5]=c=>a.selection=2)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(60,c=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[o.disabledSecond(c-1)?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("li",{key:0,class:n.normalizeClass({selected:r.second===c-1}),onClick:h=>r.second=c-1},n.toDisplayString(r.leftPad(c-1)),11,Ao))],64))),64))],544)])])]),_:1},16,["show"])}const Qc="",$t=b({components:{Trigger:Ee,InputField:Z},emits:["update:modelValue","update:show","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,selection:0,changed:!1}},computed:{focused(){return this.inputFocused||this.showPopup},currentText(){return this.currentValue?`${this.leftPad(this.hour)}:${this.leftPad(this.minute)}:${this.leftPad(this.second)}`:""},currentDate(){return this.currentValue||le(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e),this.scrollAll())},currentText:"updateSelection",selection:"updateSelection",show(e){this.showPopup=e},showPopup(e,t){e&&(this.updateSelection(),this.scrollAll(0)),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=le(this.currentDate,{...e,millisecond:0})},updateSelection(e=!1){if(this.showPopup||e){const t=3*this.selection;this.$nextTick(()=>_o(this.$refs.input,t,t+2))}},scrollAll(e=100){const t=(o,s)=>{const a=this.$refs[o];if(a){const r=a.scrollHeight/(a.children.length+6);Ct(a,Math.round(s*r),e)}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onKeyDown(e){const t=["hour","minute","second"][this.selection];if(t){const{hor:o,ver:s,enter:a}=yt(e);if(o){const r=this.selection+o;this.selection=r<0?2:r>2?0:r}else if(s){const r=this[t]+s,{length:i}=this.$refs[t].children;this[t]=r<0?r+i:r>=i?r-i:r}a&&(this.showPopup=!1),(o||s||a)&&(this.updateSelection(!0),e.preventDefault())}},focus(){this.$refs.input.focus()},blur(){this.$refs.input.blur()}}},[["render",Uo]]),Ho={class:"dito-date-time-picker",ref:"picker"};function Wo(e,t,o,s,a,r){const i=n.resolveComponent("DatePicker"),l=n.resolveComponent("TimePicker");return n.openBlock(),n.createElementBlock("div",Ho,[n.createElementVNode("div",{class:n.normalizeClass(["dito-pickers",{"dito-focus":r.focused}])},[n.createVNode(i,n.mergeProps({ref:"date",modelValue:a.currentValue,"onUpdate:modelValue":t[0]||(t[0]=c=>a.currentValue=c),show:a.showDate,"onUpdate:show":t[1]||(t[1]=c=>a.showDate=c),placement:"bottom-left",target:e.$refs.picker},{transition:o.transition,placeholder:o.placeholder,locale:o.locale,dateFormat:o.dateFormat,disabled:o.disabled},{onFocus:t[2]||(t[2]=c=>a.dateFocused=!0),onBlur:t[3]||(t[3]=c=>a.dateFocused=!1)}),null,16,["modelValue","show","target"]),n.createVNode(l,n.mergeProps({ref:"time",modelValue:a.currentValue,"onUpdate:modelValue":t[4]||(t[4]=c=>a.currentValue=c),show:a.showTime,"onUpdate:show":t[5]||(t[5]=c=>a.showTime=c),placeholder:"",placement:"bottom-right",target:e.$refs.picker},{transition:o.transition,disabled:o.disabled},{onFocus:t[6]||(t[6]=c=>a.timeFocused=!0),onBlur:t[7]||(t[7]=c=>a.timeFocused=!1)}),null,16,["modelValue","show","target"])],2)],512)}const Xc="",Ko=b({components:{DatePicker:kt,TimePicker:$t},emits:["update:modelValue","change","focus","blur"],props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},dateFormat:{type:Object,default:()=>d.defaultFormats.date},locale:{type:String,default:"en-US"},disabled:{type:Boolean,default:!1}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,dateFocused:!1,timeFocused:!1,changed:!1}},computed:{focused(){return this.dateFocused||this.timeFocused}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.changed=!0,this.$emit("update:modelValue",e))},focused(e,t){e^t&&(this.$emit(e?"focus":"blur"),!e&&this.changed&&(this.changed=!1,this.$emit("change",this.currentValue)))}},methods:{focus(){this.$refs.date.focus()},blur(){this.$refs.date.blur(),this.$refs.time.blur()}}},[["render",Wo]]);function Yo(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("i",{class:n.normalizeClass(["dito-icon",`dito-icon-${o.name}`])},null,2)}const vc="",Jo=b({props:{name:{type:String,required:!0}}},[["render",Yo]]),Qo={class:"dito-pagination"},Go={key:0,class:"dito-pagination-total"},Xo={class:"dito-buttons dito-buttons-round"},Zo=["disabled","onClick"],vo={key:0};function xo(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",Qo,[o.showTotal?(n.openBlock(),n.createElementBlock("div",Go,[o.total>0?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(r.first)+" – "+n.toDisplayString(r.last),1)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("0")],64)),n.createTextVNode("/ "+n.toDisplayString(o.total),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",Xo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(a.pageRange,i=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",r.getPageClass(i)]),disabled:i.disabled,onClick:l=>r.onClickPage(i)},[i.text?(n.openBlock(),n.createElementBlock("span",vo,n.toDisplayString(i.text),1)):n.createCommentVNode("",!0)],10,Zo))),256))])])}const ed="",es=b({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{pageRange:[],showPrev:!0,showNext:!0,numPages:0,currentPageSize:this.pageSize,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.currentPageSize+1},last(){return Math.min(this.first+this.currentPageSize-1,this.total)}},watch:{total:"updatePageRange",showPrev:"updatePageRange",showNext:"updatePageRange",page(e){this.currentPage=e},pageSize(e){this.currentPageSize=e},currentPageSize(e){this.numPages=Math.ceil(this.total/e),this.currentPage>this.numPages&&(this.currentPage=this.numPages),this.updatePageRange()},currentPage(e,t){e!==t&&(this.updatePageRange(),this.$emit("update:page",e))}},created(){this.currentPage=this.page,this.currentPageSize=this.pageSize},mounted(){this.updatePageRange()},methods:{onClickPage(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)},getPageClass(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},updatePageRange(){const{showPrev:e,showNext:t,total:o,currentPageSize:s,currentPage:a}=this,r=e+t+1,i=this.numPages=Math.ceil(o/s);let l=1,c=1;i<=r?c=i:a<=e+1?c=r:a>=i-t?(c=i,l=i-r+1):(l=a-e,c=a+t);const h=[];h.push({index:a-1,type:"prev",disabled:a<=1}),l>=2&&h.push({index:1,text:1}),l>2&&h.push({index:Math.max(1,a-10),type:"ellipsis-prev"});for(let u=l;u<=c;u++)h.push({index:u,text:u,active:u===a});c<i-1&&h.push({index:Math.min(i,a+10),type:"ellipsis-next"}),c<=i-1&&h.push({index:i,text:i}),h.push({index:a+1,type:"next",disabled:a>=i}),this.pageRange=h}}},[["render",xo]]),ts={class:"dito-switch-pane"},ns=["id","name","disabled"],os=n.createElementVNode("div",{class:"dito-switch-button"},null,-1),ss={key:0,class:"dito-switch-label"};function as(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-switch",r.classes]),style:n.normalizeStyle(r.styles)},[n.createElementVNode("div",ts,[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:o.id,ref:"input"},e.$attrs,{"onUpdate:modelValue":t[0]||(t[0]=i=>a.checked=i),type:"checkbox",name:o.name,disabled:o.disabled}),null,16,ns),[[n.vModelCheckbox,a.checked]]),os,o.labels?(n.openBlock(),n.createElementBlock("span",ss,[a.checked?n.renderSlot(e.$slots,"checked",{key:0},()=>[n.createTextVNode(n.toDisplayString(o.labels.checked||"on"),1)]):n.renderSlot(e.$slots,"unchecked",{key:1},()=>[n.createTextVNode(n.toDisplayString(o.labels.unchecked||"off"),1)])])):n.createCommentVNode("",!0)])],6)}const nd="",rs=b({emits:["update:modelValue","change"],props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){const{checked:e,disabled:t}=this;return{"dito-checked":e,"dito-disabled":t}},styles(){const{labels:{checked:e,unchecked:t}={}}=this,o=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":o?`${o*1.5}rem`:null}}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",as]]),sd="";function Bt({enabled:e},{slots:t}){return e?n.h(n.Transition,ls,t):t.default()}Bt.props={enabled:{type:Boolean,default:!0}};const is=Bt,H=(e,t)=>Object.assign(e.style,t),Dt=e=>getComputedStyle(e).height,ls={name:"height",onAfterEnter(e){setTimeout(()=>H(e,{height:"auto"}))},onEnter(e){const{width:t}=getComputedStyle(e);H(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"});const{height:o}=getComputedStyle(e);H(e,{width:null,position:null,visibility:null,height:0}),Dt(e),setTimeout(()=>H(e,{height:o}))},onLeave(e){const{height:t}=getComputedStyle(e);H(e,{height:t}),Dt(e),setTimeout(()=>H(e,{height:0}))}},cs=F.defineComponent({name:"UseFocusTrap",props:["as","options"],setup(e,{slots:t}){let o;const s=F.ref(),a=()=>o&&o.activate(),r=()=>o&&o.deactivate();return F.watch(()=>I.unrefElement(s),i=>{i&&(o=Ht.createFocusTrap(i,e.options||{}),a())},{flush:"post"}),F.onScopeDispose(()=>r()),()=>{if(t.default)return F.h(e.as||"div",{ref:s},t.default())}}});function ds(e,t,o,s,a,r){const i=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema"),c=n.resolveComponent("UseFocusTrap");return n.openBlock(),n.createElementBlock("div",{class:"dito-dialog",ref:"dialog",role:"dialog","aria-expanded":"true","aria-modal":"true",style:n.normalizeStyle({"--width":`${e.settings.width}px`}),onMouseup:t[1]||(t[1]=(...h)=>e.onMouseUp&&e.onMouseUp(...h))},[n.createVNode(c,{class:"dito-dialog__focus-trap",options:{immediate:!0,fallbackFocus:()=>e.$refs.dialog}},{default:n.withCtx(()=>[n.createElementVNode("form",{class:"dito-scroll-parent",onSubmit:t[0]||(t[0]=n.withModifiers((...h)=>e.submit&&e.submit(...h),["prevent"]))},[n.createVNode(l,{class:"dito-scroll",schema:e.schema,data:e.dialogData},{buttons:n.withCtx(()=>[n.createVNode(i,{class:"dito-buttons-large",buttons:e.buttonSchemas,data:e.dialogData},null,8,["buttons","data"])]),_:1},8,["schema","data"])],32)]),_:1},8,["options"])],36)}const ad="",hs=C.component("DitoDialog",{components:{UseFocusTrap:cs},emits:["remove"],provide(){return{$dialogComponent:()=>this}},props:{components:{type:Object,required:!0},buttons:{type:Object,required:!0},promise:{type:Object,required:!0},data:{type:Object,default:()=>({})},settings:{type:Object,default:()=>({width:480,clickToClose:!1})}},data(){const e=d.clone(this.data);for(const t in this.components)t in e||(e[t]=null);return{windowEvents:null,dialogData:e}},computed:{dialogComponent(){return this},schema(){return{components:this.components}},buttonSchemas(){return Object.fromEntries(Object.entries(re(this.buttons)).map(([e,t])=>(e==="cancel"&&!t.events&&(t={...t,events:{click:()=>this.cancel()}}),[e,t])))},hasButtons(){return Object.keys(this.buttonSchemas).length>0},hasCancel(){return!!this.buttonSchemas.cancel}},mounted(){this.windowEvents=ce(window,{keyup:e=>{(this.hasCancel||!this.hasButtons)&&e.keyCode===27&&this.cancel()}})},unmounted(){this.windowEvents.remove()},methods:{remove(){this.$emit("remove")},resolve(e){this.promise.resolve(e),this.remove()},reject(e){this.promise.reject(e),this.remove()},submit(){this.resolve(this.dialogData)},cancel(){this.resolve(null)},close(){this.cancel()},onMouseUp(){this.settings.clickToClose&&this.close()}}}),wt=b(hs,[["render",ds]]),v={data(){return{domHandlers:[]}},beforeUnmount(){for(const{remove:e}of this.domHandlers)e();this.domHandlers=[]},methods:{domOn(e,t,o){const s=ce(e,d.isObject(t)?t:{[t]:o});return this.domHandlers.push(s),s}}},us={class:"dito-root"},ps={class:"dito-page dito-scroll-parent"},ms=[n.createElementVNode("span",null,"Login",-1)];function fs(e,t,o,s,a,r){const i=n.resolveComponent("VueNotifications"),l=n.resolveComponent("DitoDialog"),c=n.resolveComponent("DitoMenu"),h=n.resolveComponent("DitoAccount"),u=n.resolveComponent("DitoHeader"),p=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",us,[n.createVNode(i,{class:"dito-notifications",ref:"notifications",position:"top right",classes:"dito-notification"},null,512),n.createVNode(n.TransitionGroup,{name:"dito-dialog"},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.dialogs,(g,f)=>(n.openBlock(),n.createBlock(l,{key:f,components:g.components,buttons:g.buttons,promise:g.promise,data:g.data,settings:g.settings,onRemove:m=>e.removeDialog(f)},null,8,["components","buttons","promise","data","settings","onRemove"]))),128))]),_:1}),n.createVNode(c),n.createElementVNode("main",ps,[n.createVNode(u,{spinner:e.options.spinner,isLoading:e.isLoading},{default:n.withCtx(()=>[e.user?(n.openBlock(),n.createBlock(h,{key:0})):e.allowLogin?(n.openBlock(),n.createElementBlock("a",{key:1,class:"dito-login",onClick:t[0]||(t[0]=g=>e.rootComponent.login())},ms)):n.createCommentVNode("",!0)]),_:1},8,["spinner","isLoading"]),n.createVNode(p)])])}const id="",gs=C.component("DitoRoot",{mixins:[v],components:{DitoDialog:wt},provide(){return{$views:()=>this.resolvedViews}},props:{unresolvedViews:{type:[Object,Function,Promise],required:!0},options:{type:Object,default:()=>({})}},data(){return{resolvedViews:{},removeRoutes:null,dialogs:{},allowLogin:!1,loadingCount:0}},computed:{notifications(){return this.$refs.notifications},isLoading(){return this.loadingCount>0}},created(){this.appState.title=document.title||"Dito.js Admin",this.appState.routeComponents=[]},async mounted(){this.domOn(document,{click:e=>{e.target.closest(".dito-label")||(this.appState.activeLabel=null)},keyup:e=>{e.code==="Tab"&&(this.appState.activeLabel=null)}});try{this.allowLogin=!1,await this.fetchUser()?await this.resolveViews():await this.login()}catch(e){console.error(e)}this.allowLogin=!0},methods:{notify({type:e="info",title:t,text:o}={}){t||(t={warning:"Warning",error:"Error",info:"Information",success:"Success"}[e]||"Notification"),o=`<p>${d.asArray(o).join("</p> <p>")}</p>`.replace(/\n|\r\n|\r/g,"<br>");const s={warning:"warn",error:"error",info:"log",success:"log"}[e]||"error";console[s](d.stripTags(o));const{notifications:a=!0}=this.api;if(a){const{durationFactor:r=20}=a,i=(40+o.length+t.length)*r;this.$notify({type:e,title:t,text:o,duration:i})}},closeNotifications(){this.notifications.destroyAll()},registerLoading(e){this.loadingCount+=e?1:-1},showDialog({components:e,buttons:t,data:o,settings:s}){return new Promise(async(a,r)=>{const i=[];if(await Y(this.api,{components:e},i,0),i.length>0)throw new Error("Dialogs do not support components that produce routes");const l=`dialog-${++bs}`;this.dialogs[l]={components:e,buttons:t,data:o,settings:s,promise:{resolve:a,reject:r}}})},removeDialog(e){delete this.dialogs[e]},async login(){var s,a;this.allowLogin=!0;const{additionalComponents:e,redirectAfterLogin:t}=this.options.login||{},o=await this.showDialog({components:{username:{type:"text",autofocus:!0},password:{type:"password"},...e},buttons:{cancel:{},login:{type:"submit"}}});if(o)try{const r=await this.sendRequest({resource:this.api.users.login,data:o,internal:!0});t?location.replace(t):(this.setUser(r.data.user),await this.resolveViews())}catch(r){const i=(a=(s=r.response)==null?void 0:s.data)==null?void 0:a.error;this.notify({type:"error",title:"Authentication Error",text:i||r}),i||console.error(r,r.response),this.login()}},navigateHome(){return this.navigate("/")},async logout(){try{(await this.sendRequest({resource:this.api.users.logout,internal:!0})).data.success&&(this.setUser(null),this.navigateHome())}catch(e){console.error(e)}},async fetchUser(){let e=null;try{e=(await this.sendRequest({resource:this.api.users.session,internal:!0})).data.user||null}catch(t){this.notify({type:"error",title:"Authentication Error",text:t})}return this.setUser(e),e},setUser(e){this.appState.user=e&&Object.setPrototypeOf(e,eo.prototype),e||(this.resolvedViews={},this.navigateHome())},async ensureUser(){await this.fetchUser()||await this.login()},async resolveViews(){var o;try{this.resolvedViews=await oe(this.unresolvedViews)}catch(s){return s.request||console.error(s),this.login()}const e=await d.mapConcurrently(Object.entries(this.resolvedViews),([s,a])=>An(gt,this.api,a,s)),{fullPath:t}=this.$route;(o=this.removeRoutes)==null||o.call(this),this.removeRoutes=ys(this.$router,[{name:"root",path:"/",components:{}},...e]),this.$router.replace(t)}}});let bs=0;function ys(e,t){const o=[];for(const s of t){const a=e.addRoute(s);o.push(a)}return()=>{for(const s of o)s()}}const Ne=b(gs,[["render",fs]]),ks={class:"dito-menu dito-scroll-parent"},Cs={class:"dito-scroll"};function $s(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("nav",ks,[n.createElementVNode("h1",null,n.toDisplayString(e.appState.title),1),n.createElementVNode("ul",Cs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.views,l=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(i,{key:0,class:"dito-link",to:`/${l.path}`,activeClass:"dito-active"},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l)),1)]),_:2},1032,["to"])):n.createCommentVNode("",!0)]))),256))])])}const ld="",Bs=C.component("DitoMenu",{}),Ds=b(Bs,[["render",$s]]),ws={class:"dito-spinner"};function Vs(e,t,o,s,a,r){return n.withDirectives((n.openBlock(),n.createElementBlock("div",ws,[n.createElementVNode("div",{class:"v-pulse v-pulse1",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay1])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse2",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay2])},null,4),n.createElementVNode("div",{class:"v-pulse v-pulse3",style:n.normalizeStyle([a.spinnerStyle,a.spinnerDelay3])},null,4)],512)),[[n.vShow,o.loading]])}const cd="",Vt=b({props:{loading:{type:Boolean,default:!0},color:{type:String,default:"#5dc596"},size:{type:String,default:"15px"},margin:{type:String,default:"2px"},radius:{type:String,default:"100%"}},data(){return{spinnerStyle:{backgroundColor:this.color,width:this.size,height:this.size,margin:this.margin,borderRadius:this.radius,display:"inline-block",animationName:"v-pulseStretchDelay",animationDuration:"0.75s",animationIterationCount:"infinite",animationTimingFunction:"cubic-bezier(.2,.68,.18,1.08)",animationFillMode:"both"},spinnerDelay1:{animationDelay:"0.12s"},spinnerDelay2:{animationDelay:"0.24s"},spinnerDelay3:{animationDelay:"0.36s"}}}},[["render",Vs]]),Ss={class:"dito-header"},Ps={class:"dito-trail"};function Es(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoSpinner");return n.openBlock(),n.createElementBlock("nav",Ss,[n.createElementVNode("div",Ps,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.trail,(c,h)=>(n.openBlock(),n.createElementBlock("li",null,[h===e.trail.length-1?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(e.getBreadcrumbClass(c))},n.toDisplayString(c.breadcrumb),3)):(n.openBlock(),n.createBlock(i,{key:1,class:"dito-breadcrumb",to:c.path},{default:n.withCtx(()=>[n.createElementVNode("span",{class:n.normalizeClass(e.getBreadcrumbClass(c))},n.toDisplayString(c.breadcrumb),3)]),_:2},1032,["to"]))]))),256))]),e.isLoading?(n.openBlock(),n.createBlock(l,{key:0})):n.createCommentVNode("",!0)]),n.renderSlot(e.$slots,"default")])}const hd="",Ns=C.component("DitoHeader",{components:{DitoSpinner:Vt},props:{spinner:{type:Object,default:null},isLoading:{type:Boolean,default:!1}},computed:{trail(){return this.appState.routeComponents.filter(e=>!!e.routeRecord)}},created(){const{size:e="8px",color:t="#999"}=this.spinner||{},{props:o}=Vt;o.size.default=e,o.color.default=t},methods:{getBreadcrumbClass(e){return{"dito-dirty":e.isDirty}}}}),Os=b(Ns,[["render",Es]]),St={mixins:[v],data(){return{pulldown:{open:!1,startTime:0,checkTime:!0,events:{mousedown:()=>{this.setPulldownOpen(!1),this.pulldown.handlers.remove()},mouseup:()=>{this.onPulldownMouseUp(null)&&this.pulldown.handlers.remove()}},handlers:null}}},methods:{onPulldownMouseDown(e){e?this.checkTime=!1:(this.setPulldownOpen(!0),this.checkTime=!0)},onPulldownMouseUp(e){const{startTime:t}=this.pulldown;if(!this.checkTime||t&&Date.now()-t>250)return this.setPulldownOpen(!1),e&&this.onPulldownSelect(e),!0},onPulldownSelect(){},setPulldownOpen(e){this.pulldown.open=e,this.pulldown.startTime=e?Date.now():0,e&&(this.pulldown.handlers=this.domOn(document,this.pulldown.events))}}},Ls={class:"dito-account"},Fs=["onMousedown","onMouseup"];function Ts(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",Ls,[n.createElementVNode("a",{onMousedown:t[0]||(t[0]=n.withModifiers(i=>e.onPulldownMouseDown(),["stop"]))},[n.createElementVNode("span",null,n.toDisplayString(e.user.username),1)],32),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.items,(i,l)=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("a",{onMousedown:n.withModifiers(c=>e.onPulldownMouseDown(l),["stop"]),onMouseup:c=>e.onPulldownMouseUp(l)},n.toDisplayString(i),41,Fs)]))),256))],2)])}const ud="",_s=C.component("DitoAccount",{mixins:[St],data(){return{items:{settings:"Settings",logout:"Logout"}}},methods:{onPulldownSelect(e){switch(e){case"logout":this.rootComponent.logout();break;case"settings":console.info("TODO: Implement Settings");break}}}}),js=b(_s,[["render",Ts]]);function Ms(e,t,o,s,a,r){return e.content?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.options.tag||e.tag),{key:0,class:n.normalizeClass(e.classes),style:n.normalizeStyle(e.styles)},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.options.text),1)]),_:1},8,["class","style"])):n.createCommentVNode("",!0)}const Rs=C.component("DitoElement",{props:{tag:{type:String,default:"span"},content:{type:[String,Object],default:null}},computed:{options(){const{content:e}=this;return d.isObject(e)?e:{text:e}},classes(){return{...this.$attrs.class,...Pt(this.options.class)}},styles(){return{...this.$attrs.style,...Pt(this.options.style)}}}});function Pt(e){return d.asArray(e).reduce((t,o)=>(d.isString(o)?t[o]=!0:d.isObject(o)&&Object.assign(t,o),t),{})}const Is=b(Rs,[["render",Ms]]),qs=["for","innerHTML"];function zs(e,t,o,s,a,r){const i=n.resolveComponent("DitoElement");return e.text||e.collapsible?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),n.mergeProps({key:0,class:"dito-label"},e.attributes,{class:{"dito-active":e.isActive}}),{default:n.withCtx(()=>[e.collapsible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":!e.collapsed}])},null,2)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.prefixes,(l,c)=>(n.openBlock(),n.createBlock(i,{class:"dito-label-prefix",key:`prefix-${c}`,tag:"span",content:l},null,8,["content"]))),128)),n.createElementVNode("label",{for:e.dataPath,innerHTML:e.text},null,8,qs),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.suffixes,(l,c)=>(n.openBlock(),n.createBlock(i,{class:"dito-label-suffix",key:`suffix-${c}`,tag:"span",content:l},null,8,["content"]))),128)),n.renderSlot(e.$slots,"edit-buttons")]),_:3},16,["class"])):n.createCommentVNode("",!0)}const pd="",As=C.component("DitoLabel",{emits:["expand"],props:{label:{type:[String,Object],default:null},dataPath:{type:String,default:null},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1}},computed:{tag(){return this.collapsible?"a":"div"},text(){const{label:e}=this;return d.isObject(e)?e==null?void 0:e.text:e},prefixes(){var e;return d.asArray((e=this.label)==null?void 0:e.prefix)},suffixes(){var e;return d.asArray((e=this.label)==null?void 0:e.suffix)},attributes(){return this.collapsible?{onClick:this.onClick}:{}},isActive(){return this.appState.activeLabel===this}},methods:{onClick(){this.appState.activeLabel=this,this.$emit("expand",this.collapsed)}}}),Us=b(As,[["render",zs]]),Oe={methods:{getItemFormSchema:we,getItemUid:Zn,getItemId(e,t,o=null){return this.isTransient&&o!==null?String(o):ut(e,t)},getItemDataPath(e,t){let{dataPath:o}=this;return e!==this.schema&&(o=L(o,e.name)),t!=null&&(o=L(o,t)),o},findItemIdIndex(e,t,o){const s=this.isTransient?o:t==null?void 0:t.findIndex((a,r)=>this.getItemId(e,a,r)===o);return s!==-1?s:null},getItemLabel(e,t,{index:o=null,extended:s=!1,asObject:a=!1}={}){const{itemLabel:r}=e;if(!t||!s&&r===!1)return null;let i;const l=()=>i||(i=this.getItemDataPath(e,o));let c;const h=()=>c||(c=this.getLabel(we(e,t,this.context)));let u,p,g;if(d.isFunction(r)){const m=r.call(this,new V(this,{nested:!1,data:t,value:t,index:o,get dataPath(){return l()},get formLabel(){return h()}}));d.isObject(m)?{text:u,prefix:p,suffix:g}=m:u=m,s=!1}else if(d.isString(r)&&!(r in t))u=r;else{const{columns:m}=e,k=d.isString(r)&&r||X(e)&&m&&Object.keys(m)[0]||"name";u=t[k]}const f=!!u;if(u==null&&(s=!0,u=X(e)&&o!==null?u=`${o+1}`:""),s){const m=h();m&&(u=`${m} ${f?`'${u}'`:u}`)}return a?{text:u,prefix:p,suffix:g}:u}}},Hs={class:"dito-schema"},Ws={class:"dito-schema-content"};function Ks(e,t,o,s,a,r){const i=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTabs"),c=n.resolveComponent("DitoClipboard"),h=n.resolveComponent("DitoPane"),u=n.resolveComponent("TransitionHeight"),p=n.resolveComponent("DitoPanels");return n.openBlock(),n.createElementBlock("div",Hs,[n.createElementVNode("div",Ws,[e.hasLabel||e.hasTabs||e.clipboard?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-schema-header",{"dito-schema-menu-header":e.menuHeader}])},[e.hasLabel?(n.openBlock(),n.createBlock(i,{key:0,label:e.label,dataPath:e.dataPath,collapsible:e.collapsible,collapsed:!e.opened,onExpand:e.onExpand},n.createSlots({_:2},[e.inlined?{name:"edit-buttons",fn:n.withCtx(()=>[n.renderSlot(e.$slots,"edit-buttons")]),key:"0"}:void 0]),1032,["label","dataPath","collapsible","collapsed","onExpand"])):n.createCommentVNode("",!0),e.tabs?(n.openBlock(),n.createBlock(l,{key:1,tabs:e.tabs,selectedTab:e.selectedTab},null,8,["tabs","selectedTab"])):n.createCommentVNode("",!0),n.createVNode(c,{clipboard:e.clipboard,dataPath:e.dataPath,data:e.data},null,8,["clipboard","dataPath","data"])],2)):n.createCommentVNode("",!0),e.hasTabs?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(e.tabs,(g,f)=>(n.openBlock(),n.createBlock(h,{class:"dito-pane-tab",ref_for:!0,ref:"tabs",key:f,visible:e.selectedTab===f,tab:f,schema:g,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasMainPane,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["visible","tab","schema","dataPath","data","meta","store","single","disabled","generateLabels"]))),128)):n.createCommentVNode("",!0),n.createVNode(u,{enabled:e.inlined},{default:n.withCtx(()=>[e.hasMainPane&&e.opened?(n.openBlock(),n.createBlock(h,{key:0,class:"dito-pane-main",ref:"components",schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:!e.inlined&&!e.hasTabs,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","disabled","generateLabels"])):n.createCommentVNode("",!0)]),_:1},8,["enabled"]),!e.inlined&&e.isPopulated?n.renderSlot(e.$slots,"buttons",{key:2}):n.createCommentVNode("",!0)]),e.inlined?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[e.hasLabel?n.createCommentVNode("",!0):n.renderSlot(e.$slots,"edit-buttons",{key:0})],64)):e.isPopulated?(n.openBlock(),n.createBlock(p,{key:1,panels:e.panelEntries,data:e.data,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["panels","data","meta","store","disabled"])):n.createCommentVNode("",!0)])}const md="",Ys=C.component("DitoSchema",{mixins:[Oe],components:{TransitionHeight:is},provide(){return{$schemaComponent:()=>this}},inject:["$schemaParentComponent"],props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},label:{type:[String,Object],default:null},inlined:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0},hasOwnData:{type:Boolean,default:!1},menuHeader:{type:Boolean,default:!1}},data(){const{data:e}=this.schema;return{...e&&d.isFunction(e)?e.call(this,this.context):e,componentsRegistry:{},panesRegistry:{},panelsRegistry:{}}},computed:{schemaComponent(){return this},parentSchemaComponent(){return this.hasOwnData?null:this.parentComponent.schemaComponent},panelEntries(){const e=ct(this.schema.panels,"");for(const t of this.panes)e.push(...t.panelEntries);return e},tabs(){return U(this.schema.tabs)},selectedTab(){var o,s;const e=((o=this.$route.hash)==null?void 0:o.slice(1))||null,t=e&&this.shouldRender(this.tabs[e])?e:((s=this.defaultTab)==null?void 0:s.name)||null;return t!==e&&this.$router.replace({hash:`#${t}`}),t},defaultTab(){let e=null;if(this.tabs)for(const t of Object.values(this.tabs)){const{defaultTab:o}=t;if(d.isFunction(o)?o.call(this,this.context):o)return t;e||(e=t)}return e},clipboard(){var e;return(e=this.schema)==null?void 0:e.clipboard},processedData(){return this.processData({target:"server",schemaOnly:!0})},clipboardData(){return{$schema:this.schema.name,...this.processData({target:"clipboard",schemaOnly:!0})}},item(){return this.data},rootItem(){return this.rootData},processedItem(){return this.processedData},clipboardItem(){return this.clipboardData},parentItem(){return fe(this.rootData,this.dataPath,!1)},formLabel(){return this.getLabel(this.getItemFormSchema(this.sourceSchema,this.data,this.context))},isDirty(){return this.someComponent(e=>e.isDirty)},isTouched(){return this.someComponent(e=>e.isTouched)},isValid(){return this.everyComponent(e=>e.isValid)},isValidated(){return this.everyComponent(e=>e.isValidated)},hasData(){return!!this.data},hasLabel(){return!!this.label||this.collapsible},hasTabs(){return!this.inlined&&!!this.tabs},hasMainPane(){const{components:e}=this.schema;return!!e&&Object.keys(e).length>0},opened:$e("opened",{default(){return!this.collapsed}}),components(){return Object.values(this.componentsRegistry)},panes(){return Object.values(this.panesRegistry)},panels(){return Object.values(this.panelsRegistry)},componentsByDataPath(){return this._listEntriesByDataPath(this.componentsRegistry)},panesByDataPath(){return this._listEntriesByDataPath(this.panesRegistry)},panelsByDataPath(){return this._listEntriesByDataPath(this.panelsRegistry)}},created(){this._register(!0),this.setupSchemaFields(),this.delegate("change",this.parentSchemaComponent),this.emitEvent("initialize")},beforeUnmount(){this.emitEvent("destroy"),this._register(!1)},methods:{getComponentsByDataPath(e,t){return this._getEntriesByDataPath(this.componentsByDataPath,e,t)},getComponentByDataPath(e,t){return this.getComponentsByDataPath(e,t)[0]||null},getComponentsByName(e,t){return this._getEntriesByName(this.componentsByDataPath,e,t)},getComponentByName(e,t){return this.getComponentsByName(e,t)[0]||null},getComponents(e,t){return this._getEntries(this.componentsByDataPath,e,t)},getComponent(e,t){return this.getComponents(e,t)[0]||null},getPanelsByDataPath(e,t){return this._getEntriesByDataPath(this.panelsByDataPath,e,t)},getPanelByDataPath(e,t){return this.getPanelsByDataPath(e,t)[0]||null},getPanels(e,t){return this._getEntries(this.panelsByDataPath,e,t)},getPanel(e,t){return this.getPanels(e,t)[0]||null},someComponent(e){return this.isPopulated&&this.components.some(e)},everyComponent(e){return this.isPopulated&&this.components.every(e)},onExpand(e){this.emitEvent("expand",{context:{expand:e}}),(!this.opened||e||this.validateAll())&&(this.opened=e)},onChange(){this.emitEvent("change")},resetValidation(){for(const e of this.components)e.resetValidation()},clearErrors(){for(const e of this.components)e.clearErrors()},focus(){var e;(e=this.parentSchemaComponent)==null||e.focus(),this.opened=!0},validateAll(e,t=!0){const{componentsByDataPath:o}=this;let s;if(e){const i=d.isFunction(e)?e:d.isRegExp(e)?l=>e.test(l):null;s=i?Object.keys(o).filter(i):d.isArray(e)?e:[e]}t&&this.clearErrors();let a=!0,r=!0;s||(s=Object.keys(o));for(const i of s){const l=this.getComponentsByDataPath(i);for(const c of l)c.validate(t)||(t&&r&&c.focus(),r=!1,a=!1)}return t&&!a&&this.notifyErrors(),a},verifyAll(e){return this.validateAll(e,!1)},async showValidationErrors(e,t){var a;this.clearErrors();let o=!0;const s=[];for(const[r,i]of Object.entries(e)){const l=this.hasOwnData?L(this.dataPath,r):r,c=d.parseDataPath(l);let h=!1;const u=this.getComponentsByDataPath(c);for(const p of u)p.showValidationErrors(i,o&&t)&&(h=!0,o=!1);if(!h){const p=c.pop();for(;c.length>0;){const f=this.getComponentsByDataPath(c);for(const m of f)if(await((a=m.navigateToComponent)==null?void 0:a.call(m,l,k=>{let P=!1;for(const w of k){const $=e[w.dataPath];$&&w.showValidationErrors($,o&&t)&&(P=!0,o=!1)}return P})))return;c.pop()}const g=d.labelize(p);for(const f of i){const m=g?`The field ${g}`:`The ${this.formLabel}`;s.push(`${m} ${f.message}`)}}o=!1}o||this.notifyErrors(s.join(`
2
+ `))},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,ot(this.schema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={};for(const[o,s]of Object.entries(e))(d.isArray(s)||d.isObject(s))&&this.getComponentsByName(o).some(r=>r.providesData)||(t[o]=s);return t},processData({target:e="clipboard",schemaOnly:t=!0}={}){return Xn(this.schema,this.sourceSchema,this.data,this.dataPath,{component:this,schemaOnly:t,target:e})},_register(e){var t;(t=this.$schemaParentComponent())==null||t._registerSchemaComponent(this,e)},_registerComponent(e,t){var o;this._registerEntry(this.componentsRegistry,e,t),(o=this.parentSchemaComponent)==null||o._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||(t[s]=[])).push(o),t},{})},_getEntries(e,t,o){return d.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t,o):this._getEntriesByName(e,t,o)},_getEntriesByDataPath(e,t,o){return this._filterEntries(e[d.normalizeDataPath(t)]||[],o)},_getEntriesByName(e,t,o){return this._filterEntries(e[L(this.dataPath,t)]||[],o)},_filterEntries(e,t){return t?e.filter(t):e}}}),Js=b(Ys,[["render",Ks]]);function Qs(e,t,o,s,a,r){const i=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:n.normalizeClass(["dito-schema-inlined",{"dito-schema-compact":e.isCompact}]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,inlined:!0,disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(i,{key:0,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=c=>e.$emit("delete"))},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","disabled","collapsed","collapsible","class"])}const fd="",Gs=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null}},computed:{isCompact(){return xe(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),Xs=b(Gs,[["render",Qs]]),Zs={key:0,class:"dito-pane"},vs={key:0,class:"dito-break"},xs={key:2,class:"dito-break"};function ea(e,t,o,s,a,r){const i=n.resolveComponent("DitoContainer");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",Zs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:l,dataPath:c,nestedDataPath:h,nested:u,store:p})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[l.break==="before"?(n.openBlock(),n.createElementBlock("div",vs)):n.createCommentVNode("",!0),e.shouldRender(l)?(n.openBlock(),n.createBlock(i,{key:h,schema:l,dataPath:c,data:e.data,meta:e.meta,store:p,single:e.isSingleComponent,nested:u,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","nested","disabled","generateLabels"])):n.createCommentVNode("",!0),l.break==="after"?(n.openBlock(),n.createElementBlock("div",xs)):n.createCommentVNode("",!0)],64))),256))],512)),[[n.vShow,e.visible]]):n.createCommentVNode("",!0)}const gd="",ta=C.component("DitoPane",{provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0}},computed:{tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){var t,o;const e=(t=this.sourceSchema)==null?void 0:t.wrapPrimitives;return Object.entries(((o=this.schema)==null?void 0:o.components)||{}).map(([s,a])=>{a.name=s;const r=et(a),i=L(this.dataPath,s);return{schema:a,dataPath:r&&!e?i:this.dataPath,nestedDataPath:i,nested:r,store:r?this.getChildStore(s):this.store}})},panelEntries(){return this.componentSchemas.flatMap(({schema:e,nestedDataPath:t})=>ht(e,t,this.schemaComponent,this.tabComponent))},isSingleComponent(){return this.single&&this.componentSchemas.length===1}},created(){this._register(!0)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){this.tab&&this.$router.push({hash:`#${this.tab}`})}}}),na=b(ta,[["render",ea]]);function oa(e){const t=d.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function sa(e,t,o,s,a,r){const i=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClass]),style:n.normalizeStyle(e.containerStyle)},[e.label?(n.openBlock(),n.createBlock(i,{key:0,label:e.label,dataPath:e.labelDataPath,class:n.normalizeClass(e.componentClass)},null,8,["label","dataPath","class"])):n.createCommentVNode("",!0),(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{class:n.normalizeClass(["dito-component",e.componentClass]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:e.single,nested:e.nested,disabled:e.componentDisabled,onErrors:e.onErrors},null,40,["schema","dataPath","data","meta","store","single","nested","disabled","class","onErrors"])),n.createVNode(l,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const bd="",aa=C.component("DitoContainer",{props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},generateLabels:{type:Boolean,default:!0}},data(){return{errors:null}},computed:{context(){return new V(this,{nested:this.nested})},typeComponent(){return te(this.schema.type)},hasLabel(){var o;const{schema:e}=this,{label:t}=e;return t!==!1&&(!!t||((o=this.typeComponent)==null?void 0:o.generateLabel)&&this.generateLabels)},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},componentWidth:y("width",{type:[String,Number],default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultWidth},get(e){return e===void 0?1:d.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),componentWidthOperator:y("width",{type:String,get(e){return d.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:y("visible",{type:Boolean,default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultVisible}}),componentDisabled:y("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),containerClass(){const{class:e}=this.schema;return{"dito-single":this.single,"dito-omit-padding":Qn(this.schema),...d.isString(e)?{[e]:!0}:e}},componentBasis(){const e=this.componentWidth,t=[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e):/[a-z]/.test(e)?e:oa(e)*100;return d.isNumber(t)?`${t}%`:t},containerStyle(){const e=this.componentWidthOperator===">"||this.componentWidth==="fill",t=this.componentWidthOperator==="<";return{flex:`${e?1:0} ${t?1:0} ${this.componentBasis}`}},componentClass(){const e=this.componentBasis==="auto";return{"dito-single":this.single,"dito-disabled":this.componentDisabled,"dito-width-fill":!e||this.componentWidth==="fill","dito-width-auto":e,"dito-has-errors":!!this.errors}}},methods:{onErrors(e){this.errors=e}}}),ra=b(aa,[["render",sa]]),ia={class:"dito-tabs"};function la(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",ia,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(l,c)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(i,{class:n.normalizeClass(["dito-link",{"dito-active":e.selectedTab===c}]),key:c,to:{hash:`#${c}`}},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l,c)),1)]),_:2},1032,["to","class"])):n.createCommentVNode("",!0)],64))),256))])}const yd="",ca=C.component("DitoTabs",{props:{tabs:{type:Object,default:null},selectedTab:{type:String,default:null}}}),da=b(ca,[["render",la]]),ha={class:"dito-panel-title"};function ua(e,t,o,s,a,r){const i=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createElementVNode("label",ha,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(l,{class:"dito-panel-schema",schema:e.panelSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled,hasOwnData:e.hasOwnData},{buttons:n.withCtx(()=>[n.createVNode(i,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]])}const kd="",pa=C.component("DitoPanel",{mixins:[mt],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return re(this.schema.buttons)},target(){return this.schema.target||this.dataPath},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:y("visible",{type:Boolean,default:!0})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=d.isFunction(e)?e.call(this,this.context):e)},beforeUnmount(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),ma=b(pa,[["render",ua]]),fa={key:0,class:"dito-panels"};function ga(e,t,o,s,a,r){const i=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",fa,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:c,tabComponent:h})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(i,{key:e.getPanelKey(c,h),schema:l,dataPath:c,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled!=null?l.disabled:e.disabled,panelTabComponent:h},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Cd="",ba=C.component("DitoPanels",{props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),ya=b(ba,[["render",ga]]);function Et(e){return e&&d.asArray(e).some(t=>t.type!==n.Comment)}function ka(e,t={}){return e=d.isString(e)?n.useSlots()[e]:e,Et(e==null?void 0:e(t))}const Ca={key:0,class:"dito-buttons"},$a={key:0,class:"dito-container"};function Ba(e,t,o,s,a,r){var c,h;const i=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",Ca,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(u,p)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(u)?(n.openBlock(),n.createBlock(i,{key:p,schema:u,dataPath:p,data:e.data,meta:e.meta,store:e.getChildStore(u.name),disabled:e.disabled,generateLabels:!1},null,8,["schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList((h=(c=e.$slots).default)==null?void 0:h.call(c),u=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(u)?(n.openBlock(),n.createElementBlock("div",$a,[n.createVNode(l,{vnode:u},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const $d="",Da=C.component("DitoButtons",{provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[L(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:ka,hasVNodeContent:Et}}),wa=b(Da,[["render",Ba]]);function Va(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),c=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(c,{class:"dito-edit-buttons dito-buttons-round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.isDraggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.isEditable?(n.openBlock(),n.createBlock(i,n.mergeProps({key:1,class:"dito-button",to:{path:e.editPath}},e.getButtonAttributes(e.verbs.edit)),null,16,["to"])):n.createCommentVNode("",!0),e.isCreatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,path:e.createPath,verb:e.verbs.create,text:e.createButtonText},null,8,["schema","path","verb","text"])):n.createCommentVNode("",!0),e.isDeletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=h=>e.$emit("delete"))}),null,16)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store"])}const Bd="",Sa=C.component("DitoEditButtons",{emits:["delete"],props:{draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null},buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggable(){return this.hasOption("draggable")},isEditable(){return this.hasOption("editable")&&!!this.editPath},isCreatable(){return this.hasOption("creatable")&&!!this.createPath},isDeletable(){return this.hasOption("deletable")},createButtonText(){var e;return((e=this.schema.creatable)==null?void 0:e.label)||this.formLabel&&`${d.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasOption(e){return!!(this[e]&&this.schema[e]!==!1)}}}),Pa=b(Sa,[["render",Va]]),Ea={class:"dito-create-button"},Na=["title"],Oa=["onMousedown","onMouseup"],La=["type","title"];function Fa(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",Ea,[e.showPulldown?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:"button",title:e.labelize(e.verb),onMousedown:t[0]||(t[0]=n.withModifiers(i=>e.onPulldownMouseDown(),["stop"]))},n.toDisplayString(e.text),43,Na),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.forms,(i,l)=>(n.openBlock(),n.createElementBlock("li",null,[e.isCreatable(i)?(n.openBlock(),n.createElementBlock("a",{key:0,class:n.normalizeClass(`dito-type-${l}`),onMousedown:n.withModifiers(c=>e.onPulldownMouseDown(l),["stop"]),onMouseup:c=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(i)),43,Oa)):n.createCommentVNode("",!0)]))),256))],2)],64)):(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:e.isInlined?"button":"submit",title:e.labelize(e.verb),onClick:t[1]||(t[1]=i=>e.createItem(e.forms.default))},n.toDisplayString(e.text),11,La))])}const Dd="",Ta=C.component("DitoCreateButton",{mixins:[St],props:{schema:{type:Object,required:!0},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null}},computed:{forms(){return Q(this.schema,this.context)},isInlined(){return Ve(this.schema)},showPulldown(){return Object.keys(this.forms).length>1||!this.forms.default}},methods:{isCreatable(e){return e.creatable!==!1},createItem(e,t=null){if(this.isCreatable(e))this.isInlined?this.sourceComponent.createItem(e,t):this.$router.push({path:`${this.path}/create`,query:{type:t}});else throw new Error("Not allowed to create item for given form")},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),_a=b(Ta,[["render",Fa]]),ja={key:0,class:"dito-clipboard dito-buttons dito-buttons-round"},Ma=["disabled"],Ra=["disabled"];function Ia(e,t,o,s,a,r){return e.clipboard?(n.openBlock(),n.createElementBlock("div",ja,[n.createElementVNode("button",{class:"dito-button dito-button-copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...i)=>e.onCopy&&e.onCopy(...i))},null,8,Ma),n.createElementVNode("button",{class:"dito-button dito-button-paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...i)=>e.onPaste&&e.onPaste(...i))},null,8,Ra)])):n.createCommentVNode("",!0)}const qa=C.component("DitoClipboard",{mixins:[v],props:{clipboard:{type:[Boolean,Object],default:!1},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null}},data(){return{copyEnabled:!1,pasteEnabled:!1,fixClipboard:!0}},computed:{clipboardOptions(){return d.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>d.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>t}},mounted(){this.domOn(document,{copy:this.checkClipboard}),this.domOn(window,{focus:this.checkClipboard}),this.$watch("data",{immediate:!0,handler:(e,t)=>{e!==t&&this.checkClipboard()}})},methods:{async getClipboardData(e){var a,r,i,l,c;let{clipboardData:t}=this.appState;try{const h=await((r=(a=navigator.clipboard)==null?void 0:a.readText)==null?void 0:r.call(a));this.fixClipboard&&h&&(await((l=(i=navigator.clipboard)==null?void 0:i.writeText)==null?void 0:l.call(i,h)),this.fixClipboard=!1),h&&(t=JSON.parse(h))}catch(h){e&&(console.error(h,h.name,h.message),h.name==="SyntaxError"&&alert(d.deindent`
3
3
  The data in the clipboard appears to be malformed:
4
4
  ${h.message}
5
- `))}const{$schema:o,...s}=t||{};return o===((c=this.schemaComponent)==null?void 0:c.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),Ta=b(La,[["render",Fa]]),St={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Pt={mixins:[Ee,St],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return tt(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const i={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,i);const r={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(r);a(null,l)}catch(l){const{response:c}=l;if(!a(l,c)){const h=c==null?void 0:c.data,p=d.isString(h==null?void 0:h.type)?d.labelize(h.type):"Error",u=(h==null?void 0:h.message)??l;this.notify({type:"error",title:p,text:u})}}this.setLoading(!1,i)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:i,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:c=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(p,u)=>{const g=u==null?void 0:u.data;if(p){const f=this.isValidationError(u)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=d.isObject(g)?g:p;r==null||r(m),await this.emitButtonEvent(e,"error",{notify:c,error:m})}h(!1)}else a&&g&&this.setData(g),i==null||i(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),i=await e.emitEvent(t,{context:a});return o&&i===void 0&&!a.wasNotified&&o(s),i}}};function _a(e){return new URL(`file:${e}`).pathname}const ja=["data-resource"],Ra={type:"submit",disabled:""};function Ma(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),c=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(c,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ra,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,ja)}const Ia=C.component("DitoForm",{mixins:[pt,Pt],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return se(d.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return ye(this.itemId,e)||e},breadcrumbPrefix(){return d.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=d.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];K(this.sourceSchema)&&a==="create"&&t.length--;for(let i=0,r=t.length;i<r&&e;i++){const l=t[i],c=/^:id/.test(s[i])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;i===r-1?this.sourceKey=c:e=e[c]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=d.clone(e)),e===null&&!this.isCreating&&K(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return K(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),i=a||this.resource,r=(i==null?void 0:i.method)||this.method,l=this.getPayloadData(e,r);let c;if(!a&&this.isTransient?c=await this.submitTransient(e,i,r,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${d.capitalize(h)}`:`Change ${d.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):c=await this.submitResource(e,i,r,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${d.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const p=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${p} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),c){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:_a(`${this.path}/../${h}`)})}}return c},async submitTransient(e,t,o,s,{onSuccess:a,onError:i,notifySuccess:r,notifyError:l}){const c=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(c)a==null||a(),await this.emitButtonEvent(e,"success",{notify:r});else{const h="Could not submit transient item";i==null||i(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return c}}}),Et=b(Ia,[["render",Ma]]),bd="",qa=C.component("DitoFormNested",{extends:Et}),za={key:0,class:"dito-errors"};function Aa(e,t,o,s,a,i){return e.errors?(n.openBlock(),n.createElementBlock("div",za,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const yd="",Ua=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Ha=b(Ua,[["render",Aa]]),Wa={class:"dito-scopes"},Ka=["title","onClick"];function Ya(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Wa,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,c)=>(n.openBlock(),n.createBlock(r,{key:c,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,Ka)]),_:2},1032,["to"]))),128))])}const kd="",Ja=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),Qa=b(Ja,[["render",Ya]]);function Ga(e,t,o,s,a,i){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const Xa=C.component("DitoPagination",{components:{Pagination:Jo},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),Za=b(Xa,[["render",Ga]]);var va=Object.defineProperty,le=Object.getOwnPropertySymbols,Ot=Object.prototype.hasOwnProperty,Nt=Object.prototype.propertyIsEnumerable,Ft=(e,t,o)=>t in e?va(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,Lt=(e,t)=>{for(var o in t||(t={}))Ot.call(t,o)&&Ft(e,o,t[o]);if(le)for(var o of le(t))Nt.call(t,o)&&Ft(e,o,t[o]);return e},xa=(e,t)=>{var o={};for(var s in e)Ot.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&le)for(var s of le(e))t.indexOf(s)<0&&Nt.call(e,s)&&(o[s]=e[s]);return o};function er(e,t,o={}){let s;const a=o,{document:i=I.defaultDocument}=a,r=xa(a,["document"]),l={onUpdate:p=>{tr(t,p.oldIndex,p.newIndex)}},c=()=>{const p=typeof e=="string"?i==null?void 0:i.querySelector(e):I.unrefElement(e);p&&(s=new At(p,Lt(Lt({},l),r)))},h=()=>s==null?void 0:s.destroy();return I.tryOnMounted(c),I.tryOnScopeDispose(h),{stop:h,start:c}}function tr(e,t,o){const s=I.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];L.nextTick(()=>s.splice(o,0,a))}}const Oe={mixins:[Ee],components:{UseSortable:L.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=I.useVModel(e,"modelValue"),s=L.ref(),a=L.reactive(er(s,o,e.options));return()=>{if(t.default)return L.h(e.tag,{ref:s},t.default(a))}}})},data(){return{dragging:!1}},methods:{getSortableOptions(e,t=!1){return{animation:150,disabled:!e,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:t,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let i=0;i<t.length;i++)t[i][s]=i+a}return t}}},nr=["id"],or={key:0,class:"dito-tree-header"},sr=["innerHTML"],ar={key:1,class:"dito-tree-info"},rr={key:1,class:"dito-tree-leaf"},ir=["innerHTML"],lr={key:2,class:"dito-buttons dito-buttons-small"},cr={key:1,class:"dito-properties"};function dr(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),c=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("UseSortable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",or,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(p=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,sr),e.details?(n.openBlock(),n.createElementBlock("div",ar,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",rr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,ir)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",lr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...p)=>e.onEdit&&e.onEdit(...p))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...p)=>e.onDelete&&e.onDelete(...p))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",cr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,p=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[p.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(p),label:e.getLabel(p)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:p,schema:p,dataPath:e.getPropertyDataPath(p),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(e.childrenDraggable,!0),"onUpdate:modelValue":t[3]||(t[3]=p=>e.childrenList=p)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(p,u)=>(n.openBlock(),n.createBlock(c,{key:e.getItemUid(e.childrenSchema,p.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,u),data:p.data,path:p.path,open:p.open,active:p.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,p.data,{index:u}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,nr)}const $d="",hr=C.component("DitoTreeItem",{mixins:[Oe],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return z(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,i)=>{const r=e.path&&`${this.path}/${e.path}/${i}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:a,path:r,open:l,active:o===r}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return F(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),pr=b(hr,[["render",dr]]),ur={class:"dito-table-head"},mr=["onClick"],fr=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),gr={key:1},br={key:0},yr=[n.createElementVNode("span",null,null,-1)];function kr(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",ur,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:c})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:c},[fr,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,mr)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",gr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",br,yr)):n.createCommentVNode("",!0)])])}const Dd="",Cr=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${d.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),$r=b(Cr,[["render",kr]]),Br=["innerHTML"];function Dr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,Br))],6)}const wr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:F(this.dataPath,t)})):d.escapeHtml(s)}}}),Vr=b(wr,[["render",Dr]]);function Tt({vnode:e}){return e}Tt.props={vnode:{type:Object,required:!0}};const Sr=C.component("DitoVnode",Tt),Pr=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:Es,DitoButtons:ba,DitoClipboard:Ta,DitoContainer:xs,DitoCreateButton:Pa,DitoDialog:$t,DitoEditButtons:Ca,DitoElement:Fs,DitoErrors:Ha,DitoForm:Et,DitoFormNested:qa,DitoHeader:Ds,DitoLabel:js,DitoMenu:gs,DitoPagination:Za,DitoPane:Gs,DitoPanel:ia,DitoPanels:ha,DitoRoot:Pe,DitoSchema:zs,DitoSchemaInlined:Hs,DitoScopes:Qa,DitoTableCell:Vr,DitoTableHead:$r,DitoTabs:oa,DitoTreeItem:pr,DitoVNode:Sr,DitoView:ut},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[H],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,omitPadding:!1,component:C.component,get:Z,register(e,t={}){e=d.asArray(e);const o=this.component(`DitoType${d.camelize(e[0],!0)}`,t);for(const s of e)Fn(s,o);return o}},Er=["id","type","title"];function Or(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",`dito-button-${e.verb}`],id:e.dataPath,ref:"element",type:e.type,title:e.text},e.attributes),n.toDisplayString(e.text),17,Er)}const Nr=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]||this.name},text:y("text",{type:String,get(e){return e||d.labelize(this.verb)}}),closeForm:y("closeForm",{type:Boolean,default:!1}),events(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}}},methods:{async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Me(this.schema)&&await this.submit()}}}),Fr=b(Nr,[["render",Or]]),Lr=["id"];function Tr(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,Lr)),[[n.vModelCheckbox,e.value]])}const wd="",_r=D.register("checkbox",{nativeField:!0}),jr=b(_r,[["render",Tr]]),_t={mixins:[St],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,c;d.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:i=null}=e;const r=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((c=r.dependencyFunction)==null||c.call(this,this.context),r.resolveCounter>0){const{resolvedData:h}=r;return--r.resolveCounter===0&&(r.resolvedData=null),h}if(r.resolving)a=null;else if(a){if(d.isFunction(a)){const h=a.call(this,this.context);d.isFunction(h)?(r.dependencyFunction=a,a=h.call(this,this.context)):a=h}d.isPromise(a)&&(r.resolving=!0,this.resolveData(a,s).then(h=>{r.resolveCounter=o,r.resolvedData=h,r.resolving=!1}),a=null)}else i&&(a=d.getValueAtDataPath(this.rootData,d.normalizeDataPath(`${this.dataPath}/${i}`)));return a},async resolveData(e,t={}){this.setLoading(!0,t);let o=null;try{o=await(d.isFunction(e)?e():e)}catch(s){this.addError(s.message||s)}return this.setLoading(!1,t),o}}},ce={mixins:[_t],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=d.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||kn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=d.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!d.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=d.isFunction(e)?{filter:e}:e;return o?d.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return d.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||yn(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let i=t[a];return i||(i=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(i)),i.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const i of o)if(a){const r=t(i.options,s,null);if(r)return r}else if(s===this.getValueForOption(i))return i};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return d.isString(t)?e==null?void 0:e[t]:d.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return d.isString(t)?e==null?void 0:e[t]:d.isFunction(t)?t.call(this,new V(this,{option:e})):d.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const i=(a=e.options)==null?void 0:a.dataPath,r=i?d.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,r,e),r&&s.setSourceRelated(r);const l=c=>c&&{id:c.id};t=d.isArray(t)?t.map(l):l(t)}return t}},Rr=["id"],Mr=["value"];function Ir(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},e.attributes),null,16,Mr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,Rr)}const Vd="",qr=D.register("checkboxes",{mixins:[ce],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),zr=b(qr,[["render",Ir]]),Ar=["id"];function Ur(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,Ar)}const Sd="",Hr=D.register("code",{mixins:[Q],computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Ut(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},i=()=>this.onFocus(),r=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:i,blur:r});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},c=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:c(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),Wr=b(Hr,[["render",Ur]]),Kr=["id"],Yr={key:0,class:"dito-color-preview dito-inherit-focus"},Jr=["disabled"];function Qr(e,t,o,s,a,i){const r=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=c=>e.showPopup=c),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=c=>e.hexValue=c),type:"input",size:"8"},e.attributes),null,16,Kr),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",Yr,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...c)=>e.clear&&e.clear(...c),["stop"]))},null,8,Jr)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(r,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=c=>e.colorValue=c),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const Pd="",Gr=D.register("color",{components:{Trigger:Se,SketchPicker:Ht.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=de(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=de(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=de(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),Xr=b(Gr,[["render",Qr]]);function Zr(e,t,o,s,a,i){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const vr=D.register("component",{defaultValue:()=>{},ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await ee(t)}}),xr=b(vr,[["render",Zr]]),ei=["id","name","value","disabled"];function ti(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,ei)}const ni=D.register(["computed","data","hidden"],{mixins:[_t],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return H.computed.value.get.call(this)},set(e){H.computed.value.set.call(this,e)}}}}),oi=b(ni,[["render",ti]]),si={class:"dito-date"};function ai(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",si,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=r=>e.dateValue=r),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const ri=D.register(["date","datetime","time"],{components:{DatePicker:gt,TimePicker:yt,DateTimePicker:Io},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return d.isDate(t)?t.toISOString():t}}),ii=b(ri,[["render",ai]]),U={mixins:[Pt,dt],defaultValue(e){return Y(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,unwrappingPrimitives:!1,ignoreRouteChange:!1}},computed:{sourceComponent(){return this},isObjectSource(){return K(this.type)},isListSource(){return Y(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:ke("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},d.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:ke("total"),columns(){return z(this.schema.columns)},scopes(){return z(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=d.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(W(this.schema,this.context))},view(){return Ge(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return se(this.schema.buttons)},hasLabels(){return this.forms.some(Un)},isCompact(){return this.forms.every(Ze)},isInlined(){return we(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&d.isArray(e)||this.isObjectSource&&d.isObject(e)?this.value=e:this.unwrapListData(e)||d.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&d.isObject(e)&&d.isNumber(e.total)&&d.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),i=ye(a,this.resource);i&&this.handleRequest({method:"delete",resource:i},r=>{r||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?d.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&d.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const i=s.getComponentsByDataPath(e);if(i.length>0&&((t==null?void 0:t(i))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o((t==null?void 0:t([l]))??!0)},i=d.parseDataPath(e);for(;i.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(d.normalizeDataPath(i))),{matched:l}=this.$router.match(r);l.length&&(this.$route.path===r?a():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(a)})),i.pop()}o(!1)})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){Je(e,t,o);const c=we(t);if(c&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,p={api:e,schema:t},u={...p,flatten:r,nested:i,param:h},g=await Rn(e,t,a);if(l&&await l(g,a+1),q(t)&&!c){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,Y(t)&&h),component:C.component(i?"DitoFormNested":"DitoForm"),meta:u};K(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:p});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:r}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Ne={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",options:d.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,width:"40%"}:null,text:{type:"text",width:e.operators?"60%":"fill"}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"50%",dateFormat:e},to:{type:"datetime",width:"50%",dateFormat:e}}}};function li(e,t,o){const s={label:"Filters",name:"$filters",target:t,disabled:!1,data(){return hi(s,o.query)},components:ci(e),buttons:{clear:{text:"Clear",events:{click({schemaComponent:a}){a.resetData(),a.applyFilters()}}},filter:{type:"submit",text:"Filter",events:{click({schemaComponent:a}){a.applyFilters()}}}},methods:{applyFilters(){o.query={...o.query,filter:di(this.schema,this.data),page:void 0}}}};return s}function ci(e){var o;const t={};for(const s of Object.values(e||{})){const{filter:a,...i}=s,r=a?(o=Ne[a])==null?void 0:o.call(Ne,s):s.components;if(r){i.components={};for(const[l,c]of Object.entries(r))if(c){const h=c.label||d.labelize(c.name||l);i.components[l]={...c,label:!1,placeholder:h}}t[s.name]={label:i.label,type:"object",default:()=>({}),form:i,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function jt(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function di(e,t){const o=[];for(const s in t){const a=t[s];if(a){const i=Object.keys(jt(e,s)).map(r=>a[r]??null);i.some(r=>r!==null)&&o.push(`${s}:${i.map(JSON.stringify).join(",")}`)}}return o.length?o:void 0}function hi(e,t){const o={};if(t)for(const a of d.asArray(t.filter)){const[,i,r]=a.match(/^(\w+):(.*)$/);try{o[i]=d.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const a in e.components){const i={},r=o[a];if(r){const l=jt(e,a);if(l){let c=0;for(const h in l)i[h]=r[c++]}}s[a]=i}return s}const pi=["id"],ui={key:0,class:"dito-navigation"},mi={key:1,class:"dito-spacer"},fi=["id"],gi={key:1},bi=["innerHTML"],yi=["innerHTML"],ki={key:2,class:"dito-cell-edit-buttons"},Ci={key:1},$i=["colspan"];function Bi(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),c=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),p=n.resolveComponent("DitoSchemaInlined"),u=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("UseSortable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",ui,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",mi)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(c,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(e.draggable),"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",gi,[e.isInlined?(n.openBlock(),n.createBlock(p,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,bi)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,yi))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",ki,[n.createVNode(u,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,fi))),128))]),_:1},8,["modelValue","options"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Ci,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(u,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,$i)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(u,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,pi)):n.createCommentVNode("",!0)}const Ed="",Di=D.register("list",{mixins:[U,Oe],getSourceType(e){return e},getPanelSchema(e,t,o){const{filters:s}=e;if(s){const a=()=>o.getComponentByDataPath(t,i=>i.type==="list");return li(z(s),t,{get query(){var i;return(i=a())==null?void 0:i.query},set query(i){const r=a();if(r){const l=c=>d.pickBy(c,h=>h!==void 0);d.equals(l(i),l(r.query))||(r.query=i,r.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return F(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=qn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${d.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=F(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([ee(t),Ke(t.columns),U.processSchema(e,t,o,s,a,i,r,l)])}}),wi=b(Di,[["render",Bi]]);function Vi(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const Od="",Si=D.register("label",{excludeValue:!0,generateLabel:!1}),Pi=b(Si,[["render",Vi]]),Ei=["id"],Oi=["editor"],Ni={key:0,class:"dito-buttons dito-buttons-toolbar"},Fi={class:"dito-button-group"},Li=["onClick"];function Ti(e,t,o,s,a,i){const r=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",Ni,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,c=>(n.openBlock(),n.createElementBlock("div",Fi,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(c,({name:h,icon:p,isActive:u,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":u}]),key:h,onClick:g},[n.createVNode(r,{name:p},null,8,["name"])],10,Li))),128))]))),256))])):n.createCommentVNode("",!0)],8,Oi),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...c)=>e.onDragResize&&e.onDragResize(...c),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,Ei)}const Nd="",_i=D.register("markup",{mixins:[Q],components:{EditorContent:G.EditorContent,Icon:zo},data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return d.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},i=d.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),r=({editor:l})=>{i(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new G.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:r,extensions:this.getExtensions(),content:this.value||""})},beforeUnmount(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},i=this.domOn(document,{mousemove:a,mouseup(r){a(r),i.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:G.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Wt.Document,Kt.Text,nn.Paragraph,e.bold&&Yt.Bold,e.italic&&Qt.Italic,e.underline&&Zt.Underline,e.strike&&Xt.Strike,e.small&&ji,e.code&&Jt.Code,e.link&&Ri,t.blockquote&&vt.Blockquote,t.codeBlock&&xt.CodeBlock,en.HardBreak,t.heading&&tn.Heading.configure({levels:t.heading}),t.horizontalRule&&on.HorizontalRule,(t.orderedList||t.bulletList)&&rn.ListItem,t.bulletList&&an.BulletList,t.orderedList&&sn.OrderedList,o.history&&ln.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:i,icon:r,attributes:l,ignoreActive:c,onClick:h})=>{o.push({name:i,icon:r,isActive:this.editor.isActive(i,l)&&(c==null||!c()),onClick:()=>{const p=`toggle${d.camelize(i,!0)}`;this.editor.commands[p]&&(h?h(this.editor,l):(g=>this.editor.chain()[p](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[i,r]of Object.entries(t)){const l=["undo","redo"].includes(i)?"history":i,c=a[l],h=d.underscore(i),p=d.hyphenate(i);if(c){if(r===!0)s({name:h,icon:p});else if(d.isObject(r)){const{attribute:u,values:g,ignoreActive:f,onClick:m}=r;if(u){if(d.isArray(g)&&d.isArray(c))for(const k of g)c.includes(k)&&s({name:h,icon:`${p}-${k}`,attributes:{[u]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:p,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),ji=G.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Ri=Gt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Mi=b(_i,[["render",Ti]]),Ii=["disabled"];function qi(e,t,o,s,a,i){const r=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(r,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Ii)):n.createCommentVNode("",!0)],2)}const Fd="",zi=D.register("multiselect",{mixins:[ce],components:{VueMultiselect:cn},data(){return{searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(e=>e):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){const{placeholder:e,searchable:t,taggable:o}=this.schema;return e||(t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0)}},mounted(){this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||H.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),Ai=b(zi,[["render",qi]]),Fe={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){d.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:i}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(i){const r=(`${i}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}};function Ui(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["id","modelValue","min","max","step"])}const Ld="",Hi=D.register(["number","integer"],{mixins:[Fe],components:{InputField:J},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),Wi=b(Hi,[["render",Ui]]),Ki=["id"],Yi={key:0,class:"dito-object-content"},Ji=["innerHTML"],Qi=["innerHTML"];function Gi(e,t,o,s,a,i){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",Yi,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,Ji)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,Qi))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=c=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,Ki)):n.createCommentVNode("",!0)}const Td="",Xi=D.register("object",{mixins:[U],getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([ee(t),U.processSchema(e,t,o,s,a,i,r,l)])}}),Zi=b(Xi,[["render",Gi]]),vi=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,omitPadding:!0,getPanelSchema(e){const{name:t,...o}=e;return o}}),xi=["id","value","max"];function el(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,xi)}const tl=D.register("progress",{mixins:[Fe],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),nl=b(tl,[["render",el]]),ol=["id"],sl=["value"];function al(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},e.attributes),null,16,sl),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,ol)}const _d="",rl=D.register("radio",{mixins:[ce],nativeField:!0}),il=b(rl,[["render",al]]);function ll(e,t,o,s,a,i){const r=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(r,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const jd="",cl=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,omitFlexGrow:!0,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:De},async processSchema(e,t,o,s,a){await te(e,t,s,a)}}),dl=b(cl,[["render",ll]]),hl={class:"dito-select"},pl=["id"],ul=["label"],ml=["value"],fl=["value"],gl=["value"],bl=["disabled"];function yl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",hl,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.selectedValue=r)},e.attributes,{onMousedown:t[1]||(t[1]=r=>e.populate=!0),onFocus:t[2]||(t[2]=r=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:r[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,ml))),256))],8,ul)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(r)},n.toDisplayString(e.getLabelForOption(r)),9,fl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,gl)):n.createCommentVNode("",!0)],16,pl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...r)=>e.clear&&e.clear(...r))},null,8,bl)):n.createCommentVNode("",!0)])}const Rd="",kl=D.register("select",{mixins:[ce],nativeField:!0,data(){return{populate:!0}}}),Cl=b(kl,[["render",yl]]),$l={class:"dito-slider"},Bl=["id","min","max","step"];function Dl(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",$l,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,Bl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Md="",wl=D.register("slider",{mixins:[Fe],components:{InputField:J},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),Vl=b(wl,[["render",Dl]]);function Sl(e,t,o,s,a,i){const r=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Id="",Pl=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:xo},computed:{labels(){return this.schema.labels}}}),El=b(Pl,[["render",Sl]]);function Ol(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:e.inputType},e.attributes),null,16,["id","modelValue","type"])}const Nl="****************",Fl=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:J},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?Nl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Ll=b(Fl,[["render",Ol]]),Tl=["id","rows"];function _l(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,Tl)),[[n.vModelText,e.value]])}const qd="",jl=D.register("textarea",{nativeField:!0,textField:!0,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Rl=b(jl,[["render",_l]]),Ml={class:"dito-tree-list"},Il={class:"dito-tree-panel"},ql={key:0,class:"dito-tree-form-container"};function zl(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),c=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Ml,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Il,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",ql,[n.createVNode(c)])):n.createCommentVNode("",!0)])])}const zd="",Al=D.register(["tree-list","tree-object"],{mixins:[U],provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>q(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,i=!0,r=!1,l=null){await Promise.all([Ke(t.properties),U.processSchema(e,t,o,s,a,i,r,(c,h)=>{const{children:p}=t;if(p)return p.type="tree-list",this.processSchema(e,p,p.name,c,h,i,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return W(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),Ul=b(Al,[["render",zl]]);function Rt(e){return hn.filesize(e,{base:10})}const Hl={class:"dito-upload"},Wl={class:"dito-table dito-table-separators dito-table-background"},Kl=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),Yl=["innerHTML"],Jl={class:"dito-cell-edit-buttons"},Ql={class:"dito-buttons dito-buttons-round"},Gl=["onClick"],Xl={colspan:4},Zl={class:"dito-upload-footer"},vl=["value"],xl={class:"dito-buttons dito-buttons-round"};function ec(e,t,o,s,a,i){const r=n.resolveComponent("UseSortable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",Hl,[n.createElementVNode("table",Wl,[Kl,n.createVNode(r,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=c=>e.files=c),tag:"tbody",options:e.getSortableOptions(e.draggable)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(c,h)=>(n.openBlock(),n.createElementBlock("tr",{key:c.key},[n.createElementVNode("td",{innerHTML:e.renderFile(c,h)},null,8,Yl),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(c.size)),1),n.createElementVNode("td",null,[c.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[c.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(c.upload.error),1)],64)):c.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):c.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",Jl,[n.createElementVNode("div",Ql,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:p=>e.deleteFile(c,h)}),null,16,Gl)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",Xl,[n.createElementVNode("div",Zl,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,vl)):n.createCommentVNode("",!0),n.createElementVNode("div",xl,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(c=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(c=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=c=>e.uploads=c),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const Ad="",tc=D.register("upload",{mixins:[Oe],components:{VueUpload:pn},data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return Mt(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return d.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?dn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:Rt,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:F(this.dataPath,t)})):d.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${Rt(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=Mt(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function Mt(e){return e?d.asArray(e):[]}const nc=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:xr,DitoTypeButton:Fr,DitoTypeCheckbox:jr,DitoTypeCheckboxes:zr,DitoTypeCode:Wr,DitoTypeColor:Xr,DitoTypeComputed:oi,DitoTypeDate:ii,DitoTypeLabel:Pi,DitoTypeList:wi,DitoTypeMarkup:Mi,DitoTypeMultiselect:Ai,DitoTypeNumber:Wi,DitoTypeObject:Zi,DitoTypePanel:vi,DitoTypeProgress:nl,DitoTypeRadio:il,DitoTypeSection:dl,DitoTypeSelect:Cl,DitoTypeSlider:Vl,DitoTypeSwitch:El,DitoTypeText:Ll,DitoTypeTextarea:Rl,DitoTypeTreeList:Ul,DitoTypeUpload:b(tc,[["render",ec]])},Symbol.toStringTag,{value:"Module"})),It=new Set;function oc(e){It.has(e)||(It.add(e),console.warn(e))}const sc=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","close","closed","cancel","cancelled","drag","dragged"].reduce((e,t)=>(e[t]=t,e),{});class ac{constructor(t,{dito:o={},api:s,views:a={},...i}={}){this.el=t,this.api=s=d.merge({base:"/"},o.api,s),this.options=i,s.locale||(s.locale="en-US"),s.formats=d.merge({},d.defaultFormats,s.formats),s.request||(s.request=c=>ic(s,c)),s.getApiUrl||(s.getApiUrl=c=>cc(s,c)),s.isApiUrl||(s.isApiUrl=c=>lc(s,c)),s.normalizePath||(s.normalizePath=s.normalizePaths?d.hyphenate:c=>c),s.denormalizePath||(s.denormalizePath=s.normalizePaths?d.camelize:c=>c),s.defaults||(s.defaults={});const r=T(s.users,{type:"collection"})||{};r.login=T(r.login||"login",{method:"post",parent:r}),r.logout=T(r.logout||"logout",{method:"post",parent:r}),r.session=T(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(c){const h=this[c==null?void 0:c.type]||this.default;return c&&h.call(this,c)},default(c){const h=this.any(c.parent);return h?`${h}/${c.path}`:c.path},collection(c){return this.default(c)},member(c){return`${c.path}/${c.id}`},upload(c){return`${this.collection(c.parent)}/upload/${c.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},d.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Pe,VueNotifications:M,...Pr,...nc},provide:{api:s,$verbs:()=>sc,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Pe,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:i})});l.use(M,{name:"notify",componentName:"VueNotifications"}),l.use(N.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:N.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class rc extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function ic(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:i=null,data:r=null}){var h,p;s&&oc("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),c=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...r&&{body:JSON.stringify(r)},headers:{...l&&e.headers,...i},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((p=c.headers.get("Content-Type"))!=null&&p.includes("application/json")&&(c.data=await c.json()),!c.ok)throw new rc(c);return c}function lc(e,t){return!d.isAbsoluteUrl(t)||t.startsWith(e.url)}function cc(e,{url:t,query:o}){d.isAbsoluteUrl(t)||(t=dc(e.url,t));const s=hc(o);return s?`${t}?${s}`:t}function dc(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}function hc(e){const t=e?d.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const i of d.asArray(a))o.push([s,i]);return o},[])).toString()}return ac});
6
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlU29ydGFibGUvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9taXhpbnMvU29ydGFibGVNaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UcmVlSXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVIZWFkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UYWJsZUNlbGwudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1ZOb2RlLnZ1ZSIsIi4uL3NyYy9EaXRvVHlwZUNvbXBvbmVudC5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUJ1dHRvbi52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveC52dWUiLCIuLi9zcmMvbWl4aW5zL0RhdGFNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvT3B0aW9uc01peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ2hlY2tib3hlcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb2RlLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbG9yLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXBvbmVudC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb21wdXRlZC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVEYXRlLnZ1ZSIsIi4uL3NyYy9taXhpbnMvU291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvZmlsdGVyLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTGlzdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMYWJlbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNYXJrdXAudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTXVsdGlzZWxlY3QudnVlIiwiLi4vc3JjL21peGlucy9OdW1iZXJNaXhpbi5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU51bWJlci52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVPYmplY3QudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUGFuZWwudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUHJvZ3Jlc3MudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUmFkaW8udnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU2VjdGlvbi52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWxlY3QudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU2xpZGVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVN3aXRjaC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVUZXh0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHRhcmVhLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRyZWVMaXN0LnZ1ZSIsIi4uL3NyYy91dGlscy91bml0cy5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVVwbG9hZC52dWUiLCIuLi9zcmMvdXRpbHMvZGVwcmVjYXRlLmpzIiwiLi4vc3JjL3ZlcmJzLmpzIiwiLi4vc3JjL0RpdG9BZG1pbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGRlZmF1bHQgcmVhY3RpdmUoe1xuICB0aXRsZTogJycsXG4gIHJvdXRlQ29tcG9uZW50czogW10sXG4gIHVzZXI6IG51bGwsXG4gIGxvYWRDYWNoZToge30sIC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gIGFjdGl2ZUxhYmVsOiBudWxsLFxuICBjbGlwYm9hcmREYXRhOiBudWxsXG59KVxuIiwiaW1wb3J0IHtcbiAgaXNJbnRlZ2VyLFxuICBwYXJzZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pIHtcbiAgcmV0dXJuIGRhdGFQYXRoXG4gICAgPyBgJHtkYXRhUGF0aH0vJHt0b2tlbn1gXG4gICAgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcGF0aD8ucG9wKClcbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbmVzdGVkID8gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkgOiBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgocGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIGlmIChwYXRoKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJlbnQgdG9rZW4uIElmIGl0J3MgYSBudW1iZXIsIHRoZW4gd2UncmUgZGVhbGluZyB3aXRoIGFuXG4gICAgLy8gYXJyYXkgYW5kIG5lZWQgdG8gcmVtb3ZlIG1vcmUgdG9rZW5zIHVudGlsIHdlIG1lZXQgdGhlIGFjdHVhbCBwYXJlbnQ6XG4gICAgbGV0IHRva2VuXG4gICAgZG8ge1xuICAgICAgdG9rZW4gPSBwYXRoLnBvcCgpXG4gICAgfSB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiBpc0ludGVnZXIoK3Rva2VuKSlcbiAgICAvLyBJZiB0aGUgcmVtb3ZlZCB0b2tlbiBpcyB2YWxpZCwgd2UgY2FuIGdldCB0aGUgcGFyZW50IGRhdGE6XG4gICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW0ocm9vdEl0ZW0sIGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgcmV0dXJuIHBhdGggPyBnZXRWYWx1ZUF0RGF0YVBhdGgocm9vdEl0ZW0sIHBhdGgpIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcmV0dXJuIHBhdGhbcGF0aC5sZW5ndGggLSAxXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoTmFtZShkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICByZXR1cm4gdG9rZW4gPT0gbnVsbCB8fCBpc0ludGVnZXIoK3Rva2VuKSA/IG51bGwgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoSW5kZXgoZGF0YVBhdGgpIHtcbiAgY29uc3QgdG9rZW4gPSBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aClcbiAgY29uc3QgaW5kZXggPSB0b2tlbiA9PSBudWxsID8gbnVsbCA6ICt0b2tlblxuICByZXR1cm4gaXNJbnRlZ2VyKGluZGV4KSA/IGluZGV4IDogbnVsbFxufVxuXG5sZXQgdGVtcG9yYXJ5SWQgPSAwXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVtcG9yYXJ5SWQoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFRlbXBvcmFyeSBpZHMgYXJlIG1hcmtlZCB3aXRoIGEgJ0AnIGF0IHRoZSBiZWdpbm5pbmcuXG4gIGRhdGFbaWRLZXldID0gYEAkeysrdGVtcG9yYXJ5SWR9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wb3JhcnlJZChpZCkge1xuICByZXR1cm4gL15ALy50ZXN0KGlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2UoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbiBvYmplY3QgdGhhdCBob2xkcyBub3RoaW5nIG1vcmUgdGhhbiBhbiBpZC5cbiAgcmV0dXJuIGRhdGE/LltpZEtleV0gIT0gbnVsbCAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDFcbn1cbiIsImltcG9ydCB7IHRvUmF3IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQge1xuICBnZXRJdGVtRGF0YVBhdGgsXG4gIGdldFBhcmVudEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbSxcbiAgZ2V0SXRlbSxcbiAgZ2V0TGFzdERhdGFQYXRoTmFtZSxcbiAgZ2V0TGFzdERhdGFQYXRoSW5kZXhcbn0gZnJvbSAnLi91dGlscy9kYXRhLmpzJ1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlXG5cbi8vIGBEaXRvQ29udGV4dGAgaW5zdGFuY2VzIGFyZSBhIHRoaW4gd3JhcHBlciBhcm91bmQgcmF3IGBjb250ZXh0YCBvYmplY3RzLFxuLy8gd2hpY2ggdGhlbXNlbHZlcyBhY3R1YWxseSBpbmhlcml0IGZyb20gdGhlIGxpbmtlZCBgY29tcG9uZW50YCBpbnN0YW5jZSwgc29cbi8vIHRoYXQgdGhleSBvbmx5IG5lZWQgdG8gcHJvdmlkZSB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGRpZmZlcmVudCB0aGFuXG4vLyBpbiB0aGUgdW5kZXJseWluZyBjb21wb25lbnQuIEluIG9yZGVyIHRvIG5vdCBleHBvc2UgYWxsIGZpZWxkcyBmcm9tIHRoZVxuLy8gY29tcG9uZW50LCB0aGUgd3JhcHBlciBpcyBpbnRyb2R1Y2VkOlxuLy8gVXNlIFdlYWtNYXAgZm9yIHRoZSByYXcgYGNvbnRleHRgIG9iamVjdHMsIHNvIHdlIGRvbid0IGhhdmUgdG8gcG9sbHV0ZSB0aGVcbi8vIGFjdHVhbCBgRGl0b0NvbnRleHRgIGluc3RhbmNlIHdpdGggaXQuXG5jb25zdCBjb250ZXh0cyA9IG5ldyBXZWFrTWFwKClcblxuZnVuY3Rpb24gZ2V0KGNvbnRleHQsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGNvbnN0IG9iamVjdCA9IGNvbnRleHRzLmdldCh0b1Jhdyhjb250ZXh0KSlcbiAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XVxuICAvLyBJZiBgb2JqZWN0YCBleHBsaWNpdGx5IHNldHMgdGhlIGtleSB0byBgdW5kZWZpbmVkYCwgcmV0dXJuIGl0LlxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuICAgID8gdmFsdWVcbiAgICA6IGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKVxuICAgICAgPyBkZWZhdWx0VmFsdWUoKVxuICAgICAgOiBkZWZhdWx0VmFsdWVcbn1cblxuZnVuY3Rpb24gc2V0KGNvbnRleHQsIGtleSwgdmFsdWUpIHtcbiAgY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVtrZXldID0gdmFsdWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0NvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIHBhcmFtcyBvYmplY3QgLyBmdW5jdGlvbiwgb3IgY3JlYXRlIGEgbmV3IG9uZTpcbiAgICBjb250ZXh0ID0gY29udGV4dFxuICAgICAgPyBpc0Z1bmN0aW9uKGNvbnRleHQpXG4gICAgICAgID8gY29udGV4dCgpXG4gICAgICAgIDogeyAuLi5jb250ZXh0IH1cbiAgICAgIDoge31cbiAgICAvLyBJZiBub3QgZXhwbGljaXRseSBzZXQgKHRvIGZhbHNlKSwgZGVmYXVsdCB0byB0cnVlIHNvIHdlIGRvbid0IGZhbGwgYmFja1xuICAgIC8vIHRvIGBjb21wb25lbnRgIGZvciBpdHMgdmFsdWUuXG4gICAgY29udGV4dC5uZXN0ZWQgPz89IHRydWVcbiAgICBjb250ZXh0LmNvbXBvbmVudCA9IGNvbXBvbmVudFxuICAgIC8vIEhhdmUgYG9iamVjdGAgaW5oZXJpdCBmcm9tIHRoZSBgY29tcG9uZW50YCBpbnN0YW5jZSwgc28gaXQgY2FuIG92ZXJyaWRlXG4gICAgLy8gaXRzIHZhbHVlcyBhbmQgc3RpbGwgcmV0cmlldmUgZnJvbSBpdCwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGB0aGlzYFxuICAgIC8vIHRocm91Z2ggYGNvbnRleHRzYCBtYXA6XG4gICAgY29uc3Qgb2JqZWN0ID0gT2JqZWN0LnNldFByb3RvdHlwZU9mKGNvbnRleHQsIGNvbXBvbmVudClcbiAgICAvLyBObyBuZWVkIGZvciBgdG9SYXcodGhpcylgIGhlcmUgYXMgaXQncyBhbHdheXMgcmF3IGluc2lkZSB0aGUgY29uc3RydWN0b3IuXG4gICAgY29udGV4dHMuc2V0KHRoaXMsIG9iamVjdClcbiAgfVxuXG4gIHN0YXRpYyBnZXQoY29tcG9uZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQgaW5zdGFuY2VvZiBEaXRvQ29udGV4dFxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IG5ldyBEaXRvQ29udGV4dChjb21wb25lbnQsIGNvbnRleHQpXG4gIH1cblxuICAvLyBgbmVzdGVkYCBpcyBgdHJ1ZWAgd2hlbiB0aGUgZGF0YS1wYXRoIHBvaW50cyBhIHZhbHVlIGluc2lkZSBhbiBpdGVtLCBhbmRcbiAgLy8gYGZhbHNlYCB3aGVuIGl0IHBvaW50cyB0byB0aGUgaXRlbSBpdHNlbGYuXG4gIGdldCBuZXN0ZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnbmVzdGVkJywgdHJ1ZSlcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICd2YWx1ZScsIHVuZGVmaW5lZClcbiAgfVxuXG4gIGdldCBkYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhUGF0aCcsICcnKVxuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnbmFtZScsICgpID0+IGdldExhc3REYXRhUGF0aE5hbWUodGhpcy5kYXRhUGF0aCkpXG4gIH1cblxuICBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaW5kZXgnLCAoKSA9PiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpdGVtRGF0YVBhdGgoKSB7XG4gICAgcmV0dXJuIGdldEl0ZW1EYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgfVxuXG4gIGdldCBwYXJlbnRJdGVtRGF0YVBhdGgoKSB7XG4gICAgcmV0dXJuIGdldFBhcmVudEl0ZW1EYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgfVxuXG4gIGdldCBpdGVtSW5kZXgoKSB7XG4gICAgcmV0dXJuIGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuaXRlbURhdGFQYXRoKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5wYXJlbnRJdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgaXRlbSgpIHtcbiAgICAvLyBOT1RFOiBXaGlsZSBpbnRlcm5hbGx5LCB3ZSBzcGVhayBvZiBgZGF0YWAsIGluIHRoZSBBUEkgc3VyZmFjZSB0aGVcbiAgICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAgIC8vIElmIGBkYXRhYCBpc24ndCBwcm92aWRlZCwgd2UgY2FuIGRldGVybWluZSBpdCBmcm9tIHJvb3REYXRhICYgZGF0YVBhdGg6XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZGF0YScsICgpID0+XG4gICAgICBnZXRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICAgIClcbiAgfVxuXG4gIC8vIE5PVEU6IGBwYXJlbnRJdGVtYCBpc24ndCB0aGUgY2xvc2VzdCBkYXRhIHBhcmVudCB0byBgaXRlbWAsIGl0J3MgdGhlXG4gIC8vIGNsb3Nlc3QgcGFyZW50IHRoYXQgaXNuJ3QgYW4gYXJyYXksIGUuZy4gZm9yIHJlbGF0aW9ucyBvciBuZXN0ZWQgSlNPTlxuICAvLyBkYXRhLiAgVGhpcyBpcyB3aHkgdGhlIHRlcm0gYGl0ZW1gIHdhcyBjaG9zZW4gb3ZlciBgZGF0YWAsIGUuZy4gVlMgdGhlXG4gIC8vIHVzZSBvZiBgcGFyZW50RGF0YWAgaW4gc2VydmVyLXNpZGVkIHZhbGlkYXRpb24sIHdoaWNoIGlzIHRoZSBjbG9zZXN0XG4gIC8vIHBhcmVudC4gSWYgbmVlZGVkLCB3ZSBjb3VsZCBleHBvc2UgdGhpcyBkYXRhIGhlcmUgdG9vLCBhcyB3ZSBjYW4gZG8gYWxsXG4gIC8vIHNvcnRzIG9mIGRhdGEgcHJvY2Vzc2luZyB3aXRoIGByb290RGF0YWAgYW5kIGBkYXRhUGF0aGAuXG4gIGdldCBwYXJlbnRJdGVtKCkge1xuICAgIGNvbnN0IHBhcmVudEl0ZW0gPSAoXG4gICAgICBnZXRQYXJlbnRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKSB8fFxuICAgICAgbnVsbFxuICAgIClcbiAgICByZXR1cm4gcGFyZW50SXRlbSAhPT0gdGhpcy5pdGVtID8gcGFyZW50SXRlbSA6IG51bGxcbiAgfVxuXG4gIGdldCByb290SXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyb290RGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9jZXNzZWREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCBjbGlwYm9hcmRJdGVtKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2NsaXBib2FyZERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHVzZXIoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAndXNlcicsIG51bGwpXG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2FwaScsIG51bGwpXG4gIH1cblxuICBnZXQgdmlld3MoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAndmlld3MnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGl0ZW1MYWJlbCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtTGFiZWwnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGZvcm1MYWJlbCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtTGFiZWwnLCBudWxsKVxuICB9XG5cbiAgLy8gVE9ETzogUmVtb3ZlIGV4cG9zdXJlIHNpbmNlIHRoZSBhc3NvY2lhdGVkIGNvbXBvbmVudCBkb2Vzbid0IGFsd2F5cyBleGlzdCxcbiAgLy8gZS5nLiBuZXN0ZWQgZm9ybXMgaW4gYHByb2Nlc3NEYXRhKClgLiBJbnN0ZWFkLCBiaW5kIGNvbXBvbmVudCB0byBgdGhpc2BcbiAgLy8gb25seSB3aGVyZSBhdmFpbGFibGUuXG4gIGdldCBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnY29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBgY29tcG9uZW50U2NoZW1hYCBnZXR0ZXIgZm9yIHRoZSBzY2hlbWEgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LFxuICAvLyBldmVuIHdoZW4gdGhlIGNvbXBvbmVudCBpc24ndCBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIENvbnNpZGVyIGFkZGluZ1xuICAvLyBgc291cmNlU2NoZW1hYCBhcyB3ZWxsP1xuXG4gIC8vIFRPRE86IEZpeCB1bmNsZWFyIG5hbWluZzogV2hpY2ggc2NoZW1hIGlzIHRoaXMsIHRoYXQgb2YgdGhlIGNvbXBvbmVudCBvciBvZlxuICAvLyBpdHMgcGFyZW50PyBJc24ndCBleHBvc2luZyBgZm9ybUNvbXBvbmVudGAgYW5kIGB2aWV3Q29tcG9uZW50YCBlbm91Z2gsIG9uY2VcbiAgLy8gd2Ugb2ZmZXIgYWNjZXNzIHRvIHRoZWlyIGNvbXBvbmVudHMgdGhlcmUgdGhyb3VnaCBgZ2V0Q29tcG9uZW50KClgICYgY28uIG9uXG4gIC8vIGBEaXRvTWl4aW5gIHBlcmhhcHM/ICBBbHNvLCB0aGVyZSBjb3VsZCBiZSBhIGB0YWJDb21wb25lbnRgIGdldHRlciBmb3JcbiAgLy8gc2NoZW1hcyBpbiB0YWJzP1xuICBnZXQgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NjaGVtYUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCB2aWV3Q29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkaWFsb2dDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHBhbmVsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3BhbmVsQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBXaGVuIHVzZWQgaW4gT3B0aW9uc01peGluIGZvciBgc2NoZW1hLm9wdGlvbnMudmFsdWUoKWAsXG4gIC8vIGBzY2hlbWEub3B0aW9ucy5sYWJlbCgpYCBhbmQgIGBzY2hlbWEuc2VhcmNoLmZpbHRlcigpYCBjYWxsYmFja3M6XG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9uJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9ucycsIHVuZGVmaW5lZClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbmFtZSB0aGlzIHRvIGBzZWFyY2hUZXJtYCBvciBgc2VhcmNoUXVlcnlgLCB0byBwZXJoYXBzIGZyZWUgYHF1ZXJ5YFxuICAvLyBmb3IgdGhlIGFjdHVhbCBgcmVzb3VyY2VDb21wb25lbnQucXVlcnlgIG9iamVjdD9cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3F1ZXJ5JywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSBjb250ZXh0IG9mIGJ1dHRvbnMgdGhhdCBzZW5kXG4gIC8vIHJlcXVlc3RzLCBzZWUgYFJlc291cmNlTWl4aW4uZW1pdEJ1dHRvbkV2ZW50KClgOlxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3InLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgd2FzTm90aWZpZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnd2FzTm90aWZpZWQnLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZHVyaW5nIGV2ZW50IGhhbmRsZXIgZm9yICcke2V2ZW50fSc6YCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcXVldWUgZm9yIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IGNvbXBsZXRlZCBieSB0aGUgd3JhcHBlciB0aGF0IGNhbGxlZCBgbmV4dCgpYFxuICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2goeyBhcmdzLCByZXNvbHZlIH0pXG4gICAgICAgICAgLy8gRm9yIG5ldyBxdWV1ZXMgKD0gb25seSBvbmUgZW50cnkpIGVtaXQgdGhlIGZpcnN0IGV2ZW50IGltbWVkaWF0ZWx5LFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgcXVldWUgcnVubmluZy5cbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZTpcbiAgICBoYXNMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVycyhldikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQubGVuZ3RoID4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZWdhdGUoZXZlbnQsIHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlKGV2LCB0YXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB0YXJnZXQuZW1pdChldmVudCwgLi4uYXJncykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgcGlja0J5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRSZXNvdXJjZShzY2hlbWEucmVzb3VyY2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZSwgZGVmYXVsdHMgPSB7fSkge1xuICBjb25zdCB7IHBhcmVudCwgLi4uZGVmcyB9ID0gZGVmYXVsdHNcbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgYXNBcnJheSxcbiAgZXF1YWxzLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBoeXBoZW5hdGUsXG4gIGZvcm1hdFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IGFwcFN0YXRlIGZyb20gJy4uL2FwcFN0YXRlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IEVtaXR0ZXJNaXhpbiBmcm9tICcuL0VtaXR0ZXJNaXhpbi5qcydcbmltcG9ydCB7IGlzTWF0Y2hpbmdUeXBlLCBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtFbWl0dGVyTWl4aW5dLFxuXG4gIGluamVjdDogW1xuICAgICdhcGknLFxuICAgICckdmVyYnMnLFxuICAgICckdmlld3MnLFxuICAgICckaXNQb3B1bGF0ZWQnLFxuICAgICckcGFyZW50Q29tcG9uZW50JyxcbiAgICAnJHNjaGVtYUNvbXBvbmVudCcsXG4gICAgJyRyb3V0ZUNvbXBvbmVudCcsXG4gICAgJyRkYXRhQ29tcG9uZW50JyxcbiAgICAnJHNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRyZXNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRkaWFsb2dDb21wb25lbnQnLFxuICAgICckcGFuZWxDb21wb25lbnQnLFxuICAgICckdGFiQ29tcG9uZW50J1xuICBdLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhXG4gICAgICA/IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgb3ZlcnJpZGVzOiBudWxsIC8vIFNlZSBhY2Nlc3Nvci5qc1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBSZXNvdXJjZU1peGluLCB1c2VkIGJ5IGxpc3RzLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNvdXJjZVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGE/LnNjaGVtYVxuICAgIH0sXG5cbiAgICB1c2VyKCkge1xuICAgICAgcmV0dXJuIGFwcFN0YXRlLnVzZXJcbiAgICB9LFxuXG4gICAgLy8gJHZlcmJzLCAkdmVyYnMgYW5kICRpc1BvcHVsYXRlZCBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlXG4gICAgLy8gcmVhY3RpdmVuZXNzIGFjcm9zcyBwcm92aWRlL2luamVjdC5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgIHZlcmJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHZlcmJzKClcbiAgICB9LFxuXG4gICAgdmlld3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmlld3MoKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudFJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5yb3V0ZUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBwYXJlbnRGb3JtQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LmZvcm1Db21wb25lbnRcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzXG4gICAgLy8gdGhhdCBsb2FkcyBpdHMgb3duIGRhdGEgZnJvbSBhbiBhc3NvY2lhdGVkIEFQSSByZXNvdXJjZS5cbiAgICByb290RGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFDb21wb25lbnQ/LmRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVpZFxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIC8vIFRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGlzIG9ubHkgYXZhaWxhYmxlIGR1cmluZyB0aGUgbGlmZS1jeWNsZSBvZiBhXG4gICAgLy8gY29tcG9uZW50LiBTb21lIGluZm9ybWF0aW9uIHdlIG5lZWQgYXZhaWxhYmxlIGxvbmdlciB0aGFuIHRoYXQsIGUuZy5cbiAgICAvLyBgcXVlcnlgICYgYHRvdGFsYCBvbiBUeXBlTGlzdCwgc28gdGhhdCB3aGVuIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIGZyb21cbiAgICAvLyBlZGl0aW5nIGFuIGl0ZW0gaW4gdGhlIGxpc3QsIHRoZSBzdGF0ZSBvZiB0aGUgbGlzdCBpcyBzdGlsbCB0aGUgc2FtZS5cbiAgICAvLyBXZSBjYW4ndCBzdG9yZSB0aGlzIGluIGBkYXRhYCwgYXMgdGhpcyBpcyBhbHJlYWR5IHRoZSBwdXJlIGRhdGEgZnJvbSB0aGVcbiAgICAvLyBBUEkgc2VydmVyLiBUaGF0J3Mgd2hhdCB0aGUgYHN0b3JlYCBpcyBmb3I6IE1lbW9yeSB0aGF0J3MgYXZhaWxhYmxlIGFzXG4gICAgLy8gbG9uZyBhcyB0aGUgY3VycmVudCBlZGl0aW5nIHBhdGggaXMgc3RpbGwgdmFsaWQuIEZvciB0eXBlIGNvbXBvbmVudHMsXG4gICAgLy8gdGhpcyBtZW1vcnkgaXMgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCwgc2VlIFJvdXRlTWl4aW4gYW5kIERpdG9QYW5lLlxuICAgIGdldFN0b3JlKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XVxuICAgIH0sXG5cbiAgICBzZXRTdG9yZShrZXksIHZhbHVlKSB7XG4gICAgICB0aGlzLnN0b3JlW2tleV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcblxuICAgIGdldENoaWxkU3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZShrZXkpIHx8IHRoaXMuc2V0U3RvcmUoa2V5LCByZWFjdGl2ZSh7fSkpXG4gICAgfSxcblxuICAgIGdldFNjaGVtYVZhbHVlKFxuICAgICAga2V5T3JEYXRhUGF0aCxcbiAgICAgIHsgdHlwZSwgZGVmYXVsdDogZGVmLCBzY2hlbWEgPSB0aGlzLnNjaGVtYSwgY2FsbGJhY2sgPSB0cnVlIH0gPSB7fVxuICAgICkge1xuICAgICAgY29uc3QgdHlwZXMgPSB0eXBlICYmIGFzQXJyYXkodHlwZSlcbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBkYXRhLXBhdGhzIGluIGBrZXlPckRhdGFQYXRoYCBjYW4gb25seSBiZVxuICAgICAgLy8gcHJvdmlkZWQgaW4gaW4gYXJyYXkgZm9ybWF0IGhlcmU6XG4gICAgICBsZXQgdmFsdWUgPSBzY2hlbWFcbiAgICAgICAgPyBpc0FycmF5KGtleU9yRGF0YVBhdGgpXG4gICAgICAgICAgPyBnZXRWYWx1ZUF0RGF0YVBhdGgoc2NoZW1hLCBrZXlPckRhdGFQYXRoLCAoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgOiBzY2hlbWFba2V5T3JEYXRhUGF0aF1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oZGVmKSAmJiAhaXNNYXRjaGluZ1R5cGUodHlwZXMsIGRlZikpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9ucyBmb3IgYW55IHR5cGUgZXhjZXB0IGBGdW5jdGlvbmA6XG4gICAgICAgICAgZGVmID0gZGVmLmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG4gICAgICAvLyBBbnkgc2NoZW1hIHZhbHVlIGhhbmRsZWQgdGhyb3VnaCBgZ2V0U2NoZW1hVmFsdWUoKWAgY2FuIHByb3ZpZGVcbiAgICAgIC8vIGEgZnVuY3Rpb24gdGhhdCdzIHJlc29sdmVkIHdoZW4gdGhlIHZhbHVlIGlzIGV2YWx1YXRlZDpcbiAgICAgIGlmIChjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuICAgICAgfVxuICAgICAgLy8gTm93IGZpbmFsbHkgc2VlIGlmIHdlIGNhbiBjb252ZXJ0IHRvIHRoZSBleHBlY3QgdHlwZXMuXG4gICAgICBpZiAodHlwZXMgJiYgdmFsdWUgIT0gbnVsbCAmJiAhaXNNYXRjaGluZ1R5cGUodHlwZXMsIHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSBjb252ZXJ0VHlwZSh0eXBlLCB2YWx1ZSlcbiAgICAgICAgICBpZiAoY29udmVydGVkICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcblxuICAgIGdldExhYmVsKHNjaGVtYSwgbmFtZSkge1xuICAgICAgcmV0dXJuIHNjaGVtYVxuICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2xhYmVsJywgeyB0eXBlOiBTdHJpbmcsIHNjaGVtYSB9KSB8fFxuICAgICAgICAgIGxhYmVsaXplKG5hbWUgfHwgc2NoZW1hLm5hbWUpXG4gICAgICAgIDogbGFiZWxpemUobmFtZSkgfHwgJydcbiAgICB9LFxuXG4gICAgbGFiZWxpemUsXG5cbiAgICBnZXRCdXR0b25BdHRyaWJ1dGVzKG5hbWUsIGJ1dHRvbikge1xuICAgICAgY29uc3QgdmVyYiA9IHRoaXMudmVyYnNbbmFtZV0gfHwgbmFtZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3M6IGBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YCxcbiAgICAgICAgdGl0bGU6IGJ1dHRvbj8udGV4dCB8fCBsYWJlbGl6ZSh2ZXJiKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgKkxpbmsoKSB0byAqUm91dGUoKS5cbiAgICBnZXRRdWVyeUxpbmsocXVlcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICAvLyBQcmVzZXJ2ZSBoYXNoIGZvciB0YWJzOlxuICAgICAgICBoYXNoOiB0aGlzLiRyb3V0ZS5oYXNoXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3VsZFJlbmRlcihzY2hlbWEgPSBudWxsKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhIXNjaGVtYSAmJlxuICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdpZicsIHtcbiAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgICAgc2NoZW1hXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSxcblxuICAgIGdldFJlc291cmNlUGF0aChyZXNvdXJjZSkge1xuICAgICAgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShyZXNvdXJjZSlcbiAgICAgIC8vIFJlc291cmNlcyB3aXRob3V0IGEgcGFyZW50IGluaGVyaXQgdGhlIG9uZSBmcm9tIGBkYXRhQ29tcG9uZW50YFxuICAgICAgLy8gYXV0b21hdGljYWxseS5cbiAgICAgIGlmIChyZXNvdXJjZS5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXNvdXJjZS5wYXJlbnQgPSB0aGlzLmRhdGFDb21wb25lbnQ/LnJlc291cmNlXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hcGkucmVzb3VyY2VzLmFueShnZXRSZXNvdXJjZShyZXNvdXJjZSkpXG4gICAgfSxcblxuICAgIGdldFJlc291cmNlVXJsKHJlc291cmNlKSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFJlc291cmNlUGF0aChyZXNvdXJjZSlcbiAgICAgIHJldHVybiB1cmwgPyB0aGlzLmFwaS5nZXRBcGlVcmwoeyB1cmwsIHF1ZXJ5OiByZXNvdXJjZS5xdWVyeSB9KSA6IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QoeyBtZXRob2QsIHVybCwgcmVzb3VyY2UsIHF1ZXJ5LCBkYXRhLCBpbnRlcm5hbCB9KSB7XG4gICAgICB1cmwgfHw9IHRoaXMuZ2V0UmVzb3VyY2VQYXRoKHJlc291cmNlKVxuICAgICAgbWV0aG9kIHx8PSByZXNvdXJjZT8ubWV0aG9kXG4gICAgICBjb25zdCBjaGVja1VzZXIgPSAhaW50ZXJuYWwgJiYgdGhpcy5hcGkuaXNBcGlVcmwodXJsKVxuICAgICAgaWYgKGNoZWNrVXNlcikge1xuICAgICAgICBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuZW5zdXJlVXNlcigpXG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXBpLnJlcXVlc3QoeyBtZXRob2QsIHVybCwgZGF0YSwgcXVlcnkgfSlcbiAgICAgIC8vIERldGVjdCBjaGFuZ2Ugb2YgdGhlIG93biB1c2VyLCBhbmQgZmV0Y2ggaXQgYWdhaW4gaWYgaXQgd2FzIGNoYW5nZWQuXG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrVXNlciAmJlxuICAgICAgICBtZXRob2QgPT09ICdwYXRjaCcgJiZcbiAgICAgICAgZXF1YWxzKHJlc291cmNlLCBnZXRNZW1iZXJSZXNvdXJjZSh0aGlzLnVzZXIuaWQsIHRoaXMuYXBpLnVzZXJzKSlcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuZmV0Y2hVc2VyKClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0sXG5cbiAgICBzaG93RGlhbG9nKHsgY29tcG9uZW50cywgYnV0dG9ucywgZGF0YSwgc2V0dGluZ3MgfSkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdENvbXBvbmVudC5zaG93RGlhbG9nKHtcbiAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgc2V0dGluZ3NcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlcXVlc3QoeyBjYWNoZSwgLi4ub3B0aW9ucyB9KSB7XG4gICAgICAvLyBBbGxvdyBjYWNoaW5nIG9mIGxvYWRlZCBkYXRhIG9uIHR3byBsZXZlbHM6XG4gICAgICAvLyAtICdnbG9iYWwnOiBjYWNoZSBnbG9iYWxseSwgZm9yIHRoZSBlbnRpcmUgYWRtaW4gc2Vzc2lvblxuICAgICAgLy8gLSAnbG9jYWwnOiBjYWNoZSBsb2NhbGx5IHdpdGhpbiB0aGUgY2xvc2VzdCByb3V0ZSBjb21wb25lbnQgdGhhdCBpc1xuICAgICAgLy8gICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgYW5kIGxvYWRzIGl0cyBvd24gZGF0YS5cbiAgICAgIGNvbnN0IGNhY2hlUGFyZW50ID0gKFxuICAgICAgICBjYWNoZSAmJlxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFsOiB0aGlzLmFwcFN0YXRlLFxuICAgICAgICAgIGxvY2FsOiB0aGlzLmRhdGFDb21wb25lbnRcbiAgICAgICAgfVtjYWNoZV1cbiAgICAgIClcbiAgICAgIGNvbnN0IGxvYWRDYWNoZSA9IGNhY2hlUGFyZW50Py5sb2FkQ2FjaGVcbiAgICAgIC8vIEJ1aWxkIGEgY2FjaGUga2V5IGZyb20gdGhlIGNvbmZpZzpcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gKFxuICAgICAgICBsb2FkQ2FjaGUgJiZcbiAgICAgICAgYCR7XG4gICAgICAgICAgb3B0aW9ucy5tZXRob2QgfHwgJ2dldCdcbiAgICAgICAgfSAke1xuICAgICAgICAgIG9wdGlvbnMudXJsXG4gICAgICAgIH0gJHtcbiAgICAgICAgICAvLyBUT0RPOiBgcmVxdWVzdC5wYXJhbXNgIHdhcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgcXVlcnlgIG9uXG4gICAgICAgICAgLy8gMjAyMi0xMS0wMSwgcmVtb3ZlIG9uY2Ugbm90IGluIHVzZSBhbnl3aGVyZSBhbnkgbW9yZS5cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcHRpb25zLnF1ZXJ5IHx8IG9wdGlvbnMucGFyYW1zIHx8ICcnKVxuICAgICAgICB9ICR7XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhIHx8ICcnKVxuICAgICAgICB9YFxuICAgICAgKVxuICAgICAgaWYgKGxvYWRDYWNoZSAmJiAoY2FjaGVLZXkgaW4gbG9hZENhY2hlKSkge1xuICAgICAgICByZXR1cm4gbG9hZENhY2hlW2NhY2hlS2V5XVxuICAgICAgfVxuICAgICAgLy8gTk9URTogTm8gYXdhaXQgaGVyZSwgcmVzIGlzIGEgcHJvbWlzZSB0aGF0IHdlIGNhbiBlYXNpbHkgY2FjaGUuXG4gICAgICAvLyBUaGF0J3MgZmluZSBiZWNhdXNlIHByb21pc2VzIGNhbiBiZSByZXNvbHZlZCBvdmVyIGFuZCBvdmVyIGFnYWluLlxuICAgICAgY29uc3QgcmVzID0gdGhpcy5zZW5kUmVxdWVzdChvcHRpb25zKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5kYXRhKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIENvbnZlcnQgYXhpb3MgZXJyb3JzIHRvIG5vcm1hbCBlcnJvcnNcbiAgICAgICAgICBjb25zdCBkYXRhID0gZXJyb3IucmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICB0aHJvdyBkYXRhXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGRhdGEubWVzc2FnZSksIGRhdGEpXG4gICAgICAgICAgICA6IGVycm9yXG4gICAgICAgIH0pXG4gICAgICBpZiAobG9hZENhY2hlKSB7XG4gICAgICAgIGxvYWRDYWNoZVtjYWNoZUtleV0gPSByZXNcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNcbiAgICB9LFxuXG4gICAgZm9ybWF0KHZhbHVlLCB7XG4gICAgICBsb2NhbGUgPSB0aGlzLmFwaS5sb2NhbGUsXG4gICAgICBkZWZhdWx0cyA9IHRoaXMuYXBpLmZvcm1hdHMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gZm9ybWF0KHZhbHVlLCB7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIG5hdmlnYXRlKGxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGVyLnB1c2gobG9jYXRpb24pXG4gICAgfSxcblxuICAgIGRvd25sb2FkKG9wdGlvbnMgPSB7fSkge1xuICAgICAgaWYgKGlzU3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHVybDogb3B0aW9ucyB9XG4gICAgICB9XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80OTkxNzA2Ni8xMTYzNzA4XG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBhLmhyZWYgPSB0aGlzLmFwaS5nZXRBcGlVcmwob3B0aW9ucylcbiAgICAgIGEuZG93bmxvYWQgPSBvcHRpb25zLmZpbGVuYW1lID8/IG51bGxcbiAgICAgIGNvbnN0IHsgYm9keSB9ID0gZG9jdW1lbnRcbiAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoYSlcbiAgICAgIGEuY2xpY2soKVxuICAgICAgYm9keS5yZW1vdmVDaGlsZChhKVxuICAgIH0sXG5cbiAgICBub3RpZnkob3B0aW9ucykge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50Lm5vdGlmeShvcHRpb25zKVxuICAgIH0sXG5cbiAgICBjbG9zZU5vdGlmaWNhdGlvbnMoKSB7XG4gICAgICB0aGlzLnJvb3RDb21wb25lbnQuY2xvc2VOb3RpZmljYXRpb25zKClcbiAgICB9LFxuXG4gICAgc2V0dXBTY2hlbWFGaWVsZHMoKSB7XG4gICAgICB0aGlzLnNldHVwTWV0aG9kcygpXG4gICAgICB0aGlzLnNldHVwQ29tcHV0ZWQoKVxuICAgICAgdGhpcy5zZXR1cEV2ZW50cygpXG4gICAgfSxcblxuICAgIHNldHVwTWV0aG9kcygpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLm1ldGhvZHMgfHwge30pKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBtZXRob2QgZGVmaW5pdGlvbjogJHtrZXl9OiAke3ZhbHVlfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0dXBDb21wdXRlZCgpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLmNvbXB1dGVkIHx8IHt9KSkge1xuICAgICAgICBjb25zdCBhY2Nlc3NvciA9IGlzRnVuY3Rpb24odmFsdWUpXG4gICAgICAgICAgPyB7IGdldDogdmFsdWUgfVxuICAgICAgICAgIDogaXNPYmplY3QodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuZ2V0KVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGlmIChhY2Nlc3Nvcikge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIGFjY2Vzc29yKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBjb21wdXRlZCBwcm9wZXJ0eSBkZWZpbml0aW9uOiAke2tleX06ICR7dmFsdWV9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXR1cEV2ZW50cygpIHtcbiAgICAgIGNvbnN0IHsgd2F0Y2gsIGV2ZW50cyB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIGlmICh3YXRjaCkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IGlzRnVuY3Rpb24od2F0Y2gpID8gd2F0Y2guY2FsbCh0aGlzKSA6IHdhdGNoXG4gICAgICAgIGlmIChpc09iamVjdChoYW5kbGVycykpIHtcbiAgICAgICAgICAvLyBJbnN0YWxsIHRoZSB3YXRjaCBoYW5kbGVycyBpbiB0aGUgbmV4dCB0aWNrLCBzbyBhbGwgY29tcG9uZW50cyBhcmVcbiAgICAgICAgICAvLyBpbml0aWFsaXplZCBhbmQgd2UgY2FuIGNoZWNrIGFnYWluc3QgdGhlaXIgbmFtZXMuXG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBjYWxsYmFja10gb2YgT2JqZWN0LmVudHJpZXMoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgIC8vIEV4cGFuZCBwcm9wZXJ0eSBuYW1lcyB0byAnZGF0YS5wcm9wZXJ0eSc6XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSB0aGlzLnNjaGVtYUNvbXBvbmVudC5nZXRDb21wb25lbnRCeU5hbWUoa2V5KVxuICAgICAgICAgICAgICAgID8gYGRhdGEuJHtrZXl9YFxuICAgICAgICAgICAgICAgIDoga2V5XG4gICAgICAgICAgICAgIHRoaXMuJHdhdGNoKGV4cHIsIGNhbGxiYWNrKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRkRXZlbnQgPSAoa2V5LCBldmVudCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICAgICAgdGhpcy5vbihoeXBoZW5hdGUoZXZlbnQpLCBjYWxsYmFjaylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGV2ZW50IGRlZmluaXRpb246ICR7a2V5fTogJHtjYWxsYmFja31gKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRzKSkge1xuICAgICAgICAgIGFkZEV2ZW50KGtleSwga2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWxzbyBzY2FuIHNjaGVtYSBmb3IgYG9uW0EtWl1gLXN0eWxlIGNhbGxiYWNrcyBhbmQgYWRkIHRoZW1cbiAgICAgIC8vIFRPRE86IERlcHJlY2F0ZSBvbmUgZm9ybWF0IG9yIHRoZSBvdGhlciwgaW4gZmF2b3VyIG9mIG9ubHkgb25lIHdheSBvZlxuICAgICAgLy8gZG9pbmcgdGhpbmdzLiBEZWNpZGUgd2hpY2ggb25lIHRvIHJlbW92ZS5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hKSkge1xuICAgICAgICBpZiAoL15vbltBLVpdLy50ZXN0KGtleSkpIHtcbiAgICAgICAgICBhZGRFdmVudChrZXksIGtleS5zbGljZSgyKSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZW1pdEV2ZW50KGV2ZW50LCB7XG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIHBhcmVudCA9IG51bGxcbiAgICB9ID0ge30pIHtcbiAgICAgIGNvbnN0IGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzTGlzdGVuZXJzKGV2ZW50KVxuICAgICAgY29uc3QgcGFyZW50SGFzTGlzdGVuZXJzID0gcGFyZW50Py5oYXNMaXN0ZW5lcnMoZXZlbnQpXG4gICAgICBpZiAoaGFzTGlzdGVuZXJzIHx8IHBhcmVudEhhc0xpc3RlbmVycykge1xuICAgICAgICAvLyBUaGUgZWZmZWN0cyBvZiBzb21lIGV2ZW50cyBuZWVkIHNvbWUgdGltZSB0byBwcm9wYWdhdGUgdGhyb3VnaCBWdWUuXG4gICAgICAgIC8vIFVzZSAkbmV4dFRpY2soKSB0byBtYWtlIHN1cmUgb3VyIGhhbmRsZXJzIHNlZSB0aGVzZSBjaGFuZ2VzLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYHByb2Nlc3NlZEl0ZW1gIGlzIG9ubHkgY29ycmVjdCBhZnRlciBjb21wb25lbnRzIHRoYXRcbiAgICAgICAgLy8gYXJlIG5ld2x5IHJlbmRlcmVkIGR1ZSB0byBkYXRhIGNoYW5nZXMgaGF2ZSByZWdpc3RlcmVkIHRoZW1zZWx2ZXMuXG4gICAgICAgIGlmIChbJ2xvYWQnLCAnY2hhbmdlJ10uaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy4kbmV4dFRpY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2V0Q29udGV4dCA9ICgpID0+IChjb250ZXh0ID0gRGl0b0NvbnRleHQuZ2V0KHRoaXMsIGNvbnRleHQpKVxuICAgICAgICBjb25zdCByZXMgPSBoYXNMaXN0ZW5lcnNcbiAgICAgICAgICA/IGF3YWl0IHRoaXMuZW1pdChldmVudCwgZ2V0Q29udGV4dCgpKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIC8vIERvbid0IGJ1YmJsZSB0byBwYXJlbnQgaWYgaGFuZGxlZCBldmVudCByZXR1cm5lZCBgZmFsc2VgXG4gICAgICAgIGlmIChwYXJlbnRIYXNMaXN0ZW5lcnMgJiYgcmVzICE9PSBmYWxzZSkge1xuICAgICAgICAgIHBhcmVudC5lbWl0KGV2ZW50LCBnZXRDb250ZXh0KCkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlbWl0U2NoZW1hRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50LmVtaXRFdmVudChldmVudCwgcGFyYW1zKVxuICAgIH1cbiAgfVxufVxuXG5sZXQgbmV4dFVpZCA9IDBcbiIsImltcG9ydCB7IGlzQ3JlZGl0Q2FyZCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBjcmVkaXRjYXJkID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNDcmVkaXRDYXJkKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIGludmFsaWQnXG59XG4iLCJleHBvcnQgY29uc3QgZGVjaW1hbHMgPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIGRlY2ltYWxzKSA9PiB7XG4gICAgY29uc3QgbWF0Y2ggPSBkZWNpbWFscyA9PT0gJyonID8gJysnIDogYHsxLCR7ZGVjaW1hbHN9fWBcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlstK10/XFxcXGQqKFxcXFwuXFxcXGQke21hdGNofSk/JGApLnRlc3QodmFsdWUpXG4gIH0sXG5cbiAgbWVzc2FnZTogKHZhbHVlLCBkZWNpbWFscykgPT5cbiAgICBgbXVzdCBiZSBudW1lcmljIGFuZCBtYXkgY29udGFpbiAke1xuICAgICAgIWRlY2ltYWxzIHx8IGRlY2ltYWxzID09PSAnKicgPyAnJyA6IGRlY2ltYWxzXG4gICAgfSBkZWNpbWFsIHBvaW50c2Bcbn1cbiIsImltcG9ydCB7IGlzRG9tYWluIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGRvbWFpbiA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzRG9tYWluKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIG5vdCBhIGRvbWFpbidcbn1cbiIsImltcG9ydCB7IGlzRW1haWwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgZW1haWwgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0VtYWlsKHZhbHVlKSxcbiAgbWVzc2FnZTogJ211c3QgYmUgYSB2YWxpZCBlbWFpbCdcbn1cbiIsImltcG9ydCB7IGlzSG9zdG5hbWUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaG9zdG5hbWUgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0hvc3RuYW1lKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIG5vdCBhIGhvc3QgbmFtZSdcbn1cbiIsImltcG9ydCB7IGlzSW50ZWdlciB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBpbnRlZ2VyID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNJbnRlZ2VyKHZhbHVlKSxcbiAgbWVzc2FnZTogJ211c3QgYmUgd2hvbGUgbnVtYmVyJ1xufVxuIiwiZXhwb3J0IGNvbnN0IG1heCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgbWF4KSA9PiB2YWx1ZSA8PSBtYXgsXG4gIG1lc3NhZ2UodmFsdWUsIG1heCkge1xuICAgIHJldHVybiBgbXVzdCBiZSAke21heH0gb3IgbGVzc2BcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IG1pbiA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgbWluKSA9PiB2YWx1ZSA+PSBtaW4sXG4gIG1lc3NhZ2UodmFsdWUsIG1pbikge1xuICAgIHJldHVybiBgbXVzdCBiZSAke21pbn0gb3IgbW9yZWBcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IHBhc3N3b3JkID0ge1xuICAvLyBBbGxvdyBhbnkgdmFsdWUuIEZvciBub3cgdGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBtYXJrZXIsIHRvIGFsbG93IHRoZVxuICAvLyByZXF1aXJlZCB2YWxpZGF0aW9uIHRvIGhhbmRsZSB1bmNoYW5nZWQgcGFzc3dvcmRzIHNlcGFyYXRlbHkuXG4gIHZhbGlkYXRlOiAoKSA9PiB0cnVlXG59XG4iLCJleHBvcnQgY29uc3QgcmFuZ2UgPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIFttaW4sIG1heF0pID0+IHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXgsXG4gIG1lc3NhZ2UodmFsdWUsIFttaW4sIG1heF0pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgYmV0d2VlbiAke21pbn0gYW5kICR7bWF4fWBcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IHJlcXVpcmVkID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBzZXR0aW5ncywgeyBwYXNzd29yZCB9KSA9PiAoXG4gICAgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09ICcnKSB8fFxuICAgIC8vIFBhc3N3b3JkIGZpZWxkcyB1c2UgYHVuZGVmaW5lZGAgYXMgb3Bwb3NlZCB0byBgbnVsbGAgd2hlbiB0aGV5J3JlIHNldFxuICAgIC8vIGJ1dCB1bmNoYW5nZWQsIGFsbG93IHRoaXMgdG8gcGFzcyB0aHJvdWdoOlxuICAgIChwYXNzd29yZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICApLFxuICBtZXNzYWdlOiAnaXMgcmVxdWlyZWQnLFxuICBudWxsaXNoOiB0cnVlXG59XG4iLCJpbXBvcnQgeyBpc1VybCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCB1cmwgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc1VybCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBVUkwnXG59XG4iLCJpbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCAqIGFzIHZhbGlkYXRpb25zIGZyb20gJy4uL3ZhbGlkYXRpb25zL2luZGV4LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWydlcnJvcnMnXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpc1RvdWNoZWQ6IGZhbHNlLFxuICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICBpc1ZhbGlkYXRlZDogZmFsc2UsXG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVzZXRWYWxpZGF0aW9uKCkge1xuICAgICAgdGhpcy5pc1RvdWNoZWQgPSBmYWxzZVxuICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZGF0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5pc1ZhbGlkID0gZmFsc2VcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZShub3RpZnkgPSB0cnVlKSB7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWVcbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzXG4gICAgICAvLyBjb25zb2xlLmxvZygndmFsaWRhdGUnLCB0aGlzLmRhdGFQYXRoLCB2YWx1ZSwgdGhpcy52YWxpZGF0aW9ucylcbiAgICAgIGZvciAoY29uc3QgW3J1bGUsIHNldHRpbmddIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHZhbGlkYXRpb25zW3J1bGVdXG4gICAgICAgIGlmICh2YWxpZGF0b3IgJiYgKHZhbGlkYXRvci5udWxsaXNoIHx8IHZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWxpZGF0ZSwgbWVzc2FnZSB9ID0gdmFsaWRhdG9yXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZSh2YWx1ZSwgc2V0dGluZywgdGhpcy52YWxpZGF0aW9ucykpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZVxuICAgICAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzRnVuY3Rpb24obWVzc2FnZSlcbiAgICAgICAgICAgICAgICA/IG1lc3NhZ2UodmFsdWUsIHNldHRpbmcsIHRoaXMpXG4gICAgICAgICAgICAgICAgOiBtZXNzYWdlXG4gICAgICAgICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyb3IsIHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIHRoaXMuaXNWYWxpZGF0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IGlzVmFsaWRcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1ZhbGlkXG4gICAgfSxcblxuICAgIHZlcmlmeSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlKGZhbHNlKVxuICAgIH0sXG5cbiAgICBtYXJrVG91Y2hlZCgpIHtcbiAgICAgIHRoaXMuaXNUb3VjaGVkID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBtYXJrRGlydHkoKSB7XG4gICAgICB0aGlzLmlzRGlydHkgPSB0cnVlXG4gICAgICB0aGlzLmlzVmFsaWRhdGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlXG4gICAgICAvLyBDbGVhciBjdXJyZW50bHkgZGlzcGxheWVkIGVycm9ycyBvbiBuZXcgaW5wdXQuXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgYWRkRXJyb3IoZXJyb3IsIGFkZExhYmVsID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZXJyb3JzIHx8PSBbXVxuICAgICAgaWYgKGFkZExhYmVsKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5sYWJlbCB8fCB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMubmFtZVxuICAgICAgICBlcnJvciA9IGBUaGUgJHtsYWJlbH0gZmllbGQgJHtlcnJvcn0uYFxuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcilcbiAgICAgIHRoaXMuJGVtaXQoJ2Vycm9ycycsIHRoaXMuZXJyb3JzKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICAvLyBDb252ZXJ0IGZyb20gQUpWIGVycm9ycyBvYmplY3RzIHRvIGFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzXG4gICAgICB0aGlzLmVycm9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHsgbWVzc2FnZSB9IG9mIGVycm9ycykge1xuICAgICAgICB0aGlzLmFkZEVycm9yKG1lc3NhZ2UsIHRydWUpXG4gICAgICB9XG4gICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBnZXRFcnJvcnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcnMgPyBbLi4udGhpcy5lcnJvcnNdIDogbnVsbFxuICAgIH0sXG5cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gbnVsbFxuICAgICAgdGhpcy4kZW1pdCgnZXJyb3JzJywgdGhpcy5lcnJvcnMpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmluZyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUFjY2Vzc29yKFxuICBrZXlPckRhdGFQYXRoLFxuICB7IHR5cGUsIGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQsIGNhbGxiYWNrID0gdHJ1ZSB9ID0ge31cbikge1xuICAvLyBga2V5T3JEYXRhUGF0aGAgY2FuIGJlIGEgc2ltcGxlIHByb3BlcnR5IGtleSxcbiAgLy8gb3IgYSBkYXRhLXBhdGggaW50byBzdWItcHJvcGVydGllcywgYm90aCBpbiBhcnJheSBvciBzdHJpbmcgZm9ybWF0LlxuICBpZiAoaXNTdHJpbmcoa2V5T3JEYXRhUGF0aCkgJiYga2V5T3JEYXRhUGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAga2V5T3JEYXRhUGF0aCA9IHBhcnNlRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgfVxuICAvLyBVc2UgdGhlIG5vcm1hbGl6ZWQgZGF0YSBwYXRoIGZvciB0aGUgaGFuZGxpbmcgb3ZlcnJpZGVzXG4gIGNvbnN0IG5hbWUgPSBub3JtYWxpemVEYXRhUGF0aChrZXlPckRhdGFQYXRoKVxuICByZXR1cm4ge1xuICAgIGdldCgpIHtcbiAgICAgIC8vIE9ubHkgZGV0ZXJtaW5lIHNjaGVtYSB2YWx1ZSBpZiB3ZSBoYXZlIG5vIGdldHRlciwgb3IgdGhlIGdldHRlclxuICAgICAgLy8gd2FudHMgdG8gcmVjZWl2ZSB0aGUgdmFsdWUgYW5kIHByb2Nlc3MgaXQgZnVydGhlcjpcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgIWdldCB8fCBnZXQubGVuZ3RoID4gMFxuICAgICAgICAgID8gLy8gTk9URTogQmVjYXVzZSBgc2NoZW1hYCBvYmplY3RzIGFyZSByZXRyaWV2ZWQgZnJvbSBgbWV0YWAsIHRoZXlcbiAgICAgICAgICAgIC8vIGRvbid0IHNlZW0gdG8gYmUgcmVhY3RpdmUuIFRvIGFsbG93IGNoYW5nZWQgaW4gYHNjaGVtYWAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gYHNldCgpYCBzdG9yZXMgY2hhbmdlZCB2YWx1ZXMgaW4gdGhlIHNlcGFyYXRlIGBvdmVycmlkZXNgIG9iamVjdC5cbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVzICYmIG5hbWUgaW4gdGhpcy5vdmVycmlkZXNcbiAgICAgICAgICAgID8gdGhpcy5vdmVycmlkZXNbbmFtZV1cbiAgICAgICAgICAgIDogdGhpcy5nZXRTY2hlbWFWYWx1ZShrZXlPckRhdGFQYXRoLCB7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBkZWYsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIGdldCA/IGdldC5jYWxsKHRoaXMsIHZhbHVlKSA6IHZhbHVlXG4gICAgfSxcblxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHNldCkge1xuICAgICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzIHx8PSB7fVxuICAgICAgICB0aGlzLm92ZXJyaWRlc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZUFjY2Vzc29yKG5hbWUsIHsgZGVmYXVsdDogZGVmLCBnZXQsIHNldCB9ID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFN0b3JlKG5hbWUpXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBTdXBwb3J0IGBkZWZhdWx0KClgIGZ1bmN0aW9uczpcbiAgICAgICAgdmFsdWUgPSBpc0Z1bmN0aW9uKGRlZikgPyBkZWYuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQpIDogZGVmXG4gICAgICAgIC8vIFRyaWdnZXIgc2V0dGVyIGJ5IHNldHRpbmcgdmFsdWUgYW5kIGFjY2Vzc29yIHRvIGRlZmF1bHQ6XG4gICAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgICAvLyBOb3cgYWNjZXNzIHN0b3JlIGFnYWluLCBmb3IgcmVhY3Rpdml0eSB0cmFja2luZ1xuICAgICAgICB0aGlzLmdldFN0b3JlKG5hbWUpXG4gICAgICB9XG4gICAgICAvLyBBbGxvdyB0aGUgcHJvdmlkZWQgZ2V0dGVyIHRvIGZ1cnRoZXIgY2hhbmdlIG9yIHByb2Nlc3MgdGhlIHZhbHVlXG4gICAgICAvLyByZXRyaWV2ZWQgZnJvbSB0aGUgc3RvcmU6XG4gICAgICByZXR1cm4gZ2V0ID8gZ2V0LmNhbGwodGhpcywgdmFsdWUpIDogdmFsdWVcbiAgICB9LFxuXG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICAvLyBBbGxvdyB0aGUgcHJvdmlkZWQgc2V0dGVyIHRvIHJldHVybiBhIG5ldyB2YWx1ZSB0byBzZXQsIG9yIGRvIHRoZVxuICAgICAgLy8gc2V0dGluZyBpdHNlbGYsIGFuZCB0aGVuIHJldHVybiBgdW5kZWZpbmVkYDpcbiAgICAgIGlmICghc2V0IHx8ICh2YWx1ZSA9IHNldC5jYWxsKHRoaXMsIHZhbHVlKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNldFN0b3JlKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFZhbGlkYXRpb25NaXhpbiBmcm9tICcuL1ZhbGlkYXRpb25NaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBjb21wdXRlVmFsdWUgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRJdGVtLCBnZXRQYXJlbnRJdGVtIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdGlvbk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gTk9URTogV2hpbGUgYGRhdGFQYXRoYCBwb2ludHMgdG8gdGhlIGFjdHVhbCBgdmFsdWVgLCBgZGF0YWAgcmVwcmVzZW50c1xuICAgIC8vIHRoZSBgaXRlbWAgaW4gd2hpY2ggdGhlIGB2YWx1ZWAgaXMgY29udGFpbmVkLCB1bmRlciB0aGUga2V5IGBuYW1lYC5cbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZFZhbHVlOiBudWxsLFxuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgdHlwZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS50eXBlXG4gICAgfSxcblxuICAgIGNvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgbmVzdGVkOiB0aGlzLm5lc3RlZCB9KVxuICAgIH0sXG5cbiAgICB2YWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbXB1dGVWYWx1ZShcbiAgICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgIHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgeyBjb21wb25lbnQ6IHRoaXMgfVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHsgZm9ybWF0IH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICAvLyBgc2NoZW1hLmZvcm1hdGAgaXMgb25seSBldmVyIGNhbGxlZCBpbiB0aGUgbGlmZS1jeWNsZVxuICAgICAgICAvLyBvZiB0aGUgY29tcG9uZW50IGFuZCB0aHVzIGl0J3Mgb2sgdG8gYmluZCBpdCB0byBgdGhpc2BcbiAgICAgICAgcmV0dXJuIGZvcm1hdFxuICAgICAgICAgID8gZm9ybWF0LmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgdmFsdWUgfSkpXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIC8vIGBzY2hlbWEucGFyc2VgIGlzIG9ubHkgZXZlciBjYWxsZWQgaW4gdGhlIGxpZmUtY3ljbGVcbiAgICAgICAgLy8gb2YgdGhlIGNvbXBvbmVudCBhbmQgdGh1cyBpdCdzIG9rIHRvIGJpbmQgaXQgdG8gYHRoaXNgXG4gICAgICAgIHRoaXMucGFyc2VkVmFsdWUgPSBwYXJzZVxuICAgICAgICAgID8gcGFyc2UuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyB2YWx1ZSB9KSlcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tbXV0YXRpbmctcHJvcHNcbiAgICAgICAgdGhpcy5kYXRhW3RoaXMubmFtZV0gPSB0aGlzLnBhcnNlZFZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgc2ltaWxhciB0byBgRGl0b0NvbnRleHRgXG4gICAgLy8gcHJvcGVydGllcywgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZXNlIG9uIGB0aGlzYCBhcyB3ZWxsOlxuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gZ2V0SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgICB9LFxuXG4gICAgcGFyZW50SXRlbSgpIHtcbiAgICAgIHJldHVybiBnZXRQYXJlbnRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICAgIH0sXG5cbiAgICByb290SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3REYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgICAvLyBXZSBjYW4gb25seSBnZXQgdGhlIHByb2Nlc3NlZCBpdGVtcyB0aHJvdWdoIHRoZSBzY2hlbWFDb21wb25lbnQsIGJ1dFxuICAgICAgLy8gdGhhdCdzIG5vdCBuZWNlc3NhcmlseSB0aGUgaXRlbSByZXByZXNlbnRlZCBieSB0aGlzIGNvbXBvbmVudC5cbiAgICAgIC8vIFNvbHV0aW9uOiBGaW5kIHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgcHJvY2Vzc2VkIHN1Yi1pdGVtIGZyb20gdGhlcmU6XG4gICAgICBjb25zdCB7IHNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGdldEl0ZW0oXG4gICAgICAgIHNjaGVtYUNvbXBvbmVudC5wcm9jZXNzZWRJdGVtLFxuICAgICAgICAvLyBHZXQgdGhlIGRhdGFQYXRoIHJlbGF0aXZlIHRvIHRoZSBzY2hlbWFDb21wb25lbnQncyBkYXRhOlxuICAgICAgICB0aGlzLmRhdGFQYXRoLnNsaWNlKHNjaGVtYUNvbXBvbmVudC5kYXRhUGF0aC5sZW5ndGgpLFxuICAgICAgICB0aGlzLm5lc3RlZFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBsYWJlbDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2xhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGxhYmVsKVxuICAgICAgICAgID8gbGFiZWxcbiAgICAgICAgICA6IGxhYmVsICE9PSBmYWxzZSAmJiB0aGlzLiRvcHRpb25zLmdlbmVyYXRlTGFiZWxcbiAgICAgICAgICAgID8gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgd2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl1cbiAgICB9KSxcblxuICAgIHZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRvcHRpb25zLmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYGV4Y2x1ZGVkYCBmb3IgY29uc2lzdGVudCBuYW1pbmdcbiAgICBleGNsdWRlOiBnZXRTY2hlbWFBY2Nlc3NvcignZXhjbHVkZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcmVxdWlyZWQ6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXF1aXJlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogTW92ZSB0aGVzZSB0byBhIHN1Yi1jbGFzcyBjb21wb25lbnQgdXNlZCBmb3IgYWxsIGlucHV0IGNvbXBvbmVudHM/XG4gICAgcmVhZG9ubHk6IGdldFNjaGVtYUFjY2Vzc29yKCdyZWFkb25seScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgYXV0b2ZvY3VzOiBnZXRTY2hlbWFBY2Nlc3NvcignYXV0b2ZvY3VzJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUbyBiZSB1c2VkIGZvciBzZWxlY3RzIGFuZCBpbnB1dHMgb25seT9cbiAgICBjbGVhcmFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjbGVhcmFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHBsYWNlaG9sZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncGxhY2Vob2xkZXInLCB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9KSxcblxuICAgIGF1dG9jb21wbGV0ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2F1dG9jb21wbGV0ZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0pLFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZXZlbnRzKCkge1xuICAgICAgY29uc3QgeyBvbkZvY3VzLCBvbkJsdXIsIG9uSW5wdXQsIG9uQ2hhbmdlIH0gPSB0aGlzXG4gICAgICByZXR1cm4geyBvbkZvY3VzLCBvbkJsdXIsIG9uSW5wdXQsIG9uQ2hhbmdlIH1cbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgbmF0aXZlRmllbGQsIHRleHRGaWVsZCB9ID0gdGhpcy4kb3B0aW9uc1xuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge1xuICAgICAgICAuLi50aGlzLmV2ZW50cyxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG5hdGl2ZUZpZWxkKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMubmFtZSA9IHRoaXMubmFtZVxuICAgICAgICBpZiAodGhpcy5sYWJlbCkge1xuICAgICAgICAgIGF0dHJpYnV0ZXMudGl0bGUgPSB0aGlzLmxhYmVsXG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHlcbiAgICAgICAgYXR0cmlidXRlcy5hdXRvZm9jdXMgPSB0aGlzLmF1dG9mb2N1c1xuICAgICAgICBpZiAodGV4dEZpZWxkKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJcbiAgICAgICAgICBhdHRyaWJ1dGVzLmF1dG9jb21wbGV0ZSA9IHRoaXMuYXV0b2NvbXBsZXRlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgdmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHsgLi4udGhpcy5nZXRWYWxpZGF0aW9ucygpIH1cbiAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLy8gQWxsb3cgc2NoZW1hIHRvIG92ZXJyaWRlIGRlZmF1bHQgcnVsZXMgYW5kIGFkZCBhbnkgbmV3IG9uZXM6XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5ydWxlcyB8fCB7fSkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgdmFsaWRhdGlvbnNba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRpb25zW2tleV0gPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbnNcbiAgICB9LFxuXG4gICAgc2hvd0NsZWFyQnV0dG9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYXJhYmxlICYmIHRoaXMudmFsdWUgIT0gbnVsbFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gICAgdGhpcy5zZXR1cFNjaGVtYUZpZWxkcygpXG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gUHJldmVudCB1bm5lc3RlZCB0eXBlIGNvbXBvbmVudHMgZnJvbSBvdmVycmlkaW5nIHBhcmVudCBkYXRhIHBhdGhzXG4gICAgICBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICBjb25zdCBbZWxlbWVudF0gPSBhc0FycmF5KHRoaXMuJHJlZnMuZWxlbWVudClcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCwgYGZvY3VzKClgIHdpbGwgbGlrZWx5IG5vdCBoYXZlIHRoZVxuICAgICAgICAgIC8vIGRlc2lyZWQgZWZmZWN0LiBVc2UgYHNjcm9sbEludG9WaWV3KClgIGlmIGF2YWlsYWJsZTpcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgOyhlbGVtZW50LiRlbCB8fCBlbGVtZW50KS5zY3JvbGxJbnRvVmlldz8uKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgLy8gQWxzbyBmb2N1cyB0aGlzIGNvbXBvbmVudCdzIHNjaGVtYSBhbmQgcGFuZWwgaW4gY2FzZSBpdCdzIGEgdGFiLlxuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuZm9jdXMoKVxuICAgICAgdGhpcy50YWJDb21wb25lbnQ/LmZvY3VzKClcbiAgICAgIHRoaXMuZm9jdXNFbGVtZW50KClcbiAgICB9LFxuXG4gICAgY2xlYXIoKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgfSxcblxuICAgIG9uRm9jdXMoKSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlXG4gICAgICB0aGlzLm1hcmtUb3VjaGVkKClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdmb2N1cycpXG4gICAgfSxcblxuICAgIG9uQmx1cigpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlXG4gICAgICB0aGlzLnZhbGlkYXRlKClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdibHVyJylcbiAgICB9LFxuXG4gICAgb25JbnB1dCgpIHtcbiAgICAgIHRoaXMubWFya0RpcnR5KClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdpbnB1dCcpXG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgY29udGV4dDpcbiAgICAgICAgICB0aGlzLnBhcnNlZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyB2YWx1ZTogdGhpcy5wYXJzZWRWYWx1ZSB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIC8vIFBhc3MgYHNjaGVtYUNvbXBvbmVudGAgYXMgcGFyZW50LCBzbyBjaGFuZ2UgZXZlbnRzIGNhbiBwcm9wYWdhdGUgdXAuXG4gICAgICAgIHBhcmVudDogdGhpcy5zY2hlbWFDb21wb25lbnRcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCJjb25zdCB1aWRNYXAgPSBuZXcgV2Vha01hcCgpXG5cbi8vIEdlbmVyYXRlZCBhbmQgcmVtZW1iZXJzIHVuaXF1ZSBpZHMgcGVyIHBhc3NlZCBvYmplY3QgdXNpbmcgYSB3ZWFrIG1hcC5cbmxldCB1aWQgPSAwXG5leHBvcnQgZnVuY3Rpb24gZ2V0VWlkKG9iamVjdCwgaXRlbUlkKSB7XG4gIGxldCBpZCA9IHVpZE1hcC5nZXQob2JqZWN0KVxuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBpdGVtSWQgfHwgYEAkeysrdWlkfWBcbiAgICB1aWRNYXAuc2V0KG9iamVjdCwgaWQpXG4gIH1cbiAgcmV0dXJuIGlkXG59XG4iLCJpbXBvcnQgeyBpc1RlbXBvcmFyeUlkIH0gZnJvbSAnLi9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgaXNJbnRlZ2VyLFxuICBhc0FycmF5LFxuICBwYXJzZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gJ25hbm9pZCdcblxuLy8gU2NoZW1hR3JhcGggaXMgYSBjbGFzcyB0byBjb2xsZWN0IHNjaGVtYSBncmFwaCBtZXRhIGluZm9ybWF0aW9uIGluIG9yZGVyIHRvXG4vLyBwcm9jZXNzIHNvdXJjZXMgYW5kIHJlbGF0aW9ucyBmb3IgdGhlIGdpdmVuIHRhcmdldHMgJ3NlcnZlcicgYW5kICdjbGlwYm9hcmQnLFxuLy8gYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgdGFibGU6XG4vL1xuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcbi8vIHwgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcnZlciAgICB8IGNsaXBib2FyZCB8XG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogZmFsc2UgICAgICAgICAgIHwga2VlcCBpZCAgIHwga2VlcCBpZCAgIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiB0cnVlLCB0ZW1wb3JhcnkgfCByZWYsICNyZWYgfCByZWYsICNyZWYgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UgICAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IGZhbHNlLCB0ZW1wb3JhcnkgICB8IHJlZiwgI2lkICB8IHJlbW92ZSBpZCB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlICAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZWYsICNpZCAgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogdHJ1ZSwgdGVtcG9yYXJ5ICAgIHwgcmVmLCAjaWQgIHwgcmVmLCAjaWQgIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG5cbmV4cG9ydCBjbGFzcyBTY2hlbWFHcmFwaCB7XG4gIGdyYXBoID0ge31cbiAgcmVmZXJlbmNlcyA9IHt9XG5cbiAgc2V0KGRhdGFQYXRoLCBzZXR0aW5ncywgZGVmYXVsdHMpIHtcbiAgICBkYXRhUGF0aCA9IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG4gICAgbGV0IHN1YkdyYXBoID0gdGhpcy5ncmFwaFxuICAgIGZvciAoY29uc3QgcGFydCBvZiBkYXRhUGF0aCkge1xuICAgICAgY29uc3Qga2V5ID0gaXNJbnRlZ2VyKCtwYXJ0KSA/ICcqJyA6IHBhcnRcbiAgICAgIHN1YkdyYXBoID0gc3ViR3JhcGhba2V5XSA/Pz0ge31cbiAgICB9XG4gICAgc3ViR3JhcGguJHNldHRpbmdzID0ge1xuICAgICAgLi4uZGVmYXVsdHMsIC8vIFNlZSBgYWRkU291cmNlKGRhdGFQYXRoKWBcbiAgICAgIC4uLnN1YkdyYXBoLiRzZXR0aW5ncyxcbiAgICAgIC4uLnNldHRpbmdzXG4gICAgfVxuICB9XG5cbiAgYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICAvLyBPbmx5IHNldCBgcmVsYXRlZDogZmFsc2VgIHRocm91Z2ggdGhlIGRlZmF1bHRzLCBhcyBgc2V0U291cmNlUmVsYXRlZCgpYFxuICAgIC8vIG1heSBiZSBjYWxsZWQgYmVmb3JlIGBhZGRTb3VyY2UoKWAsIGRlcGVuZGluZyBvbiB0aGUgZ3JhcGggc3RydWN0dXJlLlxuICAgIHRoaXMuc2V0KGRhdGFQYXRoLCB7IHR5cGU6ICdzb3VyY2UnLCBzY2hlbWEgfSwgeyByZWxhdGVkOiBmYWxzZSB9KVxuICB9XG5cbiAgc2V0U291cmNlUmVsYXRlZChkYXRhUGF0aCkge1xuICAgIHRoaXMuc2V0KGRhdGFQYXRoLCB7XG4gICAgICByZWxhdGVkOiB0cnVlLFxuICAgICAgcmVmZXJlbmNlOiB0aGlzLmdldFJlZmVyZW5jZVByZWZpeChkYXRhUGF0aClcbiAgICB9KVxuICB9XG5cbiAgYWRkUmVsYXRpb24oZGF0YVBhdGgsIHJlbGF0ZWREYXRhUGF0aCwgc2NoZW1hKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHR5cGU6ICdyZWxhdGlvbicsXG4gICAgICBzY2hlbWEsXG4gICAgICBpbnRlcm5hbDogISFyZWxhdGVkRGF0YVBhdGgsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KHJlbGF0ZWREYXRhUGF0aClcbiAgICB9KVxuICB9XG5cbiAgZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKSB7XG4gICAgcmV0dXJuIGRhdGFQYXRoXG4gICAgICA/ICh0aGlzLnJlZmVyZW5jZXNbZGF0YVBhdGhdID8/PSBuYW5vaWQoNikpXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIGZsYXR0ZW4oKSB7XG4gICAgY29uc3QgZmxhdHRlbiA9IGdyYXBoID0+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuICAgICAgZm9yIChjb25zdCBba2V5LCB7ICRzZXR0aW5ncywgLi4uc3ViR3JhcGggfV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JhcGgpKSB7XG4gICAgICAgIGlmICgkc2V0dGluZ3MpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgJHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtzdWJLZXksIHNldHRpbmdzXSBvZiBmbGF0dGVuKHN1YkdyYXBoKSkge1xuICAgICAgICAgIGVudHJpZXMucHVzaChbYCR7a2V5fS8ke3N1YktleX1gLCBzZXR0aW5nc10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXR0ZW4odGhpcy5ncmFwaClcbiAgfVxuXG4gIHByb2Nlc3Moc291cmNlU2NoZW1hLCBkYXRhLCB7IHRhcmdldCB9KSB7XG4gICAgY29uc3QgY2xpcGJvYXJkID0gdGFyZ2V0ID09PSAnY2xpcGJvYXJkJ1xuICAgIGlmIChjbGlwYm9hcmQpIHtcbiAgICAgIGRlbGV0ZSBkYXRhW3NvdXJjZVNjaGVtYS5pZEtleSB8fCAnaWQnXVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkYXRhUGF0aCwgc2V0dGluZ3NdIG9mIHRoaXMuZmxhdHRlbigpKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIHNjaGVtYSwgaW50ZXJuYWwsIHJlbGF0ZWQsIHJlZmVyZW5jZSB9ID0gc2V0dGluZ3NcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHR5cGUgPT09ICdzb3VyY2UnXG4gICAgICBjb25zdCByZWxhdGlvbiA9IHR5cGUgPT09ICdyZWxhdGlvbidcbiAgICAgIGlmIChzb3VyY2UgfHwgcmVsYXRpb24gJiYgaW50ZXJuYWwpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZ2V0VmFsdWVBdERhdGFQYXRoKGRhdGEsIGRhdGFQYXRoLCAoKSA9PiBudWxsKVxuICAgICAgICBjb25zdCByZW1vdmVJZCA9IGNsaXBib2FyZCAmJiBzb3VyY2UgJiYgIXJlbGF0ZWRcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSAoXG4gICAgICAgICAgY2xpcGJvYXJkICYmIChcbiAgICAgICAgICAgIHJlbGF0aW9uICYmIGludGVybmFsIHx8XG4gICAgICAgICAgICBzb3VyY2UgJiYgcmVsYXRlZFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFzQXJyYXkodmFsdWVzKS5mbGF0KCkpIHtcbiAgICAgICAgICBjb25zdCBpZEtleSA9IChcbiAgICAgICAgICAgIHNvdXJjZSAmJiBzY2hlbWEuaWRLZXkgfHxcbiAgICAgICAgICAgIHJlbGF0aW9uICYmIHNjaGVtYS5yZWxhdGVCeSB8fFxuICAgICAgICAgICAgJ2lkJ1xuICAgICAgICAgIClcbiAgICAgICAgICBsZXQgaWQgPSB2YWx1ZT8uW2lkS2V5XVxuICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVtb3ZlSWQpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZUlkIHx8IGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgIGlmIChpc1RlbXBvcmFyeUlkKGlkKSkge1xuICAgICAgICAgICAgICAgIGlkID0gaWQuc2xpY2UoMSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZWZLZXkgPSBjbGlwYm9hcmRcbiAgICAgICAgICAgICAgICA/IC8vIENsaXBib2FyZCBqdXN0IG5lZWRzIHRlbXBvcmFyeSBpZHMgdW5kZXIgdGhlIGFjdHVhbCBgaWRLZXlgXG4gICAgICAgICAgICAgICAgICBpZEtleVxuICAgICAgICAgICAgICAgIDogLy8gU2VydmVyIHdhbnRzIE9iamVjdGlvbi1zdHlsZSAnI2lkJyAvICcjcmVmJyBwYWlycy5cbiAgICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgPyAnI2lkJ1xuICAgICAgICAgICAgICAgICAgOiAnI3JlZidcbiAgICAgICAgICAgICAgY29uc3QgcmV2VmFsdWUgPSBjbGlwYm9hcmRcbiAgICAgICAgICAgICAgICA/IGBAJHtpZH1gXG4gICAgICAgICAgICAgICAgOiAvLyBLZWVwIHRoZSBpZHMgdW5pcXVlIGluIHJlZmVyZW5jZSBncm91cHMsIHNpbmNlIHRoZXlcbiAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhY3Jvc3MgdGhlIGZ1bGwgZ3JhcGguXG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgID8gYCR7cmVmZXJlbmNlfS0ke2lkfWBcbiAgICAgICAgICAgICAgICAgIDogaWQgLy8gQSB0ZW1wb3JhcnkgaWQgd2l0aG91dCBhIHJlbGF0ZWQsIGp1c3QgcHJlc2VydmUgaXQuXG4gICAgICAgICAgICAgIHZhbHVlW3JlZktleV0gPSByZXZWYWx1ZVxuICAgICAgICAgICAgICBpZiAocmVmS2V5ICE9PSBpZEtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtpZEtleV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRGl0b01peGluIGZyb20gJy4uL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgVHlwZU1peGluIGZyb20gJy4uL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRVaWQgfSBmcm9tICcuL3VpZC5qcydcbmltcG9ydCB7IFNjaGVtYUdyYXBoIH0gZnJvbSAnLi9TY2hlbWFHcmFwaC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoLCBpc1RlbXBvcmFyeUlkIH0gZnJvbSAnLi9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzU3RyaW5nLFxuICBpc0FycmF5LFxuICBpc0Z1bmN0aW9uLFxuICBpc1Byb21pc2UsXG4gIGlzTW9kdWxlLFxuICBjbG9uZSxcbiAgbWVyZ2UsXG4gIGNhbWVsaXplLFxuICBtYXBDb25jdXJyZW50bHlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IG1hcmtSYXcgfSBmcm9tICd2dWUnXG5cbmNvbnN0IHR5cGVDb21wb25lbnRzID0ge31cbmNvbnN0IHVua25vd25UeXBlUmVwb3J0ZWQgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUeXBlQ29tcG9uZW50KHR5cGUsIGNvbXBvbmVudCkge1xuICB0eXBlQ29tcG9uZW50c1t0eXBlXSA9IGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbXBvbmVudCh0eXBlLCBhbGxvd051bGwgPSBmYWxzZSkge1xuICBjb25zdCBjb21wb25lbnQgPSB0eXBlQ29tcG9uZW50c1t0eXBlXSB8fCBudWxsXG4gIGlmICghY29tcG9uZW50ICYmICFhbGxvd051bGwgJiYgIXVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0pIHtcbiAgICAvLyBSZXBvcnQgZWFjaCBtaXNzaW5nIHR5cGUgb25seSBvbmNlLCB0byBhdm9pZCBmbG9vZGluZyB0aGUgY29uc29sZTpcbiAgICB1bmtub3duVHlwZVJlcG9ydGVkW3R5cGVdID0gdHJ1ZVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBEaXRvIGNvbXBvbmVudCB0eXBlOiAnJHt0eXBlfSdgKVxuICB9XG4gIHJldHVybiBjb21wb25lbnRcbn1cblxuZnVuY3Rpb24gZ2V0U2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYVxuICAgID8gWy4uLk9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMgfHwge30pLCBzY2hlbWFdXG4gICAgOiBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjYWxsYmFjaykge1xuICBpZiAoaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soc2NoZW1hLmNvbXBvbmVudCwgc2NoZW1hLm5hbWUpXG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IGdldFNjaGVtYXMoc2NoZW1hKVxuICAgIGZvciAoY29uc3Qgc2NoZW1hIG9mIHNjaGVtYXMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hLmNvbXBvbmVudHMgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGNhbGxiYWNrKGNvbXBvbmVudCwgbmFtZSlcbiAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIChjb21wb25lbnQsIG5hbWUpID0+IChjYWxsYmFjayhjb21wb25lbnQsIG5hbWUpID8gY29tcG9uZW50IDogdW5kZWZpbmVkKVxuICAgICkgfHwgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb21lU2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIChjb21wb25lbnQsIG5hbWUpID0+IChjYWxsYmFjayhjb21wb25lbnQsIG5hbWUpID8gdHJ1ZSA6IHVuZGVmaW5lZClcbiAgICApID09PVxuICAgIHRydWVcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlcnlTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgKGNvbXBvbmVudCwgbmFtZSkgPT4gKCFjYWxsYmFjayhjb21wb25lbnQsIG5hbWUpID8gZmFsc2UgOiB1bmRlZmluZWQpXG4gICAgKSAhPT1cbiAgICBmYWxzZVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NjaGVtYShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHNjaGVtYSkgJiYgaXNTdHJpbmcoc2NoZW1hLnR5cGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Zvcm0oc2NoZW1hKSB7XG4gIHJldHVybiBpc1NjaGVtYShzY2hlbWEpICYmIHNjaGVtYS50eXBlID09PSAnZm9ybSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlldyhzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd2aWV3J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5uYW1lIHx8IHNjaGVtYS5sYWJlbCB8fCBzY2hlbWEudHlwZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHVud3JhcE1vZHVsZSA9IGZhbHNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBuYW1lID0ga2V5c1swXVxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFbbmFtZV1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIHNjaGVtYS5uYW1lID0gbmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFzKFxuICB1bnJlc29sdmVkU2NoZW1hcyxcbiAgcmVzb2x2ZUl0ZW0gPSByZXNvbHZlU2NoZW1hXG4pIHtcbiAgbGV0IHNjaGVtYXMgPSBpc0Z1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWFzKVxuICAgID8gdW5yZXNvbHZlZFNjaGVtYXMoKVxuICAgIDogdW5yZXNvbHZlZFNjaGVtYXNcbiAgc2NoZW1hcyA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hcywgZmFsc2UpXG4gIGlmIChpc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgLy8gVHJhbnNsYXRlIGFuIGFycmF5IG9mIGR5bmFtaWMgaW1wb3J0LCBlYWNoIGltcG9ydGluZyBvbmUgbmFtZWQgc2NoZW1hXG4gICAgLy8gbW9kdWxlIHRvIGFuIG9iamVjdCB3aXRoIG5hbWVkIGVudHJpZXMuXG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW3NjaGVtYS5uYW1lLCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2NoZW1hcykpIHtcbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgYXN5bmMgKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBzY2hlbWFzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGFuZWxzKHNjaGVtYSkge1xuICBjb25zdCB7IHBhbmVscyB9ID0gc2NoZW1hXG4gIGlmIChwYW5lbHMpIHtcbiAgICBzY2hlbWEucGFuZWxzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMocGFuZWxzKVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSkge1xuICAvLyBSZXNvbHZlcyBhc3luYyBzY2hlbWEgY29tcG9uZW50cyBhbmQgYWRkcyBEaXRvTWl4aW4gYW5kIFR5cGVNaXhpbiB0byB0aGVtLlxuICBsZXQgeyBjb21wb25lbnQgfSA9IHNjaGVtYVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShjb21wb25lbnQsIHRydWUpXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gUHJldmVudCB3YXJuaW5nOiBcIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlXG4gICAgICAvLyBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGRcbiAgICAgIC8vIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgXCI6XG4gICAgICBzY2hlbWEuY29tcG9uZW50ID0gbWFya1Jhdyh7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgbWl4aW5zOiBbRGl0b01peGluLCBUeXBlTWl4aW4sIC4uLihjb21wb25lbnQubWl4aW5zIHx8IFtdKV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzKSB7XG4gIC8vIGBzY2hlbWFzYCBhcmUgb2YgdGhlIHNhbWUgcG9zc2libGUgZm9ybXMgYXMgcGFzc2VkIHRvIGBnZXROYW1lZFNjaGVtYXMoKWBcbiAgYXdhaXQgbWFwQ29uY3VycmVudGx5KE9iamVjdC52YWx1ZXMoc2NoZW1hcyB8fCB7fSksIHJlc29sdmVTY2hlbWFDb21wb25lbnQpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhjb21wb25lbnQsIGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYShhcGksIHNjaGVtYSwgbmFtZSlcbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICBhd2FpdCByZXNvbHZlUGFuZWxzKHNjaGVtYSlcbiAgY29uc3QgY2hpbGRyZW4gPSBbXVxuICBpZiAoaXNWaWV3KHNjaGVtYSkpIHtcbiAgICBpZiAoaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkpIHtcbiAgICAgIGF3YWl0IHByb2Nlc3NDb21wb25lbnQoYXBpLCBzY2hlbWEuY29tcG9uZW50LCBuYW1lLCBjaGlsZHJlbiwgMClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSBtdWx0aS1jb21wb25lbnQgdmlldywgc3RhcnQgYXQgbGV2ZWwgMVxuICAgICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIGNoaWxkcmVuLCAxKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmlldyBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAvJHtzY2hlbWEucGF0aH1gLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudCxcbiAgICBtZXRhOiB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDb21wb25lbnQoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICAvLyBEZWxlZ2F0ZSBzY2hlbWEgcHJvY2Vzc2luZyB0byB0aGUgYWN0dWFsIHR5cGUgY29tcG9uZW50cy5cbiAgYXdhaXQgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8ucHJvY2Vzc1NjaGVtYT8uKFxuICAgIGFwaSxcbiAgICBzY2hlbWEsXG4gICAgbmFtZSxcbiAgICByb3V0ZXMsXG4gICAgbGV2ZWxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKSB7XG4gIGxldCBkZWZhdWx0cyA9IGFwaS5kZWZhdWx0c1tzY2hlbWEudHlwZV1cbiAgaWYgKGRlZmF1bHRzKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oZGVmYXVsdHMpKSB7XG4gICAgICBkZWZhdWx0cyA9IGRlZmF1bHRzKHNjaGVtYSlcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGRlZmF1bHRzKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdHMpKSB7XG4gICAgICAgIGlmIChzY2hlbWFba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2NoZW1hW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gbWVyZ2UodmFsdWUsIHNjaGVtYVtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpIHtcbiAgLy8gVXNlZCBmb3IgdmlldyBhbmQgc291cmNlIHNjaGVtYXMsIHNlZSBTb3VyY2VNaXhpbi5cbiAgc2NoZW1hLm5hbWUgPSBuYW1lXG4gIHNjaGVtYS5wYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aChuYW1lKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIHJvdXRlcywgbGV2ZWwpIHtcbiAgY29uc3QgcHJvbWlzZXMgPSBbXVxuICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWEsIChjb21wb25lbnQsIG5hbWUpID0+IHtcbiAgICBwcm9taXNlcy5wdXNoKHByb2Nlc3NDb21wb25lbnQoYXBpLCBjb21wb25lbnQsIG5hbWUsIHJvdXRlcywgbGV2ZWwpKVxuICB9KVxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGb3JtcyhhcGksIHNjaGVtYSwgbGV2ZWwpIHtcbiAgY29uc3QgcHJvY2Vzc0Zvcm0gPSBhc3luYyBmb3JtID0+IHtcbiAgICBmb3JtID0gYXdhaXQgcmVzb2x2ZUZvcm0oZm9ybSlcbiAgICBwcm9jZXNzRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gICAgcmV0dXJuIGZvcm1cbiAgfVxuXG4gIC8vIEZpcnN0IHJlc29sdmUgdGhlIGZvcm1zIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBiYWNrIG9uIHRoZSBzY2hlbWEuXG4gIGxldCB7IGZvcm0sIGZvcm1zLCBjb21wb25lbnRzIH0gPSBzY2hlbWFcbiAgaWYgKGZvcm1zKSB7XG4gICAgZm9ybXMgPSBzY2hlbWEuZm9ybXMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhmb3JtcywgcHJvY2Vzc0Zvcm0pXG4gIH0gZWxzZSBpZiAoZm9ybSkge1xuICAgIGZvcm0gPSBzY2hlbWEuZm9ybSA9IGF3YWl0IHByb2Nlc3NGb3JtKGZvcm0pXG4gIH0gZWxzZSBpZiAoY29tcG9uZW50cykge1xuICAgIC8vIE5PVEU6IFByb2Nlc3NpbmcgZm9ybXMgaW4gY29tcHV0ZWQgY29tcG9uZW50cyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBpdFxuICAgIC8vIG9ubHkgY2FuIGJlIGNvbXB1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggYWN0dWFsIGRhdGEuXG4gICAgaWYgKGlzT2JqZWN0KGNvbXBvbmVudHMpKSB7XG4gICAgICBmb3JtID0geyBjb21wb25lbnRzIH1cbiAgICB9XG4gIH1cblxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH0gLy8gT25seSB1c2VkIGZvciBwcm9jZXNzIGxvb3AgYmVsb3cuXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgZm9yIChjb25zdCBmb3JtIG9mIE9iamVjdC52YWx1ZXMoZm9ybXMpKSB7XG4gICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBmb3JtLCBjaGlsZHJlbiwgbGV2ZWwgKyAxKVxuICB9XG4gIHJldHVybiBjaGlsZHJlblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZvcm0oc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzRm9ybShzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm0gc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgYXdhaXQgcmVzb2x2ZVBhbmVscyhzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgYm90aCBzaW5nbGUgZm9ybSBhbmQgbXVsdGlwbGUgZm9ybXMgbm90YXRpb24sIGFzIHdlbGwgYXMgaW5saW5lZFxuICAvLyBjb21wb25lbnRzLlxuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBpc09iamVjdChzY2hlbWEuZm9ybSB8fCBzY2hlbWEuZm9ybXMgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc011bHRpcGxlRm9ybVNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgaXNTY2hlbWEoc2NoZW1hKSAmJlxuICAgIE9iamVjdC5rZXlzKHNjaGVtYT8uZm9ybXMgfHwge30pLmxlbmd0aCA+IDFcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzVmlldyhzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmNvbXBvbmVudClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdmlldyB9ID0gc2NoZW1hXG4gIGNvbnN0IHZpZXdTY2hlbWEgPSB2aWV3ICYmIGNvbnRleHQudmlld3Nbdmlld11cbiAgcmV0dXJuIHZpZXdTY2hlbWFcbiAgICA/IC8vIE5PVEU6IFZpZXdzIGNhbiBoYXZlIHRhYnMsIGluIHdoaWNoIGNhc2UgdGhlIHZpZXcgY29tcG9uZW50IGlzIG5lc3RlZFxuICAgICAgLy8gaW4gb25lIG9mIHRoZSB0YWJzLCBnbyBmaW5kIGl0LlxuICAgICAgaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHModmlld1NjaGVtYSwgc2NoZW1hID0+IHtcbiAgICAgICAgaWYgKGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgICAgfVxuICAgICAgfSkgfHwgbnVsbFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld1NjaGVtYShzY2hlbWEsIGNvbnRleHQpIHtcbiAgcmV0dXJuIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgICA/IGNvbnRleHQudmlld3Nbc2NoZW1hLnZpZXddXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3RWRpdFBhdGgoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHZpZXcgPSBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgcmV0dXJuIHZpZXdcbiAgICA/IGlzU2luZ2xlQ29tcG9uZW50Vmlldyh2aWV3KVxuICAgICAgPyBgLyR7dmlldy5wYXRofWBcbiAgICAgIDogYC8ke3ZpZXcucGF0aH0vJHt2aWV3LnBhdGh9YFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybVNjaGVtYXMoc2NoZW1hLCBjb250ZXh0LCBtb2RpZnlGb3JtKSB7XG4gIGNvbnN0IHZpZXdTY2hlbWEgPSBnZXRWaWV3Rm9ybVNjaGVtYShzY2hlbWEsIGNvbnRleHQpXG4gIGlmICh2aWV3U2NoZW1hKSB7XG4gICAgc2NoZW1hID0gdmlld1NjaGVtYVxuICB9IGVsc2UgaWYgKHNjaGVtYS52aWV3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHZpZXc6ICcke3NjaGVtYS52aWV3fSdgKVxuICB9XG5cbiAgbGV0IHsgZm9ybSwgZm9ybXMsIGNvbXBvbmVudHMsIGNvbXBhY3QgfSA9IHNjaGVtYVxuICBpZiAoIWZvcm0gJiYgIWZvcm1zKSB7XG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIC8vIENvbnZlcnQgaW5saW5lZCBjb21wb25lbnRzIHRvIGZvcm1zLCBzdXBwb3J0aW5nIGBjb21wYWN0YCBzZXR0aW5nLlxuICAgICAgZm9ybSA9IHsgY29tcG9uZW50cywgY29tcGFjdCB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGBmb3Jtc2AsIGBmb3JtYCBvciBgY29tcG9uZW50c2AsIHJldHVybiBhbmQgZW1wdHkgYGZvcm1zYCBvYmplY3QuXG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cbiAgZm9ybXMgfHw9IHsgZGVmYXVsdDogZm9ybSB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZm9ybXMpLm1hcCgoW3R5cGUsIGZvcm1dKSA9PiB7XG4gICAgICAvLyBTdXBwb3J0IGBzY2hlbWEuY29tcG9uZW50c2AgY2FsbGJhY2tzIHRvIGNyZWF0ZSBjb21wb25lbnRzIG9uIHRoZSBmbHkuXG4gICAgICBpZiAoaXNGdW5jdGlvbihmb3JtLmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGZvcm0gPSB7XG4gICAgICAgICAgLi4uZm9ybSxcbiAgICAgICAgICBjb21wb25lbnRzOiBmb3JtLmNvbXBvbmVudHMoY29udGV4dClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFt0eXBlLCBtb2RpZnlGb3JtPy4oZm9ybSkgPz8gZm9ybV1cbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3Jtcyhmb3JtcywgaXRlbSkge1xuICByZXR1cm4gZm9ybXNbaXRlbT8udHlwZV0gfHwgZm9ybXMuZGVmYXVsdCB8fCBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zKGdldEZvcm1TY2hlbWFzKHNjaGVtYSwgY29udGV4dCksIGl0ZW0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNMYWJlbChzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5sYWJlbCAhPT0gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGFjdChzY2hlbWEpIHtcbiAgcmV0dXJuICEhc2NoZW1hLmNvbXBhY3Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5saW5lZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5pbmxpbmVkIHx8IHNjaGVtYS5jb21wb25lbnRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWQoc2NoZW1hKSB7XG4gIHJldHVybiAhIShzY2hlbWEubmVzdGVkIHx8IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmRlZmF1bHROZXN0ZWQgPT09IHRydWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRPbWl0UGFkZGluZyhzY2hlbWEpIHtcbiAgcmV0dXJuICEhZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8ub21pdFBhZGRpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShzY2hlbWEpIHtcbiAgLy8gU3VwcG9ydCBkZWZhdWx0IHZhbHVlcyBib3RoIG9uIHNjaGVtYSBhbmQgb24gY29tcG9uZW50IGxldmVsLlxuICAvLyBOT1RFOiBBdCB0aGUgdGltZSBvZiBjcmVhdGlvbiwgY29tcG9uZW50cyBtYXkgbm90IGJlIGluc3RhbnRpYXRlZCwgKGUuZy4gaWZcbiAgLy8gZW50cmllcyBhcmUgY3JlYXRlZCB0aHJvdWdoIG5lc3RlZCBmb3JtcywgdGhlIHBhcmVudCBmb3JtIGlzbid0IG1vdW50ZWQpIHNvXG4gIC8vIHdlIGNhbid0IHVzZSBgZGF0YVBhdGhgIHRvIGdldCB0byBjb21wb25lbnRzLCBhbmQgdGhlIGBkZWZhdWx0VmFsdWVgIGZyb21cbiAgLy8gdGhlcmUuIFRoYXQncyB3aHkgYGRlZmF1bHRWYWx1ZWAgaXMgZGVmaW5lZCBzdGF0aWNhbGx5IGluIHRoZSBjb21wb25lbnRzOlxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBzY2hlbWEuZGVmYXVsdFxuICBjb25zdCB2YWx1ZSA9XG4gICAgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVmYXVsdFZhbHVlXG4gICAgICA6IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmRlZmF1bHRWYWx1ZVxuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSlcbiAgICA/IHZhbHVlKHNjaGVtYSlcbiAgICA6IGNsb25lKHZhbHVlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlTWlzc2luZ1ZhbHVlKHNjaGVtYSkge1xuICBjb25zdCB0eXBlT3B0aW9ucyA9IGdldFR5cGVPcHRpb25zKHNjaGVtYSlcbiAgcmV0dXJuICEhKFxuICAgIHR5cGVPcHRpb25zPy5leGNsdWRlVmFsdWUgfHwgdHlwZU9wdGlvbnM/Lmlnbm9yZU1pc3NpbmdWYWx1ZT8uKHNjaGVtYSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGFiZWxzKHNjaGVtYSkge1xuICBjb25zdCBjaGVja0NvbXBvbmVudHMgPSBjb21wb25lbnRzID0+XG4gICAgT2JqZWN0LnZhbHVlcyhjb21wb25lbnRzIHx8IHt9KS5zb21lKGhhc0xhYmVsKVxuXG4gIHJldHVybiAoXG4gICAgY2hlY2tDb21wb25lbnRzKHNjaGVtYS5jb21wb25lbnRzKSB8fFxuICAgIE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMgfHwge30pLnNvbWUoY2hlY2tDb21wb25lbnRzKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0VmFsdWVzKHNjaGVtYSwgZGF0YSA9IHt9LCBjb21wb25lbnQpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgY29tcG9uZW50LCByb290RGF0YTogZGF0YSB9XG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUpID0+IHtcbiAgICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgICAgZGF0YVtuYW1lXSA9IGdldERlZmF1bHRWYWx1ZShzY2hlbWEpXG4gICAgfVxuICB9XG5cbiAgLy8gU2V0cyB1cCBhIGRhdGEgb2JqZWN0IHRoYXQgaGFzIGtleXMgd2l0aCBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsXG4gIC8vIGZvcm0gZmllbGRzLCBzbyB0aGV5IGNhbiBiZSBjb3JyZWN0bHkgd2F0Y2hlZCBmb3IgY2hhbmdlcy5cbiAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgIHNjaGVtYSxcbiAgICBkYXRhLFxuICAgIG51bGwsXG4gICAgbnVsbCxcbiAgICBwcm9jZXNzQmVmb3JlLFxuICAgIG51bGwsXG4gICAgb3B0aW9uc1xuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVmFsdWUoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwge1xuICBjb21wb25lbnQgPSBudWxsLFxuICByb290RGF0YSA9IGNvbXBvbmVudD8ucm9vdERhdGFcbn0gPSB7fSkge1xuICBjb25zdCB7IGNvbXB1dGUgfSA9IHNjaGVtYVxuICBpZiAoY29tcHV0ZSkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcHV0ZShcbiAgICAgIERpdG9Db250ZXh0LmdldChjb21wb25lbnQsIHtcbiAgICAgICAgLy8gT3ZlcnJpZGUgdmFsdWUgdG8gcHJldmVudCBlbmRsZXNzIHJlY3Vyc2lvbiB0aHJvdWdoIGNhbGxpbmcgdGhlXG4gICAgICAgIC8vIGdldHRlciBmb3IgYHRoaXMudmFsdWVgIGluIGBEaXRvQ29udGV4dGA6XG4gICAgICAgIHZhbHVlOiBkYXRhW25hbWVdLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGFcbiAgICAgIH0pXG4gICAgKVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBY2Nlc3MgYGRhdGFbbmFtZV1gIGRpcmVjdGx5IGluc3RlYWQgb2YgYHRoaXMudmFsdWUgPSDigKZgIHRvIHVwZGF0ZSB0aGVcbiAgICAgIC8vIHZhbHVlIHdpdGhvdXQgY2FsbGluZyBwYXJzZSgpOlxuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgfVxuICB9XG4gIC8vIElmIHRoZSB2YWx1ZSBpcyBzdGlsbCBtaXNzaW5nIGFmdGVyIGNvbXB1dGUsIHNldCB0aGUgZGVmYXVsdCBmb3IgaXQ6XG4gIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIWlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpKSB7XG4gICAgZGF0YVtuYW1lXSA9IGdldERlZmF1bHRWYWx1ZShzY2hlbWEpXG4gIH1cbiAgLy8gTm93IGFjY2VzcyB0aGUgdmFsdWUuIFRoaXMgaXMgaW1wb3J0YW50IGZvciByZWFjdGl2aXR5IGFuZCBuZWVkcyB0b1xuICAvLyBoYXBwZW4gYWZ0ZXIgYWxsIHByaW9yIG1hbmlwdWxhdGlvbiBvZiBgZGF0YVtuYW1lXWAsIHNlZSBhYm92ZTpcbiAgcmV0dXJuIGRhdGFbbmFtZV1cbn1cblxuZnVuY3Rpb24gY2xvbmVJdGVtKHNvdXJjZVNjaGVtYSwgaXRlbSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucy5zY2hlbWFPbmx5KSB7XG4gICAgY29uc3QgY29weSA9IHt9XG4gICAgY29uc3QgeyBpZEtleSA9ICdpZCcsIG9yZGVyS2V5IH0gPSBzb3VyY2VTY2hlbWFcbiAgICBjb25zdCBpZCA9IGl0ZW1baWRLZXldXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvcHlbaWRLZXldID0gaWRcbiAgICB9XG4gICAgLy8gQ29weSBvdmVyIHR5cGUgaW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgZm9ybXMgdG8gY2hvb3NlIGZyb20uXG4gICAgaWYgKGhhc011bHRpcGxlRm9ybVNjaGVtYXMoc291cmNlU2NoZW1hKSkge1xuICAgICAgY29weS50eXBlID0gaXRlbS50eXBlXG4gICAgfVxuICAgIGlmIChvcmRlcktleSkge1xuICAgICAgY29weVtvcmRlcktleV0gPSBpdGVtW29yZGVyS2V5XVxuICAgIH1cbiAgICByZXR1cm4gY29weVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLml0ZW0gfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRGF0YShzY2hlbWEsIHNvdXJjZVNjaGVtYSwgZGF0YSwgZGF0YVBhdGgsIHtcbiAgY29tcG9uZW50LFxuICBzY2hlbWFPbmx5LCAvLyB3aGV0aGVyIHRvIG9ubHkgaW5jbHVkZSBkYXRhIGNvdmVyZWQgYnkgdGhlIHNjaGVtYSwgb3IgYWxsIGRhdGFcbiAgdGFyZ2V0XG59ID0ge30pIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHsgY29tcG9uZW50LCBzY2hlbWFPbmx5LCB0YXJnZXQsIHJvb3REYXRhOiBkYXRhIH1cbiAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGRhdGEsIG9wdGlvbnMpXG4gIGNvbnN0IGdyYXBoID0gbmV3IFNjaGVtYUdyYXBoKClcblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIHByb2Nlc3NlZERhdGEpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBjb21wdXRlVmFsdWUoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgb3B0aW9ucylcbiAgICAvLyBUaGUgc2NoZW1hIGV4cGVjdHMgdGhlIGB3cmFwUHJpbWl0aXZlc2AgdHJhbnNmb3JtYXRpb25zIHRvIGJlIHByZXNlbnQgb25cbiAgICAvLyB0aGUgZGF0YSB0aGF0IGl0IGlzIGFwcGxpZWQgb24sIHNvIHdhcnAgYmVmb3JlIGFuZCB1bndyYXAgYWZ0ZXIuXG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzLCBvcmRlcktleSwgaWRLZXkgPSAnaWQnIH0gPSBzY2hlbWFcbiAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICAgIFt3cmFwUHJpbWl0aXZlc106IGVudHJ5XG4gICAgICAgIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWx3YXlzIHNoYWxsb3ctY2xvbmUgYXJyYXkgdmFsdWVzOlxuICAgICAgICB2YWx1ZSA9IFsuLi52YWx1ZV1cbiAgICAgIH1cbiAgICAgIGlmIChvcmRlcktleSAmJiB0YXJnZXQgPT09ICdjbGlwYm9hcmQnKSB7XG4gICAgICAgIC8vIFNvcnQgdGhlIGRhdGEgYmFjayBpbnRvIHRoZSBuYXR1cmFsIHNlcXVlbmNlIGFzIGRlZmluZWQgYnkgdGhlaXIgaWRzLFxuICAgICAgICAvLyBzbyBjb3B5LXBhc3RpbmcgYmV0d2VlbiBzZXJ2ZXJzIChlLmcuIG5lc3RlZCBmb250LWN1dHMgb24gTGluZXRvKVxuICAgICAgICAvLyBuYXR1cmFsbHkgZ2V0cyBtYXBwZWQgdG8gdGhlIHNhbWUgZW50cmllcyBpbiB0aGUgZ3JhcGguXG4gICAgICAgIHZhbHVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBpZDEgPSBhPy5baWRLZXldXG4gICAgICAgICAgY29uc3QgaWQyID0gYj8uW2lkS2V5XVxuICAgICAgICAgIHJldHVybiBpZDEgPT0gbnVsbCB8fCBpc1RlbXBvcmFyeUlkKGlkMSlcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiBpZDIgPT0gbnVsbCB8fCBpc1RlbXBvcmFyeUlkKGlkMilcbiAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICA6IGlkMSAtIGlkMlxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IHByb2Nlc3NBZnRlciA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBwcm9jZXNzZWREYXRhKSA9PiB7XG4gICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcywgZXhjbHVkZSwgcHJvY2VzcyB9ID0gc2NoZW1hXG4gICAgbGV0IHZhbHVlID0gcHJvY2Vzc2VkRGF0YVtuYW1lXVxuXG4gICAgY29uc3QgdHlwZU9wdGlvbnMgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpXG5cbiAgICAvLyBOT1RFOiBXZSBkb24ndCBjYWNoZSB0aGlzIGNvbnRleHQsIHNpbmNlIGB2YWx1ZWAgaXMgY2hhbmdpbmcuXG4gICAgY29uc3QgZ2V0Q29udGV4dCA9ICgpID0+XG4gICAgICBEaXRvQ29udGV4dC5nZXQoY29tcG9uZW50LCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGEsXG4gICAgICAgIC8vIFBhc3MgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgdG8gYHByb2Nlc3MoKWAsIHNvIGl0IGNhbiBiZSBtb2RpZmllZFxuICAgICAgICAvLyB0aHJvdWdoIGBwcm9jZXNzZWRJdGVtYCBmcm9tIHRoZXJlLlxuICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICB9KVxuXG4gICAgLy8gRmlyc3QgdW53cmFwIHRoZSB3cmFwcGVkIHByaW1pdGl2ZXMgYWdhaW4sIHRvIGJyaW5nIHRoZSBkYXRhIGJhY2sgaW50b1xuICAgIC8vIGl0cyBuYXRpdmUgZm9ybS4gU2UgYHByb2Nlc3NCZWZvcmUoKWAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBpZiAod3JhcFByaW1pdGl2ZXMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKG9iamVjdCA9PiBvYmplY3Rbd3JhcFByaW1pdGl2ZXNdKVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdXNlcidzIGBwcm9jZXNzKClgIGNhbGxiYWNrIGZpcnN0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KCkpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fFxuICAgICAgLy8gU3VwcG9ydCBmdW5jdGlvbnMgbmV4dCB0byBib29sZWFucyBmb3IgYHNjaGVtYS5leGNsdWRlYDpcbiAgICAgIGV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgIGlzRnVuY3Rpb24oZXhjbHVkZSkgJiYgZXhjbHVkZShnZXRDb250ZXh0KCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzc2VkRGF0YVtuYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgICAvLyB0byBjb252ZXJ0IHRoZSBkYXRhIGZvciBzdG9yYWdlLlxuICAgICAgY29uc3QgcHJvY2Vzc1ZhbHVlID0gdHlwZU9wdGlvbnM/LnByb2Nlc3NWYWx1ZVxuICAgICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpXG4gICAgICB9XG4gICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICBzY2hlbWEsXG4gICAgZGF0YSxcbiAgICBkYXRhUGF0aCxcbiAgICBwcm9jZXNzZWREYXRhLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgcHJvY2Vzc0FmdGVyLFxuICAgIG9wdGlvbnNcbiAgKVxuXG4gIHJldHVybiBncmFwaC5wcm9jZXNzKHNvdXJjZVNjaGVtYSwgcHJvY2Vzc2VkRGF0YSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEYXRhKFxuICBzY2hlbWEsXG4gIGRhdGEsXG4gIGRhdGFQYXRoLFxuICBwcm9jZXNzZWREYXRhLFxuICBwcm9jZXNzQmVmb3JlLFxuICBwcm9jZXNzQWZ0ZXIsXG4gIG9wdGlvbnNcbikge1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT4ge1xuICAgIGNvbnN0IGdldERhdGFQYXRoID0gKGRhdGFQYXRoLCB0b2tlbikgPT5cbiAgICAgIGRhdGFQYXRoICE9IG51bGxcbiAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pXG4gICAgICAgIDogbnVsbFxuXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZChjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIHVubmVzdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RGF0YVBhdGggPSBnZXREYXRhUGF0aChkYXRhUGF0aCwgbmFtZSlcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NJdGVtID0gKGl0ZW0sIGluZGV4ID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPVxuICAgICAgICAgICAgICBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZ2V0RGF0YVBhdGgoY29tcG9uZW50RGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgICAgIDogY29tcG9uZW50RGF0YVBhdGhcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBnZXRGb3JtcyA9IChcbiAgICAgICAgICAgICAgZ2V0VHlwZU9wdGlvbnMoY29tcG9uZW50U2NoZW1hKT8uZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nIHx8XG4gICAgICAgICAgICAgIGdldEZvcm1TY2hlbWFzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBmb3JtcyA9IGdldEZvcm1zKGNvbXBvbmVudFNjaGVtYSwgY29udGV4dClcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3Jtcyhmb3JtcywgaXRlbSlcbiAgICAgICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZEl0ZW0gPSBwcm9jZXNzZWREYXRhXG4gICAgICAgICAgICAgICAgPyBjbG9uZUl0ZW0oY29tcG9uZW50U2NoZW1hLCBpdGVtLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEl0ZW0sXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzQWZ0ZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJdGVtcyB3aXRob3V0IGZvcm1zIHN0aWxsIGdldCBmdWxseSAoYnV0IHNoYWxsb3dseSkgY2xvbmVkLlxuICAgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBvZiB0aGlzIGlzIGFjdHVhbGx5IG5lZWRlZCAvIHVzZWQgYXQgYWxsP1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwcm9jZXNzQmVmb3JlPy4oXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNvbXBvbmVudERhdGFQYXRoLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgIClcbiAgICAgICAgICBsZXQgdmFsdWUgPSBwcm9jZXNzZWREYXRhID8gcHJvY2Vzc2VkRGF0YVtuYW1lXSA6IGRhdGFbbmFtZV1cbiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBoYXNGb3JtU2NoZW1hKGNvbXBvbmVudFNjaGVtYSkpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgZGF0YSBvbiBuZXN0ZWQgZm9ybSBpdGVtcy5cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IE5vIG5lZWQgdG8gY29sbGVjdCB2YWx1ZXMgaWYgd2UncmUgbm90IGNsb25pbmchXG4gICAgICAgICAgICAgIHZhbHVlID0gcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgICAgICAgID8gdmFsdWUubWFwKHByb2Nlc3NJdGVtKVxuICAgICAgICAgICAgICAgIDogdmFsdWUuZm9yRWFjaChwcm9jZXNzSXRlbSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gcHJvY2Vzc0l0ZW0odmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvY2Vzc2VkRGF0YSkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzc0FmdGVyPy4oXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGNvbXBvbmVudERhdGFQYXRoLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NDb21wb25lbnRzKHNjaGVtYS5jb21wb25lbnRzKVxuICBpZiAoc2NoZW1hLnRhYnMpIHtcbiAgICBmb3IgKGNvbnN0IHRhYiBvZiBPYmplY3QudmFsdWVzKHNjaGVtYS50YWJzKSkge1xuICAgICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgcGFuZWwgb2YgZ2V0QWxsUGFuZWxTY2hlbWFzKHNjaGVtYSwgZGF0YVBhdGgpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHMocGFuZWwuc2NoZW1hLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbFNjaGVtYShzY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQpIHtcbiAgcmV0dXJuIHNjaGVtYVxuICAgID8ge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC8vIElmIHRoZSBwYW5lbCBwcm92aWRlcyBpdHMgb3duIG5hbWUsIGFwcGVuZCBpdCB0byB0aGUgZGF0YVBhdGguXG4gICAgICAgIC8vIFRoaXMgaXMgdXNlZCBlLmcuIGZvciAkZmlsdGVycyBwYW5lbHMuXG4gICAgICAgIGRhdGFQYXRoOiBzY2hlbWEubmFtZVxuICAgICAgICAgID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHNjaGVtYS5uYW1lKVxuICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxTY2hlbWFzKHNjaGVtYXMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVscyA9IFtdKSB7XG4gIGlmIChzY2hlbWFzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYXMpKSB7XG4gICAgICBjb25zdCBwYW5lbCA9IGdldFBhbmVsU2NoZW1hKFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBrZXkpLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbHMucHVzaChwYW5lbClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUGFuZWxTY2hlbWFzKFxuICBzY2hlbWEsXG4gIGRhdGFQYXRoLFxuICBzY2hlbWFDb21wb25lbnQgPSBudWxsLFxuICB0YWJDb21wb25lbnQgPSBudWxsXG4pIHtcbiAgY29uc3QgcGFuZWwgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5nZXRQYW5lbFNjaGVtYT8uKFxuICAgIHNjaGVtYSxcbiAgICBkYXRhUGF0aCxcbiAgICBzY2hlbWFDb21wb25lbnRcbiAgKVxuICBjb25zdCBwYW5lbHMgPSBwYW5lbCA/IFtnZXRQYW5lbFNjaGVtYShwYW5lbCwgZGF0YVBhdGgsIHRhYkNvbXBvbmVudCldIDogW11cbiAgLy8gQWxsb3cgZWFjaCBjb21wb25lbnQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiBwYW5lbHMsIGluXG4gIC8vIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IG9uZSAoZS5nLiAkZmlsdGVyKTpcbiAgZ2V0UGFuZWxTY2hlbWFzKHNjaGVtYS5wYW5lbHMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVscylcbiAgcmV0dXJuIHBhbmVsc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdvYmplY3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdsaXN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICBjb25zdCBpZCA9IGl0ZW1bc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgLy8gVHJ5IHRvIHVzZSB0aGUgaXRlbSBpZCBhcyB0aGUgdWlkLCBmYWxsaW5nIGJhY2sgb24gYXV0by1nZW5lcmF0ZWQgaWRzLCBidXRcbiAgLy8gZWl0aGVyIHdheSwgcGFzcyB0aHJvdWdoIGBnZXRVaWQoKWAgc28gdGhhdCB0aGUgaWRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGl0ZW0gdGhyb3VnaCBhIHdlYWsgbWFwLCBhcyB0aGUgaWRzIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaW4gYHByb2Nlc3NEYXRhKClgXG4gIC8vIHdoaWxlIHRoZSBjb21wb25lbnRzIHRoYXQgdXNlIHRoZSB1aWRzIGFzIGtleSBhcmUgc3RpbGwgdmlzaWJsZS5cbiAgcmV0dXJuIGdldFVpZChpdGVtLCBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSlcbn1cbiIsIi8vIEEgbWluaS1yZXBsaWNhdGlvbiBvZiB2dWUncyBpbnRlcm5hbCBgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoKWAgYnV0IG9ubHlcbi8vIGhhbmRsaW5nIG91ciBvd24gYWRkZWQgb3B0aW9ucyBwcm9wZXJ0aWVzIGFuZCBtZXJnaW5nIHRoZW0gZWFybHkgaW5zdGVhZFxuLy8gb2YgbGF6aWx5LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMob3B0aW9ucykge1xuICBjb25zdCB7IG1peGlucyB9ID0gb3B0aW9uc1xuICByZXR1cm4gbWl4aW5zIHx8IG9wdGlvbnMuZXh0ZW5kc1xuICAgID8gbWVyZ2VPcHRpb25zKFxuICAgICAgICB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIDogb3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmIChmcm9tLmV4dGVuZHMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGZyb20uZXh0ZW5kcylcbiAgfVxuICBpZiAoZnJvbS5taXhpbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1peGluIG9mIGZyb20ubWl4aW5zKSB7XG4gICAgICBtZXJnZU9wdGlvbnModG8sIG1peGluKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBkaXRvT3B0aW9uS2V5cykge1xuICAgIGlmIChrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuY29uc3QgZGl0b09wdGlvbktleXMgPSBbXG4gICdkZWZhdWx0VmFsdWUnLFxuICAnZGVmYXVsdE5lc3RlZCcsXG4gICdkZWZhdWx0VmlzaWJsZScsXG4gICdnZW5lcmF0ZUxhYmVsJyxcbiAgJ2V4Y2x1ZGVWYWx1ZScsXG4gICdpZ25vcmVNaXNzaW5nVmFsdWUnLFxuICAnb21pdFBhZGRpbmcnLFxuICAncHJvY2Vzc1ZhbHVlJyxcbiAgJ3Byb2Nlc3NTY2hlbWEnLFxuICAnZ2V0UGFuZWxTY2hlbWEnLFxuICAnZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nJyxcbiAgLy8gVnVlIDMgLyBWdWUtcm91dGVyIDQgZm9yZ2V0cyB0aGVzZS5cbiAgLy8gVE9ETzogQ3JlYXRlIGJ1Zy1yZXBvcnQ/XG4gICdiZWZvcmVSb3V0ZVVwZGF0ZScsXG4gICdiZWZvcmVSb3V0ZUxlYXZlJ1xuXVxuIiwiaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlTWVyZ2VkT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvb3B0aW9ucy5qcydcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCBjb21wb25lbnRzID0ge31cblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGl0b01peGluXSxcbiAgLy8gTWFrZSBzdXJlIHRoYXQgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFyZSBwcmVzZW50IGluIGFsbCBEaXRvQ29tcG9uZW50LlxuICBjb21wb25lbnRzLFxuXG4gIGNvbXBvbmVudChuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgIGRlZmluaXRpb24gPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyh7XG4gICAgICAgICAgZXh0ZW5kczogdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIC4uLmRlZmluaXRpb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICAgIGlmICghKG5hbWUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIG5vdCByZWdpc3RlcmVkYClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VHlwZUNvbXBvbmVudFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvVXNlciB7XG4gIGhhc1JvbGUoLi4ucm9sZXMpIHtcbiAgICBpZiAodGhpcy5yb2xlcykge1xuICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFDb21wb25lbnRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1haW5TY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzWzBdXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYERpdG9TY2hlbWEuY3JlYXRlZCgpL3VubW91bnRlZCgpYCBvbiBpdHNcbiAgICAvLyBgJHNjaGVtYVBhcmVudENvbXBvbmVudGAsIGlmIHRoZSBwYXJlbnQgdXNlcyB0aGUgYFNjaGVtYVBhcmVudE1peGluYDpcbiAgICBfcmVnaXN0ZXJTY2hlbWFDb21wb25lbnQoc2NoZW1hQ29tcG9uZW50LCBhZGQpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBzY2hlbWFDb21wb25lbnRzLnB1c2goc2NoZW1hQ29tcG9uZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5zcGxpY2Uoc2NoZW1hQ29tcG9uZW50cy5pbmRleE9mKHNjaGVtYUNvbXBvbmVudCksIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2NoZW1hUGFyZW50TWl4aW4gZnJvbSAnLi9TY2hlbWFQYXJlbnRNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQsIHsgZXJyb3JzIH0pID0+XG4gICAgICAgICAgZXJyb3JzICYmIHJlc3VsdCA/IHJlc3VsdC5jb25jYXQoZXJyb3JzKSA6IGVycm9ycyxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChcbiAgICAgICAgaXQgPT4gaXQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cylcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRDb21tb25QcmVmaXggfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBFYWNoIHJvdXRlLWNvbXBvbmVudCBkZWZpbmVzIGEgc3RvcmUgdGhhdCBnZXRzIHBhc3NlZCBvbiB0byBpdHNcbiAgICAgIC8vIGNoaWxkIGNvbXBvbmVudHMsIHNvIHRoZXkgY2FuIHN0b3JlIHZhbHVlcyBpbiB0aGVtIHRoYXQgbGl2ZSBiZXlvbmRcbiAgICAgIC8vIHRoZWlyIGxpZmUtY3ljbGUuIFNlZTogRGl0b1BhbmUsIFNvdXJjZU1peGluXG4gICAgICBzdG9yZToge30sXG4gICAgICBsb2FkQ2FjaGU6IHt9IC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyByb3V0ZUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcm91dGVMZXZlbCgpIHtcbiAgICAgIGxldCBsZXZlbCA9IDBcbiAgICAgIGxldCByb3V0ZUNvbXBvbmVudCA9IHRoaXNcbiAgICAgIHdoaWxlICgocm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudC5wYXJlbnRDb21wb25lbnQucm91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQubWV0YVxuICAgIH0sXG5cbiAgICBwYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVQYXRoKHRoaXMucm91dGVSZWNvcmQucGF0aClcbiAgICB9LFxuXG4gICAgbGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYigpIHtcbiAgICAgIGNvbnN0IHsgYnJlYWRjcnVtYiB9ID0gdGhpcy5zY2hlbWEgfHwge31cbiAgICAgIHJldHVybiBicmVhZGNydW1iIHx8IGAke3RoaXMuYnJlYWRjcnVtYlByZWZpeH0gJHt0aGlzLmxhYmVsfWBcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH0sXG5cbiAgICBwYXJhbSgpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHZ1ZS1yb3V0ZXIgbm90IGJlaW5nIGFibGUgdG8gbWFwIG11bHRpcGxlIHVybCBwYXJhbWV0ZXJzXG4gICAgICAvLyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gbXVsdGlwbGUgY29tcG9uZW50cywgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzEzNDVcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXJhbXNbdGhpcy5tZXRhPy5wYXJhbV0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGUsIHNlZSBEaXRvRm9ybVxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlUm91dGVVcGRhdGUodG8sIGZyb20sIG5leHQpIHtcbiAgICB0aGlzPy5iZWZvcmVSb3V0ZUNoYW5nZSh0bywgZnJvbSwgbmV4dClcbiAgfSxcblxuICBiZWZvcmVSb3V0ZUxlYXZlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcz8uYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpXG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICAvLyBLZWVwIGEgc2hhcmVkIHN0YWNrIG9mIHJvb3QgY29tcG9uZW50cyBmb3IgRGl0b1RyYWlsIHRvIHVzZSB0byByZW5kZXJcbiAgICAvLyBsYWJlbHMuIENhbid0IHJlbHkgb24gJHJvdXRlLm1hdGNoZWRbaV0uaW5zdGFuY2VzLmRlZmF1bHQgdW5mb3J0dW5hdGVseSxcbiAgICAvLyBhcyBpbnN0YW5jZXMgYXJlbid0IGltbWVkaWF0ZWx5IHJlYWR5LCBhbmQgaW5zdGFuY2VzIGlzIG5vdCByZWFjdGl2ZS5cbiAgICB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cy5wdXNoKHRoaXMpXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgcm91dGVDb21wb25lbnRzLnNwbGljZShyb3V0ZUNvbXBvbmVudHMuaW5kZXhPZih0aGlzKSwgMSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpIHtcbiAgICAgIGxldCBvayA9IHRydWVcbiAgICAgIGNvbnN0IGlzQ2xvc2luZyA9IChcbiAgICAgICAgLy8gT25seSBoYW5kbGUgdGhpcyByb3V0ZSBjaGFuZ2UgaWYgdGhlIGZvcm0gaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZVxuICAgICAgICAvLyBgZnJvbWAgcm91dGUsIGJ1dCBpbmNsdWRlIHBhcmVudCBmb3JtcyBvZiBjbG9zaW5nIG5lc3RlZCBmb3JtcyBhcyBhc1xuICAgICAgICAvLyB3ZWxsLCBieSBtYXRjaGluZyB0aGUgdGhlIHN0YXJ0IG9mIGZyb20vdG8gcGF0aCBhZ2FpbnN0IGB0aGlzLnBhdGhgOlxuICAgICAgICBmcm9tLnBhdGguc3RhcnRzV2l0aCh0aGlzLnBhdGgpICYmXG4gICAgICAgICF0by5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAvLyBFeGNsdWRlIGhhc2ggY2hhbmdlcyBvbmx5ICg9IHRhYiBjaGFuZ2VzKTpcbiAgICAgICAgZnJvbS5wYXRoICE9PSB0by5wYXRoICYmIChcbiAgICAgICAgICB0aGlzLmlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB8fFxuICAgICAgICAgIC8vIERlY2lkZSBpZiB3ZSdyZSBtb3ZpbmcgdG93YXJkcyBhIG5ldyBuZXN0ZWQgZm9ybSwgb3IgY2xvc2luZyAvXG4gICAgICAgICAgLy8gcmVwbGFjaW5nIGFuIGFscmVhZHkgb3BlbiBvbmUgYnkgY29tcGFyaW5nIHBhdGggbGVuZ3Rocy5cbiAgICAgICAgICAvLyBUaGUgY2FzZSBvZiBgPWAgbWF0Y2hlcyB0aGUgcmVwbGFjaW5nIG9mIGFuIGFscmVhZHkgb3BlbiBvbmUuXG4gICAgICAgICAgdG8ucGF0aC5sZW5ndGggPD0gZnJvbS5wYXRoLmxlbmd0aFxuICAgICAgICApXG4gICAgICApXG4gICAgICBpZiAoaXNDbG9zaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBGb3IgYWN0aXZlIGRpcmVjdGx5IG11dGF0aW5nIChuZXN0ZWQpIGZvcm1zIHRoYXQgd2VyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgICAgLy8geWV0LCB2YWxpZGF0ZSB0aGVtIG9uY2UuIElmIHRoZSB1c2VyIHRoZW4gc3RpbGwgd2FudHMgdG8gbGVhdmVcbiAgICAgICAgICAvLyB0aGVtLCB0aGV5IGNhbiBjbGljayBjbG9zZSAvIG5hdmlnYXRlIGF3YXkgYWdhaW4uXG4gICAgICAgICAgb2sgPSAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWRhdGVkIHx8XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlQWxsKClcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGZvcm0gZG9lc24ndCBkaXJlY3RseSBtdXRhdGUgZGF0YS4gSWYgaXQgaXMgZGlydHksIGFzayBpZiB1c2VyXG4gICAgICAgICAgLy8gd2FudHMgdG8gcGVyc2lzdCBkYXRhIGZpcnN0LlxuICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgICAgIGBZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIERvIHlvdSByZWFsbHkgd2FudCB0byAke1xuICAgICAgICAgICAgICAgIHRoaXMudmVyYnMuY2FuY2VsXG4gICAgICAgICAgICAgIH0/YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dChvaylcbiAgICB9LFxuXG4gICAgZ2V0Um91dGVQYXRoKHRlbXBsYXRlUGF0aCkge1xuICAgICAgLy8gTWFwcyB0aGUgcm91dGUncyBhY3R1YWwgcGF0aCB0byB0aGUgbWF0Y2hlZCByb3V0ZXMgYnkgY291bnRpbmcgaXRzXG4gICAgICAvLyBwYXJ0cyBzZXBhcmF0ZWQgYnkgJy8nLCBzcGxpdHRpbmcgdGhlIHBhdGggaW50byB0aGUgbWFwcGVkIHBhcnRzXG4gICAgICAvLyBjb250YWluaW5nIGFjdHVhbCBwYXJhbWV0ZXJzLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhdGhcbiAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgLnNsaWNlKDAsIHRlbXBsYXRlUGF0aC5zcGxpdCgnLycpLmxlbmd0aClcbiAgICAgICAgLmpvaW4oJy8nKVxuICAgIH0sXG5cbiAgICBnZXRDaGlsZFBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucGF0aH0vJHtwYXRofWBcbiAgICB9LFxuXG4gICAgaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pIHtcbiAgICAgIC8vIFRoZSByb3V0ZSBwYXRoIGlzIHRoZSBwYXRoIHVwIHRvIHRoZSBmaXJzdCAvIChleGNsdWRpbmcgdGhlIGluaXRpYWwgLyk6XG4gICAgICBjb25zdCByb290UGF0aCA9IHRoaXMucGF0aC5tYXRjaCgvXihcXC9bXi9dKikvKVsxXVxuICAgICAgcmV0dXJuICFnZXRDb21tb25QcmVmaXgodG8ucGF0aCwgZnJvbS5wYXRoKS5zdGFydHNXaXRoKHJvb3RQYXRoKVxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRlbXBsYXRlKFxuICB2LWlmPVwidXNlclwiXG4pXG4gIC8vLSBPbmx5IHJlbmRlciBEaXRvVmlldyB3aGVuIGl0IGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIGEgbm9ybWFsIHJvdXRlci12aWV3XG4gIC8vLSBpbnN0ZWFkLCB0byBuZXN0IGZ1cnRoZXIgcm91dGUgY29tcG9uZW50cy5cbiAgLy8tIE5PVEU6IFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhhbmRsaW5nIGluIERpdG9Gb3JtLCB3aGVyZSBgdi1zaG93YCBpc1xuICAvLy0gdXNlZCB0byBhbHdheXMgcmVuZGVyIGZvcm1zIGV2ZW4gd2hlbiBvdGhlciBuZXN0ZWQgZm9ybXMgYXJlIHByZXNlbnQuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiFpc0xhc3RSb3V0ZVwiXG4gICAgOmtleT1cIm5hbWVcIlxuICApXG4gIC5kaXRvLXZpZXcuZGl0by1zY3JvbGwtcGFyZW50KFxuICAgIHYtZWxzZS1pZj1cInNob3VsZFJlbmRlcih2aWV3U2NoZW1hKVwiXG4gICAgOmRhdGEtcmVzb3VyY2U9XCJzb3VyY2VTY2hlbWEucGF0aFwiXG4gIClcbiAgICBEaXRvU2NoZW1hLmRpdG8tc2Nyb2xsKFxuICAgICAgOnNjaGVtYT1cInZpZXdTY2hlbWFcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKG5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJmYWxzZVwiXG4gICAgICA6bWVudUhlYWRlcj1cInRydWVcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJvdXRlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1JvdXRlTWl4aW4uanMnXG5pbXBvcnQgeyBzb21lU2NoZW1hQ29tcG9uZW50LCBpc1NpbmdsZUNvbXBvbmVudFZpZXcgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBoYXNSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9WaWV3Jywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluXSxcblxuICBwcm92aWRlKCkge1xuICAgIC8vIFJlZGlyZWN0ICRzb3VyY2VDb21wb25lbnQgYW5kICRyZXNvdXJjZUNvbXBvbmVudCB0byB0aGUgbWFpbiBjb21wb25lbnQ6XG4gICAgcmV0dXJuIHtcbiAgICAgICRzb3VyY2VDb21wb25lbnQ6ICgpID0+IHRoaXMubWFpbkNvbXBvbmVudD8uc291cmNlQ29tcG9uZW50IHx8IG51bGwsXG4gICAgICAkcmVzb3VyY2VDb21wb25lbnQ6ICgpID0+IHRoaXMubWFpbkNvbXBvbmVudD8ucmVzb3VyY2VDb21wb25lbnQgfHwgbnVsbFxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBVcGRhdGVkIGZyb20gTG9hZGluZ01peGluIHRocm91Z2ggYHNldExvYWRpbmcoaXNMb2FkaW5nKWA6XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgLy8gTk9URTogRGF0YSBpcyBzaGFyZWQgYWNyb3NzIGFsbCB2aWV3cyBiZWNhdXNlIHRoZSByb3V0ZXIgcmVjeWNsZXMgdGhlXG4gICAgICAvLyBEaXRvVmlldyBjb21wb25lbnQuXG4gICAgICBkYXRhOiB7fVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEuc2NoZW1hXG4gICAgfSxcblxuICAgIG5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubmFtZVxuICAgIH0sXG5cbiAgICBpc1ZpZXcoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBpc1NpbmdsZUNvbXBvbmVudFZpZXcoKSB7XG4gICAgICByZXR1cm4gaXNTaW5nbGVDb21wb25lbnRWaWV3KHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBtYWluQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWFpblNjaGVtYUNvbXBvbmVudC5nZXRDb21wb25lbnRCeURhdGFQYXRoKHRoaXMubmFtZSlcbiAgICB9LFxuXG4gICAgdmlld1NjaGVtYSgpIHtcbiAgICAgIGNvbnN0IHsgY29tcG9uZW50LCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAvLyBUcmFuc2xhdGUgc2luZ2xlLWNvbXBvbmVudCBzY2hlbWFzIGludG8gbXVsdGktY29tcG9uZW50IHNjaGVtYXMsXG4gICAgICAvLyBzbyB0aGV5IGNhbiBiZSByZW5kZXJlZCBkaXJlY3RseSB0aHJvdWdoIERpdG9TY2hlbWEgYWxzbzpcbiAgICAgIHJldHVybiB0aGlzLmlzU2luZ2xlQ29tcG9uZW50Vmlld1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgW3NjaGVtYS5uYW1lXToge1xuICAgICAgICAgICAgICAgIG5hbWU6IHNjaGVtYS5uYW1lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiBzY2hlbWFcbiAgICB9LFxuXG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgcmV0dXJuIHNvbWVTY2hlbWFDb21wb25lbnQoXG4gICAgICAgIHRoaXMudmlld1NjaGVtYSxcbiAgICAgICAgY29tcG9uZW50ID0+IGhhc1Jlc291cmNlKGNvbXBvbmVudClcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAkcm91dGUodG8sIGZyb20pIHtcbiAgICAgIC8vIFNlZSBpZiB0aGUgcm91dGUgY2hhbmdlcyBjb21wbGV0ZWx5LCBhbmQgY2xlYXIgdGhlIGRhdGEgaWYgaXQgZG9lcy5cbiAgICAgIGlmICh0aGlzLmlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGF0YSA9IHt9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRQYXRoKHBhdGgpIHtcbiAgICAgIC8vIExpc3RzIGluc2lkZSBzaW5nbGUtY29tcG9uZW50IHZpZXdzIHVzZSB0aGUgdmlldydzIHBhdGggZm9yIHN1Yi1wYXRoczpcbiAgICAgIHJldHVybiB0aGlzLmlzU2luZ2xlQ29tcG9uZW50Vmlld1xuICAgICAgICA/IHRoaXMucGF0aFxuICAgICAgICA6IGAke3RoaXMucGF0aH0vJHtwYXRofWBcbiAgICB9LFxuXG4gICAgc2V0TG9hZGluZyhpc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gISFpc0xvYWRpbmdcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0ZShkYXRlLCB7XG4gIHllYXIgPSBkYXRlPy5nZXRGdWxsWWVhcigpID8/IDAsXG4gIG1vbnRoID0gZGF0ZT8uZ2V0TW9udGgoKSA/PyAwLFxuICBkYXkgPSBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgaG91ciA9IGRhdGU/LmdldEhvdXJzKCkgPz8gMCxcbiAgbWludXRlID0gZGF0ZT8uZ2V0TWludXRlcygpID8/IDAsXG4gIHNlY29uZCA9IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICBtaWxsaXNlY29uZCA9IGRhdGU/LmdldE1pbGxpc2Vjb25kcygpID8/IDBcbn0gPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERhdGUoZGF0ZSkge1xuICByZXR1cm4gaXNEYXRlKGRhdGUpID8gZGF0ZSA6IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGxcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY2FsZW5kYXJcbiAgLmRpdG8tY2FsZW5kYXItcG9wdXBcbiAgICAuZGl0by1jYWxlbmRhci1pbm5lclxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ2RheSdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IDEgfSkgfX1cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtbW9udGgoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ21vbnRoJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IG1vbnRoOiAxIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIndlZWtkYXkgaW4gd2Vla2RheU5hbWVzXCJcbiAgICAgICAgICAgICkge3sgd2Vla2RheS5zaG9ydCB9fVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLWRhdGVzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cImRhdGUgaW4gZGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZGF0ZS5zdGF0ZSAmJiBgZGl0by1jYWxlbmRhci1pdGVtLSR7ZGF0ZS5zdGF0ZX1gXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShkYXRlLmRhdGUsIGRhdGUuc3RhdGUsIHRydWUpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZS50ZXh0IH19XG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWZvb3RlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtdG9kYXkoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImRhdGVUb1N0cmluZyhuZXcgRGF0ZSgpLCB7IHllYXI6IDEsIG1vbnRoOiAxLCBkYXk6IDEgfSlcIlxuICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAnbW9udGgnXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiAxIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1tb250aHNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiKG1vbnRoLCBpbmRleCkgaW4gbW9udGhOYW1lc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldE1vbnRoQ2xhc3MoaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0TW9udGgoaW5kZXgpXCJcbiAgICAgICAgICAgICkge3sgbW9udGguc2hvcnQgfX1cbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ3llYXInXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhbiB7eyBkZWNhZGVUb1N0cmluZyhjdXJyZW50VmFsdWUpIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXllYXJzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cInllYXIgaW4geWVhclJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0WWVhckNsYXNzKHllYXIpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICApIHt7IHllYXIgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgbW9kZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkYXknIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgd2Vla2RheU5hbWVzLCBtb250aE5hbWVzIH0gPSBnZXRMb2NhbGVOYW1lcyh0aGlzLmxvY2FsZSlcbiAgICByZXR1cm4ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lcyxcbiAgICAgIGRhdGVSYW5nZTogW10sXG4gICAgICB5ZWFyUmFuZ2U6IFtdLFxuICAgICAgY3VycmVudFZhbHVlOiAoXG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSB8fFxuICAgICAgICAvLyBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdXNlIGN1cnJlbnQgZGF0ZSBidXQgY2xlYXIgdGltZSBmaWVsZHM6XG4gICAgICAgIGNvcHlEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudFZhbHVlLCBvdmVycmlkZXMpXG4gICAgfSxcblxuICAgIHN0ZXBEZWNhZGUoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiAxMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2V0TW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH0sXG5cbiAgICBzdGVwTW9udGgoc3RlcCkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgeWVhciwgbW9udGggfSA9IHRoaXMuZ2V0WWVhck1vbnRoKFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwXG4gICAgICApXG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5OiBNYXRoLm1pbihcbiAgICAgICAgICB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXREYXRlKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc3RlcFllYXIoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdERhdGUoZGF0ZSwgc3RhdGUsIGNvcHkgPSBmYWxzZSkge1xuICAgICAgaWYgKHN0YXRlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXk6IGRhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWxlY3RNb250aChtb250aCkge1xuICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgLy8gU2V0IGRheSB0byAxIHRvIGF2b2lkIHNlbGVjdGluZyBhIGRhdGUgdGhhdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZVxuICAgICAgLy8gbmV3IG1vbnRoLCBlLmcuIEZlYiAzMSAtPiBNYXIgMy5cbiAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoLCBkYXk6IDEgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0WWVhcih5ZWFyKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXIgfSlcbiAgICB9LFxuXG4gICAgZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICB5ZWFyKytcbiAgICAgICAgbW9udGggPSAwXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuICAgICAgICB5ZWFyLS1cbiAgICAgICAgbW9udGggPSAxMVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGggfVxuICAgIH0sXG5cbiAgICBkYXRlVG9TdHJpbmcoZGF0ZSwgeyB5ZWFyLCBtb250aCwgZGF5IH0pIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IGhvciwgdmVyLCBlbnRlciB9KSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRNb2RlLCBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChob3IgfHwgdmVyKSB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgZGF5OiBjdXJyZW50VmFsdWUuZ2V0RGF0ZSgpICsgaG9yICsgdmVyICogN1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgaG9yICsgdmVyICogNlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICAgICAgICB5ZWFyOiBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIGhvciArIHZlciAqIDVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVEYXRlUmFuZ2UoKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZSA9IFtdXG4gICAgICB0aGlzLnllYXJSYW5nZSA9IFtdXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB5ZWFyID0gY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIGNvbnN0IG1vbnRoID0gY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcilcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICB0aGlzLnllYXJSYW5nZS5wdXNoKHN0YXJ0WWVhciArIGkpXG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyTW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgbGV0IGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuICAgICAgICBmaXJzdERheVdlZWsgPSA3XG4gICAgICB9XG4gICAgICBjb25zdCBudW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aClcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoXG4gICAgICAgICAgcHJldk1vbnRoLnllYXIsXG4gICAgICAgICAgcHJldk1vbnRoLm1vbnRoXG4gICAgICAgIClcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdERheVdlZWs7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRheSA9IHByZXZNb250aE51bURheXMgLSBmaXJzdERheVdlZWsgKyBpICsgMVxuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShwcmV2TW9udGgueWVhciwgcHJldk1vbnRoLm1vbnRoLCBkYXkpXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBkYXksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1EYXlzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKVxuICAgICAgICBjb25zdCBpc0RheSA9IGRhdGUgPT4gKFxuICAgICAgICAgIGRhdGUgJiZcbiAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gaSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGhcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzRGF5KHRoaXMubW9kZWxWYWx1ZSlcbiAgICAgICAgICA/ICdhY3RpdmUnXG4gICAgICAgICAgOiBpc0RheSh0b2RheSlcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogMTAwMDtcbn1cblxuLmRpdG8tY2FsZW5kYXItYm9keSB7XG4gIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA3KTtcbiAgICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IGNhbGMoI3skaW5wdXQtaGVpZ2h0fSAtIDJweCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIEBleHRlbmQgJWlucHV0LWhlaWdodDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogJGJvcmRlci1zdHlsZTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgPiBzcGFuIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMCAwLjVlbTtcbiAgfVxuXG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LFxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNSU7XG4gIG1pbi13aWR0aDogMmVtO1xuICBtYXgtd2lkdGg6IDNlbTtcblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLknO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCqyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLonO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCuyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc2VsZWN0LXRvZGF5IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50cyh0YXJnZXQsIGV2ZW50cykge1xuICBmb3IgKGNvbnN0IHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRzW3R5cGVdLCBmYWxzZSlcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRzW3R5cGVdLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleShldmVudCkge1xuICByZXR1cm4ge1xuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJyxcbiAgICAxMzogJ2VudGVyJ1xuICB9W2V2ZW50LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1pZj1cImFsd2F5c1Nob3dcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2NsaWNrJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2ZvY3VzJyB8fCB0cmlnZ2VyID09PSAnYWx3YXlzJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgVHJhbnNpdGlvbig6bmFtZT1cInRyYW5zaXRpb25cIilcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1lbHNlXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpzaG93J10sXG5cbiAgcHJvcHM6IHtcbiAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2NsaWNrJyB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbScgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3VzdG9tQ2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgekluZGV4OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIGtlZXBJblZpZXc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGhpZGVXaGVuQ2xpY2tPdXRzaWRlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBhbHdheXNTaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY292ZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBoaWRlRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIHBvcHVwUGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyaWdnZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXRyaWdnZXItZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBvcHVwQ2xhc3MoKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICBbYGRpdG8tcG9wdXAtJHtoeXBoZW5hdGUodGhpcy5wbGFjZW1lbnQpfWBdOiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgICBjbGFzc2VzW3RoaXMuY3VzdG9tQ2xhc3NdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgcG9wdXBTdHlsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpJbmRleCA/IGB6LWluZGV4OiAke3RoaXMuekluZGV4fWAgOiAnJ1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93IHx8IHRoaXMuYWx3YXlzU2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgICAgaWYgKHRvKSB7XG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IGFkZEV2ZW50cyh0YXJnZXQsIHtcbiAgICAgICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhpZGVXaGVuQ2xpY2tPdXRzaWRlICYmICF0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIC8vIFVzZSAnbW91c2V1cCcgaW5zdGVhZCBvZiAnY2xpY2snLCBzaW5jZSBjbGljayBhcHBlYXJzIHRvIGhhcHBlbiBhZnRlclxuICAgICAgLy8gdGhlIERPTSBpbnNpZGUgb2YgcG9wdXBzIGNvdWxkIGNoYW5nZSBpbiBhIHdheSBzbyB0aGF0IHRoZSBjaGVja1xuICAgICAgLy8gYHBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgIHdvdWxkIGZhaWw6XG4gICAgICB0aGlzLmNsb3NlRXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgJiZcbiAgICAgICAgICAgICFwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdHJpZ2dlci5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zaG93UG9wdXAgPSB0aGlzLnNob3dcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IG51bGxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcodGhpcy50YXJnZXQpXG4gICAgICAgID8gdGhpcy4kcmVmc1t0aGlzLnRhcmdldF1cbiAgICAgICAgOiB0aGlzLnRhcmdldFxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgICAgY29uc3QgZWwgPSB0YXJnZXQgPT09IHBvcHVwID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gKHRhcmdldCB8fCB0cmlnZ2VyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuc2hvd1BvcHVwXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0XG4gIGlucHV0KFxuICAgIDppZD1cImlkXCJcbiAgICByZWY9XCJpbnB1dFwiXG4gICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgOnR5cGU9XCJ0eXBlXCJcbiAgICA6bmFtZT1cIm5hbWVcIlxuICAgIDp0aXRsZT1cInRpdGxlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOnJlYWRvbmx5PVwicmVhZG9ubHlcIlxuICAgIDphdXRvZm9jdXM9XCJhdXRvZm9jdXNcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICA6YXV0b2NvbXBsZXRlPVwiYXV0b2NvbXBsZXRlXCJcbiAgICA6YXJpYS1sYWJlbD1cInRpdGxlXCJcbiAgICB2LWJpbmQ9XCIkYXR0cnNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGF1dG9mb2N1czogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgICAvKlxuICAgIGNsZWFyYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gICAgc3VmZml4SWNvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBwcmVmaXhJY29uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gICAgKi9cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIGhvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2l6ZSgpIHtcbiAgICAgIC8vIERldGVybWluZSBzaXplIGJhc2VkIG9uIG1pbiAmIG1heCBzZXR0aW5ncywgaWYgdGhleSdyZSBwcm92aWRlZC5cbiAgICAgIGNvbnN0IHsgc2l6ZSwgbWluLCBtYXggfSA9IHRoaXMuJGF0dHJzXG4gICAgICBjb25zdCBnZXRMZW5ndGggPSB2YWx1ZSA9PiAodmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAubGVuZ3RoIDogMClcbiAgICAgIHJldHVybiBzaXplIHx8IGdldExlbmd0aChtaW4pIHx8IGdldExlbmd0aChtYXgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5XG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJpbnB1dEZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiaW5wdXRGb2N1c2VkID0gZmFsc2VcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgIClcbiAgLy8gaWNvbih0eXBlPVwiY2FsZW5kYXJcIiA6Y29sb3I9XCJpY29uQ29sb3JcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGF0ZUZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+IGRlZmF1bHRGb3JtYXRzLmRhdGUgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgZGF0ZTogdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICAgIH0pIHx8ICcnXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoK2N1cnJlbnRWYWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gY29udHJhZGljdCB0aGUgYGN1cnJlbnRWYWx1ZSgpYCB3YXRjaGVyIGFib3ZlLlxuICAgICAgICAgIC8vICAgICAgIElzIHRoaXMgbmVlZGVkIGF0IGFsbD9cbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuY2FsZW5kYXI/Lm5hdmlnYXRlKGdldEtleU5hdmlnYXRpb24oZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICBtaW4td2lkdGg6IDEwZW07XG5cbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24pIHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDEwKVxuICAgIH1cbiAgKVxuICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcFxuICAgIGNvbnN0IHBlclRpY2sgPSBkaWZmZXJlbmNlIC8gZHVyYXRpb24gKiAxMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wICsgcGVyVGlja1xuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wID09PSB0bykgcmV0dXJuXG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMClcbiAgICB9KVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7XG4gIGlmIChmaWVsZC5jcmVhdGVUZXh0UmFuZ2UpIHtcbiAgICBjb25zdCByYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KVxuICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZClcbiAgICByYW5nZS5zZWxlY3QoKVxuICAgIGZpZWxkLmZvY3VzKClcbiAgfSBlbHNlIGlmIChmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGZpZWxkLmZvY3VzKClcbiAgICBmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZmllbGQpIHtcbiAgICBmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0XG4gICAgZmllbGQuc2VsZWN0aW9uRW5kID0gZW5kXG4gICAgZmllbGQuZm9jdXMoKVxuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJjbGlja1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcmVhZG9ubHlcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBzaG93UG9wdXAgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImlucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJpbnB1dEZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgKVxuICAgIC8vLSBpY29uKHR5cGU9XCJ0aW1lXCJcbiAgICAvLy0gOmNvbG9yPVwiZGlzYWJsZWQgPyAnI2JmYmZiZicgOiAodGV4dCA/ICcjNjY2JyA6ICcjYmZiZmJmJylcIlxuICAgIC8vLSApXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKFxuICAgICAgICAgIHJlZj1cImhvdXJcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAwXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKFxuICAgICAgICAgIHJlZj1cIm1pbnV0ZVwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDFcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQoXG4gICAgICAgICAgcmVmPVwic2Vjb25kXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMlwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBzY3JvbGxUbyB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbC5qcydcbmltcG9ydCB7IHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiAwLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlXG4gICAgICAgID8gYCR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5ob3VyKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLm1pbnV0ZSlcbiAgICAgICAgICB9OiR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5zZWNvbmQpXG4gICAgICAgICAgfWBcbiAgICAgICAgOiAnJ1xuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgY29weURhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoZGF0ZSkge1xuICAgICAgaWYgKCtkYXRlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBkYXRlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiAndXBkYXRlU2VsZWN0aW9uJyxcblxuICAgIHNlbGVjdGlvbjogJ3VwZGF0ZVNlbGVjdGlvbicsXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbigpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKDApXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlU2VsZWN0aW9uKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCB8fCBmb3JjZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IDMgKiB0aGlzLnNlbGVjdGlvblxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy4kcmVmcy5pbnB1dCwgc3RhcnQsIHN0YXJ0ICsgMikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChkdXJhdGlvbiA9IDEwMCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpblxuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC8gKHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyA2KVxuICAgICAgICAgIHNjcm9sbFRvKHRhcmdldCwgTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpLCBkdXJhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXVt0aGlzLnNlbGVjdGlvbl1cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCB7IGhvciwgdmVyLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgICAgaWYgKGhvcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb24gKyBob3JcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHZhbHVlIDwgMCA/IDIgOiB2YWx1ZSA+IDIgPyAwIDogdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICh2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbc2VsZWN0ZWRdICsgdmVyXG4gICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuJHJlZnNbc2VsZWN0ZWRdLmNoaWxkcmVuXG4gICAgICAgICAgdGhpc1tzZWxlY3RlZF0gPVxuICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgID8gdmFsdWUgKyBsZW5ndGhcbiAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBsZW5ndGhcbiAgICAgICAgICAgICAgICA/IHZhbHVlIC0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9yIHx8IHZlciB8fCBlbnRlcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRydWUpXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGl0by1pY29uLXRpbWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogN3B4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1waWNrZXJzKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZWhvbGRlciwgbG9jYWxlLCBkYXRlRm9ybWF0LCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImRhdGVGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImRhdGVGb2N1c2VkID0gZmFsc2VcIlxuICAgIClcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJ0aW1lRm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJ0aW1lRm9jdXNlZCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGVGb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiBkZWZhdWx0Rm9ybWF0cy5kYXRlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2N1c2VkIHx8IHRoaXMudGltZUZvY3VzZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShkYXRlKSB7XG4gICAgICBpZiAoK2RhdGUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGRhdGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmRhdGUuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5kYXRlLmJsdXIoKVxuICAgICAgdGhpcy4kcmVmcy50aW1lLmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gIC5kaXRvLXBpY2tlcnMge1xuICAgIEBleHRlbmQgJWlucHV0O1xuXG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtaW4td2lkdGg6IDYuOWVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgd2lkdGg6IDQwJTtcbiAgICBtaW4td2lkdGg6IDUuNGVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKDpjbGFzcz1cImBkaXRvLWljb24tJHtuYW1lfWBcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0jeyRuYW1lfSB7XG4gICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX1cbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtZWxzZVxuICAgICkgMFxuICAgIHwgLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwicGFnZSBpbiBwYWdlUmFuZ2VcIlxuICAgICAgOmNsYXNzPVwiZ2V0UGFnZUNsYXNzKHBhZ2UpXCJcbiAgICAgIDpkaXNhYmxlZD1cInBhZ2UuZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja1BhZ2UocGFnZSlcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJwYWdlLnRleHRcIlxuICAgICAgKSB7eyBwYWdlLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVJhbmdlOiBbXSxcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBudW1QYWdlczogMCxcbiAgICAgIGN1cnJlbnRQYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jdXJyZW50UGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMuY3VycmVudFBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB0b3RhbDogJ3VwZGF0ZVBhZ2VSYW5nZScsXG4gICAgc2hvd1ByZXY6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuICAgIHNob3dOZXh0OiAndXBkYXRlUGFnZVJhbmdlJyxcblxuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUocGFnZVNpemUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTaXplID0gcGFnZVNpemVcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2VTaXplKGN1cnJlbnRQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5udW1QYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gY3VycmVudFBhZ2VTaXplKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgICB0aGlzLmN1cnJlbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemVcbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGlja1BhZ2UocGFnZSkge1xuICAgICAgaWYgKHBhZ2UuaW5kZXggJiYgIXBhZ2UuZGlzYWJsZWQgJiYgcGFnZS5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZS5pbmRleFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYWdlQ2xhc3MocGFnZSkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBwYWdlLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKHBhZ2UudHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke3BhZ2UudHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHVwZGF0ZVBhZ2VSYW5nZSgpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCB0b3RhbCwgY3VycmVudFBhZ2VTaXplLCBjdXJyZW50UGFnZSB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG4gICAgICBjb25zdCBudW1QYWdlcyA9ICh0aGlzLm51bVBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsIC8gY3VycmVudFBhZ2VTaXplKSlcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdlUmFuZ2UgPSBbXVxuICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMucGFnZVJhbmdlID0gcGFnZVJhbmdlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSwgY29sb3IgMHMsIGJhY2tncm91bmQgMHMsIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cIiRhdHRyc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHsgY2hlY2tlZCwgZGlzYWJsZWQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNoZWNrZWQnOiBjaGVja2VkLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy4gYHJlbWAgaXMgbmVlZGVkIGJlY2F1c2Ugd2VcbiAgLy8gY2hhbmdlIGBmb250LXNpemVgIGluc2lkZSBgLmRpdG8tc3dpdGNoLWJ1dHRvbmBcbiAgLS1zd2l0Y2gtd2lkdGg6IDRyZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMnJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcywgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC8vIFNldCBmb250LXNpemUgdG8gaGVpZ2h0LCBzbyB3ZSBjYW4gdXNlIHdpZHRoL2hlaWdodCA9IDFlbSBmb3IgY2lyY2xlOlxuICAgIGZvbnQtc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC41ZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnaGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogJ2F1dG8nIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgIGhlaWdodDogMFxuICAgIH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmhlaWdodC1lbnRlci1hY3RpdmUsXG4uaGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IHNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5oZWlnaHQtZW50ZXItZnJvbSxcbi5oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYsIHdhdGNoLCBvblNjb3BlRGlzcG9zZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IGNyZWF0ZUZvY3VzVHJhcCB9IGZyb20gJ2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgdW5yZWZFbGVtZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcblxuY29uc3QgVXNlRm9jdXNUcmFwID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZUZvY3VzVHJhcFwiLFxuICBwcm9wczogW1wiYXNcIiwgXCJvcHRpb25zXCJdLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgbGV0IHRyYXA7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSAoKSA9PiB0cmFwICYmIHRyYXAuYWN0aXZhdGUoKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlID0gKCkgPT4gdHJhcCAmJiB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB3YXRjaChcbiAgICAgICgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGlmICghZWwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cmFwID0gY3JlYXRlRm9jdXNUcmFwKGVsLCBwcm9wcy5vcHRpb25zIHx8IHt9KTtcbiAgICAgICAgYWN0aXZhdGUoKTtcbiAgICAgIH0sXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICAgKTtcbiAgICBvblNjb3BlRGlzcG9zZSgoKSA9PiBkZWFjdGl2YXRlKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMuYXMgfHwgXCJkaXZcIiwgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KCkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VGb2N1c1RyYXAgfTtcbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kaWFsb2coXG4gIHJlZj1cImRpYWxvZ1wiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IGAke3NldHRpbmdzLndpZHRofXB4YCB9XCJcbiAgQG1vdXNldXA9XCJvbk1vdXNlVXBcIlxuKVxuICBVc2VGb2N1c1RyYXAuZGl0by1kaWFsb2dfX2ZvY3VzLXRyYXAoXG4gICAgOm9wdGlvbnM9XCJ7IGltbWVkaWF0ZTogdHJ1ZSwgZmFsbGJhY2tGb2N1czogKCkgPT4gJHJlZnMuZGlhbG9nIH1cIlxuICApXG4gICAgZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgICBAc3VibWl0LnByZXZlbnQ9XCJzdWJtaXRcIlxuICAgIClcbiAgICAgIERpdG9TY2hlbWEuZGl0by1zY3JvbGwoXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YT1cImRpYWxvZ0RhdGFcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IFVzZUZvY3VzVHJhcCB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZUZvY3VzVHJhcC9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RpYWxvZycsIHtcbiAgY29tcG9uZW50czogeyBVc2VGb2N1c1RyYXAgfSxcbiAgZW1pdHM6IFsncmVtb3ZlJ10sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIGNvbXBvbmVudHM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHByb21pc2U6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgIGNsaWNrVG9DbG9zZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gTWFrZSBzdXJlIGRpYWxvZyBkYXRhIGNvbnRhaW5zIGFsbCB0aGUgZXhwZWN0ZWQga2V5c1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSBjbG9uZSh0aGlzLmRhdGEpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZGlhbG9nRGF0YSkpIHtcbiAgICAgICAgZGlhbG9nRGF0YVtrZXldID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93RXZlbnRzOiBudWxsLFxuICAgICAgZGlhbG9nRGF0YVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50c1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZ2V0QnV0dG9uU2NoZW1hcyh0aGlzLmJ1dHRvbnMpKS5tYXAoXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYnV0dG9uIHNjaGVtYXMgdG8gYWRkIGRlZmF1bHQgY2xpY2sgZXZlbnRzXG4gICAgICAgICAgLy8gZm9yIGJvdGggJ3N1Ym1pdCcgYW5kICdjYW5jZWwnIGJ1dHRvbnM6XG4gICAgICAgICAgKFtrZXksIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdjYW5jZWwnICYmICFzY2hlbWEuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5jYW5jZWwoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHNjaGVtYV1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmJ1dHRvblNjaGVtYXMpLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgaGFzQ2FuY2VsKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5idXR0b25TY2hlbWFzLmNhbmNlbFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmhhc0NhbmNlbCB8fCAhdGhpcy5oYXNCdXR0b25zKSAmJiBldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzLnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZScpXG4gICAgfSxcblxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZXNvbHZlKHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICByZWplY3QodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZWplY3QodmFsdWUpXG4gICAgICB0aGlzLnJlbW92ZSgpXG4gICAgfSxcblxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZSh0aGlzLmRpYWxvZ0RhdGEpXG4gICAgfSxcblxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKVxuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2FuY2VsKClcbiAgICB9LFxuXG4gICAgb25Nb3VzZVVwKCkge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY2xpY2tUb0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgZGlzcGxheTogZmxleDtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDIwMDA7XG4gIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvZiB0aGUgcGFnZSBiZWhpbmQgdGhlIGRpYWxvZzpcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuXG4gICZfX2ZvY3VzLXRyYXAge1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAvLyBUT0RPOiBgJl9faW5uZXJgXG4gIGZvcm0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS13aWR0aCwgNDgwcHgpO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggLTJweCByZ2JhKDI3LCAzMywgNTgsIDAuNCk7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWFjdGl2ZSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cztcbiAgfVxufVxuXG4uZGl0by1kaWFsb2ctZW50ZXItZnJvbSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS10byB7XG4gIG9wYWNpdHk6IDA7XG5cbiAgZm9ybSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMHB4KTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21IYW5kbGVyczogW11cbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICBmb3IgKGNvbnN0IHsgcmVtb3ZlIH0gb2YgdGhpcy5kb21IYW5kbGVycykge1xuICAgICAgcmVtb3ZlKClcbiAgICB9XG4gICAgdGhpcy5kb21IYW5kbGVycyA9IFtdXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGRvbU9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFkZEV2ZW50cyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgaXNPYmplY3QodHlwZSkgPyB0eXBlIDogeyBbdHlwZV06IGhhbmRsZXIgfVxuICAgICAgKVxuICAgICAgdGhpcy5kb21IYW5kbGVycy5wdXNoKHJlc3VsdClcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1yb290XG4gIFZ1ZU5vdGlmaWNhdGlvbnMuZGl0by1ub3RpZmljYXRpb25zKFxuICAgIHJlZj1cIm5vdGlmaWNhdGlvbnNcIlxuICAgIHBvc2l0aW9uPVwidG9wIHJpZ2h0XCJcbiAgICBjbGFzc2VzPVwiZGl0by1ub3RpZmljYXRpb25cIlxuICApXG4gIFRyYW5zaXRpb25Hcm91cChuYW1lPVwiZGl0by1kaWFsb2dcIilcbiAgICBEaXRvRGlhbG9nKFxuICAgICAgdi1mb3I9XCIoZGlhbG9nLCBrZXkpIGluIGRpYWxvZ3NcIlxuICAgICAgOmtleT1cImtleVwiXG4gICAgICA6Y29tcG9uZW50cz1cImRpYWxvZy5jb21wb25lbnRzXCJcbiAgICAgIDpidXR0b25zPVwiZGlhbG9nLmJ1dHRvbnNcIlxuICAgICAgOnByb21pc2U9XCJkaWFsb2cucHJvbWlzZVwiXG4gICAgICA6ZGF0YT1cImRpYWxvZy5kYXRhXCJcbiAgICAgIDpzZXR0aW5ncz1cImRpYWxvZy5zZXR0aW5nc1wiXG4gICAgICBAcmVtb3ZlPVwicmVtb3ZlRGlhbG9nKGtleSlcIlxuICAgIClcbiAgRGl0b01lbnVcbiAgbWFpbi5kaXRvLXBhZ2UuZGl0by1zY3JvbGwtcGFyZW50XG4gICAgRGl0b0hlYWRlcihcbiAgICAgIDpzcGlubmVyPVwib3B0aW9ucy5zcGlubmVyXCJcbiAgICAgIDppc0xvYWRpbmc9XCJpc0xvYWRpbmdcIlxuICAgIClcbiAgICAgIERpdG9BY2NvdW50KFxuICAgICAgICB2LWlmPVwidXNlclwiXG4gICAgICApXG4gICAgICBhLmRpdG8tbG9naW4oXG4gICAgICAgIHYtZWxzZS1pZj1cImFsbG93TG9naW5cIlxuICAgICAgICBAY2xpY2s9XCJyb290Q29tcG9uZW50LmxvZ2luKClcIlxuICAgICAgKVxuICAgICAgICBzcGFuIExvZ2luXG4gICAgUm91dGVyVmlld1xuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGFzQXJyYXksIG1hcENvbmN1cnJlbnRseSwgc3RyaXBUYWdzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b1VzZXIgZnJvbSAnLi4vRGl0b1VzZXIuanMnXG5pbXBvcnQgRGl0b1ZpZXcgZnJvbSAnLi4vY29tcG9uZW50cy9EaXRvVmlldy52dWUnXG5pbXBvcnQgRGl0b0RpYWxvZyBmcm9tICcuL0RpdG9EaWFsb2cudnVlJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NWaWV3LFxuICByZXNvbHZlU2NoZW1hcyxcbiAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Sb290Jywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgRGl0b0RpYWxvZyB9LFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR2aWV3czogKCkgPT4gdGhpcy5yZXNvbHZlZFZpZXdzXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdW5yZXNvbHZlZFZpZXdzOiB7IHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uLCBQcm9taXNlXSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBvcHRpb25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb2x2ZWRWaWV3czoge30sXG4gICAgICByZW1vdmVSb3V0ZXM6IG51bGwsXG4gICAgICBkaWFsb2dzOiB7fSxcbiAgICAgIGFsbG93TG9naW46IGZhbHNlLFxuICAgICAgbG9hZGluZ0NvdW50OiAwXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLm5vdGlmaWNhdGlvbnNcbiAgICB9LFxuXG4gICAgaXNMb2FkaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0NvdW50ID4gMFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuYXBwU3RhdGUudGl0bGUgPSBkb2N1bWVudC50aXRsZSB8fCAnRGl0by5qcyBBZG1pbidcbiAgICAvLyBXaXRoIGhvdC1yZWxvYWRpbmcsIGl0IGxvb2tzIGxpa2UgZGVzdHJveWVkIGhvb2tzIGFyZW4ndCBhbHdheXMgY2FsbGVkXG4gICAgLy8gZm9yIHJvdXRlIGNvbXBvbmVudHMgc28gcmVzZXQgdGhlIGFycmF5IG9mIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBpbnN0ZWFkLlxuICAgIHRoaXMuYXBwU3RhdGUucm91dGVDb21wb25lbnRzID0gW11cbiAgfSxcblxuICBhc3luYyBtb3VudGVkKCkge1xuICAgIC8vIENsZWFyIHRoZSBsYWJlbCBtYXJrZWQgYXMgYWN0aXZlIG9uIGFsbCBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLCBleGNlcHRcbiAgICAvLyB0aGUgb25lcyB0aGF0IERpdG9MYWJlbCBpdHNlbGYgaW50ZXJjZXB0cy5cbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjbGljazogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5jbG9zZXN0KCcuZGl0by1sYWJlbCcpKSB7XG4gICAgICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdUYWInKSB7XG4gICAgICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYWxsb3dMb2dpbiA9IGZhbHNlXG4gICAgICBpZiAoYXdhaXQgdGhpcy5mZXRjaFVzZXIoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVWaWV3cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIH1cbiAgICB0aGlzLmFsbG93TG9naW4gPSB0cnVlXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG5vdGlmeSh7IHR5cGUgPSAnaW5mbycsIHRpdGxlLCB0ZXh0IH0gPSB7fSkge1xuICAgICAgdGl0bGUgfHw9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICdXYXJuaW5nJyxcbiAgICAgICAgICBlcnJvcjogJ0Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdTdWNjZXNzJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdOb3RpZmljYXRpb24nXG4gICAgICApXG4gICAgICB0ZXh0ID0gYDxwPiR7XG4gICAgICAgIGFzQXJyYXkodGV4dCkuam9pbignPC9wPiA8cD4nKVxuICAgICAgfTwvcD5gLnJlcGxhY2UoL1xcbnxcXHJcXG58XFxyL2csICc8YnI+JylcbiAgICAgIGNvbnN0IGxvZyA9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICd3YXJuJyxcbiAgICAgICAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnbG9nJyxcbiAgICAgICAgICBzdWNjZXNzOiAnbG9nJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdlcnJvcidcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlW2xvZ10oc3RyaXBUYWdzKHRleHQpKVxuICAgICAgY29uc3QgeyBub3RpZmljYXRpb25zID0gdHJ1ZSB9ID0gdGhpcy5hcGlcbiAgICAgIGlmIChub3RpZmljYXRpb25zKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBkaXNwbGF5LWR1cmF0aW9uIGZvciB0aGUgbm90aWZpY2F0aW9uIGJhc2VkIG9uIGl0cyBjb250ZW50XG4gICAgICAgIC8vIGFuZCB0aGUgc2V0dGluZyBvZiB0aGUgYGR1cmF0aW9uRmFjdG9yYCBjb25maWd1cmF0aW9uLiBJdCBkZWZpbmVzIHRoZVxuICAgICAgICAvLyBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIG11bHRpcGxpZWQgd2l0aCB0aGUgYW1vdW50IG9mIGNoYXJhY3RlcnNcbiAgICAgICAgLy8gZGlzcGxheWVkIGluIHRoZSBub3RpZmljYXRpb24sIHBsdXMgNDAgKDQwICsgdGl0bGUgKyBtZXNzYWdlKTpcbiAgICAgICAgY29uc3QgeyBkdXJhdGlvbkZhY3RvciA9IDIwIH0gPSBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKDQwICsgdGV4dC5sZW5ndGggKyB0aXRsZS5sZW5ndGgpICogZHVyYXRpb25GYWN0b3JcbiAgICAgICAgdGhpcy4kbm90aWZ5KHsgdHlwZSwgdGl0bGUsIHRleHQsIGR1cmF0aW9uIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsb3NlTm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5kZXN0cm95QWxsKClcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXJMb2FkaW5nKGlzTG9hZGluZykge1xuICAgICAgdGhpcy5sb2FkaW5nQ291bnQgKz0gaXNMb2FkaW5nID8gMSA6IC0xXG4gICAgfSxcblxuICAgIHNob3dEaWFsb2coeyBjb21wb25lbnRzLCBidXR0b25zLCBkYXRhLCBzZXR0aW5ncyB9KSB7XG4gICAgICAvLyBTaG93cyBhIGRpdG8tZGlhbG9nIGNvbXBvbmVudCBhbmQgd3JhcHMgaXQgaW4gYSBwcm9taXNlIHNvIHRoYXQgdGhlXG4gICAgICAvLyBidXR0b25zIGluIHRoZSBkaWFsb2cgY2FuIHVzZSBgZGlhbG9nLnJlc29sdmUoKWAgYW5kIGBkaWFsb2cucmVqZWN0KClgXG4gICAgICAvLyB0byBjbG9zZSB0aGUgbW9kYWwgZGlhbG9nIGFuZCByZXNvbHZlIC8gcmVqZWN0IHRoZSBwcm9taXNlIGF0IG9uY2UuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAvLyBQcm9jZXNzIGNvbXBvbmVudHMgdG8gcmVzb2x2ZSBhc3luYyBzY2hlbWFzLlxuICAgICAgICAgIGNvbnN0IHJvdXRlcyA9IFtdXG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHModGhpcy5hcGksIHsgY29tcG9uZW50cyB9LCByb3V0ZXMsIDApXG4gICAgICAgICAgaWYgKHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdEaWFsb2dzIGRvIG5vdCBzdXBwb3J0IGNvbXBvbmVudHMgdGhhdCBwcm9kdWNlIHJvdXRlcydcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qga2V5ID0gYGRpYWxvZy0keysrZGlhbG9nSWR9YFxuICAgICAgICAgIHRoaXMuZGlhbG9nc1trZXldID0ge1xuICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICBwcm9taXNlOiB7IHJlc29sdmUsIHJlamVjdCB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHJlbW92ZURpYWxvZyhrZXkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRpYWxvZ3Nba2V5XVxuICAgIH0sXG5cbiAgICBhc3luYyBsb2dpbigpIHtcbiAgICAgIHRoaXMuYWxsb3dMb2dpbiA9IHRydWVcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWRkaXRpb25hbENvbXBvbmVudHMsXG4gICAgICAgIHJlZGlyZWN0QWZ0ZXJMb2dpblxuICAgICAgfSA9IHRoaXMub3B0aW9ucy5sb2dpbiB8fCB7fVxuICAgICAgY29uc3QgbG9naW5EYXRhID0gYXdhaXQgdGhpcy5zaG93RGlhbG9nKHtcbiAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBhdXRvZm9jdXM6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hZGRpdGlvbmFsQ29tcG9uZW50c1xuICAgICAgICB9LFxuICAgICAgICBidXR0b25zOiB7XG4gICAgICAgICAgY2FuY2VsOiB7fSxcbiAgICAgICAgICBsb2dpbjogeyB0eXBlOiAnc3VibWl0JyB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAobG9naW5EYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5sb2dpbixcbiAgICAgICAgICAgIGRhdGE6IGxvZ2luRGF0YSxcbiAgICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAocmVkaXJlY3RBZnRlckxvZ2luKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZXBsYWNlKHJlZGlyZWN0QWZ0ZXJMb2dpbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyKHJlc3BvbnNlLmRhdGEudXNlcilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICB0aXRsZTogJ0F1dGhlbnRpY2F0aW9uIEVycm9yJyxcbiAgICAgICAgICAgIHRleHQ6IGVycm9yIHx8IGVyclxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5yZXNwb25zZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2dpbigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbmF2aWdhdGVIb21lKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUoJy8nKVxuICAgIH0sXG5cbiAgICBhc3luYyBsb2dvdXQoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5sb2dvdXQsXG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2V0VXNlcihudWxsKVxuICAgICAgICAgIHRoaXMubmF2aWdhdGVIb21lKClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBmZXRjaFVzZXIoKSB7XG4gICAgICBsZXQgdXNlciA9IG51bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgcmVzb3VyY2U6IHRoaXMuYXBpLnVzZXJzLnNlc3Npb24sXG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgdXNlciA9IHJlc3BvbnNlLmRhdGEudXNlciB8fCBudWxsXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgdGl0bGU6ICdBdXRoZW50aWNhdGlvbiBFcnJvcicsXG4gICAgICAgICAgdGV4dDogZXJyXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnNldFVzZXIodXNlcilcbiAgICAgIHJldHVybiB1c2VyXG4gICAgfSxcblxuICAgIHNldFVzZXIodXNlcikge1xuICAgICAgdGhpcy5hcHBTdGF0ZS51c2VyID0gKFxuICAgICAgICB1c2VyICYmXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih1c2VyLCBEaXRvVXNlci5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAvLyBDbGVhciByZXNvbHZlZCB2aWV3cyB3aGVuIHVzZXIgaXMgbG9nZ2VkIG91dC5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICB0aGlzLnJlc29sdmVkVmlld3MgPSB7fVxuICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZVVzZXIoKSB7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmZldGNoVXNlcigpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzb2x2ZVZpZXdzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXModGhpcy51bnJlc29sdmVkVmlld3MpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIWVycm9yLnJlcXVlc3QpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJvdXRlcyBmcm9tIHRoZSByb290IHNjaGVtYSBjb21wb25lbnRzXG4gICAgICBjb25zdCByb3V0ZXMgPSBhd2FpdCBtYXBDb25jdXJyZW50bHkoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVzb2x2ZWRWaWV3cyksXG4gICAgICAgIChbbmFtZSwgc2NoZW1hXSkgPT4gcHJvY2Vzc1ZpZXcoRGl0b1ZpZXcsIHRoaXMuYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgICApXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgcm91dGVzIGFyZSBsb2FkZWQsIHJlcGxhY2UgYWxsIGV4aXN0aW5nIHJvdXRlcyB3aXRoIHRoZVxuICAgICAgLy8gbmV3IHJvdXRlcywgYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgcGF0aC5cbiAgICAgIGNvbnN0IHsgZnVsbFBhdGggfSA9IHRoaXMuJHJvdXRlXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcz8uKClcbiAgICAgIHRoaXMucmVtb3ZlUm91dGVzID0gYWRkUm91dGVzKHRoaXMuJHJvdXRlciwgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3Jvb3QnLFxuICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICBjb21wb25lbnRzOiB7fVxuICAgICAgICB9LFxuICAgICAgICAuLi5yb3V0ZXNcbiAgICAgIF0pXG4gICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZShmdWxsUGF0aClcbiAgICB9XG4gIH1cbn0pXG5cbmxldCBkaWFsb2dJZCA9IDBcblxuZnVuY3Rpb24gYWRkUm91dGVzKHJvdXRlciwgcm91dGVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gW11cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICBjb25zdCByZW1vdmVSb3V0ZSA9IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSlcbiAgICByZW1vdmVycy5wdXNoKHJlbW92ZVJvdXRlKVxuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IHJlbW92ZSBvZiByZW1vdmVycykge1xuICAgICAgcmVtb3ZlKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9zdHlsZSc7XG5cbi5kaXRvLWFwcCxcbi5kaXRvLXJvb3Qge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xufVxuXG4uZGl0by1yb290IHtcbiAgLmRpdG8tcGFnZSB7XG4gICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAvLyBUaGUgcm9vdC1sZXZlbCB2aWV3cyBhbmQgZm9ybXMgbWF5IGhhdmUgYSBgLmRpdG8tc2NoZW1hLWhlYWRlcmAgdGhhdFxuICAgIC8vIHNob3VsZCBhcHBlYXIgbGF5ZXJlZCBvdmVyIGAuZGl0by1tZW51YCwgd2hpbGUgaGF2aW5nIGBvdmVybGF5OiBoaWRkZW5gXG4gICAgLy8gc2V0IGJ5IGAuZGl0by1zY3JvbGwtcGFyZW50YCB0byBkZWxlZ2F0ZSBzY3JvbGxpbmcgdG8gYC5kaXRvLXNjcm9sbGAuXG4gICAgLy8gSW4gb3JkZXIgdG8gbm90IGhhdmUgdGhlIGhlYWRlciBjbGlwcGVkLCBhZGp1c3QgdGhlIHRvcCBoZXJlOlxuICAgID4gLmRpdG8tZm9ybSxcbiAgICA+IC5kaXRvLXZpZXcge1xuICAgICAgbWFyZ2luLXRvcDogLSRtZW51LWhlaWdodDtcbiAgICAgIHBhZGRpbmctdG9wOiAkbWVudS1oZWlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbm5hdi5kaXRvLW1lbnUuZGl0by1zY3JvbGwtcGFyZW50XG4gIGgxIHt7IGFwcFN0YXRlLnRpdGxlIH19XG4gIHVsLmRpdG8tc2Nyb2xsXG4gICAgbGkoXG4gICAgICB2LWZvcj1cInZpZXcgaW4gdmlld3NcIlxuICAgIClcbiAgICAgIFJvdXRlckxpbmsuZGl0by1saW5rKFxuICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHZpZXcpXCJcbiAgICAgICAgOnRvPVwiYC8ke3ZpZXcucGF0aH1gXCJcbiAgICAgICAgYWN0aXZlQ2xhc3M9XCJkaXRvLWFjdGl2ZVwiXG4gICAgICApIHt7IGdldExhYmVsKHZpZXcpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTWVudScsIHt9KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbWVudSB7XG4gIGZsZXg6IGluaXRpYWw7XG4gIGZvbnQtc2l6ZTogJG1lbnUtZm9udC1zaXplO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB1bCB7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAkYm9yZGVyLXN0eWxlO1xuICB9XG5cbiAgYSxcbiAgaDEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgaDEge1xuICAgIHBhZGRpbmc6ICRtZW51LXBhZGRpbmc7XG4gICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1kYXJrZXN0O1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAuZGl0by1saW5rIHtcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcblxuICAgICYuZGl0by1hY3RpdmUge1xuICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWxpbmsge1xuICAmOmZvY3VzOm5vdCg6YWN0aXZlLCAuZGl0by1hY3RpdmUpIHtcbiAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNwaW5uZXIoXG4gIHYtc2hvdz1cImxvYWRpbmdcIlxuKVxuICAvLy0gVE9ETzogQ29udmVydCB0byBCRU1cbiAgLnYtcHVsc2Uudi1wdWxzZTEoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5MV1cIilcbiAgLnYtcHVsc2Uudi1wdWxzZTIoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5Ml1cIilcbiAgLnYtcHVsc2Uudi1wdWxzZTMoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5M11cIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbG9hZGluZzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnIzVkYzU5NidcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcxNXB4J1xuICAgIH0sXG4gICAgbWFyZ2luOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMnB4J1xuICAgIH0sXG4gICAgcmFkaXVzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTAwJSdcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIHVzaW5nIG9ubHkgY2xhc3Nlc1xuICAgIHJldHVybiB7XG4gICAgICBzcGlubmVyU3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICB3aWR0aDogdGhpcy5zaXplLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuc2l6ZSxcbiAgICAgICAgbWFyZ2luOiB0aGlzLm1hcmdpbixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0aGlzLnJhZGl1cyxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIGFuaW1hdGlvbk5hbWU6ICd2LXB1bHNlU3RyZXRjaERlbGF5JyxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246ICcwLjc1cycsXG4gICAgICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAnaW5maW5pdGUnLFxuICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2N1YmljLWJlemllciguMiwuNjgsLjE4LDEuMDgpJyxcbiAgICAgICAgYW5pbWF0aW9uRmlsbE1vZGU6ICdib3RoJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTE6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjEycydcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkyOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4yNHMnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5Mzoge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMzZzJ1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGtleWZyYW1lcyB2LXB1bHNlU3RyZXRjaERlbGF5IHtcbiAgMCUsXG4gIDgwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgNDUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XG4gICAgb3BhY2l0eTogMC43O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgdi1wdWxzZVN0cmV0Y2hEZWxheSB7XG4gIDAlLFxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIDQ1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xuICAgIG9wYWNpdHk6IDAuNztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1oZWFkZXJcbiAgLmRpdG8tdHJhaWxcbiAgICB1bFxuICAgICAgbGkoXG4gICAgICAgIHYtZm9yPVwiKGNvbXBvbmVudCwgaW5kZXgpIGluIHRyYWlsXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImluZGV4ID09PSB0cmFpbC5sZW5ndGggLSAxXCJcbiAgICAgICAgKVxuICAgICAgICAgIHNwYW4oOmNsYXNzPVwiZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudClcIilcbiAgICAgICAgICAgIHwge3sgY29tcG9uZW50LmJyZWFkY3J1bWIgfX1cbiAgICAgICAgUm91dGVyTGluay5kaXRvLWJyZWFkY3J1bWIoXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgOnRvPVwiY29tcG9uZW50LnBhdGhcIlxuICAgICAgICApXG4gICAgICAgICAgc3Bhbig6Y2xhc3M9XCJnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KVwiKVxuICAgICAgICAgICAgfCB7eyBjb21wb25lbnQuYnJlYWRjcnVtYiB9fVxuICAgIERpdG9TcGlubmVyKFxuICAgICAgdi1pZj1cImlzTG9hZGluZ1wiXG4gICAgKVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvU3Bpbm5lciBmcm9tICcuL0RpdG9TcGlubmVyLnZ1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvSGVhZGVyJywge1xuICBjb21wb25lbnRzOiB7IERpdG9TcGlubmVyIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBzcGlubmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSxcbiAgICBpc0xvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyYWlsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdGUucm91dGVDb21wb25lbnRzLmZpbHRlcihcbiAgICAgICAgY29tcG9uZW50ID0+ICEhY29tcG9uZW50LnJvdXRlUmVjb3JkXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2l6ZSA9ICc4cHgnLFxuICAgICAgY29sb3IgPSAnIzk5OSdcbiAgICB9ID0gdGhpcy5zcGlubmVyIHx8IHt9XG4gICAgLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgdG8gc2V0IHRoZSBkZWZhdWx0IHByb3BzIGZvciB0aGUgRGl0b1NwaW5uZXIuXG4gICAgLy8gUGFzcyB0aGVtIG9uIHRocm91Z2ggdGhlIHRlbXBsYXRlIGluc3RlYWQhXG4gICAgY29uc3QgeyBwcm9wcyB9ID0gRGl0b1NwaW5uZXJcbiAgICBwcm9wcy5zaXplLmRlZmF1bHQgPSBzaXplXG4gICAgcHJvcHMuY29sb3IuZGVmYXVsdCA9IGNvbG9yXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWRpcnR5JzogY29tcG9uZW50LmlzRGlydHlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1oZWFkZXIge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItYmxhY2s7XG4gIGZvbnQtc2l6ZTogJG1lbnUtZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gIHotaW5kZXg6ICRtZW51LXotaW5kZXg7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAuZGl0by10cmFpbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGhlaWdodDogM2VtO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGggKyAkY29udGVudC1wYWRkaW5nO1xuXG4gICAgdWwge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG5cbiAgICBhIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcGFkZGluZy1yaWdodDogMC40ZW07XG5cbiAgICAgICRhbmdsZTogMzNkZWc7XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBjb2xvcjogIzk5OTk5OTtcbiAgICAgIH1cblxuICAgICAgJjo6YmVmb3JlLFxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICB3aWR0aDogMXB4O1xuICAgICAgICBoZWlnaHQ6IDEuMmVtO1xuICAgICAgICByaWdodDogLTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWRhcms7XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgkYW5nbGUpO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gICAgICB9XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgYm90dG9tOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0kYW5nbGUpO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b207XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tc3Bpbm5lciB7XG4gICAgbWFyZ2luLXRvcDogJG1lbnUtcGFkZGluZy12ZXI7XG4gIH1cblxuICAuZGl0by1kaXJ0eSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogOHB4O1xuICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwLjVlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYWNjb3VudCxcbiAgLmRpdG8tbG9naW4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5cbiAgLmRpdG8tYWNjb3VudCB7XG4gICAgbGVmdDogJGNvbnRlbnQtd2lkdGggKyAkY29udGVudC1wYWRkaW5nICogMjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCBEb21NaXhpbiBmcm9tICcuL0RvbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHVsbGRvd246IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIHN0YXJ0VGltZTogMCxcbiAgICAgICAgY2hlY2tUaW1lOiB0cnVlLFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBtb3VzZWRvd246ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtb3VzZXVwOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vblB1bGxkb3duTW91c2VVcChudWxsKSkge1xuICAgICAgICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVyczogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25QdWxsZG93bk1vdXNlRG93bih2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldFB1bGxkb3duT3Blbih0cnVlKVxuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93bk1vdXNlVXAodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRUaW1lIH0gPSB0aGlzLnB1bGxkb3duXG4gICAgICBpZiAoIXRoaXMuY2hlY2tUaW1lIHx8IHN0YXJ0VGltZSAmJiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+IDI1MCkpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4oZmFsc2UpXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMub25QdWxsZG93blNlbGVjdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblB1bGxkb3duU2VsZWN0KC8qIHZhbHVlICovKSB7XG4gICAgICAvLyBOT1RFOiBUbyBiZSBvdmVycmlkZGVuLlxuICAgIH0sXG5cbiAgICBzZXRQdWxsZG93bk9wZW4ob3Blbikge1xuICAgICAgdGhpcy5wdWxsZG93bi5vcGVuID0gb3BlblxuICAgICAgdGhpcy5wdWxsZG93bi5zdGFydFRpbWUgPSBvcGVuID8gRGF0ZS5ub3coKSA6IDBcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB0aGlzLnB1bGxkb3duLmV2ZW50cylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1hY2NvdW50XG4gIGEoXG4gICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bigpXCJcbiAgKVxuICAgIHNwYW4ge3sgdXNlci51c2VybmFtZSB9fVxuICB1bC5kaXRvLXB1bGxkb3duKDpjbGFzcz1cInsgJ2RpdG8tb3Blbic6IHB1bGxkb3duLm9wZW4gfVwiKVxuICAgIGxpKFxuICAgICAgdi1mb3I9XCIobGFiZWwsIHZhbHVlKSBvZiBpdGVtc1wiXG4gICAgKVxuICAgICAgYShcbiAgICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bih2YWx1ZSlcIlxuICAgICAgICBAbW91c2V1cD1cIm9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlKVwiXG4gICAgICApIHt7IGxhYmVsIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBQdWxsZG93bk1peGluIGZyb20gJy4uL21peGlucy9QdWxsZG93bk1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9BY2NvdW50Jywge1xuICBtaXhpbnM6IFtQdWxsZG93bk1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczoge1xuICAgICAgICBzZXR0aW5nczogJ1NldHRpbmdzJyxcbiAgICAgICAgbG9nb3V0OiAnTG9nb3V0J1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25QdWxsZG93blNlbGVjdCh2YWx1ZSkge1xuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlICdsb2dvdXQnOlxuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5sb2dvdXQoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3NldHRpbmdzJzpcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1RPRE86IEltcGxlbWVudCBTZXR0aW5ncycpXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1hY2NvdW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICB0b3A6ICRwdWxsZG93bi1wYWRkaW5nLXZlcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIHYtaWY9XCJjb250ZW50XCJcbiAgOmlzPVwib3B0aW9ucy50YWcgfHwgdGFnXCJcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pIHt7IG9wdGlvbnMudGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FbGVtZW50Jywge1xuICBwcm9wczoge1xuICAgIHRhZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzcGFuJyB9LFxuICAgIGNvbnRlbnQ6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBvcHRpb25zKCkge1xuICAgICAgY29uc3QgeyBjb250ZW50IH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNPYmplY3QoY29udGVudCkgPyBjb250ZW50IDogeyB0ZXh0OiBjb250ZW50IH1cbiAgICB9LFxuXG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMuJGF0dHJzLmNsYXNzLFxuICAgICAgICAuLi5hc09iamVjdCh0aGlzLm9wdGlvbnMuY2xhc3MpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMuJGF0dHJzLnN0eWxlLFxuICAgICAgICAuLi5hc09iamVjdCh0aGlzLm9wdGlvbnMuc3R5bGUpXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuXG5mdW5jdGlvbiBhc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gYXNBcnJheSh2YWx1ZSkucmVkdWNlKChvYmplY3QsIGVudHJ5KSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGVudHJ5KSkge1xuICAgICAgb2JqZWN0W2VudHJ5XSA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGVudHJ5KSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmplY3QsIGVudHJ5KVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0XG4gIH0sIHt9KVxufVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50LmRpdG8tbGFiZWwoXG4gIHYtaWY9XCJ0ZXh0IHx8IGNvbGxhcHNpYmxlXCJcbiAgOmlzPVwidGFnXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogaXNBY3RpdmUgfVwiXG4pXG4gIC5kaXRvLWNoZXZyb24oXG4gICAgdi1pZj1cImNvbGxhcHNpYmxlXCJcbiAgICA6Y2xhc3M9XCJ7ICdkaXRvLW9wZW5lZCc6ICFjb2xsYXBzZWQgfVwiXG4gIClcbiAgRGl0b0VsZW1lbnQuZGl0by1sYWJlbC1wcmVmaXgoXG4gICAgdi1mb3I9XCIocHJlZml4LCBpbmRleCkgb2YgcHJlZml4ZXNcIlxuICAgIDprZXk9XCJgcHJlZml4LSR7aW5kZXh9YFwiXG4gICAgdGFnPVwic3BhblwiXG4gICAgOmNvbnRlbnQ9XCJwcmVmaXhcIlxuICApXG4gIGxhYmVsKFxuICAgIDpmb3I9XCJkYXRhUGF0aFwiXG4gICAgdi1odG1sPVwidGV4dFwiXG4gIClcbiAgRGl0b0VsZW1lbnQuZGl0by1sYWJlbC1zdWZmaXgoXG4gICAgdi1mb3I9XCIoc3VmZml4LCBpbmRleCkgb2Ygc3VmZml4ZXNcIlxuICAgIDprZXk9XCJgc3VmZml4LSR7aW5kZXh9YFwiXG4gICAgdGFnPVwic3BhblwiXG4gICAgOmNvbnRlbnQ9XCJzdWZmaXhcIlxuICApXG4gIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0xhYmVsJywge1xuICBlbWl0czogWydleHBhbmQnXSxcblxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZSA/ICdhJyA6ICdkaXYnXG4gICAgfSxcblxuICAgIHRleHQoKSB7XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNPYmplY3QobGFiZWwpID8gbGFiZWw/LnRleHQgOiBsYWJlbFxuICAgIH0sXG5cbiAgICBwcmVmaXhlcygpIHtcbiAgICAgIHJldHVybiBhc0FycmF5KHRoaXMubGFiZWw/LnByZWZpeClcbiAgICB9LFxuXG4gICAgc3VmZml4ZXMoKSB7XG4gICAgICByZXR1cm4gYXNBcnJheSh0aGlzLmxhYmVsPy5zdWZmaXgpXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZSA/IHsgb25DbGljazogdGhpcy5vbkNsaWNrIH0gOiB7fVxuICAgIH0sXG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID09PSB0aGlzXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkNsaWNrKCkge1xuICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IHRoaXNcbiAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZCcsIHRoaXMuY29sbGFwc2VkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWxhYmVsIHtcbiAgLS1sYWJlbC1wYWRkaW5nOiAwO1xuICAvLyBGb3IgYnV0dG9ucyBhbmQgY2hldnJvbiB0byBhbGlnbiByaWdodDpcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBhbGwgaXRlbXMgaW4gdGhlIGxhYmVsLCBlLmcuIGNoZXZyb24sIGVkaXQtYnV0dG9ucy5cbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogdmFyKC0tbGFiZWwtcGFkZGluZyk7XG4gIG1hcmdpbjogMCAwICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuXG4gIGxhYmVsIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgY3Vyc29yOiBpbmhlcml0O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICBsYWJlbCxcbiAgLmRpdG8tbGFiZWwtcHJlZml4LFxuICAuZGl0by1sYWJlbC1zdWZmaXgge1xuICAgICY6bnRoLWxhc3QtY2hpbGQoMikge1xuICAgICAgLy8gVG8gc3RyZXRjaCBlaXRoZXIgbGFiZWwgb3IgLmRpdG8tbGFiZWwtc3VmZml4IHRvIGZ1bGwgYXZhaWxhYmxlIHdpZHRoXG4gICAgICAvLyBzbyB0aGF0IGJ1dHRvbnMgYWx3YXlzIGFwcGVhciByaWdodC1hbGlnbmVkOlxuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgfVxuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJ1xcYTAnOyAvLyAmbmJzcDs7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tbGFiZWwtcHJlZml4LFxuICAuZGl0by1sYWJlbC1zdWZmaXgge1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgLy8gTW92ZSB0aGUgbGFiZWwgcGFkZGluZyBpbnNpZGUgLmRpdG8tYnV0dG9ucywgc28gdGhhdCBpdCBjYXB0dXJlcyBhbGxcbiAgICAvLyBuZWFyIG1vdXNlIGV2ZW50czpcbiAgICBtYXJnaW46IGNhbGMoLTEgKiB2YXIoLS1sYWJlbC1wYWRkaW5nKSk7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgcGFkZGluZzogdmFyKC0tbGFiZWwtcGFkZGluZyk7XG4gIH1cblxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLy8gSW4gb3JkZXIgZm9yIGVsbGlwc2lzIHRvIHdvcmsgb24gbGFiZWxzIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIGxheW91dCxcbiAgICAvLyB3ZSBuZWVkIHRvIHBvc2l0aW9uIGl0IGFic29sdXRlbHkgaW5zaWRlIGl0cyBjb250YWluZXIuXG4gICAgbGFiZWwge1xuICAgICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICAvLyBTaW5jZSA8bGFiZWw+IHVzZXMgYHBvc2l0aW9uOiBhYnNvbHV0ZWAsIHNldCBjb250ZW50IHRvIGEgemVyby13aWR0aFxuICAgICAgLy8gc3BhY2Ugb24gaXRzIHBhcmVudCB0byBlbmZvcmNlIHRoZSByaWdodCB0ZXh0IGhlaWdodCBpbiB0aGUgY29udGFpbmVyXG4gICAgICBjb250ZW50OiAnXFwyMDBiJzsgLy8gemVyby13aWR0aCBzcGFjZTtcbiAgICB9XG4gIH1cbn1cblxuYS5kaXRvLWxhYmVsIHtcbiAgJjpob3ZlciB7XG4gICAgLmRpdG8tY2hldnJvbiB7XG4gICAgICBjb2xvcjogJGNvbG9yLWRhcmtlcjtcbiAgICB9XG4gIH1cblxuICAmOmZvY3VzOm5vdCg6YWN0aXZlLCAuZGl0by1hY3RpdmUpIHtcbiAgICAuZGl0by1jaGV2cm9uIHtcbiAgICAgIC13ZWJraXQtdGV4dC1zdHJva2U6ICRib3JkZXItd2lkdGggJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gICAgLy8gRGlzcGxheSBsYWJlbHMgaW4gY29tcGFjdCBzY2hlbWEgYXMgaW5saW5lLWJsb2NrcywgdG8gYWxsb3cgY29tcGFjdFxuICAgIC8vIGxheW91dHMgd2l0aCBgd2lkdGg6ICdhdXRvJ2AgZWxlbWVudHM6XG4gICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gY29udHJvbCB0aGlzIGJlaGF2aW9yLlxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1jb21wYWN0IHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgPiAuZGl0by1wYW5lIHtcbiAgICAgID4gLmRpdG8tY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7XG4gIGdldEl0ZW1Gb3JtU2NoZW1hLFxuICBnZXRJdGVtSWQsXG4gIGdldEl0ZW1VaWQsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWEsXG5cbiAgICBnZXRJdGVtVWlkLFxuXG4gICAgZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSwgaW5kZXggPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudCAmJiBpbmRleCAhPT0gbnVsbFxuICAgICAgICA/IFN0cmluZyhpbmRleClcbiAgICAgICAgOiBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKVxuICAgIH0sXG5cbiAgICBnZXRJdGVtRGF0YVBhdGgoc291cmNlU2NoZW1hLCBpbmRleCkge1xuICAgICAgbGV0IHsgZGF0YVBhdGggfSA9IHRoaXNcbiAgICAgIGlmIChzb3VyY2VTY2hlbWEgIT09IHRoaXMuc2NoZW1hKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHNvdXJjZVNjaGVtYS5uYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgZGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgaW5kZXgpXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgZmluZEl0ZW1JZEluZGV4KHNvdXJjZVNjaGVtYSwgZGF0YSwgaXRlbUlkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXNUcmFuc2llbnRcbiAgICAgICAgPyAvLyBGb3IgdHJhbnNpZW50IGRhdGEsIHRoZSBpbmRleCBpcyB1c2VkIGFzIHRoZSBpZFxuICAgICAgICAgIGl0ZW1JZFxuICAgICAgICA6IGRhdGE/LmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICB0aGlzLmdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4KSA9PT0gaXRlbUlkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IGluZGV4IDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRJdGVtTGFiZWwoc291cmNlU2NoZW1hLCBpdGVtLCB7XG4gICAgICBpbmRleCA9IG51bGwsXG4gICAgICBleHRlbmRlZCA9IGZhbHNlLFxuICAgICAgYXNPYmplY3QgPSBmYWxzZVxuICAgIH0gPSB7fSkge1xuICAgICAgY29uc3QgeyBpdGVtTGFiZWwgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKCFpdGVtIHx8ICFleHRlbmRlZCAmJiBpdGVtTGFiZWwgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhUGF0aFxuICAgICAgY29uc3QgZ2V0RGF0YVBhdGggPSAoKSA9PlxuICAgICAgICAoZGF0YVBhdGggfHw9IHRoaXMuZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpKVxuXG4gICAgICBsZXQgZm9ybUxhYmVsXG4gICAgICBjb25zdCBnZXRGb3JtTGFiZWwgPSAoKSA9PlxuICAgICAgICAoZm9ybUxhYmVsIHx8PSB0aGlzLmdldExhYmVsKFxuICAgICAgICAgIGdldEl0ZW1Gb3JtU2NoZW1hKHNvdXJjZVNjaGVtYSwgaXRlbSwgdGhpcy5jb250ZXh0KVxuICAgICAgICApKVxuXG4gICAgICBsZXQgdGV4dFxuICAgICAgbGV0IHByZWZpeFxuICAgICAgbGV0IHN1ZmZpeFxuICAgICAgaWYgKGlzRnVuY3Rpb24oaXRlbUxhYmVsKSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1MYWJlbC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICBpbmRleCxcblxuICAgICAgICAgICAgZ2V0IGRhdGFQYXRoKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0YVBhdGgoKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0IGZvcm1MYWJlbCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1MYWJlbCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNPYmplY3QobGFiZWwpKSB7XG4gICAgICAgICAgOyh7IHRleHQsIHByZWZpeCwgc3VmZml4IH0gPSBsYWJlbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gbGFiZWxcbiAgICAgICAgfVxuICAgICAgICAvLyBJdCdzIHVwIHRvIGBpdGVtTGFiZWwoKWAgZW50aXJlbHkgdG8gcHJvZHVjZSB0aGUgbGFiZWw6XG4gICAgICAgIGV4dGVuZGVkID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiAhKGl0ZW1MYWJlbCBpbiBpdGVtKSkge1xuICAgICAgICAvLyBgaXRlbUxhYmVsYCBjYW4gYmUgYm90aCBhIGtleSwgb3Igc2ltcGx5IGEgbGFiZWwuXG4gICAgICAgIHRleHQgPSBpdGVtTGFiZWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExvb2sgdXAgdGhlIG5hbWUgb24gdGhlIGl0ZW0sIGJ5IHRoZXNlIHJ1bGVzOlxuICAgICAgICAvLyAxLiBJZiBgaXRlbUxhYmVsYCBpcyBhIHN0cmluZywgdXNlIGl0IGFzIHRoZSBwcm9wZXJ0eSBrZXlcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBhcmUgY29sdW1ucywgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3RcbiAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBzZWUgaWYgdGhlIGl0ZW0gaGFzIGEgcHJvcGVydHkgbmFtZWQgJ25hbWUnXG4gICAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gc291cmNlU2NoZW1hXG4gICAgICAgIGNvbnN0IGtleSA9IChcbiAgICAgICAgICBpc1N0cmluZyhpdGVtTGFiZWwpICYmIGl0ZW1MYWJlbCB8fFxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucylbMF0gfHxcbiAgICAgICAgICAnbmFtZSdcbiAgICAgICAgKVxuICAgICAgICB0ZXh0ID0gaXRlbVtrZXldXG4gICAgICB9XG4gICAgICBjb25zdCBoYWRMYWJlbCA9ICEhdGV4dFxuICAgICAgLy8gSWYgbm8gbGFiZWwgd2FzIGZvdW5kIHNvIGZhciwgdHJ5IHRvIHByb2R1Y2Ugb25lIGZyb20gdGhlIGluZGV4LlxuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAvLyBBbHdheXMgdXNlIGV4dGVuZGVkIHN0eWxlIHdoZW4gYXV0by1nZW5lcmF0aW5nIGxhYmVscyBmcm9tIGluZGV4L2lkOlxuICAgICAgICBleHRlbmRlZCA9IHRydWVcbiAgICAgICAgdGV4dCA9XG4gICAgICAgICAgaXNMaXN0U291cmNlKHNvdXJjZVNjaGVtYSkgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgICAgID8gKHRleHQgPSBgJHtpbmRleCArIDF9YClcbiAgICAgICAgICAgIDogJydcbiAgICAgIH1cbiAgICAgIGlmIChleHRlbmRlZCkge1xuICAgICAgICBjb25zdCBmb3JtTGFiZWwgPSBnZXRGb3JtTGFiZWwoKVxuICAgICAgICBpZiAoZm9ybUxhYmVsKSB7XG4gICAgICAgICAgLy8gSWYgYSBsYWJlbCB3YXMgcHJvdmlkZWQsIHB1dCBpbiBxdW90ZXMgd2hlbiBwcmVmaXhlZCB3aXRoIHRoZVxuICAgICAgICAgIC8vIGZvcm0gbGFiZWwgZm9yIHRoZSBleHRlbmRlZCBzdHlsZTpcbiAgICAgICAgICB0ZXh0ID0gYCR7Zm9ybUxhYmVsfSAke2hhZExhYmVsID8gYCcke3RleHR9J2AgOiB0ZXh0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzT2JqZWN0ID8geyB0ZXh0LCBwcmVmaXgsIHN1ZmZpeCB9IDogdGV4dFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNjaGVtYVxuICAuZGl0by1zY2hlbWEtY29udGVudFxuICAgIC5kaXRvLXNjaGVtYS1oZWFkZXIoXG4gICAgICB2LWlmPVwiaGFzTGFiZWwgfHwgaGFzVGFicyB8fCBjbGlwYm9hcmRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1zY2hlbWEtbWVudS1oZWFkZXInOiBtZW51SGVhZGVyIH1cIlxuICAgIClcbiAgICAgIERpdG9MYWJlbChcbiAgICAgICAgdi1pZj1cImhhc0xhYmVsXCJcbiAgICAgICAgOmxhYmVsPVwibGFiZWxcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICAgICAgOmNvbGxhcHNlZD1cIiFvcGVuZWRcIlxuICAgICAgICBAZXhwYW5kPVwib25FeHBhbmRcIlxuICAgICAgKVxuICAgICAgICAvLy0gUGFzcyBlZGl0LWJ1dHRvbnMgdGhyb3VnaCB0byBkaXRvLWxhYmVsJ3Mgb3duIGVkaXQtYnV0dG9ucyBzbG90OlxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWlmPVwiaW5saW5lZFwiXG4gICAgICAgICAgI2VkaXQtYnV0dG9uc1xuICAgICAgICApXG4gICAgICAgICAgc2xvdChuYW1lPVwiZWRpdC1idXR0b25zXCIpXG4gICAgICBEaXRvVGFicyhcbiAgICAgICAgdi1pZj1cInRhYnNcIlxuICAgICAgICA6dGFicz1cInRhYnNcIlxuICAgICAgICA6c2VsZWN0ZWRUYWI9XCJzZWxlY3RlZFRhYlwiXG4gICAgICApXG4gICAgICBEaXRvQ2xpcGJvYXJkKFxuICAgICAgICA6Y2xpcGJvYXJkPVwiY2xpcGJvYXJkXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cImhhc1RhYnNcIlxuICAgIClcbiAgICAgIERpdG9QYW5lLmRpdG8tcGFuZS10YWIoXG4gICAgICAgIHYtZm9yPVwiKHRhYlNjaGVtYSwgdGFiKSBpbiB0YWJzXCJcbiAgICAgICAgcmVmPVwidGFic1wiXG4gICAgICAgIDprZXk9XCJ0YWJcIlxuICAgICAgICA6dmlzaWJsZT1cInNlbGVjdGVkVGFiID09PSB0YWJcIlxuICAgICAgICA6dGFiPVwidGFiXCJcbiAgICAgICAgOnNjaGVtYT1cInRhYlNjaGVtYVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6c2luZ2xlPVwiIWlubGluZWQgJiYgIWhhc01haW5QYW5lXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJnZW5lcmF0ZUxhYmVsc1wiXG4gICAgICApXG4gICAgVHJhbnNpdGlvbkhlaWdodCg6ZW5hYmxlZD1cImlubGluZWRcIilcbiAgICAgIERpdG9QYW5lLmRpdG8tcGFuZS1tYWluKFxuICAgICAgICB2LWlmPVwiaGFzTWFpblBhbmUgJiYgb3BlbmVkXCJcbiAgICAgICAgcmVmPVwiY29tcG9uZW50c1wiXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOnNpbmdsZT1cIiFpbmxpbmVkICYmICFoYXNUYWJzXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJnZW5lcmF0ZUxhYmVsc1wiXG4gICAgICApXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIhaW5saW5lZCAmJiBpc1BvcHVsYXRlZFwiXG4gICAgICBuYW1lPVwiYnV0dG9uc1wiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWlmPVwiaW5saW5lZFwiXG4gIClcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiFoYXNMYWJlbFwiXG4gICAgICBuYW1lPVwiZWRpdC1idXR0b25zXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtZWxzZS1pZj1cImlzUG9wdWxhdGVkXCJcbiAgKVxuICAgIERpdG9QYW5lbHMoXG4gICAgICA6cGFuZWxzPVwicGFuZWxTY2hlbWFzXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNBcnJheSxcbiAgaXNGdW5jdGlvbixcbiAgaXNSZWdFeHAsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBsYWJlbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgVHJhbnNpdGlvbkhlaWdodCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0l0ZW1NaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoLCBnZXRQYXJlbnRJdGVtIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0UGFuZWxTY2hlbWFzLFxuICBzZXREZWZhdWx0VmFsdWVzLFxuICBwcm9jZXNzRGF0YVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRTdG9yZUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYScsIHtcbiAgbWl4aW5zOiBbSXRlbU1peGluXSxcbiAgY29tcG9uZW50czogeyBUcmFuc2l0aW9uSGVpZ2h0IH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBpbmplY3Q6IFtcbiAgICAnJHNjaGVtYVBhcmVudENvbXBvbmVudCdcbiAgXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgaW5saW5lZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBnZW5lcmF0ZUxhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGFzT3duRGF0YTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG1lbnVIZWFkZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIHJldHVybiB7XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gcHJvdmlkZSBtb3JlIGRhdGEgdGhyb3VnaCBgc2NoZW1hLmRhdGFgLCB2dWUtc3R5bGU6XG4gICAgICAuLi4oXG4gICAgICAgIGRhdGEgJiYgaXNGdW5jdGlvbihkYXRhKVxuICAgICAgICAgID8gZGF0YS5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBzY2hlbWFDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHBhcmVudFNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIERvbid0IHJldHVybiB0aGUgYWN0dWFsIHBhcmVudCBzY2hlbWEgaXMgdGhpcyBzY2hlbWEgaGFuZGxlcyBpdHMgb3duXG4gICAgICAvLyBkYXRhLiBUaGlzIHByZXZlbnRzIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoZSBwYXJlbnQsIGFuZCByZWdpc3RlcmluZ1xuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIHRoZSBwYXJlbnQgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBzZXQgaXNEaXJ0eSBmbGFncy5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyBudWxsIDogdGhpcy5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhbmVsU2NoZW1hcygpIHtcbiAgICAgIGNvbnN0IHBhbmVscyA9IGdldFBhbmVsU2NoZW1hcyh0aGlzLnNjaGVtYS5wYW5lbHMsICcnKVxuICAgICAgZm9yIChjb25zdCBwYW5lIG9mIHRoaXMucGFuZXMpIHtcbiAgICAgICAgcGFuZWxzLnB1c2goLi4ucGFuZS5wYW5lbFNjaGVtYXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFuZWxzXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIHNlbGVjdGVkVGFiKCkge1xuICAgICAgY29uc3QgY3VycmVudFRhYiA9IHRoaXMuJHJvdXRlLmhhc2g/LnNsaWNlKDEpIHx8IG51bGxcbiAgICAgIGNvbnN0IHRhYiA9XG4gICAgICAgIGN1cnJlbnRUYWIgJiYgdGhpcy5zaG91bGRSZW5kZXIodGhpcy50YWJzW2N1cnJlbnRUYWJdKVxuICAgICAgICAgID8gY3VycmVudFRhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiPy5uYW1lIHx8IG51bGxcbiAgICAgIGlmICh0YWIgIT09IGN1cnJlbnRUYWIpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHdhdGNoZXIhXG4gICAgICAgIC8vIEFueSB0YWIgY2hhbmdlIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcm91dGVyIGFsc28uXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgaGFzaDogYCMke3RhYn1gIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGFiXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIE9iamVjdC52YWx1ZXModGhpcy50YWJzKSkge1xuICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFRhYiB9ID0gdGFiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGdW5jdGlvbihkZWZhdWx0VGFiKVxuICAgICAgICAgICAgICA/IGRlZmF1bHRUYWIuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQpXG4gICAgICAgICAgICAgIDogZGVmYXVsdFRhYlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgICAgICBmaXJzdCA9IHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGNsaXBib2FyZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYT8uY2xpcGJvYXJkXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZERhdGEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGF0YSh7IHRhcmdldDogJ3NlcnZlcicsIHNjaGVtYU9ubHk6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkRGF0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRzY2hlbWE6IHRoaXMuc2NoZW1hLm5hbWUsXG4gICAgICAgIC4uLnRoaXMucHJvY2Vzc0RhdGEoeyB0YXJnZXQ6ICdjbGlwYm9hcmQnLCBzY2hlbWFPbmx5OiB0cnVlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgc2ltaWxhciB0byBgRGl0b0NvbnRleHRgXG4gICAgLy8gcHJvcGVydGllcywgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZXNlIG9uIGB0aGlzYCBhcyB3ZWxsOlxuICAgIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAgIC8vIHRlcm0gYGl0ZW1gIGlzIHVzZWQgZm9yIHRoZSBkYXRhIHRoYXQgcmVsYXRlcyB0byBlZGl0aW5nIG9iamVjdHMuXG4gICAgLy8gTk9URTogVGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhczpcbiAgICAvLyByZXR1cm4gZ2V0SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCBmYWxzZSlcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICByb290SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3REYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWREYXRhXG4gICAgfSxcblxuICAgIGNsaXBib2FyZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGlwYm9hcmREYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZGF0ZWQpXG4gICAgfSxcblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxhYmVsIHx8IHRoaXMuY29sbGFwc2libGVcbiAgICB9LFxuXG4gICAgaGFzVGFicygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pbmxpbmVkICYmICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGhhc01haW5QYW5lKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuICEhY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIG9wZW5lZDogZ2V0U3RvcmVBY2Nlc3Nvcignb3BlbmVkJywge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbGxhcHNlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50cygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50c0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgIHRoaXMuZGVsZWdhdGUoJ2NoYW5nZScsIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50KVxuICAgIHRoaXMuZW1pdEV2ZW50KCdpbml0aWFsaXplJykgLy8gTm90IGAnY3JlYXRlJ2AsIHNpbmNlIHRoYXQncyBmb3IgZGF0YS5cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZW1pdEV2ZW50KCdkZXN0cm95JylcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHNCeU5hbWUoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5TmFtZSh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5TmFtZShuYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXModGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnQoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLnBhbmVsc0J5RGF0YVBhdGgsIGRhdGFQYXRoT3JOYW1lLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0UGFuZWwoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIHNvbWVDb21wb25lbnQoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmlzUG9wdWxhdGVkICYmIHRoaXMuY29tcG9uZW50cy5zb21lKGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBldmVyeUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLmV2ZXJ5KGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBvbkV4cGFuZChleHBhbmQpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdleHBhbmQnLCB7XG4gICAgICAgIC8vIFRPRE86IEFjdHVhbGx5IGV4cG9zZSB0aGlzIG9uIERpdG9Db250ZXh0P1xuICAgICAgICBjb250ZXh0OiB7IGV4cGFuZCB9XG4gICAgICB9KVxuICAgICAgLy8gUHJldmVudCBjbG9zaW5nIHRoZSBzY2hlbWEgd2l0aCBpbnZhbGlkIGRhdGEsIHNpbmNlIHRoZSBpbi1jb21wb25lbnRcbiAgICAgIC8vIHZhbGlkYXRpb24gd2lsbCBub3QgYmUgZXhlY3V0ZWQgb25jZSBpdCdzIGNsb3NlZC5cblxuICAgICAgLy8gVE9ETzogTW92ZSB2YWxpZGF0aW9uIG91dCBvZiBjb21wb25lbnRzLCB0byBzY2hlbWEsIGp1c3QgbGlrZVxuICAgICAgLy8gcHJvY2Vzc2luZywgYW5kIHVzZSBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgZm9yIHRoZSByZXN1bHRpbmcgZXJyb3JzLFxuICAgICAgLy8gdGhlbiByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgc2luY2Ugd2UgY2FuIHZhbGlkYXRlIGNsb3NlZCBmb3JtcyBhbmRcbiAgICAgIC8vIHNjaGVtYXMgdGhlbi5cbiAgICAgIGlmICghdGhpcy5vcGVuZWQgfHwgZXhwYW5kIHx8IHRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICB0aGlzLm9wZW5lZCA9IGV4cGFuZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/LmZvY3VzKClcbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZUFsbChtYXRjaCwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzQnlEYXRhUGF0aCB9ID0gdGhpc1xuICAgICAgbGV0IGRhdGFQYXRoc1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gaXNGdW5jdGlvbihtYXRjaClcbiAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgOiBpc1JlZ0V4cChtYXRjaClcbiAgICAgICAgICAgID8gZmllbGQgPT4gbWF0Y2gudGVzdChmaWVsZClcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBkYXRhUGF0aHMgPSBjaGVja1xuICAgICAgICAgID8gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpLmZpbHRlcihjaGVjaylcbiAgICAgICAgICA6IGlzQXJyYXkobWF0Y2gpXG4gICAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgICA6IFttYXRjaF1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWVcbiAgICAgIGxldCBmaXJzdCA9IHRydWVcbiAgICAgIGRhdGFQYXRocyB8fD0gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpXG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIG9mIGRhdGFQYXRocykge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aClcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmICghY29tcG9uZW50LnZhbGlkYXRlKG5vdGlmeSkpIHtcbiAgICAgICAgICAgIC8vIEZvY3VzIGZpcnN0IGVycm9yIGZpZWxkXG4gICAgICAgICAgICBpZiAobm90aWZ5ICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5mb2N1cygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkgJiYgIWlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlFcnJvcnMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzVmFsaWRcbiAgICB9LFxuXG4gICAgdmVyaWZ5QWxsKG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFsbChtYXRjaCwgZmFsc2UpXG4gICAgfSxcblxuICAgIGFzeW5jIHNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgZm9jdXMpIHtcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgY29uc3QgdW5tYXRjaGVkID0gW11cbiAgICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBlcnJzXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIC8vIElmIHRoZSBzY2hlbWEgaXMgYSBkYXRhLXJvb3QsIHByZWZpeCBpdHMgb3duIGRhdGFQYXRoIHRvIGFsbCBlcnJvcnMsXG4gICAgICAgIC8vIHNpbmNlIHRoZSBkYXRhIHRoYXQgaXQgc2VuZHMgYW5kIHZhbGlkYXRlcyB3aWxsIGJlIHVucHJlZml4ZWQuXG4gICAgICAgIGNvbnN0IGZ1bGxEYXRhUGF0aCA9IHRoaXMuaGFzT3duRGF0YVxuICAgICAgICAgID8gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgZGF0YVBhdGgpXG4gICAgICAgICAgOiBkYXRhUGF0aFxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLCB0aGlzLmRhdGFQYXRoLCB0aGlzLmhhc093bkRhdGEsIGZ1bGxEYXRhUGF0aClcbiAgICAgICAgLy8gQ29udmVydCBmcm9tIEphdmFTY3JpcHQgcHJvcGVydHkgYWNjZXNzIG5vdGF0aW9uLCB0byBvdXIgb3duIGZvcm1cbiAgICAgICAgLy8gb2YgcmVsYXRpdmUgSlNPTiBwb2ludGVycyBhcyBkYXRhLXBhdGhzOlxuICAgICAgICBjb25zdCBkYXRhUGF0aFBhcnRzID0gcGFyc2VEYXRhUGF0aChmdWxsRGF0YVBhdGgpXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNob3dWYWxpZGF0aW9uRXJyb3JzKGVycnMsIGZpcnN0ICYmIGZvY3VzKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlXG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGEgY29tcG9uZW50IGluIGFuIGFjdGl2ZSBmb3JtIGZvciB0aGUgZ2l2ZW4gZGF0YVBhdGguXG4gICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBmaW5kIGEgY29tcG9uZW50IHNlcnZpbmcgYSBwYXJ0IG9mIHRoZSBkYXRhUGF0aCxcbiAgICAgICAgICAvLyBhbmQgdGFrZSBpdCBmcm9tIHRoZXJlOlxuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZGF0YVBhdGhQYXJ0cy5wb3AoKVxuICAgICAgICAgIHdoaWxlIChkYXRhUGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhd2FpdCBjb21wb25lbnQubmF2aWdhdGVUb0NvbXBvbmVudD8uKFxuICAgICAgICAgICAgICAgICAgZnVsbERhdGFQYXRoLFxuICAgICAgICAgICAgICAgICAgc3ViQ29tcG9uZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHN1YkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJzID0gZXJyb3JzW2NvbXBvbmVudC5kYXRhUGF0aF1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5lc3RlZCBmb3JtIHRvIGRpc3BsYXkgYXQgbGVhc3QgcGFydHMgZm8gdGhlIGVycm9ycy5cbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBzaG93IGFsbCBlcnJvcnMgYXQgb25jZSwgc28gd2UncmUgZG9uZS4gRG9uJ3QgY2FsbFxuICAgICAgICAgICAgICAgIC8vIGBub3RpZnlFcnJvcnMoKWAgeWV0LCBhcyB3ZSBjYW4gb25seSBkaXNwbGF5IGl0IG9uY2VcbiAgICAgICAgICAgICAgICAvLyBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgd2FzIGNhbGxlZCBmcm9tIGBEaXRvRm9ybS5tb3VudGVkKClgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0aWxsIGhlcmUsIHNvIGtlZXAgcmVtb3ZpbmcgdGhlIGxhc3QgcGFydCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gICAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdoZW4gdGhlIGVycm9yIGNhbid0IGJlIG1hdGNoZWQsIGFkZCBpdCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkXG4gICAgICAgICAgLy8gZXJyb3JzIHdpdGggZGVjZW50IG1lc3NhZ2UsIHRvIHJlcG9ydCBhdCB0aGUgZW5kLlxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbGFiZWxpemUocHJvcGVydHkpXG4gICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJycykge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gZmllbGRcbiAgICAgICAgICAgICAgPyBgVGhlIGZpZWxkICR7ZmllbGR9YFxuICAgICAgICAgICAgICA6IGBUaGUgJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICAgICB1bm1hdGNoZWQucHVzaChgJHtwcmVmaXh9ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycyh1bm1hdGNoZWQuam9pbignXFxuJykpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG5vdGlmeUVycm9ycyhtZXNzYWdlKSB7XG4gICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIHRpdGxlOiAnVmFsaWRhdGlvbiBFcnJvcnMnLFxuICAgICAgICB0ZXh0OiBtZXNzYWdlIHx8ICdQbGVhc2UgY29ycmVjdCB0aGUgaGlnaGxpZ2h0ZWQgZXJyb3JzLidcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlc2V0RGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbid0IHNldCBgdGhpcy5kYXRhID0gLi4uYCBiZWNhdXNlIGl0J3MgYSBwcm9wZXJ0eSwgYnV0IHdlIGNhbiBzZXRcbiAgICAgIC8vIGFsbCBrbm93biBwcm9wZXJ0aWVzIG9uIGl0IHRvIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnlcbiAgICAgIC8vIGBzZXREZWZhdWx0VmFsdWVzKClgLCBhcyB0aGV5IGFyZSBhbGwgcmVhY3RpdmUgYWxyZWFkeSBmcm9tIHRoZSBzdGFydHM6XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGF0YSwgc2V0RGVmYXVsdFZhbHVlcyh0aGlzLnNjaGVtYSwge30sIHRoaXMpKVxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1tdXRhdGluZy1wcm9wc1xuICAgICAgICAgIHRoaXMuZGF0YVtuYW1lXSA9IGRhdGFbbmFtZV1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHNCeU5hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5tYXJrRGlydHkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmaWx0ZXJEYXRhKGRhdGEpIHtcbiAgICAgIC8vIEZpbHRlcnMgb3V0IGFycmF5cyBhbmQgb2JqZWN0cyB0aGF0IGFyZSBiYWNrIGJ5IGRhdGEgcmVzb3VyY2VzXG4gICAgICAvLyB0aGVtc2VsdmVzLCBhcyB0aG9zZSBhcmUgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aHJvdWdoIHRoZWlyIG93biBBUElcbiAgICAgIC8vIHJlc291cmNlIGVuZC1wb2ludHMgYW5kIHNob3VsZG4ndCBiZSBzZXQuXG4gICAgICBjb25zdCBjb3B5ID0ge31cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKVxuICAgICAgICAgIGlmIChjb21wb25lbnRzLnNvbWUoY29tcG9uZW50ID0+IGNvbXBvbmVudC5wcm92aWRlc0RhdGEpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb3B5W25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5XG4gICAgfSxcblxuICAgIHByb2Nlc3NEYXRhKHsgdGFyZ2V0ID0gJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHkgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NEYXRhKFxuICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgdGhpcy5zb3VyY2VTY2hlbWEsXG4gICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAge1xuICAgICAgICAgIC8vIE5lZWRlZCBmb3IgRGl0b0NvbnRleHQgaGFuZGxpbmcgaW5zaWRlIGBwcm9jZXNzRGF0YWAgYW5kXG4gICAgICAgICAgLy8gYHByb2Nlc3NTY2hlbWFEYXRhKClgOlxuICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICBzY2hlbWFPbmx5LFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIGAkc2NoZW1hUGFyZW50Q29tcG9uZW50KClgIGlzIG9ubHkgc2V0IGlmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIHVzZXNcbiAgICAgIC8vIHRoZSBgU2NoZW1hUGFyZW50TWl4aW5gOlxuICAgICAgdGhpcy4kc2NoZW1hUGFyZW50Q29tcG9uZW50KCk/Ll9yZWdpc3RlclNjaGVtYUNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZCkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJFbnRyeSh0aGlzLmNvbXBvbmVudHNSZWdpc3RyeSwgY29tcG9uZW50LCBhZGQpXG4gICAgICAvLyBPbmx5IHJlZ2lzdGVyIHdpdGggdGhlIHBhcmVudCBpZiBzY2hlbWEgc2hhcmVzIGRhdGEgd2l0aCBpdC5cbiAgICAgIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50Py5fcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50LCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmUocGFuZSwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZXNSZWdpc3RyeSwgcGFuZSwgYWRkKVxuICAgIH0sXG5cbiAgICBfcmVnaXN0ZXJQYW5lbChwYW5lbCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZWxzUmVnaXN0cnksIHBhbmVsLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckVudHJ5KHJlZ2lzdHJ5LCBlbnRyeSwgYWRkKSB7XG4gICAgICBjb25zdCB1aWQgPSBlbnRyeS4kdWlkXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHJlZ2lzdHJ5W3VpZF0gPSBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W3VpZF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2xpc3RFbnRyaWVzQnlEYXRhUGF0aChyZWdpc3RyeSkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVnaXN0cnkpLnJlZHVjZSgoZW50cmllc0J5RGF0YVBhdGgsIGVudHJ5KSA9PiB7XG4gICAgICAgIC8vIE11bHRpcGxlIGVudHJpZXMgY2FuIGJlIGxpbmtlZCB0byB0aGUgc2FtZSBkYXRhLXBhdGgsIGUuZy4gd2hlblxuICAgICAgICAvLyB0aGVyZSBhcmUgdGFicy4gTGluayBlYWNoIGRhdGEtcGF0aCB0byBhbiBhcnJheSBvZiBlbnRyaWVzLlxuICAgICAgICBjb25zdCB7IGRhdGFQYXRoIH0gPSBlbnRyeVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gKGVudHJpZXNCeURhdGFQYXRoW2RhdGFQYXRoXSB8fD0gW10pXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgcmV0dXJuIGVudHJpZXNCeURhdGFQYXRoXG4gICAgICB9LCB7fSlcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXMoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoKS5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgID8gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICAgICAgOiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIF9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpXSB8fCBbXSxcbiAgICAgICAgbWF0Y2hcbiAgICAgIClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgbmFtZSldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZmlsdGVyRW50cmllcyhlbnRyaWVzLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoID8gZW50cmllcy5maWx0ZXIobWF0Y2gpIDogZW50cmllc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8vIFRvIGRpc3BsYXkgc2NoZW1hIG5leHQgdG8gcGFuZWxzOlxuICBkaXNwbGF5OiBmbGV4O1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuXG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgIGZsZXg6IDEgMSAxMDAlO1xuICAgIC8vIFNvIHRoYXQgc2NoZW1hIGJ1dHRvbnMgY2FuIGJlIHN0aWNreSB0byB0aGUgYm90dG9tOlxuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudDtcblxuICAgID4gKjpvbmx5LWNoaWxkIHtcbiAgICAgIGdyaWQtcm93LWVuZDogbm9uZTtcbiAgICB9XG5cbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMsXG4gID4gLmRpdG8tcGFuZWxzIHtcbiAgICBmbGV4OiAxIDEgMCU7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG5cbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmcgJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nIDA7XG4gIH1cblxuICAvLyBEaXNwbGF5IGEgcnVsZXIgYmV0d2VlbiB0YWJiZWQgY29tcG9uZW50cyBhbmQgdG93YXJkcyB0aGUgLmRpdG8tYnV0dG9uc1xuICAuZGl0by1wYW5lLXRhYiArIC5kaXRvLXBhbmUtbWFpbiB7XG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIC8vIFVzZSBhIHBzZXVkbyBlbGVtZW50IHRvIGRpc3BsYXkgYSBydWxlciB3aXRoIHByb3BlciBtYXJnaW5zXG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpbiB0byB0aGUgcnVsZXJcbiAgICAgIG1hcmdpbjogJGNvbnRlbnQtcGFkZGluZyAkZm9ybS1zcGFjaW5nLWhhbGYgJGZvcm0tc3BhY2luZy1oYWxmO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gIC5kaXRvLXRhYnMsXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgfVxuXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgJjpvbmx5LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIH1cblxuICAgIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW46IDAgMCAkdGFiLW1hcmdpbiAkdGFiLW1hcmdpbjtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyIHtcbiAgICAvLyBCcmluZyB0aGUgdGFicyB1cCB0byB0aGUgbWVudS5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaGVpZ2h0OiAkbWVudS1oZWlnaHQ7XG4gICAgcGFkZGluZzogMCAkbWVudS1wYWRkaW5nLWhvcjtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6ICRtZW51LXotaW5kZXg7XG4gICAgLy8gVHVybiBvZmYgcG9pbnRlciBldmVudHMgc28gdGhhdCBEaXRvVHJhaWwga2VlcHMgcmVjZWl2aW5nIGV2ZW50cy4uLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC8vIC4uLmJ1dCBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0YWJzIGFuZCBidXR0b25zIChlLmcuIGNsaXBib2FyZClcbiAgICAvLyBsYXllcmVkIG9uIHRvcCBvZiBEaXRvVHJhaWwuXG4gICAgLmRpdG8tdGFicyxcbiAgICAuZGl0by1idXR0b25zIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICAgICAgZm9udC1zaXplOiAkbWVudS1mb250LXNpemU7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uLmRpdG8tbGFiZWwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIENhdGNoIGFsbCBjbGlja3MsIGV2ZW4gd2hlbiBpdCB3b3VsZCBiZSBwYXJ0aWFsbHkgY292ZXJlZCBieSBzY2hlbWEuXG4gICAgei1pbmRleDogMTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvU2NoZW1hLmRpdG8tc2NoZW1hLWlubGluZWQoXG4gIDpzY2hlbWE9XCJzY2hlbWFcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gIDpkYXRhPVwiZGF0YVwiXG4gIDptZXRhPVwibWV0YVwiXG4gIDpzdG9yZT1cInN0b3JlXCJcbiAgOmxhYmVsPVwiaXNDb21wYWN0ID8gbnVsbCA6IGxhYmVsXCJcbiAgOmlubGluZWQ9XCJ0cnVlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1jb21wYWN0JzogaXNDb21wYWN0IH1cIlxuKVxuICAvLy0gUmVuZGVyIGRpdG8tZWRpdC1idXR0b25zIGZvciBpbmxpbmVkIHNjaGVtYXMgc2VwYXJhdGVseSBmcm9tIGFsbFxuICAvLy0gb3RoZXJzIGluIGBUeXBlTGlzdGAgYXMgYSBzY29wZSwgZm9yIGJldHRlciBoYW5kbGluZyBvZiBsYXlvdXQuXG4gIHRlbXBsYXRlKCNlZGl0LWJ1dHRvbnMpXG4gICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgdi1pZj1cImRlbGV0YWJsZSB8fCBkcmFnZ2FibGUgfHwgZWRpdGFibGVcIlxuICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICBAZGVsZXRlPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzQ29tcGFjdCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYUlubGluZWQnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDb21wYWN0KCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGFjdCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNDb21wYWN0ICYmICEhdGhpcy5sYWJlbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYS1pbmxpbmVkIHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tc2NoZW1hLWhlYWRlciB7XG4gICAgICAvLyBDaGFuZ2Ugc3BhY2luZyBzbyAuZGl0by1sYWJlbCBjb3ZlcnMgdGhlIGZ1bGwgLmRpdG8tc2NoZW1hLWhlYWRlci5cbiAgICAgIG1hcmdpbjogLSRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpblxuICAgICAgICAtLWxhYmVsLXBhZGRpbmc6ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC8vIEJlY2F1c2UgdGFibGVzIGhhdmUgYSBmdW5ueSB3YXkgb2YgYWxsb3dpbmcgdG9vIG11Y2ggd2lkdGggZ3Jvd3RoOlxuICAgICAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgICAgICAvLyBQcmV2ZW50IGNvbGxhcHNpbmcgdG8gbWluLWhlaWdodCB3aGVuIGFsb25lIGluXG4gICAgICAgIC8vIC5kaXRvLXNjaGVtYS1jb250ZW50LCBkdWUgdG8gZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudFxuICAgICAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgICB9XG5cbiAgICAgICYgKyAuZGl0by1wYW5lIHtcbiAgICAgICAgLy8gTmVlZGVkIGZvciB0cmFuc2l0aW9uLWhlaWdodCBpbiBEaXRvU2NoZW1hOlxuICAgICAgICBtaW4taGVpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lKFxuICB2LWlmPVwiaXNQb3B1bGF0ZWQgJiYgY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPiAwXCJcbiAgdi1zaG93PVwidmlzaWJsZVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9IGluIGNvbXBvbmVudFNjaGVtYXNgXG4gIClcbiAgICAuZGl0by1icmVhayhcbiAgICAgIHYtaWY9XCJzY2hlbWEuYnJlYWsgPT09ICdiZWZvcmUnXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwibmVzdGVkRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpzaW5nbGU9XCJpc1NpbmdsZUNvbXBvbmVudFwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYWZ0ZXInXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldEFsbFBhbmVsU2NoZW1hcywgaXNOZXN0ZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmUnLCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHZpc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWIgPyB0aGlzIDogdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgY29tcG9uZW50U2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBjb21wb25lbnRzIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzXG4gICAgICAvLyBhbmQgYWRkcyB0aGUga2V5IGFzIHRoZSBuYW1lIHRvIGVhY2ggY29tcG9uZW50LCB1c2VkIGZvciBsYWJlbHMsIGV0Yy5cbiAgICAgIC8vIE5PVEU6IHNjaGVtYSBjYW4gYmUgbnVsbCB3aGlsZSBtdWx0aS1mb3JtIGxpc3RzIGxvYWQgdGhlaXIgZGF0YSxcbiAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgYXZhaWxhYmxlIGRhdGEgd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZm9ybS5cbiAgICAgIC8vIFdoZW4gZWRpdGluZyBwcmltaXRpdmUgdmFsdWVzIHRocm91Z2ggYSBmb3JtLCBkbyBub3QgYXBwZW5kICduYW1lJyB0b1xuICAgICAgLy8gdGhlIGNvbXBvbmVudCdzIGRhdGFQYXRoIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gZnJvbSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIC8vIE5PVEU6IE5vdCBhbGwgc2NoZW1hcyAvIGNvbXBvbmVudHMgaGF2ZSBhIHNvdXJjZVNjaGVtYSwgZS5nLiBkaWFsb2dzLlxuICAgICAgY29uc3Qgd3JhcFByaW1pdGl2ZXMgPSB0aGlzLnNvdXJjZVNjaGVtYT8ud3JhcFByaW1pdGl2ZXNcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYT8uY29tcG9uZW50cyB8fCB7fSkubWFwKFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAvLyBBbHdheXMgYWRkIG5hbWUgdG8gY29tcG9uZW50IHNjaGVtYS5cbiAgICAgICAgICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiBuZXN0ZWQgPyB0aGlzLmdldENoaWxkU3RvcmUobmFtZSkgOiB0aGlzLnN0b3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHBhbmVsU2NoZW1hcygpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFuZWwgc2NoZW1hcyBmcm9tIGFsbCBjb21wb25lbnQgc2NoZW1hcywgYnkgZmluZGluZyB0aG9zZVxuICAgICAgLy8gdGhhdCB3YW50IHRvIHByb3ZpZGUgYSBwYW5lbC4gU2VlIGBnZXRBbGxQYW5lbFNjaGVtYXMoKWAgZm9yIGRldGFpbHMuXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTY2hlbWFzLmZsYXRNYXAoXG4gICAgICAgICh7IHNjaGVtYSwgbmVzdGVkRGF0YVBhdGg6IGRhdGFQYXRoIH0pID0+XG4gICAgICAgICAgZ2V0QWxsUGFuZWxTY2hlbWFzKFxuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMudGFiQ29tcG9uZW50XG4gICAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1NpbmdsZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpbmdsZSAmJiB0aGlzLmNvbXBvbmVudFNjaGVtYXMubGVuZ3RoID09PSAxXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJQYW5lKHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy50YWIpIHtcbiAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBoYXNoOiBgIyR7dGhpcy50YWJ9YCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgLy8gUmVtb3ZlIHRoZSBwYWRkaW5nIGFkZGVkIGJ5IGAuZGl0by1jb250YWluZXJgIGluc2lkZSBgLmRpdG8tcGFuZWA6XG4gIG1hcmdpbjogKC0kZm9ybS1zcGFjaW5nKSAoLSRmb3JtLXNwYWNpbmctaGFsZik7XG4gIC8vIEFkZCByZW1vdmVkIGhvcml6b250YWwgbWFyZ2luIGFnYWluIHRvIG1heC13aWR0aDpcbiAgbWF4LXdpZHRoOiAkY29udGVudC13aWR0aCArIDIgKiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gIC8vIFVzZSBgZmxleDogMCVgIGZvciBhbGwgYC5kaXRvLXBhbmVgIGV4Y2VwdCBgLmRpdG8tcGFuZS1tYWluYCxcbiAgLy8gc28gdGhhdCB0aGUgYC5kaXRvLWJ1dHRvbnMtbWFpbmAgY2FuIGJlIG1vdmVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20uXG4gIGZsZXg6IDAlO1xuXG4gICYuZGl0by1wYW5lLW1haW4ge1xuICAgIGZsZXg6IDEwMCU7XG4gIH1cblxuICAuZGl0by1zY2hlbWEtaGVhZGVyOm5vdCguZGl0by1zY2hlbWEtbWVudS1oZWFkZXIpICsgJiB7XG4gICAgLy8gQ2xlYXIgdG9wLW1hcmdpbiBpZiB0aGUgY29tcG9uZW50cyBhcmUgcHJlY2VkZWQgYnkgYSBzY2hlbWEgaGVhZGVyLlxuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cblxuICAuZGl0by1jb250YWluZXIuZGl0by1vbWl0LXBhZGRpbmcgPiAmIHtcbiAgICAvLyBDbGVhciBtYXJnaW5zIHNldCBhYm92ZSBhZ2FpbiBpZiBwYXJlbnQgaXMgb21pdHRpbmcgcGFkZGluZy5cbiAgICBtYXJnaW46IDA7XG4gICAgbWF4LXdpZHRoOiB1bnNldDtcbiAgfVxuXG4gIC5kaXRvLWJyZWFrIHtcbiAgICBmbGV4OiAxMDAlO1xuICAgIGhlaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJhY3Rpb24odmFsdWUpIHtcbiAgY29uc3QgbWF0Y2ggPSAoXG4gICAgaXNTdHJpbmcodmFsdWUpICYmXG4gICAgdmFsdWUubWF0Y2goL15cXHMqKFsrLV0/XFxkKylcXHMqXFwvXFxzKihbKy1dP1xcZCspXFxzKiQvKVxuICApXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IFssIGRpdmlkZW5kLCBkaXZpc29yXSA9IG1hdGNoXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZGl2aWRlbmQpIC8gcGFyc2VGbG9hdChkaXZpc29yKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29udGFpbmVyKFxuICB2LXNob3c9XCJjb21wb25lbnRWaXNpYmxlXCJcbiAgOmNsYXNzPVwiY29udGFpbmVyQ2xhc3NcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZVwiXG4pXG4gIERpdG9MYWJlbChcbiAgICB2LWlmPVwibGFiZWxcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gIClcbiAgY29tcG9uZW50LmRpdG8tY29tcG9uZW50KFxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpzaW5nbGU9XCJzaW5nbGVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpkaXNhYmxlZD1cImNvbXBvbmVudERpc2FibGVkXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gICAgQGVycm9ycz1cIm9uRXJyb3JzXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50LCBzaG91bGRPbWl0UGFkZGluZyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IHBhcnNlRnJhY3Rpb24gfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Db250YWluZXInLCB7XG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBnZW5lcmF0ZUxhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgdHlwZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlQ29tcG9uZW50KHRoaXMuc2NoZW1hLnR5cGUpXG4gICAgfSxcblxuICAgIGhhc0xhYmVsKCkge1xuICAgICAgY29uc3QgeyBzY2hlbWEgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHNjaGVtYVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGFiZWwgIT09IGZhbHNlICYmXG4gICAgICAgICghIWxhYmVsIHx8IHRoaXMudHlwZUNvbXBvbmVudD8uZ2VuZXJhdGVMYWJlbCAmJiB0aGlzLmdlbmVyYXRlTGFiZWxzKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBsYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0xhYmVsID8gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSkgOiBudWxsXG4gICAgfSxcblxuICAgIGxhYmVsRGF0YVBhdGgoKSB7XG4gICAgICAvLyBVbm5lc3RlZCB0eXBlcyBkb24ndCBoYXZlIGEgZGF0YVBhdGggZm9yIHRoZW1zZWx2ZXMsIGRvbid0IHVzZSBpdDpcbiAgICAgIHJldHVybiB0aGlzLm5lc3RlZCA/IHRoaXMuZGF0YVBhdGggOiBudWxsXG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpZHRoOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZUNvbXBvbmVudD8uZGVmYXVsdFdpZHRoXG4gICAgICB9LFxuICAgICAgZ2V0KHdpZHRoKSB7XG4gICAgICAgIC8vIFVzZSAxMDAlID09IDEuMCBhcyBkZWZhdWx0IHdpZHRoIHdoZW4gbm90aGluZyBpcyBzZXQ6XG4gICAgICAgIHJldHVybiB3aWR0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAxLjBcbiAgICAgICAgICA6IGlzU3RyaW5nKHdpZHRoKVxuICAgICAgICAgICAgPyB3aWR0aC5tYXRjaCgvXlxccypbPD5dP1xccyooLiopJC8pWzFdIC8vIFJlbW92ZSB3aWR0aCBvcGVyYXRvclxuICAgICAgICAgICAgOiB3aWR0aFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50V2lkdGhPcGVyYXRvcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZ2V0KHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh3aWR0aClcbiAgICAgICAgICA/IHdpZHRoLm1hdGNoKC9eXFxzKihbPD5dPykvKVsxXSB8fCBudWxsXG4gICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRWaXNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndmlzaWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlQ29tcG9uZW50Py5kZWZhdWx0VmlzaWJsZVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50RGlzYWJsZWQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkaXNhYmxlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm4gZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29udGFpbmVyQ2xhc3MoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBjb250YWluZXJDbGFzcyB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAnZGl0by1vbWl0LXBhZGRpbmcnOiBzaG91bGRPbWl0UGFkZGluZyh0aGlzLnNjaGVtYSksXG4gICAgICAgIC4uLihcbiAgICAgICAgICBpc1N0cmluZyhjb250YWluZXJDbGFzcylcbiAgICAgICAgICAgID8geyBbY29udGFpbmVyQ2xhc3NdOiB0cnVlIH1cbiAgICAgICAgICAgIDogY29udGFpbmVyQ2xhc3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb21wb25lbnRXaWR0aFxuICAgICAgLy8gJ2F1dG8nID0gbm8gZml0dGluZzpcbiAgICAgIGNvbnN0IGJhc2lzID0gW251bGwsICdhdXRvJywgJ2ZpbGwnXS5pbmNsdWRlcyh3aWR0aClcbiAgICAgICAgPyAnYXV0bydcbiAgICAgICAgOiAvJSQvLnRlc3Qod2lkdGgpXG4gICAgICAgICAgPyBwYXJzZUZsb2F0KHdpZHRoKSAvLyBwZXJjZW50YWdlXG4gICAgICAgICAgOiAvW2Etel0vLnRlc3Qod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoIC8vIG5hdGl2ZSB1bml0c1xuICAgICAgICAgICAgOiBwYXJzZUZyYWN0aW9uKHdpZHRoKSAqIDEwMCAvLyBmcmFjdGlvblxuICAgICAgcmV0dXJuIGlzTnVtYmVyKGJhc2lzKSA/IGAke2Jhc2lzfSVgIDogYmFzaXNcbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGUoKSB7XG4gICAgICAvLyBJbnRlcnByZXQgJz41MCUnIGFzICc1MCUsIGZsZXgtZ3JvdzogMWBcbiAgICAgIGNvbnN0IGdyb3cgPSAoXG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJz4nIHx8XG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJ1xuICAgICAgKVxuICAgICAgLy8gSW50ZXJwcmV0ICc8NTAlJyBhcyAnNTAlLCBmbGV4LXNocmluazogMWBcbiAgICAgIGNvbnN0IHNocmluayA9IHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJzwnXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGV4OiBgJHtncm93ID8gMSA6IDB9ICR7c2hyaW5rID8gMSA6IDB9ICR7dGhpcy5jb21wb25lbnRCYXNpc31gXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzKCkge1xuICAgICAgY29uc3QgYmFzaXNJc0F1dG8gPSB0aGlzLmNvbXBvbmVudEJhc2lzID09PSAnYXV0bydcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IHRoaXMuY29tcG9uZW50RGlzYWJsZWQsXG4gICAgICAgICdkaXRvLXdpZHRoLWZpbGwnOiAhYmFzaXNJc0F1dG8gfHwgdGhpcy5jb21wb25lbnRXaWR0aCA9PT0gJ2ZpbGwnLFxuICAgICAgICAnZGl0by13aWR0aC1hdXRvJzogYmFzaXNJc0F1dG8sXG4gICAgICAgICdkaXRvLWhhcy1lcnJvcnMnOiAhIXRoaXMuZXJyb3JzXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkVycm9ycyhlcnJvcnMpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29udGFpbmVyIHtcbiAgLy8gTmVlZGVkIGZvciBiZXR0ZXIgdmVydGljYWwgYWxpZ25tZW50OlxuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvLyBUbyBwcmV2ZW50IGxpc3QgdGFibGVzIGZyb20gYmxvd2luZyBvdXQgb2YgdGhlaXIgZmxleCBib3ggY29udGFpbmVycy5cbiAgbWF4LXdpZHRoOiAxMDAlO1xuICAvLyBDYW5ub3QgdXNlIG1hcmdpbiBoZXJlIGFzIGl0IG5lZWRzIHRvIGJlIHBhcnQgb2YgYm94LXNpemluZyBmb3JcbiAgLy8gcGVyY2VudGFnZXMgaW4gZmxleC1iYXNpcyB0byB3b3JrLlxuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZjtcblxuICAmOmVtcHR5IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgJi5kaXRvLW9taXQtcGFkZGluZyB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIGhlaWdodDogMTAwJTsgLy8gU28gdGhhdCBsaXN0IGJ1dHRvbnMgY2FuIGJlIHN0aWNreSBhdCB0aGUgYm90dG9tO1xuICB9XG59XG5cbi8vIE5PVEU6IFRoaXMgaXMgbm90IG5lc3RlZCBpbnNpZGUgYC5kaXRvLWNvbnRhaW5lcmAgc28gdGhhdCBvdGhlclxuLy8gdHlwZSBjb21wb25lbnRzIGNhbiBvdmVycmlkZSBgLmRpdG8td2lkdGgtZmlsbGAgY2xhc3MgKGZpbHRlciBwcmVjZWRlbmNlKS5cbi5kaXRvLWNvbXBvbmVudCB7XG4gICYuZGl0by13aWR0aC1maWxsIHtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgICYuZGl0by1jaGVja2JveCxcbiAgICAmLmRpdG8tcmFkaW8tYnV0dG9uIHtcbiAgICAgIC8vIFdlYktpdCBkb2Vzbid0IGxpa2UgY2hhbmdlZCB3aWR0aCBvbiBjaGVja2JveGVzIGFuZCByYWRpb3MsIG92ZXJyaWRlOlxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRhYnNcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCIodGFiU2NoZW1hLCBrZXkpIGluIHRhYnNcIlxuICApXG4gICAgUm91dGVyTGluay5kaXRvLWxpbmsoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHRhYlNjaGVtYSlcIlxuICAgICAgOmtleT1cImtleVwiXG4gICAgICA6dG89XCJ7IGhhc2g6IGAjJHtrZXl9YCB9XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogc2VsZWN0ZWRUYWIgPT09IGtleSB9XCJcbiAgICApIHt7IGdldExhYmVsKHRhYlNjaGVtYSwga2V5KSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYnMnLCB7XG4gIHByb3BzOiB7XG4gICAgdGFiczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzZWxlY3RlZFRhYjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJHRhYi1jb2xvci1iYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlc3Q7XG4kdGFiLWNvbG9yLWluYWN0aXZlOiAkY29sb3ItbGlnaHQ7XG4kdGFiLWNvbG9yLWFjdGl2ZTogJGNvbG9yLWxpZ2h0ZXN0O1xuJHRhYi1jb2xvci1ob3ZlcjogJGNvbG9yLXdoaXRlO1xuXG4uZGl0by10YWJzIHtcbiAgLy8gU2VlOiBodHRwczovL2NvZGVwZW4uaW8vdGhvbGV4L3Blbi9odmVCeC9cbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG5cbiAgYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWluYWN0aXZlO1xuICAgIHBhZGRpbmc6ICR0YWItcGFkZGluZy12ZXIgJHRhYi1wYWRkaW5nLWhvcjtcbiAgICBtYXJnaW4tbGVmdDogJHRhYi1tYXJnaW47XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogJHRhYi1yYWRpdXM7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWhvdmVyO1xuICAgIH1cblxuICAgICY6YWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgICYuZGl0by1hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gT25seSBzaG93IHBhbmVscyBpbiB0YWJzIHdoZW4gdGhlIHRhYnMgYXJlIGFsc28gdmlzaWJsZS5cbmNvbXBvbmVudC5kaXRvLXBhbmVsKFxuICB2LXNob3c9XCJ2aXNpYmxlICYmICghcGFuZWxUYWJDb21wb25lbnQgfHwgcGFuZWxUYWJDb21wb25lbnQudmlzaWJsZSlcIlxuICA6aXM9XCJwYW5lbFRhZ1wiXG4gIEBzdWJtaXQucHJldmVudFxuKVxuICBsYWJlbC5kaXRvLXBhbmVsLXRpdGxlIHt7IGdldExhYmVsKHNjaGVtYSkgfX1cbiAgRGl0b1NjaGVtYS5kaXRvLXBhbmVsLXNjaGVtYShcbiAgICA6c2NoZW1hPVwicGFuZWxTY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgIDpkYXRhPVwicGFuZWxEYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOmhhc093bkRhdGE9XCJoYXNPd25EYXRhXCJcbiAgKVxuICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgRGl0b0J1dHRvbnMoXG4gICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cInBhbmVsRGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRCdXR0b25TY2hlbWFzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvUGFuZWwnLCB7XG4gIG1peGluczogW1ZhbGlkYXRvck1peGluXSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkcGFuZWxDb21wb25lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiB0aGlzLnBhbmVsVGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFuZWxUYWJDb21wb25lbnQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvd25EYXRhOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEuYnV0dG9ucylcbiAgICB9LFxuXG4gICAgdGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnRhcmdldCB8fCB0aGlzLmRhdGFQYXRoXG4gICAgfSxcblxuICAgIGhhc093bkRhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLm93bkRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3duRGF0YSB8fCB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxTY2hlbWEoKSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25EYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBkYXRhYCBmcm9tIHRoZSBzY2hlbWEsIHNvIHRoYXQgRGl0b1NjaGVtYSBpc24ndCB1c2luZyBpdCB0b1xuICAgICAgICAvLyBwcm9kdWNlIGl0cyBvd24gZGF0YS4gU2VlICRmaWx0ZXJzIHBhbmVsIGZvciBtb3JlIGRldGFpbHMgb24gZGF0YS5cbiAgICAgICAgY29uc3QgeyBkYXRhLCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFuZWxUYWcoKSB7XG4gICAgICAvLyBQYW5lbHMgdGhhdCBwcm92aWRlIHRoZWlyIG93biBkYXRhIG5lZWQgdGhlaXIgb3duIGZvcm0uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gJ2Zvcm0nIDogJ2RpdidcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIElmIHRoZSBwYW5lbCBwcm92aWRlcyBpdHMgb3duIGRhdGEsIHRoZW4gaXQgbmVlZHMgdG8gcHJlZml4IGFsbFxuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIGl0cyBkYXRhLXBhdGgsIGJ1dCBpZiBpdCBzaGFyZXMgZGF0YSB3aXRoIHRoZSBzY2hlbWFcbiAgICAgIC8vIGNvbXBvbmVudCwgdGhlbiBpdCBzaG91bGQgc2hhcmUgdGhlIGRhdGEtcGF0aCBuYW1lIHNwYWNlIHRvby5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyB0aGlzLmRhdGFQYXRoIDogdGhpcy5zY2hlbWFDb21wb25lbnQuZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGBzY2hlbWEuZGF0YWAgaGFuZGxpbmcgaW4gRGl0b1NjaGVtYSxcbiAgICAvLyB3aGVyZSB0aGUgZGF0YSBpcyBhZGRlZCB0byB0aGUgYWN0dWFsIGNvbXBvbmVudC5cbiAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXMuc2NoZW1hXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMub3duRGF0YSA9IGlzRnVuY3Rpb24oZGF0YSlcbiAgICAgICAgPyBkYXRhLmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuICAgICAgICA6IGRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHBhbmVscyBzbyB0aGF0IG90aGVyIGNvbXBvbmVudHMgY2FuIGZpbmQgdGhlbSBieSB0aGVpclxuICAgICAgLy8gZGF0YS1wYXRoLCBlLmcuIGluIFR5cGVMaXN0Lm9uRmlsdGVyRXJyb3JzKClcbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlclBhbmVsKHRoaXMsIGFkZClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lbCB7XG4gIG1hcmdpbi1ib3R0b206ICRjb250ZW50LXBhZGRpbmc7XG5cbiAgLmRpdG8tcGFuZWwtdGl0bGUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gICAgYmFja2dyb3VuZDogJGJ1dHRvbi1jb2xvcjtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgLmRpdG8tcGFuZWwtc2NoZW1hIHtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG5cbiAgICA+IC5kaXRvLXNjaGVtYS1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nO1xuXG4gICAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgICAtLWJ1dHRvbi1tYXJnaW46ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tb2JqZWN0IHtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tcGFuZSB7XG4gICAgICBtYXJnaW46IDAgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAgIH1cblxuICAgIC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXBhbmVscyhcbiAgdi1pZj1cInBhbmVscy5sZW5ndGggPiAwXCJcbilcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCJ7IHNjaGVtYSwgZGF0YVBhdGgsIHRhYkNvbXBvbmVudCB9IGluIHBhbmVsc1wiXG4gIClcbiAgICBEaXRvUGFuZWwoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHNjaGVtYSlcIlxuICAgICAgOmtleT1cImdldFBhbmVsS2V5KGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKHNjaGVtYS5uYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJzY2hlbWEuZGlzYWJsZWQgIT0gbnVsbCA/IHNjaGVtYS5kaXNhYmxlZCA6IGRpc2FibGVkXCJcbiAgICAgIDpwYW5lbFRhYkNvbXBvbmVudD1cInRhYkNvbXBvbmVudFwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVscycsIHtcbiAgcHJvcHM6IHtcbiAgICBwYW5lbHM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRQYW5lbEtleShkYXRhUGF0aCwgdGFiQ29tcG9uZW50KSB7XG4gICAgICAvLyBBbGxvdyBzZXBhcmF0ZSB0YWJzIHRvIHVzZSBwYW5lbHMgb2YgdGhlIHNhbWUgbmFtZSwgYnlcbiAgICAgIC8vIHByZWZpeGluZyB0aGVpciBrZXkgd2l0aCB0aGUgdGFiIG5hbWUuXG4gICAgICByZXR1cm4gdGFiQ29tcG9uZW50ID8gYCR7dGFiQ29tcG9uZW50LnRhYn1fJHtkYXRhUGF0aH1gIDogZGF0YVBhdGhcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lbHMge1xuICBtYXgtd2lkdGg6ICRjb250ZW50LXNpZGViYXItd2lkdGg7XG4gIG1pbi13aWR0aDogY2FsYygkY29udGVudC1zaWRlYmFyLXdpZHRoIC8gMik7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgdXNlU2xvdHMsIENvbW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNWTm9kZUNvbnRlbnQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlICYmIGFzQXJyYXkodm5vZGUpLnNvbWUodm5vZGUgPT4gdm5vZGUudHlwZSAhPT0gQ29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Nsb3RDb250ZW50KHNsb3QsIHByb3BzID0ge30pIHtcbiAgc2xvdCA9IGlzU3RyaW5nKHNsb3QpID8gdXNlU2xvdHMoKVtzbG90XSA6IHNsb3RcbiAgcmV0dXJuIGhhc1ZOb2RlQ29udGVudChzbG90Py4ocHJvcHMpKVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWJ1dHRvbnMoXG4gIHYtaWY9XCJidXR0b25TY2hlbWFzIHx8IGhhc1Nsb3RDb250ZW50KCRzbG90cy5kZWZhdWx0KVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwiKGJ1dHRvblNjaGVtYSwgYnV0dG9uRGF0YVBhdGgpIGluIGJ1dHRvblNjaGVtYXNcIlxuICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoYnV0dG9uU2NoZW1hKVwiXG4gICAgICA6a2V5PVwiYnV0dG9uRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cImJ1dHRvblNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJidXR0b25EYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoYnV0dG9uU2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImZhbHNlXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwidm5vZGUgb2YgJHNsb3RzLmRlZmF1bHQ/LigpXCJcbiAgKVxuICAgIC8vLSBSZW5kZXIgZWFjaCBub2RlIGluIHRoZSBkZWZhdWx0IHNsb3QgdGhyb3VnaCBgZGl0by12bm9kZWAsXG4gICAgLy8tIHNvIGl0IGNhbiBiZSB3cmFwcGVkIGluIGEgYC5kaXRvLWNvbnRhaW5lcmAgY2xhc3MuXG4gICAgLmRpdG8tY29udGFpbmVyKFxuICAgICAgdi1pZj1cImhhc1ZOb2RlQ29udGVudCh2bm9kZSlcIlxuICAgIClcbiAgICAgIERpdG9Wbm9kZSg6dm5vZGU9XCJ2bm9kZVwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBoYXNTbG90Q29udGVudCwgaGFzVk5vZGVDb250ZW50IH0gZnJvbSAnLi4vdXRpbHMvdnVlLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9CdXR0b25zJywge1xuICBwcm92aWRlOiB7XG4gICAgJHRhYkNvbXBvbmVudDogKCkgPT4gbnVsbFxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGJ1dHRvblNjaGVtYXMoKSB7XG4gICAgICAvLyBDb21wdXRlIGEgYnV0dG9ucyBsaXN0IHdoaWNoIGhhcyB0aGUgZGF0YVBhdGggYmFrZWQgaW50byBpdHMga2V5cy5cbiAgICAgIGNvbnN0IHsgZGF0YVBhdGgsIGJ1dHRvbnMgfSA9IHRoaXNcbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgICAgID8gT2JqZWN0LnZhbHVlcyhidXR0b25zKS5yZWR1Y2UoKHNjaGVtYXMsIGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgc2NoZW1hc1thcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgYnV0dG9uLm5hbWUpXSA9IGJ1dHRvblxuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXNcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNTbG90Q29udGVudCxcbiAgICBoYXNWTm9kZUNvbnRlbnRcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWJ1dHRvbnMge1xuICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gU2V0IGBAY2xpY2suc3RvcGAgdG8gcHJldmVudCBjbGljayBldmVudHMgZnJvbSBidWJibGluZyB0byBkaXRvLWxhYmVsLlxuRGl0b0J1dHRvbnMuZGl0by1lZGl0LWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICA6YnV0dG9ucz1cImJ1dHRvbnNcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gIDpkYXRhPVwiZGF0YVwiXG4gIDptZXRhPVwibWV0YVwiXG4gIDpzdG9yZT1cInN0b3JlXCJcbiAgQGNsaWNrLnN0b3BcbilcbiAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgYS5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNEcmFnZ2FibGVcIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZHJhZylcIlxuICApXG4gIFJvdXRlckxpbmsuZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRWRpdGFibGVcIlxuICAgIDp0bz1cInsgcGF0aDogZWRpdFBhdGggfVwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5lZGl0KVwiXG4gIClcbiAgRGl0b0NyZWF0ZUJ1dHRvbihcbiAgICB2LWlmPVwiaXNDcmVhdGFibGVcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpwYXRoPVwiY3JlYXRlUGF0aFwiXG4gICAgOnZlcmI9XCJ2ZXJicy5jcmVhdGVcIlxuICAgIDp0ZXh0PVwiY3JlYXRlQnV0dG9uVGV4dFwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0RlbGV0YWJsZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kZWxldGUpXCJcbiAgICBAY2xpY2s9XCIkZW1pdCgnZGVsZXRlJylcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FZGl0QnV0dG9ucycsIHtcbiAgZW1pdHM6IFsnZGVsZXRlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNyZWF0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRlbGV0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGNyZWF0ZVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEuZm9ybSlcbiAgICB9LFxuXG4gICAgaXNEcmFnZ2FibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2RyYWdnYWJsZScpXG4gICAgfSxcblxuICAgIGlzRWRpdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2VkaXRhYmxlJykgJiYgISF0aGlzLmVkaXRQYXRoXG4gICAgfSxcblxuICAgIGlzQ3JlYXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdjcmVhdGFibGUnKSAmJiAhIXRoaXMuY3JlYXRlUGF0aFxuICAgIH0sXG5cbiAgICBpc0RlbGV0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZGVsZXRhYmxlJylcbiAgICB9LFxuXG4gICAgY3JlYXRlQnV0dG9uVGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBvdmVycmlkZSBjcmVhdGUgYnV0dG9uIHRocm91Z2ggY3JlYXRhYmxlIG9iamVjdDpcbiAgICAgICAgdGhpcy5zY2hlbWEuY3JlYXRhYmxlPy5sYWJlbCB8fCAoXG4gICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZSBjcmVhdGUgYnV0dG9uIGxhYmVscyBmcm9tIGZyb20gbGFiZWxzIGZvciBsaXN0XG4gICAgICAgICAgLy8gc291cmNlcyB3aXRoIG9ubHkgb25lIGZvcm06XG4gICAgICAgICAgdGhpcy5mb3JtTGFiZWwgJiZcbiAgICAgICAgICBgJHtjYXBpdGFsaXplKHRoaXMudmVyYnMuY3JlYXRlKX0gJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICkgfHxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFzT3B0aW9uKG5hbWUpIHtcbiAgICAgIC8vIFRoZSBvcHRpb25zIG9mIHRoZSBvdXRlciBjb21wb25lbnQgYXJlIHBhc3NlZCB0byB0aGUgYnV0dG9ucyBjb21wb25lbnRcbiAgICAgIC8vIHRocm91Z2ggcHJvcGVydGllcyBgdGhpc1tuYW1lXWAsIGJ1dCBjYW4gYmUgZGlzYWJsZWQgb24gYSBwZXItZm9ybVxuICAgICAgLy8gYmFzaXMgYnkgc2V0dGluZyBgc2NoZW1hW25hbWVdYCB0byBgZmFsc2VgLlxuICAgICAgcmV0dXJuICEhKHRoaXNbbmFtZV0gJiYgdGhpcy5zY2hlbWFbbmFtZV0gIT09IGZhbHNlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWVkaXQtYnV0dG9ucyB7XG4gIC8vIE92ZXJyaWRlIGN1cnNvciBmcm9tIGNvbGxhcHNpYmxlIGRpdG8tbGFiZWw6XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZmxleDogbm9uZTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY3JlYXRlLWJ1dHRvblxuICB0ZW1wbGF0ZShcbiAgICB2LWlmPVwic2hvd1B1bGxkb3duXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgOmNsYXNzPVwiYGRpdG8tYnV0dG9uLSR7dmVyYn1gXCJcbiAgICAgIDp0aXRsZT1cImxhYmVsaXplKHZlcmIpXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24oKVwiXG4gICAgKSB7eyB0ZXh0IH19XG4gICAgdWwuZGl0by1wdWxsZG93big6Y2xhc3M9XCJ7ICdkaXRvLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihmb3JtLCB0eXBlKSBpbiBmb3Jtc1wiXG4gICAgICApXG4gICAgICAgIGEoXG4gICAgICAgICAgdi1pZj1cImlzQ3JlYXRhYmxlKGZvcm0pXCJcbiAgICAgICAgICA6Y2xhc3M9XCJgZGl0by10eXBlLSR7dHlwZX1gXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKHR5cGUpXCJcbiAgICAgICAgICBAbW91c2V1cD1cIm9uUHVsbGRvd25Nb3VzZVVwKHR5cGUpXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbChmb3JtKSB9fVxuICBidXR0b24uZGl0by1idXR0b24oXG4gICAgdi1lbHNlXG4gICAgOnR5cGU9XCJpc0lubGluZWQgPyAnYnV0dG9uJyA6ICdzdWJtaXQnXCJcbiAgICA6Y2xhc3M9XCJgZGl0by1idXR0b24tJHt2ZXJifWBcIlxuICAgIDp0aXRsZT1cImxhYmVsaXplKHZlcmIpXCJcbiAgICBAY2xpY2s9XCJjcmVhdGVJdGVtKGZvcm1zLmRlZmF1bHQpXCJcbiAgKSB7eyB0ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBQdWxsZG93bk1peGluIGZyb20gJy4uL21peGlucy9QdWxsZG93bk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0Rm9ybVNjaGVtYXMsIGlzSW5saW5lZCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ3JlYXRlQnV0dG9uJywge1xuICBtaXhpbnM6IFtQdWxsZG93bk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdmVyYjogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gZ2V0Rm9ybVNjaGVtYXModGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgc2hvd1B1bGxkb3duKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZm9ybXMpLmxlbmd0aCA+IDEgfHwgIXRoaXMuZm9ybXMuZGVmYXVsdFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaXNDcmVhdGFibGUoZm9ybSkge1xuICAgICAgLy8gRm9ybXMgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGxpc3QgYnkgcHJvdmlkaW5nIGBjcmVhdGFibGU6IGZhbHNlYFxuICAgICAgcmV0dXJuIGZvcm0uY3JlYXRhYmxlICE9PSBmYWxzZVxuICAgIH0sXG5cbiAgICBjcmVhdGVJdGVtKGZvcm0sIHR5cGUgPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0YWJsZShmb3JtKSkge1xuICAgICAgICBpZiAodGhpcy5pc0lubGluZWQpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNvbXBvbmVudC5jcmVhdGVJdGVtKGZvcm0sIHR5cGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgLFxuICAgICAgICAgICAgcXVlcnk6IHsgdHlwZSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsb3dlZCB0byBjcmVhdGUgaXRlbSBmb3IgZ2l2ZW4gZm9ybScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QodHlwZSkge1xuICAgICAgdGhpcy5jcmVhdGVJdGVtKHRoaXMuZm9ybXNbdHlwZV0sIHR5cGUpXG4gICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICByaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jbGlwYm9hcmQuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgdi1pZj1cImNsaXBib2FyZFwiXG4pXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1jb3B5KFxuICAgIHJlZj1cImNvcHlEYXRhXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIkNvcHkgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIWNvcHlFbmFibGVkXCJcbiAgICBAY2xpY2s9XCJvbkNvcHlcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1wYXN0ZShcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIlBhc3RlIERhdGFcIlxuICAgIDpkaXNhYmxlZD1cIiFwYXN0ZUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uUGFzdGVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNPYmplY3QsIGNsb25lLCBkZWluZGVudCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ2xpcGJvYXJkJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBjbGlwYm9hcmQ6IHsgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3B5RW5hYmxlZDogZmFsc2UsXG4gICAgICBwYXN0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZml4Q2xpcGJvYXJkOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xpcGJvYXJkT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBpc09iamVjdCh0aGlzLmNsaXBib2FyZCkgPyB0aGlzLmNsaXBib2FyZCA6IHt9XG4gICAgfSxcblxuICAgIGNvcHlEYXRhKCkge1xuICAgICAgY29uc3QgeyBjb3B5IH0gPSB0aGlzLmNsaXBib2FyZE9wdGlvbnNcbiAgICAgIHJldHVybiBjb3B5XG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgY29weS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsb25lKGNsaXBib2FyZERhdGEpXG4gICAgfSxcblxuICAgIHBhc3RlRGF0YSgpIHtcbiAgICAgIGNvbnN0IHsgcGFzdGUgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIHBhc3RlXG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgcGFzdGUuY2FsbChcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIDogY2xpcGJvYXJkRGF0YSA9PiBjbGlwYm9hcmREYXRhXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2hlY2sgY2xpcGJvYXJkIGNvbnRlbnQgd2hlbmV2ZXIgc29tZXRoaW5nIGdldHMgY29waWVkIG9yIHRoZSB3aW5kb3cgZ2V0c1xuICAgIC8vIChyZSlhY3RpdmF0ZWQsIGFzIHRob3NlIGFyZSB0aGUgbW9tZW50cyB3aGVuIHRoZSBjbGlwYm9hcmQgY2FuIGNoYW5nZTpcbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjb3B5OiB0aGlzLmNoZWNrQ2xpcGJvYXJkXG4gICAgfSlcbiAgICB0aGlzLmRvbU9uKHdpbmRvdywge1xuICAgICAgZm9jdXM6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuJHdhdGNoKCdkYXRhJywge1xuICAgICAgLy8gQ2hlY2sgcmlnaHQgYXdheSBhbHNvIGluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGRhdGEgKGUuZy4gY3JlYXRlIGZvcm0pLlxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogKHRvLCBmcm9tKSA9PiB7XG4gICAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYXN5bmMgZ2V0Q2xpcGJvYXJkRGF0YShyZXBvcnQpIHtcbiAgICAgIC8vIFVzZSB0aGUgaW50ZXJuYWwgY2xpcGJvYXJkIGFzIGZhbGxiYWNrLlxuICAgICAgbGV0IHsgY2xpcGJvYXJkRGF0YSB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LnJlYWRUZXh0Py4oKVxuICAgICAgICBpZiAodGhpcy5maXhDbGlwYm9hcmQgJiYganNvbikge1xuICAgICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBuZWVkZWQgb24gU2FmYXJpIHRvIHByZXZlbnQgYSBzdHJhbmdlIFwiUGFzdGVcIlxuICAgICAgICAgIC8vIGJ1dHRvbiBmcm9tIGFwcGVhcmluZyB3aGVuIHRoZSBjbGlwYm9hcmQgaXMgYWNjZXNzZWQgKHdoeT8hKS5cbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIHRoaXMuZml4Q2xpcGJvYXJkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgIGNsaXBib2FyZERhdGEgPSBKU09OLnBhcnNlKGpzb24pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5uYW1lLCBlcnIubWVzc2FnZSlcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIGFsZXJ0KGRlaW5kZW50YFxuICAgICAgICAgICAgICBUaGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIGFwcGVhcnMgdG8gYmUgbWFsZm9ybWVkOlxuICAgICAgICAgICAgICAke2Vyci5tZXNzYWdlfVxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgJHNjaGVtYSwgLi4uZGF0YSB9ID0gY2xpcGJvYXJkRGF0YSB8fCB7fVxuICAgICAgcmV0dXJuICRzY2hlbWEgPT09IHRoaXMuc2NoZW1hQ29tcG9uZW50Py5zY2hlbWEubmFtZSA/IGRhdGEgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIGNoZWNrQ2xpcGJvYXJkKCkge1xuICAgICAgdGhpcy5jb3B5RW5hYmxlZCA9ICEhdGhpcy5kYXRhXG4gICAgICAvLyBTZWUgaWYgdGhlIGNsaXBib2FyZCBjb250ZW50IGlzIHZhbGlkIEpTT04gZGF0YSB0aGF0IGlzIGNvbXBhdGlibGVcbiAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0IHNjaGVtYSwgYW5kIG9ubHkgdGhlbiBhY3RpdmF0ZSB0aGUgcGFzdGluZzpcbiAgICAgIHRoaXMucGFzdGVFbmFibGVkID0gISEoYXdhaXQgdGhpcy5nZXRDbGlwYm9hcmREYXRhKGZhbHNlKSkgLy8gZG9uJ3QgcmVwb3J0XG4gICAgfSxcblxuICAgIGFzeW5jIG9uQ29weSgpIHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LmNsaXBib2FyZERhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMuY29weURhdGEoZGF0YSlcbiAgICAgICAgLy8gS2VlcCBhbiBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY2xpcGJvYXJkRGF0YSA9IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gYWN0aXZhdGUgdGhlIHBhc3RlIGJ1dHRvbiwgZGVwZW5kaW5nIG9uIGJyb3dzZXJzOlxuICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblBhc3RlKCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEodHJ1ZSkgLy8gcmVwb3J0XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gZGF0YSAmJiB0aGlzLnBhc3RlRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LnNldERhdGEoZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nLCB7IHVwZGF0ZVJvb3QgPSBmYWxzZSwgdXBkYXRlVmlldyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZyBeICFpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gQm9vbGVhbiB4b3JcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgICAgICBpZiAodXBkYXRlUm9vdCkge1xuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5yZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVWaWV3KSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldExvYWRpbmcodGhpcy5pc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuaW1wb3J0IHsgc2V0RGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgbGFiZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluLCBMb2FkaW5nTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcyxcbiAgICAgIC8vIFBhc3MgbG9jYWwgdmVyYnMgb3ZlcnJpZGVzIG9uIHRvIGNoaWxkcmVuLCBzZWUgdmVyYnMoKSBjb21wdXRlZCBwcm9wLlxuICAgICAgJHZlcmJzOiAoKSA9PiB0aGlzLnZlcmJzLFxuICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0aGlzLmhhc0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGVkRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJlc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZSBmb3IgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIHNvdXJjZSBzY2hlbWEuXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGEgZGF0YS1zb3VyY2UgaWYgaXQgaGFzIGFuIGFzc29jaWF0ZWQgQVBJIHJlc291cmNlOlxuICAgICAgcmV0dXJuICEhdGhpcy5yZXNvdXJjZVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIC8vIFJldHVybnMgYGZhbHNlYGhlcmUsIGJ1dCBpcyBvdmVycmlkZGVuIHRvIHJldHVybiBgdHJ1ZWAgaW5cbiAgICAgIC8vIGBTb3VyY2VNaXhpbmAgZm9yIGNvbXBvbmVudCB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyIG93biBkYXRhLCBidXRcbiAgICAgIC8vIGVkaXQgdGhlaXIgaXRlbXMgdGhyb3VnaCBhIGxpbmtlZCB2aWV3LiAgSW4gdGhpcyBjYXNlLCByZWFsIGlkcyBuZWVkIHRvXG4gICAgICAvLyBiZSB1c2VkLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgLy8gQ2hlY2sgdGhlIGZvcm0gdGhhdCB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvIGFzIHdlbGwsIHNpbmNlIGl0IG1heSBiZVxuICAgICAgLy8gaW4gY3JlYXRpb24gbW9kZSwgd2hpY2ggbWFrZXMgaXQgdHJhbnNpZW50LlxuICAgICAgLy8gTk9URTogVGhpcyBkb2VzIG5vdCBsb29wIGVuZGxlc3NseSBiZWNhdXNlIERpdG9Gb3JtIHJlZGVmaW5lc1xuICAgICAgLy8gYGlzVHJhbnNpZW50KClgIHRvIG9ubHkgcmV0dXJuIGAhdGhpcy5wcm92aWRlc0RhdGFgLlxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUNvbXBvbmVudFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMucHJvdmlkZXNEYXRhICYmXG4gICAgICAgICF0aGlzLmxpbmtzVG9WaWV3IHx8XG4gICAgICAgIGZvcm0gJiYgKFxuICAgICAgICAgIGZvcm0uaXNUcmFuc2llbnQgfHxcbiAgICAgICAgICBmb3JtLmlzQ3JlYXRpbmdcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0cmFuc2llbnROb3RlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJiAoXG4gICAgICAgICAgJzxiPk5vdGU8L2I+OiB0aGUgcGFyZW50IHN0aWxsIG5lZWRzIHRvIGJlIHNhdmVkICcgK1xuICAgICAgICAgICdpbiBvcmRlciB0byBwZXJzaXN0IHRoaXMgY2hhbmdlLidcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBzaG91bGRMb2FkKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMuaXNUcmFuc2llbnQgJiZcbiAgICAgICAgIXRoaXMuaXNMb2FkaW5nXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAvLyBCYXNlIGRlZmluaXRpb24sIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW5cbiAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkRGF0YVxuICAgIH0sXG5cbiAgICB2ZXJicygpIHtcbiAgICAgIC8vIFRoZSBhY3R1YWwgY29kZSBpcyB0aGUgYGdldFZlcmJzKClgIG1ldGhvZCwgZm9yIGVhc2llciBvdmVycmlkaW5nIG9mXG4gICAgICAvLyB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGluIGNvbXBvbmVudHMgdGhhdCB1c2UgdGhlIFJlc291cmNlTWl4aW4uXG4gICAgICByZXR1cm4gdGhpcy5nZXRWZXJicygpXG4gICAgfSxcblxuICAgIHBhZ2luYXRpb25SYW5nZSgpIHtcbiAgICAgIC8vIE9ubHkgYXBwbHkgcGFnaW5hdGlvbiB0byBsaXN0cy5cbiAgICAgIGNvbnN0IHsgcGFnaW5hdGU6IGFtb3VudCB9ID0gdGhpcy5zb3VyY2VTY2hlbWFcbiAgICAgIGlmICh0aGlzLmlzTGlzdFNvdXJjZSAmJiBhbW91bnQpIHtcbiAgICAgICAgY29uc3QgeyBwYWdlID0gMCB9ID0gdGhpcy5xdWVyeSB8fCB7fVxuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2UgKiBhbW91bnRcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyBhbW91bnQgLSAxXVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgcXVlcnlQYXJhbXMoKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMucGFnaW5hdGlvblJhbmdlXG4gICAgICBjb25zdCB7IHBhZ2UsIC4uLnF1ZXJ5IH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5xdWVyeSwgLy8gUXVlcnkgbWF5IG92ZXJyaWRlIHNjb3BlLlxuICAgICAgICAuLi4ocmFuZ2UgJiYge1xuICAgICAgICAgIC8vIFBhc3MgcGFnaW5hdGlvbiBhcyByYW5nZSwgc28gdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGdldCBPYmplY3Rpb24nc1xuICAgICAgICAgIC8vIHJlc3VsdHMgY291bnRpbmc6XG4gICAgICAgICAgcmFuZ2U6IHJhbmdlLmpvaW4oJywnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIC8vIFdoZW4gY3JlYXRpbmcgbmVzdGVkIGRhdGEsIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzZXR1cERhdGEoKVxuICAgIGlmICh0aGlzLnByb3ZpZGVzRGF0YSB8fCB0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFJlc291cmNlKCkge1xuICAgICAgLy8gVGhpcyBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHNvIHRoZSBjb21wdXRlZCBgcmVzb3VyY2VgIGdldHRlciBjYW5cbiAgICAgIC8vIGJlIG92ZXJyaWRkZW4gYW5kIGBzdXBlcmAgZnVuY3Rpb25hbGl0eSBjYW4gc3RpbGwgYmUgYWNjZXNzZWQuXG4gICAgICByZXR1cm4gZ2V0UmVzb3VyY2UodGhpcy5zb3VyY2VTY2hlbWE/LnJlc291cmNlLCB7XG4gICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudEZvcm1Db21wb25lbnQ/LnJlc291cmNlID8/IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldFZlcmJzKCkge1xuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLiR2ZXJicygpXG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnZlcmJzLFxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdCB2ZXJicyB3aXRoIHRoZWlyIHRyYW5zaWVudCB2ZXJzaW9uczpcbiAgICAgICAgICAgIGNyZWF0ZTogJ2FkZCcsXG4gICAgICAgICAgICBjcmVhdGVkOiAnYWRkZWQnLFxuICAgICAgICAgICAgc2F2ZTogJ2FwcGx5JyxcbiAgICAgICAgICAgIHNhdmVkOiAnYXBwbGllZCcsXG4gICAgICAgICAgICBkZWxldGU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgZGVsZXRlZDogJ3JlbW92ZWQnXG4gICAgICAgICAgfVxuICAgICAgICA6IHZlcmJzXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIC8vIEFjdHVhbCBjb2RlIGlzIGluIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0J3MgZWFzZXIgdG8gb3ZlcnJpZGVcbiAgICAgIC8vIGBzZXR1cERhdGEoKWAgYW5kIGFuZCBjYWxsIGBlbnN1cmVEYXRhKClgIGZyb20gdGhlIG92ZXJyaWRlcyxcbiAgICAgIC8vIHNlZSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW4uXG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICBlbnN1cmVEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkTG9hZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKSB7XG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoZmFsc2UpXG4gICAgfSxcblxuICAgIGxvYWREYXRhKGNsZWFyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckRhdGEoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSkge1xuICAgICAgcmV0dXJuIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCB0eXBlID8geyB0eXBlIH0gOiB7fSwgdGhpcylcbiAgICB9LFxuXG4gICAgcmVxdWVzdERhdGEoKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnlQYXJhbXNcbiAgICAgIHRoaXMuaGFuZGxlUmVxdWVzdCh7IG1ldGhvZDogJ2dldCcsIHF1ZXJ5IH0sIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YT8udHlwZSA9PT0gJ0ZpbHRlclZhbGlkYXRpb24nICYmXG4gICAgICAgICAgICAgIHRoaXMub25GaWx0ZXJFcnJvcnM/LihkYXRhLmVycm9ycylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVW5hdXRob3JpemVkRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IENhbiB3ZSByZWFsbHkgc3dhbGxvdyB0aGVzZSBlcnJvcnM/XG4gICAgICAgICAgICAgIC8vIElzIGNhbGxpbmcgYGVuc3VyZVVzZXIoKWAgaW4gYG9uQmVmb3JlUmVxdWVzdCgpYCBlbm91Z2g/XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YShyZXNwb25zZS5kYXRhKVxuICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdsb2FkJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgaXNWYWxpZGF0aW9uRXJyb3IocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDBcbiAgICB9LFxuXG4gICAgaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVSZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja1xuICAgICkge1xuICAgICAgY29uc3QgbG9hZGluZ09wdGlvbnMgPSB7XG4gICAgICAgIHVwZGF0ZVJvb3Q6IHRydWUsIC8vIERpc3BsYXkgc3Bpbm5lciBpbiBoZWFkZXIgd2hlbiBsb2FkaW5nIGluIHJlc291cmNlc1xuICAgICAgICB1cGRhdGVWaWV3OiB0aGlzLmlzSW5WaWV3IC8vIE5vdGlmeSB2aWV3IG9mIGxvYWRpbmcgZm9yIHZpZXcgY29tcG9uZW50c1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSwgcXVlcnkgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFBhc3MgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgY2FsbGJhY2ssIHNvIHRoZXkgY2FuIGJlXG4gICAgICAgIC8vIGV4cG9zZWQgdG8gZnVydGhlciBjYWxsYmFja3MgdGhyb3VnaCBEaXRvQ29udGV4dC5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBjYWxsYmFjayByZXR1cm5zIHRydWUsIGVycm9ycyB3ZXJlIGFscmVhZHkgaGFuZGxlZC5cbiAgICAgICAgY29uc3QgeyByZXNwb25zZSB9ID0gZXJyb3JcbiAgICAgICAgaWYgKCFjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBpc1N0cmluZyhkYXRhPy50eXBlKVxuICAgICAgICAgICAgPyBsYWJlbGl6ZShkYXRhLnR5cGUpXG4gICAgICAgICAgICA6ICdFcnJvcidcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YT8ubWVzc2FnZSA/PyBlcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHsgdHlwZTogJ2Vycm9yJywgdGl0bGUsIHRleHQgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICB9LFxuXG4gICAgZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpIHtcbiAgICAgIC8vIENvbnZlbnRpb246IG9ubHkgcG9zdCwgcHV0IGFuZCBwYXRjaCByZXF1ZXN0cyBwYXNzIHRoZSBkYXRhIGFzIHBheWxvYWQuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5jbHVkZXMobWV0aG9kKSAmJiAoXG4gICAgICAgICAgLy8gVE9ETzogVXNlIGBoYW5kbGVEYXRhU2NoZW1hKClgIGFzeW5jaHJvbm91c2x5IGhlcmUgaW5zdGVhZCwgdG9cbiAgICAgICAgICAvLyBvZmZlciB0aGUgc2FtZSBhbW91bnQgb2YgcG9zc2liaWxpdGllcyBmb3IgZGF0YSBsb2FkaW5nLlxuICAgICAgICAgIGJ1dHRvbi5nZXRTY2hlbWFWYWx1ZShbJ3Jlc291cmNlJywgJ2RhdGEnXSkgfHxcbiAgICAgICAgICBidXR0b24ucHJvY2Vzc2VkSXRlbVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24pIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoYnV0dG9uLnNjaGVtYS5yZXNvdXJjZSwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMucmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgeyBtZXRob2QgfSA9IHJlc291cmNlXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBheWxvYWREYXRhKGJ1dHRvbiwgbWV0aG9kKVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICBzZXREYXRhID0gZmFsc2UsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyA9ICgpID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IFN1Y2Nlc3NmdWwnLFxuICAgICAgICAgIHRleHQ6ICdSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgc2VudC4nXG4gICAgICAgIH0pLFxuICAgICAgbm90aWZ5RXJyb3IgPSBlcnJvciA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgIGBVbmFibGUgdG8gc2VuZCByZXF1ZXN0JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KFxuICAgICAgICAgIHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSB9LFxuICAgICAgICAgIGFzeW5jIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIERpdG8gdmFsaWRhdGlvbiBlcnJvcjpcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5pc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkgJiYgZGF0YS5lcnJvcnNcbiAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNPYmplY3QoZGF0YSkgPyBkYXRhIDogZXJyXG4gICAgICAgICAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlFcnJvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmRlcmx5aW5nIGRhdGEgYmVmb3JlIGNhbGxpbmcgYG5vdGlmeSgpYCBvclxuICAgICAgICAgICAgICAvLyBgdGhpcy5pdGVtTGFiZWxgLCBzbyBpZCBpcyBzZXQgYWZ0ZXIgY3JlYXRpbmcgbmV3IGl0ZW1zLlxuICAgICAgICAgICAgICBpZiAoc2V0RGF0YSAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCBldmVudCwgeyBub3RpZnksIGVycm9yIH0pIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBvdXRzaWRlIG9mIGBlbWl0RXZlbnQoKWAsIHNvIHRoYXRcbiAgICAgIC8vIGBjb250ZXh0Lndhc05vdGlmaWVkYCBjYW4gYmUgY2hlY2tlZCBhZnRlci5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRGl0b0NvbnRleHQoYnV0dG9uLCB7XG4gICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgaXRlbUxhYmVsOiB0aGlzLml0ZW1MYWJlbCxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBidXR0b24uZW1pdEV2ZW50KGV2ZW50LCB7IGNvbnRleHQgfSlcbiAgICAgIGlmIChcbiAgICAgICAgbm90aWZ5ICYmXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBpZiBhbnl0aGluZyB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgLy8gRG8gbm90IGRpc3BsYXkgZGVmYXVsdCBub3RpZmljYXRpb24gaWYgdGhlIGV2ZW50IGhhbmRsZXIgYWxyZWFkeVxuICAgICAgICAvLyBkaXNwbGF5ZWQgYSBub3RpZmljYXRpb24uXG4gICAgICAgICFjb250ZXh0Lndhc05vdGlmaWVkXG4gICAgICApIHtcbiAgICAgICAgbm90aWZ5KGVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhdGgpIHtcbiAgLy8gRm9yIHBhdGhzIHN0YXJpbmcgd2l0aCBgL2AsIHdlIGNhbiB1c2UgdGhlIG5hdGl2ZSBgVVJMKClgIGNsYXNzIHRvIHJlc29sdmVcbiAgLy8gdGhlIHBhdGgsIHdoaWNoIHdpbGwgYWxzbyBoYW5kbGUgYC4uYCBhbmQgYC5gIHNlZ21lbnRzOlxuICByZXR1cm4gbmV3IFVSTChgZmlsZToke3BhdGh9YCkucGF0aG5hbWVcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1mb3JtLmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgOmNsYXNzPVwieyAnZGl0by1mb3JtLW5lc3RlZCc6IGlzTmVzdGVkUm91dGUgfVwiXG4gIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuKVxuICAvLy0gTk9URTogTmVzdGVkIGZvcm0gY29tcG9uZW50cyBhcmUga2VwdCBhbGl2ZSBieSB1c2luZyBgdi1zaG93YCBpbnN0ZWFkIG9mXG4gIC8vLSBgdi1pZmAgaGVyZSwgc28gZXZlbnQgaGFuZGxpbmcgYW5kIG90aGVyIHRoaW5ncyBzdGlsbCB3b3JrIHdpdGggbmVzdGVkXG4gIC8vLSBlZGl0aW5nLiBPbmx5IHJlbmRlciBhIHJvdXRlci12aWV3IGhlcmUgaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBkYXRhIHJvdXRlXG4gIC8vLSBhbmQgbm90IGEgbmVzdGVkIGZvcm0gcm91dGUsIHdoaWNoIHdpbGwgYXBwZWFyIGVsc2V3aGVyZSBpbiBpdHMgb3duIHZpZXcuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiEoaXNMYXN0VW5uZXN0ZWRSb3V0ZSB8fCBpc05lc3RlZFJvdXRlKVwiXG4gICAgdi1zaG93PVwiIWlzQWN0aXZlXCJcbiAgKVxuICAvLy0gVXNlIGEgPGRpdj4gZm9yIGlubGluZWQgZm9ybXMsIGFzIHdlIHNob3VsZG4ndCBuZXN0IGFjdHVhbCA8Zm9ybT4gdGFncy5cbiAgY29tcG9uZW50LmRpdG8tc2Nyb2xsKFxuICAgIHYtc2hvdz1cImlzQWN0aXZlXCJcbiAgICA6aXM9XCJpc05lc3RlZFJvdXRlID8gJ2RpdicgOiAnZm9ybSdcIlxuICAgIEBzdWJtaXQucHJldmVudFxuICApXG4gICAgRGl0b1NjaGVtYShcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgRGl0b0J1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICAgIClcbiAgICAvLy0gUHJldmVudCBpbXBsaWNpdCBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtLCBmb3IgZXhhbXBsZSB3aGVuIHR5cGluZyBlbnRlclxuICAgIC8vLSBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICAvLy0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUxNTA3ODA2XG4gICAgYnV0dG9uKFxuICAgICAgdi1zaG93PVwiZmFsc2VcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBkaXNhYmxlZFxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSwgY2FwaXRhbGl6ZSwgcGFyc2VEYXRhUGF0aCwgbWVyZ2UgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1Jlc291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGdldEJ1dHRvblNjaGVtYXMsIGlzT2JqZWN0U291cmNlIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Gb3JtJywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluLCBSZXNvdXJjZU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkRGF0YTogbnVsbCxcbiAgICAgIGNsb25lZERhdGE6IHVuZGVmaW5lZCxcbiAgICAgIHNvdXJjZUtleTogbnVsbCxcbiAgICAgIGlzRm9ybTogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHZlcmJzKCkge1xuICAgICAgLy8gQWRkIHN1Ym1pdCAvIHN1Ym1pdHRlZCB0byB0aGUgdmVyYnMgcmV0dXJuZWQgYnkgUmVzb3VyY2VNaXhpblxuICAgICAgLy8gTk9URTogVGhlc2UgZ2V0IHBhc3NlZCBvbiB0byBjaGlsZHJlbiB0aHJvdWdoOlxuICAgICAgLy8gYHByb3ZpZGUoKSAuLi4geyAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMgfWAgaW4gUmVzb3VyY2VNaXhpblxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLmdldFZlcmJzKClcbiAgICAgIGNvbnN0IHsgaXNDcmVhdGluZywgcHJvdmlkZXNEYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi52ZXJicyxcbiAgICAgICAgc3VibWl0OiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlIDogdmVyYnMuc2F2ZSxcbiAgICAgICAgc3VibWl0dGVkOiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlZCA6IHZlcmJzLnNhdmVkLFxuICAgICAgICBjYW5jZWw6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbCA6IHZlcmJzLmNsb3NlLFxuICAgICAgICBjYW5jZWxsZWQ6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbGxlZCA6IHZlcmJzLmNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldEl0ZW1Gb3JtU2NoZW1hKFxuICAgICAgICAgIHRoaXMuc291cmNlU2NoZW1hLFxuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgeWV0LCBwcm92aWRlIGFuIGVtcHR5IG9iamVjdCB3aXRoIGp1c3QgdGhlXG4gICAgICAgICAgLy8gcmlnaHQgdHlwZSBzZXQsIHNvIHRoZSBmb3JtIGNhbiBhbHdheXMgYmUgZGV0ZXJtaW5lZC5cbiAgICAgICAgICB0aGlzLmRhdGEgfHwgeyB0eXBlOiB0aGlzLnR5cGUgfSxcbiAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgKSB8fCB7fVxuICAgICAgKSAvLyBBbHdheXMgcmV0dXJuIGEgc2NoZW1hIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdC5cbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN1Ym1pdDogIXRoaXMuaXNNdXRhdGluZyAmJiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgICAgICAvLyBTdWJtaXQgYnV0dG9ucyBjbG9zZSB0aGUgZm9ybSBieSBkZWZhdWx0OlxuICAgICAgICAgICAgICBjbG9zZUZvcm06IHRydWUsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoeyBjb21wb25lbnQ6IGJ1dHRvbiB9KSA9PiBidXR0b24uc3VibWl0KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zY2hlbWEuYnV0dG9uc1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0Um91dGUgfHwgdGhpcy5pc0xhc3RVbm5lc3RlZFJvdXRlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnByb3ZpZGVzRGF0YVxuICAgIH0sXG5cbiAgICBpc0NyZWF0aW5nKCkge1xuICAgICAgLy8gdGhpcy5wYXJhbSBpcyBpbmhlcml0ZWQgZnJvbSBSb3V0ZU1peGluXG4gICAgICByZXR1cm4gdGhpcy5wYXJhbSA9PT0gJ2NyZWF0ZSdcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc011dGF0aW5nICYmICEhdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5pc0RpcnR5XG4gICAgfSxcblxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICAvLyBXaGVuIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCB0aGUgZm9ybSBlZGl0cyB0aGUgaW5oZXJpdGVkIGRhdGFcbiAgICAgIC8vIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBmb3IgcGVyc2lzdGVuY2UgdXBvbiBzdWJtaXNzaW9uLlxuICAgICAgLy8gU2VlIGBpbmhlcml0ZWREYXRhKClgIGNvbXB1dGVkIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gISF0aGlzLnNvdXJjZVNjaGVtYS5tdXRhdGVcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5zZWxlY3RlZFRhYiB8fCBudWxsXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICAvLyBUaGUgdHlwZSBvZiBmb3JtIHRvIGNyZWF0ZSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGVcbiAgICB9LFxuXG4gICAgaXRlbUlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLnBhcmFtID8/IG51bGxcbiAgICB9LFxuXG4gICAgbWV0aG9kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZyA/ICdwb3N0JyA6ICdwYXRjaCdcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoKVxuICAgICAgcmV0dXJuIGdldE1lbWJlclJlc291cmNlKHRoaXMuaXRlbUlkLCByZXNvdXJjZSkgfHwgcmVzb3VyY2VcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMuaXNDcmVhdGluZyA/IHRoaXMudmVyYnMuY3JlYXRlIDogdGhpcy52ZXJicy5lZGl0KVxuICAgIH0sXG5cbiAgICBkYXRhKCkge1xuICAgICAgLy8gUmV0dXJuIGRpZmZlcmVudCBkYXRhIFwiY29udGFpbmVyc1wiIGJhc2VkIG9uIGRpZmZlcmVudCBzY2VuYXJpb3M6XG4gICAgICAvLyAxLiBjcmVhdGVkRGF0YSwgaWYgd2UncmUgaW4gYSBmb3JtIGZvciBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuICAgICAgLy8gMi4gbG9hZGVkRGF0YSwgaWYgdGhlIGZvcm0gaXRzZWxmIGlzIHRoZSByb290IG9mIHRoZSBkYXRhIChlLmcuIHdoZW5cbiAgICAgIC8vICAgIGRpcmVjdGx5IGxvYWRpbmcgYW4gZWRpdGluZyByb290KS5cbiAgICAgIC8vIDMuIFRoZSBkYXRhIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIHdoaWNoIGl0c2VsZiBtYXkgYmUgZWl0aGVyIGFcbiAgICAgIC8vICAgIHZpZXcgdGhhdCBsb2FkZWQgdGhlIGRhdGEsIG9yIGEgZm9ybSB0aGF0IGVpdGhlciBsb2FkZWQgdGhlIGRhdGEsIG9yXG4gICAgICAvLyAgICBhbHNvIGluaGVyaXRlZCBpdCBmcm9tIGl0cyBwYXJlbnQuIE5vdGUgdGhhdCB3ZSB1c2UgYSBjbG9uZSBvZiBpdCxcbiAgICAgIC8vICAgIHNvLCBkYXRhIGNoYW5nZXMgYXJlbid0IGFwcGxpZWQgdW50aWwgc2V0U291cmNlRGF0YSgpIGlzIGNhbGxlZC5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZWREYXRhIHx8IHRoaXMubG9hZGVkRGF0YSB8fCB0aGlzLmluaGVyaXRlZERhdGEgfHwgbnVsbFxuICAgIH0sXG5cbiAgICBkYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGFQYXRoRnJvbSh0aGlzLmRhdGFDb21wb25lbnQpXG4gICAgfSxcblxuICAgIHNvdXJjZURhdGEoKSB7XG4gICAgICAvLyBQb3NzaWJsZSBwYXJlbnRzIGFyZSBEaXRvRm9ybSBmb3IgZm9ybXMsIG9yIERpdG9WaWV3IGZvciByb290IGxpc3RzLlxuICAgICAgLy8gQm90aCBoYXZlIGEgZGF0YSBwcm9wZXJ0eSB3aGljaCBhYnN0cmFjdHMgYXdheSBsb2FkaW5nIGFuZCBpbmhlcml0aW5nXG4gICAgICAvLyBvZiBkYXRhLlxuICAgICAgLy8gRm9ybXMgdGhhdCBhcmUgYWJvdXQgdG8gYmUgZGVzdHJveWVkIGR1ZSB0byBuYXZpZ2F0aW9uIGxvb3NlIHRoZWlyXG4gICAgICAvLyByb3V0ZS1yZWNvcmQsIGJ1dCBtaWdodCBzdGlsbCB0cmlnZ2VyIHRoaXMgZ2V0dGVyLiBGaWx0ZXIgdGhvc2Ugb3V0LlxuICAgICAgbGV0IGRhdGEgPSB0aGlzLnJvdXRlUmVjb3JkID8gdGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5kYXRhIDogbnVsbFxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBkYXRhIGJ5IHNwbGl0dGluZyB0aGUgZGF0YVBhdGgsIGl0ZXJhdGUgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gYWN0dWFsIGRhdGEgYW5kIGxvb2sgbmVzdCBjaGlsZC1kYXRhIHVwLlxuICAgICAgICBjb25zdCBkYXRhUGFydHMgPSBwYXJzZURhdGFQYXRoKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMucGFyZW50Um91dGVDb21wb25lbnQpXG4gICAgICAgIClcbiAgICAgICAgLy8gQ29tcGFyZSBkYXRhUGFydHMgYWdhaW5zdCBtYXRjaGVkIHJvdXRlUGF0aCBwYXJ0cywgdG8gaWRlbnRpZnkgdGhvc2VcbiAgICAgICAgLy8gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHRyZWF0ZWQgbGlrZSBpZHMgYW5kIG1hcHBlZCB0byBpbmRpY2VzIGluIGRhdGEuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucm91dGVSZWNvcmQucGF0aC5zcGxpdCgnLycpXG4gICAgICAgIGNvbnN0IHJvdXRlUGFydHMgPSBwYXRoUGFydHMuc2xpY2UocGF0aFBhcnRzLmxlbmd0aCAtIGRhdGFQYXJ0cy5sZW5ndGgpXG4gICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICB0aGlzLnNvdXJjZUtleSA9IG51bGxcbiAgICAgICAgY29uc3QgbGFzdERhdGFQYXJ0ID0gZGF0YVBhcnRzW2RhdGFQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpICYmIGxhc3REYXRhUGFydCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9iamVjdCBzb3VyY2UgYW5kIGFyZSBjcmVhdGluZywgdGhlIGRhdGFQYXRoIG5lZWRzIHRvXG4gICAgICAgICAgLy8gYmUgc2hvcnRlbmVkIGJ5IHRoZSAnY3JlYXRlJyBlbnRyeS4gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzLCBhcyB0aGVyZSB0aGUgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgaXRlbSBpZC5cbiAgICAgICAgICBkYXRhUGFydHMubGVuZ3RoLS1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRhdGFQYXJ0cy5sZW5ndGg7IGkgPCBsICYmIGRhdGE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gZGF0YVBhcnRzW2ldXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiA6aWQgcGFydCwgZmluZCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gd2l0aCBnaXZlbiBpZC5cbiAgICAgICAgICBjb25zdCBrZXkgPSAvXjppZC8udGVzdChyb3V0ZVBhcnRzW2ldKVxuICAgICAgICAgICAgPyBkYXRhUGFydCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgICAgPyBudWxsIC8vIFRoZXJlJ3Mgbm8gaW5kZXggZm9yIGVudHJpZXMgYWJvdXQgdG8gYmUgY3JlYXRlZFxuICAgICAgICAgICAgICA6IHRoaXMuZmluZEl0ZW1JZEluZGV4KHRoaXMuc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGFydClcbiAgICAgICAgICAgIDogZGF0YVBhcnRcbiAgICAgICAgICAvLyBTa2lwIHRoZSBmaW5hbCBsb29rdXAgYnV0IHJlbWVtYmVyIGBzb3VyY2VLZXlgLCBhcyB3ZSB3YW50IHRoZVxuICAgICAgICAgIC8vIHBhcmVudCBkYXRhIHNvIHdlIGNhbiByZXBsYWNlIHRoZSBlbnRyeSBhdCBgc291cmNlS2V5YCBvbiBpdC5cbiAgICAgICAgICBpZiAoaSA9PT0gbCAtIDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy5zb3VyY2VLZXkgPSBrZXlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgaW5oZXJpdGVkRGF0YSgpIHtcbiAgICAgIC8vIERhdGEgaW5oZXJpdGVkIGZyb20gcGFyZW50LCBhbmQgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdCByZWFjdGl2ZVxuICAgICAgLy8gY2hhbmdlcyB1bnRpbCBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRocm91Z2ggc2V0U291cmNlRGF0YSgpLCB1bmxlc3NcbiAgICAgIC8vIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGRhdGEgaXMgbXV0YXRlZCBkaXJlY3RseS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICB0aGlzLmNsb25lZERhdGEgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLnNvdXJjZURhdGEgJiZcbiAgICAgICAgdGhpcy5zb3VyY2VLZXkgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV1cbiAgICAgICAgaWYgKCF0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBVc2UgYSB0cmljayB0byBzdG9yZSBjbG9uZWQgaW5oZXJpdGVkIGRhdGEgaW4gY2xvbmVkRGF0YSwgdG8gbWFrZVxuICAgICAgICAgIC8vIGl0IHJlYWN0aXZlIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgY2xvbmVkIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gZGF0YSA9IGNsb25lKGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEgPT09IG51bGwgJiZcbiAgICAgICAgICAhdGhpcy5pc0NyZWF0aW5nICYmXG4gICAgICAgICAgaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGRhdGEgb2YgYW4gb2JqZWN0IHNvdXJjZSBpcyBudWxsLCByZWRpcmVjdCB0byBpdHMgY3JlYXRlIHJvdXRlLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVkRGF0YVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5oYXNEYXRhKClcbiAgICBoYXNEYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIGl0ZW1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNvdXJjZVNjaGVtYSwgdGhpcy5kYXRhLCB7IGV4dGVuZGVkOiB0cnVlIH0pXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc291cmNlRGF0YTogJ2NsZWFyQ2xvbmVkRGF0YScsXG4gICAgLy8gTmVlZGVkIGZvciB0aGUgJ2NyZWF0ZScgcmVkaXJlY3QgaW4gYGluaGVyaXRlZERhdGEoKWAgdG8gd29yazpcbiAgICBjcmVhdGU6ICdzZXR1cERhdGEnXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50LmVtaXRFdmVudChldmVudCwgcGFyYW1zKVxuICAgIH0sXG5cbiAgICBnZXREYXRhUGF0aEZyb20ocm91dGUpIHtcbiAgICAgIC8vIEdldCB0aGUgZGF0YSBwYXRoIGJ5IGRlbm9ybWFsaXplUGF0aCB0aGUgcmVsYXRpdmUgcm91dGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXMuYXBpLmRlbm9ybWFsaXplUGF0aChcbiAgICAgICAgdGhpcy5wYXRoXG4gICAgICAgICAgLy8gRGl0b1ZpZXdzIGhhdmUgbmVzdGVkIHJvdXRlcywgc28gZG9uJ3QgcmVtb3ZlIHRoZWlyIHBhdGguXG4gICAgICAgICAgLnNsaWNlKChyb3V0ZS5pc1ZpZXcgPyAwIDogcm91dGUucGF0aC5sZW5ndGgpICsgMSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0dXBEYXRhKClcbiAgICBzZXR1cERhdGEoKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0aW5nKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgfHw9IHRoaXMuY3JlYXRlRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy50eXBlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U291cmNlRGF0YShkYXRhKSB7XG4gICAgICBpZiAodGhpcy5zb3VyY2VEYXRhICYmIHRoaXMuc291cmNlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWFpblNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFbdGhpcy5zb3VyY2VLZXldID0gbWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKGRhdGEpXG4gICAgICAgIG1haW5TY2hlbWFDb21wb25lbnQub25DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFkZFNvdXJjZURhdGEoZGF0YSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMuc291cmNlU2NoZW1hKVxuICAgICAgICA/IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgICA6ICEhdGhpcy5zb3VyY2VEYXRhPy5wdXNoKGRhdGEpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmNsZWFyRGF0YSgpXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5zZXREYXRhKG51bGwpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLnNldERhdGEoKVxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgLy8gc2V0RGF0YSgpIGlzIGNhbGxlZCBhZnRlciBzdWJtaXQgd2hlbiBkYXRhIGhhcyBjaGFuZ2VkLlxuICAgICAgaWYgKHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aCB0cmFuc2llbnQgZGF0YSwgbW9kaWZ5IHRoaXMuc291cmNlRGF0YS5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZWREYXRhID0gbnVsbFxuICAgICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyQ2xvbmVkRGF0YSh0bywgZnJvbSkge1xuICAgICAgLy8gT25seSBjbGVhciBpZiB0aGUgd2F0Y2hlZCBzb3VyY2VEYXRhIGl0c2VsZiBjaGFuZ2VzIGluIHRoZSBmb3JtLlxuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZSgpXG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUodGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5wYXRoKVxuICAgIH0sXG5cbiAgICBnZXRTdWJtaXRWZXJiKHByZXNlbnQgPSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gcHJlc2VudFxuICAgICAgICAgID8gJ2NyZWF0ZSdcbiAgICAgICAgICA6ICdjcmVhdGVkJ1xuICAgICAgICA6IHByZXNlbnRcbiAgICAgICAgICA/ICdzdWJtaXQnXG4gICAgICAgICAgOiAnc3VibWl0dGVkJ1xuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXQoYnV0dG9uLCB7IHZhbGlkYXRlID0gdHJ1ZSwgY2xvc2VGb3JtID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0VmVyYiA9IHByZXNlbnQgPT4gdGhpcy52ZXJic1t0aGlzLmdldFN1Ym1pdFZlcmIocHJlc2VudCldXG5cbiAgICAgIC8vIEFsbG93IGJ1dHRvbnMgdG8gb3ZlcnJpZGUgYm90aCBtZXRob2QgYW5kIHJlc291cmNlIHBhdGggdG8gc3VibWl0IHRvOlxuICAgICAgY29uc3QgYnV0dG9uUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc291cmNlID0gYnV0dG9uUmVzb3VyY2UgfHwgdGhpcy5yZXNvdXJjZVxuICAgICAgY29uc3QgbWV0aG9kID0gcmVzb3VyY2U/Lm1ldGhvZCB8fCB0aGlzLm1ldGhvZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICBsZXQgc3VjY2Vzc1xuICAgICAgaWYgKCFidXR0b25SZXNvdXJjZSAmJiB0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zaWVudChidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICA/IGBJdGVtICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gXG4gICAgICAgICAgICAgICAgOiBgQ2hhbmdlICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgICAgICAgICAgICA/IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICAgICAgICA6IGBDaGFuZ2VzIHRvICR7dGhpcy5pdGVtTGFiZWx9IHdlcmUgJHt2ZXJifS5gLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpZW50Tm90ZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgICAgIHRleHQ6IGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfS5gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIHNldERhdGE6IHRydWUsXG4gICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB0aGlzLmVtaXRTY2hlbWFFdmVudCh0aGlzLmdldFN1Ym1pdFZlcmIoKSksXG4gICAgICAgICAgb25FcnJvcjogZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBlcnJvciB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBub3RpZnlTdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICB0aXRsZTogYFN1Y2Nlc3NmdWxseSAke2NhcGl0YWxpemUodmVyYil9YCxcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfSR7ZXJyb3IgPyAnOicgOiAnJ31gLFxuICAgICAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5yZXNldFZhbGlkYXRpb24oKVxuICAgICAgICBpZiAoY2xvc2VGb3JtIHx8IGJ1dHRvbi5jbG9zZUZvcm0pIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAvLyBSZWRpcmVjdCB0byB0aGUgZm9ybSBlZGl0aW5nIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW06XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldEl0ZW1JZCh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhKVxuICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgcGF0aDogcmVzb2x2ZVBhdGgoYCR7dGhpcy5wYXRofS8uLi8ke2lkfWApIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdFRyYW5zaWVudChidXR0b24sIF9yZXNvdXJjZSwgX21ldGhvZCwgZGF0YSwge1xuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25FcnJvcixcbiAgICAgIG5vdGlmeVN1Y2Nlc3MsXG4gICAgICBub3RpZnlFcnJvclxuICAgIH0pIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZGVmYXVsdCBcInN1Ym1pdHRpbmdcIiBvZiB0cmFuc2llbnQsIG5lc3RlZCBkYXRhOlxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IHRoaXMuYWRkU291cmNlRGF0YShkYXRhKVxuICAgICAgICA6IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAnQ291bGQgbm90IHN1Ym1pdCB0cmFuc2llbnQgaXRlbSdcbiAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdlcnJvcicsIHtcbiAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0Zvcm0gZnJvbSAnLi9EaXRvRm9ybS52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1OZXN0ZWQnLCB7XG4gIGV4dGVuZHM6IERpdG9Gb3JtXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZm9ybS1uZXN0ZWQge1xuICAmLFxuICAuZGl0by1zY3JvbGwge1xuICAgIC8vIE5vIHNjcm9sbGluZyBpbnNpZGUgbmVzdGVkIGZvcm1zLCBhbmQgcHJldmVudCBvcGVuIC5tdWx0aXNlbGVjdCBmcm9tXG4gICAgLy8gYmVpbmcgY3JvcHBlZC5cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1lcnJvcnMoXG4gIHYtaWY9XCJlcnJvcnNcIlxuKVxuICB1bFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJlcnJvciBvZiBlcnJvcnNcIlxuICAgIClcbiAgICAgIHwge3sgZXJyb3IgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FcnJvcnMnLCB7XG4gIHByb3BzOiB7XG4gICAgZXJyb3JzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWVycm9ycyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcblxuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIGNvbG9yOiAkY29sb3ItZXJyb3I7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NvcGVzXG4gIFJvdXRlckxpbmsoXG4gICAgdi1mb3I9XCIoc2NvcGUsIGtleSkgaW4gc2NvcGVzXCJcbiAgICA6a2V5PVwia2V5XCJcbiAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgIDp0bz1cImdldFNjb3BlTGluayhzY29wZSlcIlxuICAgIGN1c3RvbVxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXNlbGVjdGVkJzogc2NvcGUubmFtZSA9PT0gcXVlcnkuc2NvcGUgfVwiXG4gICAgICA6dGl0bGU9XCJzY29wZS5oaW50IHx8IGdldExhYmVsKHNjb3BlKVwiXG4gICAgICBAY2xpY2s9XCJuYXZpZ2F0ZVwiXG4gICAgKSB7eyBnZXRMYWJlbChzY29wZSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY29wZXMnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjb3BlczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U2NvcGVMaW5rKHNjb3BlKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4udGhpcy5xdWVyeSwgc2NvcGU6IHNjb3BlLm5hbWUgfVxuICAgICAgaWYgKHF1ZXJ5LnBhZ2UpIHtcbiAgICAgICAgcXVlcnkucGFnZSA9IDBcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayhxdWVyeSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY29wZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC8vIEEgYml0IG1vcmUgdGhhbiB0aGUgd2lkdGggb2YgZWxsaXBzaXMsIHRvIHByZXZlbnQgcmVwbGFjaW5nIHNob3J0IHdvcmRzXG4gICAgLy8gd2l0aCBlbGxpcHNpcy5cbiAgICBtaW4td2lkdGg6IDNlbTtcbiAgICBmbGV4OiAwIDEgYXV0bztcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgIH1cblxuICAgICYgKyAuZGl0by1idXR0b24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfSAvLyBEb24ndCBjb3ZlciB0aGUgZm9jdXNlZCBib3JkZXIgb2YgYnV0dG9uczpcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblBhZ2luYXRpb24oXG4gIHYtbW9kZWw6cGFnZT1cInBhZ2VcIlxuICA6cGFnZVNpemU9XCJsaW1pdFwiXG4gIDp0b3RhbD1cInRvdGFsXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYWdpbmF0aW9uJywge1xuICBjb21wb25lbnRzOiB7IFBhZ2luYXRpb24gfSxcblxuICBwcm9wczoge1xuICAgIHF1ZXJ5OiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwYWdlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAoK3RoaXMucXVlcnkucGFnZSB8fCAwKSArIDFcbiAgICAgIH0sXG5cbiAgICAgIHNldChwYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChcbiAgICAgICAgICAgIHRoaXMuZ2V0UXVlcnlMaW5rKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSAtIDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBuZXh0VGljaywgZGVmaW5lQ29tcG9uZW50LCByZWYsIHJlYWN0aXZlLCBoIH0gZnJvbSAndnVlLWRlbWknO1xuaW1wb3J0IHsgdHJ5T25Nb3VudGVkLCB0cnlPblNjb3BlRGlzcG9zZSwgdW5yZWZFbGVtZW50LCBkZWZhdWx0RG9jdW1lbnQsIHRvVmFsdWUsIHVzZVZNb2RlbCB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcyc7XG5cbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX29ialJlc3QgPSAoc291cmNlLCBleGNsdWRlKSA9PiB7XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKHNvdXJjZSwgcHJvcCkgJiYgZXhjbHVkZS5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgaWYgKHNvdXJjZSAhPSBudWxsICYmIF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKHNvdXJjZSkpIHtcbiAgICAgIGlmIChleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwICYmIF9fcHJvcElzRW51bS5jYWxsKHNvdXJjZSwgcHJvcCkpXG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICB9XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuZnVuY3Rpb24gdXNlU29ydGFibGUoZWwsIGxpc3QsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgc29ydGFibGU7XG4gIGNvbnN0IF9hID0gb3B0aW9ucywgeyBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudCB9ID0gX2EsIHJlc2V0T3B0aW9ucyA9IF9fb2JqUmVzdChfYSwgW1wiZG9jdW1lbnRcIl0pO1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBvblVwZGF0ZTogKGUpID0+IHtcbiAgICAgIG1vdmVBcnJheUVsZW1lbnQobGlzdCwgZS5vbGRJbmRleCwgZS5uZXdJbmRleCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkgOiB1bnJlZkVsZW1lbnQoZWwpO1xuICAgIGlmICghdGFyZ2V0KVxuICAgICAgcmV0dXJuO1xuICAgIHNvcnRhYmxlID0gbmV3IFNvcnRhYmxlKHRhcmdldCwgX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIGRlZmF1bHRPcHRpb25zKSwgcmVzZXRPcHRpb25zKSk7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiBzb3J0YWJsZSA9PSBudWxsID8gdm9pZCAwIDogc29ydGFibGUuZGVzdHJveSgpO1xuICB0cnlPbk1vdW50ZWQoc3RhcnQpO1xuICB0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcbiAgcmV0dXJuIHsgc3RvcCwgc3RhcnQgfTtcbn1cbmZ1bmN0aW9uIG1vdmVBcnJheUVsZW1lbnQobGlzdCwgZnJvbSwgdG8pIHtcbiAgY29uc3QgYXJyYXkgPSB0b1ZhbHVlKGxpc3QpO1xuICBpZiAodG8gPj0gMCAmJiB0byA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheS5zcGxpY2UoZnJvbSwgMSlbMF07XG4gICAgbmV4dFRpY2soKCkgPT4gYXJyYXkuc3BsaWNlKHRvLCAwLCBlbGVtZW50KSk7XG4gIH1cbn1cblxuY29uc3QgVXNlU29ydGFibGUgPSAvKiBAX19QVVJFX18gKi8gLyogI19fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiVXNlU29ydGFibGVcIixcbiAgbW9kZWw6IHtcbiAgICAvLyBDb21wYXRpYmxlIHdpdGggdnVlMlxuICAgIHByb3A6IFwibW9kZWxWYWx1ZVwiLFxuICAgIGV2ZW50OiBcInVwZGF0ZTptb2RlbFZhbHVlXCJcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiZGl2XCJcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgbGlzdCA9IHVzZVZNb2RlbChwcm9wcywgXCJtb2RlbFZhbHVlXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJlZigpO1xuICAgIGNvbnN0IGRhdGEgPSByZWFjdGl2ZSh1c2VTb3J0YWJsZSh0YXJnZXQsIGxpc3QsIHByb3BzLm9wdGlvbnMpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHNsb3RzLmRlZmF1bHQpXG4gICAgICAgIHJldHVybiBoKHByb3BzLnRhZywgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KGRhdGEpKTtcbiAgICB9O1xuICB9XG59KTtcblxuZXhwb3J0IHsgVXNlU29ydGFibGUgfTtcbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgeyBVc2VTb3J0YWJsZSB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZVNvcnRhYmxlL2NvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluXSxcbiAgY29tcG9uZW50czogeyBVc2VTb3J0YWJsZSB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U29ydGFibGVPcHRpb25zKGRyYWdnYWJsZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGRpc2FibGVkOiAhZHJhZ2dhYmxlLFxuICAgICAgICBoYW5kbGU6ICcuZGl0by1idXR0b24tZHJhZycsXG4gICAgICAgIGRyYWdDbGFzczogJ2RpdG8tc29ydGFibGUtYWN0aXZlJyxcbiAgICAgICAgY2hvc2VuQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWNob3NlbicsXG4gICAgICAgIGdob3N0Q2xhc3M6ICdkaXRvLXNvcnRhYmxlLWdob3N0JyxcbiAgICAgICAgZmFsbGJhY2tDbGFzczogJ2RpdG8tc29ydGFibGUtZmFsbGJhY2snLFxuICAgICAgICBmb3JjZUZhbGxiYWNrOiBmYWxsYmFjayxcbiAgICAgICAgb25TdGFydDogdGhpcy5vblN0YXJ0RHJhZyxcbiAgICAgICAgb25FbmQ6IHRoaXMub25FbmREcmFnXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uU3RhcnREcmFnKCkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWVcbiAgICB9LFxuXG4gICAgb25FbmREcmFnKHsgb2xkSW5kZXgsIG5ld0luZGV4IH0pIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxuICAgICAgaWYgKG9sZEluZGV4ICE9PSBuZXdJbmRleCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0LCBwYWdpbmF0aW9uUmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICAgIC8vIFJlb3JkZXIgdGhlIGNoYW5nZWQgZW50cmllcyBieSB0aGVpciBvcmRlciBrZXksIHRha2luZyBwYWdpbmF0aW9uXG4gICAgICAgIC8vIG9mZnNldHMgaW50byBhY2NvdW50OlxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYWdpbmF0aW9uUmFuZ2U/LlswXSB8fCAwXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGxpc3RbaV1bb3JkZXJLZXldID0gaSArIG9mZnNldFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyZWUtaXRlbShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9YHtcbiAgICAnZGl0by1kcmFnZ2luZyc6IGRyYWdnaW5nLFxuICAgICdkaXRvLWFjdGl2ZSc6IGFjdGl2ZVxuICB9YFxuICA6c3R5bGU9XCJsZXZlbCA+IDAgJiYgeyAnLS1sZXZlbCc6IGxldmVsIH1cIlxuKVxuICAuZGl0by10cmVlLWhlYWRlcihcbiAgICB2LWlmPVwibGFiZWxcIlxuICApXG4gICAgLmRpdG8tdHJlZS1icmFuY2goXG4gICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICBAY2xpY2suc3RvcD1cIm9wZW5lZCA9ICFvcGVuZWRcIlxuICAgIClcbiAgICAgIC5kaXRvLWNoZXZyb24oXG4gICAgICAgIHYtaWY9XCJudW1FbnRyaWVzXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiBvcGVuZWQgfVwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWluZm8oXG4gICAgICAgIHYtaWY9XCJkZXRhaWxzXCJcbiAgICAgICkge3sgZGV0YWlscyB9fVxuICAgIC5kaXRvLXRyZWUtbGVhZihcbiAgICAgIHYtZWxzZVxuICAgIClcbiAgICAgIC5kaXRvLXRyZWUtbGFiZWwoXG4gICAgICAgIHYtaHRtbD1cImxhYmVsXCJcbiAgICAgIClcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1zbWFsbChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICAgICAgICBAY2xpY2s9XCJvbkVkaXRcIlxuICAgICAgKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgIEBjbGljaz1cIm9uRGVsZXRlXCJcbiAgICAgIClcbiAgdGFibGUuZGl0by1wcm9wZXJ0aWVzKFxuICAgIHYtaWY9XCJwcm9wZXJ0aWVzXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICApXG4gICAgdHIoXG4gICAgICB2LWZvcj1cInByb3BlcnR5IGluIHByb3BlcnRpZXNcIlxuICAgIClcbiAgICAgIHRkXG4gICAgICAgIERpdG9MYWJlbChcbiAgICAgICAgICB2LWlmPVwicHJvcGVydHkubGFiZWwgIT09IGZhbHNlXCJcbiAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgICAgOmxhYmVsPVwiZ2V0TGFiZWwocHJvcGVydHkpXCJcbiAgICAgICAgKVxuICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgOmNlbGw9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpzY2hlbWE9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICApXG4gIFVzZVNvcnRhYmxlKFxuICAgIHYtaWY9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKGNoaWxkcmVuU2NoZW1hLCBjaGlsZHJlbkxpc3QpXCJcbiAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhjaGlsZHJlbkRyYWdnYWJsZSwgdHJ1ZSlcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChjaGlsZHJlbkxpc3QgPSB2YWx1ZSlcIlxuICApXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNoaWxkcmVuSXRlbXNcIlxuICAgICAgOmtleT1cImdldEl0ZW1VaWQoY2hpbGRyZW5TY2hlbWEsIGl0ZW0uZGF0YSlcIlxuICAgICAgOnNjaGVtYT1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImdldEl0ZW1EYXRhUGF0aChjaGlsZHJlblNjaGVtYSwgaW5kZXgpXCJcbiAgICAgIDpkYXRhPVwiaXRlbS5kYXRhXCJcbiAgICAgIDpwYXRoPVwiaXRlbS5wYXRoXCJcbiAgICAgIDpvcGVuPVwiaXRlbS5vcGVuXCJcbiAgICAgIDphY3RpdmU9XCJpdGVtLmFjdGl2ZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEsIHsgaW5kZXggfSlcIlxuICAgICAgOmxldmVsPVwibGV2ZWwgKyAxXCJcbiAgICApXG4gICAgLy8tIFRPRE86IENvbnZlcnQgZGl0by10cmVlLWl0ZW0gdG8gdXNlIGRpdG8tbGFiZWwgaW50ZXJuYWxseSwgYW5kIHRoZW5cbiAgICAvLy0gcGFzcyBgYXNPYmplY3Q6IHRydWVgIGluIHRoZSBgZ2V0SXRlbUxhYmVsKClgIGNhbGwgYWJvdmUuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgaGFzRm9ybVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJlZUl0ZW0nLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBpbmplY3Q6IFsnY29udGFpbmVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtBcnJheSwgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIG9wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhY3RpdmU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsZXZlbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogdGhpcy5vcGVuIHx8IHRoaXMuc2NoZW1hLm9wZW5cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm1ldGFcbiAgICB9LFxuXG4gICAgc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuc3RvcmVcbiAgICB9LFxuXG4gICAgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGlzYWJsZWRcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBuYW1lZCBgc291cmNlU2NoZW1hYCBpbnN0ZWFkPyBVc2UgU291cmNlTWl4aW4/XG4gICAgY2hpbGRyZW5TY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEuY2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5MaXN0KCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgIHJldHVybiBuYW1lICYmIHRoaXMuZGF0YVtuYW1lXVxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkRyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY2hpbGRyZW5MaXN0Py5sZW5ndGggPiAxICYmXG4gICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2RyYWdnYWJsZScsIHtcbiAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIHNjaGVtYTogdGhpcy5jaGlsZHJlblNjaGVtYVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBudW1DaGlsZHJlbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoIHx8IDBcbiAgICB9LFxuXG4gICAgbnVtUHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bUVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1Qcm9wZXJ0aWVzICsgdGhpcy5udW1DaGlsZHJlblxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkl0ZW1zKCkge1xuICAgICAgY29uc3QgeyBjaGlsZHJlblNjaGVtYSwgY2hpbGRyZW5MaXN0IH0gPSB0aGlzXG4gICAgICBpZiAoY2hpbGRyZW5TY2hlbWEgJiYgY2hpbGRyZW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgZWRpdFBhdGggfSA9IHRoaXMuY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuT3BlbiA9ICF0aGlzLnBhdGggJiYgY2hpbGRyZW5TY2hlbWEub3BlblxuICAgICAgICAvLyBCdWlsZCBhIGNoaWxkcmVuIGxpc3Qgd2l0aCBjaGlsZCBtZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyKFxuICAgICAgICAgIGNoaWxkcmVuU2NoZW1hLFxuICAgICAgICAgIGNoaWxkcmVuTGlzdC5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlblNjaGVtYS5wYXRoICYmXG4gICAgICAgICAgICAgIGAke3RoaXMucGF0aH0vJHtjaGlsZHJlblNjaGVtYS5wYXRofS8ke2luZGV4fWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9wZW4gPSAoXG4gICAgICAgICAgICAgIGNoaWxkcmVuT3BlbiB8fFxuICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGFzIFwiaW4gZWRpdCBwYXRoXCIgd2hlbiBpdCdzIG5vdCB0aGUgZnVsbCBlZGl0IHBhdGguXG4gICAgICAgICAgICAgIGVkaXRQYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgcGF0aC5sZW5ndGggPCBlZGl0UGF0aC5sZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGVkaXRQYXRoID09PSBwYXRoXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gW11cbiAgICB9LFxuXG4gICAgZGV0YWlscygpIHtcbiAgICAgIGNvbnN0IHsgbnVtQ2hpbGRyZW4gfSA9IHRoaXNcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG51bUNoaWxkcmVuICYmXG4gICAgICAgIGAke251bUNoaWxkcmVufSAke1xuICAgICAgICAgIG51bUNoaWxkcmVuID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJ1xuICAgICAgICB9YFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZSB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZGVsZXRhYmxlXG4gICAgfSxcblxuICAgIC8vIFRPRE86IFN1cHBvcnQgY3JlYXRhYmxlIVxuICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBjcmVhdGFibGUsIGVkaXRhYmxlIGFuZCBkZWxldGFibGUgb3ZlcnJpZGVzIG9uIHRoZVxuICAgIC8vIGFzc29jaWF0ZWQgZm9ybXMsIGp1c3QgbGlrZSBpbiBgVHlwZUxpc3RgIGFuZCBgVHlwZU9iamVjdGAsIHRocm91Z2hcbiAgICAvLyBgRGl0b0VkaXRCdXR0b25zYC4gSXQgd291bGQgYmUgYmVzdCB0byB1c2UgYERpdG9FZGl0QnV0dG9uc2AgaGVyZSB0b28uXG4gICAgY3JlYXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY3JlYXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNyZWF0YWJsZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRhYmxlICYmIGhhc0Zvcm1TY2hlbWEodGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBlZGl0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VkaXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlZGl0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHByb3BlcnR5Lm5hbWUpXG4gICAgfSxcblxuICAgIG9uRWRpdCgpIHtcbiAgICAgIC8vIEFsbCB3ZSBnb3QgdG8gZG8gaXMgcHVzaCB0aGUgcmlnaHQgZWRpdCBwYXRoIHRvIHRoZSByb3V0ZXIsIHRoZSByZXN0XG4gICAgICAvLyBpcyBoYW5kbGVkIGJ5IG91ciByb3V0ZXMsIGFsbG93aW5nIHJlbG9hZHMgYXMgd2VsbC5cbiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHtcbiAgICAgICAgcGF0aDogYCR7dGhpcy5jb250YWluZXIucGF0aH0ke3RoaXMucGF0aH1gLFxuICAgICAgICAvLyBQcmVzZXJ2ZSBjdXJyZW50IHF1ZXJ5XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25EZWxldGUoKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQhXG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5jb250YWluZXIub25DaGFuZ2UoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtaXRlbSB7XG4gIC0tY2hldnJvbi1pbmRlbnQ6ICN7JGNoZXZyb24taW5kZW50fTtcblxuICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICA+IC5kaXRvLXRyZWUtYnJhbmNoLFxuICAgID4gLmRpdG8tdHJlZS1sZWFmIHtcbiAgICAgIC8vIFVzZSBgLS1sZXZlbGAgQ1NTIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZWQgdGhlIGFjY3VtdWxhdGVkIGluZGVudFxuICAgICAgLy8gcGFkZGluZyBkaXJlY3RseSBpbnN0ZWFkIG9mIGhhdmluZyBpdCBhY2N1bXVsYXRlIGluIG5lc3RlZCBDU1MuXG4gICAgICAvLyBUaGlzIHdheSwgd2UgY2FuIGtlZXAgdGhlIC5kaXRvLWFjdGl2ZSBhcmVhIGNvdmVyIHRoZSBmdWxsIHdpZHRoOlxuICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKHZhcigtLWNoZXZyb24taW5kZW50KSAqICh2YXIoLS1sZXZlbCwgMSkgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdHJlZS1icmFuY2gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoLFxuICAuZGl0by10cmVlLWxlYWYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAxcHggMDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtbGFiZWwsXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwLjM1ZW07XG4gICAgY29sb3I6IHJnYmEoJGNvbG9yLWJsYWNrLCAwLjIpO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbjogMXB4IDAgMXB4IDFlbTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyOmhvdmVyIHtcbiAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9IC8vIEhpZGUgYnV0dG9ucyBkdXJpbmcgZHJhZ2dpbmdcbiAgfVxuXG4gICYuZGl0by1kcmFnZ2luZyB7XG4gICAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuZGl0by1hY3RpdmUge1xuICAgID4gLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDAgJGlucHV0LXBhZGRpbmctaG9yO1xuICAgICAgbWFyZ2luOiAwICgtJGlucHV0LXBhZGRpbmctaG9yKTtcblxuICAgICAgPiAuZGl0by10cmVlLWJyYW5jaCB7XG4gICAgICAgID4gLmRpdG8tY2hldnJvbjo6YmVmb3JlIHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gKiA+IC5kaXRvLXRyZWUtbGFiZWwge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXByb3BlcnRpZXMge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiAkY2hldnJvbi1pbmRlbnQ7XG5cbiAgICA+IHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJzogJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGhlYWQuZGl0by10YWJsZS1oZWFkXG4gIHRyXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICApXG4gICAgICB0aChcbiAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihjb2x1bW4pXCJcbiAgICAgICAgOmNsYXNzPVwiZ2V0Q29sdW1uQ2xhc3MoY29sdW1uKVwiXG4gICAgICApXG4gICAgICAgIFJvdXRlckxpbmsoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgdi1zbG90PVwieyBuYXZpZ2F0ZSB9XCJcbiAgICAgICAgICA6dG89XCJnZXRTb3J0TGluayhjb2x1bW4pXCJcbiAgICAgICAgICBjdXN0b21cbiAgICAgICAgKVxuICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOmNsYXNzPVwiZ2V0U29ydENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgQGNsaWNrPVwibmF2aWdhdGVcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLW9yZGVyLWFycm93c1xuICAgICAgICAgICAgc3BhbiB7eyBnZXRMYWJlbChjb2x1bW4pIH19XG4gICAgICAgIHNwYW4oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICkge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgIHRoKFxuICAgICAgdi1pZj1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgICAvLy0gRW1wdHkgPHNwYW4+IGlzIG5lZWRlZCBmb3Igc3R5bGluZywgc2VlIF90YWJsZS5zY3NzXG4gICAgICBzcGFuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlSGVhZCcsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sdW1uczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgaGFzRWRpdEJ1dHRvbnM6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc29ydCgpIHtcbiAgICAgIGNvbnN0IG9yZGVyID0gKHRoaXMucXVlcnkub3JkZXIgfHwgJycpLnNwbGl0KC9cXHMrLylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG9yZGVyWzBdLFxuICAgICAgICBvcmRlcjogb3JkZXJbMV1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbHVtbkNsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNvbHVtbi0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRTb3J0Q2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lXG4gICAgICAgID8gYGRpdG8tc2VsZWN0ZWQgZGl0by1vcmRlci0ke3RoaXMuc29ydC5vcmRlcn1gXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRTb3J0TGluayhjb2x1bW4pIHtcbiAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiB0aGUgc2FtZSBjb2x1bW4gaXMgY2xpY2tlZCBhZ2Fpbi5cbiAgICAgIGNvbnN0IG9yZGVyID1cbiAgICAgICAgdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lICYmIHRoaXMuc29ydC5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgIDogJ2FzYydcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayh7XG4gICAgICAgIC4uLnRoaXMucXVlcnksXG4gICAgICAgIG9yZGVyOiBgJHtjb2x1bW4ubmFtZX0gJHtvcmRlcn1gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRhYmxlLWhlYWQge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB0ciB7XG4gICAgdGgge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgICAgLy8gQ29udmVudGlvbjogTmVzdGVkIHNwYW5zIGhhbmRsZSBwYWRkaW5nLCBzZWUgYmVsb3dcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgIHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZ1xuICAgICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgICAmOmVtcHR5OjphZnRlciB7XG4gICAgICAgICAgLy8gUHJldmVudCBlbXB0eSA8dGg+IGZyb20gY29sbGFwc2luZ1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gc3BhbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZChcbiAgOmNsYXNzPVwiY2VsbC5jbGFzc1wiXG4gIDpzdHlsZT1cImNlbGwuc3R5bGVcIlxuKVxuICAvLy0gVE9ETzogSW1wbGVtZW50IGlubGluZWQgY29tcG9uZW50cyBpbiBjZWxsIG1vZGUhXG4gIGNvbXBvbmVudChcbiAgICB2LWlmPVwiY2VsbC5jb21wb25lbnRcIlxuICAgIDppcz1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIClcbiAgc3BhbihcbiAgICB2LWVsc2VcbiAgICB2LWh0bWw9XCJyZW5kZXJDZWxsKGRhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFibGVDZWxsJywge1xuICBwcm9wczoge1xuICAgIGNlbGw6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVuZGVyQ2VsbChpdGVtKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHJlbmRlciB9ID0gdGhpcy5jZWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bbmFtZV1cbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIG5hbWUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKHZhbHVlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBEaXRvVk5vZGUoeyB2bm9kZSB9KSB7XG4gIHJldHVybiB2bm9kZVxufVxuXG5EaXRvVk5vZGUucHJvcHMgPSB7XG4gIHZub2RlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Zub2RlJywgRGl0b1ZOb2RlKVxuPC9zY3JpcHQ+XG4iLCIvLyBEaXRvVHlwZUNvbXBvbmVudCBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjb21wb25lbnQgZm9yIGFsbCBvdGhlciB0eXBlXG4vLyBjb21wb25lbnRzIGluc2lkZSB0aGUgdHlwZXMvIGZvbGRlci4gVGhlcmUncyBhbHNvIGEgc2VwYXJhdGUgY29uY3JldGVcbi8vIGBEaXRvVHlwZUNvbXBvbmVudC52dWVgIGNvbXBvbmVudCwgdXNlIHRvIHJlbmRlciBgeyB0eXBlOiAnY29tcG9uZW50JyB9YFxuaW1wb3J0IHsgYXNBcnJheSwgY2FtZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgeyByZWdpc3RlclR5cGVDb21wb25lbnQsIGdldFR5cGVDb21wb25lbnQgfSBmcm9tICcuL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0ZW5kczogRGl0b0NvbXBvbmVudCxcbiAgbWl4aW5zOiBbVHlwZU1peGluXSxcblxuICBuYXRpdmVGaWVsZDogZmFsc2UsXG4gIHRleHRGaWVsZDogZmFsc2UsXG4gIC8vIFNldCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBhbGwgb2YgdGhlc2UgdGhhdCBhcmUgdXNlZCBieSBtb3N0IHR5cGVcbiAgLy8gY29tcG9uZW50cy4gVGhlc2Ugb25seSBuZWVkIGRlZmluaW5nIGluIHN1Yi1jbGFzc2VzIHdoZW4gdGhleSBkaWZmZXIuXG4gIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgZGVmYXVsdE5lc3RlZDogdHJ1ZSxcbiAgZGVmYXVsdFZpc2libGU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IHRydWUsXG4gIGV4Y2x1ZGVWYWx1ZTogZmFsc2UsXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogbnVsbCxcbiAgb21pdFBhZGRpbmc6IGZhbHNlLFxuXG4gIGNvbXBvbmVudDogRGl0b0NvbXBvbmVudC5jb21wb25lbnQsXG5cbiAgZ2V0OiBnZXRUeXBlQ29tcG9uZW50LFxuXG4gIHJlZ2lzdGVyKHR5cGVzLCBkZWZpbml0aW9uID0ge30pIHtcbiAgICB0eXBlcyA9IGFzQXJyYXkodHlwZXMpXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoXG4gICAgICBgRGl0b1R5cGUke2NhbWVsaXplKHR5cGVzWzBdLCB0cnVlKX1gLFxuICAgICAgZGVmaW5pdGlvblxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnR5cGU9XCJ0eXBlXCJcbiAgOnRpdGxlPVwidGV4dFwiXG4gIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKSB7eyB0ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGhhc1Jlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBsYWJlbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2J1dHRvbicsICdzdWJtaXQnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICAgIGV4Y2x1ZGVWYWx1ZTogdHJ1ZSxcbiAgICBkZWZhdWx0V2lkdGg6ICdhdXRvJyxcbiAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIG5pY2VseTpcbiAgICAvLyBvbWl0RmxleEdyb3c6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmVyYigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyYnNbdGhpcy5uYW1lXSB8fCB0aGlzLm5hbWVcbiAgICAgIH0sXG5cbiAgICAgIHRleHQ6IGdldFNjaGVtYUFjY2Vzc29yKCd0ZXh0Jywge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGdldCh0ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQgfHwgbGFiZWxpemUodGhpcy52ZXJiKVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgY2xvc2VGb3JtOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xvc2VGb3JtJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSksXG5cbiAgICAgIC8vIEBvdmVycmlkZVxuICAgICAgZXZlbnRzKCkge1xuICAgICAgICBjb25zdCB7IG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9ID0gdGhpc1xuICAgICAgICByZXR1cm4geyBvbkZvY3VzLCBvbkJsdXIsIG9uQ2xpY2sgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUNvbXBvbmVudD8uc3VibWl0KHRoaXMsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmVtaXRFdmVudCgnY2xpY2snLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgICAvLyBIYXZlIGJ1dHRvbnMgdGhhdCBkZWZpbmUgcmVzb3VyY2VzIGNhbGwgYHRoaXMuc3VibWl0KClgIGJ5IGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJiAvLyBNZWFuaW5nOiBkb24ndCBwcmV2ZW50IGRlZmF1bHQuXG4gICAgICAgICAgaGFzUmVzb3VyY2UodGhpcy5zY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaW5wdXQuZGl0by1jaGVja2JveChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdHlwZT1cImNoZWNrYm94XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94Jywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94IHtcbiAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNGdW5jdGlvbixcbiAgaXNQcm9taXNlLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgZ2V0VmFsdWVBdERhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0xvYWRpbmdNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGFzeW5jRGF0YUVudHJpZXM6IHt9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgbmFtZSwge1xuICAgICAgcmVzb2x2ZUNvdW50ZXIgPSAxLFxuICAgICAgLi4ubG9hZGluZ09wdGlvbnNcbiAgICB9ID0ge30pIHtcbiAgICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICBzY2hlbWEgPSB7IGRhdGE6IHNjaGVtYSB9XG4gICAgICB9XG4gICAgICBsZXQgeyBkYXRhID0gdW5kZWZpbmVkLCBkYXRhUGF0aCA9IG51bGwgfSA9IHNjaGVtYVxuICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFzeW5jIGRhdGEgbG9hZGluZyBhbHJlYWR5IGluIHByb2Nlc3MuXG4gICAgICBjb25zdCBhc3luY0VudHJ5ID0gKHRoaXMuYXN5bmNEYXRhRW50cmllc1tuYW1lXSB8fD0gcmVhY3RpdmUoe1xuICAgICAgICBkZXBlbmRlbmN5RnVuY3Rpb246IG51bGwsXG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAwLFxuICAgICAgICByZXNvbHZlZERhdGE6IG51bGwsXG4gICAgICAgIHJlc29sdmluZzogZmFsc2VcbiAgICAgIH0pKVxuICAgICAgLy8gSWYgdGhlIGRhdGEgY2FsbGJhY2sgcHJvdmlkZWQgYSBkZXBlbmRlbmN5IGZ1bmN0aW9uIHdoZW4gaXQgd2FzIGNhbGxlZCxcbiAgICAgIC8vIGNhbCBpdCBpbiBldmVyeSBjYWxsIG9mIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGZvcmNlIFZ1ZSB0byBrZWVwIHRyYWNrXG4gICAgICAvLyBvZiB0aGUgYXN5bmMgZGVwZW5kZW5jaWVzLlxuICAgICAgYXN5bmNFbnRyeS5kZXBlbmRlbmN5RnVuY3Rpb24/LmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuXG4gICAgICBpZiAoYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGRhdGEgd2FzIHJlc29sdmVkIGFscmVhZHksIHJldHVybiBpdCBhbmQgY2xlYXIgdGhlIHZhbHVlIG9uY2VcbiAgICAgICAgLy8gYHJlc29sdmVDb3VudGVyYCByZWFjaGVzIHplcm8uIENvdW50aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGRlcGVuZGluZ1xuICAgICAgICAvLyBvbiB0aGUgdXNlIG9mIGRhdGEgYW5kIHJlYWN0aXZpdHksIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBjb21wdXRlZFxuICAgICAgICAvLyBnZXR0ZXIgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhIGlzIGNoYW5naW5nLiBDbGVhcmluZyB0aGUgcmVzb2x2ZWRcbiAgICAgICAgLy8gZGF0YSB3b3JrcyBiZWNhdXNlIFZ1ZSBjYWNoZXMgdGhlIHJlc3VsdCBvZiBjb21wdXRlZCBnZXR0ZXJzIGFuZCBvbmx5XG4gICAgICAgIC8vIHJlZXZhbHVhdGVzIGlmIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZWQuIFRoaXMgaXMgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgYSBjYWNoZWQgdmFsdWUgaGVyZSBkb2Vzbid0IGJsb2NrIC8gb3ZlcnJpZGUgcmVldmFsdWF0aW9uOlxuICAgICAgICBjb25zdCB7IHJlc29sdmVkRGF0YSB9ID0gYXN5bmNFbnRyeVxuICAgICAgICBpZiAoLS1hc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgY2FsbGluZyB0aGUgZGF0YSBmdW5jdGlvbiB0d2ljZTpcbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmluZykge1xuICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YS5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBkYXRhIGZ1bmN0aW9uIGlzIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZGF0YSBmdW5jdGlvbiBpcyB0aGVyZSB0byB0cmFjayBkZXBlbmRlbmNpZXMgYW5kIHRoZSByZWFsXG4gICAgICAgICAgLy8gZGF0YSBsb2FkaW5nIGhhcHBlbnMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQuIEtlZXAgdHJhY2tcbiAgICAgICAgICAvLyBpdCBpbiBgZGVwZW5kZW5jeUZ1bmN0aW9uYCBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIGVhY2ggY2FsbCBvZlxuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGtlZXAgdGhlIGRlcGVuZGVuY2llcyBpbnRhY3QsIGFuZCBjYWxsXG4gICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQgb25jZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhOlxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uID0gZGF0YVxuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdC5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGRhdGEpKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRhdGEgaXMgYXN5bmNocm9ub3VzLCBpdCBjYW4ndCBiZSByZXR1cm5lZCBzdHJhaWdodCBhd2F5LlxuICAgICAgICAgIC8vIEJ1dCB3ZSBjYW4gY2hlYXQgdXNpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhbmQgYHJlc29sdmVkRGF0YWAsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgZ29pbmcgdG8gcmVjZWl2ZSB0aGUgbG9hZGVkIGRhdGEgYXN5bmNocm9ub3VzbHksXG4gICAgICAgICAgLy8gdHJpZ2dlcmluZyBhIHJlY29tcHV0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxsc1xuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgLlxuICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2aW5nID0gdHJ1ZVxuICAgICAgICAgIHRoaXMucmVzb2x2ZURhdGEoZGF0YSwgbG9hZGluZ09wdGlvbnMpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID0gcmVzb2x2ZUNvdW50ZXJcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWREYXRhID0gZGF0YVxuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZpbmcgPSBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gQ2xlYXIgZGF0YSB1bnRpbCBwcm9taXNlIGlzIHJlc29sdmVkIGFuZCBgcmVzb2x2ZWREYXRhYCBpcyBzZXRcbiAgICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFQYXRoKSB7XG4gICAgICAgIGRhdGEgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoXG4gICAgICAgICAgdGhpcy5yb290RGF0YSxcbiAgICAgICAgICBub3JtYWxpemVEYXRhUGF0aChgJHt0aGlzLmRhdGFQYXRofS8ke2RhdGFQYXRofWApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfSxcblxuICAgIGFzeW5jIHJlc29sdmVEYXRhKGxvYWQsIGxvYWRpbmdPcHRpb25zID0ge30pIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlLCBsb2FkaW5nT3B0aW9ucylcbiAgICAgIGxldCBkYXRhID0gbnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IChpc0Z1bmN0aW9uKGxvYWQpID8gbG9hZCgpIDogbG9hZClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBlcnJvcilcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERhdGFNaXhpbiBmcm9tICcuL0RhdGFNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBzZXRUZW1wb3JhcnlJZCwgaXNSZWZlcmVuY2UgfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzQXJyYXksXG4gIGlzU3RyaW5nLFxuICBpc0Z1bmN0aW9uLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgbGFiZWxpemUsXG4gIGRlYm91bmNlQXN5bmNcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGF0YU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNPcHRpb25zOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkVmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgY29udmVydFZhbHVlID0gdmFsdWUgPT5cbiAgICAgICAgICB0aGlzLnJlbGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmhhc09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpc0FycmF5KHRoaXMudmFsdWUpXG4gICAgICAgICAgPyB0aGlzLnZhbHVlLm1hcChjb252ZXJ0VmFsdWUpLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbClcbiAgICAgICAgICA6IGNvbnZlcnRWYWx1ZSh0aGlzLnZhbHVlKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gV2hlbiByZWxhdGluZyBhbmQgYXMgc29vbiBhcyB0aGUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLi4uXG4gICAgICAgICAgdGhpcy5yZWxhdGUgJiZcbiAgICAgICAgICB0aGlzLmhhc09wdGlvbnMgJiYgKFxuICAgICAgICAgICAgLy8gLi4uaWYgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBudWxsIGJlY2F1c2UgYSBkaXNhcHBlYXJlZCBvcHRpb24uLi5cbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsICYmIHRoaXMudmFsdWUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIC8vIC4uLm9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlZmVyZW5jZSwgcmVwbGFjZSBpdCB3aXRoIGl0cyBvcHRpb25cbiAgICAgICAgICAgIC8vIHZhbHVlLCBzbyB0aGF0IGl0J2xsIGhvbGQgYWN0dWFsIGRhdGEsIG5vdCBqdXN0IGEgcmVmZXJlbmNlIGlkLlxuICAgICAgICAgICAgaXNSZWZlcmVuY2UodGhpcy52YWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gdmFsdWUgPT5cbiAgICAgICAgICB0aGlzLnJlbGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLm1hcChjb252ZXJ0KVxuICAgICAgICAgIDogY29udmVydCh2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRPcHRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh0aGlzLnNlbGVjdGVkVmFsdWUpXG4gICAgfSxcblxuICAgIG9wdGlvbnMoKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5oYW5kbGVEYXRhU2NoZW1hKHRoaXMuc2NoZW1hLm9wdGlvbnMsICdvcHRpb25zJywge1xuICAgICAgICByZXNvbHZlQ291bnRlcjogMVxuICAgICAgfSkgPz8gW11cbiAgICAgIGlmICghaXNBcnJheShkYXRhKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3B0aW9ucyBkYXRhLCBzaG91bGQgYmUgYXJyYXk6ICR7ZGF0YX1gKVxuICAgICAgfVxuICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgdGhpcy5oYXNPcHRpb25zID0gZGF0YS5sZW5ndGggPiAwXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzT3B0aW9ucyhkYXRhKVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgLy8gVGhpcyBpcyBvdmVycmlkZGVuIGluIGBUeXBlTXVsdGlzZWxlY3RgIHRvIHJldHVybiB0aGUgYHNlYXJjaGVkT3B0aW9uc2BcbiAgICAgIC8vIHdoZW4gYSBzZWFyY2ggZmlsdGVyIHdhcyBhcHBsaWVkLlxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICByZWxhdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZWxhdGUnLCB7XG4gICAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIGByZWxhdGVCeTogJ2lkJ2BcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugc2NoZW1hIGFjY2Vzc29yIGNhbGxiYWNrIG1hZ2ljIGZvciBgcmVsYXRlYCBhcyB3ZSBuZWVkXG4gICAgICAvLyB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCdzIGxpZmUtc3Bhbiwgc2VlIGBwcm9jZXNzRGF0YSgpYCBiZWxvdy5cbiAgICAgIGNhbGxiYWNrOiBmYWxzZVxuICAgIH0pLFxuXG4gICAgZ3JvdXBCeTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2dyb3VwQnknLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBvcHRpb25MYWJlbDogZ2V0U2NoZW1hQWNjZXNzb3IoJ29wdGlvbnMubGFiZWwnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KGxhYmVsKSB7XG4gICAgICAgIC8vIElmIG5vIGBsYWJlbGAgd2FzIHByb3ZpZGVkIGJ1dCB0aGUgb3B0aW9ucyBhcmUgb2JqZWN0cywgYXNzdW1lIGFcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiAnbGFiZWwnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGxhYmVsIHx8XG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25LZXkoJ2xhYmVsJykgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG9wdGlvblZhbHVlOiBnZXRTY2hlbWFBY2Nlc3Nvcignb3B0aW9ucy52YWx1ZScsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgbm8gYGxhYmVsYCB3YXMgcHJvdmlkZWQgYnV0IHRoZSBvcHRpb25zIGFyZSBvYmplY3RzLCBhc3N1bWUgYVxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlIG9mICd2YWx1ZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUgfHxcbiAgICAgICAgICB0aGlzLnJlbGF0ZSAmJiAnaWQnIHx8XG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25LZXkoJ3ZhbHVlJykgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8vIFRPRE86IENvbnNpZGVyIG1vdmluZyBzZWFyY2ggdG8gYG9wdGlvbnMuc2VhcmNoYD9cbiAgICBzZWFyY2hGaWx0ZXI6IGdldFNjaGVtYUFjY2Vzc29yKCdzZWFyY2gnLCB7XG4gICAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KHNlYXJjaCkge1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIsIGRlYm91bmNlIH0gPSBpc0Z1bmN0aW9uKHNlYXJjaClcbiAgICAgICAgICAgID8geyBmaWx0ZXI6IHNlYXJjaCB9XG4gICAgICAgICAgICA6IHNlYXJjaFxuICAgICAgICAgIHJldHVybiBkZWJvdW5jZSA/IGRlYm91bmNlQXN5bmMoZmlsdGVyLCBkZWJvdW5jZSkgOiBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZ3JvdXBCeUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBCeSA/ICdsYWJlbCcgOiBudWxsXG4gICAgfSxcblxuICAgIGdyb3VwQnlPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBCeSA/ICdvcHRpb25zJyA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE9wdGlvbktleShrZXkpIHtcbiAgICAgIGNvbnN0IFtvcHRpb25dID0gdGhpcy5hY3RpdmVPcHRpb25zXG4gICAgICByZXR1cm4gaXNPYmplY3Qob3B0aW9uKSAmJiBrZXkgaW4gb3B0aW9uID8ga2V5IDogbnVsbFxuICAgIH0sXG5cbiAgICBwcm9jZXNzT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlKSB7XG4gICAgICAgICAgLy8gSWYgaWRzIGFyZSBtaXNzaW5nIGFuZCB3ZSB3YW50IHRvIHJlbGF0ZSwgc2V0IHRlbXBvcmFyeSBpZHMuXG4gICAgICAgICAgLy8gTk9URTogV2UgbmVlZCB0byBtb2RpZnkgdGhlIGFjdHVhbCBkYXRhLCBtYWtpbmcgYSBjb3B5IHdvbid0IHdvcmtcbiAgICAgICAgICAvLyBhcyBpdCB3b24ndCBwcm9wYWdhdGUuXG4gICAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBkYXRhIGlzIGZyb20gdGhlIGdyYXBoIHRoYXRcbiAgICAgICAgICAvLyB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZy5cbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoISgnaWQnIGluIG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgc2V0VGVtcG9yYXJ5SWQob3B0aW9uLCAnaWQnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cEJ5KSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBlZCA9IHt9XG4gICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdHMsIG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG9wdGlvblt0aGlzLmdyb3VwQnldXG4gICAgICAgICAgICAgIGxldCBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdXG4gICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdID0ge1xuICAgICAgICAgICAgICAgICAgW3RoaXMuZ3JvdXBCeUxhYmVsXTogZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBbdGhpcy5ncm91cEJ5T3B0aW9uc106IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyeS5vcHRpb25zLnB1c2gob3B0aW9uKVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH0sXG5cbiAgICBoYXNPcHRpb24ob3B0aW9uKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmdldE9wdGlvbkZvclZhbHVlKHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSlcbiAgICB9LFxuXG4gICAgZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpbmRPcHRpb24gPSAob3B0aW9ucywgdmFsdWUsIGdyb3VwQnkpID0+IHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgb3B0aW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAvLyB3aG9sZSBvYmplY3QuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kT3B0aW9uKG9wdGlvbi5vcHRpb25zLCB2YWx1ZSwgbnVsbClcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uVmFsdWVcbiAgICAgICAgPyBmaW5kT3B0aW9uKHRoaXMuYWN0aXZlT3B0aW9ucywgdmFsdWUsIHRoaXMuZ3JvdXBCeSlcbiAgICAgICAgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9uVmFsdWUgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc1N0cmluZyhvcHRpb25WYWx1ZSlcbiAgICAgICAgPyBvcHRpb24/LltvcHRpb25WYWx1ZV1cbiAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdGlvblZhbHVlKVxuICAgICAgICAgID8gb3B0aW9uVmFsdWUuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBvcHRpb24gfSkpXG4gICAgICAgICAgOiBvcHRpb25cbiAgICB9LFxuXG4gICAgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB7XG4gICAgICBjb25zdCB7IG9wdGlvbkxhYmVsIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNTdHJpbmcob3B0aW9uTGFiZWwpXG4gICAgICAgID8gb3B0aW9uPy5bb3B0aW9uTGFiZWxdXG4gICAgICAgIDogaXNGdW5jdGlvbihvcHRpb25MYWJlbClcbiAgICAgICAgICA/IG9wdGlvbkxhYmVsLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgb3B0aW9uIH0pKVxuICAgICAgICAgIDogbGFiZWxpemUoYCR7b3B0aW9ufWApXG4gICAgfVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpIHtcbiAgICBpZiAoc2NoZW1hLnJlbGF0ZSkge1xuICAgICAgLy8gRm9yIGludGVybmFsbHkgcmVsYXRpbmcgZGF0YSAoYHNjaGVtYS5vcHRpb25zLmRhdGFQYXRoYCksIHdlIG5lZWQgdG9cbiAgICAgIC8vIHByb2Nlc3MgYm90aCB0aGUgb3B0aW9ucyAoZm9yICcjcmVmJykgYW5kIHRoZSB2YWx1ZSAoJyNpZCcpLlxuICAgICAgLy8gU2VlIGBEYXRhTWl4aW4uaGFuZGxlRGF0YVNjaGVtYSgpYDpcbiAgICAgIGNvbnN0IHBhdGggPSBzY2hlbWEub3B0aW9ucz8uZGF0YVBhdGhcbiAgICAgIGNvbnN0IHJlbGF0ZWREYXRhUGF0aCA9IHBhdGhcbiAgICAgICAgPyBub3JtYWxpemVEYXRhUGF0aChgJHtkYXRhUGF0aH0vJHtwYXRofWApXG4gICAgICAgIDogbnVsbFxuICAgICAgZ3JhcGguYWRkUmVsYXRpb24oZGF0YVBhdGgsIHJlbGF0ZWREYXRhUGF0aCwgc2NoZW1hKVxuICAgICAgaWYgKHJlbGF0ZWREYXRhUGF0aCkge1xuICAgICAgICBncmFwaC5zZXRTb3VyY2VSZWxhdGVkKHJlbGF0ZWREYXRhUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIENvbnZlcnQgcmVsYXRpbmcgb2JqZWN0cyB0byBhIHNoYWxsb3cgY29weSB3aXRoIG9ubHkgdGhlIGlkIGxlZnQuXG4gICAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIHVzaW5nIGByZWxhdGVCeWA6XG4gICAgICBjb25zdCBwcm9jZXNzUmVsYXRlID0gdmFsdWUgPT4gKHZhbHVlID8geyBpZDogdmFsdWUuaWQgfSA6IHZhbHVlKVxuICAgICAgLy8gU2VsZWN0ZWQgb3B0aW9ucyBjYW4gYmUgYm90aCBvYmplY3RzICYgYXJyYXlzLCBlLmcuICdjaGVja2JveGVzJzpcbiAgICAgIHZhbHVlID0gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAocHJvY2Vzc1JlbGF0ZSlcbiAgICAgICAgOiBwcm9jZXNzUmVsYXRlKHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnVsLmRpdG8tY2hlY2tib3hlcyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJgZGl0by1sYXlvdXQtJHtzY2hlbWEubGF5b3V0IHx8ICd2ZXJ0aWNhbCd9YFwiXG4pXG4gIGxpKFxuICAgIHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIlxuICApXG4gICAgbGFiZWxcbiAgICAgIGlucHV0LmRpdG8tY2hlY2tib3goXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRPcHRpb25zXCJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgfCB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94ZXMnLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIGRlZmF1bHRWYWx1ZTogW10sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSlcbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gb3B0aW9uIHx8IFtdXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2hlY2tib3hlcyB7XG4gIGxhYmVsIHtcbiAgICBAZXh0ZW5kICVpbnB1dC1ib3JkZXJsZXNzO1xuICB9XG5cbiAgLmRpdG8tY2hlY2tib3gge1xuICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jb2RlKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImNvZGVcIlxuICA6c3R5bGU9XCJzdHlsZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCBDb2RlRmxhc2sgZnJvbSAnY29kZWZsYXNrJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvZGUnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDNcbiAgICB9LFxuXG4gICAgc3R5bGUoKSB7XG4gICAgICByZXR1cm4gYGhlaWdodDogY2FsYygke3RoaXMubGluZXN9ZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpYFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IGZsYXNrID0gbmV3IENvZGVGbGFzayh0aGlzLiRyZWZzLmNvZGUsIHtcbiAgICAgIGxhbmd1YWdlOiB0aGlzLnNjaGVtYS5sYW5ndWFnZSB8fCAnamF2YXNjcmlwdCcsXG4gICAgICB0YWJTaXplOiB0aGlzLnNjaGVtYS5pbmRlbnRTaXplIHx8IDIsXG4gICAgICBsaW5lTnVtYmVyczogZmFsc2VcbiAgICB9KVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgbGV0IGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHRoaXMuZG9tT24odGhpcy4kcmVmcy5jb2RlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyksIHtcbiAgICAgIGZvY3VzOiBvbkZvY3VzLFxuICAgICAgYmx1cjogb25CbHVyXG4gICAgfSlcblxuICAgIGNvbnN0IHNldENvZGUgPSBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSBmbGFzay5jb2RlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IHRydWVcbiAgICAgICAgZmxhc2sudXBkYXRlQ29kZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgb25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsYXNrLm9uVXBkYXRlKHZhbHVlID0+IHtcbiAgICAgIGlmIChpZ25vcmVVcGRhdGUpIHtcbiAgICAgICAgaWdub3JlVXBkYXRlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q29kZSh2YWx1ZSB8fCAnJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0Q29kZSh0aGlzLnZhbHVlIHx8ICcnKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpPy5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29kZSB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gRm9yIHByb3BlciBzaXppbmcgb2YgY29udGVudCBhbG9uZyB3aXRoIDpzdHlsZT1cInN0eWxlXCIgc2V0dGluZyBhYm92ZSxcbiAgLy8gZm9yIHByb3BlciBsaW5lLWhlaWdodCBjYWxjdWxhdGlvbi5cbiAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiBhdXRvO1xuICB9XG5cbiAgLmNvZGVmbGFzayB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAvLyBJZ25vcmUgdGhlIHBhcmVudCBwYWRkaW5nIGRlZmluZWQgYWJvdmUgd2hpY2ggaXMgb25seSBuZWVkZWQgdG8gc2V0XG4gICAgLy8gdGhlIGRlc2lyZWQgaGVpZ2h0IHdpdGggOnN0eWxlPVwic3R5bGVcIi5cbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19wcmUge1xuICAgIC8vIFVzZSBzYW1lIHBhZGRpbmcgYXMgLmRpdG8tY29kZVxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG5cbiAgLmNvZGVmbGFza19fdGV4dGFyZWEsXG4gIC5jb2RlZmxhc2tfX2NvZGUsXG4gIC5jb2RlZmxhc2tfX2xpbmVzIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUpO1xuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7XG4gIH1cblxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWNvbG9yKFxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAuZGl0by1pbnB1dCg6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIilcbiAgICAgIGlucHV0KFxuICAgICAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwiaGV4VmFsdWVcIlxuICAgICAgICB0eXBlPVwiaW5wdXRcIlxuICAgICAgICBzaXplPVwiOFwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgLmRpdG8tY29sb3ItcHJldmlldy5kaXRvLWluaGVyaXQtZm9jdXMoXG4gICAgICAgIHYtaWY9XCJ2YWx1ZVwiXG4gICAgICApXG4gICAgICAgIGRpdig6c3R5bGU9XCJ7IGJhY2tncm91bmQ6IGAjJHtoZXhWYWx1ZSB8fCAnMDAwMDAwMDAnfWAgfVwiKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIEBjbGljay5zdG9wPVwiY2xlYXJcIlxuICAgICAgKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgU2tldGNoUGlja2VyLmRpdG8tY29sb3ItcGlja2VyKFxuICAgICAgdi1tb2RlbD1cImNvbG9yVmFsdWVcIlxuICAgICAgOmRpc2FibGVBbHBoYT1cIiFhbHBoYVwiXG4gICAgICA6ZGlzYWJsZUZpZWxkcz1cIiFpbnB1dHNcIlxuICAgICAgOnByZXNldENvbG9ycz1cInByZXNldHNcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgdGlueWNvbG9yIGZyb20gJ3Rpbnljb2xvcjInXG5pbXBvcnQgeyBTa2V0Y2ggYXMgU2tldGNoUGlja2VyIH0gZnJvbSAnQGxrNzcvdnVlMy1jb2xvcidcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFRyaWdnZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29sb3InLCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgU2tldGNoUGlja2VyIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIGNvbnZlcnRlZEhleFZhbHVlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29sb3JWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB7fVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuY29sb3JGb3JtYXRcbiAgICAgICAgY29uc3Qga2V5ID0gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHZ1ZTMtY29sb3IgY2FsbHMgaXQgJ2hleCcsIHdoaWxlIHRpbnljb2xvciBjYWxscyBpdCAnaGV4NidcbiAgICAgICAgICAgIGhleDogdmFsdWU/LmEgPCAxID8gJ2hleDgnIDogJ2hleCcsXG4gICAgICAgICAgICByZ2I6ICdyZ2JhJ1xuICAgICAgICAgIH1bZm9ybWF0XSB8fFxuICAgICAgICAgIGZvcm1hdFxuICAgICAgICApXG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aW55Y29sb3IodmFsdWUpLnRvU3RyaW5nKGZvcm1hdClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGV4VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZSA9IG51bGxcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IodGhpcy52YWx1ZSlcbiAgICAgICAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBjb2xvclxuICAgICAgICAgICAgICAudG9TdHJpbmcoY29sb3IuZ2V0QWxwaGEoKSA8IDEgPyAnaGV4OCcgOiAnaGV4NicpXG4gICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBgZm9ybWF0YCBjbGFzaGVzIHdpdGggVHlwZU1peGluLmZvcm1hdCgpYCwgd2hpY2ggc2hhbGwgYmUgcmVuYW1lZFxuICAgIC8vIHNvb24gdG8gYGZvcm1hdFZhbHVlKClgLiBSZW5hbWUgYGNvbG9yRm9ybWF0YCBiYWNrIHRvIGBmb3JtYXRgIGFmdGVyLlxuICAgIGNvbG9yRm9ybWF0OiBnZXRTY2hlbWFBY2Nlc3NvcignZm9ybWF0Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hleCdcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0FscGhhYD9cbiAgICBhbHBoYTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FscGhhJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dJbnB1dHNgP1xuICAgIGlucHV0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSksXG5cbiAgICBwcmVzZXRzOiBnZXRTY2hlbWFBY2Nlc3NvcigncHJlc2V0cycsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogW1xuICAgICAgICAnI2ZmZmZmZicsXG4gICAgICAgICcjYzNjM2MzJyxcbiAgICAgICAgJyM3ZjdmN2YnLFxuICAgICAgICAnIzAwMDAwMCcsXG4gICAgICAgICcjODgwMDE1JyxcbiAgICAgICAgJyNlZDFjMjQnLFxuICAgICAgICAnI2ZmN2YyNycsXG4gICAgICAgICcjZmZmMjAwJyxcblxuICAgICAgICAnIzIyYjE0YycsXG4gICAgICAgICcjMDBhMmU4JyxcbiAgICAgICAgJyMzZjQ4Y2MnLFxuICAgICAgICAnI2EzNDlhNCcsXG4gICAgICAgICcjYjk3YTU3JyxcbiAgICAgICAgJyNmZmFlYzknLFxuICAgICAgICAnI2ZmYzkwZScsXG4gICAgICAgICcjMDAwMDAwMDAnXG4gICAgICBdXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzZWQoZm9jdXNlZCkge1xuICAgICAgaWYgKCFmb2N1c2VkICYmIHRoaXMuY29udmVydGVkSGV4VmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IoYCMke3RoaXMuY29udmVydGVkSGV4VmFsdWV9YClcbiAgICAgICAgaWYgKGNvbG9yPy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gY29sb3IudG9TdHJpbmcodGhpcy5jb2xvckZvcm1hdClcbiAgICAgICAgICAvLyBUT0RPOiBFbWl0ICdpbnB1dCcgaGVyZSBpbnN0ZWFkLCBhbmQgJ2NoYW5nZScgaW4gYmx1ciwgbGlrZSBvdGhlcnMuXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kY29sb3Itc3dhdGNoLXdpZHRoOiAkcGF0dGVybi10cmFuc3BhcmVuY3ktc2l6ZTtcbiRjb2xvci1zd2F0Y2gtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtICRib3JkZXItd2lkdGg7XG5cbi5kaXRvLWNvbG9yIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGlucHV0IHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgcGFkZGluZy1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIG1hcmdpbi1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgfVxuXG4gIC5kaXRvLWNvbG9yLXBpY2tlciB7XG4gICAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIH1cblxuICAuZGl0by1jb2xvci1wcmV2aWV3IHtcbiAgICBiYWNrZ3JvdW5kOiAkcGF0dGVybi10cmFuc3BhcmVuY3k7XG4gICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG5cbiAgICAmLFxuICAgIGRpdiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICB2LWJpbmQ9XCIkcHJvcHNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbi8vIFRoaXMgaXMgdGhlIGdlbmVyYWwgcHVycG9zZSAnY29tcG9uZW50JyB0eXBlLCB3aGljaCBjYW4gcmVzb2x2ZSB0byBhbnkgY3VzdG9tXG4vLyBjb21wb25lbnQgdGhyb3VnaCBgc2NoZW1hLmNvbXBvbmVudGAsIHNlZSBgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCgpYC4gVGhpc1xuLy8gY2FuIGJlIHVzZWQgdG8gbmVzdCBhcmJpdHJhcnkgdnVlIGNvbXBvbmVudHMgaW4gc2NoZW1hOlxuLy8ge1xuLy8gICB0eXBlOiAnY29tcG9uZW50Jyxcbi8vICAgY29tcG9uZW50OiBpbXBvcnQoJy4vY29tcG9uZW50Jylcbi8vIH1cblxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb21wb25lbnQnLCB7XG4gIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBgZGVmYXVsdFZhbHVlOiBudWxsYCB0byBub3Qgc2V0IGFueSBkYXRhIGZvciBjdXN0b21cbiAgLy8gY29tcG9uZW50cywgdW5sZXNzIHRoZXkgcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUuXG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEpIHtcbiAgICBhd2FpdCByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0cmlnZ2VyIGV2YWx1YXRpb24gb2YgYHZhbHVlYCB0aGF0IGRvc2Ugbm90XG4vLy0gaW52b2x2ZSBhY3R1YWxseSByZW5kZXJpbmcgaXQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCB2aXNpYmxlLlxuaW5wdXQuZGl0by10ZXh0LmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDpuYW1lPVwibmFtZVwiXG4gIHR5cGU9XCJ0ZXh0XCJcbiAgOnZhbHVlPVwidmFsdWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpyZWFkb25seT1cInRydWVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RhdGFNaXhpbi5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnY29tcHV0ZWQnLCAnZGF0YScsICdoaWRkZW4nXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgICBkZWZhdWx0VmlzaWJsZTogZmFsc2UsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzXG4gICAgICAgICAgaWYgKHNjaGVtYS5kYXRhIHx8IHNjaGVtYS5kYXRhUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEoc2NoZW1hLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgICAvLyBNb2RpZnlpbmcgYHRoaXMuZGF0YWAgYmVsb3cgdHJpZ2dlcnMgYW5vdGhlciBjYWxsIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgdmFsdWVgIGdldHRlciwgc28gdXNlIGEgdmFsdWUgb2YgMiBmb3IgYHJlc29sdmVDb3VudGVyYCB0b1xuICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc29sdmVkIGRhdGEgdHdpY2UuXG4gICAgICAgICAgICAgIHJlc29sdmVDb3VudGVyOiAyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuZ2V0LmNhbGwodGhpcylcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGVcbiAgY29tcG9uZW50KFxuICAgIDppcz1cImdldENvbXBvbmVudCh0eXBlKVwiXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJkYXRlVmFsdWVcIlxuICAgIDpsb2NhbGU9XCJsb2NhbGVcIlxuICAgIDpkYXRlRm9ybWF0PVwieyAuLi5hcGkuZm9ybWF0cy5kYXRlLCAuLi5kYXRlRm9ybWF0IH1cIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIERhdGVUaW1lUGlja2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSxcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG9ubHkgaGVyZSBzbyB3ZSBnZXQgcGxhY2Vob2xkZXIgYWRkZWQuIENvbWUgdXAgd2l0aCBhXG4gICAgLy8gYmV0dGVyIHdheSB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgcGVyIGNvbXBvbmVudCAoYSBsaXN0IG9mIGFjdHVhbGx5XG4gICAgLy8gc3VwcG9ydGVkIGF0dHJpYnV0ZXMpXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRhdGVWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRhdGVGb3JtYXQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkYXRlRm9ybWF0Jywge1xuICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldENvbXBvbmVudCh0eXBlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0ZTogJ2RhdGUtcGlja2VyJyxcbiAgICAgICAgICB0aW1lOiAndGltZS1waWNrZXInLFxuICAgICAgICAgIGRhdGV0aW1lOiAnZGF0ZS10aW1lLXBpY2tlcidcbiAgICAgICAgfVt0eXBlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzRGF0ZSh2YWx1ZSkgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogdmFsdWVcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4vUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTY2hlbWFQYXJlbnRNaXhpbiBmcm9tICcuLi9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciwgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYSxcbiAgcHJvY2Vzc0Zvcm1zLFxuICBnZXROYW1lZFNjaGVtYXMsXG4gIGdldEJ1dHRvblNjaGVtYXMsXG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICBnZXRWaWV3U2NoZW1hLFxuICBoYXNMYWJlbHMsXG4gIGlzQ29tcGFjdCxcbiAgaXNJbmxpbmVkLFxuICBpc09iamVjdFNvdXJjZSxcbiAgaXNMaXN0U291cmNlXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgaXNOdW1iZXIsXG4gIGVxdWFscyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbUmVzb3VyY2VNaXhpbiwgU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGRlZmF1bHRWYWx1ZShzY2hlbWEpIHtcbiAgICByZXR1cm4gaXNMaXN0U291cmNlKHNjaGVtYSkgPyBbXSA6IG51bGxcbiAgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyYXBwZWRQcmltaXRpdmVzOiBudWxsLFxuICAgICAgdW53cmFwcGluZ1ByaW1pdGl2ZXM6IGZhbHNlLFxuICAgICAgaWdub3JlUm91dGVDaGFuZ2U6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgaXNPYmplY3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy50eXBlKVxuICAgIH0sXG5cbiAgICBpc0xpc3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNMaXN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uaGFzRGF0YSgpXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmFsdWVcbiAgICB9LFxuXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgIC8vIExpc3RzIHRoYXQgaGF2ZSBubyBkYXRhIGFuZCBubyBhc3NvY2lhdGVkIHJlc291cmNlIHNob3VsZCBzdGlsbCByZW5kZXIsXG4gICAgICAvLyBhcyB0aGV5IG1heSBiZSBnZXR0aW5nIHRoZWlyIGRhdGEgZWxzZXdoZXJlLCBlLmcuIGBjb21wdXRlKClgLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzRGF0YSB8fCAhdGhpcy5wcm92aWRlc0RhdGFcbiAgICB9LFxuXG4gICAgaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdDb21wb25lbnRcbiAgICB9LFxuXG4gICAgd3JhcFByaW1pdGl2ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEud3JhcFByaW1pdGl2ZXNcbiAgICB9LFxuXG4gICAgbGlzdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBsaXN0IGFycmF5LlxuICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBbZGF0YV0gOiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGRhdGEgZ2V0cyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIHVud3JhcHBpbmcgaXMgbm90IGhhcHBlbmluZ1xuICAgICAgICAgIC8vIGF0IHRoZSByb290IGluIGBzZXREYXRhKClgLCBidXQgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVud3JhcExpc3REYXRhKGRhdGEpIHx8IGRhdGFcbiAgICAgICAgfVxuICAgICAgICBkYXRhIHx8PSBbXVxuICAgICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSB0aGlzXG4gICAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIGlmICh0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHVud3JhcHBpbmcgb25jZSBgbGlzdERhdGFgIGlzIHJlZXZhbHVhdGVkLCBzbyBzZXRcbiAgICAgICAgICAgIC8vIHRoaXMgdG8gYGZhbHNlYCBhZ2Fpbi4gU2VlIGB3cmFwcGVkUHJpbWl0aXZlc2Agd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcyA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSB0byBhIGxpc3Qgb2Ygd3JhcHBlZCBwcmltaXRpdmVzLCBhbmQgcmV0dXJuIGl0LlxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YS5tYXAodmFsdWUgPT4gKHtcbiAgICAgICAgICAgICAgW3dyYXBQcmltaXRpdmVzXTogdmFsdWVcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkUHJpbWl0aXZlc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9LFxuXG4gICAgICBzZXQoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy53cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIHRoaXMud3JhcHBlZFByaW1pdGl2ZXMgPSBkYXRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBkYXRhWzBdXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2JqZWN0RGF0YToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICAvLyBBbHdheXMgZ28gdGhyb3VnaCBgbGlzdERhdGFgIGludGVybmFsbHksIHdoaWNoIGRvZXMgYWxsIHRoZVxuICAgICAgICAvLyBwcm9jZXNzaW5nIG9mIGB3cmFwUHJpbWl0aXZlc2AsIGV0Yy5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdERhdGFbMF0gfHwgbnVsbFxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IGRhdGEgPyBbZGF0YV0gOiBbXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3VyY2VTY2hlbWEoKSB7XG4gICAgICAvLyBUaGUgc291cmNlU2NoZW1hIG9mIGEgbGlzdCBpcyB0aGUgbGlzdCdzIHNjaGVtYSBpdHNlbGYuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIC8vIFRoaXMgaXMgdXNlZCBpbiBUeXBlTGlzdCBmb3IgRGl0b0Zvcm1DaG9vc2VyLlxuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQuZ2V0Q2hpbGRQYXRoKHRoaXMuc2NoZW1hLnBhdGgpXG4gICAgfSxcblxuICAgIGRlZmF1bHRRdWVyeSgpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdE9yZGVyOiBvcmRlciB9ID0gdGhpc1xuICAgICAgcmV0dXJuIG9yZGVyID8geyBvcmRlciB9IDoge31cbiAgICB9LFxuXG4gICAgcXVlcnk6IGdldFN0b3JlQWNjZXNzb3IoJ3F1ZXJ5Jywge1xuICAgICAgZ2V0KHF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0UXVlcnksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgc2V0KHF1ZXJ5KSB7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBkaXNwbGF5ZWQgcXVlcnkgcGFyYW1ldGVycyBpbiBzeW5jIHdpdGggdGhlIHN0b3JlZFxuICAgICAgICAvLyBvbmVzLiBVc2Ugc2NvcGUgYW5kIHBhZ2UgZnJvbSB0aGUgbGlzdCBzY2hlbWEgYXMgZGVmYXVsdHMsIGJ1dCBhbGxvd1xuICAgICAgICAvLyB0aGUgcm91dGUgcXVlcnkgcGFyYW1ldGVycyB0byBvdmVycmlkZSB0aGVtLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc2NvcGUgPSB0aGlzLmRlZmF1bHRTY29wZT8ubmFtZSxcbiAgICAgICAgICBwYWdlID0gdGhpcy5zY2hlbWEucGFnZVxuICAgICAgICB9ID0gdGhpcy5xdWVyeVxuICAgICAgICAvLyBQcmVzZXJ2ZSAvIG1lcmdlIGN1cnJlbnRseSBzdG9yZWQgdmFsdWVzLlxuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgIC4uLihzY29wZSAhPSBudWxsICYmIHsgc2NvcGUgfSksXG4gICAgICAgICAgLi4uKHBhZ2UgIT0gbnVsbCAmJiB7IHBhZ2UgfSksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFscyhxdWVyeSwgdGhpcy4kcm91dGUucXVlcnkpKSB7XG4gICAgICAgICAgLy8gVGVsbCB0aGUgYCRyb3V0ZWAgd2F0Y2hlciB0byBpZ25vcmUgdGhlIGNoYW5nZWQgdHJpZ2dlcmVkIGhlcmU6XG4gICAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7IHF1ZXJ5LCBoYXNoOiB0aGlzLiRyb3V0ZS5oYXNoIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1ZXJ5IC8vIExldCBnZXRTdG9yZUFjY2Vzc29yKCkgZG8gdGhlIGFjdHVhbCBzZXR0aW5nXG4gICAgICB9XG4gICAgfSksXG5cbiAgICB0b3RhbDogZ2V0U3RvcmVBY2Nlc3NvcigndG90YWwnKSxcblxuICAgIGNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLmNvbHVtbnMpXG4gICAgfSxcblxuICAgIHNjb3BlcygpIHtcbiAgICAgIHJldHVybiBnZXROYW1lZFNjaGVtYXModGhpcy5zY2hlbWEuc2NvcGVzKVxuICAgIH0sXG5cbiAgICBkZWZhdWx0U2NvcGUoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBzY29wZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2NvcGVzKSkge1xuICAgICAgICAgIGlmIChzY29wZS5kZWZhdWx0U2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgICAgICBmaXJzdCA9IHNjb3BlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3RcbiAgICB9LFxuXG4gICAgZGVmYXVsdE9yZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuY29sdW1ucykpIHtcbiAgICAgICAgICBjb25zdCB7IGRlZmF1bHRTb3J0IH0gPSBjb2x1bW5cbiAgICAgICAgICBpZiAoZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGlzU3RyaW5nKGRlZmF1bHRTb3J0KSA/IGRlZmF1bHRTb3J0IDogJ2FzYydcbiAgICAgICAgICAgIHJldHVybiBgJHtjb2x1bW4ubmFtZX0gJHtkaXJlY3Rpb259YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb3JtcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGdldEZvcm1TY2hlbWFzKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpKVxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5rZWQgdmlldyBzY2hlbWEgaWYgdGhpcyBzb3VyY2UgZWRpdHMgaXQgaXRzIGl0ZW1zIHRocm91Z2hcbiAgICAvLyBhIGxpbmtlZCB2aWV3LlxuICAgIHZpZXcoKSB7XG4gICAgICByZXR1cm4gZ2V0Vmlld1NjaGVtYSh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmlld1xuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEuYnV0dG9ucylcbiAgICB9LFxuXG4gICAgaGFzTGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybXMuc29tZShoYXNMYWJlbHMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbXBvbmVudHMgPSB7XG4gICd0ZXh0JyhmaWx0ZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvbnRhaW5zJyxcbiAgICAgICAgdmFsdWU6ICdjb250YWlucydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZXF1YWxzJyxcbiAgICAgICAgdmFsdWU6ICdlcXVhbHMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N0YXJ0cyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdzdGFydHMtd2l0aCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZW5kcyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdlbmRzLXdpdGgnXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogaXNBcnJheShmaWx0ZXIub3BlcmF0b3JzKVxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IGZpbHRlci5vcGVyYXRvcnMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLFxuICAgICAgICAgICAgd2lkdGg6ICc0MCUnXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgd2lkdGg6IGZpbHRlci5vcGVyYXRvcnMgPyAnNjAlJyA6ICdmaWxsJ1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzUGFuZWwoZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIGxhYmVsOiAnRmlsdGVycycsXG4gICAgbmFtZTogJyRmaWx0ZXJzJyxcbiAgICB0YXJnZXQ6IGRhdGFQYXRoLFxuICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIC8vIE5PVEU6IE9uIHBhbmVscywgdGhlIGRhdGEoKSBjYWxsYmFjayBkb2VzIHNvbWV0aGluZyBlbHNlIHRoYW4gb24gbm9ybWFsXG4gICAgLy8gc2NoZW1hOiBJdCBwcm9kdWNlcyB0aGUgYGRhdGFgIHByb3BlcnR5IHRvIGJlIHBhc3NlZCB0byB0aGUgcGFuZWwnc1xuICAgIC8vIHNjaGVtYSwgbm90IHRoZSBkYXRhIHRvIGJlIHVzZWQgZm9yIHRoZSBwYW5lbCBjb21wb25lbnQgZGlyZWN0bHkuXG4gICAgZGF0YSgpIHtcbiAgICAgIHJldHVybiBwYXJzZUZpbHRlcnNEYXRhKFxuICAgICAgICBwYW5lbCxcbiAgICAgICAgcHJveHkucXVlcnlcbiAgICAgIClcbiAgICB9LFxuICAgIGNvbXBvbmVudHM6IGdldEZpbHRlcnNDb21wb25lbnRzKGZpbHRlcnMpLFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNsZWFyOiB7XG4gICAgICAgIHRleHQ6ICdDbGVhcicsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAgIHNjaGVtYUNvbXBvbmVudC5yZXNldERhdGEoKVxuICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50LmFwcGx5RmlsdGVycygpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgIHRleHQ6ICdGaWx0ZXInLFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBjbGljayh7IHNjaGVtYUNvbXBvbmVudCB9KSB7XG4gICAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGFwcGx5RmlsdGVycygpIHtcbiAgICAgICAgcHJveHkucXVlcnkgPSB7XG4gICAgICAgICAgLi4ucHJveHkucXVlcnksXG4gICAgICAgICAgZmlsdGVyOiBmb3JtYXRGaWx0ZXJzRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhKSxcbiAgICAgICAgICAvLyBDbGVhciBwYWdpbmF0aW9uIHdoZW4gYXBwbHlpbmcgb3IgY2xlYXJpbmcgZmlsdGVyczpcbiAgICAgICAgICBwYWdlOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGFuZWxcbn1cblxuZnVuY3Rpb24gZ2V0RmlsdGVyc0NvbXBvbmVudHMoZmlsdGVycykge1xuICBjb25zdCBjb21wcyA9IHt9XG4gIGZvciAoY29uc3QgZmlsdGVyIG9mIE9iamVjdC52YWx1ZXMoZmlsdGVycyB8fCB7fSkpIHtcbiAgICAvLyBTdXBwb3J0IGJvdGggY3VzdG9tIGZvcm1zIGFuZCBkZWZhdWx0IGZpbHRlciBjb21wb25lbnRzLCB0aHJvdWdoIHRoZVxuICAgIC8vIGBmaWx0ZXJDb21wb25lbnRzYCByZWdpc3RyeS4gRXZlbiBmb3IgZGVmYXVsdCBmaWx0ZXJzLCBzdGlsbCB1c2UgdGhlXG4gICAgLy8gcHJvcGVydGllcyBpbiBgZmlsdGVyYCBhcyB0aGUgYmFzZSBmb3IgYGZvcm1gLCBzbyB0aGluZ3MgbGlrZSBgbGFiZWxgXG4gICAgLy8gY2FuIGJlIGNoYW5nZWQgb24gdGhlIHJlc3VsdGluZyBmb3JtLlxuICAgIGNvbnN0IHsgZmlsdGVyOiB0eXBlLCAuLi5mb3JtIH0gPSBmaWx0ZXJcbiAgICBjb25zdCBjb21wb25lbnRzID0gdHlwZVxuICAgICAgPyBmaWx0ZXJDb21wb25lbnRzW3R5cGVdPy4oZmlsdGVyKVxuICAgICAgOiBmaWx0ZXIuY29tcG9uZW50c1xuICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICBmb3JtLmNvbXBvbmVudHMgPSB7fVxuICAgICAgLy8gQ29udmVydCBsYWJlbHMgdG8gcGxhY2Vob2xkZXJzOlxuICAgICAgZm9yIChjb25zdCBba2V5LCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudHMpKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IGNvbXBvbmVudC5sYWJlbCB8fCBsYWJlbGl6ZShjb21wb25lbnQubmFtZSB8fCBrZXkpXG4gICAgICAgICAgZm9ybS5jb21wb25lbnRzW2tleV0gPSB7XG4gICAgICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgICAgICBsYWJlbDogZmFsc2UsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogbGFiZWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbXBzW2ZpbHRlci5uYW1lXSA9IHtcbiAgICAgICAgbGFiZWw6IGZvcm0ubGFiZWwsXG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBkZWZhdWx0OiAoKSA9PiAoe30pLFxuICAgICAgICBmb3JtLFxuICAgICAgICBpbmxpbmVkOiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZmlsdGVyICcke2ZpbHRlci5uYW1lfSc6IFVua25vd24gZmlsdGVyIHR5cGUgJyR7dHlwZX0nLmBcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBzXG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudHNGb3JGaWx0ZXIoc2NoZW1hLCBuYW1lKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHNjaGVtYS5jb21wb25lbnRzW25hbWVdXG4gIHJldHVybiBjb21wb25lbnQ/LmZvcm0/LmNvbXBvbmVudHNcbn1cblxuZnVuY3Rpb24gZm9ybWF0RmlsdGVyc0RhdGEoc2NoZW1hLCBkYXRhKSB7XG4gIGNvbnN0IGZpbHRlcnMgPSBbXVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gZGF0YSkge1xuICAgIGNvbnN0IGVudHJ5ID0gZGF0YVtuYW1lXVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gTWFwIGNvbXBvbmVudHMgc2VxdWVuY2UgdG8gYXJndW1lbnRzOlxuICAgICAgY29uc3QgYXJncyA9IE9iamVjdC5rZXlzKGdldENvbXBvbmVudHNGb3JGaWx0ZXIoc2NoZW1hLCBuYW1lKSkubWFwKFxuICAgICAgICBrZXkgPT4gZW50cnlba2V5XSA/PyBudWxsXG4gICAgICApXG4gICAgICAvLyBPbmx5IGFwcGx5IGZpbHRlciBpZiB0aGVyZSBhcmUgc29tZSBhcmd1bWVudHMgdGhhdCBhcmVuJ3QgbnVsbDpcbiAgICAgIGlmIChhcmdzLnNvbWUodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgIGZpbHRlcnMucHVzaChgJHtuYW1lfToke2FyZ3MubWFwKEpTT04uc3RyaW5naWZ5KS5qb2luKCcsJyl9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbHRlcnMubGVuZ3RoID8gZmlsdGVycyA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBwYXJzZUZpbHRlcnNEYXRhKHNjaGVtYSwgcXVlcnkpIHtcbiAgY29uc3QgZmlsdGVycyA9IHt9XG4gIC8vIFNhbWUgYXMgQGRpdG9qcy9zZXJ2ZXIncyBRdWVyeVBhcmFtZXRlcnMuZmlsdGVyOiBUcmFuc2xhdGUgdGhlIHN0cmluZyBkYXRhXG4gIC8vIGZyb20gJHJvdXRlLnF1ZXJ5IGJhY2sgdG8gcGFyYW0gbGlzdHMgcGVyIGZpbHRlcjpcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgYXNBcnJheShxdWVyeS5maWx0ZXIpKSB7XG4gICAgICBjb25zdCBbLCBuYW1lLCBqc29uXSA9IGZpbHRlci5tYXRjaCgvXihcXHcrKTooLiopJC8pXG4gICAgICB0cnkge1xuICAgICAgICBmaWx0ZXJzW25hbWVdID0gYXNBcnJheShKU09OLnBhcnNlKGBbJHtqc29ufV1gKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH1cbiAgfVxuICBjb25zdCBmaWx0ZXJzRGF0YSA9IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBzY2hlbWEuY29tcG9uZW50cykge1xuICAgIGNvbnN0IGRhdGEgPSB7fVxuICAgIC8vIElmIHdlIGhhdmUgcmV0cmlldmVkIHBhcmFtcyBmcm9tIHRoZSBxdWVyeSwgZmV0Y2ggdGhlIGFzc29jaWF0ZWRcbiAgICAvLyBmb3JtIGNvbXBvbmVudHMgc28gd2UgY2FuIG1hcCB0aGUgdmFsdWVzIGJhY2sgdG8gb2JqZWN0IGtleXM6XG4gICAgY29uc3QgYXJncyA9IGZpbHRlcnNbbmFtZV1cbiAgICBpZiAoYXJncykge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGb3JGaWx0ZXIoc2NoZW1hLCBuYW1lKVxuICAgICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gYXJnc1tpbmRleCsrXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZpbHRlcnNEYXRhW25hbWVdID0gZGF0YVxuICB9XG4gIHJldHVybiBmaWx0ZXJzRGF0YVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWxpc3QoXG4gIHYtaWY9XCJpc1JlYWR5XCJcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJzY2hlbWEuY2xhc3NcIlxuICA6c3R5bGU9XCJzY2hlbWEuc3R5bGVcIlxuKVxuICAuZGl0by1uYXZpZ2F0aW9uKFxuICAgIHYtaWY9XCJzY29wZXMgfHwgaGFzUGFnaW5hdGlvblwiXG4gIClcbiAgICBEaXRvU2NvcGVzKFxuICAgICAgdi1pZj1cInNjb3Blc1wiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6c2NvcGVzPVwic2NvcGVzXCJcbiAgICApXG4gICAgLy8tIFdoZW4gdGhlcmUncyBvbmx5IHBhZ2luYXRpb24gd2l0aG91dCBzY29wZXMsIHdlIG5lZWQgYSBnb29kIG9sJyBzcGFjZXJcbiAgICAvLy0gZGl2LCBmb3IgdGhlIGxheW91dCBub3QgdG8gYnJlYWsuLi5cbiAgICAuZGl0by1zcGFjZXIoXG4gICAgICB2LWVsc2UtaWY9XCJoYXNQYWdpbmF0aW9uXCJcbiAgICApXG4gICAgRGl0b1BhZ2luYXRpb24oXG4gICAgICB2LWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6bGltaXQ9XCJwYWdpbmF0ZVwiXG4gICAgICA6dG90YWw9XCJ0b3RhbCB8fCAwXCJcbiAgICApXG4gIHRhYmxlLmRpdG8tdGFibGUoXG4gICAgOmNsYXNzPWB7XG4gICAgICAnZGl0by10YWJsZS1zZXBhcmF0b3JzJzogaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtbGFyZ2VyLXBhZGRpbmcnOiBoYXNFZGl0QnV0dG9ucyAmJiAhaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtYWx0ZXJuYXRlLWNvbG9ycyc6ICFpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS1ldmVuLWNvdW50JzogaGFzRXZlbkNvdW50XG4gICAgfWBcbiAgKVxuICAgIERpdG9UYWJsZUhlYWQoXG4gICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgOmhhc0VkaXRCdXR0b25zPVwiaGFzRWRpdEJ1dHRvbnNcIlxuICAgIClcbiAgICBVc2VTb3J0YWJsZShcbiAgICAgIHRhZz1cInRib2R5XCJcbiAgICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0RGF0YSwgcGFnaW5hdGlvblJhbmdlKVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhkcmFnZ2FibGUpXCJcbiAgICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChsaXN0RGF0YSA9IHZhbHVlKVwiXG4gICAgKVxuICAgICAgdHIoXG4gICAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBsaXN0RGF0YVwiXG4gICAgICAgIDppZD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgIDprZXk9XCJnZXRJdGVtVWlkKHNjaGVtYSwgaXRlbSlcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiY29sdW1uIGluIGNvbHVtbnNcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIERpdG9UYWJsZUNlbGwoXG4gICAgICAgICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoY29sdW1uKVwiXG4gICAgICAgICAgICAgIDprZXk9XCJjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldENlbGxDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgICAgICAgOmNlbGw9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgKVxuICAgICAgICAgIHRkXG4gICAgICAgICAgICBEaXRvU2NoZW1hSW5saW5lZChcbiAgICAgICAgICAgICAgdi1pZj1cImlzSW5saW5lZFwiXG4gICAgICAgICAgICAgIDpsYWJlbD1cImdldEl0ZW1MYWJlbChzY2hlbWEsIGl0ZW0sIHsgaW5kZXgsIGFzT2JqZWN0OiB0cnVlIH0pXCJcbiAgICAgICAgICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgICAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgICA6ZWRpdFBhdGg9XCJnZXRFZGl0UGF0aChpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgICBAZGVsZXRlPVwiZGVsZXRlSXRlbShpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29tcG9uZW50KFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJyZW5kZXJcIlxuICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXIoZ2V0Q29udGV4dChpdGVtLCBpbmRleCkpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgICAgICB2LWh0bWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4IH0pXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9ucyhcbiAgICAgICAgICB2LWlmPVwiaGFzQ2VsbEVkaXRCdXR0b25zXCJcbiAgICAgICAgKVxuICAgICAgICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgICAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICA6ZWRpdGFibGU9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICA6ZWRpdFBhdGg9XCJnZXRFZGl0UGF0aChpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShpbmRleClcIlxuICAgICAgICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICApXG4gICAgLy8tIFJlbmRlciBjcmVhdGUgYnV0dG9ucyBpbnNpZGUgdGFibGUgd2hlbiBub3QgaW4gYSBzaW5nbGUgY29tcG9uZW50IHZpZXc6XG4gICAgdGZvb3QoXG4gICAgICB2LWlmPVwiaGFzTGlzdEJ1dHRvbnMgJiYgIXNpbmdsZVwiXG4gICAgKVxuICAgICAgdHJcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9ucyg6Y29sc3Bhbj1cIm51bUNvbHVtbnNcIilcbiAgICAgICAgICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgICAgICAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICAgICAgICAgIDpjcmVhdGVQYXRoPVwicGF0aFwiXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICA6ZGF0YT1cImxpc3REYXRhXCJcbiAgICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgKVxuICAvLy0gUmVuZGVyIGNyZWF0ZSBidXR0b25zIG91dHNpZGUgdGFibGUgd2hlbiBpbiBhIHNpbmdsZSBjb21wb25lbnQgdmlldzpcbiAgRGl0b0VkaXRCdXR0b25zLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICB2LWlmPVwiaGFzTGlzdEJ1dHRvbnMgJiYgc2luZ2xlXCJcbiAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwibGlzdERhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0TmFtZWRTY2hlbWFzLFxuICBnZXRWaWV3RWRpdFBhdGgsXG4gIHJlc29sdmVTY2hlbWFDb21wb25lbnQsXG4gIHJlc29sdmVTY2hlbWFDb21wb25lbnRzXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEZpbHRlcnNQYW5lbCB9IGZyb20gJy4uL3V0aWxzL2ZpbHRlci5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IHBpY2tCeSwgZXF1YWxzLCBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xpc3QnLCB7XG4gIG1peGluczogW1NvdXJjZU1peGluLCBTb3J0YWJsZU1peGluXSxcblxuICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAvLyBObyBuZWVkIGZvciB0cmFuc2Zvcm1hdGlvbiBoZXJlLiBTZWUgVHlwZVRyZWVMaXN0IGZvciBkZXRhaWxzLlxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgZ2V0UGFuZWxTY2hlbWEoc2NoZW1hLCBkYXRhUGF0aCwgc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBmaWx0ZXJzIH0gPSBzY2hlbWFcbiAgICAvLyBTZWUgaWYgdGhpcyBsaXN0IGNvbXBvbmVudCB3YW50cyB0byBkaXNwbGF5IGEgZmlsdGVyIHBhbmVsLCBhbmQgaWYgc28sXG4gICAgLy8gY3JlYXRlIHRoZSBwYW5lbCBzY2hlbWEgZm9yIGl0IHRocm91Z2ggYGdldEZpbHRlcnNQYW5lbCgpYC5cbiAgICBpZiAoZmlsdGVycykge1xuICAgICAgLy8gQXQgdGhlIHRpbWUgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBwYW5lbCBzY2hlbWEsIHRoZSBzY2hlbWFDb21wb25lbnQgaXNcbiAgICAgIC8vIG5vdCBmaWxsZWQgeWV0LCBzbyB3ZSBjYW4ndCBnZXQgdGhlIHRhcmdldCBjb21wb25lbnQgKGRhdGFQYXRoKSByaWdodFxuICAgICAgLy8gYXdheS4gVXNlIGEgcHJveHkgYW5kIGEgZ2V0dGVyIGluc3RlYWQsIHRvIGdldCBhcm91bmQgdGhpczpcbiAgICAgIGNvbnN0IGdldExpc3RDb21wb25lbnQgPSAoKSA9PlxuICAgICAgICBzY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aChcbiAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICBjb21wb25lbnQgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgICApXG5cbiAgICAgIHJldHVybiBnZXRGaWx0ZXJzUGFuZWwoXG4gICAgICAgIGdldE5hbWVkU2NoZW1hcyhmaWx0ZXJzKSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJveHkgdG8gZ2V0IC8gc2V0IHRoZSBxdWVyeSwgc2VlIGdldEZpbHRlcnNQYW5lbCgpXG4gICAgICAgICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldExpc3RDb21wb25lbnQoKT8ucXVlcnlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldCBxdWVyeShxdWVyeSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZ2V0TGlzdENvbXBvbmVudCgpXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmb3IgY29tcGFyaW5nIHdpdGggZXF1YWxzKClcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gb2JqID0+IHBpY2tCeShvYmosIHZhbHVlID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIGlmICghZXF1YWxzKGZpbHRlcihxdWVyeSksIGZpbHRlcihjb21wb25lbnQucXVlcnkpKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5xdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmxvYWREYXRhKGZhbHNlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUGFnaW5hdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRlICYmIHRoaXMudG90YWwgPiB0aGlzLnBhZ2luYXRlXG4gICAgfSxcblxuICAgIGhhc0xpc3RCdXR0b25zKCkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuYnV0dG9uU2NoZW1hcyB8fCB0aGlzLmNyZWF0YWJsZSlcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IGxpc3REYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsaXN0RGF0YS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kZWxldGFibGUgfHxcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0NlbGxFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0lubGluZWQgJiYgdGhpcy5oYXNFZGl0QnV0dG9uc1xuICAgIH0sXG5cbiAgICBoYXNFdmVuQ291bnQoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLmxpc3REYXRhLmxlbmd0aCAlIDIpXG4gICAgfSxcblxuICAgIG51bUNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5jb2x1bW5zID8gT2JqZWN0LmtleXModGhpcy5jb2x1bW5zKS5sZW5ndGggOiAxKSArXG4gICAgICAgICh0aGlzLmhhc0NlbGxFZGl0QnV0dG9ucyA/IDEgOiAwKVxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGF0YVBhdGgoaW5kZXgpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICB9LFxuXG4gICAgZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRWaWV3RWRpdFBhdGgodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dCkgfHwgdGhpcy5wYXRoXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0sIGluZGV4KVxuICAgICAgICByZXR1cm4gYCR7cGF0aH0vJHtpZH1gXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDZWxsQ2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gYGRpdG8tY2VsbC0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIGluZGV4LFxuICAgICAgICBkYXRhUGF0aDogdGhpcy5nZXREYXRhUGF0aChpbmRleClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRmlsdGVyRXJyb3JzKGVycm9ycykge1xuICAgICAgY29uc3QgZmlsdGVyc0RhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgJyRmaWx0ZXJzJylcbiAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0UGFuZWxCeURhdGFQYXRoKGZpbHRlcnNEYXRhUGF0aClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLmNvbHVtbnMpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1saXN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLW5hdmlnYXRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmctYm90dG9tOiAkY29udGVudC1wYWRkaW5nLWhhbGY7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc2NvcGVzLFxuICAgIC5kaXRvLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDAgMSBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgdG8gdGhlIGJvdHRvbTpcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9MYWJlbC5kaXRvLWxhYmVsLWNvbXBvbmVudChcbiAgOmxhYmVsPVwidmFsdWVcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xhYmVsJywge1xuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tbGFiZWwtY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyZW07XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW1hcmt1cCg6aWQ9XCJkYXRhUGF0aFwiKVxuICAuZGl0by1tYXJrdXAtdG9vbGJhcig6ZWRpdG9yPVwiZWRpdG9yXCIpXG4gICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtdG9vbGJhcihcbiAgICAgIHYtaWY9XCJncm91cGVkQnV0dG9ucy5sZW5ndGggPiAwXCJcbiAgICApXG4gICAgICAuZGl0by1idXR0b24tZ3JvdXAoXG4gICAgICAgIHYtZm9yPVwiYnV0dG9ucyBpbiBncm91cGVkQnV0dG9uc1wiXG4gICAgICApXG4gICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICB2LWZvcj1cInsgbmFtZSwgaWNvbiwgaXNBY3RpdmUsIG9uQ2xpY2sgfSBpbiBidXR0b25zXCJcbiAgICAgICAgICA6a2V5PVwibmFtZVwiXG4gICAgICAgICAgOmNsYXNzPVwieyAnZGl0by1hY3RpdmUnOiBpc0FjdGl2ZSB9XCJcbiAgICAgICAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgICAgICAgKVxuICAgICAgICAgIEljb24oOm5hbWU9XCJpY29uXCIpXG4gIEVkaXRvckNvbnRlbnQuZGl0by1tYXJrdXAtZWRpdG9yKFxuICAgIHJlZj1cImVkaXRvclwiXG4gICAgOmVkaXRvcj1cImVkaXRvclwiXG4gICAgOnN0eWxlPVwic3R5bGVzXCJcbiAgKVxuICAuZGl0by1yZXNpemUoXG4gICAgdi1pZj1cInJlc2l6YWJsZVwiXG4gICAgQG1vdXNlZG93bi5zdG9wLnByZXZlbnQ9XCJvbkRyYWdSZXNpemVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNvbnRlbnQsIE1hcmssIGdldE1hcmtBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC92dWUtMydcbi8vIGltcG9ydCB7IHRvZ2dsZU1hcmsgfSBmcm9tICd0aXB0YXAtY29tbWFuZHMnXG4vLyBFc3NlbnRpYWxzOlxuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1kb2N1bWVudCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0J1xuLy8gTWFya3M6XG5pbXBvcnQgeyBCb2xkIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYm9sZCdcbmltcG9ydCB7IENvZGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlJ1xuaW1wb3J0IHsgSXRhbGljIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taXRhbGljJ1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsnXG5pbXBvcnQgeyBTdHJpa2UgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1zdHJpa2UnXG5pbXBvcnQgeyBVbmRlcmxpbmUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi11bmRlcmxpbmUnXG4vLyBOb2RlczpcbmltcG9ydCB7IEJsb2NrcXVvdGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ibG9ja3F1b3RlJ1xuaW1wb3J0IHsgQ29kZUJsb2NrIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jaydcbmltcG9ydCB7IEhhcmRCcmVhayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhhcmQtYnJlYWsnXG5pbXBvcnQgeyBIZWFkaW5nIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGVhZGluZydcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXBhcmFncmFwaCdcbmltcG9ydCB7IEhvcml6b250YWxSdWxlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taG9yaXpvbnRhbC1ydWxlJ1xuaW1wb3J0IHsgT3JkZXJlZExpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1vcmRlcmVkLWxpc3QnXG5pbXBvcnQgeyBCdWxsZXRMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3QnXG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpc3QtaXRlbSdcbi8vIFRPRE86XG4vLyBpbXBvcnQgeyBJbWFnZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJ1xuLy8gaW1wb3J0IHsgTWVudGlvbiB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLW1lbnRpb24nXG4vLyBpbXBvcnQgeyBDb2RlQmxvY2tIaWdobGlnaHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrLWhpZ2hsaWdodCdcbi8vIGltcG9ydCB7IFRhYmxlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUnXG4vLyBpbXBvcnQgeyBUYWJsZUNlbGwgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1jZWxsJ1xuLy8gaW1wb3J0IHsgVGFibGVIZWFkZXIgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1oZWFkZXInXG4vLyBpbXBvcnQgeyBUYWJsZU5vZGVzIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtbm9kZXMnXG4vLyBpbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLXJvdydcbi8vIGltcG9ydCB7IFRhc2tMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFzay1saXN0J1xuLy8gaW1wb3J0IHsgVGFza0l0ZW0gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YXNrLWl0ZW0nXG4vLyBUb29sczpcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oaXN0b3J5J1xuXG5pbXBvcnQgeyBJY29uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgdW5kZXJzY29yZSxcbiAgaHlwaGVuYXRlLFxuICBkZWJvdW5jZSxcbiAgY2FtZWxpemVcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtYXJrdXAnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czoge1xuICAgIEVkaXRvckNvbnRlbnQsXG4gICAgSWNvblxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRvcjogbnVsbCxcbiAgICAgIGhlaWdodDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDEwXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQgfHwgYGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWFya0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdtYXJrcycsIHtcbiAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgaXRhbGljOiB0cnVlLFxuICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgIHN0cmlrZTogdHJ1ZSxcbiAgICAgICAgc21hbGw6IHRydWUsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICBvbkNsaWNrOiBlZGl0b3IgPT4gdGhpcy5vbkNsaWNrTGluayhlZGl0b3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGJhc2ljTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhlIHBhcmFncmFwaCBjb21tYW5kIGFzIGFjdGl2ZSBpZiBhbnkgb2YgdGhlIGJsb2NrXG4gICAgICAgICAgLy8gY29tbWFuZHMgYXJlIGFsc28gYWN0aXZlOlxuICAgICAgICAgIGlnbm9yZUFjdGl2ZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMub3RoZXJOb2RlQnV0dG9ucy5zb21lKGJ1dHRvbiA9PiBidXR0b24uaXNBY3RpdmUpXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRpbmc6IHtcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdsZXZlbCcsXG4gICAgICAgICAgdmFsdWVzOiBbMSwgMiwgMywgNCwgNSwgNl1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb3RoZXJOb2RlQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ25vZGVzJywge1xuICAgICAgICBidWxsZXRMaXN0OiB0cnVlLFxuICAgICAgICBvcmRlcmVkTGlzdDogdHJ1ZSxcbiAgICAgICAgYmxvY2txdW90ZTogdHJ1ZSxcbiAgICAgICAgY29kZUJsb2NrOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB0b29sQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ3Rvb2xzJywge1xuICAgICAgICB1bmRvOiB0cnVlLFxuICAgICAgICByZWRvOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBncm91cGVkQnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICB9ID0gdGhpc1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICBdLmZpbHRlcihidXR0b25zID0+IGJ1dHRvbnMubGVuZ3RoID4gMClcbiAgICB9LFxuXG4gICAgcGFyc2VPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiB7XG4gICAgICAgICAgJ2NvbGxhcHNlJzogZmFsc2UsXG4gICAgICAgICAgJ3ByZXNlcnZlJzogdHJ1ZSxcbiAgICAgICAgICAncHJlc2VydmUtYWxsJzogJ2Z1bGwnXG4gICAgICAgIH1bdGhpcy53aGl0ZXNwYWNlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlZGl0b3JPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRpdGFibGU6ICF0aGlzLnJlYWR5b25seSxcbiAgICAgICAgYXV0b0ZvY3VzOiB0aGlzLmF1dG9mb2N1cyxcbiAgICAgICAgZGlzYWJsZUlucHV0UnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLmlucHV0LFxuICAgICAgICBkaXNhYmxlUGFzdGVSdWxlczogIXRoaXMuZW5hYmxlUnVsZXMucGFzdGUsXG4gICAgICAgIHBhcnNlT3B0aW9uczogdGhpcy5wYXJzZU9wdGlvbnNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB3aGl0ZXNwYWNlOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2hpdGVzcGFjZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdjb2xsYXBzZSdcbiAgICAgIC8vIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICdjb2xsYXBzZScsICdwcmVzZXJ2ZScsICdwcmVzZXJ2ZS1hbGwnXG4gICAgfSksXG5cbiAgICBlbmFibGVSdWxlczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VuYWJsZVJ1bGVzJywge1xuICAgICAgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlbmFibGVSdWxlcykge1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoZW5hYmxlUnVsZXMpXG4gICAgICAgICAgPyBlbmFibGVSdWxlc1xuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpbnB1dDogISFlbmFibGVSdWxlcyxcbiAgICAgICAgICAgICAgcGFzdGU6ICEhZW5hYmxlUnVsZXNcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVhZHlvbmx5OiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgYXV0b2ZvY3VzOiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgZW5hYmxlUnVsZXM6ICd1cGRhdGVFZGl0b3JPcHRpb25zJ1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlRGVib3VuY2VkID0gZGVib3VuY2UoZWRpdG9yID0+IHtcbiAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKClcbiAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICBvbkNoYW5nZSgpXG4gICAgfSwgMTAwKVxuXG4gICAgY29uc3Qgb25VcGRhdGUgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgc2V0VmFsdWVEZWJvdW5jZWQoZWRpdG9yKVxuICAgICAgdGhpcy5vbklucHV0KClcbiAgICB9XG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSwgZmFsc2UsIHRoaXMucGFyc2VPcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5lZGl0b3JPcHRpb25zLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uVXBkYXRlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5nZXRFeHRlbnNpb25zKCksXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlIHx8ICcnXG4gICAgfSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkRyYWdSZXNpemUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGdldFBvaW50ID0gKHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KSA9PiAoeyB4LCB5IH0pXG5cbiAgICAgIGxldCBwcmV2WSA9IGdldFBvaW50KGV2ZW50KS55XG4gICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuJHJlZnMuZWRpdG9yLiRlbCkuaGVpZ2h0KVxuXG4gICAgICBjb25zdCBtb3VzZW1vdmUgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHsgeSB9ID0gZ2V0UG9pbnQoZXZlbnQpXG4gICAgICAgIGhlaWdodCArPSB5IC0gcHJldllcbiAgICAgICAgcHJldlkgPSB5XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoaGVpZ2h0LCAwKX1weGBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIG1vdXNlbW92ZSxcblxuICAgICAgICBtb3VzZXVwKGV2ZW50KSB7XG4gICAgICAgICAgbW91c2Vtb3ZlKGV2ZW50KVxuICAgICAgICAgIGhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHVwZGF0ZUVkaXRvck9wdGlvbnMoKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRPcHRpb25zKHRoaXMuZWRpdG9yT3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgb25DbGlja0xpbmsoZWRpdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgaHJlZjoge1xuICAgICAgICAgICAgdHlwZTogJ3VybCcsXG4gICAgICAgICAgICBsYWJlbDogJ0xpbmsnLFxuICAgICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgbGFiZWw6ICdUaXRsZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHt9LFxuICAgICAgICAgIGFwcGx5OiB7IHR5cGU6ICdzdWJtaXQnIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgY2xpY2soeyBkaWFsb2dDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudC5yZXNvbHZlKG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGdldE1hcmtBdHRyaWJ1dGVzKHRoaXMuZWRpdG9yLnN0YXRlLCAnbGluaycpXG4gICAgICB9KVxuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IHsgaHJlZiwgdGl0bGUgfSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAvLyBTZWUgaWYgYGhyZWZgIGNhbiBiZSBwYXJzZWQgYXMgYSBVUkwsIGFuZCBpZiBub3QsXG4gICAgICAgICAgLy8gcHJlZml4IGl0IHdpdGggYSBkZWZhdWx0IHByb3RvY29sLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgVVJMKGhyZWYpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBocmVmID0gYGh0dHBzOi8vJHtocmVmfWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnNldExpbmsoeyBocmVmLCB0aXRsZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVuc2V0TGluaygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV4dGVuc2lvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtzID0ge30sXG4gICAgICAgIG5vZGVzID0ge30sXG4gICAgICAgIHRvb2xzID0ge31cbiAgICAgIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gRXNzZW50aWFsczpcbiAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFBhcmFncmFwaCwgLy8gYnV0dG9uIGNhbiBiZSBjb250cm9sbGVkLCBidXQgbm9kZSBuZWVkcyB0byBiZSBvbi5cblxuICAgICAgICAvLyBNYXJrczogYHNjaGVtYS5tYXJrc2BcbiAgICAgICAgbWFya3MuYm9sZCAmJiBCb2xkLFxuICAgICAgICBtYXJrcy5pdGFsaWMgJiYgSXRhbGljLFxuICAgICAgICBtYXJrcy51bmRlcmxpbmUgJiYgVW5kZXJsaW5lLFxuICAgICAgICBtYXJrcy5zdHJpa2UgJiYgU3RyaWtlLFxuICAgICAgICBtYXJrcy5zbWFsbCAmJiBTbWFsbCxcbiAgICAgICAgbWFya3MuY29kZSAmJiBDb2RlLFxuICAgICAgICBtYXJrcy5saW5rICYmIExpbmtXaXRoVGl0bGUsXG5cbiAgICAgICAgLy8gTm9kZXM6IGBzY2hlbWEubm9kZXNgXG4gICAgICAgIG5vZGVzLmJsb2NrcXVvdGUgJiYgQmxvY2txdW90ZSxcbiAgICAgICAgbm9kZXMuY29kZUJsb2NrICYmIENvZGVCbG9jayxcbiAgICAgICAgSGFyZEJyZWFrLCAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbHdheXMgb24/XG4gICAgICAgIG5vZGVzLmhlYWRpbmcgJiYgSGVhZGluZy5jb25maWd1cmUoeyBsZXZlbHM6IG5vZGVzLmhlYWRpbmcgfSksXG4gICAgICAgIG5vZGVzLmhvcml6b250YWxSdWxlICYmIEhvcml6b250YWxSdWxlLFxuICAgICAgICAobm9kZXMub3JkZXJlZExpc3QgfHwgbm9kZXMuYnVsbGV0TGlzdCkgJiYgTGlzdEl0ZW0sXG4gICAgICAgIG5vZGVzLmJ1bGxldExpc3QgJiYgQnVsbGV0TGlzdCxcbiAgICAgICAgbm9kZXMub3JkZXJlZExpc3QgJiYgT3JkZXJlZExpc3QsXG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9JdGVtLFxuICAgICAgICAvLyBub2Rlcy50b2RvTGlzdCAmJiBUb2RvTGlzdCxcblxuICAgICAgICAvLyBUb29sczogYHNjaGVtYS50b29sc2BcbiAgICAgICAgdG9vbHMuaGlzdG9yeSAmJiBIaXN0b3J5XG4gICAgICBdLmZpbHRlcihleHRlbnNpb24gPT4gISFleHRlbnNpb24pXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbnMoc2V0dGluZ3NOYW1lLCBkZXNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXVxuXG4gICAgICBjb25zdCBhZGRCdXR0b24gPSAoeyBuYW1lLCBpY29uLCBhdHRyaWJ1dGVzLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSkgPT4ge1xuICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBpc0FjdGl2ZTogKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaXNBY3RpdmUobmFtZSwgYXR0cmlidXRlcykgJiZcbiAgICAgICAgICAgIChpZ25vcmVBY3RpdmUgPT0gbnVsbCB8fCAhaWdub3JlQWN0aXZlKCkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgdG9nZ2xlJHtjYW1lbGl6ZShuYW1lLCB0cnVlKX1gXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IuY29tbWFuZHNba2V5XSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYXR0cmlidXRlcyA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKClba2V5XShhdHRyaWJ1dGVzKS5mb2N1cygpLnJ1bigpXG4gICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICA/IG9uQ2xpY2sodGhpcy5lZGl0b3IsIGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgOiBjb21tYW5kKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2NoZW1hW3NldHRpbmdzTmFtZV1cbiAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlc2NyaXB0aW9uXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdGlvbnMpKSB7XG4gICAgICAgICAgY29uc3Qgc2V0dGluZ05hbWUgPSBbJ3VuZG8nLCAncmVkbyddLmluY2x1ZGVzKGtleSkgPyAnaGlzdG9yeScgOiBrZXlcbiAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHVuZGVyc2NvcmUoa2V5KVxuICAgICAgICAgIGNvbnN0IGljb24gPSBoeXBoZW5hdGUoa2V5KVxuICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGUsIHZhbHVlcywgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWVzKSAmJiBpc0FycmF5KHNldHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IGhlYWRpbmcgbGV2ZWwgYXR0cnM6XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhZGRCdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGAke2ljb259LSR7dmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgW2F0dHJpYnV0ZV06IHZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRCdXR0b24oeyBuYW1lLCBpY29uLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuXG5jb25zdCBTbWFsbCA9IE1hcmsuY3JlYXRlKHtcbiAgbmFtZTogJ3NtYWxsJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3NtYWxsJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoKSB7XG4gICAgcmV0dXJuIFsnc21hbGwnLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTbWFsbDpcbiAgICAgICAgYXR0cmlidXRlcyA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgTGlua1dpdGhUaXRsZSA9IExpbmsuZXh0ZW5kKHtcbiAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgc2NoZW1hOiB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGhyZWY6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2EnLFxuICAgICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+ICh7XG4gICAgICAgICAgICBocmVmOiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpLFxuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKG5vZGUpIHtcbiAgICAgIHJldHVybiBbJ2EnLCBub2RlLmF0dHJzLCAwXVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1hcmt1cCB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1yZXNpemUge1xuICAgIEBleHRlbmQgJWljb24tcmVzaXplO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdW5zZXQ7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gIH1cblxuICAuUHJvc2VNaXJyb3Ige1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5cbiAgLmRpdG8tbWFya3VwLWVkaXRvciB7XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIC8vIE1vdmUgcGFkZGluZyBcImluc2lkZVwiIGVkaXRvciB0byBjb3JyZWN0bHkgcG9zaXRpb24gc2Nyb2xsYmFyXG4gICAgbWFyZ2luLXJpZ2h0OiAtJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIHBhZGRpbmctcmlnaHQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMtdG9vbGJhciB7XG4gICAgbWFyZ2luOiAkaW5wdXQtcGFkZGluZy12ZXIgMDtcbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMsXG4gIHAsXG4gIHVsLFxuICBvbCxcbiAgcHJlLFxuICBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDFyZW0gMDtcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG4gIH1cblxuICBoMSxcbiAgaDIsXG4gIGgzIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgfVxuXG4gIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICB9XG5cbiAgY29kZSB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICB9XG5cbiAgcHJlIHtcbiAgICBwYWRkaW5nOiAwLjdyZW0gMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcblxuICAgIGNvZGUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgcCBjb2RlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogMCAwLjNyZW07XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gIH1cblxuICBhIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgY29sb3I6IGJsdWU7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIH1cblxuICB1bCxcbiAgb2wge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIGxpIHtcbiAgICAmID4gcCxcbiAgICAmID4gb2wsXG4gICAgJiA+IHVsIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlIHtcbiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICRjb2xvci1saWdodGVyO1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG5cbiAgICBwIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbXVsdGlzZWxlY3QoXG4gIDpjbGFzcz1ge1xuICAgICdkaXRvLW11bHRpc2VsZWN0LXNpbmdsZSc6ICFtdWx0aXBsZSxcbiAgICAnZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlXG4gIH1gXG4pXG4gIFZ1ZU11bHRpc2VsZWN0KFxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgIDpzaG93TGFiZWxzPVwiZmFsc2VcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICB0YWdQbGFjZWhvbGRlcj1cIlByZXNzIGVudGVyIHRvIGFkZCBuZXcgdGFnXCJcbiAgICA6b3B0aW9ucz1cInBvcHVsYXRlICYmIGFjdGl2ZU9wdGlvbnMgfHwgW11cIlxuICAgIDpjdXN0b21MYWJlbD1cImdldExhYmVsRm9yT3B0aW9uXCJcbiAgICA6dHJhY2tCeT1cIm9wdGlvblZhbHVlXCJcbiAgICA6Z3JvdXBMYWJlbD1cImdyb3VwQnlMYWJlbFwiXG4gICAgOmdyb3VwVmFsdWVzPVwiZ3JvdXBCeU9wdGlvbnNcIlxuICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcbiAgICA6dGFnZ2FibGU9XCJ0YWdnYWJsZVwiXG4gICAgOnNlYXJjaGFibGU9XCJzZWFyY2hhYmxlXCJcbiAgICA6aW50ZXJuYWxTZWFyY2g9XCIhc2VhcmNoRmlsdGVyXCJcbiAgICA6cHJlc2VydmVTZWFyY2g9XCIhIXNlYXJjaEZpbHRlclwiXG4gICAgOmNsZWFyT25TZWxlY3Q9XCIhc2VhcmNoRmlsdGVyXCJcbiAgICA6Y2xvc2VPblNlbGVjdD1cIiFzdGF5T3BlblwiXG4gICAgOmxvYWRpbmc9XCJpc0xvYWRpbmdcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIEBvcGVuPVwib25PcGVuXCJcbiAgICBAY2xvc2U9XCJvbkNsb3NlXCJcbiAgICBAdGFnPVwib25BZGRUYWdcIlxuICAgIEBzZWFyY2gtY2hhbmdlPVwib25TZWFyY2hDaGFuZ2VcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVHlwZU1peGluIGZyb20gJy4uL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5pbXBvcnQgVnVlTXVsdGlzZWxlY3QgZnJvbSAndnVlLW11bHRpc2VsZWN0J1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtdWx0aXNlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcbiAgY29tcG9uZW50czogeyBWdWVNdWx0aXNlbGVjdCB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaGVkT3B0aW9uczogbnVsbCxcbiAgICAgIHBvcHVsYXRlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkT3B0aW9uczoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKHRoaXMuc2VsZWN0ZWRWYWx1ZSB8fCBbXSlcbiAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBvcHRpb24gY2Fubm90IGJlIGZvdW5kLCB3ZSBtYXkgYmUgaW4gdGFnZ2FibGUgbW9kZSBhbmRcbiAgICAgICAgICAgICAgICAvLyBjYW4gYWRkIGl0LlxuICAgICAgICAgICAgICAgIHZhbHVlID0+IChcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpIHx8IHRoaXMuYWRkVGFnT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IG9wdGlvbnMgdGhhdCB3ZSBjb3VsZG4ndCBtYXRjaC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogV2UgcmVhbGx5IHNob3VsZCBkaXNwbGF5IGFuIGVycm9yIGluc3RlYWRcbiAgICAgICAgICAgICAgLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSlcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRPcHRpb25cbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBvcHRpb25zIG9iamVjdCwgc2luY2UgdnVlLW11bHRpc2VsZWN0IGNhbid0IG1hcCB0aGF0XG4gICAgICAgIC8vIGl0c2VsZiB1bmZvcnR1bmF0ZWx5LiBgdHJhY2stYnlgIGlzIHVzZWQgZm9yIDprZXkgbWFwcGluZyBpdCBzZWVtcy5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKG9wdGlvbiB8fCBbXSkubWFwKHZhbHVlID0+IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpKVxuICAgICAgICAgIDogdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoZWRPcHRpb25zIHx8IHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzZWFyY2hhYmxlOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgdGFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCd0YWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc3RheU9wZW46IGdldFNjaGVtYUFjY2Vzc29yKCdzdGF5T3BlbicsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXIoKSB7XG4gICAgICBjb25zdCB7IHBsYWNlaG9sZGVyLCBzZWFyY2hhYmxlLCB0YWdnYWJsZSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHBsYWNlaG9sZGVyIHx8IChcbiAgICAgICAgICBzZWFyY2hhYmxlICYmIHRhZ2dhYmxlXG4gICAgICAgICAgICA/IGBTZWFyY2ggb3IgYWRkIGEgJHt0aGlzLmxhYmVsfWBcbiAgICAgICAgICAgIDogc2VhcmNoYWJsZVxuICAgICAgICAgICAgICA/IGBTZWxlY3Qgb3Igc2VhcmNoICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgIC8vIHZ1ZS1tdWx0aXNlbGVjdCBkb2Vzbid0IHN1cHBvcnQgdGhlIGF1dG9mb2N1cyBhdHRyaWJ1dGUuIFdlIG5lZWQgdG9cbiAgICAgIC8vIGhhbmRsZSBpdCBoZXJlLlxuICAgICAgdGhpcy5mb2N1cygpXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhZGRUYWdPcHRpb24odGFnKSB7XG4gICAgICBpZiAodGhpcy50YWdnYWJsZSkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbkxhYmVsLCBvcHRpb25WYWx1ZSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBvcHRpb24gPVxuICAgICAgICAgIG9wdGlvbkxhYmVsICYmIG9wdGlvblZhbHVlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdOiB0YWcsXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogRGVmaW5lIGEgc2ltcGxlIHNjaGVtYSBvcHRpb24gdG8gY29udmVydCB0aGUgdGFnIHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gdG8gc29tZXRoaW5nIGVsc2UsIGUuZy4gYHRvVGFnOiB0YWcgPT4gdW5kZXJzY29yZSh0YWcpYFxuICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV06IHRhZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHRhZ1xuICAgICAgICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pXG4gICAgICAgIHJldHVybiBvcHRpb25cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kcmVmcy5lbGVtZW50LmFjdGl2YXRlKClcbiAgICB9LFxuXG4gICAgb25PcGVuKCkge1xuICAgICAgdGhpcy5wb3B1bGF0ZSA9IHRydWVcbiAgICB9LFxuXG4gICAgb25DbG9zZSgpIHtcbiAgICAgIC8vIFNpbmNlIHdlIGRvbid0IGZpcmUgYmx1ciBldmVudHMgd2hpbGUgdGhlIG11bHRpc2VsZWN0IGlzIG9wZW4gKHNlZVxuICAgICAgLy8gYmVsb3cpLCB3ZSBuZWVkIHRvIGRvIGl0IGhlcmUsIHdoZW4gaXQncyBhY3R1YWxseSBjbG9zZWQuXG4gICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25CbHVyKCkge1xuICAgICAgaWYgKCF0aGlzLiRyZWZzLmVsZW1lbnQuaXNPcGVuKSB7XG4gICAgICAgIFR5cGVNaXhpbi5tZXRob2RzLm9uQmx1ci5jYWxsKHRoaXMpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQWRkVGFnKHRhZykge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5hZGRUYWdPcHRpb24odGFnKVxuICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblNlYXJjaENoYW5nZShxdWVyeSkge1xuICAgICAgaWYgKHRoaXMuc2VhcmNoRmlsdGVyKSB7XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgIC8vIFNldCBgc2VhcmNoZWRPcHRpb25zYCB0byBhbiBlbXB0eSBhcnJheSwgYmVmb3JlIGl0IHdpbGwgYmVcbiAgICAgICAgICAvLyBwb3B1bGF0ZWQgYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgYWN0dWFsIHJlc3VsdHMuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBbXVxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gYXdhaXQgdGhpcy5yZXNvbHZlRGF0YShcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2VhcmNoRmlsdGVyKG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHF1ZXJ5IH0pKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDbGVhciBgc2VhcmNoZWRPcHRpb25zYCB3aGVuIHRoZSBxdWVyeSBpcyBjbGVhcmVkLlxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJ3Z1ZS1tdWx0aXNlbGVjdC9kaXN0L3Z1ZS1tdWx0aXNlbGVjdC5jc3MnO1xuXG4kc3Bpbm5lci13aWR0aDogJHNlbGVjdC1hcnJvdy13aWR0aDtcbiR0YWctaWNvbi13aWR0aDogMS44ZW07XG4kdGFnLW1hcmdpbjogMnB4O1xuJHRhZy1wYWRkaW5nOiAzcHg7XG4kdGFnLWxpbmUtaGVpZ2h0OiAxZW07XG5cbi5kaXRvLW11bHRpc2VsZWN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5tdWx0aXNlbGVjdCB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICRjb2xvci1ibGFjaztcbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fdGFncyB7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgcGFkZGluZzogMCAkc3Bpbm5lci13aWR0aCAwIDA7XG4gICAgLy8gU28gdGFncyBjYW4gZmxvYXQgb24gbXVsdGlwbGUgbGluZXMgYW5kIGhhdmUgcHJvcGVyIG1hcmdpbnM6XG4gICAgcGFkZGluZy1ib3R0b206ICR0YWctbWFyZ2luO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0X190YWcge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogJHRhZy1tYXJnaW4gMCAwICR0YWctbWFyZ2luO1xuICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICBwYWRkaW5nOiAkdGFnLXBhZGRpbmcgJHRhZy1pY29uLXdpZHRoICR0YWctcGFkZGluZyAwLjhlbTtcbiAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICBoZWlnaHQ6IGNhbGMoJGlucHV0LWhlaWdodCAtIDIgKiAkdGFnLXBhZGRpbmcpO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0X190YWdzLXdyYXAge1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGxpbmUtaGVpZ2h0OiAwO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0X19zaW5nbGUsXG4gIC5tdWx0aXNlbGVjdF9fcGxhY2Vob2xkZXIsXG4gIC5tdWx0aXNlbGVjdF9faW5wdXQge1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICBtaW4taGVpZ2h0OiAwO1xuICAgIG1hcmdpbjogMCAwIDFweCAwO1xuICAgIC8vIFNhZGx5LCB2dWUtc2VsZWN0IHNldHMgc3R5bGU9XCJwYWRkaW5nOiAuLi47XCIgaW4gYWRkaXRpb24gdG8gdXNpbmdcbiAgICAvLyBjbGFzc2VzLCBzbyBgIWltcG9ydGFudGAgaXMgbmVjZXNzYXJ5OlxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nICFpbXBvcnRhbnQ7XG4gICAgLy8gU28gaW5wdXQgY2FuIGZsb2F0IG5leHQgdG8gdGFncyBhbmQgaGF2ZSBwcm9wZXIgbWFyZ2lucyB3aXRoXG4gICAgLy8gLm11bHRpc2VsZWN0X190YWdzOlxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fcGxhY2Vob2xkZXIsXG4gIC5tdWx0aXNlbGVjdF9faW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogJGNvbG9yLXBsYWNlaG9sZGVyO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0LS1hY3RpdmUge1xuICAgIC5tdWx0aXNlbGVjdF9fcGxhY2Vob2xkZXIge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBkaXNwbGF5OiBub25lYCB0byBoaWRlIHBsYWNlLWhvbGRlciwgYXMgdGhlIGxheW91dCB3b3VsZFxuICAgICAgLy8gY29sbGFwc2UuXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxuICB9XG5cbiAgLm11bHRpc2VsZWN0X19zZWxlY3QsXG4gIC5tdWx0aXNlbGVjdF9fc3Bpbm5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgICAvLyAkYm9yZGVyLXdpZHRoIHRvIHByZXZlbnQgbWFza2luZyBib3JkZXIgd2l0aCAubXVsdGlzZWxlY3RfX3NwaW5uZXJcbiAgICB0b3A6ICRib3JkZXItd2lkdGg7XG4gICAgcmlnaHQ6ICRib3JkZXItd2lkdGg7XG4gICAgYm90dG9tOiAkYm9yZGVyLXdpZHRoO1xuICAgIGhlaWdodDogaW5oZXJpdDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fc2VsZWN0IHtcbiAgICB3aWR0aDogMDtcbiAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoJHNlbGVjdC1hcnJvdy13aWR0aCAvIDIpO1xuXG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIEBpbmNsdWRlIGFycm93KCRzZWxlY3QtYXJyb3ctc2l6ZSk7XG5cbiAgICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgICByaWdodDogY2FsYygtMSAqICRzZWxlY3QtYXJyb3ctc2l6ZSAvIDIpO1xuICAgIH1cbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fc3Bpbm5lciB7XG4gICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuXG4gICAgJjo6YmVmb3JlLFxuICAgICY6OmFmdGVyIHtcbiAgICAgIC8vIENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGxvYWRpbmcgc3Bpbm5lclxuICAgICAgYm9yZGVyLXdpZHRoOiAzcHg7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBtYXJnaW46IGF1dG87XG4gICAgfVxuICB9XG5cbiAgLm11bHRpc2VsZWN0X19vcHRpb24ge1xuICAgIG1pbi1oZWlnaHQ6IHVuc2V0O1xuICAgIGhlaWdodDogdW5zZXQ7XG4gICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICAvLyBJbnN0cnVjdGlvbiB0ZXh0IGZvciBvcHRpb25zXG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGFnLWxpbmUtaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fb3B0aW9uLS1oaWdobGlnaHQge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5tdWx0aXNlbGVjdF9fb3B0aW9uLS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0X190YWctaWNvbiB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgd2lkdGg6ICR0YWctaWNvbi13aWR0aDtcbiAgICBtYXJnaW46IDA7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBAZXh0ZW5kICVpY29uLWNsZWFyO1xuXG4gICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgIH1cblxuICAgICY6aG92ZXI6OmFmdGVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICB9XG4gIH1cblxuICAubXVsdGlzZWxlY3RfX29wdGlvbi0tc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG5cbiAgICAmLm11bHRpc2VsZWN0X19vcHRpb24tLWhpZ2hsaWdodCB7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgfVxuICB9XG5cbiAgLm11bHRpc2VsZWN0X190YWcsXG4gIC5tdWx0aXNlbGVjdF9fb3B0aW9uLS1oaWdobGlnaHQge1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0X190YWdzLFxuICAubXVsdGlzZWxlY3RfX2NvbnRlbnQtd3JhcHBlciB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgJi5kaXRvLW11bHRpc2VsZWN0LXNpbmdsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogMTAwJTtcbiAgfVxuXG4gICYuZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogYXV0bztcbiAgfVxuXG4gIC5tdWx0aXNlbGVjdC0tYWN0aXZlIHtcbiAgICAubXVsdGlzZWxlY3RfX3NpbmdsZSxcbiAgICAubXVsdGlzZWxlY3RfX2lucHV0IHtcbiAgICAgIC8vIFNhZGx5LCB2dWUtc2VsZWN0IHNldHMgYHN0eWxlPVwid2lkdGhcImAgaW4gYWRkaXRpb24gdG8gdXNpbmcgY2xhc3Nlc1xuICAgICAgLy8gc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgIHdpZHRoOiB2YXIoLS1pbnB1dC13aWR0aCkgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAubXVsdGlzZWxlY3RfX3RhZ3Mge1xuICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgIH1cblxuICAgIC5tdWx0aXNlbGVjdF9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICAgIG1hcmdpbjogLTFweCAwIDA7XG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgfVxuXG4gICAgJi5tdWx0aXNlbGVjdC0tYWJvdmUge1xuICAgICAgLm11bHRpc2VsZWN0X190YWdzIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICAubXVsdGlzZWxlY3RfX2NvbnRlbnQtd3JhcHBlciB7XG4gICAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICAgICAgICBtYXJnaW46IDAgMCAtMXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5kaXRvLWhhcy1lcnJvcnMge1xuICAgIC5tdWx0aXNlbGVjdF9fdGFncyB7XG4gICAgICBib3JkZXItY29sb3I6ICRjb2xvci1lcnJvcjtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIHdpZHRoOiAkc3Bpbm5lci13aWR0aDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9PSBudWxsID8gdGhpcy52YWx1ZSA6ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdmFsdWUgIT09ICcnXG4gICAgICAgICAgICA/IHRoaXMuaXNJbnRlZ2VyXG4gICAgICAgICAgICAgID8gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlRmxvYXQodmFsdWUpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaXNJbnRlZ2VyKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHN0ZXBWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXAgPT0gbnVsbCAmJiAhdGhpcy5pc0ludGVnZXIgPyAnYW55JyA6IHRoaXMuc3RlcFxuICAgIH0sXG5cbiAgICBkZWNpbWFsczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlY2ltYWxzJywge1xuICAgICAgdHlwZTogTnVtYmVyXG4gICAgfSksXG5cbiAgICBzdGVwOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RlcCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChzdGVwKSB7XG4gICAgICAgIC8vIEZvciBpbnRlZ2Vycywgcm91bmQgdGhlIHN0ZXBzIHRvIHRoZSBuZXh0IGJpZ2dlciBpbnRlZ2VyIHZhbHVlOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgc3RlcCAhPSBudWxsID8gTWF0aC5jZWlsKHN0ZXApIDogc3RlcFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWluOiBnZXRTY2hlbWFBY2Nlc3NvcignbWluJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZ2V0KG1pbikge1xuICAgICAgICBtaW4gPVxuICAgICAgICAgIG1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3JhbmdlJywgeyB0eXBlOiBBcnJheSB9KT8uWzBdXG4gICAgICAgICAgICA6IG1pblxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgbWluICE9IG51bGwgPyBNYXRoLmZsb29yKG1pbikgOiBtaW5cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heDogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtYXgpIHtcbiAgICAgICAgbWF4ID1cbiAgICAgICAgICBtYXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlsxXVxuICAgICAgICAgICAgOiBtYXhcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1heCAhPSBudWxsID8gTWF0aC5jZWlsKG1heCkgOiBtYXhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHJhbmdlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmFuZ2UnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gYHRoaXMubWluYCwgYHRoaXMubWF4YCBhbHJlYWR5IHN1cHBvcnQgYHNjaGVtYS5yYW5nZWAsXG4gICAgICAgIC8vIHNvIHJlZGlyZWN0IHRoZXJlLlxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzXG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/IFttaW4sIG1heF0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG5cbiAgICAgIHNldChyYW5nZSkge1xuICAgICAgICAvLyBQcm92aWRlIGEgc2V0dGVyIHRoYXQgZGVsZWdhdGVzIHRvIGBbdGhpcy5taW4sIHRoaXMubWF4XWAsXG4gICAgICAgIC8vIHNpbmNlIHRob3NlIGFscmVhZHkgaGFuZGxlIGBzY2hlbWEucmFuZ2VgLlxuICAgICAgICBpZiAoaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICA7W3RoaXMubWluLCB0aGlzLm1heF0gPSByYW5nZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHt9XG4gICAgICBjb25zdCB7IHJhbmdlLCBtaW4sIG1heCwgZGVjaW1hbHMsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yYW5nZSA9IHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5taW4gPSBtaW5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5tYXggPSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY2ltYWxzICE9IG51bGwpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuZGVjaW1hbHMgPSBkZWNpbWFsc1xuICAgICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzID0gKGAke3N0ZXB9YC5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGhcbiAgICAgICAgaWYgKGRlY2ltYWxzID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5pbnRlZ2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludGVnZXIpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by1udW1iZXIoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6bWluPVwibWluXCJcbiAgOm1heD1cIm1heFwiXG4gIDpzdGVwPVwic3RlcFZhbHVlXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydudW1iZXInLCAnaW50ZWdlciddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpc0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdpbnRlZ2VyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLy8gT25seSBzaG93IHNwaW4gYnV0dG9ucyBpZiB0aGUgbnVtYmVyIGNvbXBvbmVudCBkZWZpbmVzIGEgc3RlcCBzaXplLlxuaW5wdXRbdHlwZT0nbnVtYmVyJ106bm90KFtzdGVwXSkge1xuICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAmOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW9iamVjdChcbiAgdi1pZj1cImlzUmVhZHlcIlxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cInNjaGVtYS5jbGFzc1wiXG4gIDpzdHlsZT1cInNjaGVtYS5zdHlsZVwiXG4pXG4gIC5kaXRvLW9iamVjdC1jb250ZW50KFxuICAgIHYtaWY9XCJvYmplY3REYXRhXCJcbiAgKVxuICAgIC8vLSBTdXBwb3J0IHRoZSBzYW1lIHJlbmRlcmluZyBvcHRpb25zIGFzIFR5cGVMaXN0OlxuICAgIERpdG9TY2hlbWFJbmxpbmVkKFxuICAgICAgdi1pZj1cImlzSW5saW5lZFwiXG4gICAgICA6bGFiZWw9XCJvYmplY3RMYWJlbFwiXG4gICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBvYmplY3REYXRhLCBjb250ZXh0KVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICApXG4gICAgY29tcG9uZW50KFxuICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgIClcbiAgICBzcGFuKFxuICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgIHYtaHRtbD1cInJlbmRlcihnZXRDb250ZXh0KCkpXCJcbiAgICApXG4gICAgc3BhbihcbiAgICAgIHYtZWxzZVxuICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgb2JqZWN0RGF0YSlcIlxuICAgIClcbiAgRGl0b0VkaXRCdXR0b25zKFxuICAgIDpjcmVhdGFibGU9XCJjcmVhdGFibGVcIlxuICAgIDpkZWxldGFibGU9XCJvYmplY3REYXRhICYmIGRlbGV0YWJsZVwiXG4gICAgOmVkaXRhYmxlPVwib2JqZWN0RGF0YSAmJiBlZGl0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6ZWRpdFBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgIDpwYXRoPVwicGF0aFwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0ob2JqZWN0RGF0YSlcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7IHJlc29sdmVTY2hlbWFDb21wb25lbnQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignb2JqZWN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbl0sXG5cbiAgZ2V0U291cmNlVHlwZSh0eXBlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNmb3JtYXRpb24gaGVyZS4gU2VlIFR5cGVUcmVlTGlzdCBmb3IgZGV0YWlscy5cbiAgICByZXR1cm4gdHlwZVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb2JqZWN0TGFiZWwoKSB7XG4gICAgICAvLyBPbmx5IHNob3cgYSBsYWJlbCBpZiB0aGUgb2JqZWN0IGlzIGNvbGxhcHNpYmxlLlxuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGVcbiAgICAgICAgPyB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNjaGVtYSwgdGhpcy5vYmplY3REYXRhLCB7IGFzT2JqZWN0OiB0cnVlIH0pXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBkYXRhOiB0aGlzLm9iamVjdERhdGEgfSlcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSksXG4gICAgICBTb3VyY2VNaXhpbi5wcm9jZXNzU2NoZW1hKFxuICAgICAgICBhcGksXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcm91dGVzLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBmbGF0dGVuLFxuICAgICAgICBwcm9jZXNzXG4gICAgICApXG4gICAgXSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW9iamVjdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAuZGl0by1vYmplY3QtY29udGVudCB7XG4gICAgZmxleDogMCAxIDEwMCU7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgIGZsZXg6IDEgMCAwJTtcbiAgICBtYXJnaW4tbGVmdDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncGFuZWwnLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBvbWl0UGFkZGluZzogdHJ1ZSxcblxuICBnZXRQYW5lbFNjaGVtYShzY2hlbWEpIHtcbiAgICAvLyBGb3IgYSBUeXBlUGFuZWwsIHRoZSBjb21wb25lbnQgc2NoZW1hIGlzIGFsc28gdGhlIHBhbmVsIHNjaGVtYSwgYnV0XG4gICAgLy8gcmVtb3ZlIHRoZSBhZGRlZCBuYW1lLCBzbyBpdCBkb2Vzbid0IGdldCBhcHBlbmRlZCB0d2ljZSB0byBkYXRhLXBhdGguXG4gICAgY29uc3QgeyBuYW1lLCAuLi5wYW5lbCB9ID0gc2NoZW1hXG4gICAgcmV0dXJuIHBhbmVsXG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5wcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dmFsdWU9XCJwcm9ncmVzc1ZhbHVlXCJcbiAgOm1heD1cInByb2dyZXNzTWF4XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdwcm9ncmVzcycsIHtcbiAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICBjb21wdXRlZDoge1xuICAgIHByb2dyZXNzVmFsdWUoKSB7XG4gICAgICBsZXQgeyB2YWx1ZSwgcmFuZ2UsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICB2YWx1ZSAtPSByYW5nZVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gc3RlcCkgKiBzdGVwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJydcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBwcm9ncmVzc01heCgpIHtcbiAgICAgIGNvbnN0IHsgcmFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiByYW5nZSA/IHJhbmdlWzFdIC0gcmFuZ2VbMF0gOiBudWxsXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1yYWRpby1idXR0b25zKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1yYWRpby1idXR0b24oXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdyYWRpbycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXJhZGlvLWJ1dHRvbnMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNlY3Rpb24oOmNsYXNzPVwieyAnZGl0by1zZWN0aW9uLWxhYmVsbGVkJzogISFzY2hlbWEubGFiZWwgfVwiKVxuICBEaXRvUGFuZS5kaXRvLXNlY3Rpb24tcGFuZShcbiAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0SXRlbUZvcm1TY2hlbWEsIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlY3Rpb24nLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhc2NoZW1hLm5lc3RlZCAmJiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuICBkZWZhdWx0TmVzdGVkOiBmYWxzZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG4gIG9taXRGbGV4R3JvdzogdHJ1ZSxcblxuICBjb21wdXRlZDoge1xuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXN0ZWQgPyB0aGlzLnZhbHVlIDogdGhpcy5kYXRhXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtRm9ybVNjaGVtYVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgICAvLyBQcm9jZXNzIHNlY3Rpb24gY29tcG9uZW50cyBzbyB0aGVpciBmb3JtcyBnZXQgcmVzb2x2ZWQgdG9vLlxuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgc2NoZW1hLCByb3V0ZXMsIGxldmVsKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2VjdGlvbiB7XG4gICYuZGl0by1zZWN0aW9uLWxhYmVsbGVkIHtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBOZXN0aW5nIGlzIG5lZWRlZCB0byBtYWtlIGFuIGFycm93IGFwcGVhciBvdmVyIHRoZSBzZWxlY3QgaXRlbTpcbi5kaXRvLXNlbGVjdFxuICBzZWxlY3QoXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZFZhbHVlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICBAbW91c2Vkb3duPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgICBAZm9jdXM9XCJwb3B1bGF0ZSA9IHRydWVcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwicG9wdWxhdGVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgICAgIClcbiAgICAgICAgb3B0Z3JvdXAoXG4gICAgICAgICAgdi1pZj1cImdyb3VwQnlcIlxuICAgICAgICAgIDpsYWJlbD1cIm9wdGlvbltncm91cEJ5TGFiZWxdXCJcbiAgICAgICAgKVxuICAgICAgICAgIG9wdGlvbihcbiAgICAgICAgICAgIHYtZm9yPVwib3B0IGluIG9wdGlvbltncm91cEJ5T3B0aW9uc11cIlxuICAgICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0KVwiXG4gICAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHQpIH19XG4gICAgICAgIG9wdGlvbihcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWVsc2UtaWY9XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgKVxuICAgICAgb3B0aW9uKDp2YWx1ZT1cInNlbGVjdGVkVmFsdWVcIikge3sgZ2V0TGFiZWxGb3JPcHRpb24oc2VsZWN0ZWRPcHRpb24pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2VsZWN0Jywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIERpc2FibGUgbGF6eS1wb3B1bGF0aW9uIGZvciBub3cuXG4gICAgICAvLyBUT0RPOiBTZXQgdG8gYGZhbHNlYCBPbmNlIGxpbmV0byBlMmUgdGVzdHMgYWRkcmVzcyB0aGVpciBpc3N1ZXMuXG4gICAgICBwb3B1bGF0ZTogdHJ1ZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIFRPRE86IE1vdmUgdG8gZGl0by11aVxuJHNlbGVjdC1hcnJvdy1yaWdodDogY2FsYygoJHNlbGVjdC1hcnJvdy13aWR0aCAtICRzZWxlY3QtYXJyb3ctc2l6ZSkgLyAyKTtcblxuLmRpdG8tc2VsZWN0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgc2VsZWN0IHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkc2VsZWN0LWFycm93LXdpZHRoO1xuICB9XG4gIC8vIEhhbmRsZSAuZGl0by13aWR0aC1maWxsIHNlcGFyYXRlbHkgZHVlIHRvIHJlcXVpcmVkIG5lc3Rpbmcgb2Ygc2VsZWN0OlxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgcmlnaHQ6IGNhbGMoI3skc2VsZWN0LWFycm93LXJpZ2h0fSArICN7JGJvcmRlci13aWR0aH0pO1xuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNsaWRlclxuICBpbnB1dC5kaXRvLXJhbmdlKFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbiAgSW5wdXRGaWVsZC5kaXRvLW51bWJlcihcbiAgICB2LWlmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgICB0eXBlPVwibnVtYmVyXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzbGlkZXInLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRgP1xuICAgIGlucHV0OiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zbGlkZXIge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXJhbmdlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpO1xuICB9XG5cbiAgLmRpdG8tbnVtYmVyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblN3aXRjaEJ1dHRvbi5kaXRvLXN3aXRjaChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgOmxhYmVscz1cImxhYmVsc1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFN3aXRjaEJ1dHRvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3N3aXRjaCcsIHtcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG5cbiAgY29tcG9uZW50czoge1xuICAgIFN3aXRjaEJ1dHRvblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxhYmVsc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by10ZXh0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIDp0eXBlPVwiaW5wdXRUeXBlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgSW5wdXRGaWVsZCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG5jb25zdCBtYXNrZWRQYXNzd29yZCA9ICcqKioqKioqKioqKioqKioqJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgW1xuICAgICd0ZXh0JyxcbiAgICAnZW1haWwnLFxuICAgICd1cmwnLFxuICAgICdob3N0bmFtZScsXG4gICAgJ2RvbWFpbicsXG4gICAgJ3RlbCcsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnY3JlZGl0Y2FyZCdcbiAgXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICAgIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICAgIHRleHRGaWVsZDogdHJ1ZSxcbiAgICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiBzY2hlbWEudHlwZSA9PT0gJ3Bhc3N3b3JkJyxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBpbnB1dFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3JlZGl0Y2FyZDogJ3RleHQnLFxuICAgICAgICAgICAgaG9zdG5hbWU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGRvbWFpbjogJ3RleHQnXG4gICAgICAgICAgfVt0aGlzLnR5cGVdIHx8XG4gICAgICAgICAgdGhpcy50eXBlXG4gICAgICAgIClcbiAgICAgIH0sXG5cbiAgICAgIGlucHV0VmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdwYXNzd29yZCcgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIXRoaXMuZm9jdXNlZFxuICAgICAgICAgICAgPyBtYXNrZWRQYXNzd29yZFxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSB7XG4gICAgICAgICAgZW1haWw6ICdlbWFpbCcsXG4gICAgICAgICAgdXJsOiAndXJsJyxcbiAgICAgICAgICBob3N0bmFtZTogJ2hvc3RuYW1lJyxcbiAgICAgICAgICBkb21haW46ICdkb21haW4nLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQnLFxuICAgICAgICAgIGNyZWRpdGNhcmQ6ICdjcmVkaXRjYXJkJ1xuICAgICAgICB9W3RoaXMudHlwZV1cbiAgICAgICAgcmV0dXJuIHJ1bGUgPyB7IFtydWxlXTogdHJ1ZSB9IDoge31cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRleHRhcmVhLmRpdG8tdGV4dGFyZWEuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpyb3dzPVwibGluZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXJlc2l6YWJsZSc6IHJlc2l6YWJsZSB9XCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3RleHRhcmVhJywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGluZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubGluZXMgfHwgNFxuICAgIH0sXG5cbiAgICByZXNpemFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZXNpemFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGV4dGFyZWEge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcmVzaXplOiBub25lO1xuICBtaW4taGVpZ2h0OiBjYWxjKDFlbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSArICN7MiAqICRpbnB1dC1wYWRkaW5nLXZlcn0pO1xuXG4gICYuZGl0by1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogdmVydGljYWw7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJlZS1saXN0XG4gIERpdG9TY29wZXMoXG4gICAgdi1pZj1cInNjb3Blc1wiXG4gICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgIDpzY29wZXM9XCJzY29wZXNcIlxuICApXG4gIC5kaXRvLXRyZWUtcGFuZWxcbiAgICBEaXRvVHJlZUl0ZW0oXG4gICAgICA6c2NoZW1hPVwidHJlZVNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJ0cmVlRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJ0cmVlRGF0YVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDpvcGVuPVwidHJ1ZVwiXG4gICAgKVxuICAgIC5kaXRvLXRyZWUtZm9ybS1jb250YWluZXIoXG4gICAgICB2LWlmPVwiaGFzRWRpdGFibGVGb3Jtc1wiXG4gICAgKVxuICAgICAgLy8tIEluY2x1ZGUgYSByb3V0ZXItdmlldyBmb3IgdGhlIG9wdGlvbmFsIERpdG9Gb3JtSW5saW5lZFxuICAgICAgUm91dGVyVmlld1xuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQge1xuICBoYXNGb3JtU2NoZW1hLFxuICBnZXRGb3JtU2NoZW1hcyxcbiAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWyd0cmVlLWxpc3QnLCAndHJlZS1vYmplY3QnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW1NvdXJjZU1peGluXSxcblxuICAgIHByb3ZpZGUoKSB7XG4gICAgICByZXR1cm4geyBjb250YWluZXI6IHRoaXMgfVxuICAgIH0sXG5cbiAgICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiB0eXBlID09PSAndHJlZS1vYmplY3QnID8gJ29iamVjdCcgOiAnbGlzdCdcbiAgICB9LFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5wYXRoYDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGF0aFxuICAgICAgfSxcblxuICAgICAgZWRpdFBhdGgoKSB7XG4gICAgICAgIC8vIEFjY2Vzc2VkIGZyb20gRGl0b1RyZWVJdGVtIHRocm91Z2ggYGNvbnRhaW5lci5lZGl0UGF0aGA6XG4gICAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoLnNsaWNlKHRoaXMucGF0aD8ubGVuZ3RoKVxuICAgICAgfSxcblxuICAgICAgdHJlZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8geyBbdGhpcy5uYW1lXTogdGhpcy52YWx1ZSB9XG4gICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICB9LFxuXG4gICAgICB0cmVlRGF0YVBhdGgoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBgbmFtZWAgZnJvbSBgZGF0YVBhdGhgLCBhcyBpdCBpcyBhZGRlZFxuICAgICAgICAvLyB0byBgdHJlZURhdGFgIGFuZCBgdHJlZVNjaGVtYWBcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB0aGlzLmRhdGFQYXRoLnNsaWNlKDAsIHRoaXMuZGF0YVBhdGgubGVuZ3RoIC0gdGhpcy5uYW1lLmxlbmd0aClcbiAgICAgICAgICA6IHRoaXMuZGF0YVBhdGhcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjaGlsZHJlbjoge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnNjaGVtYVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB0aGlzLnNjaGVtYVxuICAgICAgfSxcblxuICAgICAgaGFzRWRpdGFibGVGb3JtcygpIHtcbiAgICAgICAgY29uc3QgaGFzRWRpdGFibGVGb3JtcyA9IHNjaGVtYSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSAmJiAoXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2VkaXRhYmxlJywge1xuICAgICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2NoZW1hXG4gICAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICAgIHNjaGVtYS5jaGlsZHJlbiAmJlxuICAgICAgICAgICAgICBoYXNFZGl0YWJsZUZvcm1zKHNjaGVtYS5jaGlsZHJlbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0VkaXRhYmxlRm9ybXModGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWwsXG4gICAgICBuZXN0ZWQgPSB0cnVlLFxuICAgICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgICAgcHJvY2VzcyA9IG51bGxcbiAgICApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLnByb3BlcnRpZXMpLFxuICAgICAgICBTb3VyY2VNaXhpbi5wcm9jZXNzU2NoZW1hKFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgbmVzdGVkLFxuICAgICAgICAgIGZsYXR0ZW4sXG4gICAgICAgICAgLy8gUGFzcyBwcm9jZXNzKCkgdG8gYWRkIG1vcmUgcm91dGVzIHRvIGNoaWxkUm91dGVzOlxuICAgICAgICAgIChjaGlsZFJvdXRlcywgbGV2ZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCBgdHlwZWAgdG8gdGhlIG5lc3RlZCB0cmVlIGxpc3QuXG4gICAgICAgICAgICAgIGNoaWxkcmVuLnR5cGUgPSAndHJlZS1saXN0J1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjYWxsIGBwcm9jZXNzU2NoZW1hKClgIGZvciB0aGUgbmVzdGVkIHRyZWUgbGlzdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZFJvdXRlcyxcbiAgICAgICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgICAgICAgdHJ1ZSwgLy8gUGFzcyBgdHJ1ZWAgZm9yIGBmbGF0dGVuYCBpbiB0cmVlIGxpc3RzLlxuICAgICAgICAgICAgICAgIHByb2Nlc3NcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgXSlcbiAgICB9LFxuXG4gICAgZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nKHNjaGVtYSwgY29udGV4dCkge1xuICAgICAgLy8gQ29udmVydCBuZXN0ZWQgY2hpbGRyZW4gc2NoZW1hIHRvIHN0YW5kLWFsb25lIHNjaGVtYSBjb21wb25lbnQsXG4gICAgICAvLyBwcmVzZW50IGluIGVhY2ggb2YgdGhlIGZvcm1zLCBhcyByZXF1aXJlZCBieSBgcHJvY2Vzc1NjaGVtYURhdGEoKWBcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHNjaGVtYVxuICAgICAgcmV0dXJuIGdldEZvcm1TY2hlbWFzKFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgPyBmb3JtID0+ICh7XG4gICAgICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAuLi5mb3JtLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgW2NoaWxkcmVuLm5hbWVdOiBjaGlsZHJlblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbFxuICAgICAgKVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdHJlZS1saXN0IHtcbiAgQGV4dGVuZCAlZmllbGQ7XG5cbiAgLmRpdG8tdHJlZS1wYW5lbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgICA+IC5kaXRvLXRyZWUtaXRlbSB7XG4gICAgICBmbGV4OiAxIDEgMjUlO1xuICAgIH1cblxuICAgID4gLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lciB7XG4gICAgICBmbGV4OiAwIDEgNzUlO1xuICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgICBib3JkZXItbGVmdDogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtIDE7XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAxO1xuICAgICAgbWFyZ2luOiAoLSRpbnB1dC1wYWRkaW5nLXZlcikgKC0kaW5wdXQtcGFkZGluZy1ob3IpO1xuICAgICAgbWFyZ2luLWxlZnQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBmaWxlc2l6ZSB9IGZyb20gJ2ZpbGVzaXplJ1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RmlsZVNpemUoc2l6ZSkge1xuICByZXR1cm4gZmlsZXNpemUoc2l6ZSwgeyBiYXNlOiAxMCB9KVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXVwbG9hZFxuICB0YWJsZS5kaXRvLXRhYmxlLmRpdG8tdGFibGUtc2VwYXJhdG9ycy5kaXRvLXRhYmxlLWJhY2tncm91bmRcbiAgICAvLy0gU3R5bGluZyBjb21lcyBmcm9tIERpdG9UYWJsZUhlYWRcbiAgICB0aGVhZC5kaXRvLXRhYmxlLWhlYWRcbiAgICAgIHRyXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBOYW1lXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTaXplXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhbiBTdGF0dXNcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuXG4gICAgVXNlU29ydGFibGUoXG4gICAgICB2LW1vZGVsPVwiZmlsZXNcIlxuICAgICAgdGFnPVwidGJvZHlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXRTb3J0YWJsZU9wdGlvbnMoZHJhZ2dhYmxlKVwiXG4gICAgKVxuICAgICAgdHIoXG4gICAgICAgIHYtZm9yPVwiKGZpbGUsIGluZGV4KSBpbiBmaWxlc1wiXG4gICAgICAgIDprZXk9XCJmaWxlLmtleVwiXG4gICAgICApXG4gICAgICAgIHRkKFxuICAgICAgICAgIHYtaHRtbD1cInJlbmRlckZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgKVxuICAgICAgICB0ZCB7eyBmb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpIH19XG4gICAgICAgIHRkXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWlmPVwiZmlsZS51cGxvYWQuZXJyb3JcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IEVycm9yOiB7eyBmaWxlLnVwbG9hZC5lcnJvciB9fVxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImZpbGUudXBsb2FkLmFjdGl2ZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkaW5nLi4uXG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZmlsZS51cGxvYWQuc3VjY2Vzc1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgVXBsb2FkZWRcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHwgU3RvcmVkXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnNcbiAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgICAgICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgICAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgdi1pZj1cImRlbGV0YWJsZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRlbGV0ZSlcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkZWxldGVGaWxlKGZpbGUsIGluZGV4KVwiXG4gICAgICAgICAgICApXG4gICAgdGZvb3RcbiAgICAgIHRyXG4gICAgICAgIHRkKDpjb2xzcGFuPVwiNFwiKVxuICAgICAgICAgIC5kaXRvLXVwbG9hZC1mb290ZXJcbiAgICAgICAgICAgIHByb2dyZXNzLmRpdG8tcHJvZ3Jlc3MoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgIDp2YWx1ZT1cInVwbG9hZFByb2dyZXNzXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwidXBsb2FkLmFjdGl2ZSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgKSBDYW5jZWwgQWxsXG4gICAgICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJpc1VwbG9hZFJlYWR5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cInVwbG9hZC5hY3RpdmUgPSB0cnVlXCJcbiAgICAgICAgICAgICAgKSBVcGxvYWQgQWxsXG4gICAgICAgICAgICAgIFZ1ZVVwbG9hZC5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1hZGQtdXBsb2FkKFxuICAgICAgICAgICAgICAgIHJlZj1cInVwbG9hZFwiXG4gICAgICAgICAgICAgICAgdi1tb2RlbD1cInVwbG9hZHNcIlxuICAgICAgICAgICAgICAgIDppbnB1dElkPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpuYW1lPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA6cG9zdEFjdGlvbj1cInVwbG9hZFBhdGhcIlxuICAgICAgICAgICAgICAgIDpleHRlbnNpb25zPVwiZXh0ZW5zaW9uc1wiXG4gICAgICAgICAgICAgICAgOmFjY2VwdD1cImFjY2VwdFwiXG4gICAgICAgICAgICAgICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIDpzaXplPVwibWF4U2l6ZVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJVcGxvYWQgRmlsZXNcIlxuICAgICAgICAgICAgICAgIEBpbnB1dC1maWx0ZXI9XCJpbnB1dEZpbHRlclwiXG4gICAgICAgICAgICAgICAgQGlucHV0LWZpbGU9XCJpbnB1dEZpbGVcIlxuICAgICAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvcnRhYmxlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMnXG5pbXBvcnQgcGFyc2VGaWxlU2l6ZSBmcm9tICdmaWxlc2l6ZS1wYXJzZXInXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZm9ybWF0RmlsZVNpemUgfSBmcm9tICcuLi91dGlscy91bml0cy5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGVzY2FwZUh0bWwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFZ1ZVVwbG9hZCBmcm9tICd2dWUtdXBsb2FkLWNvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCd1cGxvYWQnLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFZ1ZVVwbG9hZCB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwbG9hZHM6IFtdXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdXBsb2FkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMudXBsb2FkXG4gICAgfSxcblxuICAgIGZpbGVzKCkge1xuICAgICAgcmV0dXJuIGFzRmlsZXModGhpcy52YWx1ZSlcbiAgICB9LFxuXG4gICAgbXVsdGlwbGU6IGdldFNjaGVtYUFjY2Vzc29yKCdtdWx0aXBsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIC8vIE5vIGNhbGxiYWNrIGFzIGl0J3MgdXNlZCBpbiBgcHJvY2Vzc1ZhbHVlKClgXG4gICAgICBjYWxsYmFjazogZmFsc2VcbiAgICB9KSxcblxuICAgIGV4dGVuc2lvbnM6IGdldFNjaGVtYUFjY2Vzc29yKCdleHRlbnNpb25zJywge1xuICAgICAgdHlwZTogW0FycmF5LCBTdHJpbmcsIFJlZ0V4cF1cbiAgICB9KSxcblxuICAgIGFjY2VwdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FjY2VwdCcsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZ2V0KGFjY2VwdCkge1xuICAgICAgICByZXR1cm4gaXNBcnJheShhY2NlcHQpID8gYWNjZXB0LmpvaW4oJywnKSA6IGFjY2VwdFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWF4U2l6ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heFNpemUnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZ2V0KG1heFNpemUpIHtcbiAgICAgICAgcmV0dXJuIG1heFNpemUgPyBwYXJzZUZpbGVTaXplKG1heFNpemUpIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiBkcmFnZ2FibGUgJiYgdGhpcy5maWxlcy5sZW5ndGggPiAxXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkZWxldGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkZWxldGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIGlzVXBsb2FkUmVhZHkoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnVwbG9hZHMubGVuZ3RoICYmXG4gICAgICAgICEodGhpcy51cGxvYWQuYWN0aXZlIHx8IHRoaXMudXBsb2FkLnVwbG9hZGVkKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1VwbG9hZEFjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwbG9hZHMubGVuZ3RoICYmIHRoaXMudXBsb2FkLmFjdGl2ZVxuICAgIH0sXG5cbiAgICB1cGxvYWRQcm9ncmVzcygpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudXBsb2Fkcy5yZWR1Y2UoKHRvdGFsLCBmaWxlKSA9PiB0b3RhbCArIGZpbGUucHJvZ3Jlc3MsIDApIC9cbiAgICAgICAgdGhpcy51cGxvYWRzLmxlbmd0aFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB1cGxvYWRQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VVcmwoe1xuICAgICAgICB0eXBlOiAndXBsb2FkJyxcbiAgICAgICAgcGF0aDogdGhpcy5hcGkubm9ybWFsaXplUGF0aCh0aGlzLmRhdGFQYXRoKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvcm1hdEZpbGVTaXplLFxuXG4gICAgcmVuZGVyRmlsZShmaWxlLCBpbmRleCkge1xuICAgICAgY29uc3QgeyByZW5kZXIgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gcmVuZGVyXG4gICAgICAgID8gcmVuZGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbGUsXG4gICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBkYXRhUGF0aDogYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgaW5kZXgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKGZpbGUubmFtZSlcbiAgICB9LFxuXG4gICAgZGVsZXRlRmlsZShmaWxlLCBpbmRleCkge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBmaWxlXG5cbiAgICAgIGlmIChcbiAgICAgICAgZmlsZSAmJlxuICAgICAgICB3aW5kb3cuY29uZmlybShcbiAgICAgICAgICBgRG8geW91IHJlYWxseSB3YW50IHRvICR7dGhpcy52ZXJicy5yZW1vdmV9ICR7bmFtZX0/YFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlLnVwbG9hZCkge1xuICAgICAgICAgIHRoaXMudXBsb2FkLnJlbW92ZShmaWxlLnVwbG9hZClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBgJHtuYW1lfSB3YXMgJHt0aGlzLnZlcmJzLmRlbGV0ZWR9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0RmlsZUluZGV4KGZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWVcbiAgICAgICAgPyB0aGlzLnZhbHVlLmZpbmRJbmRleChpdCA9PiBpdC5pZCA9PT0gZmlsZS5pZClcbiAgICAgICAgOiAtMVxuICAgIH0sXG5cbiAgICBhZGRGaWxlKGZpbGUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKGZpbGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IFtmaWxlXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlsZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlRmlsZShmaWxlLCBuZXdGaWxlKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0RmlsZUluZGV4KGZpbGUpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWYgKG5ld0ZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXhdID0gbmV3RmlsZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdGaWxlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbW92ZUZpbGUoZmlsZSkge1xuICAgICAgdGhpcy5yZXBsYWNlRmlsZShmaWxlLCBudWxsKVxuICAgIH0sXG5cbiAgICBpbnB1dEZpbGUobmV3RmlsZSwgb2xkRmlsZSkge1xuICAgICAgaWYgKG5ld0ZpbGUgJiYgIW9sZEZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBpZCwgbmFtZSwgc2l6ZSB9ID0gbmV3RmlsZVxuICAgICAgICB0aGlzLmFkZEZpbGUoeyBpZCwgbmFtZSwgc2l6ZSwgdXBsb2FkOiBuZXdGaWxlIH0pXG4gICAgICB9XG4gICAgICBpZiAobmV3RmlsZSAmJiBvbGRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcywgZXJyb3IgfSA9IG5ld0ZpbGVcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgICAgICBjb25zdCBmaWxlID0gbmV3RmlsZS5yZXNwb25zZVswXVxuICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICBmaWxlLnVwbG9hZCA9IG5ld0ZpbGVcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIHVwbG9hZCBmaWxlIG9iamVjdCB3aXRoIHRoZSBmaWxlIG9iamVjdCByZWNlaXZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0aGUgdXBsb2FkIHJlc3BvbnNlLlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlRmlsZShuZXdGaWxlLCBmaWxlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUobmV3RmlsZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhYm9ydDogJ1VwbG9hZCBhYm9ydGVkJyxcbiAgICAgICAgICAgICAgZGVuaWVkOiAnVXBsb2FkIGRlbmllZCcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogYFVuc3VwcG9ydGVkIGZpbGUtdHlwZTogJHtuZXdGaWxlLm5hbWV9YCxcbiAgICAgICAgICAgICAgbmV0d29yazogJ05ldHdvcmsgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHVwbG9hZCcsXG4gICAgICAgICAgICAgIHNlcnZlcjogJ1NlcnZlciBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdXBsb2FkJyxcbiAgICAgICAgICAgICAgc2l6ZTogYEZpbGUgaXMgdG9vIGxhcmdlOiAke2Zvcm1hdEZpbGVTaXplKG5ld0ZpbGUuc2l6ZSl9YCxcbiAgICAgICAgICAgICAgdGltZW91dDogJ1RpbWVvdXQgb2NjdXJyZWQgZHVyaW5nIHVwbG9hZCdcbiAgICAgICAgICAgIH1bZXJyb3JdIHx8XG4gICAgICAgICAgICBgVW5rbm93biBGaWxlIFVwbG9hZCBFcnJvcjogJyR7ZXJyb3J9J2BcbiAgICAgICAgICApXG4gICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHRpdGxlOiAnRmlsZSBVcGxvYWQgRXJyb3InLFxuICAgICAgICAgICAgdGV4dFxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5wdXRGaWx0ZXIobmV3RmlsZSAvKiwgb2xkRmlsZSwgcHJldmVudCAqLykge1xuICAgICAgY29uc3QgeGhyID0gbmV3RmlsZT8ueGhyXG4gICAgICBpZiAodGhpcy5hcGkuY29ycz8uY3JlZGVudGlhbHMgJiYgeGhyICYmICF4aHIud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlKSB7XG4gICAgLy8gRmlsdGVyIG91dCBhbGwgbmV3bHkgYWRkZWQgZmlsZXMgdGhhdCB3ZXJlbid0IGFjdHVhbGx5IHVwbG9hZGVkLlxuICAgIGNvbnN0IGZpbGVzID0gYXNGaWxlcyh2YWx1ZSlcbiAgICAgIC5tYXAoKHsgdXBsb2FkLCAuLi5maWxlIH0pID0+ICghdXBsb2FkIHx8IHVwbG9hZC5zdWNjZXNzID8gZmlsZSA6IG51bGwpKVxuICAgICAgLmZpbHRlcihmaWxlID0+IGZpbGUpXG4gICAgcmV0dXJuIHNjaGVtYS5tdWx0aXBsZSA/IGZpbGVzIDogZmlsZXNbMF0gfHwgbnVsbFxuICB9XG59KVxuXG5mdW5jdGlvbiBhc0ZpbGVzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IGFzQXJyYXkodmFsdWUpIDogW11cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXVwbG9hZCB7XG4gIC5kaXRvLXRhYmxlIHtcbiAgICB0ciB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbi1hZGQtdXBsb2FkIHtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgPiAqIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG4gIH1cblxuICAuZGl0by11cGxvYWQtZm9vdGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIC5kaXRvLXByb2dyZXNzIHtcbiAgICAgIGZsZXg6IGF1dG87XG4gICAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLXNwYWNpbmc7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiY29uc3QgbG9nZ2VkRGVwcmVjYXRpb25zID0gbmV3IFNldCgpXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGUobWVzc2FnZSkge1xuICAvLyBPbmx5IGxvZyBkZXByZWNhdGlvbiBtZXNzYWdlcyBvbmNlLlxuICBpZiAoIWxvZ2dlZERlcHJlY2F0aW9ucy5oYXMobWVzc2FnZSkpIHtcbiAgICBsb2dnZWREZXByZWNhdGlvbnMuYWRkKG1lc3NhZ2UpXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IFtcbiAgJ2NyZWF0ZScsICdjcmVhdGVkJyxcbiAgJ3NhdmUnLCAnc2F2ZWQnLFxuICAnc3VibWl0JywgJ3N1Ym1pdHRlZCcsXG4gICdkZWxldGUnLCAnZGVsZXRlZCcsXG4gICdlZGl0JywgJ2VkaXRlZCcsXG4gICdjbG9zZScsICdjbG9zZWQnLFxuICAnY2FuY2VsJywgJ2NhbmNlbGxlZCcsXG4gICdkcmFnJywgJ2RyYWdnZWQnXG5dLnJlZHVjZSgodmVyYnMsIHZlcmIpID0+IHtcbiAgdmVyYnNbdmVyYl0gPSB2ZXJiXG4gIHJldHVybiB2ZXJic1xufSwge30pXG4iLCJpbXBvcnQgeyBjcmVhdGVBcHAsIGggYXMgY3JlYXRlRWxlbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGNyZWF0ZVJvdXRlciwgY3JlYXRlV2ViSGlzdG9yeSB9IGZyb20gJ3Z1ZS1yb3V0ZXInXG5pbXBvcnQgVnVlTm90aWZpY2F0aW9ucyBmcm9tICdAa3l2Zy92dWUzLW5vdGlmaWNhdGlvbidcbmltcG9ydCB7XG4gIGlzU3RyaW5nLFxuICBpc0FycmF5LFxuICBhc0FycmF5LFxuICBpc0Fic29sdXRlVXJsLFxuICBtZXJnZSxcbiAgaHlwaGVuYXRlLFxuICBjYW1lbGl6ZSxcbiAgZGVmYXVsdEZvcm1hdHNcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnLi9jb21wb25lbnRzL2luZGV4LmpzJ1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi90eXBlcy9pbmRleC5qcydcbmltcG9ydCBEaXRvUm9vdCBmcm9tICcuL2NvbXBvbmVudHMvRGl0b1Jvb3QudnVlJ1xuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSB9IGZyb20gJy4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBkZXByZWNhdGUgfSBmcm9tICcuL3V0aWxzL2RlcHJlY2F0ZS5qcydcbmltcG9ydCB2ZXJicyBmcm9tICcuL3ZlcmJzLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvQWRtaW4ge1xuICBjb25zdHJ1Y3RvcihlbCwge1xuICAgIC8vIGBkaXRvYCBjb250YWlucyB0aGUgYmFzZSBhbmQgYXBpIHNldHRpbmdzIHBhc3NlZCBmcm9tIGBBZG1pbkNvbnRyb2xsZXJgXG4gICAgZGl0byA9IHt9LFxuICAgIGFwaSxcbiAgICB2aWV3cyA9IHt9LFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5lbCA9IGVsXG4gICAgLy8gTWVyZ2UgaW4gYGFwaWAgc2V0dGluZ3MgYXMgcGFzc2VkIGZyb20gYGNvbmZpZy5hZG1pbmAgYW5kIHRocm91Z2ggdGhlXG4gICAgLy8gYEFkbWluQ29udHJvbGxlcmAgd2l0aCBgYXBpYCB2YWx1ZXMgZnJvbSBmcm9tICdhZG1pbi9pbmRleC5qcydcbiAgICAvLyBOT1RFOiBgQWRtaW5Db250cm9sbGVyYCBwcm92aWRlcyBgZGl0by5hcGkuYmFzZWBcbiAgICB0aGlzLmFwaSA9IGFwaSA9IG1lcmdlKHsgYmFzZTogJy8nIH0sIGRpdG8uYXBpLCBhcGkpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuXG4gICAgLy8gU2V0dXAgZGVmYXVsdCBhcGkgc2V0dGluZ3M6XG4gICAgYXBpLmxvY2FsZSB8fD0gJ2VuLVVTJ1xuICAgIGFwaS5mb3JtYXRzID0gbWVyZ2Uoe30sIGRlZmF1bHRGb3JtYXRzLCBhcGkuZm9ybWF0cylcbiAgICBhcGkucmVxdWVzdCB8fD0gb3B0aW9ucyA9PiByZXF1ZXN0KGFwaSwgb3B0aW9ucylcbiAgICBhcGkuZ2V0QXBpVXJsIHx8PSBvcHRpb25zID0+IGdldEFwaVVybChhcGksIG9wdGlvbnMpXG4gICAgYXBpLmlzQXBpVXJsIHx8PSB1cmwgPT4gaXNBcGlVcmwoYXBpLCB1cmwpXG4gICAgLy8gU2V0dGluZyBgYXBpLm5vcm1hbGl6ZVBhdGhzID0gdHJ1ZSAocGx1cmFsKSBzZXRzIGJvdGg6XG4gICAgLy8gYGFwaS5ub3JtYWxpemVQYXRoID0gaHlwaGVuYXRlYCBhbmQgYGFwaS5kZW5vcm1hbGl6ZVBhdGggPSBjYW1lbGl6ZWBcbiAgICBhcGkubm9ybWFsaXplUGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGhzID8gaHlwaGVuYXRlIDogdmFsID0+IHZhbFxuICAgIGFwaS5kZW5vcm1hbGl6ZVBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRocyA/IGNhbWVsaXplIDogdmFsID0+IHZhbFxuXG4gICAgLy8gQWxsb3cgZGVmaW5pdGlvbiBvZiBkZWZhdWx0cyBmb3IgYWRtaW4gY29tcG9uZW50IHR5cGVzLCBuZXN0ZWQgcGVyIHR5cGU6XG4gICAgLy8gYXBpLmRlZmF1bHRzID0ge1xuICAgIC8vICAgJ211bHRpc2VsZWN0Jzoge1xuICAgIC8vICAgICBzZWxlY3RhYmxlOiB0cnVlXG4gICAgLy8gICB9LFxuICAgIC8vICAgJ2Zha2UtdHlwZSc6IHNjaGVtYSA9PiB7XG4gICAgLy8gICAgIC8vIFJldHVybiBkZWZhdWx0cywgb3IgZGlyZWN0bHkgbW9kaWZ5IHRoZSBzY2hlbWE6XG4gICAgLy8gICAgIE9iamVjdC5hc3NpZ24oc2NoZW1hLCB7XG4gICAgLy8gICAgICAgdHlwZTogJ3JlYWwtdHlwZScsXG4gICAgLy8gICAgICAgZm9ybWF0OiAoeyB2YWx1ZSB9KSA9PiBgRm9ybWF0dGVkICR7dmFsdWV9YCxcbiAgICAvLyAgICAgICBwcm9jZXNzOiAoeyB2YWx1ZSB9KSA9PiBgUHJvY2Vzc2VkICR7dmFsdWV9YFxuICAgIC8vICAgICB9KVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGFwaS5kZWZhdWx0cyB8fD0ge31cblxuICAgIC8vIEFsbG93IHRoZSBjb25maWd1cmF0aW9uIG9mIGFsbCBhdXRoIHJlc291cmNlcywgbGlrZSBzbzpcbiAgICAvLyBhcGkudXNlcnMgPSB7XG4gICAgLy8gICBwYXRoOiAnL2FkbWlucycsXG4gICAgLy8gICAvLyBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzOlxuICAgIC8vICAgbG9naW46IHtcbiAgICAvLyAgICAgcGF0aDogJ2xvZ2luJyxcbiAgICAvLyAgICAgbWV0aG9kOiAncG9zdCdcbiAgICAvLyAgIH0sXG4gICAgLy8gICBsb2dvdXQ6IHtcbiAgICAvLyAgICAgcGF0aDogJ2xvZ291dCcsXG4gICAgLy8gICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgLy8gICB9LFxuICAgIC8vICAgc2Vzc2lvbjoge1xuICAgIC8vICAgICBwYXRoOiAnc2Vzc2lvbicsXG4gICAgLy8gICAgIG1ldGhvZDogJ2dldCdcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgY29uc3QgdXNlcnMgPSBnZXRSZXNvdXJjZShhcGkudXNlcnMsIHtcbiAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJ1xuICAgIH0pIHx8IHt9XG4gICAgdXNlcnMubG9naW4gPSBnZXRSZXNvdXJjZSh1c2Vycy5sb2dpbiB8fCAnbG9naW4nLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIHVzZXJzLmxvZ291dCA9IGdldFJlc291cmNlKHVzZXJzLmxvZ291dCB8fCAnbG9nb3V0Jywge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICB1c2Vycy5zZXNzaW9uID0gZ2V0UmVzb3VyY2UodXNlcnMuc2Vzc2lvbiB8fCAnc2Vzc2lvbicsIHtcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICBhcGkudXNlcnMgPSB1c2Vyc1xuXG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyBvZiByZXNvdXJjZSBwYXRoIGhhbmRsZXJzOlxuICAgIC8vIGFwaS5yZXNvdXJjZXMgPSB7XG4gICAgLy8gICBjb2xsZWN0aW9uKHJlc291cmNlKSB7XG4gICAgLy8gICAgIHJldHVybiByZXNvdXJjZS5wYXJlbnRcbiAgICAvLyAgICAgICA/IGAke3Jlc291cmNlLnBhdGh9PyR7cmVzb3VyY2UucGFyZW50LnBhdGh9X2lkPSR7XG4gICAgLy8gICAgICAgICAgcmVzb3VyY2UucGFyZW50LmlkfWBcbiAgICAvLyAgICAgICA6IHJlc291cmNlLnBhdGhcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBhcGkucmVzb3VyY2VzID0ge1xuICAgICAgYW55KHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzW3Jlc291cmNlPy50eXBlXSB8fCB0aGlzLmRlZmF1bHRcbiAgICAgICAgcmV0dXJuIHJlc291cmNlICYmIGhhbmRsZXIuY2FsbCh0aGlzLCByZXNvdXJjZSlcbiAgICAgIH0sXG5cbiAgICAgIGRlZmF1bHQocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRoaXMuYW55KHJlc291cmNlLnBhcmVudClcbiAgICAgICAgcmV0dXJuIHBhcmVudFBhdGhcbiAgICAgICAgICA/IGAke3BhcmVudFBhdGh9LyR7cmVzb3VyY2UucGF0aH1gXG4gICAgICAgICAgOiByZXNvdXJjZS5wYXRoXG4gICAgICB9LFxuXG4gICAgICBjb2xsZWN0aW9uKHJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQocmVzb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBtZW1iZXIocmVzb3VyY2UpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXNzdW1lIHRoYXQgYWxsIG1lbWJlcnMgaGF2ZSByb290LWxldmVsIGNvbGxlY3Rpb24gcm91dGVzLFxuICAgICAgICAvLyB0byBhdm9pZCBleGNlc3NpdmUgbmVzdGluZyBvZiAoc3ViLSljb2xsZWN0aW9uIHJvdXRlcy5cbiAgICAgICAgcmV0dXJuIGAke3Jlc291cmNlLnBhdGh9LyR7cmVzb3VyY2UuaWR9YFxuICAgICAgfSxcblxuICAgICAgdXBsb2FkKHJlc291cmNlKSB7XG4gICAgICAgIC8vIERpdG8gU2VydmVyIGhhbmRsZXMgdXBsb2FkIHJvdXRlcyBvbiB0aGUgY29sbGVjdGlvbiByZXNvdXJjZTpcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY29sbGVjdGlvbihyZXNvdXJjZS5wYXJlbnQpfS91cGxvYWQvJHtyZXNvdXJjZS5wYXRofWBcbiAgICAgIH0sXG5cbiAgICAgIC4uLmFwaS5yZXNvdXJjZXNcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBvdmVycmlkaW5nIC8gZXh0ZW5kaW5nIG9mIGhlYWRlcnM6XG4gICAgLy8gYXBpLmhlYWRlcnMgPSB7XG4gICAgLy8gICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgLy8gfVxuICAgIGFwaS5oZWFkZXJzID0ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLmFwaS5oZWFkZXJzXG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKGVsKSkge1xuICAgICAgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsKVxuICAgIH1cblxuICAgIGNvbnN0IGFwcCA9ICh0aGlzLmFwcCA9IGNyZWF0ZUFwcCh7XG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIERpdG9Sb290LFxuICAgICAgICBWdWVOb3RpZmljYXRpb25zLFxuICAgICAgICAvLyBUaGlzIG1heSBvbmx5IGJlIG5lZWRlZCB0byBhdm9pZCB0cmVlLXNoYWNraW5nIG9mIHRoZXNlIGNvbXBvbmVudHMsXG4gICAgICAgIC8vIHNpbmNlIHRoZXkgYWN0dWFsbHkgaGFuZGxlIHJlZ2lzdHJ5IGludGVybmFsbHkgYWxyZWFkeS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uLlxuICAgICAgICAuLi5jb21wb25lbnRzLFxuICAgICAgICAuLi50eXBlc1xuICAgICAgfSxcblxuICAgICAgLy8gTW9zdCBpbmplY3RzIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgdG8gcHJlc2VydmUgcmVhY3RpdmVuZXNzIGFjcm9zc1xuICAgICAgLy8gcHJvdmlkZS9pbmplY3QsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgICAgcHJvdmlkZToge1xuICAgICAgICBhcGksXG4gICAgICAgIC8vIEEgZGVmYXVsdCBsaXN0IG9mIHZlcmJzIGFyZSBwcm92aWRlZCBieSAkdmVyYnMoKSBhbmQgY2FuIGJlXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYXQgYW55IHBvaW50IGluIHRoZSBjb21wb25lbnQgaGllcmFyY2h5LlxuICAgICAgICAkdmVyYnM6ICgpID0+IHZlcmJzLFxuICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHRzIHNvIERpdG9NaXhpbiBjYW4gaW5qZWN0IHRoZW0gZm9yIGFsbCBjb21wb25lbnRzOlxuICAgICAgICAvLyAgIGluamVjdDogWyAgJyRpc1BvcHVsYXRlZCcsICckc2NoZW1hQ29tcG9uZW50JywgJyRyb3V0ZUNvbXBvbmVudCcgXVxuICAgICAgICAkdmlld3M6ICgpID0+IHt9LFxuICAgICAgICAkaXNQb3B1bGF0ZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzY2hlbWFDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzY2hlbWFQYXJlbnRDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRyb3V0ZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJGRhdGFDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRzb3VyY2VDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiBudWxsXG4gICAgICB9LFxuXG4gICAgICByZW5kZXI6ICgpID0+XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoRGl0b1Jvb3QsIHtcbiAgICAgICAgICByZWY6ICdyb290JyxcbiAgICAgICAgICBjbGFzczogZGl0by5zZXR0aW5ncy5yb290Q2xhc3MsXG4gICAgICAgICAgdW5yZXNvbHZlZFZpZXdzOiB2aWV3cyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIH0pXG4gICAgfSkpXG5cbiAgICBhcHAudXNlKFZ1ZU5vdGlmaWNhdGlvbnMsIHtcbiAgICAgIG5hbWU6ICdub3RpZnknLFxuICAgICAgY29tcG9uZW50TmFtZTogJ1Z1ZU5vdGlmaWNhdGlvbnMnXG4gICAgfSlcblxuICAgIC8vIHJvb3QuY29tcG9uZW50KCd2dWUtbW9kYWwnLCBWdWVNb2RhbClcblxuICAgIGFwcC51c2UoXG4gICAgICBjcmVhdGVSb3V0ZXIoe1xuICAgICAgICAvLyBTdGFydCB3aXRoIGEgY2F0Y2gtYWxsIHJvdXRlLCB0byBiZSByZXBsYWNlZCBieSB0aGUgYWN0dWFsIHJvdXRlc1xuICAgICAgICAvLyBvbmNlIHRoZSBzY2hlbWFzIGFyZSBsb2FkZWQsIHRvIHByZXZlbnQgdnVlLXJvdXRlciBmcm9tIGNvbXBsYWluaW5nLFxuICAgICAgICAvLyBzZWU6IGByZXNvbHZlVmlld3MoKWAgaW4gYERpdG9Sb290YCBmb3IgdGhlIGFjdHVhbCByb3V0ZSBzZXR1cC5cbiAgICAgICAgcm91dGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2NhdGNoLWFsbCcsXG4gICAgICAgICAgICBwYXRoOiAnLzpfKC4qKScsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgaGlzdG9yeTogY3JlYXRlV2ViSGlzdG9yeShkaXRvLmJhc2UpLFxuICAgICAgICBsaW5rQWN0aXZlQ2xhc3M6ICcnLFxuICAgICAgICBsaW5rRXhhY3RBY3RpdmVDbGFzczogJydcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZGl0by1hcHAnKVxuICAgIGFwcC5tb3VudChlbClcbiAgfVxuXG4gIHJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIodHlwZSwgb3B0aW9ucylcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlKSB7XG4gICAgc3VwZXIoXG4gICAgICBgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9ICgke1xuICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICB9KWBcbiAgICApXG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChhcGksIHtcbiAgdXJsLFxuICBtZXRob2QgPSAnZ2V0JyxcbiAgLy8gVE9ETzogYHJlcXVlc3QucGFyYW1zYCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYHF1ZXJ5YCBvbiAyMDIyLTExLTAxLFxuICAvLyByZW1vdmUgb25jZSBub3QgaW4gdXNlIGFueXdoZXJlIGFueSBtb3JlLlxuICBwYXJhbXMgPSBudWxsLFxuICBxdWVyeSA9IHBhcmFtcyB8fCBudWxsLFxuICBoZWFkZXJzID0gbnVsbCxcbiAgZGF0YSA9IG51bGxcbn0pIHtcbiAgaWYgKHBhcmFtcykge1xuICAgIGRlcHJlY2F0ZShcbiAgICAgIGByZXF1ZXN0LnBhcmFtcyBpcyBkZXByZWNhdGVkLiBVc2UgYWN0aW9uLm1ldGhvZCBhbmQgYWN0aW9uLnBhdGggaW5zdGVhZC5gXG4gICAgKVxuICB9XG5cbiAgY29uc3QgaXNBcGlVcmwgPSBhcGkuaXNBcGlVcmwodXJsKVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXBpLmdldEFwaVVybCh7IHVybCwgcXVlcnkgfSksIHtcbiAgICBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgIC4uLihkYXRhICYmIHsgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSksXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKGlzQXBpVXJsICYmIGFwaS5oZWFkZXJzKSxcbiAgICAgIC4uLmhlYWRlcnNcbiAgICB9LFxuICAgIGNyZWRlbnRpYWxzOlxuICAgICAgaXNBcGlVcmwgJiYgYXBpLmNvcnM/LmNyZWRlbnRpYWxzXG4gICAgICAgID8gJ2luY2x1ZGUnXG4gICAgICAgIDogJ3NhbWUtb3JpZ2luJ1xuICB9KVxuXG4gIGlmIChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk/LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXNwb25zZS5kYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIH1cblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IFJlcXVlc3RFcnJvcihyZXNwb25zZSlcbiAgfVxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuZnVuY3Rpb24gaXNBcGlVcmwoYXBpLCB1cmwpIHtcbiAgcmV0dXJuICFpc0Fic29sdXRlVXJsKHVybCkgfHwgdXJsLnN0YXJ0c1dpdGgoYXBpLnVybClcbn1cblxuZnVuY3Rpb24gZ2V0QXBpVXJsKGFwaSwgeyB1cmwsIHF1ZXJ5IH0pIHtcbiAgaWYgKCFpc0Fic29sdXRlVXJsKHVybCkpIHtcbiAgICB1cmwgPSBjb21iaW5lVXJscyhhcGkudXJsLCB1cmwpXG4gIH1cbiAgLy8gU3VwcG9ydCBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzLCB0byBiZSBhcmUgYWRkZWQgdG8gdGhlIFVSTC5cbiAgY29uc3Qgc2VhcmNoID0gZm9ybWF0UXVlcnkocXVlcnkpXG4gIHJldHVybiBzZWFyY2ggPyBgJHt1cmx9PyR7c2VhcmNofWAgOiB1cmxcbn1cblxuZnVuY3Rpb24gY29tYmluZVVybHMoYmFzZVVybCwgcmVsYXRpdmVVcmwpIHtcbiAgLy8gVXNlIHNhbWUgYXBwcm9hY2ggYXMgYXhpb3MgYGNvbWJpbmVVUkxzKClgIHRvIGpvaW4gYmFzZVVybCAmIHJlbGF0aXZlVXJsOlxuICByZXR1cm4gYCR7YmFzZVVybC5yZXBsYWNlKC9cXC8rJC8sICcnKX0vJHtyZWxhdGl2ZVVybC5yZXBsYWNlKC9eXFwvKy8sICcnKX1gXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFF1ZXJ5KHF1ZXJ5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBxdWVyeVxuICAgID8gaXNBcnJheShxdWVyeSlcbiAgICAgID8gcXVlcnlcbiAgICAgIDogT2JqZWN0LmVudHJpZXMocXVlcnkpXG4gICAgOiBbXVxuICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtcyhcbiAgICAvLyBFeHBhbmQgYXJyYXkgdmFsdWVzIGludG8gbXVsdGlwbGUgZW50cmllcyB1bmRlciB0aGUgc2FtZSBrZXksIHNvXG4gICAgLy8gYGZvcm1hdFF1ZXJ5KHsgZm9vOiBbMSwgMl0sIGJhcjogMyB9KWAgPT4gJ2Zvbz0xJmZvbz0yJmJhcj0zJy5cbiAgICBlbnRyaWVzLnJlZHVjZShcbiAgICAgIChlbnRyaWVzLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgYXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsXSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgfSxcbiAgICAgIFtdXG4gICAgKVxuICApLnRvU3RyaW5nKClcbn1cbiJdLCJuYW1lcyI6WyJhcHBTdGF0ZSIsInJlYWN0aXZlIiwiYXBwZW5kRGF0YVBhdGgiLCJkYXRhUGF0aCIsInRva2VuIiwicGFyc2VQYXJlbnREYXRhUGF0aCIsInBhdGgiLCJwYXJzZURhdGFQYXRoIiwicGFyc2VJdGVtRGF0YVBhdGgiLCJuZXN0ZWQiLCJnZXRJdGVtRGF0YVBhdGgiLCJub3JtYWxpemVEYXRhUGF0aCIsInBhcnNlUGFyZW50SXRlbURhdGFQYXRoIiwiaXNJbnRlZ2VyIiwiZ2V0UGFyZW50SXRlbURhdGFQYXRoIiwiZ2V0SXRlbSIsInJvb3RJdGVtIiwiZ2V0VmFsdWVBdERhdGFQYXRoIiwiZ2V0UGFyZW50SXRlbSIsImdldExhc3REYXRhUGF0aFRva2VuIiwiZ2V0TGFzdERhdGFQYXRoTmFtZSIsImdldExhc3REYXRhUGF0aEluZGV4IiwiaW5kZXgiLCJ0ZW1wb3JhcnlJZCIsInNldFRlbXBvcmFyeUlkIiwiZGF0YSIsImlkS2V5IiwiaXNUZW1wb3JhcnlJZCIsImlkIiwiaXNSZWZlcmVuY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbnRleHRzIiwiZ2V0IiwiY29udGV4dCIsImtleSIsImRlZmF1bHRWYWx1ZSIsIm9iamVjdCIsInRvUmF3IiwidmFsdWUiLCJpc0Z1bmN0aW9uIiwic2V0IiwiRGl0b0NvbnRleHQiLCJjb21wb25lbnQiLCJwYXJlbnRJdGVtIiwib3B0aW9ucyIsImxvY2F0aW9uIiwicmVzb3VyY2UiLCJFbWl0dGVyTWl4aW4iLCJldmVudCIsImNhbGxiYWNrIiwiaXNBcnJheSIsImV2IiwiaXNQbGFpbk9iamVjdCIsImxpc3RlbmVycyIsImNhbGxiYWNrcyIsIm9uIiwiYXJncyIsImVudHJ5IiwiX2EiLCJjYiIsInF1ZXVlIiwicmVzb2x2ZSIsIm5leHQiLCJyZXN1bHQiLCJyZXMiLCJlcnJvciIsInRhcmdldCIsInR5cGVDaGVja2VycyIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJpc0RhdGUiLCJpc09iamVjdCIsImlzUmVnRXhwIiwidHlwZUNvbnZlcnRlcnMiLCJhc0FycmF5IiwiaXNNYXRjaGluZ1R5cGUiLCJ0eXBlcyIsInR5cGUiLCJjb252ZXJ0VHlwZSIsImNvbnZlcnRlciIsImhhc1Jlc291cmNlIiwic2NoZW1hIiwiZ2V0UmVzb3VyY2UiLCJkZWZhdWx0cyIsInBhcmVudCIsImRlZnMiLCJnZXRNZW1iZXJSZXNvdXJjZSIsInBpY2tCeSIsIkRpdG9NaXhpbiIsInVpZCIsIm5leHRVaWQiLCJrZXlPckRhdGFQYXRoIiwiZGVmIiwiY29udmVydGVkIiwibmFtZSIsImxhYmVsaXplIiwiYnV0dG9uIiwidmVyYiIsInF1ZXJ5IiwidXJsIiwibWV0aG9kIiwiaW50ZXJuYWwiLCJjaGVja1VzZXIiLCJyZXNwb25zZSIsImVxdWFscyIsImNvbXBvbmVudHMiLCJidXR0b25zIiwic2V0dGluZ3MiLCJjYWNoZSIsImNhY2hlUGFyZW50IiwibG9hZENhY2hlIiwiY2FjaGVLZXkiLCJsb2NhbGUiLCJmb3JtYXQiLCJhIiwiYm9keSIsImFjY2Vzc29yIiwid2F0Y2giLCJldmVudHMiLCJoYW5kbGVycyIsImV4cHIiLCJhZGRFdmVudCIsImh5cGhlbmF0ZSIsImhhc0xpc3RlbmVycyIsInBhcmVudEhhc0xpc3RlbmVycyIsImdldENvbnRleHQiLCJwYXJhbXMiLCJpc0NyZWRpdENhcmQiLCJkZWNpbWFscyIsIm1hdGNoIiwiaXNEb21haW4iLCJpc0VtYWlsIiwiaXNIb3N0bmFtZSIsIm1heCIsIm1pbiIsInBhc3N3b3JkIiwiaXNVcmwiLCJWYWxpZGF0aW9uTWl4aW4iLCJub3RpZnkiLCJpc1ZhbGlkIiwicnVsZSIsInNldHRpbmciLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0aW9ucyIsInZhbGlkYXRlIiwibWVzc2FnZSIsImFkZExhYmVsIiwiZXJyb3JzIiwiZm9jdXMiLCJnZXRTY2hlbWFBY2Nlc3NvciIsImdldFN0b3JlQWNjZXNzb3IiLCJUeXBlTWl4aW4iLCJjb21wdXRlVmFsdWUiLCJwYXJzZSIsInNjaGVtYUNvbXBvbmVudCIsImxhYmVsIiwib25Gb2N1cyIsIm9uQmx1ciIsIm9uSW5wdXQiLCJvbkNoYW5nZSIsIm5hdGl2ZUZpZWxkIiwidGV4dEZpZWxkIiwiYXR0cmlidXRlcyIsImFkZCIsImVsZW1lbnQiLCJfYiIsInVpZE1hcCIsImdldFVpZCIsIml0ZW1JZCIsIlNjaGVtYUdyYXBoIiwiX19wdWJsaWNGaWVsZCIsInN1YkdyYXBoIiwicGFydCIsInJlbGF0ZWREYXRhUGF0aCIsIm5hbm9pZCIsImZsYXR0ZW4iLCJncmFwaCIsImVudHJpZXMiLCIkc2V0dGluZ3MiLCJzdWJLZXkiLCJzb3VyY2VTY2hlbWEiLCJjbGlwYm9hcmQiLCJyZWxhdGVkIiwicmVmZXJlbmNlIiwic291cmNlIiwicmVsYXRpb24iLCJ2YWx1ZXMiLCJyZW1vdmVJZCIsInJlZmVyZW5jZUlkIiwicmVmS2V5IiwicmV2VmFsdWUiLCJ0eXBlQ29tcG9uZW50cyIsInVua25vd25UeXBlUmVwb3J0ZWQiLCJyZWdpc3RlclR5cGVDb21wb25lbnQiLCJnZXRUeXBlQ29tcG9uZW50IiwiYWxsb3dOdWxsIiwiZ2V0U2NoZW1hcyIsIml0ZXJhdGVTY2hlbWFDb21wb25lbnRzIiwiaXNTaW5nbGVDb21wb25lbnRWaWV3Iiwic2NoZW1hcyIsInNvbWVTY2hlbWFDb21wb25lbnQiLCJpc1NjaGVtYSIsImlzRm9ybSIsImlzVmlldyIsImdldFNjaGVtYUlkZW50aWZpZXIiLCJyZXNvbHZlU2NoZW1hIiwidW53cmFwTW9kdWxlIiwiaXNQcm9taXNlIiwiaXNNb2R1bGUiLCJrZXlzIiwicmVzb2x2ZVNjaGVtYXMiLCJ1bnJlc29sdmVkU2NoZW1hcyIsInJlc29sdmVJdGVtIiwibWFwQ29uY3VycmVudGx5IiwiaXRlbSIsInJlc29sdmVQYW5lbHMiLCJwYW5lbHMiLCJyZXNvbHZlU2NoZW1hQ29tcG9uZW50IiwibWFya1JhdyIsInJlc29sdmVTY2hlbWFDb21wb25lbnRzIiwicHJvY2Vzc1ZpZXciLCJhcGkiLCJwcm9jZXNzUm91dGVTY2hlbWEiLCJwcm9jZXNzRGVmYXVsdHMiLCJjaGlsZHJlbiIsInByb2Nlc3NDb21wb25lbnQiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyIsInJvdXRlcyIsImxldmVsIiwiZ2V0VHlwZU9wdGlvbnMiLCJtZXJnZSIsInByb21pc2VzIiwicHJvY2Vzc0Zvcm1zIiwicHJvY2Vzc0Zvcm0iLCJmb3JtIiwicmVzb2x2ZUZvcm0iLCJmb3JtcyIsImhhc0Zvcm1TY2hlbWEiLCJoYXNNdWx0aXBsZUZvcm1TY2hlbWFzIiwiZ2V0Vmlld0Zvcm1TY2hlbWEiLCJ2aWV3Iiwidmlld1NjaGVtYSIsImdldFZpZXdTY2hlbWEiLCJnZXRWaWV3RWRpdFBhdGgiLCJnZXRGb3JtU2NoZW1hcyIsIm1vZGlmeUZvcm0iLCJjb21wYWN0IiwiZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMiLCJnZXRJdGVtRm9ybVNjaGVtYSIsImhhc0xhYmVsIiwiaXNDb21wYWN0IiwiaXNJbmxpbmVkIiwiaXNOZXN0ZWQiLCJzaG91bGRPbWl0UGFkZGluZyIsImdldERlZmF1bHRWYWx1ZSIsImNsb25lIiwiaWdub3JlTWlzc2luZ1ZhbHVlIiwidHlwZU9wdGlvbnMiLCJoYXNMYWJlbHMiLCJjaGVja0NvbXBvbmVudHMiLCJzZXREZWZhdWx0VmFsdWVzIiwicHJvY2Vzc1NjaGVtYURhdGEiLCJyb290RGF0YSIsImNvbXB1dGUiLCJjbG9uZUl0ZW0iLCJjb3B5Iiwib3JkZXJLZXkiLCJwcm9jZXNzRGF0YSIsInNjaGVtYU9ubHkiLCJwcm9jZXNzZWREYXRhIiwid3JhcFByaW1pdGl2ZXMiLCJiIiwiaWQxIiwiaWQyIiwiZXhjbHVkZSIsInByb2Nlc3MiLCJwcm9jZXNzVmFsdWUiLCJwcm9jZXNzQmVmb3JlIiwicHJvY2Vzc0FmdGVyIiwicHJvY2Vzc0NvbXBvbmVudHMiLCJnZXREYXRhUGF0aCIsImNvbXBvbmVudFNjaGVtYSIsImNvbXBvbmVudERhdGFQYXRoIiwicHJvY2Vzc0l0ZW0iLCJwcm9jZXNzZWRJdGVtIiwidGFiIiwicGFuZWwiLCJnZXRBbGxQYW5lbFNjaGVtYXMiLCJnZXROYW1lZFNjaGVtYXMiLCJ0b09iamVjdCIsImFycmF5IiwidG9TY2hlbWEiLCJjYW1lbGl6ZSIsImdldEJ1dHRvblNjaGVtYXMiLCJnZXRUeXBlIiwic2NoZW1hT3JUeXBlIiwiZ2V0U291cmNlVHlwZSIsImdldFBhbmVsU2NoZW1hIiwidGFiQ29tcG9uZW50IiwiZ2V0UGFuZWxTY2hlbWFzIiwiaXNPYmplY3RTb3VyY2UiLCJpc0xpc3RTb3VyY2UiLCJnZXRJdGVtSWQiLCJnZXRJdGVtVWlkIiwicmVzb2x2ZU1lcmdlZE9wdGlvbnMiLCJtaXhpbnMiLCJtZXJnZU9wdGlvbnMiLCJ0byIsImZyb20iLCJtaXhpbiIsImRpdG9PcHRpb25LZXlzIiwiRGl0b0NvbXBvbmVudCIsImRlZmluaXRpb24iLCJEaXRvVXNlciIsInJvbGVzIiwicm9sZSIsIlNjaGVtYVBhcmVudE1peGluIiwic2NoZW1hQ29tcG9uZW50cyIsIlZhbGlkYXRvck1peGluIiwiaXQiLCJSb3V0ZU1peGluIiwicm91dGVDb21wb25lbnQiLCJtYXRjaGVkIiwiaSIsInJlY29yZCIsImJyZWFkY3J1bWIiLCJyb3V0ZUNvbXBvbmVudHMiLCJvayIsInRlbXBsYXRlUGF0aCIsInJvb3RQYXRoIiwiZ2V0Q29tbW9uUHJlZml4IiwiaXNMb2FkaW5nIiwiY29weURhdGUiLCJkYXRlIiwieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwibW9kZSIsIm92ZXJyaWRlcyIsInN0ZXAiLCJjdXJyZW50VmFsdWUiLCJzdGF0ZSIsImhvciIsInZlciIsImVudGVyIiwiY3VycmVudE1vZGUiLCJzdGFydFllYXIiLCJmaXJzdERheVdlZWsiLCJudW1EYXlzIiwicHJldk1vbnRoIiwicHJldk1vbnRoTnVtRGF5cyIsInRvZGF5IiwiaXNEYXkiLCJuZXh0TW9udGhOZWVkIiwibmV4dE1vbnRoIiwibG9jYWxlTmFtZXMiLCJuYW1lcyIsImFkZEV2ZW50cyIsImdldEtleSIsImdldEtleU5hdmlnYXRpb24iLCJjbGFzc2VzIiwic2hvdyIsInRyaWdnZXIiLCJwb3B1cCIsImVsIiwiYm91bmRzIiwidHJpZ2dlckxlZnQiLCJ0cmlnZ2VyVG9wIiwidHJpZ2dlcldpZHRoIiwidHJpZ2dlckhlaWdodCIsInBvcHVwV2lkdGgiLCJwb3B1cEhlaWdodCIsInBhcnQxIiwicGFydDIiLCJ3aW5XaWR0aCIsIndpbkhlaWdodCIsImxlZnQiLCJ0b3AiLCJ0cmlnZ2VyQm91bmRzIiwic2l6ZSIsImdldExlbmd0aCIsIlRyaWdnZXIiLCJDYWxlbmRhciIsIklucHV0RmllbGQiLCJkZWZhdWx0Rm9ybWF0cyIsInNjcm9sbFRvIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJwZXJUaWNrIiwic2V0U2VsZWN0aW9uIiwiZmllbGQiLCJzdGFydCIsImVuZCIsInJhbmdlIiwiZm9yY2UiLCJzY3JvbGwiLCJyZWYiLCJsaW5lSGVpZ2h0Iiwic2VsZWN0ZWQiLCJsZW5ndGgiLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsInBhZ2UiLCJwYWdlU2l6ZSIsImN1cnJlbnRQYWdlU2l6ZSIsInNob3dQcmV2Iiwic2hvd05leHQiLCJ0b3RhbCIsImN1cnJlbnRQYWdlIiwic2hvd0xlbmd0aCIsIm51bVBhZ2VzIiwicGFnZVJhbmdlIiwiY2hlY2tlZCIsImRpc2FibGVkIiwidW5jaGVja2VkIiwibW9kZWxWYWx1ZSIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwic2xvdHMiLCJjcmVhdGVFbGVtZW50IiwiVHJhbnNpdGlvbiIsInByb3BzIiwic2V0U3R5bGUiLCJzdHlsZSIsImZvcmNlUmVwYWludCIsIndpZHRoIiwiaGVpZ2h0IiwiVXNlRm9jdXNUcmFwIiwiZGVmaW5lQ29tcG9uZW50IiwidHJhcCIsImFjdGl2YXRlIiwiZGVhY3RpdmF0ZSIsInVucmVmRWxlbWVudCIsImNyZWF0ZUZvY3VzVHJhcCIsIm9uU2NvcGVEaXNwb3NlIiwiaCIsImRpYWxvZ0RhdGEiLCJEb21NaXhpbiIsInJlbW92ZSIsImhhbmRsZXIiLCJEaXRvRGlhbG9nIiwiZXJyIiwidGl0bGUiLCJ0ZXh0IiwibG9nIiwic3RyaXBUYWdzIiwibm90aWZpY2F0aW9ucyIsImR1cmF0aW9uRmFjdG9yIiwicmVqZWN0IiwiZGlhbG9nSWQiLCJhZGRpdGlvbmFsQ29tcG9uZW50cyIsInJlZGlyZWN0QWZ0ZXJMb2dpbiIsImxvZ2luRGF0YSIsInVzZXIiLCJEaXRvVmlldyIsImZ1bGxQYXRoIiwiYWRkUm91dGVzIiwicm91dGVyIiwicmVtb3ZlcnMiLCJyb3V0ZSIsInJlbW92ZVJvdXRlIiwiRGl0b1NwaW5uZXIiLCJjb2xvciIsIlB1bGxkb3duTWl4aW4iLCJzdGFydFRpbWUiLCJvcGVuIiwiY29udGVudCIsImFzT2JqZWN0IiwiSXRlbU1peGluIiwiZXh0ZW5kZWQiLCJpdGVtTGFiZWwiLCJmb3JtTGFiZWwiLCJnZXRGb3JtTGFiZWwiLCJwcmVmaXgiLCJzdWZmaXgiLCJjb2x1bW5zIiwiaGFkTGFiZWwiLCJwYW5lIiwiY3VycmVudFRhYiIsImZpcnN0IiwiZGVmYXVsdFRhYiIsImRhdGFQYXRoT3JOYW1lIiwiZXhwYW5kIiwiY29tcG9uZW50c0J5RGF0YVBhdGgiLCJkYXRhUGF0aHMiLCJjaGVjayIsInVubWF0Y2hlZCIsImVycnMiLCJmdWxsRGF0YVBhdGgiLCJkYXRhUGF0aFBhcnRzIiwiZm91bmQiLCJwcm9wZXJ0eSIsInN1YkNvbXBvbmVudHMiLCJyZWdpc3RyeSIsImVudHJpZXNCeURhdGFQYXRoIiwiX2hvaXN0ZWRfMSIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX0ZyYWdtZW50IiwiX3JlbmRlckxpc3QiLCJfY3R4IiwiX2hvaXN0ZWRfMiIsIl9jcmVhdGVCbG9jayIsIl9jb21wb25lbnRfRGl0b0NvbnRhaW5lciIsIm5lc3RlZERhdGFQYXRoIiwic3RvcmUiLCJfaG9pc3RlZF8zIiwicGFyc2VGcmFjdGlvbiIsImRpdmlkZW5kIiwiZGl2aXNvciIsImNvbnRhaW5lckNsYXNzIiwiYmFzaXMiLCJncm93Iiwic2hyaW5rIiwiYmFzaXNJc0F1dG8iLCJoYXNWTm9kZUNvbnRlbnQiLCJ2bm9kZSIsIkNvbW1lbnQiLCJoYXNTbG90Q29udGVudCIsInNsb3QiLCJ1c2VTbG90cyIsImNhcGl0YWxpemUiLCJjbGlwYm9hcmREYXRhIiwicGFzdGUiLCJyZXBvcnQiLCJqc29uIiwiX2QiLCJfYyIsImRlaW5kZW50IiwiJHNjaGVtYSIsIl9lIiwiTG9hZGluZ01peGluIiwidXBkYXRlUm9vdCIsInVwZGF0ZVZpZXciLCJSZXNvdXJjZU1peGluIiwiYW1vdW50IiwidmVyYnMiLCJjbGVhciIsImxvYWRpbmdPcHRpb25zIiwicmVxdWVzdCIsInNldERhdGEiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwibm90aWZ5U3VjY2VzcyIsIm5vdGlmeUVycm9yIiwicmVzb2x2ZVBhdGgiLCJpc0NyZWF0aW5nIiwicHJvdmlkZXNEYXRhIiwiZGF0YVBhcnRzIiwicGF0aFBhcnRzIiwicm91dGVQYXJ0cyIsImxhc3REYXRhUGFydCIsImwiLCJkYXRhUGFydCIsIm1haW5TY2hlbWFDb21wb25lbnQiLCJwcmVzZW50IiwiY2xvc2VGb3JtIiwiZ2V0VmVyYiIsImJ1dHRvblJlc291cmNlIiwic3VjY2VzcyIsIl9yZXNvdXJjZSIsIl9tZXRob2QiLCJEaXRvRm9ybSIsInNjb3BlIiwiUGFnaW5hdGlvbiIsIl9fZGVmUHJvcCIsIl9fZ2V0T3duUHJvcFN5bWJvbHMiLCJfX2hhc093blByb3AiLCJfX3Byb3BJc0VudW0iLCJfX2RlZk5vcm1hbFByb3AiLCJvYmoiLCJfX3NwcmVhZFZhbHVlcyIsInByb3AiLCJfX29ialJlc3QiLCJ1c2VTb3J0YWJsZSIsImxpc3QiLCJzb3J0YWJsZSIsImRvY3VtZW50IiwiZGVmYXVsdERvY3VtZW50IiwicmVzZXRPcHRpb25zIiwiZGVmYXVsdE9wdGlvbnMiLCJlIiwibW92ZUFycmF5RWxlbWVudCIsIlNvcnRhYmxlIiwic3RvcCIsInRyeU9uTW91bnRlZCIsInRyeU9uU2NvcGVEaXNwb3NlIiwidG9WYWx1ZSIsIm5leHRUaWNrIiwiU29ydGFibGVNaXhpbiIsInVzZVZNb2RlbCIsImRyYWdnYWJsZSIsImZhbGxiYWNrIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsInBhZ2luYXRpb25SYW5nZSIsIm9mZnNldCIsIl9ub3JtYWxpemVTdHlsZSIsIl9jYWNoZSIsIl93aXRoTW9kaWZpZXJzIiwiJGV2ZW50IiwiX25vcm1hbGl6ZUNsYXNzIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9ob2lzdGVkXzQiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfNSIsIl9ob2lzdGVkXzciLCJfbWVyZ2VQcm9wcyIsIl93aXRoRGlyZWN0aXZlcyIsIl9ob2lzdGVkXzgiLCJfY29tcG9uZW50X0RpdG9MYWJlbCIsIl9jcmVhdGVWTm9kZSIsIl9jb21wb25lbnRfRGl0b1RhYmxlQ2VsbCIsIl9jb21wb25lbnRfVXNlU29ydGFibGUiLCJfY29tcG9uZW50X0RpdG9UcmVlSXRlbSIsImNoaWxkcmVuU2NoZW1hIiwiY2hpbGRyZW5MaXN0IiwiZWRpdFBhdGgiLCJjaGlsZHJlbk9wZW4iLCJudW1DaGlsZHJlbiIsImNyZWF0YWJsZSIsImVkaXRhYmxlIiwib3JkZXIiLCJjb2x1bW4iLCJyZW5kZXIiLCJlc2NhcGVIdG1sIiwiRGl0b1ZOb2RlIiwiRGl0b1R5cGVDb21wb25lbnQkMSIsIkRpdG9UeXBlQ29tcG9uZW50Iiwib25DbGljayIsIkRhdGFNaXhpbiIsInJlc29sdmVDb3VudGVyIiwiYXN5bmNFbnRyeSIsInJlc29sdmVkRGF0YSIsImxvYWQiLCJPcHRpb25zTWl4aW4iLCJjb252ZXJ0VmFsdWUiLCJjb252ZXJ0Iiwic2VhcmNoIiwiZmlsdGVyIiwiZGVib3VuY2UiLCJkZWJvdW5jZUFzeW5jIiwib3B0aW9uIiwiZ3JvdXBlZCIsInJlc3VsdHMiLCJncm91cCIsImZpbmRPcHRpb24iLCJncm91cEJ5Iiwib3B0aW9uVmFsdWUiLCJvcHRpb25MYWJlbCIsInByb2Nlc3NSZWxhdGUiLCJmbGFzayIsIkNvZGVGbGFzayIsImNoYW5nZWQiLCJpZ25vcmVXYXRjaCIsImlnbm9yZVVwZGF0ZSIsInNldENvZGUiLCJjb2RlIiwic2V0VmFsdWUiLCJTa2V0Y2hQaWNrZXIiLCJ0aW55Y29sb3IiLCJmb2N1c2VkIiwiRGF0ZVRpbWVQaWNrZXIiLCJTb3VyY2VNaXhpbiIsImRlZmF1bHRTb3J0IiwiZGlyZWN0aW9uIiwiY29sbGFwc2libGUiLCJsaXN0RGF0YSIsIm9uQ29tcGxldGUiLCJvcGVuZWQiLCJjYWxsT25Db21wbGV0ZSIsImlubGluZWQiLCJwYXJhbSIsIm1ldGEiLCJmb3JtTWV0YSIsImNoaWxkUm91dGVzIiwiZ2V0UGF0aFdpdGhQYXJhbSIsInNvdXJjZVBhdGgiLCJmb3JtUm91dGUiLCJmbGF0Um91dGVzIiwic3ViUm91dGVzIiwiY2hpbGRSb3V0ZSIsImZpbHRlckNvbXBvbmVudHMiLCJkYXRlRm9ybWF0IiwiZ2V0RmlsdGVyc1BhbmVsIiwiZmlsdGVycyIsInByb3h5IiwicGFyc2VGaWx0ZXJzRGF0YSIsImdldEZpbHRlcnNDb21wb25lbnRzIiwiZm9ybWF0RmlsdGVyc0RhdGEiLCJjb21wcyIsImdldENvbXBvbmVudHNGb3JGaWx0ZXIiLCJmaWx0ZXJzRGF0YSIsIl9jb21wb25lbnRfRGl0b1RhYmxlSGVhZCIsIl9jb21wb25lbnRfRGl0b1NjaGVtYUlubGluZWQiLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJfY29tcG9uZW50X0RpdG9FZGl0QnV0dG9ucyIsIl9ob2lzdGVkXzkiLCJnZXRMaXN0Q29tcG9uZW50IiwiZmlsdGVyc0RhdGFQYXRoIiwiRWRpdG9yQ29udGVudCIsIkljb24iLCJlZGl0b3IiLCJtYXJrQnV0dG9ucyIsImJhc2ljTm9kZUJ1dHRvbnMiLCJvdGhlck5vZGVCdXR0b25zIiwidG9vbEJ1dHRvbnMiLCJlbmFibGVSdWxlcyIsInNldFZhbHVlRGVib3VuY2VkIiwib25VcGRhdGUiLCJFZGl0b3IiLCJnZXRQb2ludCIsIngiLCJ5IiwicHJldlkiLCJtb3VzZW1vdmUiLCJkaWFsb2dDb21wb25lbnQiLCJnZXRNYXJrQXR0cmlidXRlcyIsImhyZWYiLCJtYXJrcyIsIm5vZGVzIiwidG9vbHMiLCJEb2N1bWVudCIsIlRleHQiLCJQYXJhZ3JhcGgiLCJCb2xkIiwiSXRhbGljIiwiVW5kZXJsaW5lIiwiU3RyaWtlIiwiU21hbGwiLCJDb2RlIiwiTGlua1dpdGhUaXRsZSIsIkJsb2NrcXVvdGUiLCJDb2RlQmxvY2siLCJIYXJkQnJlYWsiLCJIZWFkaW5nIiwiSG9yaXpvbnRhbFJ1bGUiLCJMaXN0SXRlbSIsIkJ1bGxldExpc3QiLCJPcmRlcmVkTGlzdCIsIkhpc3RvcnkiLCJleHRlbnNpb24iLCJzZXR0aW5nc05hbWUiLCJkZXNjcmlwdGlvbnMiLCJhZGRCdXR0b24iLCJpY29uIiwiaWdub3JlQWN0aXZlIiwiZGVzY3JpcHRpb24iLCJzZXR0aW5nTmFtZSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJNYXJrIiwiY29tbWFuZHMiLCJMaW5rIiwibm9kZSIsIl9jb21wb25lbnRfVnVlTXVsdGlzZWxlY3QiLCJWdWVNdWx0aXNlbGVjdCIsInBsYWNlaG9sZGVyIiwic2VhcmNoYWJsZSIsInRhZ2dhYmxlIiwidGFnIiwiTnVtYmVyTWl4aW4iLCJTd2l0Y2hCdXR0b24iLCJtYXNrZWRQYXNzd29yZCIsImhhc0VkaXRhYmxlRm9ybXMiLCJmb3JtYXRGaWxlU2l6ZSIsImZpbGVzaXplIiwiVnVlVXBsb2FkIiwiYXNGaWxlcyIsImFjY2VwdCIsIm1heFNpemUiLCJwYXJzZUZpbGVTaXplIiwiZmlsZSIsIm5ld0ZpbGUiLCJvbGRGaWxlIiwieGhyIiwiZmlsZXMiLCJ1cGxvYWQiLCJsb2dnZWREZXByZWNhdGlvbnMiLCJkZXByZWNhdGUiLCJEaXRvQWRtaW4iLCJkaXRvIiwidmlld3MiLCJnZXRBcGlVcmwiLCJpc0FwaVVybCIsInZhbCIsInVzZXJzIiwicGFyZW50UGF0aCIsImFwcCIsImNyZWF0ZUFwcCIsIkRpdG9Sb290IiwiVnVlTm90aWZpY2F0aW9ucyIsImNyZWF0ZVJvdXRlciIsImNyZWF0ZVdlYkhpc3RvcnkiLCJSZXF1ZXN0RXJyb3IiLCJoZWFkZXJzIiwiaXNBYnNvbHV0ZVVybCIsImNvbWJpbmVVcmxzIiwiZm9ybWF0UXVlcnkiLCJiYXNlVXJsIiwicmVsYXRpdmVVcmwiXSwibWFwcGluZ3MiOiJtcEdBRUEsTUFBQUEs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
5
+ `))}const{$schema:o,...s}=t||{};return o===((c=this.schemaComponent)==null?void 0:c.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),za=b(qa,[["render",Ia]]),Nt={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Ot={mixins:[Oe,Nt],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return ot(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const r={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,r);const i={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(i);a(null,l)}catch(l){const{response:c}=l;if(!a(l,c)){const h=c==null?void 0:c.data,u=d.isString(h==null?void 0:h.type)?d.labelize(h.type):"Error",p=(h==null?void 0:h.message)??l;this.notify({type:"error",title:u,text:p})}}this.setLoading(!1,r)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:r,onError:i,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:c=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(u,p)=>{const g=p==null?void 0:p.data;if(u){const f=this.isValidationError(p)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=d.isObject(g)?g:u;i==null||i(m),await this.emitButtonEvent(e,"error",{notify:c,error:m})}h(!1)}else a&&g&&this.setData(g),r==null||r(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),r=await e.emitEvent(t,{context:a});return o&&r===void 0&&!a.wasNotified&&o(s),r}}};function Aa(e){return new URL(`file:${e}`).pathname}const Ua=["data-resource"],Ha={type:"submit",disabled:""};function Wa(e,t,o,s,a,r){const i=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),c=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(i,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(c,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ha,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,Ua)}const Ka=C.component("DitoForm",{mixins:[ft,Ot],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return re(d.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return Ce(this.itemId,e)||e},breadcrumbPrefix(){return d.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=d.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];G(this.sourceSchema)&&a==="create"&&t.length--;for(let r=0,i=t.length;r<i&&e;r++){const l=t[r],c=/^:id/.test(s[r])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;r===i-1?this.sourceKey=c:e=e[c]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=d.clone(e)),e===null&&!this.isCreating&&G(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return G(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),r=a||this.resource,i=(r==null?void 0:r.method)||this.method,l=this.getPayloadData(e,i);let c;if(!a&&this.isTransient?c=await this.submitTransient(e,r,i,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${d.capitalize(h)}`:`Change ${d.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):c=await this.submitResource(e,r,i,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${d.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const u=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${u} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),c){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:Aa(`${this.path}/../${h}`)})}}return c},async submitTransient(e,t,o,s,{onSuccess:a,onError:r,notifySuccess:i,notifyError:l}){const c=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(c)a==null||a(),await this.emitButtonEvent(e,"success",{notify:i});else{const h="Could not submit transient item";r==null||r(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return c}}}),Lt=b(Ka,[["render",Wa]]),wd="",Ya=C.component("DitoFormNested",{extends:Lt}),Ja={key:0,class:"dito-errors"};function Qa(e,t,o,s,a,r){return e.errors?(n.openBlock(),n.createElementBlock("div",Ja,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,i=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(i),1))),256))])])):n.createCommentVNode("",!0)}const Vd="",Ga=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Xa=b(Ga,[["render",Qa]]),Za={class:"dito-scopes"},va=["title","onClick"];function xa(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Za,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,c)=>(n.openBlock(),n.createBlock(i,{key:c,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,va)]),_:2},1032,["to"]))),128))])}const Sd="",er=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),tr=b(er,[["render",xa]]);function nr(e,t,o,s,a,r){const i=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(i,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const or=C.component("DitoPagination",{components:{Pagination:es},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),sr=b(or,[["render",nr]]);var ar=Object.defineProperty,de=Object.getOwnPropertySymbols,Ft=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,_t=(e,t,o)=>t in e?ar(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,jt=(e,t)=>{for(var o in t||(t={}))Ft.call(t,o)&&_t(e,o,t[o]);if(de)for(var o of de(t))Tt.call(t,o)&&_t(e,o,t[o]);return e},rr=(e,t)=>{var o={};for(var s in e)Ft.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&de)for(var s of de(e))t.indexOf(s)<0&&Tt.call(e,s)&&(o[s]=e[s]);return o};function ir(e,t,o={}){let s;const a=o,{document:r=I.defaultDocument}=a,i=rr(a,["document"]),l={onUpdate:u=>{lr(t,u.oldIndex,u.newIndex)}},c=()=>{const u=typeof e=="string"?r==null?void 0:r.querySelector(e):I.unrefElement(e);u&&(s=new Wt(u,jt(jt({},l),i)))},h=()=>s==null?void 0:s.destroy();return I.tryOnMounted(c),I.tryOnScopeDispose(h),{stop:h,start:c}}function lr(e,t,o){const s=I.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];F.nextTick(()=>s.splice(o,0,a))}}const Le={mixins:[Oe],components:{UseSortable:F.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=I.useVModel(e,"modelValue"),s=F.ref(),a=F.reactive(ir(s,o,e.options));return()=>{if(t.default)return F.h(e.tag,{ref:s},t.default(a))}}})},data(){return{dragging:!1}},methods:{getSortableOptions(e,t=!1){return{animation:150,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:t,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let r=0;r<t.length;r++)t[r][s]=r+a}return t}}},cr=["id"],dr={key:0,class:"dito-tree-header"},hr=["innerHTML"],ur={key:1,class:"dito-tree-info"},pr={key:1,class:"dito-tree-leaf"},mr=["innerHTML"],fr={key:2,class:"dito-buttons dito-buttons-small"},gr={key:1,class:"dito-properties"};function br(e,t,o,s,a,r){const i=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),c=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("UseSortable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",dr,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(u=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,hr),e.details?(n.openBlock(),n.createElementBlock("div",ur,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",pr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,mr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",fr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...u)=>e.onEdit&&e.onEdit(...u))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...u)=>e.onDelete&&e.onDelete(...u))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",gr,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,u=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[u.label!==!1?(n.openBlock(),n.createBlock(i,{key:0,dataPath:e.getPropertyDataPath(u),label:e.getLabel(u)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:u,schema:u,dataPath:e.getPropertyDataPath(u),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(e.childrenDraggable,!0),"onUpdate:modelValue":t[3]||(t[3]=u=>e.childrenList=u)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(u,p)=>(n.openBlock(),n.createBlock(c,{key:e.getItemUid(e.childrenSchema,u.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,p),data:u.data,path:u.path,open:u.open,active:u.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,u.data,{index:p}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,cr)}const Ed="",yr=C.component("DitoTreeItem",{mixins:[Le],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return U(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,r)=>{const i=e.path&&`${this.path}/${e.path}/${r}`,l=s||o.startsWith(i)&&i.length<o.length;return{data:a,path:i,open:l,active:o===i}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return L(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),kr=b(yr,[["render",br]]),Cr={class:"dito-table-head"},$r=["onClick"],Br=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),Dr={key:1},wr={key:0},Vr=[n.createElementVNode("span",null,null,-1)];function Sr(e,t,o,s,a,r){const i=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",Cr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(i,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:c})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:c},[Br,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,$r)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",Dr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",wr,Vr)):n.createCommentVNode("",!0)])])}const Od="",Pr=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${d.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),Er=b(Pr,[["render",Sr]]),Nr=["innerHTML"];function Or(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,Nr))],6)}const Lr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:L(this.dataPath,t)})):d.escapeHtml(s)}}}),Fr=b(Lr,[["render",Or]]);function Mt({vnode:e}){return e}Mt.props={vnode:{type:Object,required:!0}};const Tr=C.component("DitoVnode",Mt),_r=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:js,DitoButtons:wa,DitoClipboard:za,DitoContainer:ra,DitoCreateButton:_a,DitoDialog:wt,DitoEditButtons:Pa,DitoElement:Is,DitoErrors:Xa,DitoForm:Lt,DitoFormNested:Ya,DitoHeader:Os,DitoLabel:Us,DitoMenu:Ds,DitoPagination:sr,DitoPane:na,DitoPanel:ma,DitoPanels:ya,DitoRoot:Ne,DitoSchema:Js,DitoSchemaInlined:Xs,DitoScopes:tr,DitoTableCell:Fr,DitoTableHead:Er,DitoTabs:da,DitoTreeItem:kr,DitoVNode:Tr,DitoView:gt},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[K],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,omitPadding:!1,component:C.component,get:te,register(e,t={}){e=d.asArray(e);const o=this.component(`DitoType${d.camelize(e[0],!0)}`,t);for(const s of e)_n(s,o);return o}},jr=["id","type","title"];function Mr(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",`dito-button-${e.verb}`],id:e.dataPath,ref:"element",type:e.type,title:e.text},e.attributes),n.toDisplayString(e.text),17,jr)}const Rr=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]||this.name},text:y("text",{type:String,get(e){return e||d.labelize(this.verb)}}),closeForm:y("closeForm",{type:Boolean,default:!1}),events(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}}},methods:{async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&qe(this.schema)&&await this.submit()}}}),Ir=b(Rr,[["render",Mr]]),qr=["id"];function zr(e,t,o,s,a,r){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=i=>e.value=i),type:"checkbox"},e.attributes),null,16,qr)),[[n.vModelCheckbox,e.value]])}const Ld="",Ar=D.register("checkbox",{nativeField:!0}),Ur=b(Ar,[["render",zr]]),Rt={mixins:[Nt],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,c;d.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:r=null}=e;const i=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((c=i.dependencyFunction)==null||c.call(this,this.context),i.resolveCounter>0){const{resolvedData:h}=i;return--i.resolveCounter===0&&(i.resolvedData=null),h}if(i.resolving)a=null;else if(a){if(d.isFunction(a)){const h=a.call(this,this.context);d.isFunction(h)?(i.dependencyFunction=a,a=h.call(this,this.context)):a=h}d.isPromise(a)&&(i.resolving=!0,this.resolveData(a,s).then(h=>{i.resolveCounter=o,i.resolvedData=h,i.resolving=!1}),a=null)}else r&&(a=d.getValueAtDataPath(this.rootData,d.normalizeDataPath(`${this.dataPath}/${r}`)));return a},async resolveData(e,t={}){this.setLoading(!0,t);let o=null;try{o=await(d.isFunction(e)?e():e)}catch(s){this.addError(s.message||s)}return this.setLoading(!1,t),o}}},he={mixins:[Rt],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=d.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||Bn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=d.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!d.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=d.isFunction(e)?{filter:e}:e;return o?d.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return d.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||$n(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let r=t[a];return r||(r=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(r)),r.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const r of o)if(a){const i=t(r.options,s,null);if(i)return i}else if(s===this.getValueForOption(r))return r};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return d.isString(t)?e==null?void 0:e[t]:d.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return d.isString(t)?e==null?void 0:e[t]:d.isFunction(t)?t.call(this,new V(this,{option:e})):d.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const r=(a=e.options)==null?void 0:a.dataPath,i=r?d.normalizeDataPath(`${o}/${r}`):null;s.addRelation(o,i,e),i&&s.setSourceRelated(i);const l=c=>c&&{id:c.id};t=d.isArray(t)?t.map(l):l(t)}return t}},Hr=["id"],Wr=["value"];function Kr(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,i=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(i)},e.attributes),null,16,Wr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(i)),1)])]))),256))],10,Hr)}const Fd="",Yr=D.register("checkboxes",{mixins:[he],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Jr=b(Yr,[["render",Kr]]),Qr=["id"];function Gr(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,Qr)}const Td="",Xr=D.register("code",{mixins:[v],computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Kt(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},r=()=>this.onFocus(),i=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:r,blur:i});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},c=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:c(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),Zr=b(Xr,[["render",Gr]]),vr=["id"],xr={key:0,class:"dito-color-preview dito-inherit-focus"},ei=["disabled"];function ti(e,t,o,s,a,r){const i=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=c=>e.showPopup=c),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=c=>e.hexValue=c),type:"input",size:"8"},e.attributes),null,16,vr),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",xr,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...c)=>e.clear&&e.clear(...c),["stop"]))},null,8,ei)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(i,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=c=>e.colorValue=c),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const _d="",ni=D.register("color",{components:{Trigger:Ee,SketchPicker:Yt.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=ue(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=ue(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=ue(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),oi=b(ni,[["render",ti]]);function si(e,t,o,s,a,r){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const ai=D.register("component",{defaultValue:()=>{},ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await se(t)}}),ri=b(ai,[["render",si]]),ii=["id","name","value","disabled"];function li(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,ii)}const ci=D.register(["computed","data","hidden"],{mixins:[Rt],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return K.computed.value.get.call(this)},set(e){K.computed.value.set.call(this,e)}}}}),di=b(ci,[["render",li]]),hi={class:"dito-date"};function ui(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",hi,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=i=>e.dateValue=i),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const pi=D.register(["date","datetime","time"],{components:{DatePicker:kt,TimePicker:$t,DateTimePicker:Ko},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return d.isDate(t)?t.toISOString():t}}),mi=b(pi,[["render",ui]]),W={mixins:[Ot,pt],defaultValue(e){return X(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,unwrappingPrimitives:!1,ignoreRouteChange:!1}},computed:{sourceComponent(){return this},isObjectSource(){return G(this.type)},isListSource(){return X(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:$e("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},d.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:$e("total"),columns(){return U(this.schema.columns)},scopes(){return U(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=d.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(Q(this.schema,this.context))},view(){return Ze(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return re(this.schema.buttons)},hasLabels(){return this.forms.some(Gn)},isCompact(){return this.forms.every(xe)},isInlined(){return Ve(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&q(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&d.isArray(e)||this.isObjectSource&&d.isObject(e)?this.value=e:this.unwrapListData(e)||d.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&d.isObject(e)&&d.isNumber(e.total)&&d.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),r=Ce(a,this.resource);r&&this.handleRequest({method:"delete",resource:r},i=>{i||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?d.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&d.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const r=s.getComponentsByDataPath(e);if(r.length>0&&((t==null?void 0:t(r))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:i}=this.appState,l=i[i.length-1];o((t==null?void 0:t([l]))??!0)},r=d.parseDataPath(e);for(;r.length>0;){const i=this.routeComponent.getChildPath(this.api.normalizePath(d.normalizeDataPath(r))),{matched:l}=this.$router.match(i);l.length&&(this.$route.path===i?a():this.$router.push({path:i}).catch(s).then(()=>{this.$nextTick(a)})),r.pop()}o(!1)})}},async processSchema(e,t,o,s,a,r=!1,i=!1,l=null){Je(e,t,o);const c=Ve(t);if(c&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,u={api:e,schema:t},p={...u,flatten:i,nested:r,param:h},g=await Un(e,t,a);if(l&&await l(g,a+1),q(t)&&!c){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,X(t)&&h),component:C.component(r?"DitoFormNested":"DitoForm"),meta:p};G(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:u});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:i}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Fe={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",options:d.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,width:"40%"}:null,text:{type:"text",width:e.operators?"60%":"fill"}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"50%",dateFormat:e},to:{type:"datetime",width:"50%",dateFormat:e}}}};function fi(e,t,o){const s={type:"panel",label:"Filters",name:"$filters",target:t,disabled:!1,data(){return yi(s,o.query)},components:gi(e),buttons:{clear:{text:"Clear",events:{click({schemaComponent:a}){a.resetData(),a.applyFilters()}}},filter:{type:"submit",text:"Filter",events:{click({schemaComponent:a}){a.applyFilters()}}}},methods:{applyFilters(){o.query={...o.query,filter:bi(this.schema,this.data),page:void 0}}}};return s}function gi(e){var o;const t={};for(const s of Object.values(e||{})){const{filter:a,...r}=s,i=a?(o=Fe[a])==null?void 0:o.call(Fe,s):s.components;if(i){r.type="form",r.components={};for(const[l,c]of Object.entries(i))if(c){const h=c.label||d.labelize(c.name||l);r.components[l]={...c,label:!1,placeholder:h}}t[s.name]={label:r.label,type:"object",default:()=>({}),form:r,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function It(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function bi(e,t){const o=[];for(const s in t){const a=t[s];if(a){const r=Object.keys(It(e,s)).map(i=>a[i]??null);r.some(i=>i!==null)&&o.push(`${s}:${r.map(JSON.stringify).join(",")}`)}}return o.length?o:void 0}function yi(e,t){const o={};if(t)for(const a of d.asArray(t.filter)){const[,r,i]=a.match(/^(\w+):(.*)$/);try{o[r]=d.asArray(JSON.parse(`[${i}]`))}catch{}}const s={};for(const a in e.components){const r={},i=o[a];if(i){const l=It(e,a);if(l){let c=0;for(const h in l)r[h]=i[c++]}}s[a]=r}return s}const ki=["id"],Ci={key:0,class:"dito-navigation"},$i={key:1,class:"dito-spacer"},Bi=["id"],Di={key:1},wi=["innerHTML"],Vi=["innerHTML"],Si={key:2,class:"dito-cell-edit-buttons"},Pi={key:1},Ei=["colspan"];function Ni(e,t,o,s,a,r){const i=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),c=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),u=n.resolveComponent("DitoSchemaInlined"),p=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("UseSortable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",Ci,[e.scopes?(n.openBlock(),n.createBlock(i,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",$i)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(c,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(e.draggable),"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",Di,[e.isInlined?(n.openBlock(),n.createBlock(u,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,wi)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,Vi))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",Si,[n.createVNode(p,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,Bi))),128))]),_:1},8,["modelValue","options"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Pi,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(p,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,Ei)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,ki)):n.createCommentVNode("",!0)}const jd="",Oi=D.register("list",{mixins:[W,Le],getSourceType(e){return e},getPanelSchema(e,t,o){const{filters:s}=e;if(s){const a=()=>o.getComponentByDataPath(t,r=>r.type==="list");return fi(U(s),t,{get query(){var r;return(r=a())==null?void 0:r.query},set query(r){const i=a();if(i){const l=c=>d.pickBy(c,h=>h!==void 0);d.equals(l(r),l(i.query))||(i.query=r,i.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return L(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=Yn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${d.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=L(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,r=!1,i=!1,l=null){await Promise.all([se(t),Ye(t.columns),W.processSchema(e,t,o,s,a,r,i,l)])}}),Li=b(Oi,[["render",Ni]]);function Fi(e,t,o,s,a,r){const i=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(i,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const Md="",Ti=D.register("label",{excludeValue:!0,generateLabel:!1}),_i=b(Ti,[["render",Fi]]),ji=["id"],Mi=["editor"],Ri={key:0,class:"dito-buttons dito-buttons-toolbar"},Ii={class:"dito-button-group"},qi=["onClick"];function zi(e,t,o,s,a,r){const i=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",Ri,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,c=>(n.openBlock(),n.createElementBlock("div",Ii,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(c,({name:h,icon:u,isActive:p,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":p}]),key:h,onClick:g},[n.createVNode(i,{name:u},null,8,["name"])],10,qi))),128))]))),256))])):n.createCommentVNode("",!0)],8,Mi),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...c)=>e.onDragResize&&e.onDragResize(...c),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,ji)}const Rd="",Ai=D.register("markup",{mixins:[v],components:{EditorContent:x.EditorContent,Icon:Jo},data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return d.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},r=d.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),i=({editor:l})=>{r(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new x.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:i,extensions:this.getExtensions(),content:this.value||""})},beforeUnmount(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:i,clientY:l})=>({x:i,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=i=>{const{y:l}=t(i);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},r=this.domOn(document,{mousemove:a,mouseup(i){a(i),r.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:x.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Jt.Document,Qt.Text,an.Paragraph,e.bold&&Gt.Bold,e.italic&&Zt.Italic,e.underline&&en.Underline,e.strike&&xt.Strike,e.small&&Ui,e.code&&Xt.Code,e.link&&Hi,t.blockquote&&tn.Blockquote,t.codeBlock&&nn.CodeBlock,on.HardBreak,t.heading&&sn.Heading.configure({levels:t.heading}),t.horizontalRule&&rn.HorizontalRule,(t.orderedList||t.bulletList)&&dn.ListItem,t.bulletList&&cn.BulletList,t.orderedList&&ln.OrderedList,o.history&&hn.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:r,icon:i,attributes:l,ignoreActive:c,onClick:h})=>{o.push({name:r,icon:i,isActive:this.editor.isActive(r,l)&&(c==null||!c()),onClick:()=>{const u=`toggle${d.camelize(r,!0)}`;this.editor.commands[u]&&(h?h(this.editor,l):(g=>this.editor.chain()[u](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[r,i]of Object.entries(t)){const l=["undo","redo"].includes(r)?"history":r,c=a[l],h=d.underscore(r),u=d.hyphenate(r);if(c){if(i===!0)s({name:h,icon:u});else if(d.isObject(i)){const{attribute:p,values:g,ignoreActive:f,onClick:m}=i;if(p){if(d.isArray(g)&&d.isArray(c))for(const k of g)c.includes(k)&&s({name:h,icon:`${u}-${k}`,attributes:{[p]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:u,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),Ui=x.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Hi=vt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Wi=b(Ai,[["render",zi]]),Ki=["disabled"];function Yi(e,t,o,s,a,r){const i=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(i,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),class:{"multiselect--show-highlight":e.showHighlight},showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Ki)):n.createCommentVNode("",!0)],2)}const Id="",Ji=D.register("multiselect",{mixins:[he],components:{VueMultiselect:un},data(){return{isMounted:!1,searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return d.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.isMounted=!0,this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||K.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),Qi=b(Ji,[["render",Yi]]),Te={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){d.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:r}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(r){const i=(`${r}`.split(".")[1]||"").length;i>0?e.decimals=i:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}};function Gi(e,t,o,s,a,r){const i=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(i,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["id","modelValue","min","max","step"])}const qd="",Xi=D.register(["number","integer"],{mixins:[Te],components:{InputField:Z},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),Zi=b(Xi,[["render",Gi]]),vi=["id"],xi={key:0,class:"dito-object-content"},el=["innerHTML"],tl=["innerHTML"];function nl(e,t,o,s,a,r){const i=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",xi,[e.isInlined?(n.openBlock(),n.createBlock(i,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,el)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,tl))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=c=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,vi)):n.createCommentVNode("",!0)}const zd="",ol=D.register("object",{mixins:[W],getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,r=!1,i=!1,l=null){await Promise.all([se(t),W.processSchema(e,t,o,s,a,r,i,l)])}}),sl=b(ol,[["render",nl]]),al=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,omitPadding:!0,getPanelSchema(e){const{name:t,...o}=e;return o}}),rl=["id","value","max"];function il(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,rl)}const ll=D.register("progress",{mixins:[Te],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),cl=b(ll,[["render",il]]),dl=["id"],hl=["value"];function ul(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,i=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(i)},e.attributes),null,16,hl),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(i)),1)])]))),256))],10,dl)}const Ad="",pl=D.register("radio",{mixins:[he],nativeField:!0}),ml=b(pl,[["render",ul]]);function fl(e,t,o,s,a,r){const i=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(i,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const Ud="",gl=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,omitFlexGrow:!0,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:we},async processSchema(e,t,o,s,a){await Y(e,t,s,a)}}),bl=b(gl,[["render",fl]]),yl={class:"dito-select"},kl=["id"],Cl=["label"],$l=["value"],Bl=["value"],Dl=["value"],wl=["disabled"];function Vl(e,t,o,s,a,r){return n.openBlock(),n.createElementBlock("div",yl,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=i=>e.selectedValue=i)},e.attributes,{onMousedown:t[1]||(t[1]=i=>e.populate=!0),onFocus:t[2]||(t[2]=i=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,i=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:i[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,$l))),256))],8,Cl)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(i)},n.toDisplayString(e.getLabelForOption(i)),9,Bl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,Dl)):n.createCommentVNode("",!0)],16,kl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...i)=>e.clear&&e.clear(...i))},null,8,wl)):n.createCommentVNode("",!0)])}const Hd="",Sl=D.register("select",{mixins:[he],nativeField:!0,data(){return{populate:!0}}}),Pl=b(Sl,[["render",Vl]]),El={class:"dito-slider"},Nl=["id","min","max","step"];function Ol(e,t,o,s,a,r){const i=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",El,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,Nl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(i,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Wd="",Ll=D.register("slider",{mixins:[Te],components:{InputField:Z},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),Fl=b(Ll,[["render",Ol]]);function Tl(e,t,o,s,a,r){const i=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(i,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Kd="",_l=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:rs},computed:{labels(){return this.schema.labels}}}),jl=b(_l,[["render",Tl]]);function Ml(e,t,o,s,a,r){const i=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(i,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:e.inputType},e.attributes),null,16,["id","modelValue","type"])}const Rl="****************",Il=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:Z},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?Rl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),ql=b(Il,[["render",Ml]]),zl=["id","rows"];function Al(e,t,o,s,a,r){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=i=>e.value=i)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,zl)),[[n.vModelText,e.value]])}const Yd="",Ul=D.register("textarea",{nativeField:!0,textField:!0,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Hl=b(Ul,[["render",Al]]),Wl={class:"dito-tree-list"},Kl={class:"dito-tree-panel"},Yl={key:0,class:"dito-tree-form-container"};function Jl(e,t,o,s,a,r){const i=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),c=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Wl,[e.scopes?(n.openBlock(),n.createBlock(i,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Kl,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",Yl,[n.createVNode(c)])):n.createCommentVNode("",!0)])])}const Jd="",Ql=D.register(["tree-list","tree-object"],{mixins:[W],provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>q(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,r=!0,i=!1,l=null){await Promise.all([Ye(t.properties),W.processSchema(e,t,o,s,a,r,i,(c,h)=>{const{children:u}=t;if(u)return u.type="tree-list",this.processSchema(e,u,u.name,c,h,r,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return Q(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),Gl=b(Ql,[["render",Jl]]);function qt(e){return mn.filesize(e,{base:10})}const Xl={class:"dito-upload"},Zl={class:"dito-table dito-table-separators dito-table-background"},vl=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),xl=["innerHTML"],ec={class:"dito-cell-edit-buttons"},tc={class:"dito-buttons dito-buttons-round"},nc=["onClick"],oc={colspan:4},sc={class:"dito-upload-footer"},ac=["value"],rc={class:"dito-buttons dito-buttons-round"};function ic(e,t,o,s,a,r){const i=n.resolveComponent("UseSortable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",Xl,[n.createElementVNode("table",Zl,[vl,n.createVNode(i,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=c=>e.files=c),tag:"tbody",options:e.getSortableOptions(e.draggable)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(c,h)=>(n.openBlock(),n.createElementBlock("tr",{key:c.key},[n.createElementVNode("td",{innerHTML:e.renderFile(c,h)},null,8,xl),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(c.size)),1),n.createElementVNode("td",null,[c.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[c.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(c.upload.error),1)],64)):c.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):c.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",ec,[n.createElementVNode("div",tc,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(c,h)}),null,16,nc)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",oc,[n.createElementVNode("div",sc,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,ac)):n.createCommentVNode("",!0),n.createElementVNode("div",rc,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(c=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(c=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=c=>e.uploads=c),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const Qd="",lc=D.register("upload",{mixins:[Le],components:{VueUpload:fn},data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return zt(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return d.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?pn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:qt,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:L(this.dataPath,t)})):d.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${qt(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=zt(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function zt(e){return e?d.asArray(e):[]}const cc=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:ri,DitoTypeButton:Ir,DitoTypeCheckbox:Ur,DitoTypeCheckboxes:Jr,DitoTypeCode:Zr,DitoTypeColor:oi,DitoTypeComputed:di,DitoTypeDate:mi,DitoTypeLabel:_i,DitoTypeList:Li,DitoTypeMarkup:Wi,DitoTypeMultiselect:Qi,DitoTypeNumber:Zi,DitoTypeObject:sl,DitoTypePanel:al,DitoTypeProgress:cl,DitoTypeRadio:ml,DitoTypeSection:bl,DitoTypeSelect:Pl,DitoTypeSlider:Fl,DitoTypeSwitch:jl,DitoTypeText:ql,DitoTypeTextarea:Hl,DitoTypeTreeList:Gl,DitoTypeUpload:b(lc,[["render",ic]])},Symbol.toStringTag,{value:"Module"})),At=new Set;function dc(e){At.has(e)||(At.add(e),console.warn(e))}const hc=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","close","closed","cancel","cancelled","drag","dragged"].reduce((e,t)=>(e[t]=t,e),{});class uc{constructor(t,{dito:o={},api:s,views:a={},...r}={}){this.el=t,this.api=s=d.merge({base:"/"},o.api,s),this.options=r,s.locale||(s.locale="en-US"),s.formats=d.merge({},d.defaultFormats,s.formats),s.request||(s.request=c=>mc(s,c)),s.getApiUrl||(s.getApiUrl=c=>gc(s,c)),s.isApiUrl||(s.isApiUrl=c=>fc(s,c)),s.normalizePath||(s.normalizePath=s.normalizePaths?d.hyphenate:c=>c),s.denormalizePath||(s.denormalizePath=s.normalizePaths?d.camelize:c=>c),s.defaults||(s.defaults={});const i=T(s.users,{type:"collection"})||{};i.login=T(i.login||"login",{method:"post",parent:i}),i.logout=T(i.logout||"logout",{method:"post",parent:i}),i.session=T(i.session||"session",{method:"get",parent:i}),s.users=i,s.resources={any(c){const h=this[c==null?void 0:c.type]||this.default;return c&&h.call(this,c)},default(c){const h=this.any(c.parent);return h?`${h}/${c.path}`:c.path},collection(c){return this.default(c)},member(c){return`${c.path}/${c.id}`},upload(c){return`${this.collection(c.parent)}/upload/${c.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},d.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Ne,VueNotifications:R,..._r,...cc},provide:{api:s,$verbs:()=>hc,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Ne,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:r})});l.use(R,{name:"notify",componentName:"VueNotifications"}),l.use(O.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:O.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class pc extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function mc(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:r=null,data:i=null}){var h,u;s&&dc("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),c=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...i&&{body:JSON.stringify(i)},headers:{...l&&e.headers,...r},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((u=c.headers.get("Content-Type"))!=null&&u.includes("application/json")&&(c.data=await c.json()),!c.ok)throw new pc(c);return c}function fc(e,t){return!d.isAbsoluteUrl(t)||t.startsWith(e.url)}function gc(e,{url:t,query:o}){d.isAbsoluteUrl(t)||(t=bc(e.url,t));const s=yc(o);return s?`${t}?${s}`:t}function bc(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}function yc(e){const t=e?d.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const r of d.asArray(a))o.push([s,r]);return o},[])).toString()}return uc});
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZXVzZS9pbnRlZ3JhdGlvbnMvdXNlU29ydGFibGUvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9taXhpbnMvU29ydGFibGVNaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UcmVlSXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVIZWFkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9UYWJsZUNlbGwudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1ZOb2RlLnZ1ZSIsIi4uL3NyYy9EaXRvVHlwZUNvbXBvbmVudC5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUJ1dHRvbi52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveC52dWUiLCIuLi9zcmMvbWl4aW5zL0RhdGFNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvT3B0aW9uc01peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ2hlY2tib3hlcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb2RlLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbG9yLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXBvbmVudC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDb21wdXRlZC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVEYXRlLnZ1ZSIsIi4uL3NyYy9taXhpbnMvU291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvZmlsdGVyLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTGlzdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMYWJlbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNYXJrdXAudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTXVsdGlzZWxlY3QudnVlIiwiLi4vc3JjL21peGlucy9OdW1iZXJNaXhpbi5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU51bWJlci52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVPYmplY3QudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUGFuZWwudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUHJvZ3Jlc3MudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlUmFkaW8udnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU2VjdGlvbi52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWxlY3QudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU2xpZGVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVN3aXRjaC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVUZXh0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHRhcmVhLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRyZWVMaXN0LnZ1ZSIsIi4uL3NyYy91dGlscy91bml0cy5qcyIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVVwbG9hZC52dWUiLCIuLi9zcmMvdXRpbHMvZGVwcmVjYXRlLmpzIiwiLi4vc3JjL3ZlcmJzLmpzIiwiLi4vc3JjL0RpdG9BZG1pbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGRlZmF1bHQgcmVhY3RpdmUoe1xuICB0aXRsZTogJycsXG4gIHJvdXRlQ29tcG9uZW50czogW10sXG4gIHVzZXI6IG51bGwsXG4gIGxvYWRDYWNoZToge30sIC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gIGFjdGl2ZUxhYmVsOiBudWxsLFxuICBjbGlwYm9hcmREYXRhOiBudWxsXG59KVxuIiwiaW1wb3J0IHtcbiAgaXNJbnRlZ2VyLFxuICBwYXJzZURhdGFQYXRoLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pIHtcbiAgcmV0dXJuIGRhdGFQYXRoXG4gICAgPyBgJHtkYXRhUGF0aH0vJHt0b2tlbn1gXG4gICAgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcGF0aD8ucG9wKClcbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbmVzdGVkID8gcGFyc2VQYXJlbnREYXRhUGF0aChkYXRhUGF0aCkgOiBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgocGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlSXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIGlmIChwYXRoKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJlbnQgdG9rZW4uIElmIGl0J3MgYSBudW1iZXIsIHRoZW4gd2UncmUgZGVhbGluZyB3aXRoIGFuXG4gICAgLy8gYXJyYXkgYW5kIG5lZWQgdG8gcmVtb3ZlIG1vcmUgdG9rZW5zIHVudGlsIHdlIG1lZXQgdGhlIGFjdHVhbCBwYXJlbnQ6XG4gICAgbGV0IHRva2VuXG4gICAgZG8ge1xuICAgICAgdG9rZW4gPSBwYXRoLnBvcCgpXG4gICAgfSB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiBpc0ludGVnZXIoK3Rva2VuKSlcbiAgICAvLyBJZiB0aGUgcmVtb3ZlZCB0b2tlbiBpcyB2YWxpZCwgd2UgY2FuIGdldCB0aGUgcGFyZW50IGRhdGE6XG4gICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW0ocm9vdEl0ZW0sIGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgcmV0dXJuIHBhdGggPyBnZXRWYWx1ZUF0RGF0YVBhdGgocm9vdEl0ZW0sIHBhdGgpIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZVBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aCkge1xuICBjb25zdCBwYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgcmV0dXJuIHBhdGhbcGF0aC5sZW5ndGggLSAxXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoTmFtZShkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICByZXR1cm4gdG9rZW4gPT0gbnVsbCB8fCBpc0ludGVnZXIoK3Rva2VuKSA/IG51bGwgOiB0b2tlblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdERhdGFQYXRoSW5kZXgoZGF0YVBhdGgpIHtcbiAgY29uc3QgdG9rZW4gPSBnZXRMYXN0RGF0YVBhdGhUb2tlbihkYXRhUGF0aClcbiAgY29uc3QgaW5kZXggPSB0b2tlbiA9PSBudWxsID8gbnVsbCA6ICt0b2tlblxuICByZXR1cm4gaXNJbnRlZ2VyKGluZGV4KSA/IGluZGV4IDogbnVsbFxufVxuXG5sZXQgdGVtcG9yYXJ5SWQgPSAwXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVtcG9yYXJ5SWQoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFRlbXBvcmFyeSBpZHMgYXJlIG1hcmtlZCB3aXRoIGEgJ0AnIGF0IHRoZSBiZWdpbm5pbmcuXG4gIGRhdGFbaWRLZXldID0gYEAkeysrdGVtcG9yYXJ5SWR9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wb3JhcnlJZChpZCkge1xuICByZXR1cm4gL15ALy50ZXN0KGlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2UoZGF0YSwgaWRLZXkgPSAnaWQnKSB7XG4gIC8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbiBvYmplY3QgdGhhdCBob2xkcyBub3RoaW5nIG1vcmUgdGhhbiBhbiBpZC5cbiAgcmV0dXJuIGRhdGE/LltpZEtleV0gIT0gbnVsbCAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDFcbn1cbiIsImltcG9ydCB7IHRvUmF3IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQge1xuICBnZXRJdGVtRGF0YVBhdGgsXG4gIGdldFBhcmVudEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbSxcbiAgZ2V0SXRlbSxcbiAgZ2V0TGFzdERhdGFQYXRoTmFtZSxcbiAgZ2V0TGFzdERhdGFQYXRoSW5kZXhcbn0gZnJvbSAnLi91dGlscy9kYXRhLmpzJ1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlXG5cbi8vIGBEaXRvQ29udGV4dGAgaW5zdGFuY2VzIGFyZSBhIHRoaW4gd3JhcHBlciBhcm91bmQgcmF3IGBjb250ZXh0YCBvYmplY3RzLFxuLy8gd2hpY2ggdGhlbXNlbHZlcyBhY3R1YWxseSBpbmhlcml0IGZyb20gdGhlIGxpbmtlZCBgY29tcG9uZW50YCBpbnN0YW5jZSwgc29cbi8vIHRoYXQgdGhleSBvbmx5IG5lZWQgdG8gcHJvdmlkZSB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGRpZmZlcmVudCB0aGFuXG4vLyBpbiB0aGUgdW5kZXJseWluZyBjb21wb25lbnQuIEluIG9yZGVyIHRvIG5vdCBleHBvc2UgYWxsIGZpZWxkcyBmcm9tIHRoZVxuLy8gY29tcG9uZW50LCB0aGUgd3JhcHBlciBpcyBpbnRyb2R1Y2VkOlxuLy8gVXNlIFdlYWtNYXAgZm9yIHRoZSByYXcgYGNvbnRleHRgIG9iamVjdHMsIHNvIHdlIGRvbid0IGhhdmUgdG8gcG9sbHV0ZSB0aGVcbi8vIGFjdHVhbCBgRGl0b0NvbnRleHRgIGluc3RhbmNlIHdpdGggaXQuXG5jb25zdCBjb250ZXh0cyA9IG5ldyBXZWFrTWFwKClcblxuZnVuY3Rpb24gZ2V0KGNvbnRleHQsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGNvbnN0IG9iamVjdCA9IGNvbnRleHRzLmdldCh0b1Jhdyhjb250ZXh0KSlcbiAgY29uc3QgdmFsdWUgPSBvYmplY3Rba2V5XVxuICAvLyBJZiBgb2JqZWN0YCBleHBsaWNpdGx5IHNldHMgdGhlIGtleSB0byBgdW5kZWZpbmVkYCwgcmV0dXJuIGl0LlxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuICAgID8gdmFsdWVcbiAgICA6IGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKVxuICAgICAgPyBkZWZhdWx0VmFsdWUoKVxuICAgICAgOiBkZWZhdWx0VmFsdWVcbn1cblxuZnVuY3Rpb24gc2V0KGNvbnRleHQsIGtleSwgdmFsdWUpIHtcbiAgY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVtrZXldID0gdmFsdWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0NvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIHBhcmFtcyBvYmplY3QgLyBmdW5jdGlvbiwgb3IgY3JlYXRlIGEgbmV3IG9uZTpcbiAgICBjb250ZXh0ID0gY29udGV4dFxuICAgICAgPyBpc0Z1bmN0aW9uKGNvbnRleHQpXG4gICAgICAgID8gY29udGV4dCgpXG4gICAgICAgIDogeyAuLi5jb250ZXh0IH1cbiAgICAgIDoge31cbiAgICAvLyBJZiBub3QgZXhwbGljaXRseSBzZXQgKHRvIGZhbHNlKSwgZGVmYXVsdCB0byB0cnVlIHNvIHdlIGRvbid0IGZhbGwgYmFja1xuICAgIC8vIHRvIGBjb21wb25lbnRgIGZvciBpdHMgdmFsdWUuXG4gICAgY29udGV4dC5uZXN0ZWQgPz89IHRydWVcbiAgICBjb250ZXh0LmNvbXBvbmVudCA9IGNvbXBvbmVudFxuICAgIC8vIEhhdmUgYG9iamVjdGAgaW5oZXJpdCBmcm9tIHRoZSBgY29tcG9uZW50YCBpbnN0YW5jZSwgc28gaXQgY2FuIG92ZXJyaWRlXG4gICAgLy8gaXRzIHZhbHVlcyBhbmQgc3RpbGwgcmV0cmlldmUgZnJvbSBpdCwgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGB0aGlzYFxuICAgIC8vIHRocm91Z2ggYGNvbnRleHRzYCBtYXA6XG4gICAgY29uc3Qgb2JqZWN0ID0gT2JqZWN0LnNldFByb3RvdHlwZU9mKGNvbnRleHQsIGNvbXBvbmVudClcbiAgICAvLyBObyBuZWVkIGZvciBgdG9SYXcodGhpcylgIGhlcmUgYXMgaXQncyBhbHdheXMgcmF3IGluc2lkZSB0aGUgY29uc3RydWN0b3IuXG4gICAgY29udGV4dHMuc2V0KHRoaXMsIG9iamVjdClcbiAgfVxuXG4gIHN0YXRpYyBnZXQoY29tcG9uZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQgaW5zdGFuY2VvZiBEaXRvQ29udGV4dFxuICAgICAgPyBjb250ZXh0XG4gICAgICA6IG5ldyBEaXRvQ29udGV4dChjb21wb25lbnQsIGNvbnRleHQpXG4gIH1cblxuICAvLyBgbmVzdGVkYCBpcyBgdHJ1ZWAgd2hlbiB0aGUgZGF0YS1wYXRoIHBvaW50cyBhIHZhbHVlIGluc2lkZSBhbiBpdGVtLCBhbmRcbiAgLy8gYGZhbHNlYCB3aGVuIGl0IHBvaW50cyB0byB0aGUgaXRlbSBpdHNlbGYuXG4gIGdldCBuZXN0ZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnbmVzdGVkJywgdHJ1ZSlcbiAgfVxuXG4gIGdldCBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnc2NoZW1hJywgbnVsbClcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICd2YWx1ZScsIHVuZGVmaW5lZClcbiAgfVxuXG4gIGdldCBkYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhUGF0aCcsICcnKVxuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnbmFtZScsICgpID0+IGdldExhc3REYXRhUGF0aE5hbWUodGhpcy5kYXRhUGF0aCkpXG4gIH1cblxuICBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaW5kZXgnLCAoKSA9PiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpdGVtRGF0YVBhdGgoKSB7XG4gICAgcmV0dXJuIGdldEl0ZW1EYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgfVxuXG4gIGdldCBwYXJlbnRJdGVtRGF0YVBhdGgoKSB7XG4gICAgcmV0dXJuIGdldFBhcmVudEl0ZW1EYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZClcbiAgfVxuXG4gIGdldCBpdGVtSW5kZXgoKSB7XG4gICAgcmV0dXJuIGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuaXRlbURhdGFQYXRoKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5wYXJlbnRJdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgaXRlbSgpIHtcbiAgICAvLyBOT1RFOiBXaGlsZSBpbnRlcm5hbGx5LCB3ZSBzcGVhayBvZiBgZGF0YWAsIGluIHRoZSBBUEkgc3VyZmFjZSB0aGVcbiAgICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAgIC8vIElmIGBkYXRhYCBpc24ndCBwcm92aWRlZCwgd2UgY2FuIGRldGVybWluZSBpdCBmcm9tIHJvb3REYXRhICYgZGF0YVBhdGg6XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZGF0YScsICgpID0+XG4gICAgICBnZXRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICAgIClcbiAgfVxuXG4gIC8vIE5PVEU6IGBwYXJlbnRJdGVtYCBpc24ndCB0aGUgY2xvc2VzdCBkYXRhIHBhcmVudCB0byBgaXRlbWAsIGl0J3MgdGhlXG4gIC8vIGNsb3Nlc3QgcGFyZW50IHRoYXQgaXNuJ3QgYW4gYXJyYXksIGUuZy4gZm9yIHJlbGF0aW9ucyBvciBuZXN0ZWQgSlNPTlxuICAvLyBkYXRhLiAgVGhpcyBpcyB3aHkgdGhlIHRlcm0gYGl0ZW1gIHdhcyBjaG9zZW4gb3ZlciBgZGF0YWAsIGUuZy4gVlMgdGhlXG4gIC8vIHVzZSBvZiBgcGFyZW50RGF0YWAgaW4gc2VydmVyLXNpZGVkIHZhbGlkYXRpb24sIHdoaWNoIGlzIHRoZSBjbG9zZXN0XG4gIC8vIHBhcmVudC4gSWYgbmVlZGVkLCB3ZSBjb3VsZCBleHBvc2UgdGhpcyBkYXRhIGhlcmUgdG9vLCBhcyB3ZSBjYW4gZG8gYWxsXG4gIC8vIHNvcnRzIG9mIGRhdGEgcHJvY2Vzc2luZyB3aXRoIGByb290RGF0YWAgYW5kIGBkYXRhUGF0aGAuXG4gIGdldCBwYXJlbnRJdGVtKCkge1xuICAgIGNvbnN0IHBhcmVudEl0ZW0gPSAoXG4gICAgICBnZXRQYXJlbnRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKSB8fFxuICAgICAgbnVsbFxuICAgIClcbiAgICByZXR1cm4gcGFyZW50SXRlbSAhPT0gdGhpcy5pdGVtID8gcGFyZW50SXRlbSA6IG51bGxcbiAgfVxuXG4gIGdldCByb290SXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyb290RGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdwcm9jZXNzZWREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCBjbGlwYm9hcmRJdGVtKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2NsaXBib2FyZERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHVzZXIoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAndXNlcicsIG51bGwpXG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2FwaScsIG51bGwpXG4gIH1cblxuICBnZXQgdmlld3MoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAndmlld3MnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGl0ZW1MYWJlbCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtTGFiZWwnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGZvcm1MYWJlbCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtTGFiZWwnLCBudWxsKVxuICB9XG5cbiAgLy8gTk9URTogTGlrZSAnb3B0aW9ucycsIHRoZSBhc3NvY2lhdGVkIGNvbXBvbmVudCBkb2Vzbid0IGFsd2F5cyBleGlzdCwgZS5nLlxuICAvLyBpbiBuZXN0ZWQgZm9ybXMgZHVyaW5nIGBwcm9jZXNzRGF0YSgpYC4gQnV0IGBzY2hlbWFgIGlzIGd1YXJhbnRlZWQgdG9cbiAgLy8gYWx3YXlzIGJlIGF2YWlsYWJsZS5cbiAgZ2V0IGNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgLy8gVE9ETzogQWRkIGBjb21wb25lbnRTY2hlbWFgIGdldHRlciBmb3IgdGhlIHNjaGVtYSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQsXG4gIC8vIGV2ZW4gd2hlbiB0aGUgY29tcG9uZW50IGlzbid0IGFjdHVhbGx5IGluc3RhbnRpYXRlZC4gQ29uc2lkZXIgYWRkaW5nXG4gIC8vIGBzb3VyY2VTY2hlbWFgIGFzIHdlbGw/XG5cbiAgLy8gVE9ETzogRml4IHVuY2xlYXIgbmFtaW5nOiBXaGljaCBzY2hlbWEgaXMgdGhpcywgdGhhdCBvZiB0aGUgY29tcG9uZW50IG9yIG9mXG4gIC8vIGl0cyBwYXJlbnQ/IElzbid0IGV4cG9zaW5nIGBmb3JtQ29tcG9uZW50YCBhbmQgYHZpZXdDb21wb25lbnRgIGVub3VnaCwgb25jZVxuICAvLyB3ZSBvZmZlciBhY2Nlc3MgdG8gdGhlaXIgY29tcG9uZW50cyB0aGVyZSB0aHJvdWdoIGBnZXRDb21wb25lbnQoKWAgJiBjby4gb25cbiAgLy8gYERpdG9NaXhpbmAgcGVyaGFwcz8gIEFsc28sIHRoZXJlIGNvdWxkIGJlIGEgYHRhYkNvbXBvbmVudGAgZ2V0dGVyIGZvclxuICAvLyBzY2hlbWFzIGluIHRhYnM/XG4gIGdldCBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnc2NoZW1hQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCBmb3JtQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2Zvcm1Db21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAndmlld0NvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZGlhbG9nQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RpYWxvZ0NvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncGFuZWxDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHJlc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3Jlc291cmNlQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnc291cmNlQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFdoZW4gdXNlZCBpbiBPcHRpb25zTWl4aW4gZm9yIGBzY2hlbWEub3B0aW9ucy52YWx1ZSgpYCxcbiAgLy8gYHNjaGVtYS5vcHRpb25zLmxhYmVsKClgIGFuZCAgYHNjaGVtYS5zZWFyY2guZmlsdGVyKClgIGNhbGxiYWNrczpcbiAgZ2V0IG9wdGlvbigpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdvcHRpb24nLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdvcHRpb25zJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVE9ETzogUmVuYW1lIHRoaXMgdG8gYHNlYXJjaFRlcm1gIG9yIGBzZWFyY2hRdWVyeWAsIHRvIHBlcmhhcHMgZnJlZSBgcXVlcnlgXG4gIC8vIGZvciB0aGUgYWN0dWFsIGByZXNvdXJjZUNvbXBvbmVudC5xdWVyeWAgb2JqZWN0P1xuICBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncXVlcnknLCB1bmRlZmluZWQpXG4gIH1cblxuICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgYnV0dG9ucyB0aGF0IHNlbmRcbiAgLy8gcmVxdWVzdHMsIHNlZSBgUmVzb3VyY2VNaXhpbi5lbWl0QnV0dG9uRXZlbnQoKWA6XG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdlcnJvcicsIHVuZGVmaW5lZClcbiAgfVxuXG4gIGdldCB3YXNOb3RpZmllZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICd3YXNOb3RpZmllZCcsIGZhbHNlKVxuICB9XG5cbiAgLy8gSGVscGVyIE1ldGhvZHNcblxuICBnZXQgcmVxdWVzdCgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB0aGlzLmNvbXBvbmVudC5yZXF1ZXN0KG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZm9ybWF0KCkge1xuICAgIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHRoaXMuY29tcG9uZW50LmZvcm1hdCh2YWx1ZSwgb3B0aW9ucylcbiAgfVxuXG4gIGdldCBuYXZpZ2F0ZSgpIHtcbiAgICByZXR1cm4gbG9jYXRpb24gPT4gdGhpcy5jb21wb25lbnQubmF2aWdhdGUobG9jYXRpb24pXG4gIH1cblxuICBnZXQgZG93bmxvYWQoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQuZG93bmxvYWQob3B0aW9ucylcbiAgfVxuXG4gIGdldCBnZXRSZXNvdXJjZVVybCgpIHtcbiAgICByZXR1cm4gcmVzb3VyY2UgPT4gdGhpcy5jb21wb25lbnQuZ2V0UmVzb3VyY2VVcmwocmVzb3VyY2UpXG4gIH1cblxuICBnZXQgbm90aWZ5KCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHtcbiAgICAgIHRoaXMuY29tcG9uZW50Lm5vdGlmeShvcHRpb25zKVxuICAgICAgc2V0KHRoaXMsICd3YXNOb3RpZmllZCcsIHRydWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1BsYWluT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlzdGVuZXJzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBBc3luYyBvbigpIGFuZCAkb2ZmKCkgbWV0aG9kcyB0aGF0IGtlZXAgdHJhY2sgb2YgdGhlIGV2ZW50cyBhZGRlZCAvXG4gICAgLy8gcmVtb3ZlZCwgYW5kIHByb3ZpZGUgYSBoYXNMaXN0ZW5lcnMoKSBtZXRob2QgdGhhdCBjaGVja3MgaWYgdGhlIGNvbXBvbmVudFxuICAgIC8vIGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXG5cbiAgICAvLyBBbHNvIGFkZHMgcHJvcGVyIGhhbmRsaW5nIG9mIGFzeW5jIGV2ZW50cywgaW5jbHVkaW5nIGEgYXN5bmMgZW1pdCgpIHRoYXRcbiAgICAvLyBkZWFscyB3aXRoIHByb3BlciBldmVudCBxdWV1ZWluZy5cbiAgICBvbihldmVudCwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihldiwgY2FsbGJhY2spXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLm9uKGtleSwgZXZlbnRba2V5XSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gKHRoaXMubGlzdGVuZXJzIHx8PSBPYmplY3QuY3JlYXRlKG51bGwpKVxuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gKGxpc3RlbmVyc1tldmVudF0gfHw9IHtcbiAgICAgICAgICBjYWxsYmFja3M6IFtdLFxuICAgICAgICAgIHF1ZXVlOiBbXVxuICAgICAgICB9KVxuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIG9uY2UoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHRoaXMub2ZmKGV2ZW50LCBvbilcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgICB9XG4gICAgICBvbi5jYWxsYmFjayA9IGNhbGxiYWNrIC8vIE5lZWRlZCBmb3IgYG9mZigpYCwgc2VlIGJlbG93LlxuICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnQsIG9uKVxuICAgIH0sXG5cbiAgICBvZmYoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBldmVudHNcbiAgICAgICAgZGVsZXRlIHRoaXMubGlzdGVuZXJzXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXYgb2YgZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLm9mZihldiwgY2FsbGJhY2spXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXZlbnQpIHtcbiAgICAgICAgICB0aGlzLm9mZihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbW92ZSBzcGVjaWZpYyBldmVudFxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMubGlzdGVuZXJzPy5bZXZlbnRdXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnRcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1tldmVudF1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGEgc3BlY2lmaWMgaGFuZGxlcjogZmluZCB0aGUgaW5kZXggaW4gY2FsbGJhY2tzXG4gICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gZW50cnlcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2FsbGJhY2tzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgLy8gTWF0Y2ggYGNiLmNhbGxiYWNrYCBhbHNvLCBhcyB1c2VkIGJ5IGBvbmNlKClgLCBzZWUgIGFib3ZlOlxuICAgICAgICAgICAgICBjYiA9PiBjYiA9PT0gY2FsbGJhY2sgfHwgY2IuY2FsbGJhY2sgPT09IGNhbGxiYWNrXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgICAvLyBPbmx5IHF1ZXVlIGV2ZW50IGlmIHRoZXJlIGFjdHVhbGx5IGFyZSBsaXN0ZW5lcnMgZm9yIGl0LlxuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IHsgcXVldWUsIGNhbGxiYWNrcyB9ID0gZW50cnlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBFbWl0IHRoZSBuZXh0IGV2ZW50IGluIHRoZSBxdWV1ZSB3aXRoIGl0cyBwYXJhbXMuXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQgb25seSBnZXRzIHJlbW92ZWQgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQuXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICBsZXQgcmVzdWx0XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGVudHJ5LmFyZ3MpXG4gICAgICAgICAgICAgICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBFcnJvciBkdXJpbmcgZXZlbnQgaGFuZGxlciBmb3IgJyR7ZXZlbnR9JzpgLFxuICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBxdWV1ZSBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vIHRoYXQgd2FzIGp1c3QgY29tcGxldGVkIGJ5IHRoZSB3cmFwcGVyIHRoYXQgY2FsbGVkIGBuZXh0KClgXG4gICAgICAgICAgICAgIGVudHJ5LnJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWUucHVzaCh7IGFyZ3MsIHJlc29sdmUgfSlcbiAgICAgICAgICAvLyBGb3IgbmV3IHF1ZXVlcyAoPSBvbmx5IG9uZSBlbnRyeSkgZW1pdCB0aGUgZmlyc3QgZXZlbnQgaW1tZWRpYXRlbHksXG4gICAgICAgICAgLy8gdG8gZ2V0IHRoZSBxdWV1ZSBydW5uaW5nLlxuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG5leHQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaGFzIGxpc3RlbmVycyBmb3IgYSBnaXZlbiBldmVudCB0eXBlOlxuICAgIGhhc0xpc3RlbmVycyhldmVudCkge1xuICAgICAgaWYgKGlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZXYgb2YgZXZlbnQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJzKGV2KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudC5sZW5ndGggPiAwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gISF0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZShldmVudCwgdGFyZ2V0KSB7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZXYgb2YgZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUoZXYsIHRhcmdldClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbihldmVudCwgKC4uLmFyZ3MpID0+IHRhcmdldC5lbWl0KGV2ZW50LCAuLi5hcmdzKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNCb29sZWFuLFxuICBpc051bWJlcixcbiAgaXNGdW5jdGlvbixcbiAgaXNEYXRlLFxuICBpc1JlZ0V4cCxcbiAgYXNBcnJheVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCB0eXBlQ2hlY2tlcnMgPSB7XG4gIEJvb2xlYW46IGlzQm9vbGVhbixcbiAgTnVtYmVyOiBpc051bWJlcixcbiAgU3RyaW5nOiBpc1N0cmluZyxcbiAgRGF0ZTogaXNEYXRlLFxuICBBcnJheTogaXNBcnJheSxcbiAgT2JqZWN0OiBpc09iamVjdCxcbiAgUmVnRXhwOiBpc1JlZ0V4cCxcbiAgRnVuY3Rpb246IGlzRnVuY3Rpb25cbn1cblxuLy8gRGVjbGFyZSB0aGVzZSBzZXBhcmF0ZWx5IGZyb20gdGhlIGB0eXBlQ29udmVydGVyc2Agb2JqZWN0LCB0byBwcmV2ZW50XG4vLyBCYWJlbCBpc3N1ZXMgd2l0aCBgT2JqZWN0YCBvdmVycmlkaW5nIHRoZSBnbG9iYWwgYE9iamVjdGA6XG5jb25zdCB0b0Jvb2xlYW4gPSB2YWx1ZSA9PiAhIXZhbHVlXG5jb25zdCB0b051bWJlciA9IHZhbHVlID0+ICt2YWx1ZVxuY29uc3QgdG9TdHJpbmcgPSB2YWx1ZSA9PiBTdHJpbmcodmFsdWUpXG5cbmNvbnN0IHRvRGF0ZSA9IHZhbHVlID0+XG4gIGlzRGF0ZSh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgRGF0ZSh2YWx1ZSlcblxuY29uc3QgdG9BcnJheSA9IHZhbHVlID0+XG4gIGlzQXJyYXkodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNTdHJpbmcodmFsdWUpXG4gICAgICA/IHZhbHVlLnNwbGl0KCcsJylcbiAgICAgIDogYXNBcnJheSh2YWx1ZSlcblxuY29uc3QgdG9PYmplY3QgPSB2YWx1ZSA9PlxuICBpc09iamVjdCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiAvLyBJZiBhIE9iamVjdCBpcyBleHBlY3RlZCBidXQgYSBCb29sZWFuIHByb3ZpZGUsIGNvbnZlcnQgdG8gYW4gZW1wdHlcbiAgICAgIC8vIG9iamVjdC4gVXNlZCBieSBgY3JlYXRhYmxlYCAmIGNvLCB0aGF0IGNhbiBiZSBib3RoLlxuICAgICAgdmFsdWUgPT09IHRydWVcbiAgICAgID8ge31cbiAgICAgIDogbnVsbFxuXG5jb25zdCB0b1JlZ0V4cCA9IHZhbHVlID0+XG4gIGlzUmVnRXhwKHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IG5ldyBSZWdFeHAodmFsdWUpXG5cbmNvbnN0IHR5cGVDb252ZXJ0ZXJzID0ge1xuICBCb29sZWFuOiB0b0Jvb2xlYW4sXG4gIE51bWJlcjogdG9OdW1iZXIsXG4gIFN0cmluZzogdG9TdHJpbmcsXG4gIERhdGU6IHRvRGF0ZSxcbiAgQXJyYXk6IHRvQXJyYXksXG4gIE9iamVjdDogdG9PYmplY3QsXG4gIFJlZ0V4cDogdG9SZWdFeHBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkge1xuICAvLyBTZWUgaWYgYW55IG9mIHRoZSBleHBlY3QgdHlwZXMgbWF0Y2gsIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGV5IGRvOlxuICBpZiAodHlwZXMgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgaWYgKHR5cGVDaGVja2Vyc1t0eXBlLm5hbWVdPy4odmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFR5cGUodHlwZSwgdmFsdWUpIHtcbiAgY29uc3QgY29udmVydGVyID0gdHlwZSAmJiB0eXBlQ29udmVydGVyc1t0eXBlLm5hbWUgfHwgdHlwZV1cbiAgcmV0dXJuIGNvbnZlcnRlciA/IGNvbnZlcnRlcih2YWx1ZSkgOiB2YWx1ZVxufVxuIiwiaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBwaWNrQnkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVzb3VyY2Uoc2NoZW1hKSB7XG4gIHJldHVybiAhIWdldFJlc291cmNlKHNjaGVtYS5yZXNvdXJjZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc291cmNlKHJlc291cmNlLCBkZWZhdWx0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcGFyZW50LCAuLi5kZWZzIH0gPSBkZWZhdWx0c1xuICByZXNvdXJjZSA9IGlzT2JqZWN0KHJlc291cmNlKVxuICAgID8geyAuLi5kZWZzLCAuLi5yZXNvdXJjZSB9XG4gICAgOiBpc1N0cmluZyhyZXNvdXJjZSlcbiAgICAgID8geyAuLi5kZWZzLCBwYXRoOiByZXNvdXJjZSB9XG4gICAgICA6IG51bGxcbiAgLy8gT25seSBzZXQgcGFyZW50IGlmIHBhdGggZG9lc24ndCBzdGFydCB3aXRoICcvJywgc28gcmVsYXRpdmUgVVJMcyBhcmVcbiAgLy8gZGVhbHQgd2l0aCBjb3JyZWN0bHkuXG4gIGlmIChcbiAgICByZXNvdXJjZSAmJlxuICAgIHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgcmVzb3VyY2UucGFyZW50ID09PSB1bmRlZmluZWQgJiZcbiAgICAhcmVzb3VyY2UucGF0aD8uc3RhcnRzV2l0aCgnLycpXG4gICkge1xuICAgIHJlc291cmNlLnBhcmVudCA9IHBhcmVudFxuICAgIGlmICghcmVzb3VyY2UucGF0aCkge1xuICAgICAgcmVzb3VyY2UucGF0aCA9ICcuJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzb3VyY2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lbWJlclJlc291cmNlKGlkLCByZXNvdXJjZSkge1xuICByZXR1cm4gaWQgIT0gbnVsbCAmJiByZXNvdXJjZT8udHlwZSA9PT0gJ2NvbGxlY3Rpb24nXG4gICAgPyB7XG4gICAgICAgIHR5cGU6ICdtZW1iZXInLFxuICAgICAgICAuLi5waWNrQnkoXG4gICAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgICAgKHZhbHVlLCBrZXkpID0+IFsnbWV0aG9kJywgJ3BhdGgnLCAncGFyZW50J10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApLFxuICAgICAgICBpZDogYCR7aWR9YFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuIiwiaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzQXJyYXksXG4gIGlzU3RyaW5nLFxuICBpc0Z1bmN0aW9uLFxuICBhc0FycmF5LFxuICBlcXVhbHMsXG4gIGdldFZhbHVlQXREYXRhUGF0aCxcbiAgbGFiZWxpemUsXG4gIGh5cGhlbmF0ZSxcbiAgZm9ybWF0XG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgYXBwU3RhdGUgZnJvbSAnLi4vYXBwU3RhdGUuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRW1pdHRlck1peGluIGZyb20gJy4vRW1pdHRlck1peGluLmpzJ1xuaW1wb3J0IHsgaXNNYXRjaGluZ1R5cGUsIGNvbnZlcnRUeXBlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZS5qcydcbmltcG9ydCB7IGdldFJlc291cmNlLCBnZXRNZW1iZXJSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgcmVhY3RpdmUgfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0VtaXR0ZXJNaXhpbl0sXG5cbiAgaW5qZWN0OiBbXG4gICAgJ2FwaScsXG4gICAgJyR2ZXJicycsXG4gICAgJyR2aWV3cycsXG4gICAgJyRpc1BvcHVsYXRlZCcsXG4gICAgJyRwYXJlbnRDb21wb25lbnQnLFxuICAgICckc2NoZW1hQ29tcG9uZW50JyxcbiAgICAnJHJvdXRlQ29tcG9uZW50JyxcbiAgICAnJGRhdGFDb21wb25lbnQnLFxuICAgICckc291cmNlQ29tcG9uZW50JyxcbiAgICAnJHJlc291cmNlQ29tcG9uZW50JyxcbiAgICAnJGRpYWxvZ0NvbXBvbmVudCcsXG4gICAgJyRwYW5lbENvbXBvbmVudCcsXG4gICAgJyR0YWJDb21wb25lbnQnXG4gIF0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm92aWRlc0RhdGFcbiAgICAgID8ge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAgICAgJGRhdGFDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgJHBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgICAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGUsXG4gICAgICBvdmVycmlkZXM6IG51bGwgLy8gU2VlIGFjY2Vzc29yLmpzXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgLy8gTk9URTogVGhpcyBpcyBvdmVycmlkZGVuIGluIFJlc291cmNlTWl4aW4sIHVzZWQgYnkgbGlzdHMuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgc291cmNlU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YT8uc2NoZW1hXG4gICAgfSxcblxuICAgIHVzZXIoKSB7XG4gICAgICByZXR1cm4gYXBwU3RhdGUudXNlclxuICAgIH0sXG5cbiAgICAvLyAkdmVyYnMsICR2ZXJicyBhbmQgJGlzUG9wdWxhdGVkIGFyZSBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgdG8gcHJlc2VydmVcbiAgICAvLyByZWFjdGl2ZW5lc3MgYWNyb3NzIHByb3ZpZGUvaW5qZWN0LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNzAxNyNpc3N1ZWNvbW1lbnQtNDgwOTA2NjkxXG4gICAgdmVyYnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmVyYnMoKVxuICAgIH0sXG5cbiAgICB2aWV3cygpIHtcbiAgICAgIHJldHVybiB0aGlzLiR2aWV3cygpXG4gICAgfSxcblxuICAgIGlzUG9wdWxhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJGlzUG9wdWxhdGVkKClcbiAgICB9LFxuXG4gICAgbG9jYWxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBpLmxvY2FsZVxuICAgIH0sXG5cbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogZmFsc2UgfSlcbiAgICB9LFxuXG4gICAgcm9vdENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb290LiRyZWZzLnJvb3RcbiAgICB9LFxuXG4gICAgLy8gVXNlIGNvbXB1dGVkIHByb3BlcnRpZXMgYXMgbGlua3MgdG8gaW5qZWN0cywgc28gRGl0b1NjaGVtYSBjYW5cbiAgICAvLyBvdmVycmlkZSB0aGUgcHJvcGVydHkgYW5kIHJldHVybiBgdGhpc2AgaW5zdGVhZCBvZiB0aGUgcGFyZW50LlxuICAgIHBhcmVudENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYXJlbnRDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc2NoZW1hQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGVDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBmb3JtQ29tcG9uZW50KCkge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5yb3V0ZUNvbXBvbmVudFxuICAgICAgcmV0dXJuIGNvbXBvbmVudD8uaXNGb3JtID8gY29tcG9uZW50IDogbnVsbFxuICAgIH0sXG5cbiAgICB2aWV3Q29tcG9uZW50KCkge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5yb3V0ZUNvbXBvbmVudFxuICAgICAgcmV0dXJuIGNvbXBvbmVudD8uaXNWaWV3ID8gY29tcG9uZW50IDogbnVsbFxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIHRoZSBmaXJzdCByb3V0ZSBjb21wb25lbnQgaW4gdGhlIGNoYWluIG9mIHBhcmVudHMsIGluY2x1ZGluZ1xuICAgIC8vIHRoaXMgY3VycmVudCBjb21wb25lbnQsIHRoYXQgaXMgbGlua2VkIHRvIGEgcmVzb3VyY2UgKGFuZCB0aHVzIGxvYWRzIGl0c1xuICAgIC8vIG93biBkYXRhIGFuZCBkb2Vzbid0IGhvbGQgbmVzdGVkIGRhdGEpLlxuICAgIGRhdGFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm92aWRlc0RhdGEgPyB0aGlzIDogdGhpcy4kZGF0YUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZXNvdXJjZUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRkaWFsb2dDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBwYW5lbENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRwYW5lbENvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHRhYkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiR0YWJDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBwYXJlbnRTY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5zY2hlbWFDb21wb25lbnRcbiAgICB9LFxuXG4gICAgcGFyZW50Um91dGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LnJvdXRlQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudEZvcm1Db21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuZm9ybUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCByb3V0ZSBjb21wb25lbnQgaW4gdGhlIGNoYWluIG9mIHBhcmVudHNcbiAgICAvLyB0aGF0IGxvYWRzIGl0cyBvd24gZGF0YSBmcm9tIGFuIGFzc29jaWF0ZWQgQVBJIHJlc291cmNlLlxuICAgIHJvb3REYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YUNvbXBvbmVudD8uZGF0YVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVDcmVhdGUoKSB7XG4gICAgY29uc3QgdWlkID0gbmV4dFVpZCsrXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICckdWlkJywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdWlkXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gVGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaXMgb25seSBhdmFpbGFibGUgZHVyaW5nIHRoZSBsaWZlLWN5Y2xlIG9mIGFcbiAgICAvLyBjb21wb25lbnQuIFNvbWUgaW5mb3JtYXRpb24gd2UgbmVlZCBhdmFpbGFibGUgbG9uZ2VyIHRoYW4gdGhhdCwgZS5nLlxuICAgIC8vIGBxdWVyeWAgJiBgdG90YWxgIG9uIFR5cGVMaXN0LCBzbyB0aGF0IHdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2sgZnJvbVxuICAgIC8vIGVkaXRpbmcgYW4gaXRlbSBpbiB0aGUgbGlzdCwgdGhlIHN0YXRlIG9mIHRoZSBsaXN0IGlzIHN0aWxsIHRoZSBzYW1lLlxuICAgIC8vIFdlIGNhbid0IHN0b3JlIHRoaXMgaW4gYGRhdGFgLCBhcyB0aGlzIGlzIGFscmVhZHkgdGhlIHB1cmUgZGF0YSBmcm9tIHRoZVxuICAgIC8vIEFQSSBzZXJ2ZXIuIFRoYXQncyB3aGF0IHRoZSBgc3RvcmVgIGlzIGZvcjogTWVtb3J5IHRoYXQncyBhdmFpbGFibGUgYXNcbiAgICAvLyBsb25nIGFzIHRoZSBjdXJyZW50IGVkaXRpbmcgcGF0aCBpcyBzdGlsbCB2YWxpZC4gRm9yIHR5cGUgY29tcG9uZW50cyxcbiAgICAvLyB0aGlzIG1lbW9yeSBpcyBwcm92aWRlZCBieSB0aGUgcGFyZW50LCBzZWUgUm91dGVNaXhpbiBhbmQgRGl0b1BhbmUuXG4gICAgZ2V0U3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZVtrZXldXG4gICAgfSxcblxuICAgIHNldFN0b3JlKGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRTdG9yZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKGtleSkgfHwgdGhpcy5zZXRTdG9yZShrZXksIHJlYWN0aXZlKHt9KSlcbiAgICB9LFxuXG4gICAgZ2V0U2NoZW1hVmFsdWUoXG4gICAgICBrZXlPckRhdGFQYXRoLFxuICAgICAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIHNjaGVtYSA9IHRoaXMuc2NoZW1hLCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4gICAgKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IHR5cGUgJiYgYXNBcnJheSh0eXBlKVxuICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGRhdGEtcGF0aHMgaW4gYGtleU9yRGF0YVBhdGhgIGNhbiBvbmx5IGJlXG4gICAgICAvLyBwcm92aWRlZCBpbiBpbiBhcnJheSBmb3JtYXQgaGVyZTpcbiAgICAgIGxldCB2YWx1ZSA9IHNjaGVtYVxuICAgICAgICA/IGlzQXJyYXkoa2V5T3JEYXRhUGF0aClcbiAgICAgICAgICA/IGdldFZhbHVlQXREYXRhUGF0aChzY2hlbWEsIGtleU9yRGF0YVBhdGgsICgpID0+IHVuZGVmaW5lZClcbiAgICAgICAgICA6IHNjaGVtYVtrZXlPckRhdGFQYXRoXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbihkZWYpICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgZGVmKSkge1xuICAgICAgICAgIC8vIFN1cHBvcnQgYGRlZmF1bHQoKWAgZnVuY3Rpb25zIGZvciBhbnkgdHlwZSBleGNlcHQgYEZ1bmN0aW9uYDpcbiAgICAgICAgICBkZWYgPSBkZWYuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZlxuICAgICAgfVxuXG4gICAgICBpZiAoaXNNYXRjaGluZ1R5cGUodHlwZXMsIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIEFueSBzY2hlbWEgdmFsdWUgaGFuZGxlZCB0aHJvdWdoIGBnZXRTY2hlbWFWYWx1ZSgpYCBjYW4gcHJvdmlkZVxuICAgICAgLy8gYSBmdW5jdGlvbiB0aGF0J3MgcmVzb2x2ZWQgd2hlbiB0aGUgdmFsdWUgaXMgZXZhbHVhdGVkOlxuICAgICAgaWYgKGNhbGxiYWNrICYmIGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyBOb3cgZmluYWxseSBzZWUgaWYgd2UgY2FuIGNvbnZlcnQgdG8gdGhlIGV4cGVjdCB0eXBlcy5cbiAgICAgIGlmICh0eXBlcyAmJiB2YWx1ZSAhPSBudWxsICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKVxuICAgICAgICAgIGlmIChjb252ZXJ0ZWQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0TGFiZWwoc2NoZW1hLCBuYW1lKSB7XG4gICAgICByZXR1cm4gc2NoZW1hXG4gICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgnbGFiZWwnLCB7IHR5cGU6IFN0cmluZywgc2NoZW1hIH0pIHx8XG4gICAgICAgICAgbGFiZWxpemUobmFtZSB8fCBzY2hlbWEubmFtZSlcbiAgICAgICAgOiBsYWJlbGl6ZShuYW1lKSB8fCAnJ1xuICAgIH0sXG5cbiAgICBsYWJlbGl6ZSxcblxuICAgIGdldEJ1dHRvbkF0dHJpYnV0ZXMobmFtZSwgYnV0dG9uKSB7XG4gICAgICBjb25zdCB2ZXJiID0gdGhpcy52ZXJic1tuYW1lXSB8fCBuYW1lXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzczogYGRpdG8tYnV0dG9uLSR7dmVyYn1gLFxuICAgICAgICB0aXRsZTogYnV0dG9uPy50ZXh0IHx8IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICEhc2NoZW1hICYmXG4gICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2lmJywge1xuICAgICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICBzY2hlbWFcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgZ2V0UmVzb3VyY2VQYXRoKHJlc291cmNlKSB7XG4gICAgICByZXNvdXJjZSA9IGdldFJlc291cmNlKHJlc291cmNlKVxuICAgICAgLy8gUmVzb3VyY2VzIHdpdGhvdXQgYSBwYXJlbnQgaW5oZXJpdCB0aGUgb25lIGZyb20gYGRhdGFDb21wb25lbnRgXG4gICAgICAvLyBhdXRvbWF0aWNhbGx5LlxuICAgICAgaWYgKHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc291cmNlLnBhcmVudCA9IHRoaXMuZGF0YUNvbXBvbmVudD8ucmVzb3VyY2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFwaS5yZXNvdXJjZXMuYW55KGdldFJlc291cmNlKHJlc291cmNlKSlcbiAgICB9LFxuXG4gICAgZ2V0UmVzb3VyY2VVcmwocmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0UmVzb3VyY2VQYXRoKHJlc291cmNlKVxuICAgICAgcmV0dXJuIHVybCA/IHRoaXMuYXBpLmdldEFwaVVybCh7IHVybCwgcXVlcnk6IHJlc291cmNlLnF1ZXJ5IH0pIDogbnVsbFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdCh7IG1ldGhvZCwgdXJsLCByZXNvdXJjZSwgcXVlcnksIGRhdGEsIGludGVybmFsIH0pIHtcbiAgICAgIHVybCB8fD0gdGhpcy5nZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpXG4gICAgICBtZXRob2QgfHw9IHJlc291cmNlPy5tZXRob2RcbiAgICAgIGNvbnN0IGNoZWNrVXNlciA9ICFpbnRlcm5hbCAmJiB0aGlzLmFwaS5pc0FwaVVybCh1cmwpXG4gICAgICBpZiAoY2hlY2tVc2VyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucm9vdENvbXBvbmVudC5lbnN1cmVVc2VyKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hcGkucmVxdWVzdCh7IG1ldGhvZCwgdXJsLCBkYXRhLCBxdWVyeSB9KVxuICAgICAgLy8gRGV0ZWN0IGNoYW5nZSBvZiB0aGUgb3duIHVzZXIsIGFuZCBmZXRjaCBpdCBhZ2FpbiBpZiBpdCB3YXMgY2hhbmdlZC5cbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tVc2VyICYmXG4gICAgICAgIG1ldGhvZCA9PT0gJ3BhdGNoJyAmJlxuICAgICAgICBlcXVhbHMocmVzb3VyY2UsIGdldE1lbWJlclJlc291cmNlKHRoaXMudXNlci5pZCwgdGhpcy5hcGkudXNlcnMpKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucm9vdENvbXBvbmVudC5mZXRjaFVzZXIoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfSxcblxuICAgIHNob3dEaWFsb2coeyBjb21wb25lbnRzLCBidXR0b25zLCBkYXRhLCBzZXR0aW5ncyB9KSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Q29tcG9uZW50LnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICBidXR0b25zLFxuICAgICAgICBkYXRhLFxuICAgICAgICBzZXR0aW5nc1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcmVxdWVzdCh7IGNhY2hlLCAuLi5vcHRpb25zIH0pIHtcbiAgICAgIC8vIEFsbG93IGNhY2hpbmcgb2YgbG9hZGVkIGRhdGEgb24gdHdvIGxldmVsczpcbiAgICAgIC8vIC0gJ2dsb2JhbCc6IGNhY2hlIGdsb2JhbGx5LCBmb3IgdGhlIGVudGlyZSBhZG1pbiBzZXNzaW9uXG4gICAgICAvLyAtICdsb2NhbCc6IGNhY2hlIGxvY2FsbHkgd2l0aGluIHRoZSBjbG9zZXN0IHJvdXRlIGNvbXBvbmVudCB0aGF0IGlzXG4gICAgICAvLyAgICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBhbmQgbG9hZHMgaXRzIG93biBkYXRhLlxuICAgICAgY29uc3QgY2FjaGVQYXJlbnQgPSAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIHtcbiAgICAgICAgICBnbG9iYWw6IHRoaXMuYXBwU3RhdGUsXG4gICAgICAgICAgbG9jYWw6IHRoaXMuZGF0YUNvbXBvbmVudFxuICAgICAgICB9W2NhY2hlXVxuICAgICAgKVxuICAgICAgY29uc3QgbG9hZENhY2hlID0gY2FjaGVQYXJlbnQ/LmxvYWRDYWNoZVxuICAgICAgLy8gQnVpbGQgYSBjYWNoZSBrZXkgZnJvbSB0aGUgY29uZmlnOlxuICAgICAgY29uc3QgY2FjaGVLZXkgPSAoXG4gICAgICAgIGxvYWRDYWNoZSAmJlxuICAgICAgICBgJHtcbiAgICAgICAgICBvcHRpb25zLm1ldGhvZCB8fCAnZ2V0J1xuICAgICAgICB9ICR7XG4gICAgICAgICAgb3B0aW9ucy51cmxcbiAgICAgICAgfSAke1xuICAgICAgICAgIC8vIFRPRE86IGByZXF1ZXN0LnBhcmFtc2Agd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBxdWVyeWAgb25cbiAgICAgICAgICAvLyAyMDIyLTExLTAxLCByZW1vdmUgb25jZSBub3QgaW4gdXNlIGFueXdoZXJlIGFueSBtb3JlLlxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucXVlcnkgfHwgb3B0aW9ucy5wYXJhbXMgfHwgJycpXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEgfHwgJycpXG4gICAgICAgIH1gXG4gICAgICApXG4gICAgICBpZiAobG9hZENhY2hlICYmIChjYWNoZUtleSBpbiBsb2FkQ2FjaGUpKSB7XG4gICAgICAgIHJldHVybiBsb2FkQ2FjaGVbY2FjaGVLZXldXG4gICAgICB9XG4gICAgICAvLyBOT1RFOiBObyBhd2FpdCBoZXJlLCByZXMgaXMgYSBwcm9taXNlIHRoYXQgd2UgY2FuIGVhc2lseSBjYWNoZS5cbiAgICAgIC8vIFRoYXQncyBmaW5lIGJlY2F1c2UgcHJvbWlzZXMgY2FuIGJlIHJlc29sdmVkIG92ZXIgYW5kIG92ZXIgYWdhaW4uXG4gICAgICBjb25zdCByZXMgPSB0aGlzLnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmRhdGEpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgLy8gQ29udmVydCBheGlvcyBlcnJvcnMgdG8gbm9ybWFsIGVycm9yc1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBlcnJvci5yZXNwb25zZT8uZGF0YVxuICAgICAgICAgIHRocm93IGRhdGFcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoZGF0YS5tZXNzYWdlKSwgZGF0YSlcbiAgICAgICAgICAgIDogZXJyb3JcbiAgICAgICAgfSlcbiAgICAgIGlmIChsb2FkQ2FjaGUpIHtcbiAgICAgICAgbG9hZENhY2hlW2NhY2hlS2V5XSA9IHJlc1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0sXG5cbiAgICBmb3JtYXQodmFsdWUsIHtcbiAgICAgIGxvY2FsZSA9IHRoaXMuYXBpLmxvY2FsZSxcbiAgICAgIGRlZmF1bHRzID0gdGhpcy5hcGkuZm9ybWF0cyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiBmb3JtYXQodmFsdWUsIHtcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBkZWZhdWx0cyxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGUobG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZXIucHVzaChsb2NhdGlvbilcbiAgICB9LFxuXG4gICAgZG93bmxvYWQob3B0aW9ucyA9IHt9KSB7XG4gICAgICBpZiAoaXNTdHJpbmcob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgdXJsOiBvcHRpb25zIH1cbiAgICAgIH1cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ5OTE3MDY2LzExNjM3MDhcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGEuaHJlZiA9IHRoaXMuYXBpLmdldEFwaVVybChvcHRpb25zKVxuICAgICAgYS5kb3dubG9hZCA9IG9wdGlvbnMuZmlsZW5hbWUgPz8gbnVsbFxuICAgICAgY29uc3QgeyBib2R5IH0gPSBkb2N1bWVudFxuICAgICAgYm9keS5hcHBlbmRDaGlsZChhKVxuICAgICAgYS5jbGljaygpXG4gICAgICBib2R5LnJlbW92ZUNoaWxkKGEpXG4gICAgfSxcblxuICAgIG5vdGlmeShvcHRpb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb21wb25lbnQubm90aWZ5KG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGNsb3NlTm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5jbG9zZU5vdGlmaWNhdGlvbnMoKVxuICAgIH0sXG5cbiAgICBzZXR1cFNjaGVtYUZpZWxkcygpIHtcbiAgICAgIHRoaXMuc2V0dXBNZXRob2RzKClcbiAgICAgIHRoaXMuc2V0dXBDb21wdXRlZCgpXG4gICAgICB0aGlzLnNldHVwRXZlbnRzKClcbiAgICB9LFxuXG4gICAgc2V0dXBNZXRob2RzKCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEubWV0aG9kcyB8fCB7fSkpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgdGhpc1trZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIG1ldGhvZCBkZWZpbml0aW9uOiAke2tleX06ICR7dmFsdWV9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXR1cENvbXB1dGVkKCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEuY29tcHV0ZWQgfHwge30pKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc29yID0gaXNGdW5jdGlvbih2YWx1ZSlcbiAgICAgICAgICA/IHsgZ2V0OiB2YWx1ZSB9XG4gICAgICAgICAgOiBpc09iamVjdCh2YWx1ZSkgJiYgaXNGdW5jdGlvbih2YWx1ZS5nZXQpXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKGFjY2Vzc29yKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgYWNjZXNzb3IpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIGNvbXB1dGVkIHByb3BlcnR5IGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwRXZlbnRzKCkge1xuICAgICAgY29uc3QgeyB3YXRjaCwgZXZlbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgaWYgKHdhdGNoKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gaXNGdW5jdGlvbih3YXRjaCkgPyB3YXRjaC5jYWxsKHRoaXMpIDogd2F0Y2hcbiAgICAgICAgaWYgKGlzT2JqZWN0KGhhbmRsZXJzKSkge1xuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHdhdGNoIGhhbmRsZXJzIGluIHRoZSBuZXh0IHRpY2ssIHNvIGFsbCBjb21wb25lbnRzIGFyZVxuICAgICAgICAgIC8vIGluaXRpYWxpemVkIGFuZCB3ZSBjYW4gY2hlY2sgYWdhaW5zdCB0aGVpciBuYW1lcy5cbiAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNhbGxiYWNrXSBvZiBPYmplY3QuZW50cmllcyhoYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgLy8gRXhwYW5kIHByb3BlcnR5IG5hbWVzIHRvICdkYXRhLnByb3BlcnR5JzpcbiAgICAgICAgICAgICAgY29uc3QgZXhwciA9IHRoaXMuc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudEJ5TmFtZShrZXkpXG4gICAgICAgICAgICAgICAgPyBgZGF0YS4ke2tleX1gXG4gICAgICAgICAgICAgICAgOiBrZXlcbiAgICAgICAgICAgICAgdGhpcy4kd2F0Y2goZXhwciwgY2FsbGJhY2spXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRFdmVudCA9IChrZXksIGV2ZW50LCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgICAgICB0aGlzLm9uKGh5cGhlbmF0ZShldmVudCksIGNhbGxiYWNrKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZXZlbnQgZGVmaW5pdGlvbjogJHtrZXl9OiAke2NhbGxiYWNrfWApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhldmVudHMpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHNjYW4gc2NoZW1hIGZvciBgb25bQS1aXWAtc3R5bGUgY2FsbGJhY2tzIGFuZCBhZGQgdGhlbVxuICAgICAgLy8gVE9ETzogRGVwcmVjYXRlIG9uZSBmb3JtYXQgb3IgdGhlIG90aGVyLCBpbiBmYXZvdXIgb2Ygb25seSBvbmUgd2F5IG9mXG4gICAgICAvLyBkb2luZyB0aGluZ3MuIERlY2lkZSB3aGljaCBvbmUgdG8gcmVtb3ZlLlxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zY2hlbWEpKSB7XG4gICAgICAgIGlmICgvXm9uW0EtWl0vLnRlc3Qoa2V5KSkge1xuICAgICAgICAgIGFkZEV2ZW50KGtleSwga2V5LnNsaWNlKDIpLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBlbWl0RXZlbnQoZXZlbnQsIHtcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgcGFyZW50ID0gbnVsbFxuICAgIH0gPSB7fSkge1xuICAgICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoZXZlbnQpXG4gICAgICBjb25zdCBwYXJlbnRIYXNMaXN0ZW5lcnMgPSBwYXJlbnQ/Lmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGlmIChoYXNMaXN0ZW5lcnMgfHwgcGFyZW50SGFzTGlzdGVuZXJzKSB7XG4gICAgICAgIC8vIFRoZSBlZmZlY3RzIG9mIHNvbWUgZXZlbnRzIG5lZWQgc29tZSB0aW1lIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIFZ1ZS5cbiAgICAgICAgLy8gVXNlICRuZXh0VGljaygpIHRvIG1ha2Ugc3VyZSBvdXIgaGFuZGxlcnMgc2VlIHRoZXNlIGNoYW5nZXMuXG4gICAgICAgIC8vIEZvciBleGFtcGxlLCBgcHJvY2Vzc2VkSXRlbWAgaXMgb25seSBjb3JyZWN0IGFmdGVyIGNvbXBvbmVudHMgdGhhdFxuICAgICAgICAvLyBhcmUgbmV3bHkgcmVuZGVyZWQgZHVlIHRvIGRhdGEgY2hhbmdlcyBoYXZlIHJlZ2lzdGVyZWQgdGhlbXNlbHZlcy5cbiAgICAgICAgaWYgKFsnbG9hZCcsICdjaGFuZ2UnXS5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnZXRDb250ZXh0ID0gKCkgPT4gKGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQodGhpcywgY29udGV4dCkpXG4gICAgICAgIGNvbnN0IHJlcyA9IGhhc0xpc3RlbmVyc1xuICAgICAgICAgID8gYXdhaXQgdGhpcy5lbWl0KGV2ZW50LCBnZXRDb250ZXh0KCkpXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHRvIHBhcmVudCBpZiBoYW5kbGVkIGV2ZW50IHJldHVybmVkIGBmYWxzZWBcbiAgICAgICAgaWYgKHBhcmVudEhhc0xpc3RlbmVycyAmJiByZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgcGFyZW50LmVtaXQoZXZlbnQsIGdldENvbnRleHQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfSxcblxuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnQuZW1pdEV2ZW50KGV2ZW50LCBwYXJhbXMpXG4gICAgfVxuICB9XG59XG5cbmxldCBuZXh0VWlkID0gMFxuIiwiaW1wb3J0IHsgaXNDcmVkaXRDYXJkIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGNyZWRpdGNhcmQgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0NyZWRpdENhcmQodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgaW52YWxpZCdcbn1cbiIsImV4cG9ydCBjb25zdCBkZWNpbWFscyA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgZGVjaW1hbHMpID0+IHtcbiAgICBjb25zdCBtYXRjaCA9IGRlY2ltYWxzID09PSAnKicgPyAnKycgOiBgezEsJHtkZWNpbWFsc319YFxuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeWy0rXT9cXFxcZCooXFxcXC5cXFxcZCR7bWF0Y2h9KT8kYCkudGVzdCh2YWx1ZSlcbiAgfSxcblxuICBtZXNzYWdlOiAodmFsdWUsIGRlY2ltYWxzKSA9PlxuICAgIGBtdXN0IGJlIG51bWVyaWMgYW5kIG1heSBjb250YWluICR7XG4gICAgICAhZGVjaW1hbHMgfHwgZGVjaW1hbHMgPT09ICcqJyA/ICcnIDogZGVjaW1hbHNcbiAgICB9IGRlY2ltYWwgcG9pbnRzYFxufVxuIiwiaW1wb3J0IHsgaXNEb21haW4gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgZG9tYWluID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNEb21haW4odmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgZG9tYWluJ1xufVxuIiwiaW1wb3J0IHsgaXNFbWFpbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBlbWFpbCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzRW1haWwodmFsdWUpLFxuICBtZXNzYWdlOiAnbXVzdCBiZSBhIHZhbGlkIGVtYWlsJ1xufVxuIiwiaW1wb3J0IHsgaXNIb3N0bmFtZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBob3N0bmFtZSA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzSG9zdG5hbWUodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgaG9zdCBuYW1lJ1xufVxuIiwiaW1wb3J0IHsgaXNJbnRlZ2VyIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGludGVnZXIgPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0ludGVnZXIodmFsdWUpLFxuICBtZXNzYWdlOiAnbXVzdCBiZSB3aG9sZSBudW1iZXInXG59XG4iLCJleHBvcnQgY29uc3QgbWF4ID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBtYXgpID0+IHZhbHVlIDw9IG1heCxcbiAgbWVzc2FnZSh2YWx1ZSwgbWF4KSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlICR7bWF4fSBvciBsZXNzYFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgbWluID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBtaW4pID0+IHZhbHVlID49IG1pbixcbiAgbWVzc2FnZSh2YWx1ZSwgbWluKSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlICR7bWlufSBvciBtb3JlYFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgcGFzc3dvcmQgPSB7XG4gIC8vIEFsbG93IGFueSB2YWx1ZS4gRm9yIG5vdyB0aGlzIGlzIG9ubHkgdXNlZCBhcyBhIG1hcmtlciwgdG8gYWxsb3cgdGhlXG4gIC8vIHJlcXVpcmVkIHZhbGlkYXRpb24gdG8gaGFuZGxlIHVuY2hhbmdlZCBwYXNzd29yZHMgc2VwYXJhdGVseS5cbiAgdmFsaWRhdGU6ICgpID0+IHRydWVcbn1cbiIsImV4cG9ydCBjb25zdCByYW5nZSA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgW21pbiwgbWF4XSkgPT4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heCxcbiAgbWVzc2FnZSh2YWx1ZSwgW21pbiwgbWF4XSkge1xuICAgIHJldHVybiBgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9YFxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgcmVxdWlyZWQgPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIHNldHRpbmdzLCB7IHBhc3N3b3JkIH0pID0+IChcbiAgICAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHx8XG4gICAgLy8gUGFzc3dvcmQgZmllbGRzIHVzZSBgdW5kZWZpbmVkYCBhcyBvcHBvc2VkIHRvIGBudWxsYCB3aGVuIHRoZXkncmUgc2V0XG4gICAgLy8gYnV0IHVuY2hhbmdlZCwgYWxsb3cgdGhpcyB0byBwYXNzIHRocm91Z2g6XG4gICAgKHBhc3N3b3JkICYmIHZhbHVlID09PSB1bmRlZmluZWQpXG4gICksXG4gIG1lc3NhZ2U6ICdpcyByZXF1aXJlZCcsXG4gIG51bGxpc2g6IHRydWVcbn1cbiIsImltcG9ydCB7IGlzVXJsIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IHVybCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzVXJsKHZhbHVlKSxcbiAgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIFVSTCdcbn1cbiIsImltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0ICogYXMgdmFsaWRhdGlvbnMgZnJvbSAnLi4vdmFsaWRhdGlvbnMvaW5kZXguanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ2Vycm9ycyddLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVG91Y2hlZDogZmFsc2UsXG4gICAgICBpc0RpcnR5OiBmYWxzZSxcbiAgICAgIGlzVmFsaWRhdGVkOiBmYWxzZSxcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3JzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIHZhbGlkYXRlKG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXNcbiAgICAgIC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZScsIHRoaXMuZGF0YVBhdGgsIHZhbHVlLCB0aGlzLnZhbGlkYXRpb25zKVxuICAgICAgZm9yIChjb25zdCBbcnVsZSwgc2V0dGluZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy52YWxpZGF0aW9ucykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdGlvbnNbcnVsZV1cbiAgICAgICAgaWYgKHZhbGlkYXRvciAmJiAodmFsaWRhdG9yLm51bGxpc2ggfHwgdmFsdWUgIT0gbnVsbCkpIHtcbiAgICAgICAgICBjb25zdCB7IHZhbGlkYXRlLCBtZXNzYWdlIH0gPSB2YWxpZGF0b3JcbiAgICAgICAgICBpZiAoIXZhbGlkYXRlKHZhbHVlLCBzZXR0aW5nLCB0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlXG4gICAgICAgICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNGdW5jdGlvbihtZXNzYWdlKVxuICAgICAgICAgICAgICAgID8gbWVzc2FnZSh2YWx1ZSwgc2V0dGluZywgdGhpcylcbiAgICAgICAgICAgICAgICA6IG1lc3NhZ2VcbiAgICAgICAgICAgICAgdGhpcy5hZGRFcnJvcihlcnJvciwgdHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IHRydWVcbiAgICAgICAgdGhpcy5pc1ZhbGlkID0gaXNWYWxpZFxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzVmFsaWRcbiAgICB9LFxuXG4gICAgdmVyaWZ5KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGUoZmFsc2UpXG4gICAgfSxcblxuICAgIG1hcmtUb3VjaGVkKCkge1xuICAgICAgdGhpcy5pc1RvdWNoZWQgPSB0cnVlXG4gICAgfSxcblxuICAgIG1hcmtEaXJ0eSgpIHtcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWVcbiAgICAgIHRoaXMuaXNWYWxpZGF0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5pc1ZhbGlkID0gZmFsc2VcbiAgICAgIC8vIENsZWFyIGN1cnJlbnRseSBkaXNwbGF5ZWQgZXJyb3JzIG9uIG5ldyBpbnB1dC5cbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgIH0sXG5cbiAgICBhZGRFcnJvcihlcnJvciwgYWRkTGFiZWwgPSBmYWxzZSkge1xuICAgICAgdGhpcy5lcnJvcnMgfHw9IFtdXG4gICAgICBpZiAoYWRkTGFiZWwpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmxhYmVsIHx8IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5uYW1lXG4gICAgICAgIGVycm9yID0gYFRoZSAke2xhYmVsfSBmaWVsZCAke2Vycm9yfS5gXG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgdGhpcy4kZW1pdCgnZXJyb3JzJywgdGhpcy5lcnJvcnMpXG4gICAgfSxcblxuICAgIHNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgZm9jdXMpIHtcbiAgICAgIC8vIENvbnZlcnQgZnJvbSBBSlYgZXJyb3JzIG9iamVjdHMgdG8gYW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXNcbiAgICAgIHRoaXMuZXJyb3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgeyBtZXNzYWdlIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgIHRoaXMuYWRkRXJyb3IobWVzc2FnZSwgdHJ1ZSlcbiAgICAgIH1cbiAgICAgIGlmIChmb2N1cykge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIGdldEVycm9ycygpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9ycyA/IFsuLi50aGlzLmVycm9yc10gOiBudWxsXG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgdGhpcy5lcnJvcnMgPSBudWxsXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyaW5nLFxuICBwYXJzZURhdGFQYXRoLFxuICBub3JtYWxpemVEYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hQWNjZXNzb3IoXG4gIGtleU9yRGF0YVBhdGgsXG4gIHsgdHlwZSwgZGVmYXVsdDogZGVmLCBnZXQsIHNldCwgY2FsbGJhY2sgPSB0cnVlIH0gPSB7fVxuKSB7XG4gIC8vIGBrZXlPckRhdGFQYXRoYCBjYW4gYmUgYSBzaW1wbGUgcHJvcGVydHkga2V5LFxuICAvLyBvciBhIGRhdGEtcGF0aCBpbnRvIHN1Yi1wcm9wZXJ0aWVzLCBib3RoIGluIGFycmF5IG9yIHN0cmluZyBmb3JtYXQuXG4gIGlmIChpc1N0cmluZyhrZXlPckRhdGFQYXRoKSAmJiBrZXlPckRhdGFQYXRoLmluY2x1ZGVzKCcuJykpIHtcbiAgICBrZXlPckRhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChrZXlPckRhdGFQYXRoKVxuICB9XG4gIC8vIFVzZSB0aGUgbm9ybWFsaXplZCBkYXRhIHBhdGggZm9yIHRoZSBoYW5kbGluZyBvdmVycmlkZXNcbiAgY29uc3QgbmFtZSA9IG5vcm1hbGl6ZURhdGFQYXRoKGtleU9yRGF0YVBhdGgpXG4gIHJldHVybiB7XG4gICAgZ2V0KCkge1xuICAgICAgLy8gT25seSBkZXRlcm1pbmUgc2NoZW1hIHZhbHVlIGlmIHdlIGhhdmUgbm8gZ2V0dGVyLCBvciB0aGUgZ2V0dGVyXG4gICAgICAvLyB3YW50cyB0byByZWNlaXZlIHRoZSB2YWx1ZSBhbmQgcHJvY2VzcyBpdCBmdXJ0aGVyOlxuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAhZ2V0IHx8IGdldC5sZW5ndGggPiAwXG4gICAgICAgICAgPyAvLyBOT1RFOiBCZWNhdXNlIGBzY2hlbWFgIG9iamVjdHMgYXJlIHJldHJpZXZlZCBmcm9tIGBtZXRhYCwgdGhleVxuICAgICAgICAgICAgLy8gZG9uJ3Qgc2VlbSB0byBiZSByZWFjdGl2ZS4gVG8gYWxsb3cgY2hhbmdlZCBpbiBgc2NoZW1hYCB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBgc2V0KClgIHN0b3JlcyBjaGFuZ2VkIHZhbHVlcyBpbiB0aGUgc2VwYXJhdGUgYG92ZXJyaWRlc2Agb2JqZWN0LlxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZXMgJiYgbmFtZSBpbiB0aGlzLm92ZXJyaWRlc1xuICAgICAgICAgICAgPyB0aGlzLm92ZXJyaWRlc1tuYW1lXVxuICAgICAgICAgICAgOiB0aGlzLmdldFNjaGVtYVZhbHVlKGtleU9yRGF0YVBhdGgsIHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGRlZixcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4gZ2V0ID8gZ2V0LmNhbGwodGhpcywgdmFsdWUpIDogdmFsdWVcbiAgICB9LFxuXG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICBpZiAoc2V0KSB7XG4gICAgICAgIHNldC5jYWxsKHRoaXMsIHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgfHw9IHt9XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzW25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JlQWNjZXNzb3IobmFtZSwgeyBkZWZhdWx0OiBkZWYsIGdldCwgc2V0IH0gPSB7fSkge1xuICByZXR1cm4ge1xuICAgIGdldCgpIHtcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGRlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFN1cHBvcnQgYGRlZmF1bHQoKWAgZnVuY3Rpb25zOlxuICAgICAgICB2YWx1ZSA9IGlzRnVuY3Rpb24oZGVmKSA/IGRlZi5jYWxsKHRoaXMsIHRoaXMuY29udGV4dCkgOiBkZWZcbiAgICAgICAgLy8gVHJpZ2dlciBzZXR0ZXIgYnkgc2V0dGluZyB2YWx1ZSBhbmQgYWNjZXNzb3IgdG8gZGVmYXVsdDpcbiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgIC8vIE5vdyBhY2Nlc3Mgc3RvcmUgYWdhaW4sIGZvciByZWFjdGl2aXR5IHRyYWNraW5nXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBnZXR0ZXIgdG8gZnVydGhlciBjaGFuZ2Ugb3IgcHJvY2VzcyB0aGUgdmFsdWVcbiAgICAgIC8vIHJldHJpZXZlZCBmcm9tIHRoZSBzdG9yZTpcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBzZXR0ZXIgdG8gcmV0dXJuIGEgbmV3IHZhbHVlIHRvIHNldCwgb3IgZG8gdGhlXG4gICAgICAvLyBzZXR0aW5nIGl0c2VsZiwgYW5kIHRoZW4gcmV0dXJuIGB1bmRlZmluZWRgOlxuICAgICAgaWYgKCFzZXQgfHwgKHZhbHVlID0gc2V0LmNhbGwodGhpcywgdmFsdWUpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RvcmUobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGNvbXB1dGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEl0ZW0sIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0aW9uTWl4aW5dLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvLyBOT1RFOiBXaGlsZSBgZGF0YVBhdGhgIHBvaW50cyB0byB0aGUgYWN0dWFsIGB2YWx1ZWAsIGBkYXRhYCByZXByZXNlbnRzXG4gICAgLy8gdGhlIGBpdGVtYCBpbiB3aGljaCB0aGUgYHZhbHVlYCBpcyBjb250YWluZWQsIHVuZGVyIHRoZSBrZXkgYG5hbWVgLlxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2luZ2xlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbmVzdGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2VkVmFsdWU6IG51bGwsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubmFtZVxuICAgIH0sXG5cbiAgICB0eXBlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IHRoaXMubmVzdGVkIH0pXG4gICAgfSxcblxuICAgIHZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29tcHV0ZVZhbHVlKFxuICAgICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAgICB7IGNvbXBvbmVudDogdGhpcyB9XG4gICAgICAgIClcbiAgICAgICAgY29uc3QgeyBmb3JtYXQgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIC8vIGBzY2hlbWEuZm9ybWF0YCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGluIHRoZSBsaWZlLWN5Y2xlXG4gICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQgYW5kIHRodXMgaXQncyBvayB0byBiaW5kIGl0IHRvIGB0aGlzYFxuICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgPyBmb3JtYXQuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyB2YWx1ZSB9KSlcbiAgICAgICAgICA6IHZhbHVlXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgICAgLy8gYHNjaGVtYS5wYXJzZWAgaXMgb25seSBldmVyIGNhbGxlZCBpbiB0aGUgbGlmZS1jeWNsZVxuICAgICAgICAvLyBvZiB0aGUgY29tcG9uZW50IGFuZCB0aHVzIGl0J3Mgb2sgdG8gYmluZCBpdCB0byBgdGhpc2BcbiAgICAgICAgdGhpcy5wYXJzZWRWYWx1ZSA9IHBhcnNlXG4gICAgICAgICAgPyBwYXJzZS5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1tdXRhdGluZy1wcm9wc1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHRoaXMucGFyc2VkVmFsdWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgaXRlbSgpIHtcbiAgICAgIHJldHVybiBnZXRJdGVtKHRoaXMucm9vdEl0ZW0sIHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICAgIH0sXG5cbiAgICBwYXJlbnRJdGVtKCkge1xuICAgICAgcmV0dXJuIGdldFBhcmVudEl0ZW0odGhpcy5yb290SXRlbSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgfSxcblxuICAgIHJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdERhdGFcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICAgIC8vIFdlIGNhbiBvbmx5IGdldCB0aGUgcHJvY2Vzc2VkIGl0ZW1zIHRocm91Z2ggdGhlIHNjaGVtYUNvbXBvbmVudCwgYnV0XG4gICAgICAvLyB0aGF0J3Mgbm90IG5lY2Vzc2FyaWx5IHRoZSBpdGVtIHJlcHJlc2VudGVkIGJ5IHRoaXMgY29tcG9uZW50LlxuICAgICAgLy8gU29sdXRpb246IEZpbmQgdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBwcm9jZXNzZWQgc3ViLWl0ZW0gZnJvbSB0aGVyZTpcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50IH0gPSB0aGlzXG4gICAgICByZXR1cm4gZ2V0SXRlbShcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50LnByb2Nlc3NlZEl0ZW0sXG4gICAgICAgIC8vIEdldCB0aGUgZGF0YVBhdGggcmVsYXRpdmUgdG8gdGhlIHNjaGVtYUNvbXBvbmVudCdzIGRhdGE6XG4gICAgICAgIHRoaXMuZGF0YVBhdGguc2xpY2Uoc2NoZW1hQ29tcG9uZW50LmRhdGFQYXRoLmxlbmd0aCksXG4gICAgICAgIHRoaXMubmVzdGVkXG4gICAgICApXG4gICAgfSxcblxuICAgIGxhYmVsOiBnZXRTY2hlbWFBY2Nlc3NvcignbGFiZWwnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGdldChsYWJlbCkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcobGFiZWwpXG4gICAgICAgICAgPyBsYWJlbFxuICAgICAgICAgIDogbGFiZWwgIT09IGZhbHNlICYmIHRoaXMuJG9wdGlvbnMuZ2VuZXJhdGVMYWJlbFxuICAgICAgICAgICAgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSksXG5cbiAgICB3aWR0aDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyXVxuICAgIH0pLFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG9wdGlvbnMuZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgZXhjbHVkZWRgIGZvciBjb25zaXN0ZW50IG5hbWluZ1xuICAgIGV4Y2x1ZGU6IGdldFNjaGVtYUFjY2Vzc29yKCdleGNsdWRlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICByZXF1aXJlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlcXVpcmVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBNb3ZlIHRoZXNlIHRvIGEgc3ViLWNsYXNzIGNvbXBvbmVudCB1c2VkIGZvciBhbGwgaW5wdXQgY29tcG9uZW50cz9cbiAgICByZWFkb25seTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JlYWRvbmx5Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBhdXRvZm9jdXM6IGdldFNjaGVtYUFjY2Vzc29yKCdhdXRvZm9jdXMnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRvIGJlIHVzZWQgZm9yIHNlbGVjdHMgYW5kIGlucHV0cyBvbmx5P1xuICAgIGNsZWFyYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NsZWFyYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXI6IGdldFNjaGVtYUFjY2Vzc29yKCdwbGFjZWhvbGRlcicsIHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0pLFxuXG4gICAgYXV0b2NvbXBsZXRlOiBnZXRTY2hlbWFBY2Nlc3NvcignYXV0b2NvbXBsZXRlJywge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSksXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBldmVudHMoKSB7XG4gICAgICBjb25zdCB7IG9uRm9jdXMsIG9uQmx1ciwgb25JbnB1dCwgb25DaGFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7IG9uRm9jdXMsIG9uQmx1ciwgb25JbnB1dCwgb25DaGFuZ2UgfVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBuYXRpdmVGaWVsZCwgdGV4dEZpZWxkIH0gPSB0aGlzLiRvcHRpb25zXG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXZlbnRzLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuXG4gICAgICBpZiAobmF0aXZlRmllbGQpIHtcbiAgICAgICAgYXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lXG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy50aXRsZSA9IHRoaXMubGFiZWxcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seVxuICAgICAgICBhdHRyaWJ1dGVzLmF1dG9mb2N1cyA9IHRoaXMuYXV0b2ZvY3VzXG4gICAgICAgIGlmICh0ZXh0RmllbGQpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlclxuICAgICAgICAgIGF0dHJpYnV0ZXMuYXV0b2NvbXBsZXRlID0gdGhpcy5hdXRvY29tcGxldGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICB2YWxpZGF0aW9ucygpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0geyAuLi50aGlzLmdldFZhbGlkYXRpb25zKCkgfVxuICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmVxdWlyZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgZGVmYXVsdCBydWxlcyBhbmQgYWRkIGFueSBuZXcgb25lczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLnJ1bGVzIHx8IHt9KSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1trZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH0sXG5cbiAgICBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhcmFibGUgJiYgdGhpcy52YWx1ZSAhPSBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICB0aGlzLnNldHVwU2NoZW1hRmllbGRzKClcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBQcmV2ZW50IHVubmVzdGVkIHR5cGUgY29tcG9uZW50cyBmcm9tIG92ZXJyaWRpbmcgcGFyZW50IGRhdGEgcGF0aHNcbiAgICAgIGlmICh0aGlzLm5lc3RlZCkge1xuICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJDb21wb25lbnQodGhpcywgYWRkKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBnZXRWYWxpZGF0aW9ucygpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGZvY3VzRWxlbWVudCgpIHtcbiAgICAgIGNvbnN0IFtlbGVtZW50XSA9IGFzQXJyYXkodGhpcy4kcmVmcy5lbGVtZW50KVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKVxuICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkLCBgZm9jdXMoKWAgd2lsbCBsaWtlbHkgbm90IGhhdmUgdGhlXG4gICAgICAgICAgLy8gZGVzaXJlZCBlZmZlY3QuIFVzZSBgc2Nyb2xsSW50b1ZpZXcoKWAgaWYgYXZhaWxhYmxlOlxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICA7KGVsZW1lbnQuJGVsIHx8IGVsZW1lbnQpLnNjcm9sbEludG9WaWV3Py4oKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAvLyBBbHNvIGZvY3VzIHRoaXMgY29tcG9uZW50J3Mgc2NoZW1hIGFuZCBwYW5lbCBpbiBjYXNlIGl0J3MgYSB0YWIuXG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5mb2N1cygpXG4gICAgICB0aGlzLnRhYkNvbXBvbmVudD8uZm9jdXMoKVxuICAgICAgdGhpcy5mb2N1c0VsZW1lbnQoKVxuICAgIH0sXG5cbiAgICBjbGVhcigpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsXG4gICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICB9LFxuXG4gICAgb25Gb2N1cygpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWVcbiAgICAgIHRoaXMubWFya1RvdWNoZWQoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2ZvY3VzJylcbiAgICB9LFxuXG4gICAgb25CbHVyKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2VcbiAgICAgIHRoaXMudmFsaWRhdGUoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2JsdXInKVxuICAgIH0sXG5cbiAgICBvbklucHV0KCkge1xuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICB0aGlzLm1hcmtEaXJ0eSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnY2hhbmdlJywge1xuICAgICAgICBjb250ZXh0OlxuICAgICAgICAgIHRoaXMucGFyc2VkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHZhbHVlOiB0aGlzLnBhcnNlZFZhbHVlIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgLy8gUGFzcyBgc2NoZW1hQ29tcG9uZW50YCBhcyBwYXJlbnQsIHNvIGNoYW5nZSBldmVudHMgY2FuIHByb3BhZ2F0ZSB1cC5cbiAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHVpZE1hcCA9IG5ldyBXZWFrTWFwKClcblxuLy8gR2VuZXJhdGVkIGFuZCByZW1lbWJlcnMgdW5pcXVlIGlkcyBwZXIgcGFzc2VkIG9iamVjdCB1c2luZyBhIHdlYWsgbWFwLlxubGV0IHVpZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQob2JqZWN0LCBpdGVtSWQpIHtcbiAgbGV0IGlkID0gdWlkTWFwLmdldChvYmplY3QpXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGl0ZW1JZCB8fCBgQCR7Kyt1aWR9YFxuICAgIHVpZE1hcC5zZXQob2JqZWN0LCBpZClcbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsImltcG9ydCB7IGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIGFzQXJyYXksXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xuXG4vLyBTY2hlbWFHcmFwaCBpcyBhIGNsYXNzIHRvIGNvbGxlY3Qgc2NoZW1hIGdyYXBoIG1ldGEgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG9cbi8vIHByb2Nlc3Mgc291cmNlcyBhbmQgcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0cyAnc2VydmVyJyBhbmQgJ2NsaXBib2FyZCcsXG4vLyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbi8vXG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VydmVyICAgIHwgY2xpcGJvYXJkIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiBmYWxzZSAgICAgICAgICAgfCBrZWVwIGlkICAgfCBrZWVwIGlkICAgfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogdHJ1ZSAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVmLCAjcmVmIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUsIHRlbXBvcmFyeSB8IHJlZiwgI3JlZiB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiBmYWxzZSAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZW1vdmUgaWQgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UsIHRlbXBvcmFyeSAgIHwgcmVmLCAjaWQgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IHRydWUgICAgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI2lkICB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlLCB0ZW1wb3JhcnkgICAgfCByZWYsICNpZCAgfCByZWYsICNpZCAgfFxuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcblxuZXhwb3J0IGNsYXNzIFNjaGVtYUdyYXBoIHtcbiAgZ3JhcGggPSB7fVxuICByZWZlcmVuY2VzID0ge31cblxuICBzZXQoZGF0YVBhdGgsIHNldHRpbmdzLCBkZWZhdWx0cykge1xuICAgIGRhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICBsZXQgc3ViR3JhcGggPSB0aGlzLmdyYXBoXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRhdGFQYXRoKSB7XG4gICAgICBjb25zdCBrZXkgPSBpc0ludGVnZXIoK3BhcnQpID8gJyonIDogcGFydFxuICAgICAgc3ViR3JhcGggPSBzdWJHcmFwaFtrZXldID8/PSB7fVxuICAgIH1cbiAgICBzdWJHcmFwaC4kc2V0dGluZ3MgPSB7XG4gICAgICAuLi5kZWZhdWx0cywgLy8gU2VlIGBhZGRTb3VyY2UoZGF0YVBhdGgpYFxuICAgICAgLi4uc3ViR3JhcGguJHNldHRpbmdzLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9XG4gIH1cblxuICBhZGRTb3VyY2UoZGF0YVBhdGgsIHNjaGVtYSkge1xuICAgIC8vIE9ubHkgc2V0IGByZWxhdGVkOiBmYWxzZWAgdGhyb3VnaCB0aGUgZGVmYXVsdHMsIGFzIGBzZXRTb3VyY2VSZWxhdGVkKClgXG4gICAgLy8gbWF5IGJlIGNhbGxlZCBiZWZvcmUgYGFkZFNvdXJjZSgpYCwgZGVwZW5kaW5nIG9uIHRoZSBncmFwaCBzdHJ1Y3R1cmUuXG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHsgdHlwZTogJ3NvdXJjZScsIHNjaGVtYSB9LCB7IHJlbGF0ZWQ6IGZhbHNlIH0pXG4gIH1cblxuICBzZXRTb3VyY2VSZWxhdGVkKGRhdGFQYXRoKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHJlbGF0ZWQ6IHRydWUsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBhZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICB0aGlzLnNldChkYXRhUGF0aCwge1xuICAgICAgdHlwZTogJ3JlbGF0aW9uJyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGludGVybmFsOiAhIXJlbGF0ZWREYXRhUGF0aCxcbiAgICAgIHJlZmVyZW5jZTogdGhpcy5nZXRSZWZlcmVuY2VQcmVmaXgocmVsYXRlZERhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBnZXRSZWZlcmVuY2VQcmVmaXgoZGF0YVBhdGgpIHtcbiAgICByZXR1cm4gZGF0YVBhdGhcbiAgICAgID8gKHRoaXMucmVmZXJlbmNlc1tkYXRhUGF0aF0gPz89IG5hbm9pZCg2KSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBmbGF0dGVuID0gZ3JhcGggPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHsgJHNldHRpbmdzLCAuLi5zdWJHcmFwaCB9XSBvZiBPYmplY3QuZW50cmllcyhncmFwaCkpIHtcbiAgICAgICAgaWYgKCRzZXR0aW5ncykge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCAkc2V0dGluZ3NdKVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc2V0dGluZ3NdIG9mIGZsYXR0ZW4oc3ViR3JhcGgpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtgJHtrZXl9LyR7c3ViS2V5fWAsIHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbih0aGlzLmdyYXBoKVxuICB9XG5cbiAgcHJvY2Vzcyhzb3VyY2VTY2hlbWEsIGRhdGEsIHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBjbGlwYm9hcmQgPSB0YXJnZXQgPT09ICdjbGlwYm9hcmQnXG4gICAgaWYgKGNsaXBib2FyZCkge1xuICAgICAgZGVsZXRlIGRhdGFbc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBzZXR0aW5nc10gb2YgdGhpcy5mbGF0dGVuKCkpIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2NoZW1hLCBpbnRlcm5hbCwgcmVsYXRlZCwgcmVmZXJlbmNlIH0gPSBzZXR0aW5nc1xuICAgICAgY29uc3Qgc291cmNlID0gdHlwZSA9PT0gJ3NvdXJjZSdcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdHlwZSA9PT0gJ3JlbGF0aW9uJ1xuICAgICAgaWYgKHNvdXJjZSB8fCByZWxhdGlvbiAmJiBpbnRlcm5hbCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoZGF0YSwgZGF0YVBhdGgsICgpID0+IG51bGwpXG4gICAgICAgIGNvbnN0IHJlbW92ZUlkID0gY2xpcGJvYXJkICYmIHNvdXJjZSAmJiAhcmVsYXRlZFxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IChcbiAgICAgICAgICBjbGlwYm9hcmQgJiYgKFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgaW50ZXJuYWwgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiByZWxhdGVkXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXNBcnJheSh2YWx1ZXMpLmZsYXQoKSkge1xuICAgICAgICAgIGNvbnN0IGlkS2V5ID0gKFxuICAgICAgICAgICAgc291cmNlICYmIHNjaGVtYS5pZEtleSB8fFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgc2NoZW1hLnJlbGF0ZUJ5IHx8XG4gICAgICAgICAgICAnaWQnXG4gICAgICAgICAgKVxuICAgICAgICAgIGxldCBpZCA9IHZhbHVlPy5baWRLZXldXG4gICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChyZW1vdmVJZCkge1xuICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbaWRLZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlSWQgfHwgaXNUZW1wb3JhcnlJZChpZCkpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBpZC5zbGljZSgxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlZktleSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gLy8gQ2xpcGJvYXJkIGp1c3QgbmVlZHMgdGVtcG9yYXJ5IGlkcyB1bmRlciB0aGUgYWN0dWFsIGBpZEtleWBcbiAgICAgICAgICAgICAgICAgIGlkS2V5XG4gICAgICAgICAgICAgICAgOiAvLyBTZXJ2ZXIgd2FudHMgT2JqZWN0aW9uLXN0eWxlICcjaWQnIC8gJyNyZWYnIHBhaXJzLlxuICAgICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICAgICAgICA/ICcjaWQnXG4gICAgICAgICAgICAgICAgICA6ICcjcmVmJ1xuICAgICAgICAgICAgICBjb25zdCByZXZWYWx1ZSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gYEAke2lkfWBcbiAgICAgICAgICAgICAgICA6IC8vIEtlZXAgdGhlIGlkcyB1bmlxdWUgaW4gcmVmZXJlbmNlIGdyb3Vwcywgc2luY2UgdGhleVxuICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFjcm9zcyB0aGUgZnVsbCBncmFwaC5cbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgPyBgJHtyZWZlcmVuY2V9LSR7aWR9YFxuICAgICAgICAgICAgICAgICAgOiBpZCAvLyBBIHRlbXBvcmFyeSBpZCB3aXRob3V0IGEgcmVsYXRlZCwganVzdCBwcmVzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgdmFsdWVbcmVmS2V5XSA9IHJldlZhbHVlXG4gICAgICAgICAgICAgIGlmIChyZWZLZXkgIT09IGlkS2V5KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RpdG9NaXhpbi5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IGdldFVpZCB9IGZyb20gJy4vdWlkLmpzJ1xuaW1wb3J0IHsgU2NoZW1hR3JhcGggfSBmcm9tICcuL1NjaGVtYUdyYXBoLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgaXNNb2R1bGUsXG4gIGNsb25lLFxuICBtZXJnZSxcbiAgY2FtZWxpemUsXG4gIG1hcENvbmN1cnJlbnRseVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbWFya1JhdyB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgdHlwZUNvbXBvbmVudHMgPSB7fVxuY29uc3QgdW5rbm93blR5cGVSZXBvcnRlZCA9IHt9XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR5cGVDb21wb25lbnQodHlwZSwgY29tcG9uZW50KSB7XG4gIHR5cGVDb21wb25lbnRzW3R5cGVdID0gY29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29tcG9uZW50KHR5cGUsIGFsbG93TnVsbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHR5cGVDb21wb25lbnRzW3R5cGVdIHx8IG51bGxcbiAgaWYgKCFjb21wb25lbnQgJiYgIWFsbG93TnVsbCAmJiAhdW5rbm93blR5cGVSZXBvcnRlZFt0eXBlXSkge1xuICAgIC8vIFJlcG9ydCBlYWNoIG1pc3NpbmcgdHlwZSBvbmx5IG9uY2UsIHRvIGF2b2lkIGZsb29kaW5nIHRoZSBjb25zb2xlOlxuICAgIHVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0gPSB0cnVlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERpdG8gY29tcG9uZW50IHR5cGU6ICcke3R5cGV9J2ApXG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hcywgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChpc1NpbmdsZUNvbXBvbmVudFZpZXcoc2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzID0gY2FsbGJhY2soc2NoZW1hLmNvbXBvbmVudCwgc2NoZW1hLm5hbWUsIDApXG4gICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5jb21wb25lbnRzIHx8IHt9KSkge1xuICAgICAgICBjb25zdCByZXMgPSBjYWxsYmFjayhjb21wb25lbnQsIG5hbWUsIDEpXG4gICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gc2NoZW1hXG4gICAgPyBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhbc2NoZW1hLCAuLi5nZXRBbGxUYWJTY2hlbWFzKHNjaGVtYSldLCBjYWxsYmFjaylcbiAgICA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyBjb21wb25lbnQgOiB1bmRlZmluZWQpXG4gICAgKSB8fCBudWxsXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWVTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdHJ1ZSA6IHVuZGVmaW5lZClcbiAgICApID09PSB0cnVlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5U2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IHVuZGVmaW5lZCA6IGZhbHNlKVxuICAgICkgIT09IGZhbHNlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBpc1N0cmluZyhzY2hlbWEudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICdmb3JtJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3ZpZXcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhYihzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd0YWInXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3BhbmVsJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5uYW1lIHx8IHNjaGVtYS5sYWJlbCB8fCBzY2hlbWEudHlwZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHVud3JhcE1vZHVsZSA9IGZhbHNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBuYW1lID0ga2V5c1swXVxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFbbmFtZV1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIHNjaGVtYS5uYW1lID0gbmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFzKFxuICB1bnJlc29sdmVkU2NoZW1hcyxcbiAgcmVzb2x2ZUl0ZW0gPSByZXNvbHZlU2NoZW1hXG4pIHtcbiAgbGV0IHNjaGVtYXMgPSBpc0Z1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWFzKVxuICAgID8gdW5yZXNvbHZlZFNjaGVtYXMoKVxuICAgIDogdW5yZXNvbHZlZFNjaGVtYXNcbiAgc2NoZW1hcyA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hcywgZmFsc2UpXG4gIGlmIChpc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgLy8gVHJhbnNsYXRlIGFuIGFycmF5IG9mIGR5bmFtaWMgaW1wb3J0LCBlYWNoIGltcG9ydGluZyBvbmUgbmFtZWQgc2NoZW1hXG4gICAgLy8gbW9kdWxlIHRvIGFuIG9iamVjdCB3aXRoIG5hbWVkIGVudHJpZXMuXG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW3NjaGVtYS5uYW1lLCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2NoZW1hcykpIHtcbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgYXN5bmMgKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBzY2hlbWFzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSkge1xuICAvLyBSZXNvbHZlcyBhc3luYyBzY2hlbWEgY29tcG9uZW50cyBhbmQgYWRkcyBEaXRvTWl4aW4gYW5kIFR5cGVNaXhpbiB0byB0aGVtLlxuICBsZXQgeyBjb21wb25lbnQgfSA9IHNjaGVtYVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShjb21wb25lbnQsIHRydWUpXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gUHJldmVudCB3YXJuaW5nOiBcIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlXG4gICAgICAvLyBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGRcbiAgICAgIC8vIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgXCI6XG4gICAgICBzY2hlbWEuY29tcG9uZW50ID0gbWFya1Jhdyh7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgbWl4aW5zOiBbRGl0b01peGluLCBUeXBlTWl4aW4sIC4uLihjb21wb25lbnQubWl4aW5zIHx8IFtdKV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzKSB7XG4gIC8vIGBzY2hlbWFzYCBhcmUgb2YgdGhlIHNhbWUgcG9zc2libGUgZm9ybXMgYXMgcGFzc2VkIHRvIGBnZXROYW1lZFNjaGVtYXMoKWBcbiAgYXdhaXQgbWFwQ29uY3VycmVudGx5KE9iamVjdC52YWx1ZXMoc2NoZW1hcyB8fCB7fSksIHJlc29sdmVTY2hlbWFDb21wb25lbnQpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbCkge1xuICBjb25zdCBwcm9taXNlcyA9IFtdXG4gIGNvbnN0IHByb2Nlc3MgPSAoY29tcG9uZW50LCBuYW1lLCByZWxhdGl2ZUxldmVsKSA9PiB7XG4gICAgcHJvbWlzZXMucHVzaChcbiAgICAgIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoXG4gICAgICAgIGFwaSxcbiAgICAgICAgY29tcG9uZW50LFxuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGxldmVsICsgcmVsYXRpdmVMZXZlbFxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKHNjaGVtYSwgcHJvY2VzcylcbiAgaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoZ2V0QWxsUGFuZWxTY2hlbWFzKHNjaGVtYSksIHByb2Nlc3MpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50KGFwaSwgc2NoZW1hLCBuYW1lLCByb3V0ZXMsIGxldmVsKSB7XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcblxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLy8gQWxzbyBwcm9jZXNzIG5lc3RlZCBwYW5lbCBzY2hlbWFzLlxuICAgIG1hcENvbmN1cnJlbnRseShnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSwgcGFuZWwgPT5cbiAgICAgIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgcGFuZWwsIHJvdXRlcywgbGV2ZWwpXG4gICAgKSxcbiAgICAvLyBEZWxlZ2F0ZSBzY2hlbWEgcHJvY2Vzc2luZyB0byB0aGUgYWN0dWFsIHR5cGUgY29tcG9uZW50cy5cbiAgICBhd2FpdCBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5wcm9jZXNzU2NoZW1hPy4oXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWxcbiAgICApXG4gIF0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhjb21wb25lbnQsIGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIGlmICghaXNWaWV3KHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmlldyBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIGNoaWxkcmVuLCAwKVxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAvJHtzY2hlbWEucGF0aH1gLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudCxcbiAgICBtZXRhOiB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSkge1xuICBsZXQgZGVmYXVsdHMgPSBhcGkuZGVmYXVsdHNbc2NoZW1hLnR5cGVdXG4gIGlmIChkZWZhdWx0cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGRlZmF1bHRzKSkge1xuICAgICAgZGVmYXVsdHMgPSBkZWZhdWx0cyhzY2hlbWEpXG4gICAgfVxuICAgIGlmIChpc09iamVjdChkZWZhdWx0cykpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzKSkge1xuICAgICAgICBpZiAoc2NoZW1hW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2hlbWFba2V5XSA9IG1lcmdlKHZhbHVlLCBzY2hlbWFba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1JvdXRlU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIC8vIFVzZWQgZm9yIHZpZXcgYW5kIHNvdXJjZSBzY2hlbWFzLCBzZWUgU291cmNlTWl4aW4uXG4gIHNjaGVtYS5uYW1lID0gbmFtZVxuICBzY2hlbWEucGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGgobmFtZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGb3JtcyhhcGksIHNjaGVtYSwgbGV2ZWwpIHtcbiAgLy8gRmlyc3QgcmVzb2x2ZSB0aGUgZm9ybXMgYW5kIHN0b3JlIHRoZSByZXN1bHRzIGJhY2sgb24gdGhlIHNjaGVtYS5cbiAgbGV0IHsgZm9ybSwgZm9ybXMsIGNvbXBvbmVudHMgfSA9IHNjaGVtYVxuICBpZiAoZm9ybXMpIHtcbiAgICBmb3JtcyA9IHNjaGVtYS5mb3JtcyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKGZvcm1zLCBmb3JtID0+XG4gICAgICBwcm9jZXNzRm9ybShhcGksIGZvcm0pXG4gICAgKVxuICB9IGVsc2UgaWYgKGZvcm0pIHtcbiAgICBmb3JtID0gc2NoZW1hLmZvcm0gPSBhd2FpdCBwcm9jZXNzRm9ybShhcGksIGZvcm0pXG4gIH0gZWxzZSBpZiAoY29tcG9uZW50cykge1xuICAgIC8vIE5PVEU6IFByb2Nlc3NpbmcgZm9ybXMgaW4gY29tcHV0ZWQgY29tcG9uZW50cyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBpdFxuICAgIC8vIG9ubHkgY2FuIGJlIGNvbXB1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggYWN0dWFsIGRhdGEuXG4gICAgaWYgKGlzT2JqZWN0KGNvbXBvbmVudHMpKSB7XG4gICAgICBmb3JtID0geyBjb21wb25lbnRzIH1cbiAgICB9XG4gIH1cblxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH0gLy8gT25seSB1c2VkIGZvciBwcm9jZXNzIGxvb3AgYmVsb3cuXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgZm9yIChjb25zdCBmb3JtIG9mIE9iamVjdC52YWx1ZXMoZm9ybXMpKSB7XG4gICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBmb3JtLCBjaGlsZHJlbiwgbGV2ZWwpXG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRm9ybShhcGksIHNjaGVtYSkge1xuICBzY2hlbWEgPSBhd2FpdCByZXNvbHZlU2NoZW1hKHNjaGVtYSwgdHJ1ZSlcbiAgaWYgKCFpc0Zvcm0oc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmb3JtIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NUYWIoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNUYWIoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWIgc2NoZW1hOiAnJHtnZXRTY2hlbWFJZGVudGlmaWVyKHNjaGVtYSl9J2ApXG4gIH1cbiAgcHJvY2Vzc0RlZmF1bHRzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzUGFuZWwoYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNQYW5lbChzY2hlbWEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhbmVsIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU5lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpIHtcbiAgY29uc3QgeyB0YWJzLCBwYW5lbHMgfSA9IHNjaGVtYVxuICBpZiAodGFicykge1xuICAgIHNjaGVtYS50YWJzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICB0YWJzLFxuICAgICAgdGFiID0+IHByb2Nlc3NUYWIoYXBpLCB0YWIpXG4gICAgKVxuICB9XG4gIGlmIChwYW5lbHMpIHtcbiAgICBzY2hlbWEucGFuZWxzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXMoXG4gICAgICBwYW5lbHMsXG4gICAgICBwYW5lbCA9PiBwcm9jZXNzUGFuZWwoYXBpLCBwYW5lbClcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zvcm1TY2hlbWEoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgYm90aCBzaW5nbGUgZm9ybSBhbmQgbXVsdGlwbGUgZm9ybXMgbm90YXRpb24sIGFzIHdlbGwgYXMgaW5saW5lZFxuICAvLyBjb21wb25lbnRzLlxuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBpc09iamVjdChzY2hlbWEuZm9ybSB8fCBzY2hlbWEuZm9ybXMgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc011bHRpcGxlRm9ybVNjaGVtYXMoc2NoZW1hKSB7XG4gIHJldHVybiAoXG4gICAgaXNTY2hlbWEoc2NoZW1hKSAmJlxuICAgIE9iamVjdC5rZXlzKHNjaGVtYT8uZm9ybXMgfHwge30pLmxlbmd0aCA+IDFcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaW5nbGVDb21wb25lbnRWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzVmlldyhzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmNvbXBvbmVudClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgdmlldyB9ID0gc2NoZW1hXG4gIGNvbnN0IHZpZXdTY2hlbWEgPSB2aWV3ICYmIGNvbnRleHQudmlld3Nbdmlld11cbiAgcmV0dXJuIHZpZXdTY2hlbWFcbiAgICA/IC8vIE5PVEU6IFZpZXdzIGNhbiBoYXZlIHRhYnMsIGluIHdoaWNoIGNhc2UgdGhlIHZpZXcgY29tcG9uZW50IGlzIG5lc3RlZFxuICAgICAgLy8gaW4gb25lIG9mIHRoZSB0YWJzLCBnbyBmaW5kIGl0LlxuICAgICAgZmluZFNjaGVtYUNvbXBvbmVudCh2aWV3U2NoZW1hLCBoYXNGb3JtU2NoZW1hKSB8fCBudWxsXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dCkge1xuICByZXR1cm4gZ2V0Vmlld0Zvcm1TY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICAgID8gY29udGV4dC52aWV3c1tzY2hlbWEudmlld11cbiAgICA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdFZGl0UGF0aChzY2hlbWEsIGNvbnRleHQpIHtcbiAgY29uc3QgdmlldyA9IGdldFZpZXdTY2hlbWEoc2NoZW1hLCBjb250ZXh0KVxuICByZXR1cm4gdmlld1xuICAgID8gaXNTaW5nbGVDb21wb25lbnRWaWV3KHZpZXcpXG4gICAgICA/IGAvJHt2aWV3LnBhdGh9YFxuICAgICAgOiBgLyR7dmlldy5wYXRofS8ke3ZpZXcucGF0aH1gXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQsIG1vZGlmeUZvcm0pIHtcbiAgY29uc3Qgdmlld1NjaGVtYSA9IGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgaWYgKHZpZXdTY2hlbWEpIHtcbiAgICBzY2hlbWEgPSB2aWV3U2NoZW1hXG4gIH0gZWxzZSBpZiAoc2NoZW1hLnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmlldzogJyR7c2NoZW1hLnZpZXd9J2ApXG4gIH1cblxuICBsZXQgeyBmb3JtLCBmb3JtcywgY29tcG9uZW50cywgY29tcGFjdCB9ID0gc2NoZW1hXG4gIGlmICghZm9ybSAmJiAhZm9ybXMpIHtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgLy8gQ29udmVydCBpbmxpbmVkIGNvbXBvbmVudHMgdG8gZm9ybXMsIHN1cHBvcnRpbmcgYGNvbXBhY3RgIHNldHRpbmcuXG4gICAgICBmb3JtID0geyBjb21wb25lbnRzLCBjb21wYWN0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYGZvcm1zYCwgYGZvcm1gIG9yIGBjb21wb25lbnRzYCwgcmV0dXJuIGFuZCBlbXB0eSBgZm9ybXNgIG9iamVjdC5cbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmb3JtcykubWFwKChbdHlwZSwgZm9ybV0pID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYHNjaGVtYS5jb21wb25lbnRzYCBjYWxsYmFja3MgdG8gY3JlYXRlIGNvbXBvbmVudHMgb24gdGhlIGZseS5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKGZvcm0uY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9ybSA9IHtcbiAgICAgICAgICAuLi5mb3JtLFxuICAgICAgICAgIGNvbXBvbmVudHM6IGZvcm0uY29tcG9uZW50cyhjb250ZXh0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gW3R5cGUsIG1vZGlmeUZvcm0/Lihmb3JtKSA/PyBmb3JtXVxuICAgIH0pXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zKGZvcm1zLCBpdGVtKSB7XG4gIHJldHVybiBmb3Jtc1tpdGVtPy50eXBlXSB8fCBmb3Jtcy5kZWZhdWx0IHx8IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dCkge1xuICByZXR1cm4gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZ2V0Rm9ybVNjaGVtYXMoc2NoZW1hLCBjb250ZXh0KSwgaXRlbSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0xhYmVsKHNjaGVtYSkge1xuICByZXR1cm4gc2NoZW1hLmxhYmVsICE9PSBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYWN0KHNjaGVtYSkge1xuICByZXR1cm4gISFzY2hlbWEuY29tcGFjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmVkKHNjaGVtYSkge1xuICByZXR1cm4gISEoc2NoZW1hLmlubGluZWQgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5uZXN0ZWQgfHwgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdE5lc3RlZCA9PT0gdHJ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZE9taXRQYWRkaW5nKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5vbWl0UGFkZGluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSkge1xuICAvLyBTdXBwb3J0IGRlZmF1bHQgdmFsdWVzIGJvdGggb24gc2NoZW1hIGFuZCBvbiBjb21wb25lbnQgbGV2ZWwuXG4gIC8vIE5PVEU6IEF0IHRoZSB0aW1lIG9mIGNyZWF0aW9uLCBjb21wb25lbnRzIG1heSBub3QgYmUgaW5zdGFudGlhdGVkLCAoZS5nLiBpZlxuICAvLyBlbnRyaWVzIGFyZSBjcmVhdGVkIHRocm91Z2ggbmVzdGVkIGZvcm1zLCB0aGUgcGFyZW50IGZvcm0gaXNuJ3QgbW91bnRlZCkgc29cbiAgLy8gd2UgY2FuJ3QgdXNlIGBkYXRhUGF0aGAgdG8gZ2V0IHRvIGNvbXBvbmVudHMsIGFuZCB0aGUgYGRlZmF1bHRWYWx1ZWAgZnJvbVxuICAvLyB0aGVyZS4gVGhhdCdzIHdoeSBgZGVmYXVsdFZhbHVlYCBpcyBkZWZpbmVkIHN0YXRpY2FsbHkgaW4gdGhlIGNvbXBvbmVudHM6XG4gIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHNjaGVtYS5kZWZhdWx0XG4gIGNvbnN0IHZhbHVlID1cbiAgICBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZWZhdWx0VmFsdWVcbiAgICAgIDogZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdFZhbHVlXG4gIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgID8gdmFsdWUoc2NoZW1hKVxuICAgIDogY2xvbmUodmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSB7XG4gIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuICByZXR1cm4gISEoXG4gICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fCB0eXBlT3B0aW9ucz8uaWdub3JlTWlzc2luZ1ZhbHVlPy4oc2NoZW1hKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNMYWJlbHMoc2NoZW1hKSB7XG4gIGNvbnN0IGNoZWNrQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT5cbiAgICBPYmplY3QudmFsdWVzKGNvbXBvbmVudHMgfHwge30pLnNvbWUoaGFzTGFiZWwpXG5cbiAgcmV0dXJuIChcbiAgICBjaGVja0NvbXBvbmVudHMoc2NoZW1hLmNvbXBvbmVudHMpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhzY2hlbWEudGFicyB8fCB7fSkuc29tZShjaGVja0NvbXBvbmVudHMpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCBkYXRhID0ge30sIGNvbXBvbmVudCkge1xuICBjb25zdCBvcHRpb25zID0geyBjb21wb25lbnQsIHJvb3REYXRhOiBkYXRhIH1cblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSkgPT4ge1xuICAgIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIWlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpKSB7XG4gICAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSlcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHVwIGEgZGF0YSBvYmplY3QgdGhhdCBoYXMga2V5cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGxcbiAgLy8gZm9ybSBmaWVsZHMsIHNvIHRoZXkgY2FuIGJlIGNvcnJlY3RseSB3YXRjaGVkIGZvciBjaGFuZ2VzLlxuICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgbnVsbCxcbiAgICBvcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCA9IG51bGwsXG4gIHJvb3REYXRhID0gY29tcG9uZW50Py5yb290RGF0YVxufSA9IHt9KSB7XG4gIGNvbnN0IHsgY29tcHV0ZSB9ID0gc2NoZW1hXG4gIGlmIChjb21wdXRlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21wdXRlKFxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC8vIE92ZXJyaWRlIHZhbHVlIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gdGhyb3VnaCBjYWxsaW5nIHRoZVxuICAgICAgICAvLyBnZXR0ZXIgZm9yIGB0aGlzLnZhbHVlYCBpbiBgRGl0b0NvbnRleHRgOlxuICAgICAgICB2YWx1ZTogZGF0YVtuYW1lXSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhXG4gICAgICB9KVxuICAgIClcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWNjZXNzIGBkYXRhW25hbWVdYCBkaXJlY3RseSBpbnN0ZWFkIG9mIGB0aGlzLnZhbHVlID0g4oCmYCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyB2YWx1ZSB3aXRob3V0IGNhbGxpbmcgcGFyc2UoKTpcbiAgICAgIGRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICAvLyBJZiB0aGUgdmFsdWUgaXMgc3RpbGwgbWlzc2luZyBhZnRlciBjb21wdXRlLCBzZXQgdGhlIGRlZmF1bHQgZm9yIGl0OlxuICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgIGRhdGFbbmFtZV0gPSBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKVxuICB9XG4gIC8vIE5vdyBhY2Nlc3MgdGhlIHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcmVhY3Rpdml0eSBhbmQgbmVlZHMgdG9cbiAgLy8gaGFwcGVuIGFmdGVyIGFsbCBwcmlvciBtYW5pcHVsYXRpb24gb2YgYGRhdGFbbmFtZV1gLCBzZWUgYWJvdmU6XG4gIHJldHVybiBkYXRhW25hbWVdXG59XG5cbmZ1bmN0aW9uIGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc2NoZW1hT25seSkge1xuICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgIGNvbnN0IHsgaWRLZXkgPSAnaWQnLCBvcmRlcktleSB9ID0gc291cmNlU2NoZW1hXG4gICAgY29uc3QgaWQgPSBpdGVtW2lkS2V5XVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3B5W2lkS2V5XSA9IGlkXG4gICAgfVxuICAgIC8vIENvcHkgb3ZlciB0eXBlIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgIGlmIChoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNvdXJjZVNjaGVtYSkpIHtcbiAgICAgIGNvcHkudHlwZSA9IGl0ZW0udHlwZVxuICAgIH1cbiAgICBpZiAob3JkZXJLZXkpIHtcbiAgICAgIGNvcHlbb3JkZXJLZXldID0gaXRlbVtvcmRlcktleV1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoc2NoZW1hLCBzb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCxcbiAgc2NoZW1hT25seSwgLy8gd2hldGhlciB0byBvbmx5IGluY2x1ZGUgZGF0YSBjb3ZlcmVkIGJ5IHRoZSBzY2hlbWEsIG9yIGFsbCBkYXRhXG4gIHRhcmdldFxufSA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7IGNvbXBvbmVudCwgc2NoZW1hT25seSwgdGFyZ2V0LCByb290RGF0YTogZGF0YSB9XG4gIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBkYXRhLCBvcHRpb25zKVxuICBjb25zdCBncmFwaCA9IG5ldyBTY2hlbWFHcmFwaCgpXG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBwcm9jZXNzZWREYXRhKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY29tcHV0ZVZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIG9wdGlvbnMpXG4gICAgLy8gVGhlIHNjaGVtYSBleHBlY3RzIHRoZSBgd3JhcFByaW1pdGl2ZXNgIHRyYW5zZm9ybWF0aW9ucyB0byBiZSBwcmVzZW50IG9uXG4gICAgLy8gdGhlIGRhdGEgdGhhdCBpdCBpcyBhcHBsaWVkIG9uLCBzbyB3YXJwIGJlZm9yZSBhbmQgdW53cmFwIGFmdGVyLlxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcywgb3JkZXJLZXksIGlkS2V5ID0gJ2lkJyB9ID0gc2NoZW1hXG4gICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgICBbd3JhcFByaW1pdGl2ZXNdOiBlbnRyeVxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFsd2F5cyBzaGFsbG93LWNsb25lIGFycmF5IHZhbHVlczpcbiAgICAgICAgdmFsdWUgPSBbLi4udmFsdWVdXG4gICAgICB9XG4gICAgICBpZiAob3JkZXJLZXkgJiYgdGFyZ2V0ID09PSAnY2xpcGJvYXJkJykge1xuICAgICAgICAvLyBTb3J0IHRoZSBkYXRhIGJhY2sgaW50byB0aGUgbmF0dXJhbCBzZXF1ZW5jZSBhcyBkZWZpbmVkIGJ5IHRoZWlyIGlkcyxcbiAgICAgICAgLy8gc28gY29weS1wYXN0aW5nIGJldHdlZW4gc2VydmVycyAoZS5nLiBuZXN0ZWQgZm9udC1jdXRzIG9uIExpbmV0bylcbiAgICAgICAgLy8gbmF0dXJhbGx5IGdldHMgbWFwcGVkIHRvIHRoZSBzYW1lIGVudHJpZXMgaW4gdGhlIGdyYXBoLlxuICAgICAgICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQxID0gYT8uW2lkS2V5XVxuICAgICAgICAgIGNvbnN0IGlkMiA9IGI/LltpZEtleV1cbiAgICAgICAgICByZXR1cm4gaWQxID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDEpXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogaWQyID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDIpXG4gICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgOiBpZDEgLSBpZDJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gIH1cblxuICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIGV4Y2x1ZGUsIHByb2Nlc3MgfSA9IHNjaGVtYVxuICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGFbbmFtZV1cblxuICAgIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuXG4gICAgLy8gTk9URTogV2UgZG9uJ3QgY2FjaGUgdGhpcyBjb250ZXh0LCBzaW5jZSBgdmFsdWVgIGlzIGNoYW5naW5nLlxuICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PlxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGEsXG4gICAgICAgIC8vIFBhc3MgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgdG8gYHByb2Nlc3MoKWAsIHNvIGl0IGNhbiBiZSBtb2RpZmllZFxuICAgICAgICAvLyB0aHJvdWdoIGBwcm9jZXNzZWRJdGVtYCBmcm9tIHRoZXJlLlxuICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICB9KVxuXG4gICAgLy8gRmlyc3QgdW53cmFwIHRoZSB3cmFwcGVkIHByaW1pdGl2ZXMgYWdhaW4sIHRvIGJyaW5nIHRoZSBkYXRhIGJhY2sgaW50b1xuICAgIC8vIGl0cyBuYXRpdmUgZm9ybS4gU2UgYHByb2Nlc3NCZWZvcmUoKWAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBpZiAod3JhcFByaW1pdGl2ZXMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKG9iamVjdCA9PiBvYmplY3Rbd3JhcFByaW1pdGl2ZXNdKVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdXNlcidzIGBwcm9jZXNzKClgIGNhbGxiYWNrIGZpcnN0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KCkpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fFxuICAgICAgLy8gU3VwcG9ydCBmdW5jdGlvbnMgbmV4dCB0byBib29sZWFucyBmb3IgYHNjaGVtYS5leGNsdWRlYDpcbiAgICAgIGV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgIGlzRnVuY3Rpb24oZXhjbHVkZSkgJiYgZXhjbHVkZShnZXRDb250ZXh0KCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzc2VkRGF0YVtuYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgICAvLyB0byBjb252ZXJ0IHRoZSBkYXRhIGZvciBzdG9yYWdlLlxuICAgICAgY29uc3QgcHJvY2Vzc1ZhbHVlID0gdHlwZU9wdGlvbnM/LnByb2Nlc3NWYWx1ZVxuICAgICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpXG4gICAgICB9XG4gICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICBzY2hlbWEsXG4gICAgZGF0YSxcbiAgICBkYXRhUGF0aCxcbiAgICBwcm9jZXNzZWREYXRhLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgcHJvY2Vzc0FmdGVyLFxuICAgIG9wdGlvbnNcbiAgKVxuXG4gIHJldHVybiBncmFwaC5wcm9jZXNzKHNvdXJjZVNjaGVtYSwgcHJvY2Vzc2VkRGF0YSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEYXRhKFxuICBzY2hlbWEsXG4gIGRhdGEsXG4gIGRhdGFQYXRoLFxuICBwcm9jZXNzZWREYXRhLFxuICBwcm9jZXNzQmVmb3JlLFxuICBwcm9jZXNzQWZ0ZXIsXG4gIG9wdGlvbnNcbikge1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT4ge1xuICAgIGNvbnN0IGdldERhdGFQYXRoID0gKGRhdGFQYXRoLCB0b2tlbikgPT5cbiAgICAgIGRhdGFQYXRoICE9IG51bGxcbiAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pXG4gICAgICAgIDogbnVsbFxuXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZChjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIHVubmVzdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RGF0YVBhdGggPSBnZXREYXRhUGF0aChkYXRhUGF0aCwgbmFtZSlcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NJdGVtID0gKGl0ZW0sIGluZGV4ID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPVxuICAgICAgICAgICAgICBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZ2V0RGF0YVBhdGgoY29tcG9uZW50RGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgICAgIDogY29tcG9uZW50RGF0YVBhdGhcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgZ2V0Rm9ybXMgPSAoXG4gICAgICAgICAgICAgIGdldFR5cGVPcHRpb25zKGNvbXBvbmVudFNjaGVtYSk/LmdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyB8fFxuICAgICAgICAgICAgICBnZXRGb3JtU2NoZW1hc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZm9ybXMgPSBnZXRGb3Jtcyhjb21wb25lbnRTY2hlbWEsIGNvbnRleHQpXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pXG4gICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtID0gcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgICAgICAgID8gY2xvbmVJdGVtKGNvbXBvbmVudFNjaGVtYSwgaXRlbSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSXRlbXMgd2l0aG91dCBmb3JtcyBzdGlsbCBnZXQgZnVsbHkgKGJ1dCBzaGFsbG93bHkpIGNsb25lZC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgb2YgdGhpcyBpcyBhY3R1YWxseSBuZWVkZWQgLyB1c2VkIGF0IGFsbD9cbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzc0JlZm9yZT8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgICAgbGV0IHZhbHVlID0gcHJvY2Vzc2VkRGF0YSA/IHByb2Nlc3NlZERhdGFbbmFtZV0gOiBkYXRhW25hbWVdXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaGFzRm9ybVNjaGVtYShjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGRhdGEgb24gbmVzdGVkIGZvcm0gaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBObyBuZWVkIHRvIGNvbGxlY3QgdmFsdWVzIGlmIHdlJ3JlIG5vdCBjbG9uaW5nIVxuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzSXRlbSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmZvckVhY2gocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NJdGVtKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3NBZnRlcj8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcG9uZW50cyhzY2hlbWEuY29tcG9uZW50cylcbiAgZm9yIChjb25zdCB0YWIgb2YgZ2V0QWxsVGFiU2NoZW1hcyhzY2hlbWEpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gIH1cbiAgZm9yIChjb25zdCBwYW5lbCBvZiBnZXRBbGxQYW5lbFNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHBhbmVsLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbEVudHJ5KHNjaGVtYSwgZGF0YVBhdGggPSBudWxsLCB0YWJDb21wb25lbnQgPSBudWxsKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBuYW1lLCBhcHBlbmQgaXQgdG8gdGhlIGRhdGFQYXRoLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZS5nLiBmb3IgJGZpbHRlcnMgcGFuZWxzLlxuICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICBkYXRhUGF0aCAhPSBudWxsICYmIHNjaGVtYS5uYW1lXG4gICAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzY2hlbWEubmFtZSlcbiAgICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyaWVzKFxuICBwYW5lbFNjaGVtYXMsXG4gIGRhdGFQYXRoID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbCxcbiAgcGFuZWxFbnRyaWVzID0gW11cbikge1xuICBpZiAocGFuZWxTY2hlbWFzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhbmVsU2NoZW1hcykpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZ2V0UGFuZWxFbnRyeShcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBkYXRhUGF0aCAhPSBudWxsID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGtleSkgOiBudWxsLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsVGFiU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8udGFicyA/IE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMpIDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFBhbmVsU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIGdldEFsbFBhbmVsRW50cmllcyhzY2hlbWEpLm1hcChlbnRyeSA9PiBlbnRyeS5zY2hlbWEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gIHNjaGVtYSxcbiAgZGF0YVBhdGggPSBudWxsLFxuICBzY2hlbWFDb21wb25lbnQgPSBudWxsLFxuICB0YWJDb21wb25lbnQgPSBudWxsXG4pIHtcbiAgY29uc3QgcGFuZWxTY2hlbWEgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5nZXRQYW5lbFNjaGVtYT8uKFxuICAgIHNjaGVtYSxcbiAgICBkYXRhUGF0aCxcbiAgICBzY2hlbWFDb21wb25lbnRcbiAgKVxuICBjb25zdCBwYW5lbEVudHJpZXMgPSBwYW5lbFNjaGVtYVxuICAgID8gW2dldFBhbmVsRW50cnkocGFuZWxTY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXVxuICAgIDogW11cbiAgLy8gQWxsb3cgZWFjaCBjb21wb25lbnQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiBwYW5lbHMsIGluXG4gIC8vIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IG9uZSAoZS5nLiBnZXRGaWx0ZXJzUGFuZWwoKSwgJGZpbHRlcnMpOlxuICBnZXRQYW5lbEVudHJpZXMoc2NoZW1hPy5wYW5lbHMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVsRW50cmllcylcbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdvYmplY3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdsaXN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICBjb25zdCBpZCA9IGl0ZW1bc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgLy8gVHJ5IHRvIHVzZSB0aGUgaXRlbSBpZCBhcyB0aGUgdWlkLCBmYWxsaW5nIGJhY2sgb24gYXV0by1nZW5lcmF0ZWQgaWRzLCBidXRcbiAgLy8gZWl0aGVyIHdheSwgcGFzcyB0aHJvdWdoIGBnZXRVaWQoKWAgc28gdGhhdCB0aGUgaWRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGl0ZW0gdGhyb3VnaCBhIHdlYWsgbWFwLCBhcyB0aGUgaWRzIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaW4gYHByb2Nlc3NEYXRhKClgXG4gIC8vIHdoaWxlIHRoZSBjb21wb25lbnRzIHRoYXQgdXNlIHRoZSB1aWRzIGFzIGtleSBhcmUgc3RpbGwgdmlzaWJsZS5cbiAgcmV0dXJuIGdldFVpZChpdGVtLCBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSlcbn1cbiIsIi8vIEEgbWluaS1yZXBsaWNhdGlvbiBvZiB2dWUncyBpbnRlcm5hbCBgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoKWAgYnV0IG9ubHlcbi8vIGhhbmRsaW5nIG91ciBvd24gYWRkZWQgb3B0aW9ucyBwcm9wZXJ0aWVzIGFuZCBtZXJnaW5nIHRoZW0gZWFybHkgaW5zdGVhZFxuLy8gb2YgbGF6aWx5LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMob3B0aW9ucykge1xuICBjb25zdCB7IG1peGlucyB9ID0gb3B0aW9uc1xuICByZXR1cm4gbWl4aW5zIHx8IG9wdGlvbnMuZXh0ZW5kc1xuICAgID8gbWVyZ2VPcHRpb25zKFxuICAgICAgICB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIDogb3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmIChmcm9tLmV4dGVuZHMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGZyb20uZXh0ZW5kcylcbiAgfVxuICBpZiAoZnJvbS5taXhpbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1peGluIG9mIGZyb20ubWl4aW5zKSB7XG4gICAgICBtZXJnZU9wdGlvbnModG8sIG1peGluKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBkaXRvT3B0aW9uS2V5cykge1xuICAgIGlmIChrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuY29uc3QgZGl0b09wdGlvbktleXMgPSBbXG4gICdkZWZhdWx0VmFsdWUnLFxuICAnZGVmYXVsdE5lc3RlZCcsXG4gICdkZWZhdWx0VmlzaWJsZScsXG4gICdnZW5lcmF0ZUxhYmVsJyxcbiAgJ2V4Y2x1ZGVWYWx1ZScsXG4gICdpZ25vcmVNaXNzaW5nVmFsdWUnLFxuICAnb21pdFBhZGRpbmcnLFxuICAncHJvY2Vzc1ZhbHVlJyxcbiAgJ3Byb2Nlc3NTY2hlbWEnLFxuICAnZ2V0UGFuZWxTY2hlbWEnLFxuICAnZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nJyxcbiAgLy8gVnVlIDMgLyBWdWUtcm91dGVyIDQgZm9yZ2V0cyB0aGVzZS5cbiAgLy8gVE9ETzogQ3JlYXRlIGJ1Zy1yZXBvcnQ/XG4gICdiZWZvcmVSb3V0ZVVwZGF0ZScsXG4gICdiZWZvcmVSb3V0ZUxlYXZlJ1xuXVxuIiwiaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlTWVyZ2VkT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvb3B0aW9ucy5qcydcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCBjb21wb25lbnRzID0ge31cblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGl0b01peGluXSxcbiAgLy8gTWFrZSBzdXJlIHRoYXQgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFyZSBwcmVzZW50IGluIGFsbCBEaXRvQ29tcG9uZW50LlxuICBjb21wb25lbnRzLFxuXG4gIGNvbXBvbmVudChuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgIGRlZmluaXRpb24gPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyh7XG4gICAgICAgICAgZXh0ZW5kczogdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIC4uLmRlZmluaXRpb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICAgIGlmICghKG5hbWUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIG5vdCByZWdpc3RlcmVkYClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VHlwZUNvbXBvbmVudFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvVXNlciB7XG4gIGhhc1JvbGUoLi4ucm9sZXMpIHtcbiAgICBpZiAodGhpcy5yb2xlcykge1xuICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFDb21wb25lbnRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1haW5TY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzWzBdXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYERpdG9TY2hlbWEuY3JlYXRlZCgpL3VubW91bnRlZCgpYCBvbiBpdHNcbiAgICAvLyBgJHNjaGVtYVBhcmVudENvbXBvbmVudGAsIGlmIHRoZSBwYXJlbnQgdXNlcyB0aGUgYFNjaGVtYVBhcmVudE1peGluYDpcbiAgICBfcmVnaXN0ZXJTY2hlbWFDb21wb25lbnQoc2NoZW1hQ29tcG9uZW50LCBhZGQpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBzY2hlbWFDb21wb25lbnRzLnB1c2goc2NoZW1hQ29tcG9uZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5zcGxpY2Uoc2NoZW1hQ29tcG9uZW50cy5pbmRleE9mKHNjaGVtYUNvbXBvbmVudCksIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2NoZW1hUGFyZW50TWl4aW4gZnJvbSAnLi9TY2hlbWFQYXJlbnRNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQsIHsgZXJyb3JzIH0pID0+XG4gICAgICAgICAgZXJyb3JzICYmIHJlc3VsdCA/IHJlc3VsdC5jb25jYXQoZXJyb3JzKSA6IGVycm9ycyxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChcbiAgICAgICAgaXQgPT4gaXQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cylcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRDb21tb25QcmVmaXggfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBFYWNoIHJvdXRlLWNvbXBvbmVudCBkZWZpbmVzIGEgc3RvcmUgdGhhdCBnZXRzIHBhc3NlZCBvbiB0byBpdHNcbiAgICAgIC8vIGNoaWxkIGNvbXBvbmVudHMsIHNvIHRoZXkgY2FuIHN0b3JlIHZhbHVlcyBpbiB0aGVtIHRoYXQgbGl2ZSBiZXlvbmRcbiAgICAgIC8vIHRoZWlyIGxpZmUtY3ljbGUuIFNlZTogRGl0b1BhbmUsIFNvdXJjZU1peGluXG4gICAgICBzdG9yZToge30sXG4gICAgICBsb2FkQ2FjaGU6IHt9IC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyByb3V0ZUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcm91dGVMZXZlbCgpIHtcbiAgICAgIGxldCBsZXZlbCA9IDBcbiAgICAgIGxldCByb3V0ZUNvbXBvbmVudCA9IHRoaXNcbiAgICAgIHdoaWxlICgocm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudC5wYXJlbnRDb21wb25lbnQucm91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQubWV0YVxuICAgIH0sXG5cbiAgICBwYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVQYXRoKHRoaXMucm91dGVSZWNvcmQucGF0aClcbiAgICB9LFxuXG4gICAgbGFiZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYigpIHtcbiAgICAgIGNvbnN0IHsgYnJlYWRjcnVtYiB9ID0gdGhpcy5zY2hlbWEgfHwge31cbiAgICAgIHJldHVybiBicmVhZGNydW1iIHx8IGAke3RoaXMuYnJlYWRjcnVtYlByZWZpeH0gJHt0aGlzLmxhYmVsfWBcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH0sXG5cbiAgICBwYXJhbSgpIHtcbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHZ1ZS1yb3V0ZXIgbm90IGJlaW5nIGFibGUgdG8gbWFwIG11bHRpcGxlIHVybCBwYXJhbWV0ZXJzXG4gICAgICAvLyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gbXVsdGlwbGUgY29tcG9uZW50cywgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzEzNDVcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXJhbXNbdGhpcy5tZXRhPy5wYXJhbV0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGUsIHNlZSBEaXRvRm9ybVxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlUm91dGVVcGRhdGUodG8sIGZyb20sIG5leHQpIHtcbiAgICB0aGlzPy5iZWZvcmVSb3V0ZUNoYW5nZSh0bywgZnJvbSwgbmV4dClcbiAgfSxcblxuICBiZWZvcmVSb3V0ZUxlYXZlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcz8uYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpXG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICAvLyBLZWVwIGEgc2hhcmVkIHN0YWNrIG9mIHJvb3QgY29tcG9uZW50cyBmb3IgRGl0b1RyYWlsIHRvIHVzZSB0byByZW5kZXJcbiAgICAvLyBsYWJlbHMuIENhbid0IHJlbHkgb24gJHJvdXRlLm1hdGNoZWRbaV0uaW5zdGFuY2VzLmRlZmF1bHQgdW5mb3J0dW5hdGVseSxcbiAgICAvLyBhcyBpbnN0YW5jZXMgYXJlbid0IGltbWVkaWF0ZWx5IHJlYWR5LCBhbmQgaW5zdGFuY2VzIGlzIG5vdCByZWFjdGl2ZS5cbiAgICB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cy5wdXNoKHRoaXMpXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgcm91dGVDb21wb25lbnRzLnNwbGljZShyb3V0ZUNvbXBvbmVudHMuaW5kZXhPZih0aGlzKSwgMSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpIHtcbiAgICAgIGxldCBvayA9IHRydWVcbiAgICAgIGNvbnN0IGlzQ2xvc2luZyA9IChcbiAgICAgICAgLy8gT25seSBoYW5kbGUgdGhpcyByb3V0ZSBjaGFuZ2UgaWYgdGhlIGZvcm0gaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZVxuICAgICAgICAvLyBgZnJvbWAgcm91dGUsIGJ1dCBpbmNsdWRlIHBhcmVudCBmb3JtcyBvZiBjbG9zaW5nIG5lc3RlZCBmb3JtcyBhcyBhc1xuICAgICAgICAvLyB3ZWxsLCBieSBtYXRjaGluZyB0aGUgdGhlIHN0YXJ0IG9mIGZyb20vdG8gcGF0aCBhZ2FpbnN0IGB0aGlzLnBhdGhgOlxuICAgICAgICBmcm9tLnBhdGguc3RhcnRzV2l0aCh0aGlzLnBhdGgpICYmXG4gICAgICAgICF0by5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAvLyBFeGNsdWRlIGhhc2ggY2hhbmdlcyBvbmx5ICg9IHRhYiBjaGFuZ2VzKTpcbiAgICAgICAgZnJvbS5wYXRoICE9PSB0by5wYXRoICYmIChcbiAgICAgICAgICB0aGlzLmlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB8fFxuICAgICAgICAgIC8vIERlY2lkZSBpZiB3ZSdyZSBtb3ZpbmcgdG93YXJkcyBhIG5ldyBuZXN0ZWQgZm9ybSwgb3IgY2xvc2luZyAvXG4gICAgICAgICAgLy8gcmVwbGFjaW5nIGFuIGFscmVhZHkgb3BlbiBvbmUgYnkgY29tcGFyaW5nIHBhdGggbGVuZ3Rocy5cbiAgICAgICAgICAvLyBUaGUgY2FzZSBvZiBgPWAgbWF0Y2hlcyB0aGUgcmVwbGFjaW5nIG9mIGFuIGFscmVhZHkgb3BlbiBvbmUuXG4gICAgICAgICAgdG8ucGF0aC5sZW5ndGggPD0gZnJvbS5wYXRoLmxlbmd0aFxuICAgICAgICApXG4gICAgICApXG4gICAgICBpZiAoaXNDbG9zaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBGb3IgYWN0aXZlIGRpcmVjdGx5IG11dGF0aW5nIChuZXN0ZWQpIGZvcm1zIHRoYXQgd2VyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgICAgLy8geWV0LCB2YWxpZGF0ZSB0aGVtIG9uY2UuIElmIHRoZSB1c2VyIHRoZW4gc3RpbGwgd2FudHMgdG8gbGVhdmVcbiAgICAgICAgICAvLyB0aGVtLCB0aGV5IGNhbiBjbGljayBjbG9zZSAvIG5hdmlnYXRlIGF3YXkgYWdhaW4uXG4gICAgICAgICAgb2sgPSAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWRhdGVkIHx8XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlQWxsKClcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlIGZvcm0gZG9lc24ndCBkaXJlY3RseSBtdXRhdGUgZGF0YS4gSWYgaXQgaXMgZGlydHksIGFzayBpZiB1c2VyXG4gICAgICAgICAgLy8gd2FudHMgdG8gcGVyc2lzdCBkYXRhIGZpcnN0LlxuICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIG9rID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgICAgIGBZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIERvIHlvdSByZWFsbHkgd2FudCB0byAke1xuICAgICAgICAgICAgICAgIHRoaXMudmVyYnMuY2FuY2VsXG4gICAgICAgICAgICAgIH0/YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dChvaylcbiAgICB9LFxuXG4gICAgZ2V0Um91dGVQYXRoKHRlbXBsYXRlUGF0aCkge1xuICAgICAgLy8gTWFwcyB0aGUgcm91dGUncyBhY3R1YWwgcGF0aCB0byB0aGUgbWF0Y2hlZCByb3V0ZXMgYnkgY291bnRpbmcgaXRzXG4gICAgICAvLyBwYXJ0cyBzZXBhcmF0ZWQgYnkgJy8nLCBzcGxpdHRpbmcgdGhlIHBhdGggaW50byB0aGUgbWFwcGVkIHBhcnRzXG4gICAgICAvLyBjb250YWluaW5nIGFjdHVhbCBwYXJhbWV0ZXJzLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhdGhcbiAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgLnNsaWNlKDAsIHRlbXBsYXRlUGF0aC5zcGxpdCgnLycpLmxlbmd0aClcbiAgICAgICAgLmpvaW4oJy8nKVxuICAgIH0sXG5cbiAgICBnZXRDaGlsZFBhdGgocGF0aCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucGF0aH0vJHtwYXRofWBcbiAgICB9LFxuXG4gICAgaXNGdWxsUm91dGVDaGFuZ2UodG8sIGZyb20pIHtcbiAgICAgIC8vIFRoZSByb3V0ZSBwYXRoIGlzIHRoZSBwYXRoIHVwIHRvIHRoZSBmaXJzdCAvIChleGNsdWRpbmcgdGhlIGluaXRpYWwgLyk6XG4gICAgICBjb25zdCByb290UGF0aCA9IHRoaXMucGF0aC5tYXRjaCgvXihcXC9bXi9dKikvKVsxXVxuICAgICAgcmV0dXJuICFnZXRDb21tb25QcmVmaXgodG8ucGF0aCwgZnJvbS5wYXRoKS5zdGFydHNXaXRoKHJvb3RQYXRoKVxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRlbXBsYXRlKFxuICB2LWlmPVwidXNlclwiXG4pXG4gIC8vLSBPbmx5IHJlbmRlciBEaXRvVmlldyB3aGVuIGl0IGlzIGFjdGl2ZSwgb3RoZXJ3aXNlIGEgbm9ybWFsIHJvdXRlci12aWV3XG4gIC8vLSBpbnN0ZWFkLCB0byBuZXN0IGZ1cnRoZXIgcm91dGUgY29tcG9uZW50cy5cbiAgLy8tIE5PVEU6IFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhhbmRsaW5nIGluIERpdG9Gb3JtLCB3aGVyZSBgdi1zaG93YCBpc1xuICAvLy0gdXNlZCB0byBhbHdheXMgcmVuZGVyIGZvcm1zIGV2ZW4gd2hlbiBvdGhlciBuZXN0ZWQgZm9ybXMgYXJlIHByZXNlbnQuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiFpc0xhc3RSb3V0ZVwiXG4gICAgOmtleT1cIm5hbWVcIlxuICApXG4gIC5kaXRvLXZpZXcuZGl0by1zY3JvbGwtcGFyZW50KFxuICAgIHYtZWxzZS1pZj1cInNob3VsZFJlbmRlcih2aWV3U2NoZW1hKVwiXG4gICAgOmRhdGEtcmVzb3VyY2U9XCJzb3VyY2VTY2hlbWEucGF0aFwiXG4gIClcbiAgICBEaXRvU2NoZW1hLmRpdG8tc2Nyb2xsKFxuICAgICAgOnNjaGVtYT1cInZpZXdTY2hlbWFcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKG5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJmYWxzZVwiXG4gICAgICA6bWVudUhlYWRlcj1cInRydWVcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJvdXRlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1JvdXRlTWl4aW4uanMnXG5pbXBvcnQgeyBzb21lU2NoZW1hQ29tcG9uZW50LCBpc1NpbmdsZUNvbXBvbmVudFZpZXcgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBoYXNSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9WaWV3Jywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluXSxcblxuICBwcm92aWRlKCkge1xuICAgIC8vIFJlZGlyZWN0ICRzb3VyY2VDb21wb25lbnQgYW5kICRyZXNvdXJjZUNvbXBvbmVudCB0byB0aGUgbWFpbiBjb21wb25lbnQ6XG4gICAgcmV0dXJuIHtcbiAgICAgICRzb3VyY2VDb21wb25lbnQ6ICgpID0+IHRoaXMubWFpbkNvbXBvbmVudD8uc291cmNlQ29tcG9uZW50IHx8IG51bGwsXG4gICAgICAkcmVzb3VyY2VDb21wb25lbnQ6ICgpID0+IHRoaXMubWFpbkNvbXBvbmVudD8ucmVzb3VyY2VDb21wb25lbnQgfHwgbnVsbFxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBVcGRhdGVkIGZyb20gTG9hZGluZ01peGluIHRocm91Z2ggYHNldExvYWRpbmcoaXNMb2FkaW5nKWA6XG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgLy8gTk9URTogRGF0YSBpcyBzaGFyZWQgYWNyb3NzIGFsbCB2aWV3cyBiZWNhdXNlIHRoZSByb3V0ZXIgcmVjeWNsZXMgdGhlXG4gICAgICAvLyBEaXRvVmlldyBjb21wb25lbnQuXG4gICAgICBkYXRhOiB7fVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEuc2NoZW1hXG4gICAgfSxcblxuICAgIG5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEubmFtZVxuICAgIH0sXG5cbiAgICBpc1ZpZXcoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBpc1NpbmdsZUNvbXBvbmVudFZpZXcoKSB7XG4gICAgICByZXR1cm4gaXNTaW5nbGVDb21wb25lbnRWaWV3KHRoaXMuc2NoZW1hKVxuICAgIH0sXG5cbiAgICBtYWluQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWFpblNjaGVtYUNvbXBvbmVudC5nZXRDb21wb25lbnRCeURhdGFQYXRoKHRoaXMubmFtZSlcbiAgICB9LFxuXG4gICAgdmlld1NjaGVtYSgpIHtcbiAgICAgIGNvbnN0IHsgY29tcG9uZW50LCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAvLyBUcmFuc2xhdGUgc2luZ2xlLWNvbXBvbmVudCBzY2hlbWFzIGludG8gbXVsdGktY29tcG9uZW50IHNjaGVtYXMsXG4gICAgICAvLyBzbyB0aGV5IGNhbiBiZSByZW5kZXJlZCBkaXJlY3RseSB0aHJvdWdoIERpdG9TY2hlbWEgYWxzbzpcbiAgICAgIHJldHVybiB0aGlzLmlzU2luZ2xlQ29tcG9uZW50Vmlld1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgW3NjaGVtYS5uYW1lXToge1xuICAgICAgICAgICAgICAgIG5hbWU6IHNjaGVtYS5uYW1lLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiBzY2hlbWFcbiAgICB9LFxuXG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgcmV0dXJuIHNvbWVTY2hlbWFDb21wb25lbnQodGhpcy52aWV3U2NoZW1hLCBoYXNSZXNvdXJjZSlcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICAkcm91dGUodG8sIGZyb20pIHtcbiAgICAgIC8vIFNlZSBpZiB0aGUgcm91dGUgY2hhbmdlcyBjb21wbGV0ZWx5LCBhbmQgY2xlYXIgdGhlIGRhdGEgaWYgaXQgZG9lcy5cbiAgICAgIGlmICh0aGlzLmlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGF0YSA9IHt9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRQYXRoKHBhdGgpIHtcbiAgICAgIC8vIExpc3RzIGluc2lkZSBzaW5nbGUtY29tcG9uZW50IHZpZXdzIHVzZSB0aGUgdmlldydzIHBhdGggZm9yIHN1Yi1wYXRoczpcbiAgICAgIHJldHVybiB0aGlzLmlzU2luZ2xlQ29tcG9uZW50Vmlld1xuICAgICAgICA/IHRoaXMucGF0aFxuICAgICAgICA6IGAke3RoaXMucGF0aH0vJHtwYXRofWBcbiAgICB9LFxuXG4gICAgc2V0TG9hZGluZyhpc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gISFpc0xvYWRpbmdcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0ZShkYXRlLCB7XG4gIHllYXIgPSBkYXRlPy5nZXRGdWxsWWVhcigpID8/IDAsXG4gIG1vbnRoID0gZGF0ZT8uZ2V0TW9udGgoKSA/PyAwLFxuICBkYXkgPSBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgaG91ciA9IGRhdGU/LmdldEhvdXJzKCkgPz8gMCxcbiAgbWludXRlID0gZGF0ZT8uZ2V0TWludXRlcygpID8/IDAsXG4gIHNlY29uZCA9IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICBtaWxsaXNlY29uZCA9IGRhdGU/LmdldE1pbGxpc2Vjb25kcygpID8/IDBcbn0gPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERhdGUoZGF0ZSkge1xuICByZXR1cm4gaXNEYXRlKGRhdGUpID8gZGF0ZSA6IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGxcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY2FsZW5kYXJcbiAgLmRpdG8tY2FsZW5kYXItcG9wdXBcbiAgICAuZGl0by1jYWxlbmRhci1pbm5lclxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ2RheSdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IDEgfSkgfX1cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtbW9udGgoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ21vbnRoJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IG1vbnRoOiAxIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIndlZWtkYXkgaW4gd2Vla2RheU5hbWVzXCJcbiAgICAgICAgICAgICkge3sgd2Vla2RheS5zaG9ydCB9fVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLWRhdGVzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cImRhdGUgaW4gZGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZGF0ZS5zdGF0ZSAmJiBgZGl0by1jYWxlbmRhci1pdGVtLSR7ZGF0ZS5zdGF0ZX1gXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShkYXRlLmRhdGUsIGRhdGUuc3RhdGUsIHRydWUpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZS50ZXh0IH19XG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWZvb3RlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtdG9kYXkoXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImRhdGVUb1N0cmluZyhuZXcgRGF0ZSgpLCB7IHllYXI6IDEsIG1vbnRoOiAxLCBkYXk6IDEgfSlcIlxuICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0RGF0ZShuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgKVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAnbW9udGgnXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiAxIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1tb250aHNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiKG1vbnRoLCBpbmRleCkgaW4gbW9udGhOYW1lc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldE1vbnRoQ2xhc3MoaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0TW9udGgoaW5kZXgpXCJcbiAgICAgICAgICAgICkge3sgbW9udGguc2hvcnQgfX1cbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ3llYXInXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhbiB7eyBkZWNhZGVUb1N0cmluZyhjdXJyZW50VmFsdWUpIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBEZWNhZGUoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXllYXJzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cInllYXIgaW4geWVhclJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0WWVhckNsYXNzKHllYXIpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICApIHt7IHllYXIgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgbW9kZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkYXknIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgd2Vla2RheU5hbWVzLCBtb250aE5hbWVzIH0gPSBnZXRMb2NhbGVOYW1lcyh0aGlzLmxvY2FsZSlcbiAgICByZXR1cm4ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lcyxcbiAgICAgIGRhdGVSYW5nZTogW10sXG4gICAgICB5ZWFyUmFuZ2U6IFtdLFxuICAgICAgY3VycmVudFZhbHVlOiAoXG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSB8fFxuICAgICAgICAvLyBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdXNlIGN1cnJlbnQgZGF0ZSBidXQgY2xlYXIgdGltZSBmaWVsZHM6XG4gICAgICAgIGNvcHlEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudFZhbHVlLCBvdmVycmlkZXMpXG4gICAgfSxcblxuICAgIHN0ZXBEZWNhZGUoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiAxMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2V0TW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH0sXG5cbiAgICBzdGVwTW9udGgoc3RlcCkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgeWVhciwgbW9udGggfSA9IHRoaXMuZ2V0WWVhck1vbnRoKFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwXG4gICAgICApXG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5OiBNYXRoLm1pbihcbiAgICAgICAgICB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXREYXRlKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc3RlcFllYXIoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdERhdGUoZGF0ZSwgc3RhdGUsIGNvcHkgPSBmYWxzZSkge1xuICAgICAgaWYgKHN0YXRlICE9PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXk6IGRhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHRoaXMuY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZWxlY3RNb250aChtb250aCkge1xuICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgLy8gU2V0IGRheSB0byAxIHRvIGF2b2lkIHNlbGVjdGluZyBhIGRhdGUgdGhhdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZVxuICAgICAgLy8gbmV3IG1vbnRoLCBlLmcuIEZlYiAzMSAtPiBNYXIgMy5cbiAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoLCBkYXk6IDEgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0WWVhcih5ZWFyKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXIgfSlcbiAgICB9LFxuXG4gICAgZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICB5ZWFyKytcbiAgICAgICAgbW9udGggPSAwXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuICAgICAgICB5ZWFyLS1cbiAgICAgICAgbW9udGggPSAxMVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGggfVxuICAgIH0sXG5cbiAgICBkYXRlVG9TdHJpbmcoZGF0ZSwgeyB5ZWFyLCBtb250aCwgZGF5IH0pIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IGhvciwgdmVyLCBlbnRlciB9KSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRNb2RlLCBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChob3IgfHwgdmVyKSB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgZGF5OiBjdXJyZW50VmFsdWUuZ2V0RGF0ZSgpICsgaG9yICsgdmVyICogN1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgaG9yICsgdmVyICogNlxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICAgICAgICB5ZWFyOiBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIGhvciArIHZlciAqIDVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudE1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdkYXknKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVEYXRlUmFuZ2UoKSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZSA9IFtdXG4gICAgICB0aGlzLnllYXJSYW5nZSA9IFtdXG5cbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB5ZWFyID0gY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgIGNvbnN0IG1vbnRoID0gY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIGNvbnN0IHN0YXJ0WWVhciA9IHRoaXMuZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcilcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICB0aGlzLnllYXJSYW5nZS5wdXNoKHN0YXJ0WWVhciArIGkpXG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyTW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgbGV0IGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuICAgICAgICBmaXJzdERheVdlZWsgPSA3XG4gICAgICB9XG4gICAgICBjb25zdCBudW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aClcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoXG4gICAgICAgICAgcHJldk1vbnRoLnllYXIsXG4gICAgICAgICAgcHJldk1vbnRoLm1vbnRoXG4gICAgICAgIClcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaXJzdERheVdlZWs7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRheSA9IHByZXZNb250aE51bURheXMgLSBmaXJzdERheVdlZWsgKyBpICsgMVxuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShwcmV2TW9udGgueWVhciwgcHJldk1vbnRoLm1vbnRoLCBkYXkpXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBkYXksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZGlzYWJsZWREYXRlKGRhdGUpID8gJ2Rpc2FibGVkJyA6ICdncmF5J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1EYXlzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKVxuICAgICAgICBjb25zdCBpc0RheSA9IGRhdGUgPT4gKFxuICAgICAgICAgIGRhdGUgJiZcbiAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gaSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGhcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzRGF5KHRoaXMubW9kZWxWYWx1ZSlcbiAgICAgICAgICA/ICdhY3RpdmUnXG4gICAgICAgICAgOiBpc0RheSh0b2RheSlcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogMTAwMDtcbn1cblxuLmRpdG8tY2FsZW5kYXItYm9keSB7XG4gIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA3KTtcbiAgICBoZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IGNhbGMoI3skaW5wdXQtaGVpZ2h0fSAtIDJweCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS10b2RheSB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSB7XG4gICAgJixcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1kaXNhYmxlZCxcbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1ncmF5IHtcbiAgICBjb2xvcjogIzk5OTk5OTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1tb250aHMsXG4uZGl0by1jYWxlbmRhci15ZWFycyB7XG4gIHNwYW4ge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLyA0KTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyA1KTtcbn1cblxuLmRpdG8tY2FsZW5kYXIgYSxcbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW4sXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciBzcGFuIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gIGEge1xuICAgIHBhZGRpbmc6IDAgMC4yZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyOm5vdCg6aG92ZXIpIC5kaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCB7XG4gIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzIHNwYW4ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlcixcbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIEBleHRlbmQgJWlucHV0LWhlaWdodDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogJGJvcmRlci1zdHlsZTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgPiBzcGFuIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMCAwLjVlbTtcbiAgfVxuXG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LFxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNSU7XG4gIG1pbi13aWR0aDogMmVtO1xuICBtYXgtd2lkdGg6IDNlbTtcblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLknO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCqyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLonO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCuyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc2VsZWN0LXRvZGF5IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICdOb3cnO1xuICB9XG59XG48L3N0eWxlPlxuIiwiZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50cyh0YXJnZXQsIGV2ZW50cykge1xuICBmb3IgKGNvbnN0IHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRzW3R5cGVdLCBmYWxzZSlcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRzW3R5cGVdLCBmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleShldmVudCkge1xuICByZXR1cm4ge1xuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJyxcbiAgICAxMzogJ2VudGVyJ1xuICB9W2V2ZW50LmtleUNvZGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KSB7XG4gIGNvbnN0IGtleSA9IGdldEtleShldmVudClcbiAgcmV0dXJuIHtcbiAgICBob3I6IHsgbGVmdDogLTEsIHJpZ2h0OiAxIH1ba2V5XSB8fCAwLFxuICAgIHZlcjogeyB1cDogLTEsIGRvd246IDEgfVtrZXldIHx8IDAsXG4gICAgZW50ZXI6IGtleSA9PT0gJ2VudGVyJ1xuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1pZj1cImFsd2F5c1Nob3dcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2NsaWNrJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2ZvY3VzJyB8fCB0cmlnZ2VyID09PSAnYWx3YXlzJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgVHJhbnNpdGlvbig6bmFtZT1cInRyYW5zaXRpb25cIilcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1lbHNlXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpzaG93J10sXG5cbiAgcHJvcHM6IHtcbiAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2NsaWNrJyB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbScgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3VzdG9tQ2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgekluZGV4OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIGtlZXBJblZpZXc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGhpZGVXaGVuQ2xpY2tPdXRzaWRlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBhbHdheXNTaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY292ZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBoaWRlRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIHBvcHVwUGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyaWdnZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXRyaWdnZXItZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBvcHVwQ2xhc3MoKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICBbYGRpdG8tcG9wdXAtJHtoeXBoZW5hdGUodGhpcy5wbGFjZW1lbnQpfWBdOiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgICBjbGFzc2VzW3RoaXMuY3VzdG9tQ2xhc3NdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgcG9wdXBTdHlsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpJbmRleCA/IGB6LWluZGV4OiAke3RoaXMuekluZGV4fWAgOiAnJ1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93IHx8IHRoaXMuYWx3YXlzU2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgICAgaWYgKHRvKSB7XG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRyaWdnZXIucXVlcnlTZWxlY3RvcignaW5wdXQsIHRleHRhcmVhJylcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50cyA9IGFkZEV2ZW50cyh0YXJnZXQsIHtcbiAgICAgICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhpZGVXaGVuQ2xpY2tPdXRzaWRlICYmICF0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIC8vIFVzZSAnbW91c2V1cCcgaW5zdGVhZCBvZiAnY2xpY2snLCBzaW5jZSBjbGljayBhcHBlYXJzIHRvIGhhcHBlbiBhZnRlclxuICAgICAgLy8gdGhlIERPTSBpbnNpZGUgb2YgcG9wdXBzIGNvdWxkIGNoYW5nZSBpbiBhIHdheSBzbyB0aGF0IHRoZSBjaGVja1xuICAgICAgLy8gYHBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgIHdvdWxkIGZhaWw6XG4gICAgICB0aGlzLmNsb3NlRXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgJiZcbiAgICAgICAgICAgICFwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdHJpZ2dlci5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zaG93UG9wdXAgPSB0aGlzLnNob3dcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IG51bGxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcodGhpcy50YXJnZXQpXG4gICAgICAgID8gdGhpcy4kcmVmc1t0aGlzLnRhcmdldF1cbiAgICAgICAgOiB0aGlzLnRhcmdldFxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgICAgY29uc3QgZWwgPSB0YXJnZXQgPT09IHBvcHVwID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gKHRhcmdldCB8fCB0cmlnZ2VyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuc2hvd1BvcHVwXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0XG4gIGlucHV0KFxuICAgIDppZD1cImlkXCJcbiAgICByZWY9XCJpbnB1dFwiXG4gICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgOnR5cGU9XCJ0eXBlXCJcbiAgICA6bmFtZT1cIm5hbWVcIlxuICAgIDp0aXRsZT1cInRpdGxlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOnJlYWRvbmx5PVwicmVhZG9ubHlcIlxuICAgIDphdXRvZm9jdXM9XCJhdXRvZm9jdXNcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICA6YXV0b2NvbXBsZXRlPVwiYXV0b2NvbXBsZXRlXCJcbiAgICA6YXJpYS1sYWJlbD1cInRpdGxlXCJcbiAgICB2LWJpbmQ9XCIkYXR0cnNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGF1dG9mb2N1czogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgICAvKlxuICAgIGNsZWFyYWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gICAgc3VmZml4SWNvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBwcmVmaXhJY29uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gICAgKi9cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIGhvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2l6ZSgpIHtcbiAgICAgIC8vIERldGVybWluZSBzaXplIGJhc2VkIG9uIG1pbiAmIG1heCBzZXR0aW5ncywgaWYgdGhleSdyZSBwcm92aWRlZC5cbiAgICAgIGNvbnN0IHsgc2l6ZSwgbWluLCBtYXggfSA9IHRoaXMuJGF0dHJzXG4gICAgICBjb25zdCBnZXRMZW5ndGggPSB2YWx1ZSA9PiAodmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAubGVuZ3RoIDogMClcbiAgICAgIHJldHVybiBzaXplIHx8IGdldExlbmd0aChtaW4pIHx8IGdldExlbmd0aChtYXgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5XG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJpbnB1dEZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiaW5wdXRGb2N1c2VkID0gZmFsc2VcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgIClcbiAgLy8gaWNvbih0eXBlPVwiY2FsZW5kYXJcIiA6Y29sb3I9XCJpY29uQ29sb3JcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGF0ZUZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+IGRlZmF1bHRGb3JtYXRzLmRhdGUgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgZGF0ZTogdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICAgIH0pIHx8ICcnXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoK2N1cnJlbnRWYWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gY29udHJhZGljdCB0aGUgYGN1cnJlbnRWYWx1ZSgpYCB3YXRjaGVyIGFib3ZlLlxuICAgICAgICAgIC8vICAgICAgIElzIHRoaXMgbmVlZGVkIGF0IGFsbD9cbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuY2FsZW5kYXI/Lm5hdmlnYXRlKGdldEtleU5hdmlnYXRpb24oZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICBtaW4td2lkdGg6IDEwZW07XG5cbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24pIHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDEwKVxuICAgIH1cbiAgKVxuICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcFxuICAgIGNvbnN0IHBlclRpY2sgPSBkaWZmZXJlbmNlIC8gZHVyYXRpb24gKiAxMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wICsgcGVyVGlja1xuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wID09PSB0bykgcmV0dXJuXG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMClcbiAgICB9KVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7XG4gIGlmIChmaWVsZC5jcmVhdGVUZXh0UmFuZ2UpIHtcbiAgICBjb25zdCByYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KVxuICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZClcbiAgICByYW5nZS5zZWxlY3QoKVxuICAgIGZpZWxkLmZvY3VzKClcbiAgfSBlbHNlIGlmIChmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGZpZWxkLmZvY3VzKClcbiAgICBmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZmllbGQpIHtcbiAgICBmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0XG4gICAgZmllbGQuc2VsZWN0aW9uRW5kID0gZW5kXG4gICAgZmllbGQuZm9jdXMoKVxuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJjbGlja1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcmVhZG9ubHlcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBzaG93UG9wdXAgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImlucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJpbnB1dEZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgKVxuICAgIC8vLSBpY29uKHR5cGU9XCJ0aW1lXCJcbiAgICAvLy0gOmNvbG9yPVwiZGlzYWJsZWQgPyAnI2JmYmZiZicgOiAodGV4dCA/ICcjNjY2JyA6ICcjYmZiZmJmJylcIlxuICAgIC8vLSApXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKFxuICAgICAgICAgIHJlZj1cImhvdXJcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAwXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKFxuICAgICAgICAgIHJlZj1cIm1pbnV0ZVwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDFcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQoXG4gICAgICAgICAgcmVmPVwic2Vjb25kXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMlwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBzY3JvbGxUbyB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbC5qcydcbmltcG9ydCB7IHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiAwLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlXG4gICAgICAgID8gYCR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5ob3VyKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLm1pbnV0ZSlcbiAgICAgICAgICB9OiR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5zZWNvbmQpXG4gICAgICAgICAgfWBcbiAgICAgICAgOiAnJ1xuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgY29weURhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoZGF0ZSkge1xuICAgICAgaWYgKCtkYXRlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBkYXRlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiAndXBkYXRlU2VsZWN0aW9uJyxcblxuICAgIHNlbGVjdGlvbjogJ3VwZGF0ZVNlbGVjdGlvbicsXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbigpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKDApXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlU2VsZWN0aW9uKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCB8fCBmb3JjZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IDMgKiB0aGlzLnNlbGVjdGlvblxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy4kcmVmcy5pbnB1dCwgc3RhcnQsIHN0YXJ0ICsgMikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChkdXJhdGlvbiA9IDEwMCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpblxuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC8gKHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyA2KVxuICAgICAgICAgIHNjcm9sbFRvKHRhcmdldCwgTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpLCBkdXJhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXVt0aGlzLnNlbGVjdGlvbl1cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCB7IGhvciwgdmVyLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgICAgaWYgKGhvcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb24gKyBob3JcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHZhbHVlIDwgMCA/IDIgOiB2YWx1ZSA+IDIgPyAwIDogdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICh2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbc2VsZWN0ZWRdICsgdmVyXG4gICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuJHJlZnNbc2VsZWN0ZWRdLmNoaWxkcmVuXG4gICAgICAgICAgdGhpc1tzZWxlY3RlZF0gPVxuICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgID8gdmFsdWUgKyBsZW5ndGhcbiAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBsZW5ndGhcbiAgICAgICAgICAgICAgICA/IHZhbHVlIC0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9yIHx8IHZlciB8fCBlbnRlcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRydWUpXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGl0by1pY29uLXRpbWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogN3B4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1waWNrZXJzKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZWhvbGRlciwgbG9jYWxlLCBkYXRlRm9ybWF0LCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImRhdGVGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImRhdGVGb2N1c2VkID0gZmFsc2VcIlxuICAgIClcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJ0aW1lRm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJ0aW1lRm9jdXNlZCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGVGb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiBkZWZhdWx0Rm9ybWF0cy5kYXRlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2N1c2VkIHx8IHRoaXMudGltZUZvY3VzZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShkYXRlKSB7XG4gICAgICBpZiAoK2RhdGUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGRhdGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmRhdGUuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5kYXRlLmJsdXIoKVxuICAgICAgdGhpcy4kcmVmcy50aW1lLmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gIC5kaXRvLXBpY2tlcnMge1xuICAgIEBleHRlbmQgJWlucHV0O1xuXG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtaW4td2lkdGg6IDYuOWVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgd2lkdGg6IDQwJTtcbiAgICBtaW4td2lkdGg6IDUuNGVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKDpjbGFzcz1cImBkaXRvLWljb24tJHtuYW1lfWBcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0jeyRuYW1lfSB7XG4gICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX1cbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtZWxzZVxuICAgICkgMFxuICAgIHwgLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwicGFnZSBpbiBwYWdlUmFuZ2VcIlxuICAgICAgOmNsYXNzPVwiZ2V0UGFnZUNsYXNzKHBhZ2UpXCJcbiAgICAgIDpkaXNhYmxlZD1cInBhZ2UuZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja1BhZ2UocGFnZSlcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJwYWdlLnRleHRcIlxuICAgICAgKSB7eyBwYWdlLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVJhbmdlOiBbXSxcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBudW1QYWdlczogMCxcbiAgICAgIGN1cnJlbnRQYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jdXJyZW50UGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMuY3VycmVudFBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB0b3RhbDogJ3VwZGF0ZVBhZ2VSYW5nZScsXG4gICAgc2hvd1ByZXY6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuICAgIHNob3dOZXh0OiAndXBkYXRlUGFnZVJhbmdlJyxcblxuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUocGFnZVNpemUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTaXplID0gcGFnZVNpemVcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2VTaXplKGN1cnJlbnRQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5udW1QYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gY3VycmVudFBhZ2VTaXplKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgICB0aGlzLmN1cnJlbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemVcbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGlja1BhZ2UocGFnZSkge1xuICAgICAgaWYgKHBhZ2UuaW5kZXggJiYgIXBhZ2UuZGlzYWJsZWQgJiYgcGFnZS5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZS5pbmRleFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYWdlQ2xhc3MocGFnZSkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBwYWdlLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKHBhZ2UudHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke3BhZ2UudHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHVwZGF0ZVBhZ2VSYW5nZSgpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCB0b3RhbCwgY3VycmVudFBhZ2VTaXplLCBjdXJyZW50UGFnZSB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG4gICAgICBjb25zdCBudW1QYWdlcyA9ICh0aGlzLm51bVBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsIC8gY3VycmVudFBhZ2VTaXplKSlcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdlUmFuZ2UgPSBbXVxuICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMucGFnZVJhbmdlID0gcGFnZVJhbmdlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSwgY29sb3IgMHMsIGJhY2tncm91bmQgMHMsIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cIiRhdHRyc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHsgY2hlY2tlZCwgZGlzYWJsZWQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNoZWNrZWQnOiBjaGVja2VkLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy4gYHJlbWAgaXMgbmVlZGVkIGJlY2F1c2Ugd2VcbiAgLy8gY2hhbmdlIGBmb250LXNpemVgIGluc2lkZSBgLmRpdG8tc3dpdGNoLWJ1dHRvbmBcbiAgLS1zd2l0Y2gtd2lkdGg6IDRyZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMnJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcywgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC8vIFNldCBmb250LXNpemUgdG8gaGVpZ2h0LCBzbyB3ZSBjYW4gdXNlIHdpZHRoL2hlaWdodCA9IDFlbSBmb3IgY2lyY2xlOlxuICAgIGZvbnQtc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC41ZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnaGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogJ2F1dG8nIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgIGhlaWdodDogMFxuICAgIH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmhlaWdodC1lbnRlci1hY3RpdmUsXG4uaGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IHNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5oZWlnaHQtZW50ZXItZnJvbSxcbi5oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYsIHdhdGNoLCBvblNjb3BlRGlzcG9zZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IGNyZWF0ZUZvY3VzVHJhcCB9IGZyb20gJ2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgdW5yZWZFbGVtZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcblxuY29uc3QgVXNlRm9jdXNUcmFwID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZUZvY3VzVHJhcFwiLFxuICBwcm9wczogW1wiYXNcIiwgXCJvcHRpb25zXCJdLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgbGV0IHRyYXA7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSAoKSA9PiB0cmFwICYmIHRyYXAuYWN0aXZhdGUoKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlID0gKCkgPT4gdHJhcCAmJiB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB3YXRjaChcbiAgICAgICgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGlmICghZWwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cmFwID0gY3JlYXRlRm9jdXNUcmFwKGVsLCBwcm9wcy5vcHRpb25zIHx8IHt9KTtcbiAgICAgICAgYWN0aXZhdGUoKTtcbiAgICAgIH0sXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICAgKTtcbiAgICBvblNjb3BlRGlzcG9zZSgoKSA9PiBkZWFjdGl2YXRlKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMuYXMgfHwgXCJkaXZcIiwgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KCkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VGb2N1c1RyYXAgfTtcbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kaWFsb2coXG4gIHJlZj1cImRpYWxvZ1wiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IGAke3NldHRpbmdzLndpZHRofXB4YCB9XCJcbiAgQG1vdXNldXA9XCJvbk1vdXNlVXBcIlxuKVxuICBVc2VGb2N1c1RyYXAuZGl0by1kaWFsb2dfX2ZvY3VzLXRyYXAoXG4gICAgOm9wdGlvbnM9XCJ7IGltbWVkaWF0ZTogdHJ1ZSwgZmFsbGJhY2tGb2N1czogKCkgPT4gJHJlZnMuZGlhbG9nIH1cIlxuICApXG4gICAgZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgICBAc3VibWl0LnByZXZlbnQ9XCJzdWJtaXRcIlxuICAgIClcbiAgICAgIERpdG9TY2hlbWEuZGl0by1zY3JvbGwoXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YT1cImRpYWxvZ0RhdGFcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IFVzZUZvY3VzVHJhcCB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZUZvY3VzVHJhcC9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RpYWxvZycsIHtcbiAgY29tcG9uZW50czogeyBVc2VGb2N1c1RyYXAgfSxcbiAgZW1pdHM6IFsncmVtb3ZlJ10sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIGNvbXBvbmVudHM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHByb21pc2U6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgIGNsaWNrVG9DbG9zZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gTWFrZSBzdXJlIGRpYWxvZyBkYXRhIGNvbnRhaW5zIGFsbCB0aGUgZXhwZWN0ZWQga2V5c1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSBjbG9uZSh0aGlzLmRhdGEpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZGlhbG9nRGF0YSkpIHtcbiAgICAgICAgZGlhbG9nRGF0YVtrZXldID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93RXZlbnRzOiBudWxsLFxuICAgICAgZGlhbG9nRGF0YVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50c1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZ2V0QnV0dG9uU2NoZW1hcyh0aGlzLmJ1dHRvbnMpKS5tYXAoXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYnV0dG9uIHNjaGVtYXMgdG8gYWRkIGRlZmF1bHQgY2xpY2sgZXZlbnRzXG4gICAgICAgICAgLy8gZm9yIGJvdGggJ3N1Ym1pdCcgYW5kICdjYW5jZWwnIGJ1dHRvbnM6XG4gICAgICAgICAgKFtrZXksIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdjYW5jZWwnICYmICFzY2hlbWEuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5jYW5jZWwoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHNjaGVtYV1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmJ1dHRvblNjaGVtYXMpLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgaGFzQ2FuY2VsKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5idXR0b25TY2hlbWFzLmNhbmNlbFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmhhc0NhbmNlbCB8fCAhdGhpcy5oYXNCdXR0b25zKSAmJiBldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzLnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZScpXG4gICAgfSxcblxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZXNvbHZlKHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICByZWplY3QodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZWplY3QodmFsdWUpXG4gICAgICB0aGlzLnJlbW92ZSgpXG4gICAgfSxcblxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZSh0aGlzLmRpYWxvZ0RhdGEpXG4gICAgfSxcblxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKVxuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2FuY2VsKClcbiAgICB9LFxuXG4gICAgb25Nb3VzZVVwKCkge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY2xpY2tUb0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgZGlzcGxheTogZmxleDtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDIwMDA7XG4gIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvZiB0aGUgcGFnZSBiZWhpbmQgdGhlIGRpYWxvZzpcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuXG4gICZfX2ZvY3VzLXRyYXAge1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAvLyBUT0RPOiBgJl9faW5uZXJgXG4gIGZvcm0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS13aWR0aCwgNDgwcHgpO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggLTJweCByZ2JhKDI3LCAzMywgNTgsIDAuNCk7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWFjdGl2ZSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cztcbiAgfVxufVxuXG4uZGl0by1kaWFsb2ctZW50ZXItZnJvbSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS10byB7XG4gIG9wYWNpdHk6IDA7XG5cbiAgZm9ybSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMHB4KTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21IYW5kbGVyczogW11cbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICBmb3IgKGNvbnN0IHsgcmVtb3ZlIH0gb2YgdGhpcy5kb21IYW5kbGVycykge1xuICAgICAgcmVtb3ZlKClcbiAgICB9XG4gICAgdGhpcy5kb21IYW5kbGVycyA9IFtdXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGRvbU9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFkZEV2ZW50cyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgaXNPYmplY3QodHlwZSkgPyB0eXBlIDogeyBbdHlwZV06IGhhbmRsZXIgfVxuICAgICAgKVxuICAgICAgdGhpcy5kb21IYW5kbGVycy5wdXNoKHJlc3VsdClcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1yb290XG4gIFZ1ZU5vdGlmaWNhdGlvbnMuZGl0by1ub3RpZmljYXRpb25zKFxuICAgIHJlZj1cIm5vdGlmaWNhdGlvbnNcIlxuICAgIHBvc2l0aW9uPVwidG9wIHJpZ2h0XCJcbiAgICBjbGFzc2VzPVwiZGl0by1ub3RpZmljYXRpb25cIlxuICApXG4gIFRyYW5zaXRpb25Hcm91cChuYW1lPVwiZGl0by1kaWFsb2dcIilcbiAgICBEaXRvRGlhbG9nKFxuICAgICAgdi1mb3I9XCIoZGlhbG9nLCBrZXkpIGluIGRpYWxvZ3NcIlxuICAgICAgOmtleT1cImtleVwiXG4gICAgICA6Y29tcG9uZW50cz1cImRpYWxvZy5jb21wb25lbnRzXCJcbiAgICAgIDpidXR0b25zPVwiZGlhbG9nLmJ1dHRvbnNcIlxuICAgICAgOnByb21pc2U9XCJkaWFsb2cucHJvbWlzZVwiXG4gICAgICA6ZGF0YT1cImRpYWxvZy5kYXRhXCJcbiAgICAgIDpzZXR0aW5ncz1cImRpYWxvZy5zZXR0aW5nc1wiXG4gICAgICBAcmVtb3ZlPVwicmVtb3ZlRGlhbG9nKGtleSlcIlxuICAgIClcbiAgRGl0b01lbnVcbiAgbWFpbi5kaXRvLXBhZ2UuZGl0by1zY3JvbGwtcGFyZW50XG4gICAgRGl0b0hlYWRlcihcbiAgICAgIDpzcGlubmVyPVwib3B0aW9ucy5zcGlubmVyXCJcbiAgICAgIDppc0xvYWRpbmc9XCJpc0xvYWRpbmdcIlxuICAgIClcbiAgICAgIERpdG9BY2NvdW50KFxuICAgICAgICB2LWlmPVwidXNlclwiXG4gICAgICApXG4gICAgICBhLmRpdG8tbG9naW4oXG4gICAgICAgIHYtZWxzZS1pZj1cImFsbG93TG9naW5cIlxuICAgICAgICBAY2xpY2s9XCJyb290Q29tcG9uZW50LmxvZ2luKClcIlxuICAgICAgKVxuICAgICAgICBzcGFuIExvZ2luXG4gICAgUm91dGVyVmlld1xuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGFzQXJyYXksIG1hcENvbmN1cnJlbnRseSwgc3RyaXBUYWdzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b1VzZXIgZnJvbSAnLi4vRGl0b1VzZXIuanMnXG5pbXBvcnQgRGl0b1ZpZXcgZnJvbSAnLi4vY29tcG9uZW50cy9EaXRvVmlldy52dWUnXG5pbXBvcnQgRGl0b0RpYWxvZyBmcm9tICcuL0RpdG9EaWFsb2cudnVlJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NWaWV3LFxuICByZXNvbHZlU2NoZW1hcyxcbiAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHNcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Sb290Jywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgRGl0b0RpYWxvZyB9LFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR2aWV3czogKCkgPT4gdGhpcy5yZXNvbHZlZFZpZXdzXG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgdW5yZXNvbHZlZFZpZXdzOiB7IHR5cGU6IFtPYmplY3QsIEZ1bmN0aW9uLCBQcm9taXNlXSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBvcHRpb25zOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb2x2ZWRWaWV3czoge30sXG4gICAgICByZW1vdmVSb3V0ZXM6IG51bGwsXG4gICAgICBkaWFsb2dzOiB7fSxcbiAgICAgIGFsbG93TG9naW46IGZhbHNlLFxuICAgICAgbG9hZGluZ0NvdW50OiAwXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyZWZzLm5vdGlmaWNhdGlvbnNcbiAgICB9LFxuXG4gICAgaXNMb2FkaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZGluZ0NvdW50ID4gMFxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuYXBwU3RhdGUudGl0bGUgPSBkb2N1bWVudC50aXRsZSB8fCAnRGl0by5qcyBBZG1pbidcbiAgICAvLyBXaXRoIGhvdC1yZWxvYWRpbmcsIGl0IGxvb2tzIGxpa2UgZGVzdHJveWVkIGhvb2tzIGFyZW4ndCBhbHdheXMgY2FsbGVkXG4gICAgLy8gZm9yIHJvdXRlIGNvbXBvbmVudHMgc28gcmVzZXQgdGhlIGFycmF5IG9mIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBpbnN0ZWFkLlxuICAgIHRoaXMuYXBwU3RhdGUucm91dGVDb21wb25lbnRzID0gW11cbiAgfSxcblxuICBhc3luYyBtb3VudGVkKCkge1xuICAgIC8vIENsZWFyIHRoZSBsYWJlbCBtYXJrZWQgYXMgYWN0aXZlIG9uIGFsbCBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLCBleGNlcHRcbiAgICAvLyB0aGUgb25lcyB0aGF0IERpdG9MYWJlbCBpdHNlbGYgaW50ZXJjZXB0cy5cbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjbGljazogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5jbG9zZXN0KCcuZGl0by1sYWJlbCcpKSB7XG4gICAgICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdUYWInKSB7XG4gICAgICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYWxsb3dMb2dpbiA9IGZhbHNlXG4gICAgICBpZiAoYXdhaXQgdGhpcy5mZXRjaFVzZXIoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVWaWV3cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIH1cbiAgICB0aGlzLmFsbG93TG9naW4gPSB0cnVlXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG5vdGlmeSh7IHR5cGUgPSAnaW5mbycsIHRpdGxlLCB0ZXh0IH0gPSB7fSkge1xuICAgICAgdGl0bGUgfHw9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICdXYXJuaW5nJyxcbiAgICAgICAgICBlcnJvcjogJ0Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdTdWNjZXNzJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdOb3RpZmljYXRpb24nXG4gICAgICApXG4gICAgICB0ZXh0ID0gYDxwPiR7XG4gICAgICAgIGFzQXJyYXkodGV4dCkuam9pbignPC9wPiA8cD4nKVxuICAgICAgfTwvcD5gLnJlcGxhY2UoL1xcbnxcXHJcXG58XFxyL2csICc8YnI+JylcbiAgICAgIGNvbnN0IGxvZyA9IChcbiAgICAgICAge1xuICAgICAgICAgIHdhcm5pbmc6ICd3YXJuJyxcbiAgICAgICAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiAnbG9nJyxcbiAgICAgICAgICBzdWNjZXNzOiAnbG9nJ1xuICAgICAgICB9W3R5cGVdIHx8XG4gICAgICAgICdlcnJvcidcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlW2xvZ10oc3RyaXBUYWdzKHRleHQpKVxuICAgICAgY29uc3QgeyBub3RpZmljYXRpb25zID0gdHJ1ZSB9ID0gdGhpcy5hcGlcbiAgICAgIGlmIChub3RpZmljYXRpb25zKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBkaXNwbGF5LWR1cmF0aW9uIGZvciB0aGUgbm90aWZpY2F0aW9uIGJhc2VkIG9uIGl0cyBjb250ZW50XG4gICAgICAgIC8vIGFuZCB0aGUgc2V0dGluZyBvZiB0aGUgYGR1cmF0aW9uRmFjdG9yYCBjb25maWd1cmF0aW9uLiBJdCBkZWZpbmVzIHRoZVxuICAgICAgICAvLyBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIG11bHRpcGxpZWQgd2l0aCB0aGUgYW1vdW50IG9mIGNoYXJhY3RlcnNcbiAgICAgICAgLy8gZGlzcGxheWVkIGluIHRoZSBub3RpZmljYXRpb24sIHBsdXMgNDAgKDQwICsgdGl0bGUgKyBtZXNzYWdlKTpcbiAgICAgICAgY29uc3QgeyBkdXJhdGlvbkZhY3RvciA9IDIwIH0gPSBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gKDQwICsgdGV4dC5sZW5ndGggKyB0aXRsZS5sZW5ndGgpICogZHVyYXRpb25GYWN0b3JcbiAgICAgICAgdGhpcy4kbm90aWZ5KHsgdHlwZSwgdGl0bGUsIHRleHQsIGR1cmF0aW9uIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsb3NlTm90aWZpY2F0aW9ucygpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5kZXN0cm95QWxsKClcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXJMb2FkaW5nKGlzTG9hZGluZykge1xuICAgICAgdGhpcy5sb2FkaW5nQ291bnQgKz0gaXNMb2FkaW5nID8gMSA6IC0xXG4gICAgfSxcblxuICAgIHNob3dEaWFsb2coeyBjb21wb25lbnRzLCBidXR0b25zLCBkYXRhLCBzZXR0aW5ncyB9KSB7XG4gICAgICAvLyBTaG93cyBhIGRpdG8tZGlhbG9nIGNvbXBvbmVudCBhbmQgd3JhcHMgaXQgaW4gYSBwcm9taXNlIHNvIHRoYXQgdGhlXG4gICAgICAvLyBidXR0b25zIGluIHRoZSBkaWFsb2cgY2FuIHVzZSBgZGlhbG9nLnJlc29sdmUoKWAgYW5kIGBkaWFsb2cucmVqZWN0KClgXG4gICAgICAvLyB0byBjbG9zZSB0aGUgbW9kYWwgZGlhbG9nIGFuZCByZXNvbHZlIC8gcmVqZWN0IHRoZSBwcm9taXNlIGF0IG9uY2UuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAvLyBQcm9jZXNzIGNvbXBvbmVudHMgdG8gcmVzb2x2ZSBhc3luYyBzY2hlbWFzLlxuICAgICAgICAgIGNvbnN0IHJvdXRlcyA9IFtdXG4gICAgICAgICAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHModGhpcy5hcGksIHsgY29tcG9uZW50cyB9LCByb3V0ZXMsIDApXG4gICAgICAgICAgaWYgKHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdEaWFsb2dzIGRvIG5vdCBzdXBwb3J0IGNvbXBvbmVudHMgdGhhdCBwcm9kdWNlIHJvdXRlcydcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qga2V5ID0gYGRpYWxvZy0keysrZGlhbG9nSWR9YFxuICAgICAgICAgIHRoaXMuZGlhbG9nc1trZXldID0ge1xuICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICBwcm9taXNlOiB7IHJlc29sdmUsIHJlamVjdCB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHJlbW92ZURpYWxvZyhrZXkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRpYWxvZ3Nba2V5XVxuICAgIH0sXG5cbiAgICBhc3luYyBsb2dpbigpIHtcbiAgICAgIHRoaXMuYWxsb3dMb2dpbiA9IHRydWVcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWRkaXRpb25hbENvbXBvbmVudHMsXG4gICAgICAgIHJlZGlyZWN0QWZ0ZXJMb2dpblxuICAgICAgfSA9IHRoaXMub3B0aW9ucy5sb2dpbiB8fCB7fVxuICAgICAgY29uc3QgbG9naW5EYXRhID0gYXdhaXQgdGhpcy5zaG93RGlhbG9nKHtcbiAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBhdXRvZm9jdXM6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hZGRpdGlvbmFsQ29tcG9uZW50c1xuICAgICAgICB9LFxuICAgICAgICBidXR0b25zOiB7XG4gICAgICAgICAgY2FuY2VsOiB7fSxcbiAgICAgICAgICBsb2dpbjogeyB0eXBlOiAnc3VibWl0JyB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAobG9naW5EYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5sb2dpbixcbiAgICAgICAgICAgIGRhdGE6IGxvZ2luRGF0YSxcbiAgICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAocmVkaXJlY3RBZnRlckxvZ2luKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5yZXBsYWNlKHJlZGlyZWN0QWZ0ZXJMb2dpbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRVc2VyKHJlc3BvbnNlLmRhdGEudXNlcilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyLnJlc3BvbnNlPy5kYXRhPy5lcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICB0aXRsZTogJ0F1dGhlbnRpY2F0aW9uIEVycm9yJyxcbiAgICAgICAgICAgIHRleHQ6IGVycm9yIHx8IGVyclxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5yZXNwb25zZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2dpbigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbmF2aWdhdGVIb21lKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUoJy8nKVxuICAgIH0sXG5cbiAgICBhc3luYyBsb2dvdXQoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5sb2dvdXQsXG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2V0VXNlcihudWxsKVxuICAgICAgICAgIHRoaXMubmF2aWdhdGVIb21lKClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBmZXRjaFVzZXIoKSB7XG4gICAgICBsZXQgdXNlciA9IG51bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgcmVzb3VyY2U6IHRoaXMuYXBpLnVzZXJzLnNlc3Npb24sXG4gICAgICAgICAgaW50ZXJuYWw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgdXNlciA9IHJlc3BvbnNlLmRhdGEudXNlciB8fCBudWxsXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgdGl0bGU6ICdBdXRoZW50aWNhdGlvbiBFcnJvcicsXG4gICAgICAgICAgdGV4dDogZXJyXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnNldFVzZXIodXNlcilcbiAgICAgIHJldHVybiB1c2VyXG4gICAgfSxcblxuICAgIHNldFVzZXIodXNlcikge1xuICAgICAgdGhpcy5hcHBTdGF0ZS51c2VyID0gKFxuICAgICAgICB1c2VyICYmXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih1c2VyLCBEaXRvVXNlci5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAvLyBDbGVhciByZXNvbHZlZCB2aWV3cyB3aGVuIHVzZXIgaXMgbG9nZ2VkIG91dC5cbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICB0aGlzLnJlc29sdmVkVmlld3MgPSB7fVxuICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZVVzZXIoKSB7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmZldGNoVXNlcigpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzb2x2ZVZpZXdzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0gYXdhaXQgcmVzb2x2ZVNjaGVtYXModGhpcy51bnJlc29sdmVkVmlld3MpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIWVycm9yLnJlcXVlc3QpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ2luKClcbiAgICAgIH1cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJvdXRlcyBmcm9tIHRoZSByb290IHNjaGVtYSBjb21wb25lbnRzXG4gICAgICBjb25zdCByb3V0ZXMgPSBhd2FpdCBtYXBDb25jdXJyZW50bHkoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVzb2x2ZWRWaWV3cyksXG4gICAgICAgIChbbmFtZSwgc2NoZW1hXSkgPT4gcHJvY2Vzc1ZpZXcoRGl0b1ZpZXcsIHRoaXMuYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgICApXG4gICAgICAvLyBOb3cgdGhhdCB0aGUgcm91dGVzIGFyZSBsb2FkZWQsIHJlcGxhY2UgYWxsIGV4aXN0aW5nIHJvdXRlcyB3aXRoIHRoZVxuICAgICAgLy8gbmV3IHJvdXRlcywgYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgcGF0aC5cbiAgICAgIGNvbnN0IHsgZnVsbFBhdGggfSA9IHRoaXMuJHJvdXRlXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcz8uKClcbiAgICAgIHRoaXMucmVtb3ZlUm91dGVzID0gYWRkUm91dGVzKHRoaXMuJHJvdXRlciwgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3Jvb3QnLFxuICAgICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgICBjb21wb25lbnRzOiB7fVxuICAgICAgICB9LFxuICAgICAgICAuLi5yb3V0ZXNcbiAgICAgIF0pXG4gICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZShmdWxsUGF0aClcbiAgICB9XG4gIH1cbn0pXG5cbmxldCBkaWFsb2dJZCA9IDBcblxuZnVuY3Rpb24gYWRkUm91dGVzKHJvdXRlciwgcm91dGVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gW11cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICBjb25zdCByZW1vdmVSb3V0ZSA9IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSlcbiAgICByZW1vdmVycy5wdXNoKHJlbW92ZVJvdXRlKVxuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IHJlbW92ZSBvZiByZW1vdmVycykge1xuICAgICAgcmVtb3ZlKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9zdHlsZSc7XG5cbi5kaXRvLWFwcCxcbi5kaXRvLXJvb3Qge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xufVxuXG4uZGl0by1yb290IHtcbiAgLmRpdG8tcGFnZSB7XG4gICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAvLyBUaGUgcm9vdC1sZXZlbCB2aWV3cyBhbmQgZm9ybXMgbWF5IGhhdmUgYSBgLmRpdG8tc2NoZW1hLWhlYWRlcmAgdGhhdFxuICAgIC8vIHNob3VsZCBhcHBlYXIgbGF5ZXJlZCBvdmVyIGAuZGl0by1tZW51YCwgd2hpbGUgaGF2aW5nIGBvdmVybGF5OiBoaWRkZW5gXG4gICAgLy8gc2V0IGJ5IGAuZGl0by1zY3JvbGwtcGFyZW50YCB0byBkZWxlZ2F0ZSBzY3JvbGxpbmcgdG8gYC5kaXRvLXNjcm9sbGAuXG4gICAgLy8gSW4gb3JkZXIgdG8gbm90IGhhdmUgdGhlIGhlYWRlciBjbGlwcGVkLCBhZGp1c3QgdGhlIHRvcCBoZXJlOlxuICAgID4gLmRpdG8tZm9ybSxcbiAgICA+IC5kaXRvLXZpZXcge1xuICAgICAgbWFyZ2luLXRvcDogLSRtZW51LWhlaWdodDtcbiAgICAgIHBhZGRpbmctdG9wOiAkbWVudS1oZWlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbm5hdi5kaXRvLW1lbnUuZGl0by1zY3JvbGwtcGFyZW50XG4gIGgxIHt7IGFwcFN0YXRlLnRpdGxlIH19XG4gIHVsLmRpdG8tc2Nyb2xsXG4gICAgbGkoXG4gICAgICB2LWZvcj1cInZpZXcgaW4gdmlld3NcIlxuICAgIClcbiAgICAgIFJvdXRlckxpbmsuZGl0by1saW5rKFxuICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHZpZXcpXCJcbiAgICAgICAgOnRvPVwiYC8ke3ZpZXcucGF0aH1gXCJcbiAgICAgICAgYWN0aXZlQ2xhc3M9XCJkaXRvLWFjdGl2ZVwiXG4gICAgICApIHt7IGdldExhYmVsKHZpZXcpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTWVudScsIHt9KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbWVudSB7XG4gIGZsZXg6IGluaXRpYWw7XG4gIGZvbnQtc2l6ZTogJG1lbnUtZm9udC1zaXplO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB1bCB7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAkYm9yZGVyLXN0eWxlO1xuICB9XG5cbiAgYSxcbiAgaDEge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgaDEge1xuICAgIHBhZGRpbmc6ICRtZW51LXBhZGRpbmc7XG4gICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1kYXJrZXN0O1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAuZGl0by1saW5rIHtcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcblxuICAgICYuZGl0by1hY3RpdmUge1xuICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWxpbmsge1xuICAmOmZvY3VzOm5vdCg6YWN0aXZlLCAuZGl0by1hY3RpdmUpIHtcbiAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNwaW5uZXIoXG4gIHYtc2hvdz1cImxvYWRpbmdcIlxuKVxuICAvLy0gVE9ETzogQ29udmVydCB0byBCRU1cbiAgLnYtcHVsc2Uudi1wdWxzZTEoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5MV1cIilcbiAgLnYtcHVsc2Uudi1wdWxzZTIoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5Ml1cIilcbiAgLnYtcHVsc2Uudi1wdWxzZTMoOnN0eWxlPVwiW3NwaW5uZXJTdHlsZSwgc3Bpbm5lckRlbGF5M11cIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbG9hZGluZzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnIzVkYzU5NidcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcxNXB4J1xuICAgIH0sXG4gICAgbWFyZ2luOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMnB4J1xuICAgIH0sXG4gICAgcmFkaXVzOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTAwJSdcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIHVzaW5nIG9ubHkgY2xhc3Nlc1xuICAgIHJldHVybiB7XG4gICAgICBzcGlubmVyU3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICB3aWR0aDogdGhpcy5zaXplLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuc2l6ZSxcbiAgICAgICAgbWFyZ2luOiB0aGlzLm1hcmdpbixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiB0aGlzLnJhZGl1cyxcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgIGFuaW1hdGlvbk5hbWU6ICd2LXB1bHNlU3RyZXRjaERlbGF5JyxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246ICcwLjc1cycsXG4gICAgICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAnaW5maW5pdGUnLFxuICAgICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2N1YmljLWJlemllciguMiwuNjgsLjE4LDEuMDgpJyxcbiAgICAgICAgYW5pbWF0aW9uRmlsbE1vZGU6ICdib3RoJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTE6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjEycydcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkyOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4yNHMnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5Mzoge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMzZzJ1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGtleWZyYW1lcyB2LXB1bHNlU3RyZXRjaERlbGF5IHtcbiAgMCUsXG4gIDgwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5cbiAgNDUlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XG4gICAgb3BhY2l0eTogMC43O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgdi1wdWxzZVN0cmV0Y2hEZWxheSB7XG4gIDAlLFxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIDQ1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xuICAgIG9wYWNpdHk6IDAuNztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1oZWFkZXJcbiAgLmRpdG8tdHJhaWxcbiAgICB1bFxuICAgICAgbGkoXG4gICAgICAgIHYtZm9yPVwiKGNvbXBvbmVudCwgaW5kZXgpIGluIHRyYWlsXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImluZGV4ID09PSB0cmFpbC5sZW5ndGggLSAxXCJcbiAgICAgICAgKVxuICAgICAgICAgIHNwYW4oOmNsYXNzPVwiZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudClcIilcbiAgICAgICAgICAgIHwge3sgY29tcG9uZW50LmJyZWFkY3J1bWIgfX1cbiAgICAgICAgUm91dGVyTGluay5kaXRvLWJyZWFkY3J1bWIoXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgOnRvPVwiY29tcG9uZW50LnBhdGhcIlxuICAgICAgICApXG4gICAgICAgICAgc3Bhbig6Y2xhc3M9XCJnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KVwiKVxuICAgICAgICAgICAgfCB7eyBjb21wb25lbnQuYnJlYWRjcnVtYiB9fVxuICAgIERpdG9TcGlubmVyKFxuICAgICAgdi1pZj1cImlzTG9hZGluZ1wiXG4gICAgKVxuICBzbG90XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvU3Bpbm5lciBmcm9tICcuL0RpdG9TcGlubmVyLnZ1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvSGVhZGVyJywge1xuICBjb21wb25lbnRzOiB7IERpdG9TcGlubmVyIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBzcGlubmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSxcbiAgICBpc0xvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyYWlsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdGUucm91dGVDb21wb25lbnRzLmZpbHRlcihcbiAgICAgICAgY29tcG9uZW50ID0+ICEhY29tcG9uZW50LnJvdXRlUmVjb3JkXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2l6ZSA9ICc4cHgnLFxuICAgICAgY29sb3IgPSAnIzk5OSdcbiAgICB9ID0gdGhpcy5zcGlubmVyIHx8IHt9XG4gICAgLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgdG8gc2V0IHRoZSBkZWZhdWx0IHByb3BzIGZvciB0aGUgRGl0b1NwaW5uZXIuXG4gICAgLy8gUGFzcyB0aGVtIG9uIHRocm91Z2ggdGhlIHRlbXBsYXRlIGluc3RlYWQhXG4gICAgY29uc3QgeyBwcm9wcyB9ID0gRGl0b1NwaW5uZXJcbiAgICBwcm9wcy5zaXplLmRlZmF1bHQgPSBzaXplXG4gICAgcHJvcHMuY29sb3IuZGVmYXVsdCA9IGNvbG9yXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWRpcnR5JzogY29tcG9uZW50LmlzRGlydHlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1oZWFkZXIge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItYmxhY2s7XG4gIGZvbnQtc2l6ZTogJG1lbnUtZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gIHotaW5kZXg6ICRtZW51LXotaW5kZXg7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAuZGl0by10cmFpbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGhlaWdodDogM2VtO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGggKyAkY29udGVudC1wYWRkaW5nO1xuXG4gICAgdWwge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG5cbiAgICBhIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgcGFkZGluZy1yaWdodDogMC40ZW07XG5cbiAgICAgICRhbmdsZTogMzNkZWc7XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBjb2xvcjogIzk5OTk5OTtcbiAgICAgIH1cblxuICAgICAgJjo6YmVmb3JlLFxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICB3aWR0aDogMXB4O1xuICAgICAgICBoZWlnaHQ6IDEuMmVtO1xuICAgICAgICByaWdodDogLTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWRhcms7XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgkYW5nbGUpO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gICAgICB9XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgYm90dG9tOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0kYW5nbGUpO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBib3R0b207XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tc3Bpbm5lciB7XG4gICAgbWFyZ2luLXRvcDogJG1lbnUtcGFkZGluZy12ZXI7XG4gIH1cblxuICAuZGl0by1kaXJ0eSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogOHB4O1xuICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwLjVlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYWNjb3VudCxcbiAgLmRpdG8tbG9naW4ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5cbiAgLmRpdG8tYWNjb3VudCB7XG4gICAgbGVmdDogJGNvbnRlbnQtd2lkdGggKyAkY29udGVudC1wYWRkaW5nICogMjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCBEb21NaXhpbiBmcm9tICcuL0RvbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHVsbGRvd246IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIHN0YXJ0VGltZTogMCxcbiAgICAgICAgY2hlY2tUaW1lOiB0cnVlLFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBtb3VzZWRvd246ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtb3VzZXVwOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vblB1bGxkb3duTW91c2VVcChudWxsKSkge1xuICAgICAgICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVyczogbnVsbFxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25QdWxsZG93bk1vdXNlRG93bih2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldFB1bGxkb3duT3Blbih0cnVlKVxuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tUaW1lID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93bk1vdXNlVXAodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgc3RhcnRUaW1lIH0gPSB0aGlzLnB1bGxkb3duXG4gICAgICBpZiAoIXRoaXMuY2hlY2tUaW1lIHx8IHN0YXJ0VGltZSAmJiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+IDI1MCkpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4oZmFsc2UpXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMub25QdWxsZG93blNlbGVjdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblB1bGxkb3duU2VsZWN0KC8qIHZhbHVlICovKSB7XG4gICAgICAvLyBOT1RFOiBUbyBiZSBvdmVycmlkZGVuLlxuICAgIH0sXG5cbiAgICBzZXRQdWxsZG93bk9wZW4ob3Blbikge1xuICAgICAgdGhpcy5wdWxsZG93bi5vcGVuID0gb3BlblxuICAgICAgdGhpcy5wdWxsZG93bi5zdGFydFRpbWUgPSBvcGVuID8gRGF0ZS5ub3coKSA6IDBcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB0aGlzLnB1bGxkb3duLmV2ZW50cylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1hY2NvdW50XG4gIGEoXG4gICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bigpXCJcbiAgKVxuICAgIHNwYW4ge3sgdXNlci51c2VybmFtZSB9fVxuICB1bC5kaXRvLXB1bGxkb3duKDpjbGFzcz1cInsgJ2RpdG8tb3Blbic6IHB1bGxkb3duLm9wZW4gfVwiKVxuICAgIGxpKFxuICAgICAgdi1mb3I9XCIobGFiZWwsIHZhbHVlKSBvZiBpdGVtc1wiXG4gICAgKVxuICAgICAgYShcbiAgICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bih2YWx1ZSlcIlxuICAgICAgICBAbW91c2V1cD1cIm9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlKVwiXG4gICAgICApIHt7IGxhYmVsIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBQdWxsZG93bk1peGluIGZyb20gJy4uL21peGlucy9QdWxsZG93bk1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9BY2NvdW50Jywge1xuICBtaXhpbnM6IFtQdWxsZG93bk1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtczoge1xuICAgICAgICBzZXR0aW5nczogJ1NldHRpbmdzJyxcbiAgICAgICAgbG9nb3V0OiAnTG9nb3V0J1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25QdWxsZG93blNlbGVjdCh2YWx1ZSkge1xuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlICdsb2dvdXQnOlxuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5sb2dvdXQoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3NldHRpbmdzJzpcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1RPRE86IEltcGxlbWVudCBTZXR0aW5ncycpXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1hY2NvdW50IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICB0b3A6ICRwdWxsZG93bi1wYWRkaW5nLXZlcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIHYtaWY9XCJjb250ZW50XCJcbiAgOmlzPVwib3B0aW9ucy50YWcgfHwgdGFnXCJcbiAgOmNsYXNzPVwiY2xhc3Nlc1wiXG4gIDpzdHlsZT1cInN0eWxlc1wiXG4pIHt7IG9wdGlvbnMudGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FbGVtZW50Jywge1xuICBwcm9wczoge1xuICAgIHRhZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzcGFuJyB9LFxuICAgIGNvbnRlbnQ6IHsgdHlwZTogW1N0cmluZywgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBvcHRpb25zKCkge1xuICAgICAgY29uc3QgeyBjb250ZW50IH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNPYmplY3QoY29udGVudCkgPyBjb250ZW50IDogeyB0ZXh0OiBjb250ZW50IH1cbiAgICB9LFxuXG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMuJGF0dHJzLmNsYXNzLFxuICAgICAgICAuLi5hc09iamVjdCh0aGlzLm9wdGlvbnMuY2xhc3MpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMuJGF0dHJzLnN0eWxlLFxuICAgICAgICAuLi5hc09iamVjdCh0aGlzLm9wdGlvbnMuc3R5bGUpXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuXG5mdW5jdGlvbiBhc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gYXNBcnJheSh2YWx1ZSkucmVkdWNlKChvYmplY3QsIGVudHJ5KSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGVudHJ5KSkge1xuICAgICAgb2JqZWN0W2VudHJ5XSA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGVudHJ5KSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmplY3QsIGVudHJ5KVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0XG4gIH0sIHt9KVxufVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50LmRpdG8tbGFiZWwoXG4gIHYtaWY9XCJ0ZXh0IHx8IGNvbGxhcHNpYmxlXCJcbiAgOmlzPVwidGFnXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogaXNBY3RpdmUgfVwiXG4pXG4gIC5kaXRvLWNoZXZyb24oXG4gICAgdi1pZj1cImNvbGxhcHNpYmxlXCJcbiAgICA6Y2xhc3M9XCJ7ICdkaXRvLW9wZW5lZCc6ICFjb2xsYXBzZWQgfVwiXG4gIClcbiAgRGl0b0VsZW1lbnQuZGl0by1sYWJlbC1wcmVmaXgoXG4gICAgdi1mb3I9XCIocHJlZml4LCBpbmRleCkgb2YgcHJlZml4ZXNcIlxuICAgIDprZXk9XCJgcHJlZml4LSR7aW5kZXh9YFwiXG4gICAgdGFnPVwic3BhblwiXG4gICAgOmNvbnRlbnQ9XCJwcmVmaXhcIlxuICApXG4gIGxhYmVsKFxuICAgIDpmb3I9XCJkYXRhUGF0aFwiXG4gICAgdi1odG1sPVwidGV4dFwiXG4gIClcbiAgRGl0b0VsZW1lbnQuZGl0by1sYWJlbC1zdWZmaXgoXG4gICAgdi1mb3I9XCIoc3VmZml4LCBpbmRleCkgb2Ygc3VmZml4ZXNcIlxuICAgIDprZXk9XCJgc3VmZml4LSR7aW5kZXh9YFwiXG4gICAgdGFnPVwic3BhblwiXG4gICAgOmNvbnRlbnQ9XCJzdWZmaXhcIlxuICApXG4gIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0xhYmVsJywge1xuICBlbWl0czogWydleHBhbmQnXSxcblxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZSA/ICdhJyA6ICdkaXYnXG4gICAgfSxcblxuICAgIHRleHQoKSB7XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNPYmplY3QobGFiZWwpID8gbGFiZWw/LnRleHQgOiBsYWJlbFxuICAgIH0sXG5cbiAgICBwcmVmaXhlcygpIHtcbiAgICAgIHJldHVybiBhc0FycmF5KHRoaXMubGFiZWw/LnByZWZpeClcbiAgICB9LFxuXG4gICAgc3VmZml4ZXMoKSB7XG4gICAgICByZXR1cm4gYXNBcnJheSh0aGlzLmxhYmVsPy5zdWZmaXgpXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZSA/IHsgb25DbGljazogdGhpcy5vbkNsaWNrIH0gOiB7fVxuICAgIH0sXG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID09PSB0aGlzXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkNsaWNrKCkge1xuICAgICAgdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9IHRoaXNcbiAgICAgIHRoaXMuJGVtaXQoJ2V4cGFuZCcsIHRoaXMuY29sbGFwc2VkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWxhYmVsIHtcbiAgLS1sYWJlbC1wYWRkaW5nOiAwO1xuICAvLyBGb3IgYnV0dG9ucyBhbmQgY2hldnJvbiB0byBhbGlnbiByaWdodDpcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBhbGwgaXRlbXMgaW4gdGhlIGxhYmVsLCBlLmcuIGNoZXZyb24sIGVkaXQtYnV0dG9ucy5cbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogdmFyKC0tbGFiZWwtcGFkZGluZyk7XG4gIG1hcmdpbjogMCAwICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuXG4gIGxhYmVsIHtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgY3Vyc29yOiBpbmhlcml0O1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICBsYWJlbCxcbiAgLmRpdG8tbGFiZWwtcHJlZml4LFxuICAuZGl0by1sYWJlbC1zdWZmaXgge1xuICAgICY6bnRoLWxhc3QtY2hpbGQoMikge1xuICAgICAgLy8gVG8gc3RyZXRjaCBlaXRoZXIgbGFiZWwgb3IgLmRpdG8tbGFiZWwtc3VmZml4IHRvIGZ1bGwgYXZhaWxhYmxlIHdpZHRoXG4gICAgICAvLyBzbyB0aGF0IGJ1dHRvbnMgYWx3YXlzIGFwcGVhciByaWdodC1hbGlnbmVkOlxuICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgfVxuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJ1xcYTAnOyAvLyAmbmJzcDs7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tbGFiZWwtcHJlZml4LFxuICAuZGl0by1sYWJlbC1zdWZmaXgge1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgLy8gTW92ZSB0aGUgbGFiZWwgcGFkZGluZyBpbnNpZGUgLmRpdG8tYnV0dG9ucywgc28gdGhhdCBpdCBjYXB0dXJlcyBhbGxcbiAgICAvLyBuZWFyIG1vdXNlIGV2ZW50czpcbiAgICBtYXJnaW46IGNhbGMoLTEgKiB2YXIoLS1sYWJlbC1wYWRkaW5nKSk7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgcGFkZGluZzogdmFyKC0tbGFiZWwtcGFkZGluZyk7XG4gIH1cblxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLy8gSW4gb3JkZXIgZm9yIGVsbGlwc2lzIHRvIHdvcmsgb24gbGFiZWxzIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIGxheW91dCxcbiAgICAvLyB3ZSBuZWVkIHRvIHBvc2l0aW9uIGl0IGFic29sdXRlbHkgaW5zaWRlIGl0cyBjb250YWluZXIuXG4gICAgbGFiZWwge1xuICAgICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICAvLyBTaW5jZSA8bGFiZWw+IHVzZXMgYHBvc2l0aW9uOiBhYnNvbHV0ZWAsIHNldCBjb250ZW50IHRvIGEgemVyby13aWR0aFxuICAgICAgLy8gc3BhY2Ugb24gaXRzIHBhcmVudCB0byBlbmZvcmNlIHRoZSByaWdodCB0ZXh0IGhlaWdodCBpbiB0aGUgY29udGFpbmVyXG4gICAgICBjb250ZW50OiAnXFwyMDBiJzsgLy8gemVyby13aWR0aCBzcGFjZTtcbiAgICB9XG4gIH1cbn1cblxuYS5kaXRvLWxhYmVsIHtcbiAgJjpob3ZlciB7XG4gICAgLmRpdG8tY2hldnJvbiB7XG4gICAgICBjb2xvcjogJGNvbG9yLWRhcmtlcjtcbiAgICB9XG4gIH1cblxuICAmOmZvY3VzOm5vdCg6YWN0aXZlLCAuZGl0by1hY3RpdmUpIHtcbiAgICAuZGl0by1jaGV2cm9uIHtcbiAgICAgIC13ZWJraXQtdGV4dC1zdHJva2U6ICRib3JkZXItd2lkdGggJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gICAgLy8gRGlzcGxheSBsYWJlbHMgaW4gY29tcGFjdCBzY2hlbWEgYXMgaW5saW5lLWJsb2NrcywgdG8gYWxsb3cgY29tcGFjdFxuICAgIC8vIGxheW91dHMgd2l0aCBgd2lkdGg6ICdhdXRvJ2AgZWxlbWVudHM6XG4gICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gY29udHJvbCB0aGlzIGJlaGF2aW9yLlxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1jb21wYWN0IHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgPiAuZGl0by1wYW5lIHtcbiAgICAgID4gLmRpdG8tY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7XG4gIGdldEl0ZW1Gb3JtU2NoZW1hLFxuICBnZXRJdGVtSWQsXG4gIGdldEl0ZW1VaWQsXG4gIGlzTGlzdFNvdXJjZVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWEsXG5cbiAgICBnZXRJdGVtVWlkLFxuXG4gICAgZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSwgaW5kZXggPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudCAmJiBpbmRleCAhPT0gbnVsbFxuICAgICAgICA/IFN0cmluZyhpbmRleClcbiAgICAgICAgOiBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKVxuICAgIH0sXG5cbiAgICBnZXRJdGVtRGF0YVBhdGgoc291cmNlU2NoZW1hLCBpbmRleCkge1xuICAgICAgbGV0IHsgZGF0YVBhdGggfSA9IHRoaXNcbiAgICAgIGlmIChzb3VyY2VTY2hlbWEgIT09IHRoaXMuc2NoZW1hKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIHNvdXJjZVNjaGVtYS5uYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgZGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgaW5kZXgpXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgZmluZEl0ZW1JZEluZGV4KHNvdXJjZVNjaGVtYSwgZGF0YSwgaXRlbUlkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaXNUcmFuc2llbnRcbiAgICAgICAgPyAvLyBGb3IgdHJhbnNpZW50IGRhdGEsIHRoZSBpbmRleCBpcyB1c2VkIGFzIHRoZSBpZFxuICAgICAgICAgIGl0ZW1JZFxuICAgICAgICA6IGRhdGE/LmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICB0aGlzLmdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4KSA9PT0gaXRlbUlkXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgcmV0dXJuIGluZGV4ICE9PSAtMSA/IGluZGV4IDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRJdGVtTGFiZWwoc291cmNlU2NoZW1hLCBpdGVtLCB7XG4gICAgICBpbmRleCA9IG51bGwsXG4gICAgICBleHRlbmRlZCA9IGZhbHNlLFxuICAgICAgYXNPYmplY3QgPSBmYWxzZVxuICAgIH0gPSB7fSkge1xuICAgICAgY29uc3QgeyBpdGVtTGFiZWwgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKCFpdGVtIHx8ICFleHRlbmRlZCAmJiBpdGVtTGFiZWwgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhUGF0aFxuICAgICAgY29uc3QgZ2V0RGF0YVBhdGggPSAoKSA9PlxuICAgICAgICAoZGF0YVBhdGggfHw9IHRoaXMuZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpKVxuXG4gICAgICBsZXQgZm9ybUxhYmVsXG4gICAgICBjb25zdCBnZXRGb3JtTGFiZWwgPSAoKSA9PlxuICAgICAgICAoZm9ybUxhYmVsIHx8PSB0aGlzLmdldExhYmVsKFxuICAgICAgICAgIGdldEl0ZW1Gb3JtU2NoZW1hKHNvdXJjZVNjaGVtYSwgaXRlbSwgdGhpcy5jb250ZXh0KVxuICAgICAgICApKVxuXG4gICAgICBsZXQgdGV4dFxuICAgICAgbGV0IHByZWZpeFxuICAgICAgbGV0IHN1ZmZpeFxuICAgICAgaWYgKGlzRnVuY3Rpb24oaXRlbUxhYmVsKSkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1MYWJlbC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgICAgICBpbmRleCxcblxuICAgICAgICAgICAgZ2V0IGRhdGFQYXRoKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0RGF0YVBhdGgoKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0IGZvcm1MYWJlbCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1MYWJlbCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNPYmplY3QobGFiZWwpKSB7XG4gICAgICAgICAgOyh7IHRleHQsIHByZWZpeCwgc3VmZml4IH0gPSBsYWJlbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gbGFiZWxcbiAgICAgICAgfVxuICAgICAgICAvLyBJdCdzIHVwIHRvIGBpdGVtTGFiZWwoKWAgZW50aXJlbHkgdG8gcHJvZHVjZSB0aGUgbGFiZWw6XG4gICAgICAgIGV4dGVuZGVkID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiAhKGl0ZW1MYWJlbCBpbiBpdGVtKSkge1xuICAgICAgICAvLyBgaXRlbUxhYmVsYCBjYW4gYmUgYm90aCBhIGtleSwgb3Igc2ltcGx5IGEgbGFiZWwuXG4gICAgICAgIHRleHQgPSBpdGVtTGFiZWxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExvb2sgdXAgdGhlIG5hbWUgb24gdGhlIGl0ZW0sIGJ5IHRoZXNlIHJ1bGVzOlxuICAgICAgICAvLyAxLiBJZiBgaXRlbUxhYmVsYCBpcyBhIHN0cmluZywgdXNlIGl0IGFzIHRoZSBwcm9wZXJ0eSBrZXlcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBhcmUgY29sdW1ucywgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3RcbiAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBzZWUgaWYgdGhlIGl0ZW0gaGFzIGEgcHJvcGVydHkgbmFtZWQgJ25hbWUnXG4gICAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gc291cmNlU2NoZW1hXG4gICAgICAgIGNvbnN0IGtleSA9IChcbiAgICAgICAgICBpc1N0cmluZyhpdGVtTGFiZWwpICYmIGl0ZW1MYWJlbCB8fFxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucylbMF0gfHxcbiAgICAgICAgICAnbmFtZSdcbiAgICAgICAgKVxuICAgICAgICB0ZXh0ID0gaXRlbVtrZXldXG4gICAgICB9XG4gICAgICBjb25zdCBoYWRMYWJlbCA9ICEhdGV4dFxuICAgICAgLy8gSWYgbm8gbGFiZWwgd2FzIGZvdW5kIHNvIGZhciwgdHJ5IHRvIHByb2R1Y2Ugb25lIGZyb20gdGhlIGluZGV4LlxuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICAvLyBBbHdheXMgdXNlIGV4dGVuZGVkIHN0eWxlIHdoZW4gYXV0by1nZW5lcmF0aW5nIGxhYmVscyBmcm9tIGluZGV4L2lkOlxuICAgICAgICBleHRlbmRlZCA9IHRydWVcbiAgICAgICAgdGV4dCA9XG4gICAgICAgICAgaXNMaXN0U291cmNlKHNvdXJjZVNjaGVtYSkgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgICAgID8gKHRleHQgPSBgJHtpbmRleCArIDF9YClcbiAgICAgICAgICAgIDogJydcbiAgICAgIH1cbiAgICAgIGlmIChleHRlbmRlZCkge1xuICAgICAgICBjb25zdCBmb3JtTGFiZWwgPSBnZXRGb3JtTGFiZWwoKVxuICAgICAgICBpZiAoZm9ybUxhYmVsKSB7XG4gICAgICAgICAgLy8gSWYgYSBsYWJlbCB3YXMgcHJvdmlkZWQsIHB1dCBpbiBxdW90ZXMgd2hlbiBwcmVmaXhlZCB3aXRoIHRoZVxuICAgICAgICAgIC8vIGZvcm0gbGFiZWwgZm9yIHRoZSBleHRlbmRlZCBzdHlsZTpcbiAgICAgICAgICB0ZXh0ID0gYCR7Zm9ybUxhYmVsfSAke2hhZExhYmVsID8gYCcke3RleHR9J2AgOiB0ZXh0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzT2JqZWN0ID8geyB0ZXh0LCBwcmVmaXgsIHN1ZmZpeCB9IDogdGV4dFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNjaGVtYVxuICAuZGl0by1zY2hlbWEtY29udGVudFxuICAgIC5kaXRvLXNjaGVtYS1oZWFkZXIoXG4gICAgICB2LWlmPVwiaGFzTGFiZWwgfHwgaGFzVGFicyB8fCBjbGlwYm9hcmRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1zY2hlbWEtbWVudS1oZWFkZXInOiBtZW51SGVhZGVyIH1cIlxuICAgIClcbiAgICAgIERpdG9MYWJlbChcbiAgICAgICAgdi1pZj1cImhhc0xhYmVsXCJcbiAgICAgICAgOmxhYmVsPVwibGFiZWxcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICAgICAgOmNvbGxhcHNlZD1cIiFvcGVuZWRcIlxuICAgICAgICBAZXhwYW5kPVwib25FeHBhbmRcIlxuICAgICAgKVxuICAgICAgICAvLy0gUGFzcyBlZGl0LWJ1dHRvbnMgdGhyb3VnaCB0byBkaXRvLWxhYmVsJ3Mgb3duIGVkaXQtYnV0dG9ucyBzbG90OlxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWlmPVwiaW5saW5lZFwiXG4gICAgICAgICAgI2VkaXQtYnV0dG9uc1xuICAgICAgICApXG4gICAgICAgICAgc2xvdChuYW1lPVwiZWRpdC1idXR0b25zXCIpXG4gICAgICBEaXRvVGFicyhcbiAgICAgICAgdi1pZj1cInRhYnNcIlxuICAgICAgICA6dGFicz1cInRhYnNcIlxuICAgICAgICA6c2VsZWN0ZWRUYWI9XCJzZWxlY3RlZFRhYlwiXG4gICAgICApXG4gICAgICBEaXRvQ2xpcGJvYXJkKFxuICAgICAgICA6Y2xpcGJvYXJkPVwiY2xpcGJvYXJkXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cImhhc1RhYnNcIlxuICAgIClcbiAgICAgIERpdG9QYW5lLmRpdG8tcGFuZS10YWIoXG4gICAgICAgIHYtZm9yPVwiKHRhYlNjaGVtYSwgdGFiKSBpbiB0YWJzXCJcbiAgICAgICAgcmVmPVwidGFic1wiXG4gICAgICAgIDprZXk9XCJ0YWJcIlxuICAgICAgICA6dmlzaWJsZT1cInNlbGVjdGVkVGFiID09PSB0YWJcIlxuICAgICAgICA6dGFiPVwidGFiXCJcbiAgICAgICAgOnNjaGVtYT1cInRhYlNjaGVtYVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6c2luZ2xlPVwiIWlubGluZWQgJiYgIWhhc01haW5QYW5lXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJnZW5lcmF0ZUxhYmVsc1wiXG4gICAgICApXG4gICAgVHJhbnNpdGlvbkhlaWdodCg6ZW5hYmxlZD1cImlubGluZWRcIilcbiAgICAgIERpdG9QYW5lLmRpdG8tcGFuZS1tYWluKFxuICAgICAgICB2LWlmPVwiaGFzTWFpblBhbmUgJiYgb3BlbmVkXCJcbiAgICAgICAgcmVmPVwiY29tcG9uZW50c1wiXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOnNpbmdsZT1cIiFpbmxpbmVkICYmICFoYXNUYWJzXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJnZW5lcmF0ZUxhYmVsc1wiXG4gICAgICApXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIhaW5saW5lZCAmJiBpc1BvcHVsYXRlZFwiXG4gICAgICBuYW1lPVwiYnV0dG9uc1wiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWlmPVwiaW5saW5lZFwiXG4gIClcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiFoYXNMYWJlbFwiXG4gICAgICBuYW1lPVwiZWRpdC1idXR0b25zXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtZWxzZS1pZj1cImlzUG9wdWxhdGVkXCJcbiAgKVxuICAgIERpdG9QYW5lbHMoXG4gICAgICA6cGFuZWxzPVwicGFuZWxFbnRyaWVzXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNBcnJheSxcbiAgaXNGdW5jdGlvbixcbiAgaXNSZWdFeHAsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoLFxuICBsYWJlbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgVHJhbnNpdGlvbkhlaWdodCB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0l0ZW1NaXhpbi5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoLCBnZXRQYXJlbnRJdGVtIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0UGFuZWxFbnRyaWVzLFxuICBzZXREZWZhdWx0VmFsdWVzLFxuICBwcm9jZXNzRGF0YVxufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRTdG9yZUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYScsIHtcbiAgbWl4aW5zOiBbSXRlbU1peGluXSxcbiAgY29tcG9uZW50czogeyBUcmFuc2l0aW9uSGVpZ2h0IH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYUNvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBpbmplY3Q6IFtcbiAgICAnJHNjaGVtYVBhcmVudENvbXBvbmVudCdcbiAgXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgaW5saW5lZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBnZW5lcmF0ZUxhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgaGFzT3duRGF0YTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG1lbnVIZWFkZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLnNjaGVtYVxuICAgIHJldHVybiB7XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gcHJvdmlkZSBtb3JlIGRhdGEgdGhyb3VnaCBgc2NoZW1hLmRhdGFgLCB2dWUtc3R5bGU6XG4gICAgICAuLi4oXG4gICAgICAgIGRhdGEgJiYgaXNGdW5jdGlvbihkYXRhKVxuICAgICAgICAgID8gZGF0YS5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBzY2hlbWFDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHBhcmVudFNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIERvbid0IHJldHVybiB0aGUgYWN0dWFsIHBhcmVudCBzY2hlbWEgaXMgdGhpcyBzY2hlbWEgaGFuZGxlcyBpdHMgb3duXG4gICAgICAvLyBkYXRhLiBUaGlzIHByZXZlbnRzIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoZSBwYXJlbnQsIGFuZCByZWdpc3RlcmluZ1xuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIHRoZSBwYXJlbnQgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBzZXQgaXNEaXJ0eSBmbGFncy5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyBudWxsIDogdGhpcy5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIGNvbnN0IHBhbmVsRW50cmllcyA9IGdldFBhbmVsRW50cmllcyh0aGlzLnNjaGVtYS5wYW5lbHMsICcnKVxuICAgICAgZm9yIChjb25zdCBwYW5lIG9mIHRoaXMucGFuZXMpIHtcbiAgICAgICAgcGFuZWxFbnRyaWVzLnB1c2goLi4ucGFuZS5wYW5lbEVudHJpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFuZWxFbnRyaWVzXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIHNlbGVjdGVkVGFiKCkge1xuICAgICAgY29uc3QgY3VycmVudFRhYiA9IHRoaXMuJHJvdXRlLmhhc2g/LnNsaWNlKDEpIHx8IG51bGxcbiAgICAgIGNvbnN0IHRhYiA9XG4gICAgICAgIGN1cnJlbnRUYWIgJiYgdGhpcy5zaG91bGRSZW5kZXIodGhpcy50YWJzW2N1cnJlbnRUYWJdKVxuICAgICAgICAgID8gY3VycmVudFRhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiPy5uYW1lIHx8IG51bGxcbiAgICAgIGlmICh0YWIgIT09IGN1cnJlbnRUYWIpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHdhdGNoZXIhXG4gICAgICAgIC8vIEFueSB0YWIgY2hhbmdlIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcm91dGVyIGFsc28uXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgaGFzaDogYCMke3RhYn1gIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGFiXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIE9iamVjdC52YWx1ZXModGhpcy50YWJzKSkge1xuICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFRhYiB9ID0gdGFiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGdW5jdGlvbihkZWZhdWx0VGFiKVxuICAgICAgICAgICAgICA/IGRlZmF1bHRUYWIuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQpXG4gICAgICAgICAgICAgIDogZGVmYXVsdFRhYlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgICAgICBmaXJzdCA9IHRhYlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGNsaXBib2FyZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYT8uY2xpcGJvYXJkXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZERhdGEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGF0YSh7IHRhcmdldDogJ3NlcnZlcicsIHNjaGVtYU9ubHk6IHRydWUgfSlcbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkRGF0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICRzY2hlbWE6IHRoaXMuc2NoZW1hLm5hbWUsXG4gICAgICAgIC4uLnRoaXMucHJvY2Vzc0RhdGEoeyB0YXJnZXQ6ICdjbGlwYm9hcmQnLCBzY2hlbWFPbmx5OiB0cnVlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgc2ltaWxhciB0byBgRGl0b0NvbnRleHRgXG4gICAgLy8gcHJvcGVydGllcywgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIHRoZXNlIG9uIGB0aGlzYCBhcyB3ZWxsOlxuICAgIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAgIC8vIHRlcm0gYGl0ZW1gIGlzIHVzZWQgZm9yIHRoZSBkYXRhIHRoYXQgcmVsYXRlcyB0byBlZGl0aW5nIG9iamVjdHMuXG4gICAgLy8gTk9URTogVGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhczpcbiAgICAvLyByZXR1cm4gZ2V0SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCBmYWxzZSlcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVxuICAgIH0sXG5cbiAgICByb290SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3REYXRhXG4gICAgfSxcblxuICAgIHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWREYXRhXG4gICAgfSxcblxuICAgIGNsaXBib2FyZEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGlwYm9hcmREYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3REYXRhLCB0aGlzLmRhdGFQYXRoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZGF0ZWQpXG4gICAgfSxcblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxhYmVsIHx8IHRoaXMuY29sbGFwc2libGVcbiAgICB9LFxuXG4gICAgaGFzVGFicygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pbmxpbmVkICYmICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGhhc01haW5QYW5lKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuICEhY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIG9wZW5lZDogZ2V0U3RvcmVBY2Nlc3Nvcignb3BlbmVkJywge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbGxhcHNlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50cygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50c0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgIHRoaXMuZGVsZWdhdGUoJ2NoYW5nZScsIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50KVxuICAgIHRoaXMuZW1pdEV2ZW50KCdpbml0aWFsaXplJykgLy8gTm90IGAnY3JlYXRlJ2AsIHNpbmNlIHRoYXQncyBmb3IgZGF0YS5cbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuZW1pdEV2ZW50KCdkZXN0cm95JylcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHNCeU5hbWUoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5TmFtZSh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5TmFtZShuYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXModGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRDb21wb25lbnQoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzKGRhdGFQYXRoT3JOYW1lLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHNCeURhdGFQYXRoKGRhdGFQYXRoLCBtYXRjaClbMF0gfHwgbnVsbFxuICAgIH0sXG5cbiAgICBnZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLnBhbmVsc0J5RGF0YVBhdGgsIGRhdGFQYXRoT3JOYW1lLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0UGFuZWwoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYW5lbHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIHNvbWVDb21wb25lbnQoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmlzUG9wdWxhdGVkICYmIHRoaXMuY29tcG9uZW50cy5zb21lKGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBldmVyeUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLmV2ZXJ5KGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICBvbkV4cGFuZChleHBhbmQpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdleHBhbmQnLCB7XG4gICAgICAgIC8vIFRPRE86IEFjdHVhbGx5IGV4cG9zZSB0aGlzIG9uIERpdG9Db250ZXh0P1xuICAgICAgICBjb250ZXh0OiB7IGV4cGFuZCB9XG4gICAgICB9KVxuICAgICAgLy8gUHJldmVudCBjbG9zaW5nIHRoZSBzY2hlbWEgd2l0aCBpbnZhbGlkIGRhdGEsIHNpbmNlIHRoZSBpbi1jb21wb25lbnRcbiAgICAgIC8vIHZhbGlkYXRpb24gd2lsbCBub3QgYmUgZXhlY3V0ZWQgb25jZSBpdCdzIGNsb3NlZC5cblxuICAgICAgLy8gVE9ETzogTW92ZSB2YWxpZGF0aW9uIG91dCBvZiBjb21wb25lbnRzLCB0byBzY2hlbWEsIGp1c3QgbGlrZVxuICAgICAgLy8gcHJvY2Vzc2luZywgYW5kIHVzZSBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgZm9yIHRoZSByZXN1bHRpbmcgZXJyb3JzLFxuICAgICAgLy8gdGhlbiByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgc2luY2Ugd2UgY2FuIHZhbGlkYXRlIGNsb3NlZCBmb3JtcyBhbmRcbiAgICAgIC8vIHNjaGVtYXMgdGhlbi5cbiAgICAgIGlmICghdGhpcy5vcGVuZWQgfHwgZXhwYW5kIHx8IHRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICB0aGlzLm9wZW5lZCA9IGV4cGFuZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyRXJyb3JzKCkge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/LmZvY3VzKClcbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZUFsbChtYXRjaCwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzQnlEYXRhUGF0aCB9ID0gdGhpc1xuICAgICAgbGV0IGRhdGFQYXRoc1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrID0gaXNGdW5jdGlvbihtYXRjaClcbiAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgOiBpc1JlZ0V4cChtYXRjaClcbiAgICAgICAgICAgID8gZmllbGQgPT4gbWF0Y2gudGVzdChmaWVsZClcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBkYXRhUGF0aHMgPSBjaGVja1xuICAgICAgICAgID8gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpLmZpbHRlcihjaGVjaylcbiAgICAgICAgICA6IGlzQXJyYXkobWF0Y2gpXG4gICAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgICA6IFttYXRjaF1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICB9XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWVcbiAgICAgIGxldCBmaXJzdCA9IHRydWVcbiAgICAgIGRhdGFQYXRocyB8fD0gT2JqZWN0LmtleXMoY29tcG9uZW50c0J5RGF0YVBhdGgpXG4gICAgICBmb3IgKGNvbnN0IGRhdGFQYXRoIG9mIGRhdGFQYXRocykge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aClcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmICghY29tcG9uZW50LnZhbGlkYXRlKG5vdGlmeSkpIHtcbiAgICAgICAgICAgIC8vIEZvY3VzIGZpcnN0IGVycm9yIGZpZWxkXG4gICAgICAgICAgICBpZiAobm90aWZ5ICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5mb2N1cygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub3RpZnkgJiYgIWlzVmFsaWQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlFcnJvcnMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzVmFsaWRcbiAgICB9LFxuXG4gICAgdmVyaWZ5QWxsKG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUFsbChtYXRjaCwgZmFsc2UpXG4gICAgfSxcblxuICAgIGFzeW5jIHNob3dWYWxpZGF0aW9uRXJyb3JzKGVycm9ycywgZm9jdXMpIHtcbiAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgY29uc3QgdW5tYXRjaGVkID0gW11cbiAgICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBlcnJzXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIC8vIElmIHRoZSBzY2hlbWEgaXMgYSBkYXRhLXJvb3QsIHByZWZpeCBpdHMgb3duIGRhdGFQYXRoIHRvIGFsbCBlcnJvcnMsXG4gICAgICAgIC8vIHNpbmNlIHRoZSBkYXRhIHRoYXQgaXQgc2VuZHMgYW5kIHZhbGlkYXRlcyB3aWxsIGJlIHVucHJlZml4ZWQuXG4gICAgICAgIGNvbnN0IGZ1bGxEYXRhUGF0aCA9IHRoaXMuaGFzT3duRGF0YVxuICAgICAgICAgID8gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgZGF0YVBhdGgpXG4gICAgICAgICAgOiBkYXRhUGF0aFxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLCB0aGlzLmRhdGFQYXRoLCB0aGlzLmhhc093bkRhdGEsIGZ1bGxEYXRhUGF0aClcbiAgICAgICAgLy8gQ29udmVydCBmcm9tIEphdmFTY3JpcHQgcHJvcGVydHkgYWNjZXNzIG5vdGF0aW9uLCB0byBvdXIgb3duIGZvcm1cbiAgICAgICAgLy8gb2YgcmVsYXRpdmUgSlNPTiBwb2ludGVycyBhcyBkYXRhLXBhdGhzOlxuICAgICAgICBjb25zdCBkYXRhUGF0aFBhcnRzID0gcGFyc2VEYXRhUGF0aChmdWxsRGF0YVBhdGgpXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnNob3dWYWxpZGF0aW9uRXJyb3JzKGVycnMsIGZpcnN0ICYmIGZvY3VzKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlXG4gICAgICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGEgY29tcG9uZW50IGluIGFuIGFjdGl2ZSBmb3JtIGZvciB0aGUgZ2l2ZW4gZGF0YVBhdGguXG4gICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBmaW5kIGEgY29tcG9uZW50IHNlcnZpbmcgYSBwYXJ0IG9mIHRoZSBkYXRhUGF0aCxcbiAgICAgICAgICAvLyBhbmQgdGFrZSBpdCBmcm9tIHRoZXJlOlxuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gZGF0YVBhdGhQYXJ0cy5wb3AoKVxuICAgICAgICAgIHdoaWxlIChkYXRhUGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoUGFydHMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhd2FpdCBjb21wb25lbnQubmF2aWdhdGVUb0NvbXBvbmVudD8uKFxuICAgICAgICAgICAgICAgICAgZnVsbERhdGFQYXRoLFxuICAgICAgICAgICAgICAgICAgc3ViQ29tcG9uZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHN1YkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJzID0gZXJyb3JzW2NvbXBvbmVudC5kYXRhUGF0aF1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIG5lc3RlZCBmb3JtIHRvIGRpc3BsYXkgYXQgbGVhc3QgcGFydHMgZm8gdGhlIGVycm9ycy5cbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBzaG93IGFsbCBlcnJvcnMgYXQgb25jZSwgc28gd2UncmUgZG9uZS4gRG9uJ3QgY2FsbFxuICAgICAgICAgICAgICAgIC8vIGBub3RpZnlFcnJvcnMoKWAgeWV0LCBhcyB3ZSBjYW4gb25seSBkaXNwbGF5IGl0IG9uY2VcbiAgICAgICAgICAgICAgICAvLyBgc2hvd1ZhbGlkYXRpb25FcnJvcnMoKWAgd2FzIGNhbGxlZCBmcm9tIGBEaXRvRm9ybS5tb3VudGVkKClgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN0aWxsIGhlcmUsIHNvIGtlZXAgcmVtb3ZpbmcgdGhlIGxhc3QgcGFydCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gICAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdoZW4gdGhlIGVycm9yIGNhbid0IGJlIG1hdGNoZWQsIGFkZCBpdCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkXG4gICAgICAgICAgLy8gZXJyb3JzIHdpdGggZGVjZW50IG1lc3NhZ2UsIHRvIHJlcG9ydCBhdCB0aGUgZW5kLlxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbGFiZWxpemUocHJvcGVydHkpXG4gICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJycykge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gZmllbGRcbiAgICAgICAgICAgICAgPyBgVGhlIGZpZWxkICR7ZmllbGR9YFxuICAgICAgICAgICAgICA6IGBUaGUgJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICAgICB1bm1hdGNoZWQucHVzaChgJHtwcmVmaXh9ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycyh1bm1hdGNoZWQuam9pbignXFxuJykpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG5vdGlmeUVycm9ycyhtZXNzYWdlKSB7XG4gICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIHRpdGxlOiAnVmFsaWRhdGlvbiBFcnJvcnMnLFxuICAgICAgICB0ZXh0OiBtZXNzYWdlIHx8ICdQbGVhc2UgY29ycmVjdCB0aGUgaGlnaGxpZ2h0ZWQgZXJyb3JzLidcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHJlc2V0RGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbid0IHNldCBgdGhpcy5kYXRhID0gLi4uYCBiZWNhdXNlIGl0J3MgYSBwcm9wZXJ0eSwgYnV0IHdlIGNhbiBzZXRcbiAgICAgIC8vIGFsbCBrbm93biBwcm9wZXJ0aWVzIG9uIGl0IHRvIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnlcbiAgICAgIC8vIGBzZXREZWZhdWx0VmFsdWVzKClgLCBhcyB0aGV5IGFyZSBhbGwgcmVhY3RpdmUgYWxyZWFkeSBmcm9tIHRoZSBzdGFydHM6XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGF0YSwgc2V0RGVmYXVsdFZhbHVlcyh0aGlzLnNjaGVtYSwge30sIHRoaXMpKVxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1tdXRhdGluZy1wcm9wc1xuICAgICAgICAgIHRoaXMuZGF0YVtuYW1lXSA9IGRhdGFbbmFtZV1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHNCeU5hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5tYXJrRGlydHkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmaWx0ZXJEYXRhKGRhdGEpIHtcbiAgICAgIC8vIEZpbHRlcnMgb3V0IGFycmF5cyBhbmQgb2JqZWN0cyB0aGF0IGFyZSBiYWNrIGJ5IGRhdGEgcmVzb3VyY2VzXG4gICAgICAvLyB0aGVtc2VsdmVzLCBhcyB0aG9zZSBhcmUgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aHJvdWdoIHRoZWlyIG93biBBUElcbiAgICAgIC8vIHJlc291cmNlIGVuZC1wb2ludHMgYW5kIHNob3VsZG4ndCBiZSBzZXQuXG4gICAgICBjb25zdCBjb3B5ID0ge31cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKVxuICAgICAgICAgIGlmIChjb21wb25lbnRzLnNvbWUoY29tcG9uZW50ID0+IGNvbXBvbmVudC5wcm92aWRlc0RhdGEpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb3B5W25hbWVdID0gdmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5XG4gICAgfSxcblxuICAgIHByb2Nlc3NEYXRhKHsgdGFyZ2V0ID0gJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHkgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3NEYXRhKFxuICAgICAgICB0aGlzLnNjaGVtYSxcbiAgICAgICAgdGhpcy5zb3VyY2VTY2hlbWEsXG4gICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgdGhpcy5kYXRhUGF0aCxcbiAgICAgICAge1xuICAgICAgICAgIC8vIE5lZWRlZCBmb3IgRGl0b0NvbnRleHQgaGFuZGxpbmcgaW5zaWRlIGBwcm9jZXNzRGF0YWAgYW5kXG4gICAgICAgICAgLy8gYHByb2Nlc3NTY2hlbWFEYXRhKClgOlxuICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICBzY2hlbWFPbmx5LFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIGAkc2NoZW1hUGFyZW50Q29tcG9uZW50KClgIGlzIG9ubHkgc2V0IGlmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIHVzZXNcbiAgICAgIC8vIHRoZSBgU2NoZW1hUGFyZW50TWl4aW5gOlxuICAgICAgdGhpcy4kc2NoZW1hUGFyZW50Q29tcG9uZW50KCk/Ll9yZWdpc3RlclNjaGVtYUNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZCkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJFbnRyeSh0aGlzLmNvbXBvbmVudHNSZWdpc3RyeSwgY29tcG9uZW50LCBhZGQpXG4gICAgICAvLyBPbmx5IHJlZ2lzdGVyIHdpdGggdGhlIHBhcmVudCBpZiBzY2hlbWEgc2hhcmVzIGRhdGEgd2l0aCBpdC5cbiAgICAgIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50Py5fcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50LCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmUocGFuZSwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZXNSZWdpc3RyeSwgcGFuZSwgYWRkKVxuICAgIH0sXG5cbiAgICBfcmVnaXN0ZXJQYW5lbChwYW5lbCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMucGFuZWxzUmVnaXN0cnksIHBhbmVsLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlckVudHJ5KHJlZ2lzdHJ5LCBlbnRyeSwgYWRkKSB7XG4gICAgICBjb25zdCB1aWQgPSBlbnRyeS4kdWlkXG4gICAgICBpZiAoYWRkKSB7XG4gICAgICAgIHJlZ2lzdHJ5W3VpZF0gPSBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W3VpZF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX2xpc3RFbnRyaWVzQnlEYXRhUGF0aChyZWdpc3RyeSkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVnaXN0cnkpLnJlZHVjZSgoZW50cmllc0J5RGF0YVBhdGgsIGVudHJ5KSA9PiB7XG4gICAgICAgIC8vIE11bHRpcGxlIGVudHJpZXMgY2FuIGJlIGxpbmtlZCB0byB0aGUgc2FtZSBkYXRhLXBhdGgsIGUuZy4gd2hlblxuICAgICAgICAvLyB0aGVyZSBhcmUgdGFicy4gTGluayBlYWNoIGRhdGEtcGF0aCB0byBhbiBhcnJheSBvZiBlbnRyaWVzLlxuICAgICAgICBjb25zdCB7IGRhdGFQYXRoIH0gPSBlbnRyeVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gKGVudHJpZXNCeURhdGFQYXRoW2RhdGFQYXRoXSB8fD0gW10pXG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgcmV0dXJuIGVudHJpZXNCeURhdGFQYXRoXG4gICAgICB9LCB7fSlcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXMoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKGRhdGFQYXRoKS5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgID8gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICAgICAgOiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIF9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpXSB8fCBbXSxcbiAgICAgICAgbWF0Y2hcbiAgICAgIClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyRW50cmllcyhcbiAgICAgICAgZW50cmllc0J5RGF0YVBhdGhbYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgbmFtZSldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZmlsdGVyRW50cmllcyhlbnRyaWVzLCBtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoID8gZW50cmllcy5maWx0ZXIobWF0Y2gpIDogZW50cmllc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8vIFRvIGRpc3BsYXkgc2NoZW1hIG5leHQgdG8gcGFuZWxzOlxuICBkaXNwbGF5OiBmbGV4O1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuXG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgIGZsZXg6IDEgMSAxMDAlO1xuICAgIC8vIFNvIHRoYXQgc2NoZW1hIGJ1dHRvbnMgY2FuIGJlIHN0aWNreSB0byB0aGUgYm90dG9tOlxuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudDtcblxuICAgID4gKjpvbmx5LWNoaWxkIHtcbiAgICAgIGdyaWQtcm93LWVuZDogbm9uZTtcbiAgICB9XG5cbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMsXG4gID4gLmRpdG8tcGFuZWxzIHtcbiAgICBmbGV4OiAxIDEgMCU7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG5cbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmcgJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nIDA7XG4gIH1cblxuICAvLyBEaXNwbGF5IGEgcnVsZXIgYmV0d2VlbiB0YWJiZWQgY29tcG9uZW50cyBhbmQgdG93YXJkcyB0aGUgLmRpdG8tYnV0dG9uc1xuICAuZGl0by1wYW5lLXRhYiArIC5kaXRvLXBhbmUtbWFpbiB7XG4gICAgJjo6YmVmb3JlIHtcbiAgICAgIC8vIFVzZSBhIHBzZXVkbyBlbGVtZW50IHRvIGRpc3BsYXkgYSBydWxlciB3aXRoIHByb3BlciBtYXJnaW5zXG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpbiB0byB0aGUgcnVsZXJcbiAgICAgIG1hcmdpbjogJGNvbnRlbnQtcGFkZGluZyAkZm9ybS1zcGFjaW5nLWhhbGYgJGZvcm0tc3BhY2luZy1oYWxmO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtaGVhZGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gIC5kaXRvLXRhYnMsXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgfVxuXG4gIC5kaXRvLWNsaXBib2FyZCB7XG4gICAgJjpvbmx5LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIH1cblxuICAgIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW46IDAgMCAkdGFiLW1hcmdpbiAkdGFiLW1hcmdpbjtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyIHtcbiAgICAvLyBCcmluZyB0aGUgdGFicyB1cCB0byB0aGUgbWVudS5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgaGVpZ2h0OiAkbWVudS1oZWlnaHQ7XG4gICAgcGFkZGluZzogMCAkbWVudS1wYWRkaW5nLWhvcjtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6ICRtZW51LXotaW5kZXg7XG4gICAgLy8gVHVybiBvZmYgcG9pbnRlciBldmVudHMgc28gdGhhdCBEaXRvVHJhaWwga2VlcHMgcmVjZWl2aW5nIGV2ZW50cy4uLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC8vIC4uLmJ1dCBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0YWJzIGFuZCBidXR0b25zIChlLmcuIGNsaXBib2FyZClcbiAgICAvLyBsYXllcmVkIG9uIHRvcCBvZiBEaXRvVHJhaWwuXG4gICAgLmRpdG8tdGFicyxcbiAgICAuZGl0by1idXR0b25zIHtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICAgICAgZm9udC1zaXplOiAkbWVudS1mb250LXNpemU7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uLmRpdG8tbGFiZWwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIENhdGNoIGFsbCBjbGlja3MsIGV2ZW4gd2hlbiBpdCB3b3VsZCBiZSBwYXJ0aWFsbHkgY292ZXJlZCBieSBzY2hlbWEuXG4gICAgei1pbmRleDogMTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvU2NoZW1hLmRpdG8tc2NoZW1hLWlubGluZWQoXG4gIDpzY2hlbWE9XCJzY2hlbWFcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gIDpkYXRhPVwiZGF0YVwiXG4gIDptZXRhPVwibWV0YVwiXG4gIDpzdG9yZT1cInN0b3JlXCJcbiAgOmxhYmVsPVwiaXNDb21wYWN0ID8gbnVsbCA6IGxhYmVsXCJcbiAgOmlubGluZWQ9XCJ0cnVlXCJcbiAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1jb21wYWN0JzogaXNDb21wYWN0IH1cIlxuKVxuICAvLy0gUmVuZGVyIGRpdG8tZWRpdC1idXR0b25zIGZvciBpbmxpbmVkIHNjaGVtYXMgc2VwYXJhdGVseSBmcm9tIGFsbFxuICAvLy0gb3RoZXJzIGluIGBUeXBlTGlzdGAgYXMgYSBzY29wZSwgZm9yIGJldHRlciBoYW5kbGluZyBvZiBsYXlvdXQuXG4gIHRlbXBsYXRlKCNlZGl0LWJ1dHRvbnMpXG4gICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgdi1pZj1cImRlbGV0YWJsZSB8fCBkcmFnZ2FibGUgfHwgZWRpdGFibGVcIlxuICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICBAZGVsZXRlPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzQ29tcGFjdCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYUlubGluZWQnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDb21wYWN0KCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGFjdCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNDb21wYWN0ICYmICEhdGhpcy5sYWJlbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYS1pbmxpbmVkIHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tc2NoZW1hLWhlYWRlciB7XG4gICAgICAvLyBDaGFuZ2Ugc3BhY2luZyBzbyAuZGl0by1sYWJlbCBjb3ZlcnMgdGhlIGZ1bGwgLmRpdG8tc2NoZW1hLWhlYWRlci5cbiAgICAgIG1hcmdpbjogLSRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpblxuICAgICAgICAtLWxhYmVsLXBhZGRpbmc6ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC8vIEJlY2F1c2UgdGFibGVzIGhhdmUgYSBmdW5ueSB3YXkgb2YgYWxsb3dpbmcgdG9vIG11Y2ggd2lkdGggZ3Jvd3RoOlxuICAgICAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgICAgICAvLyBQcmV2ZW50IGNvbGxhcHNpbmcgdG8gbWluLWhlaWdodCB3aGVuIGFsb25lIGluXG4gICAgICAgIC8vIC5kaXRvLXNjaGVtYS1jb250ZW50LCBkdWUgdG8gZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudFxuICAgICAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgICB9XG5cbiAgICAgICYgKyAuZGl0by1wYW5lIHtcbiAgICAgICAgLy8gTmVlZGVkIGZvciB0cmFuc2l0aW9uLWhlaWdodCBpbiBEaXRvU2NoZW1hOlxuICAgICAgICBtaW4taGVpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lKFxuICB2LWlmPVwiaXNQb3B1bGF0ZWQgJiYgY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPiAwXCJcbiAgdi1zaG93PVwidmlzaWJsZVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9IGluIGNvbXBvbmVudFNjaGVtYXNgXG4gIClcbiAgICAuZGl0by1icmVhayhcbiAgICAgIHYtaWY9XCJzY2hlbWEuYnJlYWsgPT09ICdiZWZvcmUnXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwibmVzdGVkRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpzaW5nbGU9XCJpc1NpbmdsZUNvbXBvbmVudFwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYWZ0ZXInXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldEFsbFBhbmVsRW50cmllcywgaXNOZXN0ZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmUnLCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHZpc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWIgPyB0aGlzIDogdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgY29tcG9uZW50U2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBjb21wb25lbnRzIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzXG4gICAgICAvLyBhbmQgYWRkcyB0aGUga2V5IGFzIHRoZSBuYW1lIHRvIGVhY2ggY29tcG9uZW50LCB1c2VkIGZvciBsYWJlbHMsIGV0Yy5cbiAgICAgIC8vIE5PVEU6IHNjaGVtYSBjYW4gYmUgbnVsbCB3aGlsZSBtdWx0aS1mb3JtIGxpc3RzIGxvYWQgdGhlaXIgZGF0YSxcbiAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgYXZhaWxhYmxlIGRhdGEgd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZm9ybS5cbiAgICAgIC8vIFdoZW4gZWRpdGluZyBwcmltaXRpdmUgdmFsdWVzIHRocm91Z2ggYSBmb3JtLCBkbyBub3QgYXBwZW5kICduYW1lJyB0b1xuICAgICAgLy8gdGhlIGNvbXBvbmVudCdzIGRhdGFQYXRoIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gZnJvbSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIC8vIE5PVEU6IE5vdCBhbGwgc2NoZW1hcyAvIGNvbXBvbmVudHMgaGF2ZSBhIHNvdXJjZVNjaGVtYSwgZS5nLiBkaWFsb2dzLlxuICAgICAgY29uc3Qgd3JhcFByaW1pdGl2ZXMgPSB0aGlzLnNvdXJjZVNjaGVtYT8ud3JhcFByaW1pdGl2ZXNcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYT8uY29tcG9uZW50cyB8fCB7fSkubWFwKFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAvLyBBbHdheXMgYWRkIG5hbWUgdG8gY29tcG9uZW50IHNjaGVtYS5cbiAgICAgICAgICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiBuZXN0ZWQgPyB0aGlzLmdldENoaWxkU3RvcmUobmFtZSkgOiB0aGlzLnN0b3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFuZWwgc2NoZW1hcyBmcm9tIGFsbCBjb21wb25lbnQgc2NoZW1hcywgYnkgZmluZGluZyB0aG9zZVxuICAgICAgLy8gdGhhdCB3YW50IHRvIHByb3ZpZGUgYSBwYW5lbC4gU2VlIGBnZXRBbGxQYW5lbEVudHJpZXMoKWAgZm9yIGRldGFpbHMuXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTY2hlbWFzLmZsYXRNYXAoXG4gICAgICAgICh7IHNjaGVtYSwgbmVzdGVkRGF0YVBhdGg6IGRhdGFQYXRoIH0pID0+XG4gICAgICAgICAgZ2V0QWxsUGFuZWxFbnRyaWVzKFxuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMudGFiQ29tcG9uZW50XG4gICAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1NpbmdsZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpbmdsZSAmJiB0aGlzLmNvbXBvbmVudFNjaGVtYXMubGVuZ3RoID09PSAxXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgfSxcblxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudC5fcmVnaXN0ZXJQYW5lKHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy50YWIpIHtcbiAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBoYXNoOiBgIyR7dGhpcy50YWJ9YCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgLy8gUmVtb3ZlIHRoZSBwYWRkaW5nIGFkZGVkIGJ5IGAuZGl0by1jb250YWluZXJgIGluc2lkZSBgLmRpdG8tcGFuZWA6XG4gIG1hcmdpbjogKC0kZm9ybS1zcGFjaW5nKSAoLSRmb3JtLXNwYWNpbmctaGFsZik7XG4gIC8vIEFkZCByZW1vdmVkIGhvcml6b250YWwgbWFyZ2luIGFnYWluIHRvIG1heC13aWR0aDpcbiAgbWF4LXdpZHRoOiAkY29udGVudC13aWR0aCArIDIgKiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gIC8vIFVzZSBgZmxleDogMCVgIGZvciBhbGwgYC5kaXRvLXBhbmVgIGV4Y2VwdCBgLmRpdG8tcGFuZS1tYWluYCxcbiAgLy8gc28gdGhhdCB0aGUgYC5kaXRvLWJ1dHRvbnMtbWFpbmAgY2FuIGJlIG1vdmVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20uXG4gIGZsZXg6IDAlO1xuXG4gICYuZGl0by1wYW5lLW1haW4ge1xuICAgIGZsZXg6IDEwMCU7XG4gIH1cblxuICAuZGl0by1zY2hlbWEtaGVhZGVyOm5vdCguZGl0by1zY2hlbWEtbWVudS1oZWFkZXIpICsgJiB7XG4gICAgLy8gQ2xlYXIgdG9wLW1hcmdpbiBpZiB0aGUgY29tcG9uZW50cyBhcmUgcHJlY2VkZWQgYnkgYSBzY2hlbWEgaGVhZGVyLlxuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cblxuICAuZGl0by1jb250YWluZXIuZGl0by1vbWl0LXBhZGRpbmcgPiAmIHtcbiAgICAvLyBDbGVhciBtYXJnaW5zIHNldCBhYm92ZSBhZ2FpbiBpZiBwYXJlbnQgaXMgb21pdHRpbmcgcGFkZGluZy5cbiAgICBtYXJnaW46IDA7XG4gICAgbWF4LXdpZHRoOiB1bnNldDtcbiAgfVxuXG4gIC5kaXRvLWJyZWFrIHtcbiAgICBmbGV4OiAxMDAlO1xuICAgIGhlaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJhY3Rpb24odmFsdWUpIHtcbiAgY29uc3QgbWF0Y2ggPSAoXG4gICAgaXNTdHJpbmcodmFsdWUpICYmXG4gICAgdmFsdWUubWF0Y2goL15cXHMqKFsrLV0/XFxkKylcXHMqXFwvXFxzKihbKy1dP1xcZCspXFxzKiQvKVxuICApXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IFssIGRpdmlkZW5kLCBkaXZpc29yXSA9IG1hdGNoXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZGl2aWRlbmQpIC8gcGFyc2VGbG9hdChkaXZpc29yKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29udGFpbmVyKFxuICB2LXNob3c9XCJjb21wb25lbnRWaXNpYmxlXCJcbiAgOmNsYXNzPVwiY29udGFpbmVyQ2xhc3NcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZVwiXG4pXG4gIERpdG9MYWJlbChcbiAgICB2LWlmPVwibGFiZWxcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gIClcbiAgY29tcG9uZW50LmRpdG8tY29tcG9uZW50KFxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpzaW5nbGU9XCJzaW5nbGVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpkaXNhYmxlZD1cImNvbXBvbmVudERpc2FibGVkXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gICAgQGVycm9ycz1cIm9uRXJyb3JzXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50LCBzaG91bGRPbWl0UGFkZGluZyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IHBhcnNlRnJhY3Rpb24gfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Db250YWluZXInLCB7XG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBnZW5lcmF0ZUxhYmVsczogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgdHlwZUNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiBnZXRUeXBlQ29tcG9uZW50KHRoaXMuc2NoZW1hLnR5cGUpXG4gICAgfSxcblxuICAgIGhhc0xhYmVsKCkge1xuICAgICAgY29uc3QgeyBzY2hlbWEgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHNjaGVtYVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGFiZWwgIT09IGZhbHNlICYmXG4gICAgICAgICghIWxhYmVsIHx8IHRoaXMudHlwZUNvbXBvbmVudD8uZ2VuZXJhdGVMYWJlbCAmJiB0aGlzLmdlbmVyYXRlTGFiZWxzKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBsYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0xhYmVsID8gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSkgOiBudWxsXG4gICAgfSxcblxuICAgIGxhYmVsRGF0YVBhdGgoKSB7XG4gICAgICAvLyBVbm5lc3RlZCB0eXBlcyBkb24ndCBoYXZlIGEgZGF0YVBhdGggZm9yIHRoZW1zZWx2ZXMsIGRvbid0IHVzZSBpdDpcbiAgICAgIHJldHVybiB0aGlzLm5lc3RlZCA/IHRoaXMuZGF0YVBhdGggOiBudWxsXG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpZHRoOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZUNvbXBvbmVudD8uZGVmYXVsdFdpZHRoXG4gICAgICB9LFxuICAgICAgZ2V0KHdpZHRoKSB7XG4gICAgICAgIC8vIFVzZSAxMDAlID09IDEuMCBhcyBkZWZhdWx0IHdpZHRoIHdoZW4gbm90aGluZyBpcyBzZXQ6XG4gICAgICAgIHJldHVybiB3aWR0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAxLjBcbiAgICAgICAgICA6IGlzU3RyaW5nKHdpZHRoKVxuICAgICAgICAgICAgPyB3aWR0aC5tYXRjaCgvXlxccypbPD5dP1xccyooLiopJC8pWzFdIC8vIFJlbW92ZSB3aWR0aCBvcGVyYXRvclxuICAgICAgICAgICAgOiB3aWR0aFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50V2lkdGhPcGVyYXRvcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3dpZHRoJywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZ2V0KHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh3aWR0aClcbiAgICAgICAgICA/IHdpZHRoLm1hdGNoKC9eXFxzKihbPD5dPykvKVsxXSB8fCBudWxsXG4gICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRWaXNpYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndmlzaWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlQ29tcG9uZW50Py5kZWZhdWx0VmlzaWJsZVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50RGlzYWJsZWQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkaXNhYmxlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChkaXNhYmxlZCkge1xuICAgICAgICByZXR1cm4gZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29udGFpbmVyQ2xhc3MoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBjb250YWluZXJDbGFzcyB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAnZGl0by1vbWl0LXBhZGRpbmcnOiBzaG91bGRPbWl0UGFkZGluZyh0aGlzLnNjaGVtYSksXG4gICAgICAgIC4uLihcbiAgICAgICAgICBpc1N0cmluZyhjb250YWluZXJDbGFzcylcbiAgICAgICAgICAgID8geyBbY29udGFpbmVyQ2xhc3NdOiB0cnVlIH1cbiAgICAgICAgICAgIDogY29udGFpbmVyQ2xhc3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb21wb25lbnRXaWR0aFxuICAgICAgLy8gJ2F1dG8nID0gbm8gZml0dGluZzpcbiAgICAgIGNvbnN0IGJhc2lzID0gW251bGwsICdhdXRvJywgJ2ZpbGwnXS5pbmNsdWRlcyh3aWR0aClcbiAgICAgICAgPyAnYXV0bydcbiAgICAgICAgOiAvJSQvLnRlc3Qod2lkdGgpXG4gICAgICAgICAgPyBwYXJzZUZsb2F0KHdpZHRoKSAvLyBwZXJjZW50YWdlXG4gICAgICAgICAgOiAvW2Etel0vLnRlc3Qod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoIC8vIG5hdGl2ZSB1bml0c1xuICAgICAgICAgICAgOiBwYXJzZUZyYWN0aW9uKHdpZHRoKSAqIDEwMCAvLyBmcmFjdGlvblxuICAgICAgcmV0dXJuIGlzTnVtYmVyKGJhc2lzKSA/IGAke2Jhc2lzfSVgIDogYmFzaXNcbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGUoKSB7XG4gICAgICAvLyBJbnRlcnByZXQgJz41MCUnIGFzICc1MCUsIGZsZXgtZ3JvdzogMWBcbiAgICAgIGNvbnN0IGdyb3cgPSAoXG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJz4nIHx8XG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJ1xuICAgICAgKVxuICAgICAgLy8gSW50ZXJwcmV0ICc8NTAlJyBhcyAnNTAlLCBmbGV4LXNocmluazogMWBcbiAgICAgIGNvbnN0IHNocmluayA9IHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJzwnXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGV4OiBgJHtncm93ID8gMSA6IDB9ICR7c2hyaW5rID8gMSA6IDB9ICR7dGhpcy5jb21wb25lbnRCYXNpc31gXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzKCkge1xuICAgICAgY29uc3QgYmFzaXNJc0F1dG8gPSB0aGlzLmNvbXBvbmVudEJhc2lzID09PSAnYXV0bydcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXNpbmdsZSc6IHRoaXMuc2luZ2xlLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IHRoaXMuY29tcG9uZW50RGlzYWJsZWQsXG4gICAgICAgICdkaXRvLXdpZHRoLWZpbGwnOiAhYmFzaXNJc0F1dG8gfHwgdGhpcy5jb21wb25lbnRXaWR0aCA9PT0gJ2ZpbGwnLFxuICAgICAgICAnZGl0by13aWR0aC1hdXRvJzogYmFzaXNJc0F1dG8sXG4gICAgICAgICdkaXRvLWhhcy1lcnJvcnMnOiAhIXRoaXMuZXJyb3JzXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkVycm9ycyhlcnJvcnMpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29udGFpbmVyIHtcbiAgLy8gTmVlZGVkIGZvciBiZXR0ZXIgdmVydGljYWwgYWxpZ25tZW50OlxuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvLyBUbyBwcmV2ZW50IGxpc3QgdGFibGVzIGZyb20gYmxvd2luZyBvdXQgb2YgdGhlaXIgZmxleCBib3ggY29udGFpbmVycy5cbiAgbWF4LXdpZHRoOiAxMDAlO1xuICAvLyBDYW5ub3QgdXNlIG1hcmdpbiBoZXJlIGFzIGl0IG5lZWRzIHRvIGJlIHBhcnQgb2YgYm94LXNpemluZyBmb3JcbiAgLy8gcGVyY2VudGFnZXMgaW4gZmxleC1iYXNpcyB0byB3b3JrLlxuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZjtcblxuICAmOmVtcHR5IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgJi5kaXRvLW9taXQtcGFkZGluZyB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIGhlaWdodDogMTAwJTsgLy8gU28gdGhhdCBsaXN0IGJ1dHRvbnMgY2FuIGJlIHN0aWNreSBhdCB0aGUgYm90dG9tO1xuICB9XG59XG5cbi8vIE5PVEU6IFRoaXMgaXMgbm90IG5lc3RlZCBpbnNpZGUgYC5kaXRvLWNvbnRhaW5lcmAgc28gdGhhdCBvdGhlclxuLy8gdHlwZSBjb21wb25lbnRzIGNhbiBvdmVycmlkZSBgLmRpdG8td2lkdGgtZmlsbGAgY2xhc3MgKGZpbHRlciBwcmVjZWRlbmNlKS5cbi5kaXRvLWNvbXBvbmVudCB7XG4gICYuZGl0by13aWR0aC1maWxsIHtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgICYuZGl0by1jaGVja2JveCxcbiAgICAmLmRpdG8tcmFkaW8tYnV0dG9uIHtcbiAgICAgIC8vIFdlYktpdCBkb2Vzbid0IGxpa2UgY2hhbmdlZCB3aWR0aCBvbiBjaGVja2JveGVzIGFuZCByYWRpb3MsIG92ZXJyaWRlOlxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRhYnNcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCIodGFiU2NoZW1hLCBrZXkpIGluIHRhYnNcIlxuICApXG4gICAgUm91dGVyTGluay5kaXRvLWxpbmsoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHRhYlNjaGVtYSlcIlxuICAgICAgOmtleT1cImtleVwiXG4gICAgICA6dG89XCJ7IGhhc2g6IGAjJHtrZXl9YCB9XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogc2VsZWN0ZWRUYWIgPT09IGtleSB9XCJcbiAgICApIHt7IGdldExhYmVsKHRhYlNjaGVtYSwga2V5KSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYnMnLCB7XG4gIHByb3BzOiB7XG4gICAgdGFiczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzZWxlY3RlZFRhYjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJHRhYi1jb2xvci1iYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlc3Q7XG4kdGFiLWNvbG9yLWluYWN0aXZlOiAkY29sb3ItbGlnaHQ7XG4kdGFiLWNvbG9yLWFjdGl2ZTogJGNvbG9yLWxpZ2h0ZXN0O1xuJHRhYi1jb2xvci1ob3ZlcjogJGNvbG9yLXdoaXRlO1xuXG4uZGl0by10YWJzIHtcbiAgLy8gU2VlOiBodHRwczovL2NvZGVwZW4uaW8vdGhvbGV4L3Blbi9odmVCeC9cbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG5cbiAgYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWluYWN0aXZlO1xuICAgIHBhZGRpbmc6ICR0YWItcGFkZGluZy12ZXIgJHRhYi1wYWRkaW5nLWhvcjtcbiAgICBtYXJnaW4tbGVmdDogJHRhYi1tYXJnaW47XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogJHRhYi1yYWRpdXM7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICR0YWItcmFkaXVzO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWhvdmVyO1xuICAgIH1cblxuICAgICY6YWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgICYuZGl0by1hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gT25seSBzaG93IHBhbmVscyBpbiB0YWJzIHdoZW4gdGhlIHRhYnMgYXJlIGFsc28gdmlzaWJsZS5cbmNvbXBvbmVudC5kaXRvLXBhbmVsKFxuICB2LXNob3c9XCJ2aXNpYmxlICYmICghcGFuZWxUYWJDb21wb25lbnQgfHwgcGFuZWxUYWJDb21wb25lbnQudmlzaWJsZSlcIlxuICA6aXM9XCJwYW5lbFRhZ1wiXG4gIEBzdWJtaXQucHJldmVudFxuKVxuICBsYWJlbC5kaXRvLXBhbmVsLXRpdGxlIHt7IGdldExhYmVsKHNjaGVtYSkgfX1cbiAgRGl0b1NjaGVtYS5kaXRvLXBhbmVsLXNjaGVtYShcbiAgICA6c2NoZW1hPVwicGFuZWxTY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgIDpkYXRhPVwicGFuZWxEYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgOmhhc093bkRhdGE9XCJoYXNPd25EYXRhXCJcbiAgKVxuICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgRGl0b0J1dHRvbnMoXG4gICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cInBhbmVsRGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRCdXR0b25TY2hlbWFzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvUGFuZWwnLCB7XG4gIG1peGluczogW1ZhbGlkYXRvck1peGluXSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkcGFuZWxDb21wb25lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAkdGFiQ29tcG9uZW50OiAoKSA9PiB0aGlzLnBhbmVsVGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGFuZWxUYWJDb21wb25lbnQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvd25EYXRhOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEuYnV0dG9ucylcbiAgICB9LFxuXG4gICAgdGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnRhcmdldCB8fCB0aGlzLmRhdGFQYXRoXG4gICAgfSxcblxuICAgIGhhc093bkRhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLm93bkRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3duRGF0YSB8fCB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxTY2hlbWEoKSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25EYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBkYXRhYCBmcm9tIHRoZSBzY2hlbWEsIHNvIHRoYXQgRGl0b1NjaGVtYSBpc24ndCB1c2luZyBpdCB0b1xuICAgICAgICAvLyBwcm9kdWNlIGl0cyBvd24gZGF0YS4gU2VlICRmaWx0ZXJzIHBhbmVsIGZvciBtb3JlIGRldGFpbHMgb24gZGF0YS5cbiAgICAgICAgY29uc3QgeyBkYXRhLCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFuZWxUYWcoKSB7XG4gICAgICAvLyBQYW5lbHMgdGhhdCBwcm92aWRlIHRoZWlyIG93biBkYXRhIG5lZWQgdGhlaXIgb3duIGZvcm0uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gJ2Zvcm0nIDogJ2RpdidcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIElmIHRoZSBwYW5lbCBwcm92aWRlcyBpdHMgb3duIGRhdGEsIHRoZW4gaXQgbmVlZHMgdG8gcHJlZml4IGFsbFxuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIGl0cyBkYXRhLXBhdGgsIGJ1dCBpZiBpdCBzaGFyZXMgZGF0YSB3aXRoIHRoZSBzY2hlbWFcbiAgICAgIC8vIGNvbXBvbmVudCwgdGhlbiBpdCBzaG91bGQgc2hhcmUgdGhlIGRhdGEtcGF0aCBuYW1lIHNwYWNlIHRvby5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyB0aGlzLmRhdGFQYXRoIDogdGhpcy5zY2hlbWFDb21wb25lbnQuZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIC8vIE5PVEU6IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGBzY2hlbWEuZGF0YWAgaGFuZGxpbmcgaW4gRGl0b1NjaGVtYSxcbiAgICAvLyB3aGVyZSB0aGUgZGF0YSBpcyBhZGRlZCB0byB0aGUgYWN0dWFsIGNvbXBvbmVudC5cbiAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXMuc2NoZW1hXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMub3duRGF0YSA9IGlzRnVuY3Rpb24oZGF0YSlcbiAgICAgICAgPyBkYXRhLmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuICAgICAgICA6IGRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHBhbmVscyBzbyB0aGF0IG90aGVyIGNvbXBvbmVudHMgY2FuIGZpbmQgdGhlbSBieSB0aGVpclxuICAgICAgLy8gZGF0YS1wYXRoLCBlLmcuIGluIFR5cGVMaXN0Lm9uRmlsdGVyRXJyb3JzKClcbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlclBhbmVsKHRoaXMsIGFkZClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lbCB7XG4gIG1hcmdpbi1ib3R0b206ICRjb250ZW50LXBhZGRpbmc7XG5cbiAgLmRpdG8tcGFuZWwtdGl0bGUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gICAgYmFja2dyb3VuZDogJGJ1dHRvbi1jb2xvcjtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICB9XG5cbiAgLmRpdG8tcGFuZWwtc2NoZW1hIHtcbiAgICBmb250LXNpemU6ICRmb250LXNpemUtc21hbGw7XG4gICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG5cbiAgICA+IC5kaXRvLXNjaGVtYS1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nO1xuXG4gICAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgICAtLWJ1dHRvbi1tYXJnaW46ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tb2JqZWN0IHtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tcGFuZSB7XG4gICAgICBtYXJnaW46IDAgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAgIH1cblxuICAgIC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXBhbmVscyhcbiAgdi1pZj1cInBhbmVscy5sZW5ndGggPiAwXCJcbilcbiAgdGVtcGxhdGUoXG4gICAgdi1mb3I9XCJ7IHNjaGVtYSwgZGF0YVBhdGgsIHRhYkNvbXBvbmVudCB9IGluIHBhbmVsc1wiXG4gIClcbiAgICBEaXRvUGFuZWwoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHNjaGVtYSlcIlxuICAgICAgOmtleT1cImdldFBhbmVsS2V5KGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKHNjaGVtYS5uYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJzY2hlbWEuZGlzYWJsZWQgIT0gbnVsbCA/IHNjaGVtYS5kaXNhYmxlZCA6IGRpc2FibGVkXCJcbiAgICAgIDpwYW5lbFRhYkNvbXBvbmVudD1cInRhYkNvbXBvbmVudFwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVscycsIHtcbiAgcHJvcHM6IHtcbiAgICBwYW5lbHM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRQYW5lbEtleShkYXRhUGF0aCwgdGFiQ29tcG9uZW50KSB7XG4gICAgICAvLyBBbGxvdyBzZXBhcmF0ZSB0YWJzIHRvIHVzZSBwYW5lbHMgb2YgdGhlIHNhbWUgbmFtZSwgYnlcbiAgICAgIC8vIHByZWZpeGluZyB0aGVpciBrZXkgd2l0aCB0aGUgdGFiIG5hbWUuXG4gICAgICByZXR1cm4gdGFiQ29tcG9uZW50ID8gYCR7dGFiQ29tcG9uZW50LnRhYn1fJHtkYXRhUGF0aH1gIDogZGF0YVBhdGhcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lbHMge1xuICBtYXgtd2lkdGg6ICRjb250ZW50LXNpZGViYXItd2lkdGg7XG4gIG1pbi13aWR0aDogY2FsYygkY29udGVudC1zaWRlYmFyLXdpZHRoIC8gMik7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgdXNlU2xvdHMsIENvbW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNWTm9kZUNvbnRlbnQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlICYmIGFzQXJyYXkodm5vZGUpLnNvbWUodm5vZGUgPT4gdm5vZGUudHlwZSAhPT0gQ29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Nsb3RDb250ZW50KHNsb3QsIHByb3BzID0ge30pIHtcbiAgc2xvdCA9IGlzU3RyaW5nKHNsb3QpID8gdXNlU2xvdHMoKVtzbG90XSA6IHNsb3RcbiAgcmV0dXJuIGhhc1ZOb2RlQ29udGVudChzbG90Py4ocHJvcHMpKVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWJ1dHRvbnMoXG4gIHYtaWY9XCJidXR0b25TY2hlbWFzIHx8IGhhc1Nsb3RDb250ZW50KCRzbG90cy5kZWZhdWx0KVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwiKGJ1dHRvblNjaGVtYSwgYnV0dG9uRGF0YVBhdGgpIGluIGJ1dHRvblNjaGVtYXNcIlxuICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoYnV0dG9uU2NoZW1hKVwiXG4gICAgICA6a2V5PVwiYnV0dG9uRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cImJ1dHRvblNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJidXR0b25EYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoYnV0dG9uU2NoZW1hLm5hbWUpXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImZhbHNlXCJcbiAgICApXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwidm5vZGUgb2YgJHNsb3RzLmRlZmF1bHQ/LigpXCJcbiAgKVxuICAgIC8vLSBSZW5kZXIgZWFjaCBub2RlIGluIHRoZSBkZWZhdWx0IHNsb3QgdGhyb3VnaCBgZGl0by12bm9kZWAsXG4gICAgLy8tIHNvIGl0IGNhbiBiZSB3cmFwcGVkIGluIGEgYC5kaXRvLWNvbnRhaW5lcmAgY2xhc3MuXG4gICAgLmRpdG8tY29udGFpbmVyKFxuICAgICAgdi1pZj1cImhhc1ZOb2RlQ29udGVudCh2bm9kZSlcIlxuICAgIClcbiAgICAgIERpdG9Wbm9kZSg6dm5vZGU9XCJ2bm9kZVwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBoYXNTbG90Q29udGVudCwgaGFzVk5vZGVDb250ZW50IH0gZnJvbSAnLi4vdXRpbHMvdnVlLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9CdXR0b25zJywge1xuICBwcm92aWRlOiB7XG4gICAgJHRhYkNvbXBvbmVudDogKCkgPT4gbnVsbFxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGJ1dHRvblNjaGVtYXMoKSB7XG4gICAgICAvLyBDb21wdXRlIGEgYnV0dG9ucyBsaXN0IHdoaWNoIGhhcyB0aGUgZGF0YVBhdGggYmFrZWQgaW50byBpdHMga2V5cy5cbiAgICAgIGNvbnN0IHsgZGF0YVBhdGgsIGJ1dHRvbnMgfSA9IHRoaXNcbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgICAgID8gT2JqZWN0LnZhbHVlcyhidXR0b25zKS5yZWR1Y2UoKHNjaGVtYXMsIGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgc2NoZW1hc1thcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgYnV0dG9uLm5hbWUpXSA9IGJ1dHRvblxuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXNcbiAgICAgICAgICB9LCB7fSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYXNTbG90Q29udGVudCxcbiAgICBoYXNWTm9kZUNvbnRlbnRcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWJ1dHRvbnMge1xuICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gU2V0IGBAY2xpY2suc3RvcGAgdG8gcHJldmVudCBjbGljayBldmVudHMgZnJvbSBidWJibGluZyB0byBkaXRvLWxhYmVsLlxuRGl0b0J1dHRvbnMuZGl0by1lZGl0LWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICA6YnV0dG9ucz1cImJ1dHRvbnNcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gIDpkYXRhPVwiZGF0YVwiXG4gIDptZXRhPVwibWV0YVwiXG4gIDpzdG9yZT1cInN0b3JlXCJcbiAgQGNsaWNrLnN0b3BcbilcbiAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgYS5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNEcmFnZ2FibGVcIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZHJhZylcIlxuICApXG4gIFJvdXRlckxpbmsuZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRWRpdGFibGVcIlxuICAgIDp0bz1cInsgcGF0aDogZWRpdFBhdGggfVwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5lZGl0KVwiXG4gIClcbiAgRGl0b0NyZWF0ZUJ1dHRvbihcbiAgICB2LWlmPVwiaXNDcmVhdGFibGVcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpwYXRoPVwiY3JlYXRlUGF0aFwiXG4gICAgOnZlcmI9XCJ2ZXJicy5jcmVhdGVcIlxuICAgIDp0ZXh0PVwiY3JlYXRlQnV0dG9uVGV4dFwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0RlbGV0YWJsZVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kZWxldGUpXCJcbiAgICBAY2xpY2s9XCIkZW1pdCgnZGVsZXRlJylcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FZGl0QnV0dG9ucycsIHtcbiAgZW1pdHM6IFsnZGVsZXRlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNyZWF0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRlbGV0YWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGVkaXRQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGNyZWF0ZVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYnV0dG9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtPYmplY3QsIEFycmF5XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEuZm9ybSlcbiAgICB9LFxuXG4gICAgaXNEcmFnZ2FibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2RyYWdnYWJsZScpXG4gICAgfSxcblxuICAgIGlzRWRpdGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2VkaXRhYmxlJykgJiYgISF0aGlzLmVkaXRQYXRoXG4gICAgfSxcblxuICAgIGlzQ3JlYXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdjcmVhdGFibGUnKSAmJiAhIXRoaXMuY3JlYXRlUGF0aFxuICAgIH0sXG5cbiAgICBpc0RlbGV0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignZGVsZXRhYmxlJylcbiAgICB9LFxuXG4gICAgY3JlYXRlQnV0dG9uVGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBvdmVycmlkZSBjcmVhdGUgYnV0dG9uIHRocm91Z2ggY3JlYXRhYmxlIG9iamVjdDpcbiAgICAgICAgdGhpcy5zY2hlbWEuY3JlYXRhYmxlPy5sYWJlbCB8fCAoXG4gICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZSBjcmVhdGUgYnV0dG9uIGxhYmVscyBmcm9tIGZyb20gbGFiZWxzIGZvciBsaXN0XG4gICAgICAgICAgLy8gc291cmNlcyB3aXRoIG9ubHkgb25lIGZvcm06XG4gICAgICAgICAgdGhpcy5mb3JtTGFiZWwgJiZcbiAgICAgICAgICBgJHtjYXBpdGFsaXplKHRoaXMudmVyYnMuY3JlYXRlKX0gJHt0aGlzLmZvcm1MYWJlbH1gXG4gICAgICAgICkgfHxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFzT3B0aW9uKG5hbWUpIHtcbiAgICAgIC8vIFRoZSBvcHRpb25zIG9mIHRoZSBvdXRlciBjb21wb25lbnQgYXJlIHBhc3NlZCB0byB0aGUgYnV0dG9ucyBjb21wb25lbnRcbiAgICAgIC8vIHRocm91Z2ggcHJvcGVydGllcyBgdGhpc1tuYW1lXWAsIGJ1dCBjYW4gYmUgZGlzYWJsZWQgb24gYSBwZXItZm9ybVxuICAgICAgLy8gYmFzaXMgYnkgc2V0dGluZyBgc2NoZW1hW25hbWVdYCB0byBgZmFsc2VgLlxuICAgICAgcmV0dXJuICEhKHRoaXNbbmFtZV0gJiYgdGhpcy5zY2hlbWFbbmFtZV0gIT09IGZhbHNlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWVkaXQtYnV0dG9ucyB7XG4gIC8vIE92ZXJyaWRlIGN1cnNvciBmcm9tIGNvbGxhcHNpYmxlIGRpdG8tbGFiZWw6XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZmxleDogbm9uZTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY3JlYXRlLWJ1dHRvblxuICB0ZW1wbGF0ZShcbiAgICB2LWlmPVwic2hvd1B1bGxkb3duXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgOmNsYXNzPVwiYGRpdG8tYnV0dG9uLSR7dmVyYn1gXCJcbiAgICAgIDp0aXRsZT1cImxhYmVsaXplKHZlcmIpXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24oKVwiXG4gICAgKSB7eyB0ZXh0IH19XG4gICAgdWwuZGl0by1wdWxsZG93big6Y2xhc3M9XCJ7ICdkaXRvLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihmb3JtLCB0eXBlKSBpbiBmb3Jtc1wiXG4gICAgICApXG4gICAgICAgIGEoXG4gICAgICAgICAgdi1pZj1cImlzQ3JlYXRhYmxlKGZvcm0pXCJcbiAgICAgICAgICA6Y2xhc3M9XCJgZGl0by10eXBlLSR7dHlwZX1gXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKHR5cGUpXCJcbiAgICAgICAgICBAbW91c2V1cD1cIm9uUHVsbGRvd25Nb3VzZVVwKHR5cGUpXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbChmb3JtKSB9fVxuICBidXR0b24uZGl0by1idXR0b24oXG4gICAgdi1lbHNlXG4gICAgOnR5cGU9XCJpc0lubGluZWQgPyAnYnV0dG9uJyA6ICdzdWJtaXQnXCJcbiAgICA6Y2xhc3M9XCJgZGl0by1idXR0b24tJHt2ZXJifWBcIlxuICAgIDp0aXRsZT1cImxhYmVsaXplKHZlcmIpXCJcbiAgICBAY2xpY2s9XCJjcmVhdGVJdGVtKGZvcm1zLmRlZmF1bHQpXCJcbiAgKSB7eyB0ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBQdWxsZG93bk1peGluIGZyb20gJy4uL21peGlucy9QdWxsZG93bk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0Rm9ybVNjaGVtYXMsIGlzSW5saW5lZCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ3JlYXRlQnV0dG9uJywge1xuICBtaXhpbnM6IFtQdWxsZG93bk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgcGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdmVyYjogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gZ2V0Rm9ybVNjaGVtYXModGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgc2hvd1B1bGxkb3duKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZm9ybXMpLmxlbmd0aCA+IDEgfHwgIXRoaXMuZm9ybXMuZGVmYXVsdFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaXNDcmVhdGFibGUoZm9ybSkge1xuICAgICAgLy8gRm9ybXMgY2FuIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGxpc3QgYnkgcHJvdmlkaW5nIGBjcmVhdGFibGU6IGZhbHNlYFxuICAgICAgcmV0dXJuIGZvcm0uY3JlYXRhYmxlICE9PSBmYWxzZVxuICAgIH0sXG5cbiAgICBjcmVhdGVJdGVtKGZvcm0sIHR5cGUgPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0YWJsZShmb3JtKSkge1xuICAgICAgICBpZiAodGhpcy5pc0lubGluZWQpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZUNvbXBvbmVudC5jcmVhdGVJdGVtKGZvcm0sIHR5cGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goe1xuICAgICAgICAgICAgcGF0aDogYCR7dGhpcy5wYXRofS9jcmVhdGVgLFxuICAgICAgICAgICAgcXVlcnk6IHsgdHlwZSB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsb3dlZCB0byBjcmVhdGUgaXRlbSBmb3IgZ2l2ZW4gZm9ybScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25TZWxlY3QodHlwZSkge1xuICAgICAgdGhpcy5jcmVhdGVJdGVtKHRoaXMuZm9ybXNbdHlwZV0sIHR5cGUpXG4gICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1jcmVhdGUtYnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXB1bGxkb3duIHtcbiAgICByaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jbGlwYm9hcmQuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgdi1pZj1cImNsaXBib2FyZFwiXG4pXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1jb3B5KFxuICAgIHJlZj1cImNvcHlEYXRhXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIkNvcHkgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIWNvcHlFbmFibGVkXCJcbiAgICBAY2xpY2s9XCJvbkNvcHlcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi5kaXRvLWJ1dHRvbi1wYXN0ZShcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0aXRsZT1cIlBhc3RlIERhdGFcIlxuICAgIDpkaXNhYmxlZD1cIiFwYXN0ZUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uUGFzdGVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNPYmplY3QsIGNsb25lLCBkZWluZGVudCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ2xpcGJvYXJkJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBjbGlwYm9hcmQ6IHsgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3B5RW5hYmxlZDogZmFsc2UsXG4gICAgICBwYXN0ZUVuYWJsZWQ6IGZhbHNlLFxuICAgICAgZml4Q2xpcGJvYXJkOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xpcGJvYXJkT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBpc09iamVjdCh0aGlzLmNsaXBib2FyZCkgPyB0aGlzLmNsaXBib2FyZCA6IHt9XG4gICAgfSxcblxuICAgIGNvcHlEYXRhKCkge1xuICAgICAgY29uc3QgeyBjb3B5IH0gPSB0aGlzLmNsaXBib2FyZE9wdGlvbnNcbiAgICAgIHJldHVybiBjb3B5XG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgY29weS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsb25lKGNsaXBib2FyZERhdGEpXG4gICAgfSxcblxuICAgIHBhc3RlRGF0YSgpIHtcbiAgICAgIGNvbnN0IHsgcGFzdGUgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIHBhc3RlXG4gICAgICAgID8gY2xpcGJvYXJkRGF0YSA9PlxuICAgICAgICAgICAgcGFzdGUuY2FsbChcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBjbGlwYm9hcmREYXRhXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIDogY2xpcGJvYXJkRGF0YSA9PiBjbGlwYm9hcmREYXRhXG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2hlY2sgY2xpcGJvYXJkIGNvbnRlbnQgd2hlbmV2ZXIgc29tZXRoaW5nIGdldHMgY29waWVkIG9yIHRoZSB3aW5kb3cgZ2V0c1xuICAgIC8vIChyZSlhY3RpdmF0ZWQsIGFzIHRob3NlIGFyZSB0aGUgbW9tZW50cyB3aGVuIHRoZSBjbGlwYm9hcmQgY2FuIGNoYW5nZTpcbiAgICB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICBjb3B5OiB0aGlzLmNoZWNrQ2xpcGJvYXJkXG4gICAgfSlcbiAgICB0aGlzLmRvbU9uKHdpbmRvdywge1xuICAgICAgZm9jdXM6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuJHdhdGNoKCdkYXRhJywge1xuICAgICAgLy8gQ2hlY2sgcmlnaHQgYXdheSBhbHNvIGluIGNhc2UgdGhlcmUncyBhbHJlYWR5IGRhdGEgKGUuZy4gY3JlYXRlIGZvcm0pLlxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgaGFuZGxlcjogKHRvLCBmcm9tKSA9PiB7XG4gICAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYXN5bmMgZ2V0Q2xpcGJvYXJkRGF0YShyZXBvcnQpIHtcbiAgICAgIC8vIFVzZSB0aGUgaW50ZXJuYWwgY2xpcGJvYXJkIGFzIGZhbGxiYWNrLlxuICAgICAgbGV0IHsgY2xpcGJvYXJkRGF0YSB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LnJlYWRUZXh0Py4oKVxuICAgICAgICBpZiAodGhpcy5maXhDbGlwYm9hcmQgJiYganNvbikge1xuICAgICAgICAgIC8vIFRoaXMgYXBwZWFycyB0byBiZSBuZWVkZWQgb24gU2FmYXJpIHRvIHByZXZlbnQgYSBzdHJhbmdlIFwiUGFzdGVcIlxuICAgICAgICAgIC8vIGJ1dHRvbiBmcm9tIGFwcGVhcmluZyB3aGVuIHRoZSBjbGlwYm9hcmQgaXMgYWNjZXNzZWQgKHdoeT8hKS5cbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIHRoaXMuZml4Q2xpcGJvYXJkID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbikge1xuICAgICAgICAgIGNsaXBib2FyZERhdGEgPSBKU09OLnBhcnNlKGpzb24pXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyci5uYW1lLCBlcnIubWVzc2FnZSlcbiAgICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIGFsZXJ0KGRlaW5kZW50YFxuICAgICAgICAgICAgICBUaGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIGFwcGVhcnMgdG8gYmUgbWFsZm9ybWVkOlxuICAgICAgICAgICAgICAke2Vyci5tZXNzYWdlfVxuICAgICAgICAgICAgYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgJHNjaGVtYSwgLi4uZGF0YSB9ID0gY2xpcGJvYXJkRGF0YSB8fCB7fVxuICAgICAgcmV0dXJuICRzY2hlbWEgPT09IHRoaXMuc2NoZW1hQ29tcG9uZW50Py5zY2hlbWEubmFtZSA/IGRhdGEgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIGNoZWNrQ2xpcGJvYXJkKCkge1xuICAgICAgdGhpcy5jb3B5RW5hYmxlZCA9ICEhdGhpcy5kYXRhXG4gICAgICAvLyBTZWUgaWYgdGhlIGNsaXBib2FyZCBjb250ZW50IGlzIHZhbGlkIEpTT04gZGF0YSB0aGF0IGlzIGNvbXBhdGlibGVcbiAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgdGFyZ2V0IHNjaGVtYSwgYW5kIG9ubHkgdGhlbiBhY3RpdmF0ZSB0aGUgcGFzdGluZzpcbiAgICAgIHRoaXMucGFzdGVFbmFibGVkID0gISEoYXdhaXQgdGhpcy5nZXRDbGlwYm9hcmREYXRhKGZhbHNlKSkgLy8gZG9uJ3QgcmVwb3J0XG4gICAgfSxcblxuICAgIGFzeW5jIG9uQ29weSgpIHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LmNsaXBib2FyZERhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMuY29weURhdGEoZGF0YSlcbiAgICAgICAgLy8gS2VlcCBhbiBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY2xpcGJvYXJkRGF0YSA9IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQ/Lihqc29uKVxuICAgICAgICAgIC8vIFNlZSBpZiB3ZSBjYW4gYWN0aXZhdGUgdGhlIHBhc3RlIGJ1dHRvbiwgZGVwZW5kaW5nIG9uIGJyb3dzZXJzOlxuICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tDbGlwYm9hcmQoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblBhc3RlKCkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEodHJ1ZSkgLy8gcmVwb3J0XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gZGF0YSAmJiB0aGlzLnBhc3RlRGF0YShkYXRhKVxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LnNldERhdGEoZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTG9hZGluZzogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nLCB7IHVwZGF0ZVJvb3QgPSBmYWxzZSwgdXBkYXRlVmlldyA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZyBeICFpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gQm9vbGVhbiB4b3JcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIWlzTG9hZGluZ1xuICAgICAgICBpZiAodXBkYXRlUm9vdCkge1xuICAgICAgICAgIHRoaXMucm9vdENvbXBvbmVudC5yZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVWaWV3KSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29tcG9uZW50LnNldExvYWRpbmcodGhpcy5pc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgTG9hZGluZ01peGluIGZyb20gJy4vTG9hZGluZ01peGluLmpzJ1xuaW1wb3J0IHsgc2V0RGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgbGFiZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluLCBMb2FkaW5nTWl4aW5dLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRyZXNvdXJjZUNvbXBvbmVudDogKCkgPT4gdGhpcyxcbiAgICAgIC8vIFBhc3MgbG9jYWwgdmVyYnMgb3ZlcnJpZGVzIG9uIHRvIGNoaWxkcmVuLCBzZWUgdmVyYnMoKSBjb21wdXRlZCBwcm9wLlxuICAgICAgJHZlcmJzOiAoKSA9PiB0aGlzLnZlcmJzLFxuICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0aGlzLmhhc0RhdGFcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9hZGVkRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHJlc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRoZSByZXNvdXJjZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvdXJjZSBmb3IgdGhlXG4gICAgICAvLyBhc3NvY2lhdGVkIHNvdXJjZSBzY2hlbWEuXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGEgZGF0YS1zb3VyY2UgaWYgaXQgaGFzIGFuIGFzc29jaWF0ZWQgQVBJIHJlc291cmNlOlxuICAgICAgcmV0dXJuICEhdGhpcy5yZXNvdXJjZVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIC8vIFJldHVybnMgYGZhbHNlYGhlcmUsIGJ1dCBpcyBvdmVycmlkZGVuIHRvIHJldHVybiBgdHJ1ZWAgaW5cbiAgICAgIC8vIGBTb3VyY2VNaXhpbmAgZm9yIGNvbXBvbmVudCB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZWlyIG93biBkYXRhLCBidXRcbiAgICAgIC8vIGVkaXQgdGhlaXIgaXRlbXMgdGhyb3VnaCBhIGxpbmtlZCB2aWV3LiAgSW4gdGhpcyBjYXNlLCByZWFsIGlkcyBuZWVkIHRvXG4gICAgICAvLyBiZSB1c2VkLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgLy8gQ2hlY2sgdGhlIGZvcm0gdGhhdCB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvIGFzIHdlbGwsIHNpbmNlIGl0IG1heSBiZVxuICAgICAgLy8gaW4gY3JlYXRpb24gbW9kZSwgd2hpY2ggbWFrZXMgaXQgdHJhbnNpZW50LlxuICAgICAgLy8gTk9URTogVGhpcyBkb2VzIG5vdCBsb29wIGVuZGxlc3NseSBiZWNhdXNlIERpdG9Gb3JtIHJlZGVmaW5lc1xuICAgICAgLy8gYGlzVHJhbnNpZW50KClgIHRvIG9ubHkgcmV0dXJuIGAhdGhpcy5wcm92aWRlc0RhdGFgLlxuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUNvbXBvbmVudFxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMucHJvdmlkZXNEYXRhICYmXG4gICAgICAgICF0aGlzLmxpbmtzVG9WaWV3IHx8XG4gICAgICAgIGZvcm0gJiYgKFxuICAgICAgICAgIGZvcm0uaXNUcmFuc2llbnQgfHxcbiAgICAgICAgICBmb3JtLmlzQ3JlYXRpbmdcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICB0cmFuc2llbnROb3RlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJiAoXG4gICAgICAgICAgJzxiPk5vdGU8L2I+OiB0aGUgcGFyZW50IHN0aWxsIG5lZWRzIHRvIGJlIHNhdmVkICcgK1xuICAgICAgICAgICdpbiBvcmRlciB0byBwZXJzaXN0IHRoaXMgY2hhbmdlLidcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBzaG91bGRMb2FkKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMuaXNUcmFuc2llbnQgJiZcbiAgICAgICAgIXRoaXMuaXNMb2FkaW5nXG4gICAgICApXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAvLyBCYXNlIGRlZmluaXRpb24sIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW5cbiAgICAgIHJldHVybiAhIXRoaXMubG9hZGVkRGF0YVxuICAgIH0sXG5cbiAgICB2ZXJicygpIHtcbiAgICAgIC8vIFRoZSBhY3R1YWwgY29kZSBpcyB0aGUgYGdldFZlcmJzKClgIG1ldGhvZCwgZm9yIGVhc2llciBvdmVycmlkaW5nIG9mXG4gICAgICAvLyB0aGlzIGNvbXB1dGVkIHByb3BlcnR5IGluIGNvbXBvbmVudHMgdGhhdCB1c2UgdGhlIFJlc291cmNlTWl4aW4uXG4gICAgICByZXR1cm4gdGhpcy5nZXRWZXJicygpXG4gICAgfSxcblxuICAgIHBhZ2luYXRpb25SYW5nZSgpIHtcbiAgICAgIC8vIE9ubHkgYXBwbHkgcGFnaW5hdGlvbiB0byBsaXN0cy5cbiAgICAgIGNvbnN0IHsgcGFnaW5hdGU6IGFtb3VudCB9ID0gdGhpcy5zb3VyY2VTY2hlbWFcbiAgICAgIGlmICh0aGlzLmlzTGlzdFNvdXJjZSAmJiBhbW91bnQpIHtcbiAgICAgICAgY29uc3QgeyBwYWdlID0gMCB9ID0gdGhpcy5xdWVyeSB8fCB7fVxuICAgICAgICBjb25zdCBzdGFydCA9IHBhZ2UgKiBhbW91bnRcbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyBhbW91bnQgLSAxXVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgcXVlcnlQYXJhbXMoKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMucGFnaW5hdGlvblJhbmdlXG4gICAgICBjb25zdCB7IHBhZ2UsIC4uLnF1ZXJ5IH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5xdWVyeSwgLy8gUXVlcnkgbWF5IG92ZXJyaWRlIHNjb3BlLlxuICAgICAgICAuLi4ocmFuZ2UgJiYge1xuICAgICAgICAgIC8vIFBhc3MgcGFnaW5hdGlvbiBhcyByYW5nZSwgc28gdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGdldCBPYmplY3Rpb24nc1xuICAgICAgICAgIC8vIHJlc3VsdHMgY291bnRpbmc6XG4gICAgICAgICAgcmFuZ2U6IHJhbmdlLmpvaW4oJywnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIC8vIFdoZW4gY3JlYXRpbmcgbmVzdGVkIGRhdGEsIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBzZXR1cERhdGEoKVxuICAgIGlmICh0aGlzLnByb3ZpZGVzRGF0YSB8fCB0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFJlc291cmNlKCkge1xuICAgICAgLy8gVGhpcyBpcyBkZWZpbmVkIGFzIGEgbWV0aG9kIHNvIHRoZSBjb21wdXRlZCBgcmVzb3VyY2VgIGdldHRlciBjYW5cbiAgICAgIC8vIGJlIG92ZXJyaWRkZW4gYW5kIGBzdXBlcmAgZnVuY3Rpb25hbGl0eSBjYW4gc3RpbGwgYmUgYWNjZXNzZWQuXG4gICAgICByZXR1cm4gZ2V0UmVzb3VyY2UodGhpcy5zb3VyY2VTY2hlbWE/LnJlc291cmNlLCB7XG4gICAgICAgIHR5cGU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudEZvcm1Db21wb25lbnQ/LnJlc291cmNlID8/IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldFZlcmJzKCkge1xuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLiR2ZXJicygpXG4gICAgICByZXR1cm4gdGhpcy5pc1RyYW5zaWVudFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnZlcmJzLFxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdCB2ZXJicyB3aXRoIHRoZWlyIHRyYW5zaWVudCB2ZXJzaW9uczpcbiAgICAgICAgICAgIGNyZWF0ZTogJ2FkZCcsXG4gICAgICAgICAgICBjcmVhdGVkOiAnYWRkZWQnLFxuICAgICAgICAgICAgc2F2ZTogJ2FwcGx5JyxcbiAgICAgICAgICAgIHNhdmVkOiAnYXBwbGllZCcsXG4gICAgICAgICAgICBkZWxldGU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgZGVsZXRlZDogJ3JlbW92ZWQnXG4gICAgICAgICAgfVxuICAgICAgICA6IHZlcmJzXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIC8vIEFjdHVhbCBjb2RlIGlzIGluIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIGl0J3MgZWFzZXIgdG8gb3ZlcnJpZGVcbiAgICAgIC8vIGBzZXR1cERhdGEoKWAgYW5kIGFuZCBjYWxsIGBlbnN1cmVEYXRhKClgIGZyb20gdGhlIG92ZXJyaWRlcyxcbiAgICAgIC8vIHNlZSBEaXRvRm9ybSBhbmQgU291cmNlTWl4aW4uXG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICBlbnN1cmVEYXRhKCkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkTG9hZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKSB7XG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWREYXRhKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsb2FkRGF0YSgpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoZmFsc2UpXG4gICAgfSxcblxuICAgIGxvYWREYXRhKGNsZWFyKSB7XG4gICAgICBpZiAoIXRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckRhdGEoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVxdWVzdERhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSkge1xuICAgICAgcmV0dXJuIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCB0eXBlID8geyB0eXBlIH0gOiB7fSwgdGhpcylcbiAgICB9LFxuXG4gICAgcmVxdWVzdERhdGEoKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnlQYXJhbXNcbiAgICAgIHRoaXMuaGFuZGxlUmVxdWVzdCh7IG1ldGhvZDogJ2dldCcsIHF1ZXJ5IH0sIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YT8udHlwZSA9PT0gJ0ZpbHRlclZhbGlkYXRpb24nICYmXG4gICAgICAgICAgICAgIHRoaXMub25GaWx0ZXJFcnJvcnM/LihkYXRhLmVycm9ycylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVW5hdXRob3JpemVkRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IENhbiB3ZSByZWFsbHkgc3dhbGxvdyB0aGVzZSBlcnJvcnM/XG4gICAgICAgICAgICAgIC8vIElzIGNhbGxpbmcgYGVuc3VyZVVzZXIoKWAgaW4gYG9uQmVmb3JlUmVxdWVzdCgpYCBlbm91Z2g/XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YShyZXNwb25zZS5kYXRhKVxuICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdsb2FkJylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgaXNWYWxpZGF0aW9uRXJyb3IocmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiByZXNwb25zZT8uc3RhdHVzID09PSA0MDBcbiAgICB9LFxuXG4gICAgaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVSZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGRhdGFcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja1xuICAgICkge1xuICAgICAgY29uc3QgbG9hZGluZ09wdGlvbnMgPSB7XG4gICAgICAgIHVwZGF0ZVJvb3Q6IHRydWUsIC8vIERpc3BsYXkgc3Bpbm5lciBpbiBoZWFkZXIgd2hlbiBsb2FkaW5nIGluIHJlc291cmNlc1xuICAgICAgICB1cGRhdGVWaWV3OiB0aGlzLmlzSW5WaWV3IC8vIE5vdGlmeSB2aWV3IG9mIGxvYWRpbmcgZm9yIHZpZXcgY29tcG9uZW50c1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKHRydWUsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgY29uc3QgcmVxdWVzdCA9IHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSwgcXVlcnkgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFBhc3MgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgY2FsbGJhY2ssIHNvIHRoZXkgY2FuIGJlXG4gICAgICAgIC8vIGV4cG9zZWQgdG8gZnVydGhlciBjYWxsYmFja3MgdGhyb3VnaCBEaXRvQ29udGV4dC5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBjYWxsYmFjayByZXR1cm5zIHRydWUsIGVycm9ycyB3ZXJlIGFscmVhZHkgaGFuZGxlZC5cbiAgICAgICAgY29uc3QgeyByZXNwb25zZSB9ID0gZXJyb3JcbiAgICAgICAgaWYgKCFjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBpc1N0cmluZyhkYXRhPy50eXBlKVxuICAgICAgICAgICAgPyBsYWJlbGl6ZShkYXRhLnR5cGUpXG4gICAgICAgICAgICA6ICdFcnJvcidcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YT8ubWVzc2FnZSA/PyBlcnJvclxuICAgICAgICAgIHRoaXMubm90aWZ5KHsgdHlwZTogJ2Vycm9yJywgdGl0bGUsIHRleHQgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBsb2FkaW5nT3B0aW9ucylcbiAgICB9LFxuXG4gICAgZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpIHtcbiAgICAgIC8vIENvbnZlbnRpb246IG9ubHkgcG9zdCwgcHV0IGFuZCBwYXRjaCByZXF1ZXN0cyBwYXNzIHRoZSBkYXRhIGFzIHBheWxvYWQuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5jbHVkZXMobWV0aG9kKSAmJiAoXG4gICAgICAgICAgLy8gVE9ETzogVXNlIGBoYW5kbGVEYXRhU2NoZW1hKClgIGFzeW5jaHJvbm91c2x5IGhlcmUgaW5zdGVhZCwgdG9cbiAgICAgICAgICAvLyBvZmZlciB0aGUgc2FtZSBhbW91bnQgb2YgcG9zc2liaWxpdGllcyBmb3IgZGF0YSBsb2FkaW5nLlxuICAgICAgICAgIGJ1dHRvbi5nZXRTY2hlbWFWYWx1ZShbJ3Jlc291cmNlJywgJ2RhdGEnXSkgfHxcbiAgICAgICAgICBidXR0b24ucHJvY2Vzc2VkSXRlbVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24pIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gZ2V0UmVzb3VyY2UoYnV0dG9uLnNjaGVtYS5yZXNvdXJjZSwge1xuICAgICAgICBwYXJlbnQ6IHRoaXMucmVzb3VyY2VcbiAgICAgIH0pXG4gICAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgeyBtZXRob2QgfSA9IHJlc291cmNlXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldFBheWxvYWREYXRhKGJ1dHRvbiwgbWV0aG9kKVxuICAgICAgICByZXR1cm4gdGhpcy5zdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICBzZXREYXRhID0gZmFsc2UsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyA9ICgpID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IFN1Y2Nlc3NmdWwnLFxuICAgICAgICAgIHRleHQ6ICdSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgc2VudC4nXG4gICAgICAgIH0pLFxuICAgICAgbm90aWZ5RXJyb3IgPSBlcnJvciA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgIGBVbmFibGUgdG8gc2VuZCByZXF1ZXN0JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICB9ID0ge30pIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KFxuICAgICAgICAgIHsgbWV0aG9kLCByZXNvdXJjZSwgZGF0YSB9LFxuICAgICAgICAgIGFzeW5jIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIERpdG8gdmFsaWRhdGlvbiBlcnJvcjpcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5pc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkgJiYgZGF0YS5lcnJvcnNcbiAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNPYmplY3QoZGF0YSkgPyBkYXRhIDogZXJyXG4gICAgICAgICAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlFcnJvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmRlcmx5aW5nIGRhdGEgYmVmb3JlIGNhbGxpbmcgYG5vdGlmeSgpYCBvclxuICAgICAgICAgICAgICAvLyBgdGhpcy5pdGVtTGFiZWxgLCBzbyBpZCBpcyBzZXQgYWZ0ZXIgY3JlYXRpbmcgbmV3IGl0ZW1zLlxuICAgICAgICAgICAgICBpZiAoc2V0RGF0YSAmJiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCBldmVudCwgeyBub3RpZnksIGVycm9yIH0pIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBvdXRzaWRlIG9mIGBlbWl0RXZlbnQoKWAsIHNvIHRoYXRcbiAgICAgIC8vIGBjb250ZXh0Lndhc05vdGlmaWVkYCBjYW4gYmUgY2hlY2tlZCBhZnRlci5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRGl0b0NvbnRleHQoYnV0dG9uLCB7XG4gICAgICAgIG5lc3RlZDogZmFsc2UsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgaXRlbUxhYmVsOiB0aGlzLml0ZW1MYWJlbCxcbiAgICAgICAgZXJyb3JcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBidXR0b24uZW1pdEV2ZW50KGV2ZW50LCB7IGNvbnRleHQgfSlcbiAgICAgIGlmIChcbiAgICAgICAgbm90aWZ5ICYmXG4gICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBpZiBhbnl0aGluZyB3YXMgcmV0dXJuZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICAgICAgcmVzID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgLy8gRG8gbm90IGRpc3BsYXkgZGVmYXVsdCBub3RpZmljYXRpb24gaWYgdGhlIGV2ZW50IGhhbmRsZXIgYWxyZWFkeVxuICAgICAgICAvLyBkaXNwbGF5ZWQgYSBub3RpZmljYXRpb24uXG4gICAgICAgICFjb250ZXh0Lndhc05vdGlmaWVkXG4gICAgICApIHtcbiAgICAgICAgbm90aWZ5KGVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhdGgpIHtcbiAgLy8gRm9yIHBhdGhzIHN0YXJpbmcgd2l0aCBgL2AsIHdlIGNhbiB1c2UgdGhlIG5hdGl2ZSBgVVJMKClgIGNsYXNzIHRvIHJlc29sdmVcbiAgLy8gdGhlIHBhdGgsIHdoaWNoIHdpbGwgYWxzbyBoYW5kbGUgYC4uYCBhbmQgYC5gIHNlZ21lbnRzOlxuICByZXR1cm4gbmV3IFVSTChgZmlsZToke3BhdGh9YCkucGF0aG5hbWVcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1mb3JtLmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgOmNsYXNzPVwieyAnZGl0by1mb3JtLW5lc3RlZCc6IGlzTmVzdGVkUm91dGUgfVwiXG4gIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuKVxuICAvLy0gTk9URTogTmVzdGVkIGZvcm0gY29tcG9uZW50cyBhcmUga2VwdCBhbGl2ZSBieSB1c2luZyBgdi1zaG93YCBpbnN0ZWFkIG9mXG4gIC8vLSBgdi1pZmAgaGVyZSwgc28gZXZlbnQgaGFuZGxpbmcgYW5kIG90aGVyIHRoaW5ncyBzdGlsbCB3b3JrIHdpdGggbmVzdGVkXG4gIC8vLSBlZGl0aW5nLiBPbmx5IHJlbmRlciBhIHJvdXRlci12aWV3IGhlcmUgaWYgdGhpcyBpc24ndCB0aGUgbGFzdCBkYXRhIHJvdXRlXG4gIC8vLSBhbmQgbm90IGEgbmVzdGVkIGZvcm0gcm91dGUsIHdoaWNoIHdpbGwgYXBwZWFyIGVsc2V3aGVyZSBpbiBpdHMgb3duIHZpZXcuXG4gIFJvdXRlclZpZXcoXG4gICAgdi1pZj1cIiEoaXNMYXN0VW5uZXN0ZWRSb3V0ZSB8fCBpc05lc3RlZFJvdXRlKVwiXG4gICAgdi1zaG93PVwiIWlzQWN0aXZlXCJcbiAgKVxuICAvLy0gVXNlIGEgPGRpdj4gZm9yIGlubGluZWQgZm9ybXMsIGFzIHdlIHNob3VsZG4ndCBuZXN0IGFjdHVhbCA8Zm9ybT4gdGFncy5cbiAgY29tcG9uZW50LmRpdG8tc2Nyb2xsKFxuICAgIHYtc2hvdz1cImlzQWN0aXZlXCJcbiAgICA6aXM9XCJpc05lc3RlZFJvdXRlID8gJ2RpdicgOiAnZm9ybSdcIlxuICAgIEBzdWJtaXQucHJldmVudFxuICApXG4gICAgRGl0b1NjaGVtYShcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgRGl0b0J1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICAgIClcbiAgICAvLy0gUHJldmVudCBpbXBsaWNpdCBzdWJtaXNzaW9uIG9mIHRoZSBmb3JtLCBmb3IgZXhhbXBsZSB3aGVuIHR5cGluZyBlbnRlclxuICAgIC8vLSBpbiBhbiBpbnB1dCBmaWVsZC5cbiAgICAvLy0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUxNTA3ODA2XG4gICAgYnV0dG9uKFxuICAgICAgdi1zaG93PVwiZmFsc2VcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBkaXNhYmxlZFxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBjbG9uZSwgY2FwaXRhbGl6ZSwgcGFyc2VEYXRhUGF0aCwgbWVyZ2UgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1Jlc291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGdldEJ1dHRvblNjaGVtYXMsIGlzT2JqZWN0U291cmNlIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGggfSBmcm9tICcuLi91dGlscy9wYXRoLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Gb3JtJywge1xuICBtaXhpbnM6IFtSb3V0ZU1peGluLCBSZXNvdXJjZU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkRGF0YTogbnVsbCxcbiAgICAgIGNsb25lZERhdGE6IHVuZGVmaW5lZCxcbiAgICAgIHNvdXJjZUtleTogbnVsbCxcbiAgICAgIGlzRm9ybTogdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHZlcmJzKCkge1xuICAgICAgLy8gQWRkIHN1Ym1pdCAvIHN1Ym1pdHRlZCB0byB0aGUgdmVyYnMgcmV0dXJuZWQgYnkgUmVzb3VyY2VNaXhpblxuICAgICAgLy8gTk9URTogVGhlc2UgZ2V0IHBhc3NlZCBvbiB0byBjaGlsZHJlbiB0aHJvdWdoOlxuICAgICAgLy8gYHByb3ZpZGUoKSAuLi4geyAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMgfWAgaW4gUmVzb3VyY2VNaXhpblxuICAgICAgY29uc3QgdmVyYnMgPSB0aGlzLmdldFZlcmJzKClcbiAgICAgIGNvbnN0IHsgaXNDcmVhdGluZywgcHJvdmlkZXNEYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi52ZXJicyxcbiAgICAgICAgc3VibWl0OiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlIDogdmVyYnMuc2F2ZSxcbiAgICAgICAgc3VibWl0dGVkOiBpc0NyZWF0aW5nID8gdmVyYnMuY3JlYXRlZCA6IHZlcmJzLnNhdmVkLFxuICAgICAgICBjYW5jZWw6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbCA6IHZlcmJzLmNsb3NlLFxuICAgICAgICBjYW5jZWxsZWQ6IHByb3ZpZGVzRGF0YSA/IHZlcmJzLmNhbmNlbGxlZCA6IHZlcmJzLmNsb3NlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldEl0ZW1Gb3JtU2NoZW1hKFxuICAgICAgICAgIHRoaXMuc291cmNlU2NoZW1hLFxuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgeWV0LCBwcm92aWRlIGFuIGVtcHR5IG9iamVjdCB3aXRoIGp1c3QgdGhlXG4gICAgICAgICAgLy8gcmlnaHQgdHlwZSBzZXQsIHNvIHRoZSBmb3JtIGNhbiBhbHdheXMgYmUgZGV0ZXJtaW5lZC5cbiAgICAgICAgICB0aGlzLmRhdGEgfHwgeyB0eXBlOiB0aGlzLnR5cGUgfSxcbiAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgKSB8fCB7fVxuICAgICAgKSAvLyBBbHdheXMgcmV0dXJuIGEgc2NoZW1hIG9iamVjdCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBpdC5cbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKFxuICAgICAgICBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNhbmNlbCgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN1Ym1pdDogIXRoaXMuaXNNdXRhdGluZyAmJiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICAgICAgICAvLyBTdWJtaXQgYnV0dG9ucyBjbG9zZSB0aGUgZm9ybSBieSBkZWZhdWx0OlxuICAgICAgICAgICAgICBjbG9zZUZvcm06IHRydWUsXG4gICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNsaWNrOiAoeyBjb21wb25lbnQ6IGJ1dHRvbiB9KSA9PiBidXR0b24uc3VibWl0KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zY2hlbWEuYnV0dG9uc1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNMYXN0Um91dGUgfHwgdGhpcy5pc0xhc3RVbm5lc3RlZFJvdXRlXG4gICAgfSxcblxuICAgIGlzVHJhbnNpZW50KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnByb3ZpZGVzRGF0YVxuICAgIH0sXG5cbiAgICBpc0NyZWF0aW5nKCkge1xuICAgICAgLy8gdGhpcy5wYXJhbSBpcyBpbmhlcml0ZWQgZnJvbSBSb3V0ZU1peGluXG4gICAgICByZXR1cm4gdGhpcy5wYXJhbSA9PT0gJ2NyZWF0ZSdcbiAgICB9LFxuXG4gICAgaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc011dGF0aW5nICYmICEhdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5pc0RpcnR5XG4gICAgfSxcblxuICAgIGlzTXV0YXRpbmcoKSB7XG4gICAgICAvLyBXaGVuIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCB0aGUgZm9ybSBlZGl0cyB0aGUgaW5oZXJpdGVkIGRhdGFcbiAgICAgIC8vIGRpcmVjdGx5IGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBmb3IgcGVyc2lzdGVuY2UgdXBvbiBzdWJtaXNzaW9uLlxuICAgICAgLy8gU2VlIGBpbmhlcml0ZWREYXRhKClgIGNvbXB1dGVkIHByb3BlcnR5IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gISF0aGlzLnNvdXJjZVNjaGVtYS5tdXRhdGVcbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRUYWIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50Py5zZWxlY3RlZFRhYiB8fCBudWxsXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICAvLyBUaGUgdHlwZSBvZiBmb3JtIHRvIGNyZWF0ZSwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGVcbiAgICB9LFxuXG4gICAgaXRlbUlkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLnBhcmFtID8/IG51bGxcbiAgICB9LFxuXG4gICAgbWV0aG9kKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNDcmVhdGluZyA/ICdwb3N0JyA6ICdwYXRjaCdcbiAgICB9LFxuXG4gICAgcmVzb3VyY2UoKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZ2V0UmVzb3VyY2UoKVxuICAgICAgcmV0dXJuIGdldE1lbWJlclJlc291cmNlKHRoaXMuaXRlbUlkLCByZXNvdXJjZSkgfHwgcmVzb3VyY2VcbiAgICB9LFxuXG4gICAgYnJlYWRjcnVtYlByZWZpeCgpIHtcbiAgICAgIHJldHVybiBjYXBpdGFsaXplKHRoaXMuaXNDcmVhdGluZyA/IHRoaXMudmVyYnMuY3JlYXRlIDogdGhpcy52ZXJicy5lZGl0KVxuICAgIH0sXG5cbiAgICBkYXRhKCkge1xuICAgICAgLy8gUmV0dXJuIGRpZmZlcmVudCBkYXRhIFwiY29udGFpbmVyc1wiIGJhc2VkIG9uIGRpZmZlcmVudCBzY2VuYXJpb3M6XG4gICAgICAvLyAxLiBjcmVhdGVkRGF0YSwgaWYgd2UncmUgaW4gYSBmb3JtIGZvciBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuICAgICAgLy8gMi4gbG9hZGVkRGF0YSwgaWYgdGhlIGZvcm0gaXRzZWxmIGlzIHRoZSByb290IG9mIHRoZSBkYXRhIChlLmcuIHdoZW5cbiAgICAgIC8vICAgIGRpcmVjdGx5IGxvYWRpbmcgYW4gZWRpdGluZyByb290KS5cbiAgICAgIC8vIDMuIFRoZSBkYXRhIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQsIHdoaWNoIGl0c2VsZiBtYXkgYmUgZWl0aGVyIGFcbiAgICAgIC8vICAgIHZpZXcgdGhhdCBsb2FkZWQgdGhlIGRhdGEsIG9yIGEgZm9ybSB0aGF0IGVpdGhlciBsb2FkZWQgdGhlIGRhdGEsIG9yXG4gICAgICAvLyAgICBhbHNvIGluaGVyaXRlZCBpdCBmcm9tIGl0cyBwYXJlbnQuIE5vdGUgdGhhdCB3ZSB1c2UgYSBjbG9uZSBvZiBpdCxcbiAgICAgIC8vICAgIHNvLCBkYXRhIGNoYW5nZXMgYXJlbid0IGFwcGxpZWQgdW50aWwgc2V0U291cmNlRGF0YSgpIGlzIGNhbGxlZC5cbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZWREYXRhIHx8IHRoaXMubG9hZGVkRGF0YSB8fCB0aGlzLmluaGVyaXRlZERhdGEgfHwgbnVsbFxuICAgIH0sXG5cbiAgICBkYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGFQYXRoRnJvbSh0aGlzLmRhdGFDb21wb25lbnQpXG4gICAgfSxcblxuICAgIHNvdXJjZURhdGEoKSB7XG4gICAgICAvLyBQb3NzaWJsZSBwYXJlbnRzIGFyZSBEaXRvRm9ybSBmb3IgZm9ybXMsIG9yIERpdG9WaWV3IGZvciByb290IGxpc3RzLlxuICAgICAgLy8gQm90aCBoYXZlIGEgZGF0YSBwcm9wZXJ0eSB3aGljaCBhYnN0cmFjdHMgYXdheSBsb2FkaW5nIGFuZCBpbmhlcml0aW5nXG4gICAgICAvLyBvZiBkYXRhLlxuICAgICAgLy8gRm9ybXMgdGhhdCBhcmUgYWJvdXQgdG8gYmUgZGVzdHJveWVkIGR1ZSB0byBuYXZpZ2F0aW9uIGxvb3NlIHRoZWlyXG4gICAgICAvLyByb3V0ZS1yZWNvcmQsIGJ1dCBtaWdodCBzdGlsbCB0cmlnZ2VyIHRoaXMgZ2V0dGVyLiBGaWx0ZXIgdGhvc2Ugb3V0LlxuICAgICAgbGV0IGRhdGEgPSB0aGlzLnJvdXRlUmVjb3JkID8gdGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5kYXRhIDogbnVsbFxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgLy8gSGFuZGxlIG5lc3RlZCBkYXRhIGJ5IHNwbGl0dGluZyB0aGUgZGF0YVBhdGgsIGl0ZXJhdGUgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gYWN0dWFsIGRhdGEgYW5kIGxvb2sgbmVzdCBjaGlsZC1kYXRhIHVwLlxuICAgICAgICBjb25zdCBkYXRhUGFydHMgPSBwYXJzZURhdGFQYXRoKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMucGFyZW50Um91dGVDb21wb25lbnQpXG4gICAgICAgIClcbiAgICAgICAgLy8gQ29tcGFyZSBkYXRhUGFydHMgYWdhaW5zdCBtYXRjaGVkIHJvdXRlUGF0aCBwYXJ0cywgdG8gaWRlbnRpZnkgdGhvc2VcbiAgICAgICAgLy8gcGFydHMgdGhhdCBuZWVkIHRvIGJlIHRyZWF0ZWQgbGlrZSBpZHMgYW5kIG1hcHBlZCB0byBpbmRpY2VzIGluIGRhdGEuXG4gICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucm91dGVSZWNvcmQucGF0aC5zcGxpdCgnLycpXG4gICAgICAgIGNvbnN0IHJvdXRlUGFydHMgPSBwYXRoUGFydHMuc2xpY2UocGF0aFBhcnRzLmxlbmd0aCAtIGRhdGFQYXJ0cy5sZW5ndGgpXG4gICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICB0aGlzLnNvdXJjZUtleSA9IG51bGxcbiAgICAgICAgY29uc3QgbGFzdERhdGFQYXJ0ID0gZGF0YVBhcnRzW2RhdGFQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpICYmIGxhc3REYXRhUGFydCA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9iamVjdCBzb3VyY2UgYW5kIGFyZSBjcmVhdGluZywgdGhlIGRhdGFQYXRoIG5lZWRzIHRvXG4gICAgICAgICAgLy8gYmUgc2hvcnRlbmVkIGJ5IHRoZSAnY3JlYXRlJyBlbnRyeS4gVGhpcyBpc24ndCBuZWVkZWQgZm9yIGxpc3RcbiAgICAgICAgICAvLyBzb3VyY2VzLCBhcyB0aGVyZSB0aGUgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgaXRlbSBpZC5cbiAgICAgICAgICBkYXRhUGFydHMubGVuZ3RoLS1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGRhdGFQYXJ0cy5sZW5ndGg7IGkgPCBsICYmIGRhdGE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGFQYXJ0ID0gZGF0YVBhcnRzW2ldXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiA6aWQgcGFydCwgZmluZCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gd2l0aCBnaXZlbiBpZC5cbiAgICAgICAgICBjb25zdCBrZXkgPSAvXjppZC8udGVzdChyb3V0ZVBhcnRzW2ldKVxuICAgICAgICAgICAgPyBkYXRhUGFydCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgICAgPyBudWxsIC8vIFRoZXJlJ3Mgbm8gaW5kZXggZm9yIGVudHJpZXMgYWJvdXQgdG8gYmUgY3JlYXRlZFxuICAgICAgICAgICAgICA6IHRoaXMuZmluZEl0ZW1JZEluZGV4KHRoaXMuc291cmNlU2NoZW1hLCBkYXRhLCBkYXRhUGFydClcbiAgICAgICAgICAgIDogZGF0YVBhcnRcbiAgICAgICAgICAvLyBTa2lwIHRoZSBmaW5hbCBsb29rdXAgYnV0IHJlbWVtYmVyIGBzb3VyY2VLZXlgLCBhcyB3ZSB3YW50IHRoZVxuICAgICAgICAgIC8vIHBhcmVudCBkYXRhIHNvIHdlIGNhbiByZXBsYWNlIHRoZSBlbnRyeSBhdCBgc291cmNlS2V5YCBvbiBpdC5cbiAgICAgICAgICBpZiAoaSA9PT0gbCAtIDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy5zb3VyY2VLZXkgPSBrZXlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGFba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9LFxuXG4gICAgaW5oZXJpdGVkRGF0YSgpIHtcbiAgICAgIC8vIERhdGEgaW5oZXJpdGVkIGZyb20gcGFyZW50LCBhbmQgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdCByZWFjdGl2ZVxuICAgICAgLy8gY2hhbmdlcyB1bnRpbCBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRocm91Z2ggc2V0U291cmNlRGF0YSgpLCB1bmxlc3NcbiAgICAgIC8vIGBzb3VyY2VTY2hlbWEubXV0YXRlYCBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIGRhdGEgaXMgbXV0YXRlZCBkaXJlY3RseS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICB0aGlzLmNsb25lZERhdGEgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLnNvdXJjZURhdGEgJiZcbiAgICAgICAgdGhpcy5zb3VyY2VLZXkgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV1cbiAgICAgICAgaWYgKCF0aGlzLmlzTXV0YXRpbmcpIHtcbiAgICAgICAgICAvLyBVc2UgYSB0cmljayB0byBzdG9yZSBjbG9uZWQgaW5oZXJpdGVkIGRhdGEgaW4gY2xvbmVkRGF0YSwgdG8gbWFrZVxuICAgICAgICAgIC8vIGl0IHJlYWN0aXZlIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgY2xvbmVkIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gZGF0YSA9IGNsb25lKGRhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEgPT09IG51bGwgJiZcbiAgICAgICAgICAhdGhpcy5pc0NyZWF0aW5nICYmXG4gICAgICAgICAgaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIElmIGRhdGEgb2YgYW4gb2JqZWN0IHNvdXJjZSBpcyBudWxsLCByZWRpcmVjdCB0byBpdHMgY3JlYXRlIHJvdXRlLlxuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goeyBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVkRGF0YVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5oYXNEYXRhKClcbiAgICBoYXNEYXRhKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIGl0ZW1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNvdXJjZVNjaGVtYSwgdGhpcy5kYXRhLCB7IGV4dGVuZGVkOiB0cnVlIH0pXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgc291cmNlRGF0YTogJ2NsZWFyQ2xvbmVkRGF0YScsXG4gICAgLy8gTmVlZGVkIGZvciB0aGUgJ2NyZWF0ZScgcmVkaXJlY3QgaW4gYGluaGVyaXRlZERhdGEoKWAgdG8gd29yazpcbiAgICBjcmVhdGU6ICdzZXR1cERhdGEnXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGVtaXRTY2hlbWFFdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYWluU2NoZW1hQ29tcG9uZW50LmVtaXRFdmVudChldmVudCwgcGFyYW1zKVxuICAgIH0sXG5cbiAgICBnZXREYXRhUGF0aEZyb20ocm91dGUpIHtcbiAgICAgIC8vIEdldCB0aGUgZGF0YSBwYXRoIGJ5IGRlbm9ybWFsaXplUGF0aCB0aGUgcmVsYXRpdmUgcm91dGUgcGF0aFxuICAgICAgcmV0dXJuIHRoaXMuYXBpLmRlbm9ybWFsaXplUGF0aChcbiAgICAgICAgdGhpcy5wYXRoXG4gICAgICAgICAgLy8gRGl0b1ZpZXdzIGhhdmUgbmVzdGVkIHJvdXRlcywgc28gZG9uJ3QgcmVtb3ZlIHRoZWlyIHBhdGguXG4gICAgICAgICAgLnNsaWNlKChyb3V0ZS5pc1ZpZXcgPyAwIDogcm91dGUucGF0aC5sZW5ndGgpICsgMSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0dXBEYXRhKClcbiAgICBzZXR1cERhdGEoKSB7XG4gICAgICBpZiAodGhpcy5pc0NyZWF0aW5nKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgfHw9IHRoaXMuY3JlYXRlRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy50eXBlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbnN1cmVEYXRhKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U291cmNlRGF0YShkYXRhKSB7XG4gICAgICBpZiAodGhpcy5zb3VyY2VEYXRhICYmIHRoaXMuc291cmNlS2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWFpblNjaGVtYUNvbXBvbmVudCB9ID0gdGhpc1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFbdGhpcy5zb3VyY2VLZXldID0gbWFpblNjaGVtYUNvbXBvbmVudC5maWx0ZXJEYXRhKGRhdGEpXG4gICAgICAgIG1haW5TY2hlbWFDb21wb25lbnQub25DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGFkZFNvdXJjZURhdGEoZGF0YSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0U291cmNlKHRoaXMuc291cmNlU2NoZW1hKVxuICAgICAgICA/IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgICA6ICEhdGhpcy5zb3VyY2VEYXRhPy5wdXNoKGRhdGEpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmNsZWFyRGF0YSgpXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5zZXREYXRhKG51bGwpXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLnNldERhdGEoKVxuICAgIHNldERhdGEoZGF0YSkge1xuICAgICAgLy8gc2V0RGF0YSgpIGlzIGNhbGxlZCBhZnRlciBzdWJtaXQgd2hlbiBkYXRhIGhhcyBjaGFuZ2VkLlxuICAgICAgaWYgKHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgLy8gRm9yIGNvbXBvbmVudHMgd2l0aCB0cmFuc2llbnQgZGF0YSwgbW9kaWZ5IHRoaXMuc291cmNlRGF0YS5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZWREYXRhID0gbnVsbFxuICAgICAgICB0aGlzLmxvYWRlZERhdGEgPSBkYXRhXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyQ2xvbmVkRGF0YSh0bywgZnJvbSkge1xuICAgICAgLy8gT25seSBjbGVhciBpZiB0aGUgd2F0Y2hlZCBzb3VyY2VEYXRhIGl0c2VsZiBjaGFuZ2VzIGluIHRoZSBmb3JtLlxuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZSgpXG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGUodGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudC5wYXRoKVxuICAgIH0sXG5cbiAgICBnZXRTdWJtaXRWZXJiKHByZXNlbnQgPSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gcHJlc2VudFxuICAgICAgICAgID8gJ2NyZWF0ZSdcbiAgICAgICAgICA6ICdjcmVhdGVkJ1xuICAgICAgICA6IHByZXNlbnRcbiAgICAgICAgICA/ICdzdWJtaXQnXG4gICAgICAgICAgOiAnc3VibWl0dGVkJ1xuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXQoYnV0dG9uLCB7IHZhbGlkYXRlID0gdHJ1ZSwgY2xvc2VGb3JtID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMudmFsaWRhdGVBbGwoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2V0VmVyYiA9IHByZXNlbnQgPT4gdGhpcy52ZXJic1t0aGlzLmdldFN1Ym1pdFZlcmIocHJlc2VudCldXG5cbiAgICAgIC8vIEFsbG93IGJ1dHRvbnMgdG8gb3ZlcnJpZGUgYm90aCBtZXRob2QgYW5kIHJlc291cmNlIHBhdGggdG8gc3VibWl0IHRvOlxuICAgICAgY29uc3QgYnV0dG9uUmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlc291cmNlID0gYnV0dG9uUmVzb3VyY2UgfHwgdGhpcy5yZXNvdXJjZVxuICAgICAgY29uc3QgbWV0aG9kID0gcmVzb3VyY2U/Lm1ldGhvZCB8fCB0aGlzLm1ldGhvZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICBsZXQgc3VjY2Vzc1xuICAgICAgaWYgKCFidXR0b25SZXNvdXJjZSAmJiB0aGlzLmlzVHJhbnNpZW50KSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zaWVudChidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICA/IGBJdGVtICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gXG4gICAgICAgICAgICAgICAgOiBgQ2hhbmdlICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgICAgICAgICAgICA/IGAke3RoaXMuaXRlbUxhYmVsfSB3YXMgJHt2ZXJifS5gXG4gICAgICAgICAgICAgICAgICA6IGBDaGFuZ2VzIHRvICR7dGhpcy5pdGVtTGFiZWx9IHdlcmUgJHt2ZXJifS5gLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpZW50Tm90ZVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbm90aWZ5RXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKHRydWUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgICAgIHRleHQ6IGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfS5gXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBhd2FpdCB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIHNldERhdGE6IHRydWUsXG4gICAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB0aGlzLmVtaXRTY2hlbWFFdmVudCh0aGlzLmdldFN1Ym1pdFZlcmIoKSksXG4gICAgICAgICAgb25FcnJvcjogZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZW1pdFNjaGVtYUV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBlcnJvciB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBub3RpZnlTdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICB0aXRsZTogYFN1Y2Nlc3NmdWxseSAke2NhcGl0YWxpemUodmVyYil9YCxcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogZXJyb3IgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gJHt2ZXJifSAke3RoaXMuaXRlbUxhYmVsfSR7ZXJyb3IgPyAnOicgOiAnJ31gLFxuICAgICAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgdGhpcy5yZXNldFZhbGlkYXRpb24oKVxuICAgICAgICBpZiAoY2xvc2VGb3JtIHx8IGJ1dHRvbi5jbG9zZUZvcm0pIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgICAvLyBSZWRpcmVjdCB0byB0aGUgZm9ybSBlZGl0aW5nIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW06XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldEl0ZW1JZCh0aGlzLnNjaGVtYSwgdGhpcy5kYXRhKVxuICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgcGF0aDogcmVzb2x2ZVBhdGgoYCR7dGhpcy5wYXRofS8uLi8ke2lkfWApIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdFRyYW5zaWVudChidXR0b24sIF9yZXNvdXJjZSwgX21ldGhvZCwgZGF0YSwge1xuICAgICAgb25TdWNjZXNzLFxuICAgICAgb25FcnJvcixcbiAgICAgIG5vdGlmeVN1Y2Nlc3MsXG4gICAgICBub3RpZnlFcnJvclxuICAgIH0pIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZGVmYXVsdCBcInN1Ym1pdHRpbmdcIiBvZiB0cmFuc2llbnQsIG5lc3RlZCBkYXRhOlxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICA/IHRoaXMuYWRkU291cmNlRGF0YShkYXRhKVxuICAgICAgICA6IHRoaXMuc2V0U291cmNlRGF0YShkYXRhKVxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgb25TdWNjZXNzPy4oKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdzdWNjZXNzJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5U3VjY2Vzc1xuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAnQ291bGQgbm90IHN1Ym1pdCB0cmFuc2llbnQgaXRlbSdcbiAgICAgICAgb25FcnJvcj8uKGVycm9yKVxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRCdXR0b25FdmVudChidXR0b24sICdlcnJvcicsIHtcbiAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0Zvcm0gZnJvbSAnLi9EaXRvRm9ybS52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm1OZXN0ZWQnLCB7XG4gIGV4dGVuZHM6IERpdG9Gb3JtXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tZm9ybS1uZXN0ZWQge1xuICAmLFxuICAuZGl0by1zY3JvbGwge1xuICAgIC8vIE5vIHNjcm9sbGluZyBpbnNpZGUgbmVzdGVkIGZvcm1zLCBhbmQgcHJldmVudCBvcGVuIC5tdWx0aXNlbGVjdCBmcm9tXG4gICAgLy8gYmVpbmcgY3JvcHBlZC5cbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1lcnJvcnMoXG4gIHYtaWY9XCJlcnJvcnNcIlxuKVxuICB1bFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJlcnJvciBvZiBlcnJvcnNcIlxuICAgIClcbiAgICAgIHwge3sgZXJyb3IgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9FcnJvcnMnLCB7XG4gIHByb3BzOiB7XG4gICAgZXJyb3JzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWVycm9ycyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcblxuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMXB4O1xuICAgIGNvbG9yOiAkY29sb3ItZXJyb3I7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc2NvcGVzXG4gIFJvdXRlckxpbmsoXG4gICAgdi1mb3I9XCIoc2NvcGUsIGtleSkgaW4gc2NvcGVzXCJcbiAgICA6a2V5PVwia2V5XCJcbiAgICB2LXNsb3Q9XCJ7IG5hdmlnYXRlIH1cIlxuICAgIDp0bz1cImdldFNjb3BlTGluayhzY29wZSlcIlxuICAgIGN1c3RvbVxuICApXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLXNlbGVjdGVkJzogc2NvcGUubmFtZSA9PT0gcXVlcnkuc2NvcGUgfVwiXG4gICAgICA6dGl0bGU9XCJzY29wZS5oaW50IHx8IGdldExhYmVsKHNjb3BlKVwiXG4gICAgICBAY2xpY2s9XCJuYXZpZ2F0ZVwiXG4gICAgKSB7eyBnZXRMYWJlbChzY29wZSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9TY29wZXMnLCB7XG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjb3BlczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U2NvcGVMaW5rKHNjb3BlKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4udGhpcy5xdWVyeSwgc2NvcGU6IHNjb3BlLm5hbWUgfVxuICAgICAgaWYgKHF1ZXJ5LnBhZ2UpIHtcbiAgICAgICAgcXVlcnkucGFnZSA9IDBcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayhxdWVyeSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zY29wZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC8vIEEgYml0IG1vcmUgdGhhbiB0aGUgd2lkdGggb2YgZWxsaXBzaXMsIHRvIHByZXZlbnQgcmVwbGFjaW5nIHNob3J0IHdvcmRzXG4gICAgLy8gd2l0aCBlbGxpcHNpcy5cbiAgICBtaW4td2lkdGg6IDNlbTtcbiAgICBmbGV4OiAwIDEgYXV0bztcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1sZWZ0OiAxZW07XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgIH1cblxuICAgICYgKyAuZGl0by1idXR0b24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgfSAvLyBEb24ndCBjb3ZlciB0aGUgZm9jdXNlZCBib3JkZXIgb2YgYnV0dG9uczpcbiAgICAmOmZvY3VzIHtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblBhZ2luYXRpb24oXG4gIHYtbW9kZWw6cGFnZT1cInBhZ2VcIlxuICA6cGFnZVNpemU9XCJsaW1pdFwiXG4gIDp0b3RhbD1cInRvdGFsXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBQYWdpbmF0aW9uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYWdpbmF0aW9uJywge1xuICBjb21wb25lbnRzOiB7IFBhZ2luYXRpb24gfSxcblxuICBwcm9wczoge1xuICAgIHF1ZXJ5OiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCByZXF1aXJlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBwYWdlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAoK3RoaXMucXVlcnkucGFnZSB8fCAwKSArIDFcbiAgICAgIH0sXG5cbiAgICAgIHNldChwYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChcbiAgICAgICAgICAgIHRoaXMuZ2V0UXVlcnlMaW5rKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgcGFnZTogcGFnZSAtIDFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBuZXh0VGljaywgZGVmaW5lQ29tcG9uZW50LCByZWYsIHJlYWN0aXZlLCBoIH0gZnJvbSAndnVlLWRlbWknO1xuaW1wb3J0IHsgdHJ5T25Nb3VudGVkLCB0cnlPblNjb3BlRGlzcG9zZSwgdW5yZWZFbGVtZW50LCBkZWZhdWx0RG9jdW1lbnQsIHRvVmFsdWUsIHVzZVZNb2RlbCB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5pbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcyc7XG5cbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX29ialJlc3QgPSAoc291cmNlLCBleGNsdWRlKSA9PiB7XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKHNvdXJjZSwgcHJvcCkgJiYgZXhjbHVkZS5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgaWYgKHNvdXJjZSAhPSBudWxsICYmIF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKHNvdXJjZSkpIHtcbiAgICAgIGlmIChleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwICYmIF9fcHJvcElzRW51bS5jYWxsKHNvdXJjZSwgcHJvcCkpXG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICB9XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuZnVuY3Rpb24gdXNlU29ydGFibGUoZWwsIGxpc3QsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgc29ydGFibGU7XG4gIGNvbnN0IF9hID0gb3B0aW9ucywgeyBkb2N1bWVudCA9IGRlZmF1bHREb2N1bWVudCB9ID0gX2EsIHJlc2V0T3B0aW9ucyA9IF9fb2JqUmVzdChfYSwgW1wiZG9jdW1lbnRcIl0pO1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBvblVwZGF0ZTogKGUpID0+IHtcbiAgICAgIG1vdmVBcnJheUVsZW1lbnQobGlzdCwgZS5vbGRJbmRleCwgZS5uZXdJbmRleCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSB0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIgPyBkb2N1bWVudCA9PSBudWxsID8gdm9pZCAwIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkgOiB1bnJlZkVsZW1lbnQoZWwpO1xuICAgIGlmICghdGFyZ2V0KVxuICAgICAgcmV0dXJuO1xuICAgIHNvcnRhYmxlID0gbmV3IFNvcnRhYmxlKHRhcmdldCwgX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIGRlZmF1bHRPcHRpb25zKSwgcmVzZXRPcHRpb25zKSk7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiBzb3J0YWJsZSA9PSBudWxsID8gdm9pZCAwIDogc29ydGFibGUuZGVzdHJveSgpO1xuICB0cnlPbk1vdW50ZWQoc3RhcnQpO1xuICB0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcbiAgcmV0dXJuIHsgc3RvcCwgc3RhcnQgfTtcbn1cbmZ1bmN0aW9uIG1vdmVBcnJheUVsZW1lbnQobGlzdCwgZnJvbSwgdG8pIHtcbiAgY29uc3QgYXJyYXkgPSB0b1ZhbHVlKGxpc3QpO1xuICBpZiAodG8gPj0gMCAmJiB0byA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheS5zcGxpY2UoZnJvbSwgMSlbMF07XG4gICAgbmV4dFRpY2soKCkgPT4gYXJyYXkuc3BsaWNlKHRvLCAwLCBlbGVtZW50KSk7XG4gIH1cbn1cblxuY29uc3QgVXNlU29ydGFibGUgPSAvKiBAX19QVVJFX18gKi8gLyogI19fUFVSRV9fICovIGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiVXNlU29ydGFibGVcIixcbiAgbW9kZWw6IHtcbiAgICAvLyBDb21wYXRpYmxlIHdpdGggdnVlMlxuICAgIHByb3A6IFwibW9kZWxWYWx1ZVwiLFxuICAgIGV2ZW50OiBcInVwZGF0ZTptb2RlbFZhbHVlXCJcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiZGl2XCJcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgbGlzdCA9IHVzZVZNb2RlbChwcm9wcywgXCJtb2RlbFZhbHVlXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJlZigpO1xuICAgIGNvbnN0IGRhdGEgPSByZWFjdGl2ZSh1c2VTb3J0YWJsZSh0YXJnZXQsIGxpc3QsIHByb3BzLm9wdGlvbnMpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHNsb3RzLmRlZmF1bHQpXG4gICAgICAgIHJldHVybiBoKHByb3BzLnRhZywgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KGRhdGEpKTtcbiAgICB9O1xuICB9XG59KTtcblxuZXhwb3J0IHsgVXNlU29ydGFibGUgfTtcbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5pbXBvcnQgeyBVc2VTb3J0YWJsZSB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZVNvcnRhYmxlL2NvbXBvbmVudCdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbSXRlbU1peGluXSxcbiAgY29tcG9uZW50czogeyBVc2VTb3J0YWJsZSB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0U29ydGFibGVPcHRpb25zKGRyYWdnYWJsZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgYnJva2VuIGluIFZ1ZVNvcnRhYmxlLCBhbHdheXMgZW5hYmxlIGl0IGZvciBub3cuXG4gICAgICAgIC8vIGRpc2FibGVkOiAhZHJhZ2dhYmxlLFxuICAgICAgICBoYW5kbGU6ICcuZGl0by1idXR0b24tZHJhZycsXG4gICAgICAgIGRyYWdDbGFzczogJ2RpdG8tc29ydGFibGUtYWN0aXZlJyxcbiAgICAgICAgY2hvc2VuQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWNob3NlbicsXG4gICAgICAgIGdob3N0Q2xhc3M6ICdkaXRvLXNvcnRhYmxlLWdob3N0JyxcbiAgICAgICAgZmFsbGJhY2tDbGFzczogJ2RpdG8tc29ydGFibGUtZmFsbGJhY2snLFxuICAgICAgICBmb3JjZUZhbGxiYWNrOiBmYWxsYmFjayxcbiAgICAgICAgb25TdGFydDogdGhpcy5vblN0YXJ0RHJhZyxcbiAgICAgICAgb25FbmQ6IHRoaXMub25FbmREcmFnXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uU3RhcnREcmFnKCkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWVcbiAgICB9LFxuXG4gICAgb25FbmREcmFnKHsgb2xkSW5kZXgsIG5ld0luZGV4IH0pIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxuICAgICAgaWYgKG9sZEluZGV4ICE9PSBuZXdJbmRleCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0LCBwYWdpbmF0aW9uUmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICAgIC8vIFJlb3JkZXIgdGhlIGNoYW5nZWQgZW50cmllcyBieSB0aGVpciBvcmRlciBrZXksIHRha2luZyBwYWdpbmF0aW9uXG4gICAgICAgIC8vIG9mZnNldHMgaW50byBhY2NvdW50OlxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYWdpbmF0aW9uUmFuZ2U/LlswXSB8fCAwXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGxpc3RbaV1bb3JkZXJLZXldID0gaSArIG9mZnNldFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyZWUtaXRlbShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9YHtcbiAgICAnZGl0by1kcmFnZ2luZyc6IGRyYWdnaW5nLFxuICAgICdkaXRvLWFjdGl2ZSc6IGFjdGl2ZVxuICB9YFxuICA6c3R5bGU9XCJsZXZlbCA+IDAgJiYgeyAnLS1sZXZlbCc6IGxldmVsIH1cIlxuKVxuICAuZGl0by10cmVlLWhlYWRlcihcbiAgICB2LWlmPVwibGFiZWxcIlxuICApXG4gICAgLmRpdG8tdHJlZS1icmFuY2goXG4gICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICBAY2xpY2suc3RvcD1cIm9wZW5lZCA9ICFvcGVuZWRcIlxuICAgIClcbiAgICAgIC5kaXRvLWNoZXZyb24oXG4gICAgICAgIHYtaWY9XCJudW1FbnRyaWVzXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiBvcGVuZWQgfVwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWluZm8oXG4gICAgICAgIHYtaWY9XCJkZXRhaWxzXCJcbiAgICAgICkge3sgZGV0YWlscyB9fVxuICAgIC5kaXRvLXRyZWUtbGVhZihcbiAgICAgIHYtZWxzZVxuICAgIClcbiAgICAgIC5kaXRvLXRyZWUtbGFiZWwoXG4gICAgICAgIHYtaHRtbD1cImxhYmVsXCJcbiAgICAgIClcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1zbWFsbChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICAgICAgICBAY2xpY2s9XCJvbkVkaXRcIlxuICAgICAgKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgIEBjbGljaz1cIm9uRGVsZXRlXCJcbiAgICAgIClcbiAgdGFibGUuZGl0by1wcm9wZXJ0aWVzKFxuICAgIHYtaWY9XCJwcm9wZXJ0aWVzXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICApXG4gICAgdHIoXG4gICAgICB2LWZvcj1cInByb3BlcnR5IGluIHByb3BlcnRpZXNcIlxuICAgIClcbiAgICAgIHRkXG4gICAgICAgIERpdG9MYWJlbChcbiAgICAgICAgICB2LWlmPVwicHJvcGVydHkubGFiZWwgIT09IGZhbHNlXCJcbiAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgICAgOmxhYmVsPVwiZ2V0TGFiZWwocHJvcGVydHkpXCJcbiAgICAgICAgKVxuICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgOmNlbGw9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpzY2hlbWE9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICApXG4gIFVzZVNvcnRhYmxlKFxuICAgIHYtaWY9XCJjaGlsZHJlblNjaGVtYVwiXG4gICAgdi1zaG93PVwib3BlbmVkXCJcbiAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKGNoaWxkcmVuU2NoZW1hLCBjaGlsZHJlbkxpc3QpXCJcbiAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhjaGlsZHJlbkRyYWdnYWJsZSwgdHJ1ZSlcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChjaGlsZHJlbkxpc3QgPSB2YWx1ZSlcIlxuICApXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNoaWxkcmVuSXRlbXNcIlxuICAgICAgOmtleT1cImdldEl0ZW1VaWQoY2hpbGRyZW5TY2hlbWEsIGl0ZW0uZGF0YSlcIlxuICAgICAgOnNjaGVtYT1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImdldEl0ZW1EYXRhUGF0aChjaGlsZHJlblNjaGVtYSwgaW5kZXgpXCJcbiAgICAgIDpkYXRhPVwiaXRlbS5kYXRhXCJcbiAgICAgIDpwYXRoPVwiaXRlbS5wYXRoXCJcbiAgICAgIDpvcGVuPVwiaXRlbS5vcGVuXCJcbiAgICAgIDphY3RpdmU9XCJpdGVtLmFjdGl2ZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEsIHsgaW5kZXggfSlcIlxuICAgICAgOmxldmVsPVwibGV2ZWwgKyAxXCJcbiAgICApXG4gICAgLy8tIFRPRE86IENvbnZlcnQgZGl0by10cmVlLWl0ZW0gdG8gdXNlIGRpdG8tbGFiZWwgaW50ZXJuYWxseSwgYW5kIHRoZW5cbiAgICAvLy0gcGFzcyBgYXNPYmplY3Q6IHRydWVgIGluIHRoZSBgZ2V0SXRlbUxhYmVsKClgIGNhbGwgYWJvdmUuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgaGFzRm9ybVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJlZUl0ZW0nLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBpbmplY3Q6IFsnY29udGFpbmVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtBcnJheSwgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIG9wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhY3RpdmU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsZXZlbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogdGhpcy5vcGVuIHx8IHRoaXMuc2NoZW1hLm9wZW5cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm1ldGFcbiAgICB9LFxuXG4gICAgc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuc3RvcmVcbiAgICB9LFxuXG4gICAgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGlzYWJsZWRcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBuYW1lZCBgc291cmNlU2NoZW1hYCBpbnN0ZWFkPyBVc2UgU291cmNlTWl4aW4/XG4gICAgY2hpbGRyZW5TY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEuY2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5MaXN0KCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgIHJldHVybiBuYW1lICYmIHRoaXMuZGF0YVtuYW1lXVxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkRyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY2hpbGRyZW5MaXN0Py5sZW5ndGggPiAxICYmXG4gICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2RyYWdnYWJsZScsIHtcbiAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIHNjaGVtYTogdGhpcy5jaGlsZHJlblNjaGVtYVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBudW1DaGlsZHJlbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoIHx8IDBcbiAgICB9LFxuXG4gICAgbnVtUHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bUVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1Qcm9wZXJ0aWVzICsgdGhpcy5udW1DaGlsZHJlblxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkl0ZW1zKCkge1xuICAgICAgY29uc3QgeyBjaGlsZHJlblNjaGVtYSwgY2hpbGRyZW5MaXN0IH0gPSB0aGlzXG4gICAgICBpZiAoY2hpbGRyZW5TY2hlbWEgJiYgY2hpbGRyZW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgZWRpdFBhdGggfSA9IHRoaXMuY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuT3BlbiA9ICF0aGlzLnBhdGggJiYgY2hpbGRyZW5TY2hlbWEub3BlblxuICAgICAgICAvLyBCdWlsZCBhIGNoaWxkcmVuIGxpc3Qgd2l0aCBjaGlsZCBtZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyKFxuICAgICAgICAgIGNoaWxkcmVuU2NoZW1hLFxuICAgICAgICAgIGNoaWxkcmVuTGlzdC5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlblNjaGVtYS5wYXRoICYmXG4gICAgICAgICAgICAgIGAke3RoaXMucGF0aH0vJHtjaGlsZHJlblNjaGVtYS5wYXRofS8ke2luZGV4fWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9wZW4gPSAoXG4gICAgICAgICAgICAgIGNoaWxkcmVuT3BlbiB8fFxuICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGFzIFwiaW4gZWRpdCBwYXRoXCIgd2hlbiBpdCdzIG5vdCB0aGUgZnVsbCBlZGl0IHBhdGguXG4gICAgICAgICAgICAgIGVkaXRQYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgcGF0aC5sZW5ndGggPCBlZGl0UGF0aC5sZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGVkaXRQYXRoID09PSBwYXRoXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gW11cbiAgICB9LFxuXG4gICAgZGV0YWlscygpIHtcbiAgICAgIGNvbnN0IHsgbnVtQ2hpbGRyZW4gfSA9IHRoaXNcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG51bUNoaWxkcmVuICYmXG4gICAgICAgIGAke251bUNoaWxkcmVufSAke1xuICAgICAgICAgIG51bUNoaWxkcmVuID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJ1xuICAgICAgICB9YFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZSB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZGVsZXRhYmxlXG4gICAgfSxcblxuICAgIC8vIFRPRE86IFN1cHBvcnQgY3JlYXRhYmxlIVxuICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBjcmVhdGFibGUsIGVkaXRhYmxlIGFuZCBkZWxldGFibGUgb3ZlcnJpZGVzIG9uIHRoZVxuICAgIC8vIGFzc29jaWF0ZWQgZm9ybXMsIGp1c3QgbGlrZSBpbiBgVHlwZUxpc3RgIGFuZCBgVHlwZU9iamVjdGAsIHRocm91Z2hcbiAgICAvLyBgRGl0b0VkaXRCdXR0b25zYC4gSXQgd291bGQgYmUgYmVzdCB0byB1c2UgYERpdG9FZGl0QnV0dG9uc2AgaGVyZSB0b28uXG4gICAgY3JlYXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY3JlYXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNyZWF0YWJsZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRhYmxlICYmIGhhc0Zvcm1TY2hlbWEodGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBlZGl0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VkaXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlZGl0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHByb3BlcnR5Lm5hbWUpXG4gICAgfSxcblxuICAgIG9uRWRpdCgpIHtcbiAgICAgIC8vIEFsbCB3ZSBnb3QgdG8gZG8gaXMgcHVzaCB0aGUgcmlnaHQgZWRpdCBwYXRoIHRvIHRoZSByb3V0ZXIsIHRoZSByZXN0XG4gICAgICAvLyBpcyBoYW5kbGVkIGJ5IG91ciByb3V0ZXMsIGFsbG93aW5nIHJlbG9hZHMgYXMgd2VsbC5cbiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHtcbiAgICAgICAgcGF0aDogYCR7dGhpcy5jb250YWluZXIucGF0aH0ke3RoaXMucGF0aH1gLFxuICAgICAgICAvLyBQcmVzZXJ2ZSBjdXJyZW50IHF1ZXJ5XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25EZWxldGUoKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQhXG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5jb250YWluZXIub25DaGFuZ2UoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtaXRlbSB7XG4gIC0tY2hldnJvbi1pbmRlbnQ6ICN7JGNoZXZyb24taW5kZW50fTtcblxuICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICA+IC5kaXRvLXRyZWUtYnJhbmNoLFxuICAgID4gLmRpdG8tdHJlZS1sZWFmIHtcbiAgICAgIC8vIFVzZSBgLS1sZXZlbGAgQ1NTIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZWQgdGhlIGFjY3VtdWxhdGVkIGluZGVudFxuICAgICAgLy8gcGFkZGluZyBkaXJlY3RseSBpbnN0ZWFkIG9mIGhhdmluZyBpdCBhY2N1bXVsYXRlIGluIG5lc3RlZCBDU1MuXG4gICAgICAvLyBUaGlzIHdheSwgd2UgY2FuIGtlZXAgdGhlIC5kaXRvLWFjdGl2ZSBhcmVhIGNvdmVyIHRoZSBmdWxsIHdpZHRoOlxuICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKHZhcigtLWNoZXZyb24taW5kZW50KSAqICh2YXIoLS1sZXZlbCwgMSkgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdHJlZS1icmFuY2gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoLFxuICAuZGl0by10cmVlLWxlYWYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAxcHggMDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtbGFiZWwsXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwLjM1ZW07XG4gICAgY29sb3I6IHJnYmEoJGNvbG9yLWJsYWNrLCAwLjIpO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbjogMXB4IDAgMXB4IDFlbTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyOmhvdmVyIHtcbiAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9IC8vIEhpZGUgYnV0dG9ucyBkdXJpbmcgZHJhZ2dpbmdcbiAgfVxuXG4gICYuZGl0by1kcmFnZ2luZyB7XG4gICAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuZGl0by1hY3RpdmUge1xuICAgID4gLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDAgJGlucHV0LXBhZGRpbmctaG9yO1xuICAgICAgbWFyZ2luOiAwICgtJGlucHV0LXBhZGRpbmctaG9yKTtcblxuICAgICAgPiAuZGl0by10cmVlLWJyYW5jaCB7XG4gICAgICAgID4gLmRpdG8tY2hldnJvbjo6YmVmb3JlIHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gKiA+IC5kaXRvLXRyZWUtbGFiZWwge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXByb3BlcnRpZXMge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiAkY2hldnJvbi1pbmRlbnQ7XG5cbiAgICA+IHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJzogJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGhlYWQuZGl0by10YWJsZS1oZWFkXG4gIHRyXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICApXG4gICAgICB0aChcbiAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihjb2x1bW4pXCJcbiAgICAgICAgOmNsYXNzPVwiZ2V0Q29sdW1uQ2xhc3MoY29sdW1uKVwiXG4gICAgICApXG4gICAgICAgIFJvdXRlckxpbmsoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgdi1zbG90PVwieyBuYXZpZ2F0ZSB9XCJcbiAgICAgICAgICA6dG89XCJnZXRTb3J0TGluayhjb2x1bW4pXCJcbiAgICAgICAgICBjdXN0b21cbiAgICAgICAgKVxuICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOmNsYXNzPVwiZ2V0U29ydENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgQGNsaWNrPVwibmF2aWdhdGVcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLW9yZGVyLWFycm93c1xuICAgICAgICAgICAgc3BhbiB7eyBnZXRMYWJlbChjb2x1bW4pIH19XG4gICAgICAgIHNwYW4oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICkge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgIHRoKFxuICAgICAgdi1pZj1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgICAvLy0gRW1wdHkgPHNwYW4+IGlzIG5lZWRlZCBmb3Igc3R5bGluZywgc2VlIF90YWJsZS5zY3NzXG4gICAgICBzcGFuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlSGVhZCcsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sdW1uczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgaGFzRWRpdEJ1dHRvbnM6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc29ydCgpIHtcbiAgICAgIGNvbnN0IG9yZGVyID0gKHRoaXMucXVlcnkub3JkZXIgfHwgJycpLnNwbGl0KC9cXHMrLylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG9yZGVyWzBdLFxuICAgICAgICBvcmRlcjogb3JkZXJbMV1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbHVtbkNsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNvbHVtbi0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRTb3J0Q2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lXG4gICAgICAgID8gYGRpdG8tc2VsZWN0ZWQgZGl0by1vcmRlci0ke3RoaXMuc29ydC5vcmRlcn1gXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRTb3J0TGluayhjb2x1bW4pIHtcbiAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiB0aGUgc2FtZSBjb2x1bW4gaXMgY2xpY2tlZCBhZ2Fpbi5cbiAgICAgIGNvbnN0IG9yZGVyID1cbiAgICAgICAgdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lICYmIHRoaXMuc29ydC5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgIDogJ2FzYydcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayh7XG4gICAgICAgIC4uLnRoaXMucXVlcnksXG4gICAgICAgIG9yZGVyOiBgJHtjb2x1bW4ubmFtZX0gJHtvcmRlcn1gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRhYmxlLWhlYWQge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB0ciB7XG4gICAgdGgge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgICAgLy8gQ29udmVudGlvbjogTmVzdGVkIHNwYW5zIGhhbmRsZSBwYWRkaW5nLCBzZWUgYmVsb3dcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgIHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZ1xuICAgICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgICAmOmVtcHR5OjphZnRlciB7XG4gICAgICAgICAgLy8gUHJldmVudCBlbXB0eSA8dGg+IGZyb20gY29sbGFwc2luZ1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gc3BhbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZChcbiAgOmNsYXNzPVwiY2VsbC5jbGFzc1wiXG4gIDpzdHlsZT1cImNlbGwuc3R5bGVcIlxuKVxuICAvLy0gVE9ETzogSW1wbGVtZW50IGlubGluZWQgY29tcG9uZW50cyBpbiBjZWxsIG1vZGUhXG4gIGNvbXBvbmVudChcbiAgICB2LWlmPVwiY2VsbC5jb21wb25lbnRcIlxuICAgIDppcz1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIClcbiAgc3BhbihcbiAgICB2LWVsc2VcbiAgICB2LWh0bWw9XCJyZW5kZXJDZWxsKGRhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFibGVDZWxsJywge1xuICBwcm9wczoge1xuICAgIGNlbGw6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVuZGVyQ2VsbChpdGVtKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHJlbmRlciB9ID0gdGhpcy5jZWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bbmFtZV1cbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIG5hbWUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKHZhbHVlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBEaXRvVk5vZGUoeyB2bm9kZSB9KSB7XG4gIHJldHVybiB2bm9kZVxufVxuXG5EaXRvVk5vZGUucHJvcHMgPSB7XG4gIHZub2RlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Zub2RlJywgRGl0b1ZOb2RlKVxuPC9zY3JpcHQ+XG4iLCIvLyBEaXRvVHlwZUNvbXBvbmVudCBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjb21wb25lbnQgZm9yIGFsbCBvdGhlciB0eXBlXG4vLyBjb21wb25lbnRzIGluc2lkZSB0aGUgdHlwZXMvIGZvbGRlci4gVGhlcmUncyBhbHNvIGEgc2VwYXJhdGUgY29uY3JldGVcbi8vIGBEaXRvVHlwZUNvbXBvbmVudC52dWVgIGNvbXBvbmVudCwgdXNlIHRvIHJlbmRlciBgeyB0eXBlOiAnY29tcG9uZW50JyB9YFxuaW1wb3J0IHsgYXNBcnJheSwgY2FtZWxpemUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgeyByZWdpc3RlclR5cGVDb21wb25lbnQsIGdldFR5cGVDb21wb25lbnQgfSBmcm9tICcuL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0ZW5kczogRGl0b0NvbXBvbmVudCxcbiAgbWl4aW5zOiBbVHlwZU1peGluXSxcblxuICBuYXRpdmVGaWVsZDogZmFsc2UsXG4gIHRleHRGaWVsZDogZmFsc2UsXG4gIC8vIFNldCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBhbGwgb2YgdGhlc2UgdGhhdCBhcmUgdXNlZCBieSBtb3N0IHR5cGVcbiAgLy8gY29tcG9uZW50cy4gVGhlc2Ugb25seSBuZWVkIGRlZmluaW5nIGluIHN1Yi1jbGFzc2VzIHdoZW4gdGhleSBkaWZmZXIuXG4gIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgZGVmYXVsdE5lc3RlZDogdHJ1ZSxcbiAgZGVmYXVsdFZpc2libGU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IHRydWUsXG4gIGV4Y2x1ZGVWYWx1ZTogZmFsc2UsXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogbnVsbCxcbiAgb21pdFBhZGRpbmc6IGZhbHNlLFxuXG4gIGNvbXBvbmVudDogRGl0b0NvbXBvbmVudC5jb21wb25lbnQsXG5cbiAgZ2V0OiBnZXRUeXBlQ29tcG9uZW50LFxuXG4gIHJlZ2lzdGVyKHR5cGVzLCBkZWZpbml0aW9uID0ge30pIHtcbiAgICB0eXBlcyA9IGFzQXJyYXkodHlwZXMpXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoXG4gICAgICBgRGl0b1R5cGUke2NhbWVsaXplKHR5cGVzWzBdLCB0cnVlKX1gLFxuICAgICAgZGVmaW5pdGlvblxuICAgIClcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIHJlZ2lzdGVyVHlwZUNvbXBvbmVudCh0eXBlLCBjb21wb25lbnQpXG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnR5cGU9XCJ0eXBlXCJcbiAgOnRpdGxlPVwidGV4dFwiXG4gIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKSB7eyB0ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGhhc1Jlc291cmNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzb3VyY2UuanMnXG5pbXBvcnQgeyBsYWJlbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2J1dHRvbicsICdzdWJtaXQnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICAgIGV4Y2x1ZGVWYWx1ZTogdHJ1ZSxcbiAgICBkZWZhdWx0V2lkdGg6ICdhdXRvJyxcbiAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIG5pY2VseTpcbiAgICAvLyBvbWl0RmxleEdyb3c6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmVyYigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyYnNbdGhpcy5uYW1lXSB8fCB0aGlzLm5hbWVcbiAgICAgIH0sXG5cbiAgICAgIHRleHQ6IGdldFNjaGVtYUFjY2Vzc29yKCd0ZXh0Jywge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGdldCh0ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQgfHwgbGFiZWxpemUodGhpcy52ZXJiKVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgY2xvc2VGb3JtOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xvc2VGb3JtJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSksXG5cbiAgICAgIC8vIEBvdmVycmlkZVxuICAgICAgZXZlbnRzKCkge1xuICAgICAgICBjb25zdCB7IG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9ID0gdGhpc1xuICAgICAgICByZXR1cm4geyBvbkZvY3VzLCBvbkJsdXIsIG9uQ2xpY2sgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUNvbXBvbmVudD8uc3VibWl0KHRoaXMsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmVtaXRFdmVudCgnY2xpY2snLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgICAvLyBIYXZlIGJ1dHRvbnMgdGhhdCBkZWZpbmUgcmVzb3VyY2VzIGNhbGwgYHRoaXMuc3VibWl0KClgIGJ5IGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJiAvLyBNZWFuaW5nOiBkb24ndCBwcmV2ZW50IGRlZmF1bHQuXG4gICAgICAgICAgaGFzUmVzb3VyY2UodGhpcy5zY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaW5wdXQuZGl0by1jaGVja2JveChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdHlwZT1cImNoZWNrYm94XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94Jywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94IHtcbiAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNGdW5jdGlvbixcbiAgaXNQcm9taXNlLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgZ2V0VmFsdWVBdERhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0xvYWRpbmdNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGFzeW5jRGF0YUVudHJpZXM6IHt9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgbmFtZSwge1xuICAgICAgcmVzb2x2ZUNvdW50ZXIgPSAxLFxuICAgICAgLi4ubG9hZGluZ09wdGlvbnNcbiAgICB9ID0ge30pIHtcbiAgICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICBzY2hlbWEgPSB7IGRhdGE6IHNjaGVtYSB9XG4gICAgICB9XG4gICAgICBsZXQgeyBkYXRhID0gdW5kZWZpbmVkLCBkYXRhUGF0aCA9IG51bGwgfSA9IHNjaGVtYVxuICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFzeW5jIGRhdGEgbG9hZGluZyBhbHJlYWR5IGluIHByb2Nlc3MuXG4gICAgICBjb25zdCBhc3luY0VudHJ5ID0gKHRoaXMuYXN5bmNEYXRhRW50cmllc1tuYW1lXSB8fD0gcmVhY3RpdmUoe1xuICAgICAgICBkZXBlbmRlbmN5RnVuY3Rpb246IG51bGwsXG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAwLFxuICAgICAgICByZXNvbHZlZERhdGE6IG51bGwsXG4gICAgICAgIHJlc29sdmluZzogZmFsc2VcbiAgICAgIH0pKVxuICAgICAgLy8gSWYgdGhlIGRhdGEgY2FsbGJhY2sgcHJvdmlkZWQgYSBkZXBlbmRlbmN5IGZ1bmN0aW9uIHdoZW4gaXQgd2FzIGNhbGxlZCxcbiAgICAgIC8vIGNhbCBpdCBpbiBldmVyeSBjYWxsIG9mIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGZvcmNlIFZ1ZSB0byBrZWVwIHRyYWNrXG4gICAgICAvLyBvZiB0aGUgYXN5bmMgZGVwZW5kZW5jaWVzLlxuICAgICAgYXN5bmNFbnRyeS5kZXBlbmRlbmN5RnVuY3Rpb24/LmNhbGwodGhpcywgdGhpcy5jb250ZXh0KVxuXG4gICAgICBpZiAoYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGRhdGEgd2FzIHJlc29sdmVkIGFscmVhZHksIHJldHVybiBpdCBhbmQgY2xlYXIgdGhlIHZhbHVlIG9uY2VcbiAgICAgICAgLy8gYHJlc29sdmVDb3VudGVyYCByZWFjaGVzIHplcm8uIENvdW50aW5nIGlzIG5lZWRlZCBiZWNhdXNlIGRlcGVuZGluZ1xuICAgICAgICAvLyBvbiB0aGUgdXNlIG9mIGRhdGEgYW5kIHJlYWN0aXZpdHksIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBjb21wdXRlZFxuICAgICAgICAvLyBnZXR0ZXIgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhIGlzIGNoYW5naW5nLiBDbGVhcmluZyB0aGUgcmVzb2x2ZWRcbiAgICAgICAgLy8gZGF0YSB3b3JrcyBiZWNhdXNlIFZ1ZSBjYWNoZXMgdGhlIHJlc3VsdCBvZiBjb21wdXRlZCBnZXR0ZXJzIGFuZCBvbmx5XG4gICAgICAgIC8vIHJlZXZhbHVhdGVzIGlmIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZWQuIFRoaXMgaXMgdG8gZW5zdXJlXG4gICAgICAgIC8vIHRoYXQgYSBjYWNoZWQgdmFsdWUgaGVyZSBkb2Vzbid0IGJsb2NrIC8gb3ZlcnJpZGUgcmVldmFsdWF0aW9uOlxuICAgICAgICBjb25zdCB7IHJlc29sdmVkRGF0YSB9ID0gYXN5bmNFbnRyeVxuICAgICAgICBpZiAoLS1hc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlZERhdGEgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRGF0YVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgY2FsbGluZyB0aGUgZGF0YSBmdW5jdGlvbiB0d2ljZTpcbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmluZykge1xuICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YS5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBkYXRhIGZ1bmN0aW9uIGlzIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZGF0YSBmdW5jdGlvbiBpcyB0aGVyZSB0byB0cmFjayBkZXBlbmRlbmNpZXMgYW5kIHRoZSByZWFsXG4gICAgICAgICAgLy8gZGF0YSBsb2FkaW5nIGhhcHBlbnMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQuIEtlZXAgdHJhY2tcbiAgICAgICAgICAvLyBpdCBpbiBgZGVwZW5kZW5jeUZ1bmN0aW9uYCBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIGVhY2ggY2FsbCBvZlxuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGtlZXAgdGhlIGRlcGVuZGVuY2llcyBpbnRhY3QsIGFuZCBjYWxsXG4gICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQgb25jZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhOlxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uID0gZGF0YVxuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdC5jYWxsKHRoaXMsIHRoaXMuY29udGV4dClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGRhdGEpKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRhdGEgaXMgYXN5bmNocm9ub3VzLCBpdCBjYW4ndCBiZSByZXR1cm5lZCBzdHJhaWdodCBhd2F5LlxuICAgICAgICAgIC8vIEJ1dCB3ZSBjYW4gY2hlYXQgdXNpbmcgY29tcHV0ZWQgcHJvcGVydGllcyBhbmQgYHJlc29sdmVkRGF0YWAsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgZ29pbmcgdG8gcmVjZWl2ZSB0aGUgbG9hZGVkIGRhdGEgYXN5bmNocm9ub3VzbHksXG4gICAgICAgICAgLy8gdHJpZ2dlcmluZyBhIHJlY29tcHV0ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjYWxsc1xuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgLlxuICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2aW5nID0gdHJ1ZVxuICAgICAgICAgIHRoaXMucmVzb2x2ZURhdGEoZGF0YSwgbG9hZGluZ09wdGlvbnMpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID0gcmVzb2x2ZUNvdW50ZXJcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2ZWREYXRhID0gZGF0YVxuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZpbmcgPSBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gQ2xlYXIgZGF0YSB1bnRpbCBwcm9taXNlIGlzIHJlc29sdmVkIGFuZCBgcmVzb2x2ZWREYXRhYCBpcyBzZXRcbiAgICAgICAgICBkYXRhID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFQYXRoKSB7XG4gICAgICAgIGRhdGEgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoXG4gICAgICAgICAgdGhpcy5yb290RGF0YSxcbiAgICAgICAgICBub3JtYWxpemVEYXRhUGF0aChgJHt0aGlzLmRhdGFQYXRofS8ke2RhdGFQYXRofWApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfSxcblxuICAgIGFzeW5jIHJlc29sdmVEYXRhKGxvYWQsIGxvYWRpbmdPcHRpb25zID0ge30pIHtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlLCBsb2FkaW5nT3B0aW9ucylcbiAgICAgIGxldCBkYXRhID0gbnVsbFxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IChpc0Z1bmN0aW9uKGxvYWQpID8gbG9hZCgpIDogbG9hZClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyb3IubWVzc2FnZSB8fCBlcnJvcilcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IERhdGFNaXhpbiBmcm9tICcuL0RhdGFNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBzZXRUZW1wb3JhcnlJZCwgaXNSZWZlcmVuY2UgfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgaXNPYmplY3QsXG4gIGlzQXJyYXksXG4gIGlzU3RyaW5nLFxuICBpc0Z1bmN0aW9uLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgbGFiZWxpemUsXG4gIGRlYm91bmNlQXN5bmNcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGF0YU1peGluXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNPcHRpb25zOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkVmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgY29udmVydFZhbHVlID0gdmFsdWUgPT5cbiAgICAgICAgICB0aGlzLnJlbGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmhhc09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpc0FycmF5KHRoaXMudmFsdWUpXG4gICAgICAgICAgPyB0aGlzLnZhbHVlLm1hcChjb252ZXJ0VmFsdWUpLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbClcbiAgICAgICAgICA6IGNvbnZlcnRWYWx1ZSh0aGlzLnZhbHVlKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gV2hlbiByZWxhdGluZyBhbmQgYXMgc29vbiBhcyB0aGUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLi4uXG4gICAgICAgICAgdGhpcy5yZWxhdGUgJiZcbiAgICAgICAgICB0aGlzLmhhc09wdGlvbnMgJiYgKFxuICAgICAgICAgICAgLy8gLi4uaWYgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBudWxsIGJlY2F1c2UgYSBkaXNhcHBlYXJlZCBvcHRpb24uLi5cbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsICYmIHRoaXMudmFsdWUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIC8vIC4uLm9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlZmVyZW5jZSwgcmVwbGFjZSBpdCB3aXRoIGl0cyBvcHRpb25cbiAgICAgICAgICAgIC8vIHZhbHVlLCBzbyB0aGF0IGl0J2xsIGhvbGQgYWN0dWFsIGRhdGEsIG5vdCBqdXN0IGEgcmVmZXJlbmNlIGlkLlxuICAgICAgICAgICAgaXNSZWZlcmVuY2UodGhpcy52YWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gdmFsdWUgPT5cbiAgICAgICAgICB0aGlzLnJlbGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLm1hcChjb252ZXJ0KVxuICAgICAgICAgIDogY29udmVydCh2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0ZWRPcHRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh0aGlzLnNlbGVjdGVkVmFsdWUpXG4gICAgfSxcblxuICAgIG9wdGlvbnMoKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5oYW5kbGVEYXRhU2NoZW1hKHRoaXMuc2NoZW1hLm9wdGlvbnMsICdvcHRpb25zJywge1xuICAgICAgICByZXNvbHZlQ291bnRlcjogMVxuICAgICAgfSkgPz8gW11cbiAgICAgIGlmICghaXNBcnJheShkYXRhKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3B0aW9ucyBkYXRhLCBzaG91bGQgYmUgYXJyYXk6ICR7ZGF0YX1gKVxuICAgICAgfVxuICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgdGhpcy5oYXNPcHRpb25zID0gZGF0YS5sZW5ndGggPiAwXG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzT3B0aW9ucyhkYXRhKVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgLy8gVGhpcyBpcyBvdmVycmlkZGVuIGluIGBUeXBlTXVsdGlzZWxlY3RgIHRvIHJldHVybiB0aGUgYHNlYXJjaGVkT3B0aW9uc2BcbiAgICAgIC8vIHdoZW4gYSBzZWFyY2ggZmlsdGVyIHdhcyBhcHBsaWVkLlxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICByZWxhdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdyZWxhdGUnLCB7XG4gICAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIGByZWxhdGVCeTogJ2lkJ2BcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugc2NoZW1hIGFjY2Vzc29yIGNhbGxiYWNrIG1hZ2ljIGZvciBgcmVsYXRlYCBhcyB3ZSBuZWVkXG4gICAgICAvLyB0aGlzIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCdzIGxpZmUtc3Bhbiwgc2VlIGBwcm9jZXNzRGF0YSgpYCBiZWxvdy5cbiAgICAgIGNhbGxiYWNrOiBmYWxzZVxuICAgIH0pLFxuXG4gICAgZ3JvdXBCeTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2dyb3VwQnknLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYG9wdGlvbnMubGFiZWxLZXlgIC8gYG9wdGlvbkxhYmVsS2V5YD9cbiAgICBvcHRpb25MYWJlbDogZ2V0U2NoZW1hQWNjZXNzb3IoJ29wdGlvbnMubGFiZWwnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KGxhYmVsKSB7XG4gICAgICAgIC8vIElmIG5vIGBsYWJlbGAgd2FzIHByb3ZpZGVkIGJ1dCB0aGUgb3B0aW9ucyBhcmUgb2JqZWN0cywgYXNzdW1lIGFcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiAnbGFiZWwnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGxhYmVsIHx8XG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25LZXkoJ2xhYmVsJykgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgb3B0aW9ucy52YWx1ZUtleWAgLyBgb3B0aW9uVmFsdWVLZXlgP1xuICAgIG9wdGlvblZhbHVlOiBnZXRTY2hlbWFBY2Nlc3Nvcignb3B0aW9ucy52YWx1ZScsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICBnZXQodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgbm8gYGxhYmVsYCB3YXMgcHJvdmlkZWQgYnV0IHRoZSBvcHRpb25zIGFyZSBvYmplY3RzLCBhc3N1bWUgYVxuICAgICAgICAvLyBkZWZhdWx0IHZhbHVlIG9mICd2YWx1ZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUgfHxcbiAgICAgICAgICB0aGlzLnJlbGF0ZSAmJiAnaWQnIHx8XG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25LZXkoJ3ZhbHVlJykgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8vIFRPRE86IENvbnNpZGVyIG1vdmluZyBzZWFyY2ggdG8gYG9wdGlvbnMuc2VhcmNoYD9cbiAgICBzZWFyY2hGaWx0ZXI6IGdldFNjaGVtYUFjY2Vzc29yKCdzZWFyY2gnLCB7XG4gICAgICB0eXBlOiBbT2JqZWN0LCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KHNlYXJjaCkge1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIsIGRlYm91bmNlIH0gPSBpc0Z1bmN0aW9uKHNlYXJjaClcbiAgICAgICAgICAgID8geyBmaWx0ZXI6IHNlYXJjaCB9XG4gICAgICAgICAgICA6IHNlYXJjaFxuICAgICAgICAgIHJldHVybiBkZWJvdW5jZSA/IGRlYm91bmNlQXN5bmMoZmlsdGVyLCBkZWJvdW5jZSkgOiBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZ3JvdXBCeUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBCeSA/ICdsYWJlbCcgOiBudWxsXG4gICAgfSxcblxuICAgIGdyb3VwQnlPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBCeSA/ICdvcHRpb25zJyA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE9wdGlvbktleShrZXkpIHtcbiAgICAgIGNvbnN0IFtvcHRpb25dID0gdGhpcy5hY3RpdmVPcHRpb25zXG4gICAgICByZXR1cm4gaXNPYmplY3Qob3B0aW9uKSAmJiBrZXkgaW4gb3B0aW9uID8ga2V5IDogbnVsbFxuICAgIH0sXG5cbiAgICBwcm9jZXNzT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlKSB7XG4gICAgICAgICAgLy8gSWYgaWRzIGFyZSBtaXNzaW5nIGFuZCB3ZSB3YW50IHRvIHJlbGF0ZSwgc2V0IHRlbXBvcmFyeSBpZHMuXG4gICAgICAgICAgLy8gTk9URTogV2UgbmVlZCB0byBtb2RpZnkgdGhlIGFjdHVhbCBkYXRhLCBtYWtpbmcgYSBjb3B5IHdvbid0IHdvcmtcbiAgICAgICAgICAvLyBhcyBpdCB3b24ndCBwcm9wYWdhdGUuXG4gICAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBkYXRhIGlzIGZyb20gdGhlIGdyYXBoIHRoYXRcbiAgICAgICAgICAvLyB3ZSdyZSBjdXJyZW50bHkgZWRpdGluZy5cbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoISgnaWQnIGluIG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgc2V0VGVtcG9yYXJ5SWQob3B0aW9uLCAnaWQnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cEJ5KSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBlZCA9IHt9XG4gICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMucmVkdWNlKFxuICAgICAgICAgICAgKHJlc3VsdHMsIG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG9wdGlvblt0aGlzLmdyb3VwQnldXG4gICAgICAgICAgICAgIGxldCBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdXG4gICAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IGdyb3VwZWRbZ3JvdXBdID0ge1xuICAgICAgICAgICAgICAgICAgW3RoaXMuZ3JvdXBCeUxhYmVsXTogZ3JvdXAsXG4gICAgICAgICAgICAgICAgICBbdGhpcy5ncm91cEJ5T3B0aW9uc106IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbnRyeS5vcHRpb25zLnB1c2gob3B0aW9uKVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uc1xuICAgIH0sXG5cbiAgICBoYXNPcHRpb24ob3B0aW9uKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmdldE9wdGlvbkZvclZhbHVlKHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSlcbiAgICB9LFxuXG4gICAgZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpIHtcbiAgICAgIGNvbnN0IGZpbmRPcHRpb24gPSAob3B0aW9ucywgdmFsdWUsIGdyb3VwQnkpID0+IHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgb3B0aW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAvLyB3aG9sZSBvYmplY3QuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kT3B0aW9uKG9wdGlvbi5vcHRpb25zLCB2YWx1ZSwgbnVsbClcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uVmFsdWVcbiAgICAgICAgPyBmaW5kT3B0aW9uKHRoaXMuYWN0aXZlT3B0aW9ucywgdmFsdWUsIHRoaXMuZ3JvdXBCeSlcbiAgICAgICAgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9uVmFsdWUgfSA9IHRoaXNcbiAgICAgIHJldHVybiBpc1N0cmluZyhvcHRpb25WYWx1ZSlcbiAgICAgICAgPyBvcHRpb24/LltvcHRpb25WYWx1ZV1cbiAgICAgICAgOiBpc0Z1bmN0aW9uKG9wdGlvblZhbHVlKVxuICAgICAgICAgID8gb3B0aW9uVmFsdWUuY2FsbCh0aGlzLCBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBvcHRpb24gfSkpXG4gICAgICAgICAgOiBvcHRpb25cbiAgICB9LFxuXG4gICAgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB7XG4gICAgICBjb25zdCB7IG9wdGlvbkxhYmVsIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNTdHJpbmcob3B0aW9uTGFiZWwpXG4gICAgICAgID8gb3B0aW9uPy5bb3B0aW9uTGFiZWxdXG4gICAgICAgIDogaXNGdW5jdGlvbihvcHRpb25MYWJlbClcbiAgICAgICAgICA/IG9wdGlvbkxhYmVsLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgb3B0aW9uIH0pKVxuICAgICAgICAgIDogbGFiZWxpemUoYCR7b3B0aW9ufWApXG4gICAgfVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpIHtcbiAgICBpZiAoc2NoZW1hLnJlbGF0ZSkge1xuICAgICAgLy8gRm9yIGludGVybmFsbHkgcmVsYXRpbmcgZGF0YSAoYHNjaGVtYS5vcHRpb25zLmRhdGFQYXRoYCksIHdlIG5lZWQgdG9cbiAgICAgIC8vIHByb2Nlc3MgYm90aCB0aGUgb3B0aW9ucyAoZm9yICcjcmVmJykgYW5kIHRoZSB2YWx1ZSAoJyNpZCcpLlxuICAgICAgLy8gU2VlIGBEYXRhTWl4aW4uaGFuZGxlRGF0YVNjaGVtYSgpYDpcbiAgICAgIGNvbnN0IHBhdGggPSBzY2hlbWEub3B0aW9ucz8uZGF0YVBhdGhcbiAgICAgIGNvbnN0IHJlbGF0ZWREYXRhUGF0aCA9IHBhdGhcbiAgICAgICAgPyBub3JtYWxpemVEYXRhUGF0aChgJHtkYXRhUGF0aH0vJHtwYXRofWApXG4gICAgICAgIDogbnVsbFxuICAgICAgZ3JhcGguYWRkUmVsYXRpb24oZGF0YVBhdGgsIHJlbGF0ZWREYXRhUGF0aCwgc2NoZW1hKVxuICAgICAgaWYgKHJlbGF0ZWREYXRhUGF0aCkge1xuICAgICAgICBncmFwaC5zZXRTb3VyY2VSZWxhdGVkKHJlbGF0ZWREYXRhUGF0aClcbiAgICAgIH1cbiAgICAgIC8vIENvbnZlcnQgcmVsYXRpbmcgb2JqZWN0cyB0byBhIHNoYWxsb3cgY29weSB3aXRoIG9ubHkgdGhlIGlkIGxlZnQuXG4gICAgICAvLyBUT0RPOiBDb252ZXJ0IHRvIHVzaW5nIGByZWxhdGVCeWA6XG4gICAgICBjb25zdCBwcm9jZXNzUmVsYXRlID0gdmFsdWUgPT4gKHZhbHVlID8geyBpZDogdmFsdWUuaWQgfSA6IHZhbHVlKVxuICAgICAgLy8gU2VsZWN0ZWQgb3B0aW9ucyBjYW4gYmUgYm90aCBvYmplY3RzICYgYXJyYXlzLCBlLmcuICdjaGVja2JveGVzJzpcbiAgICAgIHZhbHVlID0gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAocHJvY2Vzc1JlbGF0ZSlcbiAgICAgICAgOiBwcm9jZXNzUmVsYXRlKHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnVsLmRpdG8tY2hlY2tib3hlcyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJgZGl0by1sYXlvdXQtJHtzY2hlbWEubGF5b3V0IHx8ICd2ZXJ0aWNhbCd9YFwiXG4pXG4gIGxpKFxuICAgIHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIlxuICApXG4gICAgbGFiZWxcbiAgICAgIGlucHV0LmRpdG8tY2hlY2tib3goXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRPcHRpb25zXCJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgfCB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94ZXMnLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IHRydWUsXG4gIGRlZmF1bHRWYWx1ZTogW10sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSlcbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gb3B0aW9uIHx8IFtdXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2hlY2tib3hlcyB7XG4gIGxhYmVsIHtcbiAgICBAZXh0ZW5kICVpbnB1dC1ib3JkZXJsZXNzO1xuICB9XG5cbiAgLmRpdG8tY2hlY2tib3gge1xuICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jb2RlKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImNvZGVcIlxuICA6c3R5bGU9XCJzdHlsZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCBDb2RlRmxhc2sgZnJvbSAnY29kZWZsYXNrJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NvZGUnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDNcbiAgICB9LFxuXG4gICAgc3R5bGUoKSB7XG4gICAgICByZXR1cm4gYGhlaWdodDogY2FsYygke3RoaXMubGluZXN9ZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpYFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IGZsYXNrID0gbmV3IENvZGVGbGFzayh0aGlzLiRyZWZzLmNvZGUsIHtcbiAgICAgIGxhbmd1YWdlOiB0aGlzLnNjaGVtYS5sYW5ndWFnZSB8fCAnamF2YXNjcmlwdCcsXG4gICAgICB0YWJTaXplOiB0aGlzLnNjaGVtYS5pbmRlbnRTaXplIHx8IDIsXG4gICAgICBsaW5lTnVtYmVyczogZmFsc2VcbiAgICB9KVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgbGV0IGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHRoaXMuZG9tT24odGhpcy4kcmVmcy5jb2RlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyksIHtcbiAgICAgIGZvY3VzOiBvbkZvY3VzLFxuICAgICAgYmx1cjogb25CbHVyXG4gICAgfSlcblxuICAgIGNvbnN0IHNldENvZGUgPSBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSBmbGFzay5jb2RlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IHRydWVcbiAgICAgICAgZmxhc2sudXBkYXRlQ29kZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgb25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsYXNrLm9uVXBkYXRlKHZhbHVlID0+IHtcbiAgICAgIGlmIChpZ25vcmVVcGRhdGUpIHtcbiAgICAgICAgaWdub3JlVXBkYXRlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q29kZSh2YWx1ZSB8fCAnJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0Q29kZSh0aGlzLnZhbHVlIHx8ICcnKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpPy5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29kZSB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gRm9yIHByb3BlciBzaXppbmcgb2YgY29udGVudCBhbG9uZyB3aXRoIDpzdHlsZT1cInN0eWxlXCIgc2V0dGluZyBhYm92ZSxcbiAgLy8gZm9yIHByb3BlciBsaW5lLWhlaWdodCBjYWxjdWxhdGlvbi5cbiAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiBhdXRvO1xuICB9XG5cbiAgLmNvZGVmbGFzayB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAvLyBJZ25vcmUgdGhlIHBhcmVudCBwYWRkaW5nIGRlZmluZWQgYWJvdmUgd2hpY2ggaXMgb25seSBuZWVkZWQgdG8gc2V0XG4gICAgLy8gdGhlIGRlc2lyZWQgaGVpZ2h0IHdpdGggOnN0eWxlPVwic3R5bGVcIi5cbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19wcmUge1xuICAgIC8vIFVzZSBzYW1lIHBhZGRpbmcgYXMgLmRpdG8tY29kZVxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG5cbiAgLmNvZGVmbGFza19fdGV4dGFyZWEsXG4gIC5jb2RlZmxhc2tfX2NvZGUsXG4gIC5jb2RlZmxhc2tfX2xpbmVzIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUpO1xuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7XG4gIH1cblxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWNvbG9yKFxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAuZGl0by1pbnB1dCg6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIilcbiAgICAgIGlucHV0KFxuICAgICAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwiaGV4VmFsdWVcIlxuICAgICAgICB0eXBlPVwiaW5wdXRcIlxuICAgICAgICBzaXplPVwiOFwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgLmRpdG8tY29sb3ItcHJldmlldy5kaXRvLWluaGVyaXQtZm9jdXMoXG4gICAgICAgIHYtaWY9XCJ2YWx1ZVwiXG4gICAgICApXG4gICAgICAgIGRpdig6c3R5bGU9XCJ7IGJhY2tncm91bmQ6IGAjJHtoZXhWYWx1ZSB8fCAnMDAwMDAwMDAnfWAgfVwiKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIEBjbGljay5zdG9wPVwiY2xlYXJcIlxuICAgICAgKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgU2tldGNoUGlja2VyLmRpdG8tY29sb3ItcGlja2VyKFxuICAgICAgdi1tb2RlbD1cImNvbG9yVmFsdWVcIlxuICAgICAgOmRpc2FibGVBbHBoYT1cIiFhbHBoYVwiXG4gICAgICA6ZGlzYWJsZUZpZWxkcz1cIiFpbnB1dHNcIlxuICAgICAgOnByZXNldENvbG9ycz1cInByZXNldHNcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgdGlueWNvbG9yIGZyb20gJ3Rpbnljb2xvcjInXG5pbXBvcnQgeyBTa2V0Y2ggYXMgU2tldGNoUGlja2VyIH0gZnJvbSAnQGxrNzcvdnVlMy1jb2xvcidcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFRyaWdnZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29sb3InLCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgU2tldGNoUGlja2VyIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIGNvbnZlcnRlZEhleFZhbHVlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29sb3JWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB7fVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuY29sb3JGb3JtYXRcbiAgICAgICAgY29uc3Qga2V5ID0gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHZ1ZTMtY29sb3IgY2FsbHMgaXQgJ2hleCcsIHdoaWxlIHRpbnljb2xvciBjYWxscyBpdCAnaGV4NidcbiAgICAgICAgICAgIGhleDogdmFsdWU/LmEgPCAxID8gJ2hleDgnIDogJ2hleCcsXG4gICAgICAgICAgICByZ2I6ICdyZ2JhJ1xuICAgICAgICAgIH1bZm9ybWF0XSB8fFxuICAgICAgICAgIGZvcm1hdFxuICAgICAgICApXG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aW55Y29sb3IodmFsdWUpLnRvU3RyaW5nKGZvcm1hdClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGV4VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZSA9IG51bGxcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IodGhpcy52YWx1ZSlcbiAgICAgICAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBjb2xvclxuICAgICAgICAgICAgICAudG9TdHJpbmcoY29sb3IuZ2V0QWxwaGEoKSA8IDEgPyAnaGV4OCcgOiAnaGV4NicpXG4gICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBgZm9ybWF0YCBjbGFzaGVzIHdpdGggVHlwZU1peGluLmZvcm1hdCgpYCwgd2hpY2ggc2hhbGwgYmUgcmVuYW1lZFxuICAgIC8vIHNvb24gdG8gYGZvcm1hdFZhbHVlKClgLiBSZW5hbWUgYGNvbG9yRm9ybWF0YCBiYWNrIHRvIGBmb3JtYXRgIGFmdGVyLlxuICAgIGNvbG9yRm9ybWF0OiBnZXRTY2hlbWFBY2Nlc3NvcignZm9ybWF0Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hleCdcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0FscGhhYD9cbiAgICBhbHBoYTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FscGhhJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dJbnB1dHNgP1xuICAgIGlucHV0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSksXG5cbiAgICBwcmVzZXRzOiBnZXRTY2hlbWFBY2Nlc3NvcigncHJlc2V0cycsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogW1xuICAgICAgICAnI2ZmZmZmZicsXG4gICAgICAgICcjYzNjM2MzJyxcbiAgICAgICAgJyM3ZjdmN2YnLFxuICAgICAgICAnIzAwMDAwMCcsXG4gICAgICAgICcjODgwMDE1JyxcbiAgICAgICAgJyNlZDFjMjQnLFxuICAgICAgICAnI2ZmN2YyNycsXG4gICAgICAgICcjZmZmMjAwJyxcblxuICAgICAgICAnIzIyYjE0YycsXG4gICAgICAgICcjMDBhMmU4JyxcbiAgICAgICAgJyMzZjQ4Y2MnLFxuICAgICAgICAnI2EzNDlhNCcsXG4gICAgICAgICcjYjk3YTU3JyxcbiAgICAgICAgJyNmZmFlYzknLFxuICAgICAgICAnI2ZmYzkwZScsXG4gICAgICAgICcjMDAwMDAwMDAnXG4gICAgICBdXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzZWQoZm9jdXNlZCkge1xuICAgICAgaWYgKCFmb2N1c2VkICYmIHRoaXMuY29udmVydGVkSGV4VmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IoYCMke3RoaXMuY29udmVydGVkSGV4VmFsdWV9YClcbiAgICAgICAgaWYgKGNvbG9yPy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gY29sb3IudG9TdHJpbmcodGhpcy5jb2xvckZvcm1hdClcbiAgICAgICAgICAvLyBUT0RPOiBFbWl0ICdpbnB1dCcgaGVyZSBpbnN0ZWFkLCBhbmQgJ2NoYW5nZScgaW4gYmx1ciwgbGlrZSBvdGhlcnMuXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kY29sb3Itc3dhdGNoLXdpZHRoOiAkcGF0dGVybi10cmFuc3BhcmVuY3ktc2l6ZTtcbiRjb2xvci1zd2F0Y2gtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtICRib3JkZXItd2lkdGg7XG5cbi5kaXRvLWNvbG9yIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGlucHV0IHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgcGFkZGluZy1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIG1hcmdpbi1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgfVxuXG4gIC5kaXRvLWNvbG9yLXBpY2tlciB7XG4gICAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIH1cblxuICAuZGl0by1jb2xvci1wcmV2aWV3IHtcbiAgICBiYWNrZ3JvdW5kOiAkcGF0dGVybi10cmFuc3BhcmVuY3k7XG4gICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG5cbiAgICAmLFxuICAgIGRpdiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICB2LWJpbmQ9XCIkcHJvcHNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbi8vIFRoaXMgaXMgdGhlIGdlbmVyYWwgcHVycG9zZSAnY29tcG9uZW50JyB0eXBlLCB3aGljaCBjYW4gcmVzb2x2ZSB0byBhbnkgY3VzdG9tXG4vLyBjb21wb25lbnQgdGhyb3VnaCBgc2NoZW1hLmNvbXBvbmVudGAsIHNlZSBgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCgpYC4gVGhpc1xuLy8gY2FuIGJlIHVzZWQgdG8gbmVzdCBhcmJpdHJhcnkgdnVlIGNvbXBvbmVudHMgaW4gc2NoZW1hOlxuLy8ge1xuLy8gICB0eXBlOiAnY29tcG9uZW50Jyxcbi8vICAgY29tcG9uZW50OiBpbXBvcnQoJy4vY29tcG9uZW50Jylcbi8vIH1cblxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb21wb25lbnQnLCB7XG4gIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBgZGVmYXVsdFZhbHVlOiBudWxsYCB0byBub3Qgc2V0IGFueSBkYXRhIGZvciBjdXN0b21cbiAgLy8gY29tcG9uZW50cywgdW5sZXNzIHRoZXkgcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUuXG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEpIHtcbiAgICBhd2FpdCByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0cmlnZ2VyIGV2YWx1YXRpb24gb2YgYHZhbHVlYCB0aGF0IGRvc2Ugbm90XG4vLy0gaW52b2x2ZSBhY3R1YWxseSByZW5kZXJpbmcgaXQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCB2aXNpYmxlLlxuaW5wdXQuZGl0by10ZXh0LmRpdG8taW5wdXQoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIDpuYW1lPVwibmFtZVwiXG4gIHR5cGU9XCJ0ZXh0XCJcbiAgOnZhbHVlPVwidmFsdWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpyZWFkb25seT1cInRydWVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RhdGFNaXhpbi5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnY29tcHV0ZWQnLCAnZGF0YScsICdoaWRkZW4nXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgICBkZWZhdWx0VmlzaWJsZTogZmFsc2UsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzXG4gICAgICAgICAgaWYgKHNjaGVtYS5kYXRhIHx8IHNjaGVtYS5kYXRhUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmhhbmRsZURhdGFTY2hlbWEoc2NoZW1hLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgICAvLyBNb2RpZnlpbmcgYHRoaXMuZGF0YWAgYmVsb3cgdHJpZ2dlcnMgYW5vdGhlciBjYWxsIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgdmFsdWVgIGdldHRlciwgc28gdXNlIGEgdmFsdWUgb2YgMiBmb3IgYHJlc29sdmVDb3VudGVyYCB0b1xuICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHJlc29sdmVkIGRhdGEgdHdpY2UuXG4gICAgICAgICAgICAgIHJlc29sdmVDb3VudGVyOiAyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5uYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuZ2V0LmNhbGwodGhpcylcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICBUeXBlTWl4aW4uY29tcHV0ZWQudmFsdWUuc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGVcbiAgY29tcG9uZW50KFxuICAgIDppcz1cImdldENvbXBvbmVudCh0eXBlKVwiXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJkYXRlVmFsdWVcIlxuICAgIDpsb2NhbGU9XCJsb2NhbGVcIlxuICAgIDpkYXRlRm9ybWF0PVwieyAuLi5hcGkuZm9ybWF0cy5kYXRlLCAuLi5kYXRlRm9ybWF0IH1cIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIERhdGVUaW1lUGlja2VyIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydkYXRlJywgJ2RhdGV0aW1lJywgJ3RpbWUnXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIGNvbXBvbmVudHM6IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSxcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG9ubHkgaGVyZSBzbyB3ZSBnZXQgcGxhY2Vob2xkZXIgYWRkZWQuIENvbWUgdXAgd2l0aCBhXG4gICAgLy8gYmV0dGVyIHdheSB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgcGVyIGNvbXBvbmVudCAoYSBsaXN0IG9mIGFjdHVhbGx5XG4gICAgLy8gc3VwcG9ydGVkIGF0dHJpYnV0ZXMpXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGRhdGVWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKHZhbHVlKSA6IHZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRhdGVGb3JtYXQ6IGdldFNjaGVtYUFjY2Vzc29yKCdkYXRlRm9ybWF0Jywge1xuICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG1ldGhvZHM6IHtcbiAgICAgIGdldENvbXBvbmVudCh0eXBlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0ZTogJ2RhdGUtcGlja2VyJyxcbiAgICAgICAgICB0aW1lOiAndGltZS1waWNrZXInLFxuICAgICAgICAgIGRhdGV0aW1lOiAnZGF0ZS10aW1lLXBpY2tlcidcbiAgICAgICAgfVt0eXBlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzRGF0ZSh2YWx1ZSkgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogdmFsdWVcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSZXNvdXJjZU1peGluIGZyb20gJy4vUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTY2hlbWFQYXJlbnRNaXhpbiBmcm9tICcuLi9taXhpbnMvU2NoZW1hUGFyZW50TWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciwgZ2V0U3RvcmVBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7XG4gIHByb2Nlc3NSb3V0ZVNjaGVtYSxcbiAgcHJvY2Vzc0Zvcm1zLFxuICBnZXROYW1lZFNjaGVtYXMsXG4gIGdldEJ1dHRvblNjaGVtYXMsXG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICBnZXRWaWV3U2NoZW1hLFxuICBoYXNMYWJlbHMsXG4gIGlzQ29tcGFjdCxcbiAgaXNJbmxpbmVkLFxuICBpc09iamVjdFNvdXJjZSxcbiAgaXNMaXN0U291cmNlXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgaXNOdW1iZXIsXG4gIGVxdWFscyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbUmVzb3VyY2VNaXhpbiwgU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGRlZmF1bHRWYWx1ZShzY2hlbWEpIHtcbiAgICByZXR1cm4gaXNMaXN0U291cmNlKHNjaGVtYSkgPyBbXSA6IG51bGxcbiAgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyYXBwZWRQcmltaXRpdmVzOiBudWxsLFxuICAgICAgdW53cmFwcGluZ1ByaW1pdGl2ZXM6IGZhbHNlLFxuICAgICAgaWdub3JlUm91dGVDaGFuZ2U6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgaXNPYmplY3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy50eXBlKVxuICAgIH0sXG5cbiAgICBpc0xpc3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNMaXN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uaGFzRGF0YSgpXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmFsdWVcbiAgICB9LFxuXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgIC8vIExpc3RzIHRoYXQgaGF2ZSBubyBkYXRhIGFuZCBubyBhc3NvY2lhdGVkIHJlc291cmNlIHNob3VsZCBzdGlsbCByZW5kZXIsXG4gICAgICAvLyBhcyB0aGV5IG1heSBiZSBnZXR0aW5nIHRoZWlyIGRhdGEgZWxzZXdoZXJlLCBlLmcuIGBjb21wdXRlKClgLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzRGF0YSB8fCAhdGhpcy5wcm92aWRlc0RhdGFcbiAgICB9LFxuXG4gICAgaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdDb21wb25lbnRcbiAgICB9LFxuXG4gICAgd3JhcFByaW1pdGl2ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEud3JhcFByaW1pdGl2ZXNcbiAgICB9LFxuXG4gICAgbGlzdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBsaXN0IGFycmF5LlxuICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBbZGF0YV0gOiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGRhdGEgZ2V0cyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIHVud3JhcHBpbmcgaXMgbm90IGhhcHBlbmluZ1xuICAgICAgICAgIC8vIGF0IHRoZSByb290IGluIGBzZXREYXRhKClgLCBidXQgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVud3JhcExpc3REYXRhKGRhdGEpIHx8IGRhdGFcbiAgICAgICAgfVxuICAgICAgICBkYXRhIHx8PSBbXVxuICAgICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSB0aGlzXG4gICAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIGlmICh0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHVud3JhcHBpbmcgb25jZSBgbGlzdERhdGFgIGlzIHJlZXZhbHVhdGVkLCBzbyBzZXRcbiAgICAgICAgICAgIC8vIHRoaXMgdG8gYGZhbHNlYCBhZ2Fpbi4gU2VlIGB3cmFwcGVkUHJpbWl0aXZlc2Agd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcyA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSB0byBhIGxpc3Qgb2Ygd3JhcHBlZCBwcmltaXRpdmVzLCBhbmQgcmV0dXJuIGl0LlxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YS5tYXAodmFsdWUgPT4gKHtcbiAgICAgICAgICAgICAgW3dyYXBQcmltaXRpdmVzXTogdmFsdWVcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkUHJpbWl0aXZlc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9LFxuXG4gICAgICBzZXQoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy53cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIHRoaXMud3JhcHBlZFByaW1pdGl2ZXMgPSBkYXRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBkYXRhWzBdXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2JqZWN0RGF0YToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICAvLyBBbHdheXMgZ28gdGhyb3VnaCBgbGlzdERhdGFgIGludGVybmFsbHksIHdoaWNoIGRvZXMgYWxsIHRoZVxuICAgICAgICAvLyBwcm9jZXNzaW5nIG9mIGB3cmFwUHJpbWl0aXZlc2AsIGV0Yy5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdERhdGFbMF0gfHwgbnVsbFxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IGRhdGEgPyBbZGF0YV0gOiBbXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3VyY2VTY2hlbWEoKSB7XG4gICAgICAvLyBUaGUgc291cmNlU2NoZW1hIG9mIGEgbGlzdCBpcyB0aGUgbGlzdCdzIHNjaGVtYSBpdHNlbGYuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIC8vIFRoaXMgaXMgdXNlZCBpbiBUeXBlTGlzdCBmb3IgRGl0b0Zvcm1DaG9vc2VyLlxuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQuZ2V0Q2hpbGRQYXRoKHRoaXMuc2NoZW1hLnBhdGgpXG4gICAgfSxcblxuICAgIGRlZmF1bHRRdWVyeSgpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdE9yZGVyOiBvcmRlciB9ID0gdGhpc1xuICAgICAgcmV0dXJuIG9yZGVyID8geyBvcmRlciB9IDoge31cbiAgICB9LFxuXG4gICAgcXVlcnk6IGdldFN0b3JlQWNjZXNzb3IoJ3F1ZXJ5Jywge1xuICAgICAgZ2V0KHF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0UXVlcnksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgc2V0KHF1ZXJ5KSB7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBkaXNwbGF5ZWQgcXVlcnkgcGFyYW1ldGVycyBpbiBzeW5jIHdpdGggdGhlIHN0b3JlZFxuICAgICAgICAvLyBvbmVzLiBVc2Ugc2NvcGUgYW5kIHBhZ2UgZnJvbSB0aGUgbGlzdCBzY2hlbWEgYXMgZGVmYXVsdHMsIGJ1dCBhbGxvd1xuICAgICAgICAvLyB0aGUgcm91dGUgcXVlcnkgcGFyYW1ldGVycyB0byBvdmVycmlkZSB0aGVtLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc2NvcGUgPSB0aGlzLmRlZmF1bHRTY29wZT8ubmFtZSxcbiAgICAgICAgICBwYWdlID0gdGhpcy5zY2hlbWEucGFnZVxuICAgICAgICB9ID0gdGhpcy5xdWVyeVxuICAgICAgICAvLyBQcmVzZXJ2ZSAvIG1lcmdlIGN1cnJlbnRseSBzdG9yZWQgdmFsdWVzLlxuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgIC4uLihzY29wZSAhPSBudWxsICYmIHsgc2NvcGUgfSksXG4gICAgICAgICAgLi4uKHBhZ2UgIT0gbnVsbCAmJiB7IHBhZ2UgfSksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFscyhxdWVyeSwgdGhpcy4kcm91dGUucXVlcnkpKSB7XG4gICAgICAgICAgLy8gVGVsbCB0aGUgYCRyb3V0ZWAgd2F0Y2hlciB0byBpZ25vcmUgdGhlIGNoYW5nZWQgdHJpZ2dlcmVkIGhlcmU6XG4gICAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7IHF1ZXJ5LCBoYXNoOiB0aGlzLiRyb3V0ZS5oYXNoIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHF1ZXJ5IC8vIExldCBnZXRTdG9yZUFjY2Vzc29yKCkgZG8gdGhlIGFjdHVhbCBzZXR0aW5nXG4gICAgICB9XG4gICAgfSksXG5cbiAgICB0b3RhbDogZ2V0U3RvcmVBY2Nlc3NvcigndG90YWwnKSxcblxuICAgIGNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLmNvbHVtbnMpXG4gICAgfSxcblxuICAgIHNjb3BlcygpIHtcbiAgICAgIHJldHVybiBnZXROYW1lZFNjaGVtYXModGhpcy5zY2hlbWEuc2NvcGVzKVxuICAgIH0sXG5cbiAgICBkZWZhdWx0U2NvcGUoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBzY29wZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2NvcGVzKSkge1xuICAgICAgICAgIGlmIChzY29wZS5kZWZhdWx0U2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgICAgICBmaXJzdCA9IHNjb3BlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3RcbiAgICB9LFxuXG4gICAgZGVmYXVsdE9yZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuY29sdW1ucykpIHtcbiAgICAgICAgICBjb25zdCB7IGRlZmF1bHRTb3J0IH0gPSBjb2x1bW5cbiAgICAgICAgICBpZiAoZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGlzU3RyaW5nKGRlZmF1bHRTb3J0KSA/IGRlZmF1bHRTb3J0IDogJ2FzYydcbiAgICAgICAgICAgIHJldHVybiBgJHtjb2x1bW4ubmFtZX0gJHtkaXJlY3Rpb259YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb3JtcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGdldEZvcm1TY2hlbWFzKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpKVxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5rZWQgdmlldyBzY2hlbWEgaWYgdGhpcyBzb3VyY2UgZWRpdHMgaXQgaXRzIGl0ZW1zIHRocm91Z2hcbiAgICAvLyBhIGxpbmtlZCB2aWV3LlxuICAgIHZpZXcoKSB7XG4gICAgICByZXR1cm4gZ2V0Vmlld1NjaGVtYSh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KVxuICAgIH0sXG5cbiAgICBsaW5rc1RvVmlldygpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmlld1xuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXModGhpcy5zY2hlbWEuYnV0dG9ucylcbiAgICB9LFxuXG4gICAgaGFzTGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybXMuc29tZShoYXNMYWJlbHMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbXBvbmVudHMgPSB7XG4gICd0ZXh0JyhmaWx0ZXIpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ2NvbnRhaW5zJyxcbiAgICAgICAgdmFsdWU6ICdjb250YWlucydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZXF1YWxzJyxcbiAgICAgICAgdmFsdWU6ICdlcXVhbHMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3N0YXJ0cyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdzdGFydHMtd2l0aCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnZW5kcyB3aXRoJyxcbiAgICAgICAgdmFsdWU6ICdlbmRzLXdpdGgnXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogZmlsdGVyLm9wZXJhdG9yc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogaXNBcnJheShmaWx0ZXIub3BlcmF0b3JzKVxuICAgICAgICAgICAgICA/IG9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IGZpbHRlci5vcGVyYXRvcnMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvcHRpb25zLFxuICAgICAgICAgICAgd2lkdGg6ICc0MCUnXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICB0ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgd2lkdGg6IGZpbHRlci5vcGVyYXRvcnMgPyAnNjAlJyA6ICdmaWxsJ1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICBkYXRlRm9ybWF0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzUGFuZWwoZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIHR5cGU6ICdwYW5lbCcsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBuYW1lOiAnJGZpbHRlcnMnLFxuICAgIHRhcmdldDogZGF0YVBhdGgsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBwcm94eS5xdWVyeVxuICAgICAgKVxuICAgIH0sXG4gICAgY29tcG9uZW50czogZ2V0RmlsdGVyc0NvbXBvbmVudHMoZmlsdGVycyksXG4gICAgYnV0dG9uczoge1xuICAgICAgY2xlYXI6IHtcbiAgICAgICAgdGV4dDogJ0NsZWFyJyxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgY2xpY2soeyBzY2hlbWFDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgc2NoZW1hQ29tcG9uZW50LnJlc2V0RGF0YSgpXG4gICAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGZpbHRlcjoge1xuICAgICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgICAgdGV4dDogJ0ZpbHRlcicsXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAgIHNjaGVtYUNvbXBvbmVudC5hcHBseUZpbHRlcnMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgYXBwbHlGaWx0ZXJzKCkge1xuICAgICAgICBwcm94eS5xdWVyeSA9IHtcbiAgICAgICAgICAuLi5wcm94eS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IGZvcm1hdEZpbHRlcnNEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpLFxuICAgICAgICAgIC8vIENsZWFyIHBhZ2luYXRpb24gd2hlbiBhcHBseWluZyBvciBjbGVhcmluZyBmaWx0ZXJzOlxuICAgICAgICAgIHBhZ2U6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYW5lbFxufVxuXG5mdW5jdGlvbiBnZXRGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJzKSB7XG4gIGNvbnN0IGNvbXBzID0ge31cbiAgZm9yIChjb25zdCBmaWx0ZXIgb2YgT2JqZWN0LnZhbHVlcyhmaWx0ZXJzIHx8IHt9KSkge1xuICAgIC8vIFN1cHBvcnQgYm90aCBjdXN0b20gZm9ybXMgYW5kIGRlZmF1bHQgZmlsdGVyIGNvbXBvbmVudHMsIHRocm91Z2ggdGhlXG4gICAgLy8gYGZpbHRlckNvbXBvbmVudHNgIHJlZ2lzdHJ5LiBFdmVuIGZvciBkZWZhdWx0IGZpbHRlcnMsIHN0aWxsIHVzZSB0aGVcbiAgICAvLyBwcm9wZXJ0aWVzIGluIGBmaWx0ZXJgIGFzIHRoZSBiYXNlIGZvciBgZm9ybWAsIHNvIHRoaW5ncyBsaWtlIGBsYWJlbGBcbiAgICAvLyBjYW4gYmUgY2hhbmdlZCBvbiB0aGUgcmVzdWx0aW5nIGZvcm0uXG4gICAgY29uc3QgeyBmaWx0ZXI6IHR5cGUsIC4uLmZvcm0gfSA9IGZpbHRlclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlXG4gICAgICA/IGZpbHRlckNvbXBvbmVudHNbdHlwZV0/LihmaWx0ZXIpXG4gICAgICA6IGZpbHRlci5jb21wb25lbnRzXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvcm0udHlwZSA9ICdmb3JtJ1xuICAgICAgZm9ybS5jb21wb25lbnRzID0ge31cbiAgICAgIC8vIENvbnZlcnQgbGFiZWxzIHRvIHBsYWNlaG9sZGVyczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjb21wb25lbnQubGFiZWwgfHwgbGFiZWxpemUoY29tcG9uZW50Lm5hbWUgfHwga2V5KVxuICAgICAgICAgIGZvcm0uY29tcG9uZW50c1trZXldID0ge1xuICAgICAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wc1tmaWx0ZXIubmFtZV0gPSB7XG4gICAgICAgIGxhYmVsOiBmb3JtLmxhYmVsLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KSxcbiAgICAgICAgZm9ybSxcbiAgICAgICAgaW5saW5lZDogdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZpbHRlciAnJHtmaWx0ZXIubmFtZX0nOiBVbmtub3duIGZpbHRlciB0eXBlICcke3R5cGV9Jy5gXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wc1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkge1xuICBjb25zdCBjb21wb25lbnQgPSBzY2hlbWEuY29tcG9uZW50c1tuYW1lXVxuICByZXR1cm4gY29tcG9uZW50Py5mb3JtPy5jb21wb25lbnRzXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbHRlcnNEYXRhKHNjaGVtYSwgZGF0YSkge1xuICBjb25zdCBmaWx0ZXJzID0gW11cbiAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICBjb25zdCBlbnRyeSA9IGRhdGFbbmFtZV1cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIC8vIE1hcCBjb21wb25lbnRzIHNlcXVlbmNlIHRvIGFyZ3VtZW50czpcbiAgICAgIGNvbnN0IGFyZ3MgPSBPYmplY3Qua2V5cyhnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkpLm1hcChcbiAgICAgICAga2V5ID0+IGVudHJ5W2tleV0gPz8gbnVsbFxuICAgICAgKVxuICAgICAgLy8gT25seSBhcHBseSBmaWx0ZXIgaWYgdGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHRoYXQgYXJlbid0IG51bGw6XG4gICAgICBpZiAoYXJncy5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICBmaWx0ZXJzLnB1c2goYCR7bmFtZX06JHthcmdzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbignLCcpfWApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJzLmxlbmd0aCA/IGZpbHRlcnMgOiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXJzRGF0YShzY2hlbWEsIHF1ZXJ5KSB7XG4gIGNvbnN0IGZpbHRlcnMgPSB7fVxuICAvLyBTYW1lIGFzIEBkaXRvanMvc2VydmVyJ3MgUXVlcnlQYXJhbWV0ZXJzLmZpbHRlcjogVHJhbnNsYXRlIHRoZSBzdHJpbmcgZGF0YVxuICAvLyBmcm9tICRyb3V0ZS5xdWVyeSBiYWNrIHRvIHBhcmFtIGxpc3RzIHBlciBmaWx0ZXI6XG4gIGlmIChxdWVyeSkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGFzQXJyYXkocXVlcnkuZmlsdGVyKSkge1xuICAgICAgY29uc3QgWywgbmFtZSwganNvbl0gPSBmaWx0ZXIubWF0Y2goL14oXFx3Kyk6KC4qKSQvKVxuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsdGVyc1tuYW1lXSA9IGFzQXJyYXkoSlNPTi5wYXJzZShgWyR7anNvbn1dYCkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICB9XG4gIH1cbiAgY29uc3QgZmlsdGVyc0RhdGEgPSB7fVxuICBmb3IgKGNvbnN0IG5hbWUgaW4gc2NoZW1hLmNvbXBvbmVudHMpIHtcbiAgICBjb25zdCBkYXRhID0ge31cbiAgICAvLyBJZiB3ZSBoYXZlIHJldHJpZXZlZCBwYXJhbXMgZnJvbSB0aGUgcXVlcnksIGZldGNoIHRoZSBhc3NvY2lhdGVkXG4gICAgLy8gZm9ybSBjb21wb25lbnRzIHNvIHdlIGNhbiBtYXAgdGhlIHZhbHVlcyBiYWNrIHRvIG9iamVjdCBrZXlzOlxuICAgIGNvbnN0IGFyZ3MgPSBmaWx0ZXJzW25hbWVdXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSlcbiAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcG9uZW50cykge1xuICAgICAgICAgIGRhdGFba2V5XSA9IGFyZ3NbaW5kZXgrK11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJzRGF0YVtuYW1lXSA9IGRhdGFcbiAgfVxuICByZXR1cm4gZmlsdGVyc0RhdGFcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1saXN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwic2NoZW1hLmNsYXNzXCJcbiAgOnN0eWxlPVwic2NoZW1hLnN0eWxlXCJcbilcbiAgLmRpdG8tbmF2aWdhdGlvbihcbiAgICB2LWlmPVwic2NvcGVzIHx8IGhhc1BhZ2luYXRpb25cIlxuICApXG4gICAgRGl0b1Njb3BlcyhcbiAgICAgIHYtaWY9XCJzY29wZXNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOnNjb3Blcz1cInNjb3Blc1wiXG4gICAgKVxuICAgIC8vLSBXaGVuIHRoZXJlJ3Mgb25seSBwYWdpbmF0aW9uIHdpdGhvdXQgc2NvcGVzLCB3ZSBuZWVkIGEgZ29vZCBvbCcgc3BhY2VyXG4gICAgLy8tIGRpdiwgZm9yIHRoZSBsYXlvdXQgbm90IHRvIGJyZWFrLi4uXG4gICAgLmRpdG8tc3BhY2VyKFxuICAgICAgdi1lbHNlLWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgKVxuICAgIERpdG9QYWdpbmF0aW9uKFxuICAgICAgdi1pZj1cImhhc1BhZ2luYXRpb25cIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmxpbWl0PVwicGFnaW5hdGVcIlxuICAgICAgOnRvdGFsPVwidG90YWwgfHwgMFwiXG4gICAgKVxuICB0YWJsZS5kaXRvLXRhYmxlKFxuICAgIDpjbGFzcz1ge1xuICAgICAgJ2RpdG8tdGFibGUtc2VwYXJhdG9ycyc6IGlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWxhcmdlci1wYWRkaW5nJzogaGFzRWRpdEJ1dHRvbnMgJiYgIWlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWFsdGVybmF0ZS1jb2xvcnMnOiAhaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtZXZlbi1jb3VudCc6IGhhc0V2ZW5Db3VudFxuICAgIH1gXG4gIClcbiAgICBEaXRvVGFibGVIZWFkKFxuICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgOnF1ZXJ5PVwicXVlcnlcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpoYXNFZGl0QnV0dG9ucz1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgVXNlU29ydGFibGUoXG4gICAgICB0YWc9XCJ0Ym9keVwiXG4gICAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdERhdGEsIHBhZ2luYXRpb25SYW5nZSlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXRTb3J0YWJsZU9wdGlvbnMoZHJhZ2dhYmxlKVwiXG4gICAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCJ2YWx1ZSA9PiAobGlzdERhdGEgPSB2YWx1ZSlcIlxuICAgIClcbiAgICAgIHRyKFxuICAgICAgICB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gbGlzdERhdGFcIlxuICAgICAgICA6aWQ9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICA6a2V5PVwiZ2V0SXRlbVVpZChzY2hlbWEsIGl0ZW0pXCJcbiAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBEaXRvVGFibGVDZWxsKFxuICAgICAgICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGNvbHVtbilcIlxuICAgICAgICAgICAgICA6a2V5PVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRDZWxsQ2xhc3MoY29sdW1uKVwiXG4gICAgICAgICAgICAgIDpjZWxsPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgIClcbiAgICAgICAgICB0ZFxuICAgICAgICAgICAgRGl0b1NjaGVtYUlubGluZWQoXG4gICAgICAgICAgICAgIHYtaWY9XCJpc0lubGluZWRcIlxuICAgICAgICAgICAgICA6bGFiZWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4LCBhc09iamVjdDogdHJ1ZSB9KVwiXG4gICAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShpbmRleClcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2VkPVwiY29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbXBvbmVudChcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwicmVuZGVyXCJcbiAgICAgICAgICAgICAgdi1odG1sPVwicmVuZGVyKGdldENvbnRleHQoaXRlbSwgaW5kZXgpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgdi1odG1sPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgaXRlbSwgeyBpbmRleCB9KVwiXG4gICAgICAgICAgICApXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoXG4gICAgICAgICAgdi1pZj1cImhhc0NlbGxFZGl0QnV0dG9uc1wiXG4gICAgICAgIClcbiAgICAgICAgICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgICAgICAgICA6ZGVsZXRhYmxlPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgOmVkaXRQYXRoPVwiZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIGl0ZW0sIGNvbnRleHQpXCJcbiAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoaW5kZXgpXCJcbiAgICAgICAgICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgKVxuICAgIC8vLSBSZW5kZXIgY3JlYXRlIGJ1dHRvbnMgaW5zaWRlIHRhYmxlIHdoZW4gbm90IGluIGEgc2luZ2xlIGNvbXBvbmVudCB2aWV3OlxuICAgIHRmb290KFxuICAgICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmICFzaW5nbGVcIlxuICAgIClcbiAgICAgIHRyXG4gICAgICAgIHRkLmRpdG8tY2VsbC1lZGl0LWJ1dHRvbnMoOmNvbHNwYW49XCJudW1Db2x1bW5zXCIpXG4gICAgICAgICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgICAgICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgICAgICAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgICAgICAgICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgICAgOmRhdGE9XCJsaXN0RGF0YVwiXG4gICAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgIClcbiAgLy8tIFJlbmRlciBjcmVhdGUgYnV0dG9ucyBvdXRzaWRlIHRhYmxlIHdoZW4gaW4gYSBzaW5nbGUgY29tcG9uZW50IHZpZXc6XG4gIERpdG9FZGl0QnV0dG9ucy5kaXRvLWJ1dHRvbnMtbWFpbi5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgdi1pZj1cImhhc0xpc3RCdXR0b25zICYmIHNpbmdsZVwiXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImxpc3REYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCB7XG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0Vmlld0VkaXRQYXRoLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50LFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBnZXRGaWx0ZXJzUGFuZWwgfSBmcm9tICcuLi91dGlscy9maWx0ZXIuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBwaWNrQnksIGVxdWFscywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsaXN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbiwgU29ydGFibGVNaXhpbl0sXG5cbiAgZ2V0U291cmNlVHlwZSh0eXBlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNmb3JtYXRpb24gaGVyZS4gU2VlIFR5cGVUcmVlTGlzdCBmb3IgZGV0YWlscy5cbiAgICByZXR1cm4gdHlwZVxuICB9LFxuXG4gIGdldFBhbmVsU2NoZW1hKHNjaGVtYSwgZGF0YVBhdGgsIHNjaGVtYUNvbXBvbmVudCkge1xuICAgIGNvbnN0IHsgZmlsdGVycyB9ID0gc2NoZW1hXG4gICAgLy8gU2VlIGlmIHRoaXMgbGlzdCBjb21wb25lbnQgd2FudHMgdG8gZGlzcGxheSBhIGZpbHRlciBwYW5lbCwgYW5kIGlmIHNvLFxuICAgIC8vIGNyZWF0ZSB0aGUgcGFuZWwgc2NoZW1hIGZvciBpdCB0aHJvdWdoIGBnZXRGaWx0ZXJzUGFuZWwoKWAuXG4gICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgIC8vIEF0IHRoZSB0aW1lIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGFuZWwgc2NoZW1hLCB0aGUgc2NoZW1hQ29tcG9uZW50IGlzXG4gICAgICAvLyBub3QgZmlsbGVkIHlldCwgc28gd2UgY2FuJ3QgZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50IChkYXRhUGF0aCkgcmlnaHRcbiAgICAgIC8vIGF3YXkuIFVzZSBhIHByb3h5IGFuZCBhIGdldHRlciBpbnN0ZWFkLCB0byBnZXQgYXJvdW5kIHRoaXM6XG4gICAgICBjb25zdCBnZXRMaXN0Q29tcG9uZW50ID0gKCkgPT5cbiAgICAgICAgc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudEJ5RGF0YVBhdGgoXG4gICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgY29tcG9uZW50ID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgICAgKVxuXG4gICAgICByZXR1cm4gZ2V0RmlsdGVyc1BhbmVsKFxuICAgICAgICBnZXROYW1lZFNjaGVtYXMoZmlsdGVycyksXG4gICAgICAgIGRhdGFQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIHByb3h5IHRvIGdldCAvIHNldCB0aGUgcXVlcnksIHNlZSBnZXRGaWx0ZXJzUGFuZWwoKVxuICAgICAgICAgIGdldCBxdWVyeSgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRMaXN0Q29tcG9uZW50KCk/LnF1ZXJ5XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQgcXVlcnkocXVlcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdldExpc3RDb21wb25lbnQoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHVuZGVmaW5lZCB2YWx1ZXMgZm9yIGNvbXBhcmluZyB3aXRoIGVxdWFscygpXG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG9iaiA9PiBwaWNrQnkob2JqLCB2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICBpZiAoIWVxdWFscyhmaWx0ZXIocXVlcnkpLCBmaWx0ZXIoY29tcG9uZW50LnF1ZXJ5KSkpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQucXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5sb2FkRGF0YShmYWxzZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGhhc1BhZ2luYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmF0ZSAmJiB0aGlzLnRvdGFsID4gdGhpcy5wYWdpbmF0ZVxuICAgIH0sXG5cbiAgICBoYXNMaXN0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhISh0aGlzLmJ1dHRvblNjaGVtYXMgfHwgdGhpcy5jcmVhdGFibGUpXG4gICAgfSxcblxuICAgIGhhc0VkaXRCdXR0b25zKCkge1xuICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGlzdERhdGEubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgdGhpcy5lZGl0YWJsZSB8fFxuICAgICAgICAgIHRoaXMuZGVsZXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNDZWxsRWRpdEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNJbmxpbmVkICYmIHRoaXMuaGFzRWRpdEJ1dHRvbnNcbiAgICB9LFxuXG4gICAgaGFzRXZlbkNvdW50KCkge1xuICAgICAgcmV0dXJuICEodGhpcy5saXN0RGF0YS5sZW5ndGggJSAyKVxuICAgIH0sXG5cbiAgICBudW1Db2x1bW5zKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuY29sdW1ucyA/IE9iamVjdC5rZXlzKHRoaXMuY29sdW1ucykubGVuZ3RoIDogMSkgK1xuICAgICAgICAodGhpcy5oYXNDZWxsRWRpdEJ1dHRvbnMgPyAxIDogMClcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldERhdGFQYXRoKGluZGV4KSB7XG4gICAgICByZXR1cm4gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgaW5kZXgpXG4gICAgfSxcblxuICAgIGdldEVkaXRQYXRoKGl0ZW0sIGluZGV4KSB7XG4gICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0Vmlld0VkaXRQYXRoKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpIHx8IHRoaXMucGF0aFxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCBpdGVtLCBpbmRleClcbiAgICAgICAgcmV0dXJuIGAke3BhdGh9LyR7aWR9YFxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgZ2V0Q2VsbENsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNlbGwtJHtoeXBoZW5hdGUoY29sdW1uLm5hbWUpfWBcbiAgICB9LFxuXG4gICAgZ2V0Q29udGV4dChpdGVtLCBpbmRleCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgZGF0YVBhdGg6IHRoaXMuZ2V0RGF0YVBhdGgoaW5kZXgpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZpbHRlckVycm9ycyhlcnJvcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlcnNEYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsICckZmlsdGVycycpXG4gICAgICBjb25zdCBwYW5lbCA9IHRoaXMuc2NoZW1hQ29tcG9uZW50LmdldFBhbmVsQnlEYXRhUGF0aChmaWx0ZXJzRGF0YVBhdGgpXG4gICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgcGFuZWwuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKFxuICAgIGFwaSxcbiAgICBzY2hlbWEsXG4gICAgbmFtZSxcbiAgICByb3V0ZXMsXG4gICAgbGV2ZWwsXG4gICAgbmVzdGVkID0gZmFsc2UsXG4gICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgIHByb2Nlc3MgPSBudWxsXG4gICkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKSxcbiAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnRzKHNjaGVtYS5jb2x1bW5zKSxcbiAgICAgIFNvdXJjZU1peGluLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgIGFwaSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGxldmVsLFxuICAgICAgICBuZXN0ZWQsXG4gICAgICAgIGZsYXR0ZW4sXG4gICAgICAgIHByb2Nlc3NcbiAgICAgIClcbiAgICBdKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbGlzdCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1uYXZpZ2F0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nLWJvdHRvbTogJGNvbnRlbnQtcGFkZGluZy1oYWxmO1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjplbXB0eSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5kaXRvLXNjb3BlcyxcbiAgICAuZGl0by1wYWdpbmF0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAwIDEgYXV0bztcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tc2luZ2xlIHtcbiAgICAvLyBTbyB0aGF0IGxpc3QgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuICAgIGhlaWdodDogMTAwJTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvTGFiZWwuZGl0by1sYWJlbC1jb21wb25lbnQoXG4gIDpsYWJlbD1cInZhbHVlXCJcbiAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsYWJlbCcsIHtcbiAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiBmYWxzZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWxhYmVsLWNvbXBvbmVudCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGhlaWdodDogMmVtO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1tYXJrdXAoOmlkPVwiZGF0YVBhdGhcIilcbiAgLmRpdG8tbWFya3VwLXRvb2xiYXIoOmVkaXRvcj1cImVkaXRvclwiKVxuICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXRvb2xiYXIoXG4gICAgICB2LWlmPVwiZ3JvdXBlZEJ1dHRvbnMubGVuZ3RoID4gMFwiXG4gICAgKVxuICAgICAgLmRpdG8tYnV0dG9uLWdyb3VwKFxuICAgICAgICB2LWZvcj1cImJ1dHRvbnMgaW4gZ3JvdXBlZEJ1dHRvbnNcIlxuICAgICAgKVxuICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgdi1mb3I9XCJ7IG5hbWUsIGljb24sIGlzQWN0aXZlLCBvbkNsaWNrIH0gaW4gYnV0dG9uc1wiXG4gICAgICAgICAgOmtleT1cIm5hbWVcIlxuICAgICAgICAgIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogaXNBY3RpdmUgfVwiXG4gICAgICAgICAgQGNsaWNrPVwib25DbGlja1wiXG4gICAgICAgIClcbiAgICAgICAgICBJY29uKDpuYW1lPVwiaWNvblwiKVxuICBFZGl0b3JDb250ZW50LmRpdG8tbWFya3VwLWVkaXRvcihcbiAgICByZWY9XCJlZGl0b3JcIlxuICAgIDplZGl0b3I9XCJlZGl0b3JcIlxuICAgIDpzdHlsZT1cInN0eWxlc1wiXG4gIClcbiAgLmRpdG8tcmVzaXplKFxuICAgIHYtaWY9XCJyZXNpemFibGVcIlxuICAgIEBtb3VzZWRvd24uc3RvcC5wcmV2ZW50PVwib25EcmFnUmVzaXplXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgRWRpdG9yLCBFZGl0b3JDb250ZW50LCBNYXJrLCBnZXRNYXJrQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvdnVlLTMnXG4vLyBpbXBvcnQgeyB0b2dnbGVNYXJrIH0gZnJvbSAndGlwdGFwLWNvbW1hbmRzJ1xuLy8gRXNzZW50aWFsczpcbmltcG9ydCB7IERvY3VtZW50IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tZG9jdW1lbnQnXG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGV4dCdcbi8vIE1hcmtzOlxuaW1wb3J0IHsgQm9sZCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJvbGQnXG5pbXBvcnQgeyBDb2RlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZSdcbmltcG9ydCB7IEl0YWxpYyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWl0YWxpYydcbmltcG9ydCB7IExpbmsgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1saW5rJ1xuaW1wb3J0IHsgU3RyaWtlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tc3RyaWtlJ1xuaW1wb3J0IHsgVW5kZXJsaW5lIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lJ1xuLy8gTm9kZXM6XG5pbXBvcnQgeyBCbG9ja3F1b3RlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYmxvY2txdW90ZSdcbmltcG9ydCB7IENvZGVCbG9jayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2snXG5pbXBvcnQgeyBIYXJkQnJlYWsgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oYXJkLWJyZWFrJ1xuaW1wb3J0IHsgSGVhZGluZyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhlYWRpbmcnXG5pbXBvcnQgeyBQYXJhZ3JhcGggfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1wYXJhZ3JhcGgnXG5pbXBvcnQgeyBIb3Jpem9udGFsUnVsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhvcml6b250YWwtcnVsZSdcbmltcG9ydCB7IE9yZGVyZWRMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tb3JkZXJlZC1saXN0J1xuaW1wb3J0IHsgQnVsbGV0TGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJ1bGxldC1saXN0J1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0nXG4vLyBUT0RPOlxuLy8gaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pbWFnZSdcbi8vIGltcG9ydCB7IE1lbnRpb24gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1tZW50aW9uJ1xuLy8gaW1wb3J0IHsgQ29kZUJsb2NrSGlnaGxpZ2h0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jay1oaWdobGlnaHQnXG4vLyBpbXBvcnQgeyBUYWJsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlJ1xuLy8gaW1wb3J0IHsgVGFibGVDZWxsIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtY2VsbCdcbi8vIGltcG9ydCB7IFRhYmxlSGVhZGVyIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtaGVhZGVyJ1xuLy8gaW1wb3J0IHsgVGFibGVOb2RlcyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLW5vZGVzJ1xuLy8gaW1wb3J0IHsgVGFibGVSb3cgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1yb3cnXG4vLyBpbXBvcnQgeyBUYXNrTGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhc2stbGlzdCdcbi8vIGltcG9ydCB7IFRhc2tJdGVtIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFzay1pdGVtJ1xuLy8gVG9vbHM6XG5pbXBvcnQgeyBIaXN0b3J5IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGlzdG9yeSdcblxuaW1wb3J0IHsgSWNvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuaW1wb3J0IHtcbiAgaXNBcnJheSxcbiAgaXNPYmplY3QsXG4gIHVuZGVyc2NvcmUsXG4gIGh5cGhlbmF0ZSxcbiAgZGVib3VuY2UsXG4gIGNhbWVsaXplXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignbWFya3VwJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGNvbXBvbmVudHM6IHtcbiAgICBFZGl0b3JDb250ZW50LFxuICAgIEljb25cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlZGl0b3I6IG51bGwsXG4gICAgICBoZWlnaHQ6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCAxMFxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0IHx8IGBjYWxjKCR7dGhpcy5saW5lc31lbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSlgXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1hcmtCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygnbWFya3MnLCB7XG4gICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgIGl0YWxpYzogdHJ1ZSxcbiAgICAgICAgdW5kZXJsaW5lOiB0cnVlLFxuICAgICAgICBzdHJpa2U6IHRydWUsXG4gICAgICAgIHNtYWxsOiB0cnVlLFxuICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgb25DbGljazogZWRpdG9yID0+IHRoaXMub25DbGlja0xpbmsoZWRpdG9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBiYXNpY05vZGVCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygnbm9kZXMnLCB7XG4gICAgICAgIHBhcmFncmFwaDoge1xuICAgICAgICAgIC8vIERvIG5vdCBzaG93IHRoZSBwYXJhZ3JhcGggY29tbWFuZCBhcyBhY3RpdmUgaWYgYW55IG9mIHRoZSBibG9ja1xuICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBhbHNvIGFjdGl2ZTpcbiAgICAgICAgICBpZ25vcmVBY3RpdmU6ICgpID0+XG4gICAgICAgICAgICB0aGlzLm90aGVyTm9kZUJ1dHRvbnMuc29tZShidXR0b24gPT4gYnV0dG9uLmlzQWN0aXZlKVxuICAgICAgICB9LFxuICAgICAgICBoZWFkaW5nOiB7XG4gICAgICAgICAgYXR0cmlidXRlOiAnbGV2ZWwnLFxuICAgICAgICAgIHZhbHVlczogWzEsIDIsIDMsIDQsIDUsIDZdXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG90aGVyTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgYnVsbGV0TGlzdDogdHJ1ZSxcbiAgICAgICAgb3JkZXJlZExpc3Q6IHRydWUsXG4gICAgICAgIGJsb2NrcXVvdGU6IHRydWUsXG4gICAgICAgIGNvZGVCbG9jazogdHJ1ZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdG9vbEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCd0b29scycsIHtcbiAgICAgICAgdW5kbzogdHJ1ZSxcbiAgICAgICAgcmVkbzogdHJ1ZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ3JvdXBlZEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtCdXR0b25zLFxuICAgICAgICBiYXNpY05vZGVCdXR0b25zLFxuICAgICAgICBvdGhlck5vZGVCdXR0b25zLFxuICAgICAgICB0b29sQnV0dG9uc1xuICAgICAgfSA9IHRoaXNcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtCdXR0b25zLFxuICAgICAgICBiYXNpY05vZGVCdXR0b25zLFxuICAgICAgICBvdGhlck5vZGVCdXR0b25zLFxuICAgICAgICB0b29sQnV0dG9uc1xuICAgICAgXS5maWx0ZXIoYnV0dG9ucyA9PiBidXR0b25zLmxlbmd0aCA+IDApXG4gICAgfSxcblxuICAgIHBhcnNlT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZToge1xuICAgICAgICAgICdjb2xsYXBzZSc6IGZhbHNlLFxuICAgICAgICAgICdwcmVzZXJ2ZSc6IHRydWUsXG4gICAgICAgICAgJ3ByZXNlcnZlLWFsbCc6ICdmdWxsJ1xuICAgICAgICB9W3RoaXMud2hpdGVzcGFjZV1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZWRpdG9yT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVkaXRhYmxlOiAhdGhpcy5yZWFkeW9ubHksXG4gICAgICAgIGF1dG9Gb2N1czogdGhpcy5hdXRvZm9jdXMsXG4gICAgICAgIGRpc2FibGVJbnB1dFJ1bGVzOiAhdGhpcy5lbmFibGVSdWxlcy5pbnB1dCxcbiAgICAgICAgZGlzYWJsZVBhc3RlUnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLnBhc3RlLFxuICAgICAgICBwYXJzZU9wdGlvbnM6IHRoaXMucGFyc2VPcHRpb25zXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2l6YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Jlc2l6YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgd2hpdGVzcGFjZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3doaXRlc3BhY2UnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY29sbGFwc2UnXG4gICAgICAvLyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAnY29sbGFwc2UnLCAncHJlc2VydmUnLCAncHJlc2VydmUtYWxsJ1xuICAgIH0pLFxuXG4gICAgZW5hYmxlUnVsZXM6IGdldFNjaGVtYUFjY2Vzc29yKCdlbmFibGVSdWxlcycsIHtcbiAgICAgIHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZW5hYmxlUnVsZXMpIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KGVuYWJsZVJ1bGVzKVxuICAgICAgICAgID8gZW5hYmxlUnVsZXNcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgaW5wdXQ6ICEhZW5hYmxlUnVsZXMsXG4gICAgICAgICAgICAgIHBhc3RlOiAhIWVuYWJsZVJ1bGVzXG4gICAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHJlYWR5b25seTogJ3VwZGF0ZUVkaXRvck9wdGlvbnMnLFxuICAgIGF1dG9mb2N1czogJ3VwZGF0ZUVkaXRvck9wdGlvbnMnLFxuICAgIGVuYWJsZVJ1bGVzOiAndXBkYXRlRWRpdG9yT3B0aW9ucydcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgaWdub3JlV2F0Y2ggPSBmYWxzZVxuXG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbkZvY3VzID0gKCkgPT4gdGhpcy5vbkZvY3VzKClcblxuICAgIGNvbnN0IG9uQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIG9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICBjb25zdCBzZXRWYWx1ZURlYm91bmNlZCA9IGRlYm91bmNlKGVkaXRvciA9PiB7XG4gICAgICBpZ25vcmVXYXRjaCA9IHRydWVcbiAgICAgIHRoaXMudmFsdWUgPSBlZGl0b3IuZ2V0SFRNTCgpXG4gICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH0sIDEwMClcblxuICAgIGNvbnN0IG9uVXBkYXRlID0gKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgIHNldFZhbHVlRGVib3VuY2VkKGVkaXRvcilcbiAgICAgIHRoaXMub25JbnB1dCgpXG4gICAgfVxuXG4gICAgdGhpcy4kd2F0Y2goJ3ZhbHVlJywgdmFsdWUgPT4ge1xuICAgICAgaWYgKGlnbm9yZVdhdGNoKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldENvbnRlbnQodmFsdWUsIGZhbHNlLCB0aGlzLnBhcnNlT3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHtcbiAgICAgIC4uLnRoaXMuZWRpdG9yT3B0aW9ucyxcbiAgICAgIG9uRm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvblVwZGF0ZSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZ2V0RXh0ZW5zaW9ucygpLFxuICAgICAgY29udGVudDogdGhpcy52YWx1ZSB8fCAnJ1xuICAgIH0pXG4gIH0sXG5cbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICB0aGlzLmVkaXRvci5kZXN0cm95KClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25EcmFnUmVzaXplKGV2ZW50KSB7XG4gICAgICBjb25zdCBnZXRQb2ludCA9ICh7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSkgPT4gKHsgeCwgeSB9KVxuXG4gICAgICBsZXQgcHJldlkgPSBnZXRQb2ludChldmVudCkueVxuICAgICAgbGV0IGhlaWdodCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiRyZWZzLmVkaXRvci4kZWwpLmhlaWdodClcblxuICAgICAgY29uc3QgbW91c2Vtb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7IHkgfSA9IGdldFBvaW50KGV2ZW50KVxuICAgICAgICBoZWlnaHQgKz0geSAtIHByZXZZXG4gICAgICAgIHByZXZZID0geVxuICAgICAgICB0aGlzLmhlaWdodCA9IGAke01hdGgubWF4KGhlaWdodCwgMCl9cHhgXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5kb21Pbihkb2N1bWVudCwge1xuICAgICAgICBtb3VzZW1vdmUsXG5cbiAgICAgICAgbW91c2V1cChldmVudCkge1xuICAgICAgICAgIG1vdXNlbW92ZShldmVudClcbiAgICAgICAgICBoYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB1cGRhdGVFZGl0b3JPcHRpb25zKCkge1xuICAgICAgdGhpcy5lZGl0b3Iuc2V0T3B0aW9ucyh0aGlzLmVkaXRvck9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIG9uQ2xpY2tMaW5rKGVkaXRvcikge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMucm9vdENvbXBvbmVudC5zaG93RGlhbG9nKHtcbiAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgIGhyZWY6IHtcbiAgICAgICAgICAgIHR5cGU6ICd1cmwnLFxuICAgICAgICAgICAgbGFiZWw6ICdMaW5rJyxcbiAgICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGxhYmVsOiAnVGl0bGUnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBidXR0b25zOiB7XG4gICAgICAgICAgY2FuY2VsOiB7fSxcbiAgICAgICAgICBhcHBseTogeyB0eXBlOiAnc3VibWl0JyB9LFxuICAgICAgICAgIHJlbW92ZToge1xuICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgIGNsaWNrKHsgZGlhbG9nQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICAgICAgICBkaWFsb2dDb21wb25lbnQucmVzb2x2ZShudWxsKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBnZXRNYXJrQXR0cmlidXRlcyh0aGlzLmVkaXRvci5zdGF0ZSwgJ2xpbmsnKVxuICAgICAgfSlcbiAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGxldCB7IGhyZWYsIHRpdGxlIH0gPSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChocmVmKSB7XG4gICAgICAgICAgLy8gU2VlIGlmIGBocmVmYCBjYW4gYmUgcGFyc2VkIGFzIGEgVVJMLCBhbmQgaWYgbm90LFxuICAgICAgICAgIC8vIHByZWZpeCBpdCB3aXRoIGEgZGVmYXVsdCBwcm90b2NvbC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgbmV3IFVSTChocmVmKVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgaHJlZiA9IGBodHRwczovLyR7aHJlZn1gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5jb21tYW5kcy5zZXRMaW5rKHsgaHJlZiwgdGl0bGUgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkaXRvci5jb21tYW5kcy51bnNldExpbmsoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRFeHRlbnNpb25zKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYXJrcyA9IHt9LFxuICAgICAgICBub2RlcyA9IHt9LFxuICAgICAgICB0b29scyA9IHt9XG4gICAgICB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC8vIEVzc2VudGlhbHM6XG4gICAgICAgIERvY3VtZW50LFxuICAgICAgICBUZXh0LFxuICAgICAgICBQYXJhZ3JhcGgsIC8vIGJ1dHRvbiBjYW4gYmUgY29udHJvbGxlZCwgYnV0IG5vZGUgbmVlZHMgdG8gYmUgb24uXG5cbiAgICAgICAgLy8gTWFya3M6IGBzY2hlbWEubWFya3NgXG4gICAgICAgIG1hcmtzLmJvbGQgJiYgQm9sZCxcbiAgICAgICAgbWFya3MuaXRhbGljICYmIEl0YWxpYyxcbiAgICAgICAgbWFya3MudW5kZXJsaW5lICYmIFVuZGVybGluZSxcbiAgICAgICAgbWFya3Muc3RyaWtlICYmIFN0cmlrZSxcbiAgICAgICAgbWFya3Muc21hbGwgJiYgU21hbGwsXG4gICAgICAgIG1hcmtzLmNvZGUgJiYgQ29kZSxcbiAgICAgICAgbWFya3MubGluayAmJiBMaW5rV2l0aFRpdGxlLFxuXG4gICAgICAgIC8vIE5vZGVzOiBgc2NoZW1hLm5vZGVzYFxuICAgICAgICBub2Rlcy5ibG9ja3F1b3RlICYmIEJsb2NrcXVvdGUsXG4gICAgICAgIG5vZGVzLmNvZGVCbG9jayAmJiBDb2RlQmxvY2ssXG4gICAgICAgIEhhcmRCcmVhaywgLy8gVE9ETzogU2hvdWxkIHRoaXMgYWx3YXlzIG9uP1xuICAgICAgICBub2Rlcy5oZWFkaW5nICYmIEhlYWRpbmcuY29uZmlndXJlKHsgbGV2ZWxzOiBub2Rlcy5oZWFkaW5nIH0pLFxuICAgICAgICBub2Rlcy5ob3Jpem9udGFsUnVsZSAmJiBIb3Jpem9udGFsUnVsZSxcbiAgICAgICAgKG5vZGVzLm9yZGVyZWRMaXN0IHx8IG5vZGVzLmJ1bGxldExpc3QpICYmIExpc3RJdGVtLFxuICAgICAgICBub2Rlcy5idWxsZXRMaXN0ICYmIEJ1bGxldExpc3QsXG4gICAgICAgIG5vZGVzLm9yZGVyZWRMaXN0ICYmIE9yZGVyZWRMaXN0LFxuICAgICAgICAvLyBUT0RPOlxuICAgICAgICAvLyBub2Rlcy50b2RvTGlzdCAmJiBUb2RvSXRlbSxcbiAgICAgICAgLy8gbm9kZXMudG9kb0xpc3QgJiYgVG9kb0xpc3QsXG5cbiAgICAgICAgLy8gVG9vbHM6IGBzY2hlbWEudG9vbHNgXG4gICAgICAgIHRvb2xzLmhpc3RvcnkgJiYgSGlzdG9yeVxuICAgICAgXS5maWx0ZXIoZXh0ZW5zaW9uID0+ICEhZXh0ZW5zaW9uKVxuICAgIH0sXG5cbiAgICBnZXRCdXR0b25zKHNldHRpbmdzTmFtZSwgZGVzY3JpcHRpb25zKSB7XG4gICAgICBjb25zdCBsaXN0ID0gW11cblxuICAgICAgY29uc3QgYWRkQnV0dG9uID0gKHsgbmFtZSwgaWNvbiwgYXR0cmlidXRlcywgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0pID0+IHtcbiAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGljb24sXG4gICAgICAgICAgaXNBY3RpdmU6IChcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmlzQWN0aXZlKG5hbWUsIGF0dHJpYnV0ZXMpICYmXG4gICAgICAgICAgICAoaWdub3JlQWN0aXZlID09IG51bGwgfHwgIWlnbm9yZUFjdGl2ZSgpKVxuICAgICAgICAgICksXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYHRvZ2dsZSR7Y2FtZWxpemUobmFtZSwgdHJ1ZSl9YFxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLmNvbW1hbmRzW2tleV0pIHtcbiAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5jaGFpbigpW2tleV0oYXR0cmlidXRlcykuZm9jdXMoKS5ydW4oKVxuICAgICAgICAgICAgICBvbkNsaWNrXG4gICAgICAgICAgICAgICAgPyBvbkNsaWNrKHRoaXMuZWRpdG9yLCBhdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIDogY29tbWFuZChhdHRyaWJ1dGVzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNjaGVtYVtzZXR0aW5nc05hbWVdXG4gICAgICBpZiAoc2V0dGluZ3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBkZXNjcmlwdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRpb25zKSkge1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdOYW1lID0gWyd1bmRvJywgJ3JlZG8nXS5pbmNsdWRlcyhrZXkpID8gJ2hpc3RvcnknIDoga2V5XG4gICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW3NldHRpbmdOYW1lXVxuICAgICAgICAgIGNvbnN0IG5hbWUgPSB1bmRlcnNjb3JlKGtleSlcbiAgICAgICAgICBjb25zdCBpY29uID0gaHlwaGVuYXRlKGtleSlcbiAgICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGFkZEJ1dHRvbih7IG5hbWUsIGljb24gfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGVzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlLCB2YWx1ZXMsIGlnbm9yZUFjdGl2ZSwgb25DbGljayB9ID0gZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlcykgJiYgaXNBcnJheShzZXR0aW5nKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBoZWFkaW5nIGxldmVsIGF0dHJzOlxuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmcuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYWRkQnV0dG9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBgJHtpY29ufS0ke3ZhbHVlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IFthdHRyaWJ1dGVdOiB2YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGlja1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiwgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsaXN0XG4gICAgfSxcblxuICAgIGZvY3VzRWxlbWVudCgpIHtcbiAgICAgIHRoaXMuJGVsLnNjcm9sbEludG9WaWV3Py4oKVxuICAgICAgdGhpcy5lZGl0b3IuZm9jdXMoKVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgU21hbGwgPSBNYXJrLmNyZWF0ZSh7XG4gIG5hbWU6ICdzbWFsbCcsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbeyB0YWc6ICdzbWFsbCcgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKCkge1xuICAgIHJldHVybiBbJ3NtYWxsJywgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZVNtYWxsOlxuICAgICAgICBhdHRyaWJ1dGVzID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUsIGF0dHJpYnV0ZXMpXG4gICAgICAgIH0sXG4gICAgICB1bnNldFNtYWxsOlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG5cbmNvbnN0IExpbmtXaXRoVGl0bGUgPSBMaW5rLmV4dGVuZCh7XG4gIGluY2x1c2l2ZTogZmFsc2UsXG4gIHNjaGVtYToge1xuICAgIGF0dHJzOiB7XG4gICAgICBocmVmOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH0sXG4gICAgICB0aXRsZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBhcnNlSFRNTCgpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6ICdhJyxcbiAgICAgICAgICBnZXRBdHRyczogZWxlbWVudCA9PiAoe1xuICAgICAgICAgICAgaHJlZjogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgcmVuZGVySFRNTChub2RlKSB7XG4gICAgICByZXR1cm4gWydhJywgbm9kZS5hdHRycywgMF1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1tYXJrdXAge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmRpdG8tcmVzaXplIHtcbiAgICBAZXh0ZW5kICVpY29uLXJlc2l6ZTtcblxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IHVuc2V0O1xuICAgIGxlZnQ6IHVuc2V0O1xuICAgIHJpZ2h0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMWVtO1xuICAgIGhlaWdodDogMWVtO1xuICB9XG5cbiAgLlByb3NlTWlycm9yIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLW1hcmt1cC1lZGl0b3Ige1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICAvLyBNb3ZlIHBhZGRpbmcgXCJpbnNpZGVcIiBlZGl0b3IgdG8gY29ycmVjdGx5IHBvc2l0aW9uIHNjcm9sbGJhclxuICAgIG1hcmdpbi1yaWdodDogLSRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkaW5wdXQtcGFkZGluZy1ob3I7XG4gIH1cblxuICAuZGl0by1idXR0b25zLXRvb2xiYXIge1xuICAgIG1hcmdpbjogJGlucHV0LXBhZGRpbmctdmVyIDA7XG4gIH1cblxuICBoMSxcbiAgaDIsXG4gIGgzLFxuICBwLFxuICB1bCxcbiAgb2wsXG4gIHByZSxcbiAgYmxvY2txdW90ZSB7XG4gICAgbWFyZ2luOiAxcmVtIDA7XG5cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuICB9XG5cbiAgaDEsXG4gIGgyLFxuICBoMyB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIH1cblxuICBoMSB7XG4gICAgZm9udC1zaXplOiAxLjRyZW07XG4gIH1cblxuICBoMiB7XG4gICAgZm9udC1zaXplOiAxLjJyZW07XG4gIH1cblxuICB1bCB7XG4gICAgbGlzdC1zdHlsZTogZGlzYztcbiAgfVxuXG4gIGNvZGUge1xuICAgIGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHktbW9ubztcbiAgfVxuXG4gIHByZSB7XG4gICAgcGFkZGluZzogMC43cmVtIDFyZW07XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWRhcmtlcjtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgIG92ZXJmbG93LXg6IGF1dG87XG5cbiAgICBjb2RlIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgfVxuXG4gIHAgY29kZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHBhZGRpbmc6IDAgMC4zcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVyO1xuICB9XG5cbiAgYSB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIGNvbG9yOiBibHVlO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB9XG5cbiAgdWwsXG4gIG9sIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIH1cblxuICBsaSB7XG4gICAgJiA+IHAsXG4gICAgJiA+IG9sLFxuICAgICYgPiB1bCB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICB9XG5cbiAgYmxvY2txdW90ZSB7XG4gICAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAkY29sb3ItbGlnaHRlcjtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuXG4gICAgcCB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW11bHRpc2VsZWN0KFxuICA6Y2xhc3M9YHtcbiAgICAnZGl0by1tdWx0aXNlbGVjdC1zaW5nbGUnOiAhbXVsdGlwbGUsXG4gICAgJ2RpdG8tbXVsdGlzZWxlY3QtbXVsdGlwbGUnOiBtdWx0aXBsZVxuICB9YFxuKVxuICBWdWVNdWx0aXNlbGVjdChcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRPcHRpb25zXCJcbiAgICA6Y2xhc3M9XCJ7ICdtdWx0aXNlbGVjdC0tc2hvdy1oaWdobGlnaHQnOiBzaG93SGlnaGxpZ2h0IH1cIlxuICAgIDpzaG93TGFiZWxzPVwiZmFsc2VcIlxuICAgIDpwbGFjZWhvbGRlcj1cInBsYWNlaG9sZGVyXCJcbiAgICB0YWdQbGFjZWhvbGRlcj1cIlByZXNzIGVudGVyIHRvIGFkZCBuZXcgdGFnXCJcbiAgICA6b3B0aW9ucz1cInBvcHVsYXRlICYmIGFjdGl2ZU9wdGlvbnMgfHwgW11cIlxuICAgIDpjdXN0b21MYWJlbD1cImdldExhYmVsRm9yT3B0aW9uXCJcbiAgICA6dHJhY2tCeT1cIm9wdGlvblZhbHVlXCJcbiAgICA6Z3JvdXBMYWJlbD1cImdyb3VwQnlMYWJlbFwiXG4gICAgOmdyb3VwVmFsdWVzPVwiZ3JvdXBCeU9wdGlvbnNcIlxuICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcbiAgICA6dGFnZ2FibGU9XCJ0YWdnYWJsZVwiXG4gICAgOnNlYXJjaGFibGU9XCJzZWFyY2hhYmxlXCJcbiAgICA6aW50ZXJuYWxTZWFyY2g9XCIhc2VhcmNoRmlsdGVyXCJcbiAgICA6cHJlc2VydmVTZWFyY2g9XCIhIXNlYXJjaEZpbHRlclwiXG4gICAgOmNsZWFyT25TZWxlY3Q9XCIhc2VhcmNoRmlsdGVyXCJcbiAgICA6Y2xvc2VPblNlbGVjdD1cIiFzdGF5T3BlblwiXG4gICAgOmxvYWRpbmc9XCJpc0xvYWRpbmdcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIEBvcGVuPVwib25PcGVuXCJcbiAgICBAY2xvc2U9XCJvbkNsb3NlXCJcbiAgICBAdGFnPVwib25BZGRUYWdcIlxuICAgIEBzZWFyY2gtY2hhbmdlPVwib25TZWFyY2hDaGFuZ2VcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVHlwZU1peGluIGZyb20gJy4uL21peGlucy9UeXBlTWl4aW4uanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5pbXBvcnQgVnVlTXVsdGlzZWxlY3QgZnJvbSAndnVlLW11bHRpc2VsZWN0J1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGlzQm9vbGVhbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignbXVsdGlzZWxlY3QnLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVnVlTXVsdGlzZWxlY3QgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgICAgc2VhcmNoZWRPcHRpb25zOiBudWxsLFxuICAgICAgcG9wdWxhdGU6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2VsZWN0ZWRPcHRpb25zOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlXG4gICAgICAgICAgPyAodGhpcy5zZWxlY3RlZFZhbHVlIHx8IFtdKVxuICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIC8vIElmIGFuIG9wdGlvbiBjYW5ub3QgYmUgZm91bmQsIHdlIG1heSBiZSBpbiB0YWdnYWJsZSBtb2RlIGFuZFxuICAgICAgICAgICAgICAgIC8vIGNhbiBhZGQgaXQuXG4gICAgICAgICAgICAgICAgdmFsdWUgPT4gKFxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh2YWx1ZSkgfHwgdGhpcy5hZGRUYWdPcHRpb24odmFsdWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgb3B0aW9ucyB0aGF0IHdlIGNvdWxkbid0IG1hdGNoLlxuICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2UgZGlzcGxheSBhbiBlcnJvciBpbnN0ZWFkP1xuICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgOiB0aGlzLnNlbGVjdGVkT3B0aW9uXG4gICAgICB9LFxuXG4gICAgICBzZXQob3B0aW9uKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdmFsdWUgdG8gb3B0aW9ucyBvYmplY3QsIHNpbmNlIHZ1ZS1tdWx0aXNlbGVjdCBjYW4ndCBtYXAgdGhhdFxuICAgICAgICAvLyBpdHNlbGYgdW5mb3J0dW5hdGVseS4gYHRyYWNrLWJ5YCBpcyB1c2VkIGZvciA6a2V5IG1hcHBpbmcgaXQgc2VlbXMuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMubXVsdGlwbGVcbiAgICAgICAgICA/IChvcHRpb24gfHwgW10pLm1hcCh2YWx1ZSA9PiB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKHZhbHVlKSlcbiAgICAgICAgICA6IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWN0aXZlT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaGVkT3B0aW9ucyB8fCB0aGlzLm9wdGlvbnNcbiAgICB9LFxuXG4gICAgbXVsdGlwbGU6IGdldFNjaGVtYUFjY2Vzc29yKCdtdWx0aXBsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc2VhcmNoYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3NlYXJjaGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHRhZ2dhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigndGFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHN0YXlPcGVuOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RheU9wZW4nLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHBsYWNlaG9sZGVyKCkge1xuICAgICAgbGV0IHsgcGxhY2Vob2xkZXIsIHNlYXJjaGFibGUsIHRhZ2dhYmxlIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgaWYgKGlzQm9vbGVhbihwbGFjZWhvbGRlcikpIHtcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlciA/IHVuZGVmaW5lZCA6IG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiBwbGFjZWhvbGRlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gc2VhcmNoYWJsZSAmJiB0YWdnYWJsZVxuICAgICAgICAgID8gYFNlYXJjaCBvciBhZGQgYSAke3RoaXMubGFiZWx9YFxuICAgICAgICAgIDogc2VhcmNoYWJsZVxuICAgICAgICAgICAgPyBgU2VsZWN0IG9yIHNlYXJjaCAke3RoaXMubGFiZWx9YFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgOiBwbGFjZWhvbGRlclxuICAgIH0sXG5cbiAgICBzaG93SGlnaGxpZ2h0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNNb3VudGVkICYmIHRoaXMuJHJlZnMuZWxlbWVudC5wb2ludGVyRGlydHlcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLmlzTW91bnRlZCA9IHRydWVcbiAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgIC8vIHZ1ZS1tdWx0aXNlbGVjdCBkb2Vzbid0IHN1cHBvcnQgdGhlIGF1dG9mb2N1cyBhdHRyaWJ1dGUuIFdlIG5lZWQgdG9cbiAgICAgIC8vIGhhbmRsZSBpdCBoZXJlLlxuICAgICAgdGhpcy5mb2N1cygpXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhZGRUYWdPcHRpb24odGFnKSB7XG4gICAgICBpZiAodGhpcy50YWdnYWJsZSkge1xuICAgICAgICBjb25zdCB7IG9wdGlvbkxhYmVsLCBvcHRpb25WYWx1ZSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBvcHRpb24gPVxuICAgICAgICAgIG9wdGlvbkxhYmVsICYmIG9wdGlvblZhbHVlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdOiB0YWcsXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogRGVmaW5lIGEgc2ltcGxlIHNjaGVtYSBvcHRpb24gdG8gY29udmVydCB0aGUgdGFnIHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gdG8gc29tZXRoaW5nIGVsc2UsIGUuZy4gYHRvVGFnOiB0YWcgPT4gdW5kZXJzY29yZSh0YWcpYFxuICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV06IHRhZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHRhZ1xuICAgICAgICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pXG4gICAgICAgIHJldHVybiBvcHRpb25cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kcmVmcy5lbGVtZW50LmFjdGl2YXRlKClcbiAgICB9LFxuXG4gICAgb25PcGVuKCkge1xuICAgICAgdGhpcy5wb3B1bGF0ZSA9IHRydWVcbiAgICB9LFxuXG4gICAgb25DbG9zZSgpIHtcbiAgICAgIC8vIFNpbmNlIHdlIGRvbid0IGZpcmUgYmx1ciBldmVudHMgd2hpbGUgdGhlIG11bHRpc2VsZWN0IGlzIG9wZW4gKHNlZVxuICAgICAgLy8gYmVsb3cpLCB3ZSBuZWVkIHRvIGRvIGl0IGhlcmUsIHdoZW4gaXQncyBhY3R1YWxseSBjbG9zZWQuXG4gICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25CbHVyKCkge1xuICAgICAgaWYgKCF0aGlzLiRyZWZzLmVsZW1lbnQuaXNPcGVuKSB7XG4gICAgICAgIFR5cGVNaXhpbi5tZXRob2RzLm9uQmx1ci5jYWxsKHRoaXMpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQWRkVGFnKHRhZykge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5hZGRUYWdPcHRpb24odGFnKVxuICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBvblNlYXJjaENoYW5nZShxdWVyeSkge1xuICAgICAgaWYgKHRoaXMuc2VhcmNoRmlsdGVyKSB7XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgIC8vIFNldCBgc2VhcmNoZWRPcHRpb25zYCB0byBhbiBlbXB0eSBhcnJheSwgYmVmb3JlIGl0IHdpbGwgYmVcbiAgICAgICAgICAvLyBwb3B1bGF0ZWQgYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgYWN0dWFsIHJlc3VsdHMuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBbXVxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gYXdhaXQgdGhpcy5yZXNvbHZlRGF0YShcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2VhcmNoRmlsdGVyKG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHF1ZXJ5IH0pKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDbGVhciBgc2VhcmNoZWRPcHRpb25zYCB3aGVuIHRoZSBxdWVyeSBpcyBjbGVhcmVkLlxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcbkBpbXBvcnQgJ3Z1ZS1tdWx0aXNlbGVjdC9kaXN0L3Z1ZS1tdWx0aXNlbGVjdC5jc3MnO1xuXG4kc3Bpbm5lci13aWR0aDogJHNlbGVjdC1hcnJvdy13aWR0aDtcbiR0YWctaWNvbi13aWR0aDogMS44ZW07XG4kdGFnLW1hcmdpbjogMnB4O1xuJHRhZy1wYWRkaW5nOiAzcHg7XG4kdGFnLWxpbmUtaGVpZ2h0OiAxZW07XG5cbi5kaXRvLW11bHRpc2VsZWN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICYuZGl0by1tdWx0aXNlbGVjdC1zaW5nbGUge1xuICAgIC0taW5wdXQtd2lkdGg6IDEwMCU7XG4gIH1cblxuICAmLmRpdG8tbXVsdGlzZWxlY3QtbXVsdGlwbGUge1xuICAgIC0taW5wdXQtd2lkdGg6IGF1dG87XG4gIH1cblxuICAmLmRpdG8taGFzLWVycm9ycyB7XG4gICAgJl9fdGFncyB7XG4gICAgICBib3JkZXItY29sb3I6ICRjb2xvci1lcnJvcjtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIHdpZHRoOiAkc3Bpbm5lci13aWR0aDtcbiAgfVxuXG4gIC5tdWx0aXNlbGVjdCB7XG4gICAgJHNlbGY6IGxhc3Qtc2VsZWN0b3IoJik7XG5cbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgbWluLWhlaWdodDogaW5oZXJpdDtcbiAgICBjb2xvcjogJGNvbG9yLWJsYWNrO1xuXG4gICAgJi0tYWN0aXZlIHtcbiAgICAgICN7JHNlbGZ9X19wbGFjZWhvbGRlciB7XG4gICAgICAgIC8vIERvbid0IHVzZSBgZGlzcGxheTogbm9uZWAgdG8gaGlkZSBwbGFjZS1ob2xkZXIsIGFzIHRoZSBsYXlvdXQgd291bGRcbiAgICAgICAgLy8gY29sbGFwc2UuXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fc2luZ2xlLFxuICAgICAgI3skc2VsZn1fX2lucHV0IHtcbiAgICAgICAgLy8gU2FkbHksIHZ1ZS1zZWxlY3Qgc2V0cyBgc3R5bGU9XCJ3aWR0aFwiYCBpbiBhZGRpdGlvbiB0byB1c2luZyBjbGFzc2VzXG4gICAgICAgIC8vIHNvIGAhaW1wb3J0YW50YCBpcyBuZWNlc3Nhcnk6XG4gICAgICAgIHdpZHRoOiB2YXIoLS1pbnB1dC13aWR0aCkgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgI3skc2VsZn1fX3RhZ3Mge1xuICAgICAgICBib3JkZXItY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fY29udGVudC13cmFwcGVyIHtcbiAgICAgICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICRib3JkZXItY29sb3I7XG4gICAgICAgIG1hcmdpbjogLTFweCAwIDA7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgfVxuXG4gICAgICAmI3skc2VsZn0tLWFib3ZlIHtcbiAgICAgICAgI3skc2VsZn1fX3RhZ3Mge1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAjeyRzZWxmfV9fY29udGVudC13cmFwcGVyIHtcbiAgICAgICAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICAgICAgICAgIG1hcmdpbjogMCAwIC0xcHg7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICZfX3RhZ3Mge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgICAgcGFkZGluZzogMCAkc3Bpbm5lci13aWR0aCAwIDA7XG4gICAgICAvLyBTbyB0YWdzIGNhbiBmbG9hdCBvbiBtdWx0aXBsZSBsaW5lcyBhbmQgaGF2ZSBwcm9wZXIgbWFyZ2luczpcbiAgICAgIHBhZGRpbmctYm90dG9tOiAkdGFnLW1hcmdpbjtcbiAgICB9XG5cbiAgICAmX190YWcge1xuICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICBtYXJnaW46ICR0YWctbWFyZ2luIDAgMCAkdGFnLW1hcmdpbjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICAgIHBhZGRpbmc6ICR0YWctcGFkZGluZyAkdGFnLWljb24td2lkdGggJHRhZy1wYWRkaW5nIDAuOGVtO1xuICAgICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgICBoZWlnaHQ6IGNhbGMoJGlucHV0LWhlaWdodCAtIDIgKiAkdGFnLXBhZGRpbmcpO1xuICAgIH1cblxuICAgICZfX3RhZ3Mtd3JhcCB7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgIH1cblxuICAgICZfX3NpbmdsZSxcbiAgICAmX19wbGFjZWhvbGRlcixcbiAgICAmX19pbnB1dCB7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBtYXJnaW46IDAgMCAxcHggMDtcbiAgICAgIC8vIFNhZGx5LCB2dWUtc2VsZWN0IHNldHMgc3R5bGU9XCJwYWRkaW5nOiAuLi47XCIgaW4gYWRkaXRpb24gdG8gdXNpbmdcbiAgICAgIC8vIGNsYXNzZXMsIHNvIGAhaW1wb3J0YW50YCBpcyBuZWNlc3Nhcnk6XG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZyAhaW1wb3J0YW50O1xuICAgICAgLy8gU28gaW5wdXQgY2FuIGZsb2F0IG5leHQgdG8gdGFncyBhbmQgaGF2ZSBwcm9wZXIgbWFyZ2lucyB3aXRoXG4gICAgICAvLyAmX190YWdzOlxuICAgICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgfVxuXG4gICAgJl9fcGxhY2Vob2xkZXIsXG4gICAgJl9faW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgJl9fcGxhY2Vob2xkZXIge1xuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAvLyBFbmZvcmNlIGFjdHVhbCBsaW5lLWhlaWdodCBmb3IgcG9zaXRpb25pbmcuXG4gICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3NlbGVjdCxcbiAgICAmX19zcGlubmVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAvLyAkYm9yZGVyLXdpZHRoIHRvIHByZXZlbnQgbWFza2luZyBib3JkZXIgd2l0aCAmX19zcGlubmVyXG4gICAgICB0b3A6ICRib3JkZXItd2lkdGg7XG4gICAgICByaWdodDogJGJvcmRlci13aWR0aDtcbiAgICAgIGJvdHRvbTogJGJvcmRlci13aWR0aDtcbiAgICAgIGhlaWdodDogaW5oZXJpdDtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIH1cblxuICAgICZfX3NlbGVjdCB7XG4gICAgICB3aWR0aDogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogY2FsYygkc2VsZWN0LWFycm93LXdpZHRoIC8gMik7XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBpbmNsdWRlIGFycm93KCRzZWxlY3QtYXJyb3ctc2l6ZSk7XG5cbiAgICAgICAgYm90dG9tOiAkc2VsZWN0LWFycm93LWJvdHRvbTtcbiAgICAgICAgcmlnaHQ6IGNhbGMoLTEgKiAkc2VsZWN0LWFycm93LXNpemUgLyAyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19zcGlubmVyIHtcbiAgICAgIHdpZHRoOiAkc3Bpbm5lci13aWR0aDtcblxuICAgICAgJjo6YmVmb3JlLFxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAvLyBDaGFuZ2UgdGhlIHdpZHRoIG9mIHRoZSBsb2FkaW5nIHNwaW5uZXJcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAzcHg7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fb3B0aW9uIHtcbiAgICAgICRvcHRpb246IGxhc3Qtc2VsZWN0b3IoJik7XG5cbiAgICAgIG1pbi1oZWlnaHQ6IHVuc2V0O1xuICAgICAgaGVpZ2h0OiB1bnNldDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGFnLWxpbmUtaGVpZ2h0O1xuICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gdGV4dCBmb3Igb3B0aW9uc1xuICAgICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICAgICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2hvdyB0aGUgaGlnaGxpZ2h0IG9uY2UgdGhlIHB1bGxkb3duIGhhcyByZWNlaXZlZCBtb3VzZSBvclxuICAgICAgLy8ga2V5Ym9hcmQgaW50ZXJhY3Rpb24sIGluIHdoaWNoIGNhc2UgYCYtLXNob3ctaGlnaGxpZ2h0YCB3aWxsIGJlIHNldCxcbiAgICAgIC8vIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgYHBvaW50ZXJEaXJ0eWAgaW4gdnVlLW11bHRpc2VsZWN0LlxuICAgICAgLy8gVW50aWwgdGhlbiwgY2xlYXIgdGhlIGhpZ2hsaWdodCBzdHlsZSwgYnV0IG9ubHkgaWYgaXQgaXNuJ3QgYWxzb1xuICAgICAgLy8gZGlzYWJsZWQgb3Igc2VsZWN0ZWQsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBzdHlsZS5cbiAgICAgIEBhdC1yb290ICN7JHNlbGZ9Om5vdCgjeyRzZWxmfS0tc2hvdy1oaWdobGlnaHQpXG4gICAgICAgICAgI3skb3B0aW9ufTpub3QoI3skb3B0aW9ufS0tZGlzYWJsZWQpOm5vdCgjeyRvcHRpb259LS1zZWxlY3RlZCkge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICAmLS1oaWdobGlnaHQge1xuICAgICAgICAmOjphZnRlciB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICAgIH1cblxuICAgICAgICBAYXQtcm9vdCAjeyRzZWxmfSN7JHNlbGZ9LS1zaG93LWhpZ2hsaWdodCAje2xhc3Qtc2VsZWN0b3IoJil9IHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmLS1zZWxlY3RlZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcblxuICAgICAgICAmI3skb3B0aW9ufS0taGlnaGxpZ2h0IHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJi0tZGlzYWJsZWQge1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3RhZyB7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgICZfX3RhZy1pY29uIHtcbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgICB3aWR0aDogJHRhZy1pY29uLXdpZHRoO1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2xlYXI7XG5cbiAgICAgICAgZm9udC1zaXplOiAwLjllbTtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyOjphZnRlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX190YWdzLFxuICAgICZfX2NvbnRlbnQtd3JhcHBlciB7XG4gICAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXB1dGVkOiB7XG4gICAgaW5wdXRWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSAhPT0gbnVsbCA/IHRoaXMudmFsdWUgOiAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPVxuICAgICAgICAgIHZhbHVlICE9PSAnJ1xuICAgICAgICAgICAgPyB0aGlzLmlzSW50ZWdlclxuICAgICAgICAgICAgICA/IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgICAgICAgICAgICAgOiBwYXJzZUZsb2F0KHZhbHVlKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGlzSW50ZWdlcigpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBzdGVwVmFsdWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGVwID09IG51bGwgJiYgIXRoaXMuaXNJbnRlZ2VyID8gJ2FueScgOiB0aGlzLnN0ZXBcbiAgICB9LFxuXG4gICAgZGVjaW1hbHM6IGdldFNjaGVtYUFjY2Vzc29yKCdkZWNpbWFscycsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgc3RlcDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3N0ZXAnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBnZXQoc3RlcCkge1xuICAgICAgICAvLyBGb3IgaW50ZWdlcnMsIHJvdW5kIHRoZSBzdGVwcyB0byB0aGUgbmV4dCBiaWdnZXIgaW50ZWdlciB2YWx1ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIHN0ZXAgIT0gbnVsbCA/IE1hdGguY2VpbChzdGVwKSA6IHN0ZXBcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1pbjogZ2V0U2NoZW1hQWNjZXNzb3IoJ21pbicsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtaW4pIHtcbiAgICAgICAgbWluID1cbiAgICAgICAgICBtaW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlswXVxuICAgICAgICAgICAgOiBtaW5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1pbiAhPSBudWxsID8gTWF0aC5mbG9vcihtaW4pIDogbWluXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBtYXg6IGdldFNjaGVtYUFjY2Vzc29yKCdtYXgnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBnZXQobWF4KSB7XG4gICAgICAgIG1heCA9XG4gICAgICAgICAgbWF4ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgncmFuZ2UnLCB7IHR5cGU6IEFycmF5IH0pPy5bMV1cbiAgICAgICAgICAgIDogbWF4XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW50ZWdlciAmJiBtYXggIT0gbnVsbCA/IE1hdGguY2VpbChtYXgpIDogbWF4XG4gICAgICB9XG4gICAgfSksXG5cbiAgICByYW5nZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JhbmdlJywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBnZXQoKSB7XG4gICAgICAgIC8vIGB0aGlzLm1pbmAsIGB0aGlzLm1heGAgYWxyZWFkeSBzdXBwb3J0IGBzY2hlbWEucmFuZ2VgLFxuICAgICAgICAvLyBzbyByZWRpcmVjdCB0aGVyZS5cbiAgICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpc1xuICAgICAgICByZXR1cm4gbWluICE9IG51bGwgJiYgbWF4ICE9IG51bGwgPyBbbWluLCBtYXhdIDogdW5kZWZpbmVkXG4gICAgICB9LFxuXG4gICAgICBzZXQocmFuZ2UpIHtcbiAgICAgICAgLy8gUHJvdmlkZSBhIHNldHRlciB0aGF0IGRlbGVnYXRlcyB0byBgW3RoaXMubWluLCB0aGlzLm1heF1gLFxuICAgICAgICAvLyBzaW5jZSB0aG9zZSBhbHJlYWR5IGhhbmRsZSBgc2NoZW1hLnJhbmdlYC5cbiAgICAgICAgaWYgKGlzQXJyYXkocmFuZ2UpKSB7XG4gICAgICAgICAgO1t0aGlzLm1pbiwgdGhpcy5tYXhdID0gcmFuZ2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSB7fVxuICAgICAgY29uc3QgeyByYW5nZSwgbWluLCBtYXgsIGRlY2ltYWxzLCBzdGVwIH0gPSB0aGlzXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmFuZ2UgPSByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1pbiAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMubWluID0gbWluXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMubWF4ID0gbWF4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkZWNpbWFscyAhPSBudWxsKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCkge1xuICAgICAgICBjb25zdCBkZWNpbWFscyA9IChgJHtzdGVwfWAuc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoXG4gICAgICAgIGlmIChkZWNpbWFscyA+IDApIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5kZWNpbWFscyA9IGRlY2ltYWxzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnRlZ2VyKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLmludGVnZXIgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbnNcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5JbnB1dEZpZWxkLmRpdG8tbnVtYmVyKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIHR5cGU9XCJudW1iZXJcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgOm1pbj1cIm1pblwiXG4gIDptYXg9XCJtYXhcIlxuICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnbnVtYmVyJywgJ2ludGVnZXInXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW051bWJlck1peGluXSxcbiAgICBjb21wb25lbnRzOiB7IElucHV0RmllbGQgfSxcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgaXNJbnRlZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnaW50ZWdlcidcbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi8vIE9ubHkgc2hvdyBzcGluIGJ1dHRvbnMgaWYgdGhlIG51bWJlciBjb21wb25lbnQgZGVmaW5lcyBhIHN0ZXAgc2l6ZS5cbmlucHV0W3R5cGU9J251bWJlciddOm5vdChbc3RlcF0pIHtcbiAgJjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbiAgJjo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1vYmplY3QoXG4gIHYtaWY9XCJpc1JlYWR5XCJcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJzY2hlbWEuY2xhc3NcIlxuICA6c3R5bGU9XCJzY2hlbWEuc3R5bGVcIlxuKVxuICAuZGl0by1vYmplY3QtY29udGVudChcbiAgICB2LWlmPVwib2JqZWN0RGF0YVwiXG4gIClcbiAgICAvLy0gU3VwcG9ydCB0aGUgc2FtZSByZW5kZXJpbmcgb3B0aW9ucyBhcyBUeXBlTGlzdDpcbiAgICBEaXRvU2NoZW1hSW5saW5lZChcbiAgICAgIHYtaWY9XCJpc0lubGluZWRcIlxuICAgICAgOmxhYmVsPVwib2JqZWN0TGFiZWxcIlxuICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgb2JqZWN0RGF0YSwgY29udGV4dClcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgOmNvbGxhcHNlZD1cImNvbGxhcHNlZFwiXG4gICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgKVxuICAgIGNvbXBvbmVudChcbiAgICAgIHYtZWxzZS1pZj1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICApXG4gICAgc3BhbihcbiAgICAgIHYtZWxzZS1pZj1cInJlbmRlclwiXG4gICAgICB2LWh0bWw9XCJyZW5kZXIoZ2V0Q29udGV4dCgpKVwiXG4gICAgKVxuICAgIHNwYW4oXG4gICAgICB2LWVsc2VcbiAgICAgIHYtaHRtbD1cImdldEl0ZW1MYWJlbChzY2hlbWEsIG9iamVjdERhdGEpXCJcbiAgICApXG4gIERpdG9FZGl0QnV0dG9ucyhcbiAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICA6ZGVsZXRhYmxlPVwib2JqZWN0RGF0YSAmJiBkZWxldGFibGVcIlxuICAgIDplZGl0YWJsZT1cIm9iamVjdERhdGEgJiYgZWRpdGFibGVcIlxuICAgIDpjcmVhdGVQYXRoPVwicGF0aFwiXG4gICAgOmVkaXRQYXRoPVwicGF0aFwiXG4gICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICA6cGF0aD1cInBhdGhcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKG9iamVjdERhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hQ29tcG9uZW50IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ29iamVjdCcsIHtcbiAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgIC8vIE5vIG5lZWQgZm9yIHRyYW5zZm9ybWF0aW9uIGhlcmUuIFNlZSBUeXBlVHJlZUxpc3QgZm9yIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG9iamVjdExhYmVsKCkge1xuICAgICAgLy8gT25seSBzaG93IGEgbGFiZWwgaWYgdGhlIG9iamVjdCBpcyBjb2xsYXBzaWJsZS5cbiAgICAgIHJldHVybiB0aGlzLmNvbGxhcHNpYmxlXG4gICAgICAgID8gdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIHRoaXMub2JqZWN0RGF0YSwgeyBhc09iamVjdDogdHJ1ZSB9KVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgZGF0YTogdGhpcy5vYmplY3REYXRhIH0pXG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1vYmplY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQge1xuICAgIGZsZXg6IDAgMSAxMDAlO1xuICB9XG5cbiAgPiAuZGl0by1idXR0b25zIHtcbiAgICBmbGV4OiAxIDAgMCU7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3BhbmVsJywge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiBmYWxzZSxcbiAgb21pdFBhZGRpbmc6IHRydWUsXG5cbiAgZ2V0UGFuZWxTY2hlbWEoc2NoZW1hKSB7XG4gICAgLy8gRm9yIGEgVHlwZVBhbmVsLCB0aGUgY29tcG9uZW50IHNjaGVtYSBpcyBhbHNvIHRoZSBwYW5lbCBzY2hlbWEsIGJ1dFxuICAgIC8vIHJlbW92ZSB0aGUgYWRkZWQgbmFtZSwgc28gaXQgZG9lc24ndCBnZXQgYXBwZW5kZWQgdHdpY2UgdG8gZGF0YS1wYXRoLlxuICAgIGNvbnN0IHsgbmFtZSwgLi4ucGFuZWwgfSA9IHNjaGVtYVxuICAgIHJldHVybiBwYW5lbFxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxucHJvZ3Jlc3MuZGl0by1wcm9ncmVzcyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnZhbHVlPVwicHJvZ3Jlc3NWYWx1ZVwiXG4gIDptYXg9XCJwcm9ncmVzc01heFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBOdW1iZXJNaXhpbiBmcm9tICcuLi9taXhpbnMvTnVtYmVyTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncHJvZ3Jlc3MnLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBwcm9ncmVzc1ZhbHVlKCkge1xuICAgICAgbGV0IHsgdmFsdWUsIHJhbmdlLCBzdGVwIH0gPSB0aGlzXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgdmFsdWUgLT0gcmFuZ2VbMF1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIHN0ZXApICogc3RlcFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICcnXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgcHJvZ3Jlc3NNYXgoKSB7XG4gICAgICBjb25zdCB7IHJhbmdlIH0gPSB0aGlzXG4gICAgICByZXR1cm4gcmFuZ2UgPyByYW5nZVsxXSAtIHJhbmdlWzBdIDogbnVsbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnVsLmRpdG8tcmFkaW8tYnV0dG9ucyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJgZGl0by1sYXlvdXQtJHtzY2hlbWEubGF5b3V0IHx8ICd2ZXJ0aWNhbCd9YFwiXG4pXG4gIGxpKFxuICAgIHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIlxuICApXG4gICAgbGFiZWxcbiAgICAgIGlucHV0LmRpdG8tcmFkaW8tYnV0dG9uKFxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkVmFsdWVcIlxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICApXG4gICAgICB8IHt7IGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncmFkaW8nLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IHRydWVcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1yYWRpby1idXR0b25zIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICAuZGl0by1yYWRpby1idXR0b24ge1xuICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zZWN0aW9uKDpjbGFzcz1cInsgJ2RpdG8tc2VjdGlvbi1sYWJlbGxlZCc6ICEhc2NoZW1hLmxhYmVsIH1cIilcbiAgRGl0b1BhbmUuZGl0by1zZWN0aW9uLXBhbmUoXG4gICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cIml0ZW1cIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldEl0ZW1Gb3JtU2NoZW1hLCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzZWN0aW9uJywge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgaWdub3JlTWlzc2luZ1ZhbHVlOiBzY2hlbWEgPT4gIXNjaGVtYS5uZXN0ZWQgJiYgISgnZGVmYXVsdCcgaW4gc2NoZW1hKSxcbiAgZGVmYXVsdE5lc3RlZDogZmFsc2UsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBvbWl0RmxleEdyb3c6IHRydWUsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy52YWx1ZSA6IHRoaXMuZGF0YVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWFcbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lLCByb3V0ZXMsIGxldmVsKSB7XG4gICAgLy8gUHJvY2VzcyBzZWN0aW9uIGNvbXBvbmVudHMgc28gdGhlaXIgZm9ybXMgZ2V0IHJlc29sdmVkIHRvby5cbiAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbClcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNlY3Rpb24ge1xuICAmLmRpdG8tc2VjdGlvbi1sYWJlbGxlZCB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gTmVzdGluZyBpcyBuZWVkZWQgdG8gbWFrZSBhbiBhcnJvdyBhcHBlYXIgb3ZlciB0aGUgc2VsZWN0IGl0ZW06XG4uZGl0by1zZWxlY3RcbiAgc2VsZWN0KFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG1vdXNlZG93bj1cInBvcHVsYXRlID0gdHJ1ZVwiXG4gICAgQGZvY3VzPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInBvcHVsYXRlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gICAgICApXG4gICAgICAgIG9wdGdyb3VwKFxuICAgICAgICAgIHYtaWY9XCJncm91cEJ5XCJcbiAgICAgICAgICA6bGFiZWw9XCJvcHRpb25bZ3JvdXBCeUxhYmVsXVwiXG4gICAgICAgIClcbiAgICAgICAgICBvcHRpb24oXG4gICAgICAgICAgICB2LWZvcj1cIm9wdCBpbiBvcHRpb25bZ3JvdXBCeU9wdGlvbnNdXCJcbiAgICAgICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdClcIlxuICAgICAgICAgICkge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0KSB9fVxuICAgICAgICBvcHRpb24oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgICkge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1lbHNlLWlmPVwic2VsZWN0ZWRPcHRpb25cIlxuICAgIClcbiAgICAgIG9wdGlvbig6dmFsdWU9XCJzZWxlY3RlZFZhbHVlXCIpIHt7IGdldExhYmVsRm9yT3B0aW9uKHNlbGVjdGVkT3B0aW9uKSB9fVxuICBidXR0b24uZGl0by1idXR0b24tY2xlYXIuZGl0by1idXR0b24tb3ZlcmxheShcbiAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgQGNsaWNrPVwiY2xlYXJcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBEaXNhYmxlIGxhenktcG9wdWxhdGlvbiBmb3Igbm93LlxuICAgICAgLy8gVE9ETzogU2V0IHRvIGBmYWxzZWAgT25jZSBsaW5ldG8gZTJlIHRlc3RzIGFkZHJlc3MgdGhlaXIgaXNzdWVzLlxuICAgICAgcG9wdWxhdGU6IHRydWVcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4vLyBUT0RPOiBNb3ZlIHRvIGRpdG8tdWlcbiRzZWxlY3QtYXJyb3ctcmlnaHQ6IGNhbGMoKCRzZWxlY3QtYXJyb3ctd2lkdGggLSAkc2VsZWN0LWFycm93LXNpemUpIC8gMik7XG5cbi5kaXRvLXNlbGVjdCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIHNlbGVjdCB7XG4gICAgcGFkZGluZy1yaWdodDogJHNlbGVjdC1hcnJvdy13aWR0aDtcbiAgfVxuICAvLyBIYW5kbGUgLmRpdG8td2lkdGgtZmlsbCBzZXBhcmF0ZWx5IGR1ZSB0byByZXF1aXJlZCBuZXN0aW5nIG9mIHNlbGVjdDpcbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gIH1cblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIEBpbmNsdWRlIGFycm93KCRzZWxlY3QtYXJyb3ctc2l6ZSk7XG5cbiAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgIHJpZ2h0OiBjYWxjKCN7JHNlbGVjdC1hcnJvdy1yaWdodH0gKyAjeyRib3JkZXItd2lkdGh9KTtcbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZDo6YWZ0ZXIge1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zbGlkZXJcbiAgaW5wdXQuZGl0by1yYW5nZShcbiAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgOm1pbj1cIm1pblwiXG4gICAgOm1heD1cIm1heFwiXG4gICAgOnN0ZXA9XCJzdGVwVmFsdWVcIlxuICApXG4gIElucHV0RmllbGQuZGl0by1udW1iZXIoXG4gICAgdi1pZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cIm51bWJlclwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgOm1pbj1cIm1pblwiXG4gICAgOm1heD1cIm1heFwiXG4gICAgOnN0ZXA9XCJzdGVwVmFsdWVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBJbnB1dEZpZWxkIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2xpZGVyJywge1xuICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcblxuICBjb21wdXRlZDoge1xuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0lucHV0YD9cbiAgICBpbnB1dDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9KVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2xpZGVyIHtcbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1yYW5nZSB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IGNhbGMoMWVtICogdmFyKC0tbGluZS1oZWlnaHQpKTtcbiAgfVxuXG4gIC5kaXRvLW51bWJlciB7XG4gICAgYm9yZGVyOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5Td2l0Y2hCdXR0b24uZGl0by1zd2l0Y2goXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIDpsYWJlbHM9XCJsYWJlbHNcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBTd2l0Y2hCdXR0b24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzd2l0Y2gnLCB7XG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBTd2l0Y2hCdXR0b25cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxhYmVscygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5sYWJlbHNcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5JbnB1dEZpZWxkLmRpdG8tdGV4dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICA6dHlwZT1cImlucHV0VHlwZVwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuY29uc3QgbWFza2VkUGFzc3dvcmQgPSAnKioqKioqKioqKioqKioqKidcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFtcbiAgICAndGV4dCcsXG4gICAgJ2VtYWlsJyxcbiAgICAndXJsJyxcbiAgICAnaG9zdG5hbWUnLFxuICAgICdkb21haW4nLFxuICAgICd0ZWwnLFxuICAgICdwYXNzd29yZCcsXG4gICAgJ2NyZWRpdGNhcmQnXG4gIF0sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBjb21wb25lbnRzOiB7IElucHV0RmllbGQgfSxcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG4gICAgaWdub3JlTWlzc2luZ1ZhbHVlOiBzY2hlbWEgPT4gc2NoZW1hLnR5cGUgPT09ICdwYXNzd29yZCcsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgaW5wdXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWRpdGNhcmQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiAndGV4dCcsXG4gICAgICAgICAgICBkb21haW46ICd0ZXh0J1xuICAgICAgICAgIH1bdGhpcy50eXBlXSB8fFxuICAgICAgICAgIHRoaXMudHlwZVxuICAgICAgICApXG4gICAgICB9LFxuXG4gICAgICBpbnB1dFZhbHVlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy50eXBlID09PSAncGFzc3dvcmQnICYmXG4gICAgICAgICAgICB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICF0aGlzLmZvY3VzZWRcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IG1hc2tlZFBhc3N3b3JkXG4gICAgICAgICAgICA6IHRoaXMudmFsdWVcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBnZXRWYWxpZGF0aW9ucygpIHtcbiAgICAgICAgY29uc3QgcnVsZSA9IHtcbiAgICAgICAgICBlbWFpbDogJ2VtYWlsJyxcbiAgICAgICAgICB1cmw6ICd1cmwnLFxuICAgICAgICAgIGhvc3RuYW1lOiAnaG9zdG5hbWUnLFxuICAgICAgICAgIGRvbWFpbjogJ2RvbWFpbicsXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZCcsXG4gICAgICAgICAgY3JlZGl0Y2FyZDogJ2NyZWRpdGNhcmQnXG4gICAgICAgIH1bdGhpcy50eXBlXVxuICAgICAgICByZXR1cm4gcnVsZSA/IHsgW3J1bGVdOiB0cnVlIH0gOiB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGV4dGFyZWEuZGl0by10ZXh0YXJlYS5kaXRvLWlucHV0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwidmFsdWVcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgOnJvd3M9XCJsaW5lc1wiXG4gIDpjbGFzcz1cInsgJ2RpdG8tcmVzaXphYmxlJzogcmVzaXphYmxlIH1cIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigndGV4dGFyZWEnLCB7XG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICB0ZXh0RmllbGQ6IHRydWUsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCA0XG4gICAgfSxcblxuICAgIHJlc2l6YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Jlc2l6YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10ZXh0YXJlYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICByZXNpemU6IG5vbmU7XG4gIG1pbi1oZWlnaHQ6IGNhbGMoMWVtICogdmFyKC0tbGluZS1oZWlnaHQpICsgI3syICogJGlucHV0LXBhZGRpbmctdmVyfSk7XG5cbiAgJi5kaXRvLXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmVlLWxpc3RcbiAgRGl0b1Njb3BlcyhcbiAgICB2LWlmPVwic2NvcGVzXCJcbiAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgOnNjb3Blcz1cInNjb3Blc1wiXG4gIClcbiAgLmRpdG8tdHJlZS1wYW5lbFxuICAgIERpdG9UcmVlSXRlbShcbiAgICAgIDpzY2hlbWE9XCJ0cmVlU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cInRyZWVEYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cInRyZWVEYXRhXCJcbiAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgOm9wZW49XCJ0cnVlXCJcbiAgICApXG4gICAgLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJoYXNFZGl0YWJsZUZvcm1zXCJcbiAgICApXG4gICAgICAvLy0gSW5jbHVkZSBhIHJvdXRlci12aWV3IGZvciB0aGUgb3B0aW9uYWwgRGl0b0Zvcm1JbmxpbmVkXG4gICAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7XG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ3RyZWUtbGlzdCcsICd0cmVlLW9iamVjdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gICAgcHJvdmlkZSgpIHtcbiAgICAgIHJldHVybiB7IGNvbnRhaW5lcjogdGhpcyB9XG4gICAgfSxcblxuICAgIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICd0cmVlLW9iamVjdCcgPyAnb2JqZWN0JyA6ICdsaXN0J1xuICAgIH0sXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgcGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLnBhdGhgOlxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50Py5wYXRoXG4gICAgICB9LFxuXG4gICAgICBlZGl0UGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLmVkaXRQYXRoYDpcbiAgICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhdGguc2xpY2UodGhpcy5wYXRoPy5sZW5ndGgpXG4gICAgICB9LFxuXG4gICAgICB0cmVlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB7IFt0aGlzLm5hbWVdOiB0aGlzLnZhbHVlIH1cbiAgICAgICAgICA6IHRoaXMudmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVEYXRhUGF0aCgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBuYW1lYCBmcm9tIGBkYXRhUGF0aGAsIGFzIGl0IGlzIGFkZGVkXG4gICAgICAgIC8vIHRvIGB0cmVlRGF0YWAgYW5kIGB0cmVlU2NoZW1hYFxuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHRoaXMuZGF0YVBhdGguc2xpY2UoMCwgdGhpcy5kYXRhUGF0aC5sZW5ndGggLSB0aGlzLm5hbWUubGVuZ3RoKVxuICAgICAgICAgIDogdGhpcy5kYXRhUGF0aFxuICAgICAgfSxcblxuICAgICAgdHJlZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2NoZW1hXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHRoaXMuc2NoZW1hXG4gICAgICB9LFxuXG4gICAgICBoYXNFZGl0YWJsZUZvcm1zKCkge1xuICAgICAgICBjb25zdCBoYXNFZGl0YWJsZUZvcm1zID0gc2NoZW1hID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaGFzRm9ybVNjaGVtYShzY2hlbWEpICYmIChcbiAgICAgICAgICAgICAgdGhpcy5nZXRTY2hlbWFWYWx1ZSgnZWRpdGFibGUnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgICAgc2NoZW1hLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgIGhhc0VkaXRhYmxlRm9ybXMoc2NoZW1hLmNoaWxkcmVuKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzRWRpdGFibGVGb3Jtcyh0aGlzLnNjaGVtYSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIG5hbWUsXG4gICAgICByb3V0ZXMsXG4gICAgICBsZXZlbCxcbiAgICAgIG5lc3RlZCA9IHRydWUsXG4gICAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgICBwcm9jZXNzID0gbnVsbFxuICAgICkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWEucHJvcGVydGllcyksXG4gICAgICAgIFNvdXJjZU1peGluLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgICAgYXBpLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgZmxhdHRlbixcbiAgICAgICAgICAvLyBQYXNzIHByb2Nlc3MoKSB0byBhZGQgbW9yZSByb3V0ZXMgdG8gY2hpbGRSb3V0ZXM6XG4gICAgICAgICAgKGNoaWxkUm91dGVzLCBsZXZlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gc2NoZW1hXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgLy8gQWRkIGB0eXBlYCB0byB0aGUgbmVzdGVkIHRyZWUgbGlzdC5cbiAgICAgICAgICAgICAgY2hpbGRyZW4udHlwZSA9ICd0cmVlLWxpc3QnXG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgYHByb2Nlc3NTY2hlbWEoKWAgZm9yIHRoZSBuZXN0ZWQgdHJlZSBsaXN0OlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2NoZW1hKFxuICAgICAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5uYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkUm91dGVzLFxuICAgICAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBQYXNzIGB0cnVlYCBmb3IgYGZsYXR0ZW5gIGluIHRyZWUgbGlzdHMuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICBdKVxuICAgIH0sXG5cbiAgICBnZXRGb3JtU2NoZW1hc0ZvclByb2Nlc3Npbmcoc2NoZW1hLCBjb250ZXh0KSB7XG4gICAgICAvLyBDb252ZXJ0IG5lc3RlZCBjaGlsZHJlbiBzY2hlbWEgdG8gc3RhbmQtYWxvbmUgc2NoZW1hIGNvbXBvbmVudCxcbiAgICAgIC8vIHByZXNlbnQgaW4gZWFjaCBvZiB0aGUgZm9ybXMsIGFzIHJlcXVpcmVkIGJ5IGBwcm9jZXNzU2NoZW1hRGF0YSgpYFxuICAgICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gc2NoZW1hXG4gICAgICByZXR1cm4gZ2V0Rm9ybVNjaGVtYXMoXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICA/IGZvcm0gPT4gKHtcbiAgICAgICAgICAgICAgLi4uZm9ybSxcbiAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgIC4uLmZvcm0uY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICBbY2hpbGRyZW4ubmFtZV06IGNoaWxkcmVuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsXG4gICAgICApXG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10cmVlLWxpc3Qge1xuICBAZXh0ZW5kICVmaWVsZDtcblxuICAuZGl0by10cmVlLXBhbmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcblxuICAgID4gLmRpdG8tdHJlZS1pdGVtIHtcbiAgICAgIGZsZXg6IDEgMSAyNSU7XG4gICAgfVxuXG4gICAgPiAuZGl0by10cmVlLWZvcm0tY29udGFpbmVyIHtcbiAgICAgIGZsZXg6IDAgMSA3NSU7XG4gICAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgIGJvcmRlci1sZWZ0OiAkYm9yZGVyLXN0eWxlO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzIC0gMTtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtIDE7XG4gICAgICBtYXJnaW46ICgtJGlucHV0LXBhZGRpbmctdmVyKSAoLSRpbnB1dC1wYWRkaW5nLWhvcik7XG4gICAgICBtYXJnaW4tbGVmdDogJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShzaXplKSB7XG4gIHJldHVybiBmaWxlc2l6ZShzaXplLCB7IGJhc2U6IDEwIH0pXG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdXBsb2FkXG4gIHRhYmxlLmRpdG8tdGFibGUuZGl0by10YWJsZS1zZXBhcmF0b3JzLmRpdG8tdGFibGUtYmFja2dyb3VuZFxuICAgIC8vLSBTdHlsaW5nIGNvbWVzIGZyb20gRGl0b1RhYmxlSGVhZFxuICAgIHRoZWFkLmRpdG8tdGFibGUtaGVhZFxuICAgICAgdHJcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIE5hbWVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFNpemVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFN0YXR1c1xuICAgICAgICB0aFxuICAgICAgICAgIHNwYW5cbiAgICBVc2VTb3J0YWJsZShcbiAgICAgIHYtbW9kZWw9XCJmaWxlc1wiXG4gICAgICB0YWc9XCJ0Ym9keVwiXG4gICAgICA6b3B0aW9ucz1cImdldFNvcnRhYmxlT3B0aW9ucyhkcmFnZ2FibGUpXCJcbiAgICApXG4gICAgICB0cihcbiAgICAgICAgdi1mb3I9XCIoZmlsZSwgaW5kZXgpIGluIGZpbGVzXCJcbiAgICAgICAgOmtleT1cImZpbGUua2V5XCJcbiAgICAgIClcbiAgICAgICAgdGQoXG4gICAgICAgICAgdi1odG1sPVwicmVuZGVyRmlsZShmaWxlLCBpbmRleClcIlxuICAgICAgICApXG4gICAgICAgIHRkIHt7IGZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSkgfX1cbiAgICAgICAgdGRcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtaWY9XCJmaWxlLnVwbG9hZFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtaWY9XCJmaWxlLnVwbG9hZC5lcnJvclwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgRXJyb3I6IHt7IGZpbGUudXBsb2FkLmVycm9yIH19XG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZmlsZS51cGxvYWQuYWN0aXZlXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBVcGxvYWRpbmcuLi5cbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJmaWxlLnVwbG9hZC5zdWNjZXNzXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBVcGxvYWRlZFxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgfCBTdG9yZWRcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9uc1xuICAgICAgICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgICAgICAgICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICAgICAgICAgICAgYS5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgdi1pZj1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZHJhZylcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImRlbGV0ZUZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgICAgIClcbiAgICB0Zm9vdFxuICAgICAgdHJcbiAgICAgICAgdGQoOmNvbHNwYW49XCI0XCIpXG4gICAgICAgICAgLmRpdG8tdXBsb2FkLWZvb3RlclxuICAgICAgICAgICAgcHJvZ3Jlc3MuZGl0by1wcm9ncmVzcyhcbiAgICAgICAgICAgICAgdi1pZj1cImlzVXBsb2FkQWN0aXZlXCJcbiAgICAgICAgICAgICAgOnZhbHVlPVwidXBsb2FkUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmRcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJ1cGxvYWQuYWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICApIENhbmNlbCBBbGxcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cImlzVXBsb2FkUmVhZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwidXBsb2FkLmFjdGl2ZSA9IHRydWVcIlxuICAgICAgICAgICAgICApIFVwbG9hZCBBbGxcbiAgICAgICAgICAgICAgVnVlVXBsb2FkLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLWFkZC11cGxvYWQoXG4gICAgICAgICAgICAgICAgcmVmPVwidXBsb2FkXCJcbiAgICAgICAgICAgICAgICB2LW1vZGVsPVwidXBsb2Fkc1wiXG4gICAgICAgICAgICAgICAgOmlucHV0SWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICAgICAgOm5hbWU9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIDpwb3N0QWN0aW9uPVwidXBsb2FkUGF0aFwiXG4gICAgICAgICAgICAgICAgOmV4dGVuc2lvbnM9XCJleHRlbnNpb25zXCJcbiAgICAgICAgICAgICAgICA6YWNjZXB0PVwiYWNjZXB0XCJcbiAgICAgICAgICAgICAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgOnNpemU9XCJtYXhTaXplXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlVwbG9hZCBGaWxlc1wiXG4gICAgICAgICAgICAgICAgQGlucHV0LWZpbHRlcj1cImlucHV0RmlsdGVyXCJcbiAgICAgICAgICAgICAgICBAaW5wdXQtZmlsZT1cImlucHV0RmlsZVwiXG4gICAgICAgICAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCBwYXJzZUZpbGVTaXplIGZyb20gJ2ZpbGVzaXplLXBhcnNlcidcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBmb3JtYXRGaWxlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3VuaXRzLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNBcnJheSwgYXNBcnJheSwgZXNjYXBlSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVnVlVXBsb2FkIGZyb20gJ3Z1ZS11cGxvYWQtY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3VwbG9hZCcsIHtcbiAgbWl4aW5zOiBbU29ydGFibGVNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVnVlVXBsb2FkIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBsb2FkczogW11cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB1cGxvYWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy51cGxvYWRcbiAgICB9LFxuXG4gICAgZmlsZXMoKSB7XG4gICAgICByZXR1cm4gYXNGaWxlcyh0aGlzLnZhbHVlKVxuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgLy8gTm8gY2FsbGJhY2sgYXMgaXQncyB1c2VkIGluIGBwcm9jZXNzVmFsdWUoKWBcbiAgICAgIGNhbGxiYWNrOiBmYWxzZVxuICAgIH0pLFxuXG4gICAgZXh0ZW5zaW9uczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2V4dGVuc2lvbnMnLCB7XG4gICAgICB0eXBlOiBbQXJyYXksIFN0cmluZywgUmVnRXhwXVxuICAgIH0pLFxuXG4gICAgYWNjZXB0OiBnZXRTY2hlbWFBY2Nlc3NvcignYWNjZXB0Jywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBnZXQoYWNjZXB0KSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KGFjY2VwdCkgPyBhY2NlcHQuam9pbignLCcpIDogYWNjZXB0XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBtYXhTaXplOiBnZXRTY2hlbWFBY2Nlc3NvcignbWF4U2l6ZScsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBnZXQobWF4U2l6ZSkge1xuICAgICAgICByZXR1cm4gbWF4U2l6ZSA/IHBhcnNlRmlsZVNpemUobWF4U2l6ZSkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRyYWdnYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RyYWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChkcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuIGRyYWdnYWJsZSAmJiB0aGlzLmZpbGVzLmxlbmd0aCA+IDFcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRlbGV0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlbGV0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgaXNVcGxvYWRSZWFkeSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudXBsb2Fkcy5sZW5ndGggJiZcbiAgICAgICAgISh0aGlzLnVwbG9hZC5hY3RpdmUgfHwgdGhpcy51cGxvYWQudXBsb2FkZWQpXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzVXBsb2FkQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkcy5sZW5ndGggJiYgdGhpcy51cGxvYWQuYWN0aXZlXG4gICAgfSxcblxuICAgIHVwbG9hZFByb2dyZXNzKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy51cGxvYWRzLnJlZHVjZSgodG90YWwsIGZpbGUpID0+IHRvdGFsICsgZmlsZS5wcm9ncmVzcywgMCkgL1xuICAgICAgICB0aGlzLnVwbG9hZHMubGVuZ3RoXG4gICAgICApXG4gICAgfSxcblxuICAgIHVwbG9hZFBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZVVybCh7XG4gICAgICAgIHR5cGU6ICd1cGxvYWQnLFxuICAgICAgICBwYXRoOiB0aGlzLmFwaS5ub3JtYWxpemVQYXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9ybWF0RmlsZVNpemUsXG5cbiAgICByZW5kZXJGaWxlKGZpbGUsIGluZGV4KSB7XG4gICAgICBjb25zdCB7IHJlbmRlciB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICB2YWx1ZTogZmlsZSxcbiAgICAgICAgICAgICAgZGF0YTogdGhpcy5maWxlcyxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIGRhdGFQYXRoOiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGVzY2FwZUh0bWwoZmlsZS5uYW1lKVxuICAgIH0sXG5cbiAgICBkZWxldGVGaWxlKGZpbGUsIGluZGV4KSB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGZpbGVcblxuICAgICAgaWYgKFxuICAgICAgICBmaWxlICYmXG4gICAgICAgIHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgIGBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHt0aGlzLnZlcmJzLnJlbW92ZX0gJHtuYW1lfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGUudXBsb2FkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWQucmVtb3ZlKGZpbGUudXBsb2FkKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIHRpdGxlOiAnU3VjY2Vzc2Z1bGx5IFJlbW92ZWQnLFxuICAgICAgICAgIHRleHQ6IGAke25hbWV9IHdhcyAke3RoaXMudmVyYnMuZGVsZXRlZH0uYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRGaWxlSW5kZXgoZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWx1ZVxuICAgICAgICA/IHRoaXMudmFsdWUuZmluZEluZGV4KGl0ID0+IGl0LmlkID09PSBmaWxlLmlkKVxuICAgICAgICA6IC0xXG4gICAgfSxcblxuICAgIGFkZEZpbGUoZmlsZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goZmlsZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gW2ZpbGVdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmaWxlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlcGxhY2VGaWxlKGZpbGUsIG5ld0ZpbGUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRGaWxlSW5kZXgoZmlsZSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZiAobmV3RmlsZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZVtpbmRleF0gPSBuZXdGaWxlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld0ZpbGVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICB0aGlzLnJlcGxhY2VGaWxlKGZpbGUsIG51bGwpXG4gICAgfSxcblxuICAgIGlucHV0RmlsZShuZXdGaWxlLCBvbGRGaWxlKSB7XG4gICAgICBpZiAobmV3RmlsZSAmJiAhb2xkRmlsZSkge1xuICAgICAgICBjb25zdCB7IGlkLCBuYW1lLCBzaXplIH0gPSBuZXdGaWxlXG4gICAgICAgIHRoaXMuYWRkRmlsZSh7IGlkLCBuYW1lLCBzaXplLCB1cGxvYWQ6IG5ld0ZpbGUgfSlcbiAgICAgIH1cbiAgICAgIGlmIChuZXdGaWxlICYmIG9sZEZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBlcnJvciB9ID0gbmV3RmlsZVxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXdGaWxlLnJlc3BvbnNlWzBdXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGZpbGUudXBsb2FkID0gbmV3RmlsZVxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgdXBsb2FkIGZpbGUgb2JqZWN0IHdpdGggdGhlIGZpbGUgb2JqZWN0IHJlY2VpdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSB1cGxvYWQgcmVzcG9uc2UuXG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VGaWxlKG5ld0ZpbGUsIGZpbGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsZShuZXdGaWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFib3J0OiAnVXBsb2FkIGFib3J0ZWQnLFxuICAgICAgICAgICAgICBkZW5pZWQ6ICdVcGxvYWQgZGVuaWVkJyxcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBgVW5zdXBwb3J0ZWQgZmlsZS10eXBlOiAke25ld0ZpbGUubmFtZX1gLFxuICAgICAgICAgICAgICBuZXR3b3JrOiAnTmV0d29yayBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgdXBsb2FkJyxcbiAgICAgICAgICAgICAgc2VydmVyOiAnU2VydmVyIGVycm9yIG9jY3VycmVkIGR1cmluZyB1cGxvYWQnLFxuICAgICAgICAgICAgICBzaXplOiBgRmlsZSBpcyB0b28gbGFyZ2U6ICR7Zm9ybWF0RmlsZVNpemUobmV3RmlsZS5zaXplKX1gLFxuICAgICAgICAgICAgICB0aW1lb3V0OiAnVGltZW91dCBvY2N1cnJlZCBkdXJpbmcgdXBsb2FkJ1xuICAgICAgICAgICAgfVtlcnJvcl0gfHxcbiAgICAgICAgICAgIGBVbmtub3duIEZpbGUgVXBsb2FkIEVycm9yOiAnJHtlcnJvcn0nYFxuICAgICAgICAgIClcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdGaWxlIFVwbG9hZCBFcnJvcicsXG4gICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUobmV3RmlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBpbnB1dEZpbHRlcihuZXdGaWxlIC8qLCBvbGRGaWxlLCBwcmV2ZW50ICovKSB7XG4gICAgICBjb25zdCB4aHIgPSBuZXdGaWxlPy54aHJcbiAgICAgIGlmICh0aGlzLmFwaS5jb3JzPy5jcmVkZW50aWFscyAmJiB4aHIgJiYgIXhoci53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCBuZXdseSBhZGRlZCBmaWxlcyB0aGF0IHdlcmVuJ3QgYWN0dWFsbHkgdXBsb2FkZWQuXG4gICAgY29uc3QgZmlsZXMgPSBhc0ZpbGVzKHZhbHVlKVxuICAgICAgLm1hcCgoeyB1cGxvYWQsIC4uLmZpbGUgfSkgPT4gKCF1cGxvYWQgfHwgdXBsb2FkLnN1Y2Nlc3MgPyBmaWxlIDogbnVsbCkpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gZmlsZSlcbiAgICByZXR1cm4gc2NoZW1hLm11bHRpcGxlID8gZmlsZXMgOiBmaWxlc1swXSB8fCBudWxsXG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGFzRmlsZXModmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gYXNBcnJheSh2YWx1ZSkgOiBbXVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdXBsb2FkIHtcbiAgLmRpdG8tdGFibGUge1xuICAgIHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYnV0dG9uLWFkZC11cGxvYWQge1xuICAgIHBhZGRpbmc6IDA7XG5cbiAgICA+ICoge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXVwbG9hZC1mb290ZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgLmRpdG8tcHJvZ3Jlc3Mge1xuICAgICAgZmxleDogYXV0bztcbiAgICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJjb25zdCBsb2dnZWREZXByZWNhdGlvbnMgPSBuZXcgU2V0KClcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZShtZXNzYWdlKSB7XG4gIC8vIE9ubHkgbG9nIGRlcHJlY2F0aW9uIG1lc3NhZ2VzIG9uY2UuXG4gIGlmICghbG9nZ2VkRGVwcmVjYXRpb25zLmhhcyhtZXNzYWdlKSkge1xuICAgIGxvZ2dlZERlcHJlY2F0aW9ucy5hZGQobWVzc2FnZSlcbiAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgW1xuICAnY3JlYXRlJywgJ2NyZWF0ZWQnLFxuICAnc2F2ZScsICdzYXZlZCcsXG4gICdzdWJtaXQnLCAnc3VibWl0dGVkJyxcbiAgJ2RlbGV0ZScsICdkZWxldGVkJyxcbiAgJ2VkaXQnLCAnZWRpdGVkJyxcbiAgJ2Nsb3NlJywgJ2Nsb3NlZCcsXG4gICdjYW5jZWwnLCAnY2FuY2VsbGVkJyxcbiAgJ2RyYWcnLCAnZHJhZ2dlZCdcbl0ucmVkdWNlKCh2ZXJicywgdmVyYikgPT4ge1xuICB2ZXJic1t2ZXJiXSA9IHZlcmJcbiAgcmV0dXJuIHZlcmJzXG59LCB7fSlcbiIsImltcG9ydCB7IGNyZWF0ZUFwcCwgaCBhcyBjcmVhdGVFbGVtZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBjcmVhdGVXZWJIaXN0b3J5IH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBWdWVOb3RpZmljYXRpb25zIGZyb20gJ0BreXZnL3Z1ZTMtbm90aWZpY2F0aW9uJ1xuaW1wb3J0IHtcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGFzQXJyYXksXG4gIGlzQWJzb2x1dGVVcmwsXG4gIG1lcmdlLFxuICBoeXBoZW5hdGUsXG4gIGNhbWVsaXplLFxuICBkZWZhdWx0Rm9ybWF0c1xufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICcuL2NvbXBvbmVudHMvaW5kZXguanMnXG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuL3R5cGVzL2luZGV4LmpzJ1xuaW1wb3J0IERpdG9Sb290IGZyb20gJy4vY29tcG9uZW50cy9EaXRvUm9vdC52dWUnXG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldFJlc291cmNlIH0gZnJvbSAnLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGRlcHJlY2F0ZSB9IGZyb20gJy4vdXRpbHMvZGVwcmVjYXRlLmpzJ1xuaW1wb3J0IHZlcmJzIGZyb20gJy4vdmVyYnMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpdG9BZG1pbiB7XG4gIGNvbnN0cnVjdG9yKGVsLCB7XG4gICAgLy8gYGRpdG9gIGNvbnRhaW5zIHRoZSBiYXNlIGFuZCBhcGkgc2V0dGluZ3MgcGFzc2VkIGZyb20gYEFkbWluQ29udHJvbGxlcmBcbiAgICBkaXRvID0ge30sXG4gICAgYXBpLFxuICAgIHZpZXdzID0ge30sXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmVsID0gZWxcbiAgICAvLyBNZXJnZSBpbiBgYXBpYCBzZXR0aW5ncyBhcyBwYXNzZWQgZnJvbSBgY29uZmlnLmFkbWluYCBhbmQgdGhyb3VnaCB0aGVcbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYCB3aXRoIGBhcGlgIHZhbHVlcyBmcm9tIGZyb20gJ2FkbWluL2luZGV4LmpzJ1xuICAgIC8vIE5PVEU6IGBBZG1pbkNvbnRyb2xsZXJgIHByb3ZpZGVzIGBkaXRvLmFwaS5iYXNlYFxuICAgIHRoaXMuYXBpID0gYXBpID0gbWVyZ2UoeyBiYXNlOiAnLycgfSwgZGl0by5hcGksIGFwaSlcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICAvLyBTZXR1cCBkZWZhdWx0IGFwaSBzZXR0aW5nczpcbiAgICBhcGkubG9jYWxlIHx8PSAnZW4tVVMnXG4gICAgYXBpLmZvcm1hdHMgPSBtZXJnZSh7fSwgZGVmYXVsdEZvcm1hdHMsIGFwaS5mb3JtYXRzKVxuICAgIGFwaS5yZXF1ZXN0IHx8PSBvcHRpb25zID0+IHJlcXVlc3QoYXBpLCBvcHRpb25zKVxuICAgIGFwaS5nZXRBcGlVcmwgfHw9IG9wdGlvbnMgPT4gZ2V0QXBpVXJsKGFwaSwgb3B0aW9ucylcbiAgICBhcGkuaXNBcGlVcmwgfHw9IHVybCA9PiBpc0FwaVVybChhcGksIHVybClcbiAgICAvLyBTZXR0aW5nIGBhcGkubm9ybWFsaXplUGF0aHMgPSB0cnVlIChwbHVyYWwpIHNldHMgYm90aDpcbiAgICAvLyBgYXBpLm5vcm1hbGl6ZVBhdGggPSBoeXBoZW5hdGVgIGFuZCBgYXBpLmRlbm9ybWFsaXplUGF0aCA9IGNhbWVsaXplYFxuICAgIGFwaS5ub3JtYWxpemVQYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aHMgPyBoeXBoZW5hdGUgOiB2YWwgPT4gdmFsXG4gICAgYXBpLmRlbm9ybWFsaXplUGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGhzID8gY2FtZWxpemUgOiB2YWwgPT4gdmFsXG5cbiAgICAvLyBBbGxvdyBkZWZpbml0aW9uIG9mIGRlZmF1bHRzIGZvciBhZG1pbiBjb21wb25lbnQgdHlwZXMsIG5lc3RlZCBwZXIgdHlwZTpcbiAgICAvLyBhcGkuZGVmYXVsdHMgPSB7XG4gICAgLy8gICAnbXVsdGlzZWxlY3QnOiB7XG4gICAgLy8gICAgIHNlbGVjdGFibGU6IHRydWVcbiAgICAvLyAgIH0sXG4gICAgLy8gICAnZmFrZS10eXBlJzogc2NoZW1hID0+IHtcbiAgICAvLyAgICAgLy8gUmV0dXJuIGRlZmF1bHRzLCBvciBkaXJlY3RseSBtb2RpZnkgdGhlIHNjaGVtYTpcbiAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHtcbiAgICAvLyAgICAgICB0eXBlOiAncmVhbC10eXBlJyxcbiAgICAvLyAgICAgICBmb3JtYXQ6ICh7IHZhbHVlIH0pID0+IGBGb3JtYXR0ZWQgJHt2YWx1ZX1gLFxuICAgIC8vICAgICAgIHByb2Nlc3M6ICh7IHZhbHVlIH0pID0+IGBQcm9jZXNzZWQgJHt2YWx1ZX1gXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgYXBpLmRlZmF1bHRzIHx8PSB7fVxuXG4gICAgLy8gQWxsb3cgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGF1dGggcmVzb3VyY2VzLCBsaWtlIHNvOlxuICAgIC8vIGFwaS51c2VycyA9IHtcbiAgICAvLyAgIHBhdGg6ICcvYWRtaW5zJyxcbiAgICAvLyAgIC8vIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHM6XG4gICAgLy8gICBsb2dpbjoge1xuICAgIC8vICAgICBwYXRoOiAnbG9naW4nLFxuICAgIC8vICAgICBtZXRob2Q6ICdwb3N0J1xuICAgIC8vICAgfSxcbiAgICAvLyAgIGxvZ291dDoge1xuICAgIC8vICAgICBwYXRoOiAnbG9nb3V0JyxcbiAgICAvLyAgICAgbWV0aG9kOiAncG9zdCdcbiAgICAvLyAgIH0sXG4gICAgLy8gICBzZXNzaW9uOiB7XG4gICAgLy8gICAgIHBhdGg6ICdzZXNzaW9uJyxcbiAgICAvLyAgICAgbWV0aG9kOiAnZ2V0J1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBjb25zdCB1c2VycyA9IGdldFJlc291cmNlKGFwaS51c2Vycywge1xuICAgICAgdHlwZTogJ2NvbGxlY3Rpb24nXG4gICAgfSkgfHwge31cbiAgICB1c2Vycy5sb2dpbiA9IGdldFJlc291cmNlKHVzZXJzLmxvZ2luIHx8ICdsb2dpbicsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgdXNlcnMubG9nb3V0ID0gZ2V0UmVzb3VyY2UodXNlcnMubG9nb3V0IHx8ICdsb2dvdXQnLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIHVzZXJzLnNlc3Npb24gPSBnZXRSZXNvdXJjZSh1c2Vycy5zZXNzaW9uIHx8ICdzZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIGFwaS51c2VycyA9IHVzZXJzXG5cbiAgICAvLyBBbGxvdyBvdmVycmlkaW5nIG9mIHJlc291cmNlIHBhdGggaGFuZGxlcnM6XG4gICAgLy8gYXBpLnJlc291cmNlcyA9IHtcbiAgICAvLyAgIGNvbGxlY3Rpb24ocmVzb3VyY2UpIHtcbiAgICAvLyAgICAgcmV0dXJuIHJlc291cmNlLnBhcmVudFxuICAgIC8vICAgICAgID8gYCR7cmVzb3VyY2UucGF0aH0/JHtyZXNvdXJjZS5wYXJlbnQucGF0aH1faWQ9JHtcbiAgICAvLyAgICAgICAgICByZXNvdXJjZS5wYXJlbnQuaWR9YFxuICAgIC8vICAgICAgIDogcmVzb3VyY2UucGF0aFxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGFwaS5yZXNvdXJjZXMgPSB7XG4gICAgICBhbnkocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbcmVzb3VyY2U/LnR5cGVdIHx8IHRoaXMuZGVmYXVsdFxuICAgICAgICByZXR1cm4gcmVzb3VyY2UgJiYgaGFuZGxlci5jYWxsKHRoaXMsIHJlc291cmNlKVxuICAgICAgfSxcblxuICAgICAgZGVmYXVsdChyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGhpcy5hbnkocmVzb3VyY2UucGFyZW50KVxuICAgICAgICByZXR1cm4gcGFyZW50UGF0aFxuICAgICAgICAgID8gYCR7cGFyZW50UGF0aH0vJHtyZXNvdXJjZS5wYXRofWBcbiAgICAgICAgICA6IHJlc291cmNlLnBhdGhcbiAgICAgIH0sXG5cbiAgICAgIGNvbGxlY3Rpb24ocmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdChyZXNvdXJjZSlcbiAgICAgIH0sXG5cbiAgICAgIG1lbWJlcihyZXNvdXJjZSkge1xuICAgICAgICAvLyBOT1RFOiBXZSBhc3N1bWUgdGhhdCBhbGwgbWVtYmVycyBoYXZlIHJvb3QtbGV2ZWwgY29sbGVjdGlvbiByb3V0ZXMsXG4gICAgICAgIC8vIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBuZXN0aW5nIG9mIChzdWItKWNvbGxlY3Rpb24gcm91dGVzLlxuICAgICAgICByZXR1cm4gYCR7cmVzb3VyY2UucGF0aH0vJHtyZXNvdXJjZS5pZH1gXG4gICAgICB9LFxuXG4gICAgICB1cGxvYWQocmVzb3VyY2UpIHtcbiAgICAgICAgLy8gRGl0byBTZXJ2ZXIgaGFuZGxlcyB1cGxvYWQgcm91dGVzIG9uIHRoZSBjb2xsZWN0aW9uIHJlc291cmNlOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb2xsZWN0aW9uKHJlc291cmNlLnBhcmVudCl9L3VwbG9hZC8ke3Jlc291cmNlLnBhdGh9YFxuICAgICAgfSxcblxuICAgICAgLi4uYXBpLnJlc291cmNlc1xuICAgIH1cblxuICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgLyBleHRlbmRpbmcgb2YgaGVhZGVyczpcbiAgICAvLyBhcGkuaGVhZGVycyA9IHtcbiAgICAvLyAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAvLyB9XG4gICAgYXBpLmhlYWRlcnMgPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4uYXBpLmhlYWRlcnNcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoZWwpKSB7XG4gICAgICBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpXG4gICAgfVxuXG4gICAgY29uc3QgYXBwID0gKHRoaXMuYXBwID0gY3JlYXRlQXBwKHtcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgRGl0b1Jvb3QsXG4gICAgICAgIFZ1ZU5vdGlmaWNhdGlvbnMsXG4gICAgICAgIC8vIFRoaXMgbWF5IG9ubHkgYmUgbmVlZGVkIHRvIGF2b2lkIHRyZWUtc2hhY2tpbmcgb2YgdGhlc2UgY29tcG9uZW50cyxcbiAgICAgICAgLy8gc2luY2UgdGhleSBhY3R1YWxseSBoYW5kbGUgcmVnaXN0cnkgaW50ZXJuYWxseSBhbHJlYWR5LlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24uXG4gICAgICAgIC4uLmNvbXBvbmVudHMsXG4gICAgICAgIC4uLnR5cGVzXG4gICAgICB9LFxuXG4gICAgICAvLyBNb3N0IGluamVjdHMgYXJlIGRlZmluZWQgYXMgZnVuY3Rpb25zLCB0byBwcmVzZXJ2ZSByZWFjdGl2ZW5lc3MgYWNyb3NzXG4gICAgICAvLyBwcm92aWRlL2luamVjdCwgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNzAxNyNpc3N1ZWNvbW1lbnQtNDgwOTA2NjkxXG4gICAgICBwcm92aWRlOiB7XG4gICAgICAgIGFwaSxcbiAgICAgICAgLy8gQSBkZWZhdWx0IGxpc3Qgb2YgdmVyYnMgYXJlIHByb3ZpZGVkIGJ5ICR2ZXJicygpIGFuZCBjYW4gYmVcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBhdCBhbnkgcG9pbnQgaW4gdGhlIGNvbXBvbmVudCBoaWVyYXJjaHkuXG4gICAgICAgICR2ZXJiczogKCkgPT4gdmVyYnMsXG4gICAgICAgIC8vIFByb3ZpZGUgZGVmYXVsdHMgc28gRGl0b01peGluIGNhbiBpbmplY3QgdGhlbSBmb3IgYWxsIGNvbXBvbmVudHM6XG4gICAgICAgIC8vICAgaW5qZWN0OiBbICAnJGlzUG9wdWxhdGVkJywgJyRzY2hlbWFDb21wb25lbnQnLCAnJHJvdXRlQ29tcG9uZW50JyBdXG4gICAgICAgICR2aWV3czogKCkgPT4ge30sXG4gICAgICAgICRpc1BvcHVsYXRlZDogKCkgPT4gdHJ1ZSxcbiAgICAgICAgJHBhcmVudENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNjaGVtYUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkZGF0YUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNvdXJjZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkZGlhbG9nQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcGFuZWxDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHJlbmRlcjogKCkgPT5cbiAgICAgICAgY3JlYXRlRWxlbWVudChEaXRvUm9vdCwge1xuICAgICAgICAgIHJlZjogJ3Jvb3QnLFxuICAgICAgICAgIGNsYXNzOiBkaXRvLnNldHRpbmdzLnJvb3RDbGFzcyxcbiAgICAgICAgICB1bnJlc29sdmVkVmlld3M6IHZpZXdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSlcbiAgICB9KSlcblxuICAgIGFwcC51c2UoVnVlTm90aWZpY2F0aW9ucywge1xuICAgICAgbmFtZTogJ25vdGlmeScsXG4gICAgICBjb21wb25lbnROYW1lOiAnVnVlTm90aWZpY2F0aW9ucydcbiAgICB9KVxuXG4gICAgLy8gcm9vdC5jb21wb25lbnQoJ3Z1ZS1tb2RhbCcsIFZ1ZU1vZGFsKVxuXG4gICAgYXBwLnVzZShcbiAgICAgIGNyZWF0ZVJvdXRlcih7XG4gICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjYXRjaC1hbGwgcm91dGUsIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgcm91dGVzXG4gICAgICAgIC8vIG9uY2UgdGhlIHNjaGVtYXMgYXJlIGxvYWRlZCwgdG8gcHJldmVudCB2dWUtcm91dGVyIGZyb20gY29tcGxhaW5pbmcsXG4gICAgICAgIC8vIHNlZTogYHJlc29sdmVWaWV3cygpYCBpbiBgRGl0b1Jvb3RgIGZvciB0aGUgYWN0dWFsIHJvdXRlIHNldHVwLlxuICAgICAgICByb3V0ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnY2F0Y2gtYWxsJyxcbiAgICAgICAgICAgIHBhdGg6ICcvOl8oLiopJyxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHt9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBoaXN0b3J5OiBjcmVhdGVXZWJIaXN0b3J5KGRpdG8uYmFzZSksXG4gICAgICAgIGxpbmtBY3RpdmVDbGFzczogJycsXG4gICAgICAgIGxpbmtFeGFjdEFjdGl2ZUNsYXNzOiAnJ1xuICAgICAgfSlcbiAgICApXG5cbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdkaXRvLWFwcCcpXG4gICAgYXBwLm1vdW50KGVsKVxuICB9XG5cbiAgcmVnaXN0ZXIodHlwZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcih0eXBlLCBvcHRpb25zKVxuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICBzdXBlcihcbiAgICAgIGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c30gKCR7XG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICAgIH0pYFxuICAgIClcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0KGFwaSwge1xuICB1cmwsXG4gIG1ldGhvZCA9ICdnZXQnLFxuICAvLyBUT0RPOiBgcmVxdWVzdC5wYXJhbXNgIHdhcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgcXVlcnlgIG9uIDIwMjItMTEtMDEsXG4gIC8vIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gIHBhcmFtcyA9IG51bGwsXG4gIHF1ZXJ5ID0gcGFyYW1zIHx8IG51bGwsXG4gIGhlYWRlcnMgPSBudWxsLFxuICBkYXRhID0gbnVsbFxufSkge1xuICBpZiAocGFyYW1zKSB7XG4gICAgZGVwcmVjYXRlKFxuICAgICAgYHJlcXVlc3QucGFyYW1zIGlzIGRlcHJlY2F0ZWQuIFVzZSBhY3Rpb24ubWV0aG9kIGFuZCBhY3Rpb24ucGF0aCBpbnN0ZWFkLmBcbiAgICApXG4gIH1cblxuICBjb25zdCBpc0FwaVVybCA9IGFwaS5pc0FwaVVybCh1cmwpXG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeSB9KSwge1xuICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgLi4uKGRhdGEgJiYgeyBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4oaXNBcGlVcmwgJiYgYXBpLmhlYWRlcnMpLFxuICAgICAgLi4uaGVhZGVyc1xuICAgIH0sXG4gICAgY3JlZGVudGlhbHM6XG4gICAgICBpc0FwaVVybCAmJiBhcGkuY29ycz8uY3JlZGVudGlhbHNcbiAgICAgICAgPyAnaW5jbHVkZSdcbiAgICAgICAgOiAnc2FtZS1vcmlnaW4nXG4gIH0pXG5cbiAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJlc3BvbnNlLmRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKHJlc3BvbnNlKVxuICB9XG4gIHJldHVybiByZXNwb25zZVxufVxuXG5mdW5jdGlvbiBpc0FwaVVybChhcGksIHVybCkge1xuICByZXR1cm4gIWlzQWJzb2x1dGVVcmwodXJsKSB8fCB1cmwuc3RhcnRzV2l0aChhcGkudXJsKVxufVxuXG5mdW5jdGlvbiBnZXRBcGlVcmwoYXBpLCB7IHVybCwgcXVlcnkgfSkge1xuICBpZiAoIWlzQWJzb2x1dGVVcmwodXJsKSkge1xuICAgIHVybCA9IGNvbWJpbmVVcmxzKGFwaS51cmwsIHVybClcbiAgfVxuICAvLyBTdXBwb3J0IG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMsIHRvIGJlIGFyZSBhZGRlZCB0byB0aGUgVVJMLlxuICBjb25zdCBzZWFyY2ggPSBmb3JtYXRRdWVyeShxdWVyeSlcbiAgcmV0dXJuIHNlYXJjaCA/IGAke3VybH0/JHtzZWFyY2h9YCA6IHVybFxufVxuXG5mdW5jdGlvbiBjb21iaW5lVXJscyhiYXNlVXJsLCByZWxhdGl2ZVVybCkge1xuICAvLyBVc2Ugc2FtZSBhcHByb2FjaCBhcyBheGlvcyBgY29tYmluZVVSTHMoKWAgdG8gam9pbiBiYXNlVXJsICYgcmVsYXRpdmVVcmw6XG4gIHJldHVybiBgJHtiYXNlVXJsLnJlcGxhY2UoL1xcLyskLywgJycpfS8ke3JlbGF0aXZlVXJsLnJlcGxhY2UoL15cXC8rLywgJycpfWBcbn1cblxuZnVuY3Rpb24gZm9ybWF0UXVlcnkocXVlcnkpIHtcbiAgY29uc3QgZW50cmllcyA9IHF1ZXJ5XG4gICAgPyBpc0FycmF5KHF1ZXJ5KVxuICAgICAgPyBxdWVyeVxuICAgICAgOiBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICA6IFtdXG4gIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKFxuICAgIC8vIEV4cGFuZCBhcnJheSB2YWx1ZXMgaW50byBtdWx0aXBsZSBlbnRyaWVzIHVuZGVyIHRoZSBzYW1lIGtleSwgc29cbiAgICAvLyBgZm9ybWF0UXVlcnkoeyBmb286IFsxLCAyXSwgYmFyOiAzIH0pYCA9PiAnZm9vPTEmZm9vPTImYmFyPTMnLlxuICAgIGVudHJpZXMucmVkdWNlKFxuICAgICAgKGVudHJpZXMsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiBhc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWxdKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICB9LFxuICAgICAgW11cbiAgICApXG4gICkudG9TdHJpbmcoKVxufVxuIl0sIm5hbWVzIjpbImFwcFN0YXRlIiwicmVhY3RpdmUiLCJhcHBlbmREYXRhUGF0aCIsImRhdGFQYXRoIiwidG9rZW4iLCJwYXJzZVBhcmVudERhdGFQYXRoIiwicGF0aCIsInBhcnNlRGF0YVBhdGgiLCJwYXJzZUl0ZW1EYXRhUGF0aCIsIm5lc3RlZCIsImdldEl0ZW1EYXRhUGF0aCIsIm5vcm1hbGl6ZURhdGFQYXRoIiwicGFyc2VQYXJlbnRJdGVtRGF0YVBhdGgiLCJpc0ludGVnZXIiLCJnZXRQYXJlbnRJdGVtRGF0YVBhdGgiLCJnZXRJdGVtIiwicm9vdEl0ZW0iLCJnZXRWYWx1ZUF0RGF0YVBhdGgiLCJnZXRQYXJlbnRJdGVtIiwiZ2V0TGFzdERhdGFQYXRoVG9rZW4iLCJnZXRMYXN0RGF0YVBhdGhOYW1lIiwiZ2V0TGFzdERhdGFQYXRoSW5kZXgiLCJpbmRleCIsInRlbXBvcmFyeUlkIiwic2V0VGVtcG9yYXJ5SWQiLCJkYXRhIiwiaWRLZXkiLCJpc1RlbXBvcmFyeUlkIiwiaWQiLCJpc1JlZmVyZW5jZSIsImhhc093blByb3BlcnR5IiwiY29udGV4dHMiLCJnZXQiLCJjb250ZXh0Iiwia2V5IiwiZGVmYXVsdFZhbHVlIiwib2JqZWN0IiwidG9SYXciLCJ2YWx1ZSIsImlzRnVuY3Rpb24iLCJzZXQiLCJEaXRvQ29udGV4dCIsImNvbXBvbmVudCIsInBhcmVudEl0ZW0iLCJvcHRpb25zIiwibG9jYXRpb24iLCJyZXNvdXJjZSIsIkVtaXR0ZXJNaXhpbiIsImV2ZW50IiwiY2FsbGJhY2siLCJpc0FycmF5IiwiZXYiLCJpc1BsYWluT2JqZWN0IiwibGlzdGVuZXJzIiwiY2FsbGJhY2tzIiwib24iLCJhcmdzIiwiZW50cnkiLCJfYSIsImNiIiwicXVldWUiLCJyZXNvbHZlIiwibmV4dCIsInJlc3VsdCIsInJlcyIsImVycm9yIiwidGFyZ2V0IiwidHlwZUNoZWNrZXJzIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsImlzRGF0ZSIsImlzT2JqZWN0IiwiaXNSZWdFeHAiLCJ0eXBlQ29udmVydGVycyIsImFzQXJyYXkiLCJpc01hdGNoaW5nVHlwZSIsInR5cGVzIiwidHlwZSIsImNvbnZlcnRUeXBlIiwiY29udmVydGVyIiwiaGFzUmVzb3VyY2UiLCJzY2hlbWEiLCJnZXRSZXNvdXJjZSIsImRlZmF1bHRzIiwicGFyZW50IiwiZGVmcyIsImdldE1lbWJlclJlc291cmNlIiwicGlja0J5IiwiRGl0b01peGluIiwidWlkIiwibmV4dFVpZCIsImtleU9yRGF0YVBhdGgiLCJkZWYiLCJjb252ZXJ0ZWQiLCJuYW1lIiwibGFiZWxpemUiLCJidXR0b24iLCJ2ZXJiIiwicXVlcnkiLCJ1cmwiLCJtZXRob2QiLCJpbnRlcm5hbCIsImNoZWNrVXNlciIsInJlc3BvbnNlIiwiZXF1YWxzIiwiY29tcG9uZW50cyIsImJ1dHRvbnMiLCJzZXR0aW5ncyIsImNhY2hlIiwiY2FjaGVQYXJlbnQiLCJsb2FkQ2FjaGUiLCJjYWNoZUtleSIsImxvY2FsZSIsImZvcm1hdCIsImEiLCJib2R5IiwiYWNjZXNzb3IiLCJ3YXRjaCIsImV2ZW50cyIsImhhbmRsZXJzIiwiZXhwciIsImFkZEV2ZW50IiwiaHlwaGVuYXRlIiwiaGFzTGlzdGVuZXJzIiwicGFyZW50SGFzTGlzdGVuZXJzIiwiZ2V0Q29udGV4dCIsInBhcmFtcyIsImlzQ3JlZGl0Q2FyZCIsImRlY2ltYWxzIiwibWF0Y2giLCJpc0RvbWFpbiIsImlzRW1haWwiLCJpc0hvc3RuYW1lIiwibWF4IiwibWluIiwicGFzc3dvcmQiLCJpc1VybCIsIlZhbGlkYXRpb25NaXhpbiIsIm5vdGlmeSIsImlzVmFsaWQiLCJydWxlIiwic2V0dGluZyIsInZhbGlkYXRvciIsInZhbGlkYXRpb25zIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiYWRkTGFiZWwiLCJlcnJvcnMiLCJmb2N1cyIsImdldFNjaGVtYUFjY2Vzc29yIiwiZ2V0U3RvcmVBY2Nlc3NvciIsIlR5cGVNaXhpbiIsImNvbXB1dGVWYWx1ZSIsInBhcnNlIiwic2NoZW1hQ29tcG9uZW50IiwibGFiZWwiLCJvbkZvY3VzIiwib25CbHVyIiwib25JbnB1dCIsIm9uQ2hhbmdlIiwibmF0aXZlRmllbGQiLCJ0ZXh0RmllbGQiLCJhdHRyaWJ1dGVzIiwiYWRkIiwiZWxlbWVudCIsIl9iIiwidWlkTWFwIiwiZ2V0VWlkIiwiaXRlbUlkIiwiU2NoZW1hR3JhcGgiLCJfX3B1YmxpY0ZpZWxkIiwic3ViR3JhcGgiLCJwYXJ0IiwicmVsYXRlZERhdGFQYXRoIiwibmFub2lkIiwiZmxhdHRlbiIsImdyYXBoIiwiZW50cmllcyIsIiRzZXR0aW5ncyIsInN1YktleSIsInNvdXJjZVNjaGVtYSIsImNsaXBib2FyZCIsInJlbGF0ZWQiLCJyZWZlcmVuY2UiLCJzb3VyY2UiLCJyZWxhdGlvbiIsInZhbHVlcyIsInJlbW92ZUlkIiwicmVmZXJlbmNlSWQiLCJyZWZLZXkiLCJyZXZWYWx1ZSIsInR5cGVDb21wb25lbnRzIiwidW5rbm93blR5cGVSZXBvcnRlZCIsInJlZ2lzdGVyVHlwZUNvbXBvbmVudCIsImdldFR5cGVDb21wb25lbnQiLCJhbGxvd051bGwiLCJpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyIsInNjaGVtYXMiLCJpc1NpbmdsZUNvbXBvbmVudFZpZXciLCJpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyIsImdldEFsbFRhYlNjaGVtYXMiLCJmaW5kU2NoZW1hQ29tcG9uZW50Iiwic29tZVNjaGVtYUNvbXBvbmVudCIsImlzU2NoZW1hIiwiaXNGb3JtIiwiaXNWaWV3IiwiaXNUYWIiLCJpc1BhbmVsIiwiZ2V0U2NoZW1hSWRlbnRpZmllciIsInJlc29sdmVTY2hlbWEiLCJ1bndyYXBNb2R1bGUiLCJpc1Byb21pc2UiLCJpc01vZHVsZSIsImtleXMiLCJyZXNvbHZlU2NoZW1hcyIsInVucmVzb2x2ZWRTY2hlbWFzIiwicmVzb2x2ZUl0ZW0iLCJtYXBDb25jdXJyZW50bHkiLCJpdGVtIiwicmVzb2x2ZVNjaGVtYUNvbXBvbmVudCIsIm1hcmtSYXciLCJyZXNvbHZlU2NoZW1hQ29tcG9uZW50cyIsInByb2Nlc3NTY2hlbWFDb21wb25lbnRzIiwiYXBpIiwicm91dGVzIiwibGV2ZWwiLCJwcm9taXNlcyIsInByb2Nlc3MiLCJyZWxhdGl2ZUxldmVsIiwicHJvY2Vzc1NjaGVtYUNvbXBvbmVudCIsImdldEFsbFBhbmVsU2NoZW1hcyIsInByb2Nlc3NEZWZhdWx0cyIsInBhbmVsIiwiZ2V0VHlwZU9wdGlvbnMiLCJwcm9jZXNzVmlldyIsInByb2Nlc3NSb3V0ZVNjaGVtYSIsInJlc29sdmVOZXN0ZWRTY2hlbWFzIiwiY2hpbGRyZW4iLCJtZXJnZSIsInByb2Nlc3NGb3JtcyIsImZvcm0iLCJmb3JtcyIsInByb2Nlc3NGb3JtIiwicHJvY2Vzc1RhYiIsInByb2Nlc3NQYW5lbCIsInRhYnMiLCJwYW5lbHMiLCJ0YWIiLCJoYXNGb3JtU2NoZW1hIiwiaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyIsImdldFZpZXdGb3JtU2NoZW1hIiwidmlldyIsInZpZXdTY2hlbWEiLCJnZXRWaWV3U2NoZW1hIiwiZ2V0Vmlld0VkaXRQYXRoIiwiZ2V0Rm9ybVNjaGVtYXMiLCJtb2RpZnlGb3JtIiwiY29tcGFjdCIsImdldEl0ZW1Gb3JtU2NoZW1hRnJvbUZvcm1zIiwiZ2V0SXRlbUZvcm1TY2hlbWEiLCJoYXNMYWJlbCIsImlzQ29tcGFjdCIsImlzSW5saW5lZCIsImlzTmVzdGVkIiwic2hvdWxkT21pdFBhZGRpbmciLCJnZXREZWZhdWx0VmFsdWUiLCJjbG9uZSIsImlnbm9yZU1pc3NpbmdWYWx1ZSIsInR5cGVPcHRpb25zIiwiaGFzTGFiZWxzIiwiY2hlY2tDb21wb25lbnRzIiwic2V0RGVmYXVsdFZhbHVlcyIsInByb2Nlc3NTY2hlbWFEYXRhIiwicm9vdERhdGEiLCJjb21wdXRlIiwiY2xvbmVJdGVtIiwiY29weSIsIm9yZGVyS2V5IiwicHJvY2Vzc0RhdGEiLCJzY2hlbWFPbmx5IiwicHJvY2Vzc2VkRGF0YSIsIndyYXBQcmltaXRpdmVzIiwiYiIsImlkMSIsImlkMiIsImV4Y2x1ZGUiLCJwcm9jZXNzVmFsdWUiLCJwcm9jZXNzQmVmb3JlIiwicHJvY2Vzc0FmdGVyIiwicHJvY2Vzc0NvbXBvbmVudHMiLCJnZXREYXRhUGF0aCIsImNvbXBvbmVudFNjaGVtYSIsImNvbXBvbmVudERhdGFQYXRoIiwicHJvY2Vzc0l0ZW0iLCJwcm9jZXNzZWRJdGVtIiwiZ2V0TmFtZWRTY2hlbWFzIiwidG9PYmplY3QiLCJhcnJheSIsInRvU2NoZW1hIiwiY2FtZWxpemUiLCJnZXRCdXR0b25TY2hlbWFzIiwiZ2V0VHlwZSIsInNjaGVtYU9yVHlwZSIsImdldFNvdXJjZVR5cGUiLCJnZXRQYW5lbEVudHJ5IiwidGFiQ29tcG9uZW50IiwiZ2V0UGFuZWxFbnRyaWVzIiwicGFuZWxTY2hlbWFzIiwicGFuZWxFbnRyaWVzIiwiZ2V0QWxsUGFuZWxFbnRyaWVzIiwicGFuZWxTY2hlbWEiLCJpc09iamVjdFNvdXJjZSIsImlzTGlzdFNvdXJjZSIsImdldEl0ZW1JZCIsImdldEl0ZW1VaWQiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsIm1peGlucyIsIm1lcmdlT3B0aW9ucyIsInRvIiwiZnJvbSIsIm1peGluIiwiZGl0b09wdGlvbktleXMiLCJEaXRvQ29tcG9uZW50IiwiZGVmaW5pdGlvbiIsIkRpdG9Vc2VyIiwicm9sZXMiLCJyb2xlIiwiU2NoZW1hUGFyZW50TWl4aW4iLCJzY2hlbWFDb21wb25lbnRzIiwiVmFsaWRhdG9yTWl4aW4iLCJpdCIsIlJvdXRlTWl4aW4iLCJyb3V0ZUNvbXBvbmVudCIsIm1hdGNoZWQiLCJpIiwicmVjb3JkIiwiYnJlYWRjcnVtYiIsInJvdXRlQ29tcG9uZW50cyIsIm9rIiwidGVtcGxhdGVQYXRoIiwicm9vdFBhdGgiLCJnZXRDb21tb25QcmVmaXgiLCJpc0xvYWRpbmciLCJjb3B5RGF0ZSIsImRhdGUiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJfc2ZjX21haW4iLCJ3ZWVrZGF5TmFtZXMiLCJtb250aE5hbWVzIiwiZ2V0TG9jYWxlTmFtZXMiLCJtb2RlIiwib3ZlcnJpZGVzIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsInN0YXRlIiwiaG9yIiwidmVyIiwiZW50ZXIiLCJjdXJyZW50TW9kZSIsInN0YXJ0WWVhciIsImZpcnN0RGF5V2VlayIsIm51bURheXMiLCJwcmV2TW9udGgiLCJwcmV2TW9udGhOdW1EYXlzIiwidG9kYXkiLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImNsYXNzZXMiLCJzaG93IiwidHJpZ2dlciIsInBvcHVwIiwiZWwiLCJib3VuZHMiLCJ0cmlnZ2VyTGVmdCIsInRyaWdnZXJUb3AiLCJ0cmlnZ2VyV2lkdGgiLCJ0cmlnZ2VySGVpZ2h0IiwicG9wdXBXaWR0aCIsInBvcHVwSGVpZ2h0IiwicGFydDEiLCJwYXJ0MiIsIndpbldpZHRoIiwid2luSGVpZ2h0IiwibGVmdCIsInRvcCIsInRyaWdnZXJCb3VuZHMiLCJzaXplIiwiZ2V0TGVuZ3RoIiwiVHJpZ2dlciIsIkNhbGVuZGFyIiwiSW5wdXRGaWVsZCIsImRlZmF1bHRGb3JtYXRzIiwic2Nyb2xsVG8iLCJkdXJhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInBlclRpY2siLCJzZXRTZWxlY3Rpb24iLCJmaWVsZCIsInN0YXJ0IiwiZW5kIiwicmFuZ2UiLCJmb3JjZSIsInNjcm9sbCIsInJlZiIsImxpbmVIZWlnaHQiLCJzZWxlY3RlZCIsImxlbmd0aCIsIkRhdGVQaWNrZXIiLCJUaW1lUGlja2VyIiwicGFnZSIsInBhZ2VTaXplIiwiY3VycmVudFBhZ2VTaXplIiwic2hvd1ByZXYiLCJzaG93TmV4dCIsInRvdGFsIiwiY3VycmVudFBhZ2UiLCJzaG93TGVuZ3RoIiwibnVtUGFnZXMiLCJwYWdlUmFuZ2UiLCJjaGVja2VkIiwiZGlzYWJsZWQiLCJ1bmNoZWNrZWQiLCJtb2RlbFZhbHVlIiwiVHJhbnNpdGlvbkhlaWdodCIsImVuYWJsZWQiLCJzbG90cyIsImNyZWF0ZUVsZW1lbnQiLCJUcmFuc2l0aW9uIiwicHJvcHMiLCJzZXRTdHlsZSIsInN0eWxlIiwiZm9yY2VSZXBhaW50Iiwid2lkdGgiLCJoZWlnaHQiLCJVc2VGb2N1c1RyYXAiLCJkZWZpbmVDb21wb25lbnQiLCJ0cmFwIiwiYWN0aXZhdGUiLCJkZWFjdGl2YXRlIiwidW5yZWZFbGVtZW50IiwiY3JlYXRlRm9jdXNUcmFwIiwib25TY29wZURpc3Bvc2UiLCJoIiwiZGlhbG9nRGF0YSIsIkRvbU1peGluIiwicmVtb3ZlIiwiaGFuZGxlciIsIkRpdG9EaWFsb2ciLCJlcnIiLCJ0aXRsZSIsInRleHQiLCJsb2ciLCJzdHJpcFRhZ3MiLCJub3RpZmljYXRpb25zIiwiZHVyYXRpb25GYWN0b3IiLCJyZWplY3QiLCJkaWFsb2dJZCIsImFkZGl0aW9uYWxDb21wb25lbnRzIiwicmVkaXJlY3RBZnRlckxvZ2luIiwibG9naW5EYXRhIiwidXNlciIsIkRpdG9WaWV3IiwiZnVsbFBhdGgiLCJhZGRSb3V0ZXMiLCJyb3V0ZXIiLCJyZW1vdmVycyIsInJvdXRlIiwicmVtb3ZlUm91dGUiLCJEaXRvU3Bpbm5lciIsImNvbG9yIiwiUHVsbGRvd25NaXhpbiIsInN0YXJ0VGltZSIsIm9wZW4iLCJjb250ZW50IiwiYXNPYmplY3QiLCJJdGVtTWl4aW4iLCJleHRlbmRlZCIsIml0ZW1MYWJlbCIsImZvcm1MYWJlbCIsImdldEZvcm1MYWJlbCIsInByZWZpeCIsInN1ZmZpeCIsImNvbHVtbnMiLCJoYWRMYWJlbCIsInBhbmUiLCJjdXJyZW50VGFiIiwiZmlyc3QiLCJkZWZhdWx0VGFiIiwiZGF0YVBhdGhPck5hbWUiLCJleHBhbmQiLCJjb21wb25lbnRzQnlEYXRhUGF0aCIsImRhdGFQYXRocyIsImNoZWNrIiwidW5tYXRjaGVkIiwiZXJycyIsImZ1bGxEYXRhUGF0aCIsImRhdGFQYXRoUGFydHMiLCJmb3VuZCIsInByb3BlcnR5Iiwic3ViQ29tcG9uZW50cyIsInJlZ2lzdHJ5IiwiZW50cmllc0J5RGF0YVBhdGgiLCJfaG9pc3RlZF8xIiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfRnJhZ21lbnQiLCJfcmVuZGVyTGlzdCIsIl9jdHgiLCJfaG9pc3RlZF8yIiwiX2NyZWF0ZUJsb2NrIiwiX2NvbXBvbmVudF9EaXRvQ29udGFpbmVyIiwibmVzdGVkRGF0YVBhdGgiLCJzdG9yZSIsIl9ob2lzdGVkXzMiLCJwYXJzZUZyYWN0aW9uIiwiZGl2aWRlbmQiLCJkaXZpc29yIiwiY29udGFpbmVyQ2xhc3MiLCJiYXNpcyIsImdyb3ciLCJzaHJpbmsiLCJiYXNpc0lzQXV0byIsImhhc1ZOb2RlQ29udGVudCIsInZub2RlIiwiQ29tbWVudCIsImhhc1Nsb3RDb250ZW50Iiwic2xvdCIsInVzZVNsb3RzIiwiY2FwaXRhbGl6ZSIsImNsaXBib2FyZERhdGEiLCJwYXN0ZSIsInJlcG9ydCIsImpzb24iLCJfZCIsIl9jIiwiZGVpbmRlbnQiLCIkc2NoZW1hIiwiX2UiLCJMb2FkaW5nTWl4aW4iLCJ1cGRhdGVSb290IiwidXBkYXRlVmlldyIsIlJlc291cmNlTWl4aW4iLCJhbW91bnQiLCJ2ZXJicyIsImNsZWFyIiwibG9hZGluZ09wdGlvbnMiLCJyZXF1ZXN0Iiwic2V0RGF0YSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJub3RpZnlTdWNjZXNzIiwibm90aWZ5RXJyb3IiLCJyZXNvbHZlUGF0aCIsImlzQ3JlYXRpbmciLCJwcm92aWRlc0RhdGEiLCJkYXRhUGFydHMiLCJwYXRoUGFydHMiLCJyb3V0ZVBhcnRzIiwibGFzdERhdGFQYXJ0IiwibCIsImRhdGFQYXJ0IiwibWFpblNjaGVtYUNvbXBvbmVudCIsInByZXNlbnQiLCJjbG9zZUZvcm0iLCJnZXRWZXJiIiwiYnV0dG9uUmVzb3VyY2UiLCJzdWNjZXNzIiwiX3Jlc291cmNlIiwiX21ldGhvZCIsIkRpdG9Gb3JtIiwic2NvcGUiLCJQYWdpbmF0aW9uIiwiX19kZWZQcm9wIiwiX19nZXRPd25Qcm9wU3ltYm9scyIsIl9faGFzT3duUHJvcCIsIl9fcHJvcElzRW51bSIsIl9fZGVmTm9ybWFsUHJvcCIsIm9iaiIsIl9fc3ByZWFkVmFsdWVzIiwicHJvcCIsIl9fb2JqUmVzdCIsInVzZVNvcnRhYmxlIiwibGlzdCIsInNvcnRhYmxlIiwiZG9jdW1lbnQiLCJkZWZhdWx0RG9jdW1lbnQiLCJyZXNldE9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsImUiLCJtb3ZlQXJyYXlFbGVtZW50IiwiU29ydGFibGUiLCJzdG9wIiwidHJ5T25Nb3VudGVkIiwidHJ5T25TY29wZURpc3Bvc2UiLCJ0b1ZhbHVlIiwibmV4dFRpY2siLCJTb3J0YWJsZU1peGluIiwidXNlVk1vZGVsIiwiZHJhZ2dhYmxlIiwiZmFsbGJhY2siLCJvbGRJbmRleCIsIm5ld0luZGV4IiwicGFnaW5hdGlvblJhbmdlIiwib2Zmc2V0IiwiX25vcm1hbGl6ZVN0eWxlIiwiX2NhY2hlIiwiX3dpdGhNb2RpZmllcnMiLCIkZXZlbnQiLCJfbm9ybWFsaXplQ2xhc3MiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfNCIsIl90b0Rpc3BsYXlTdHJpbmciLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNyIsIl9tZXJnZVByb3BzIiwiX3dpdGhEaXJlY3RpdmVzIiwiX2hvaXN0ZWRfOCIsIl9jb21wb25lbnRfRGl0b0xhYmVsIiwiX2NyZWF0ZVZOb2RlIiwiX2NvbXBvbmVudF9EaXRvVGFibGVDZWxsIiwiX2NvbXBvbmVudF9Vc2VTb3J0YWJsZSIsIl9jb21wb25lbnRfRGl0b1RyZWVJdGVtIiwiY2hpbGRyZW5TY2hlbWEiLCJjaGlsZHJlbkxpc3QiLCJlZGl0UGF0aCIsImNoaWxkcmVuT3BlbiIsIm51bUNoaWxkcmVuIiwiY3JlYXRhYmxlIiwiZWRpdGFibGUiLCJvcmRlciIsImNvbHVtbiIsInJlbmRlciIsImVzY2FwZUh0bWwiLCJEaXRvVk5vZGUiLCJEaXRvVHlwZUNvbXBvbmVudCQxIiwiRGl0b1R5cGVDb21wb25lbnQiLCJvbkNsaWNrIiwiRGF0YU1peGluIiwicmVzb2x2ZUNvdW50ZXIiLCJhc3luY0VudHJ5IiwicmVzb2x2ZWREYXRhIiwibG9hZCIsIk9wdGlvbnNNaXhpbiIsImNvbnZlcnRWYWx1ZSIsImNvbnZlcnQiLCJzZWFyY2giLCJmaWx0ZXIiLCJkZWJvdW5jZSIsImRlYm91bmNlQXN5bmMiLCJvcHRpb24iLCJncm91cGVkIiwicmVzdWx0cyIsImdyb3VwIiwiZmluZE9wdGlvbiIsImdyb3VwQnkiLCJvcHRpb25WYWx1ZSIsIm9wdGlvbkxhYmVsIiwicHJvY2Vzc1JlbGF0ZSIsImZsYXNrIiwiQ29kZUZsYXNrIiwiY2hhbmdlZCIsImlnbm9yZVdhdGNoIiwiaWdub3JlVXBkYXRlIiwic2V0Q29kZSIsImNvZGUiLCJzZXRWYWx1ZSIsIlNrZXRjaFBpY2tlciIsInRpbnljb2xvciIsImZvY3VzZWQiLCJEYXRlVGltZVBpY2tlciIsIlNvdXJjZU1peGluIiwiZGVmYXVsdFNvcnQiLCJkaXJlY3Rpb24iLCJjb2xsYXBzaWJsZSIsImxpc3REYXRhIiwib25Db21wbGV0ZSIsIm9wZW5lZCIsImNhbGxPbkNvbXBsZXRlIiwiaW5saW5lZCIsInBhcmFtIiwibWV0YSIsImZvcm1NZXRhIiwiY2hpbGRSb3V0ZXMiLCJnZXRQYXRoV2l0aFBhcmFtIiwic291cmNlUGF0aCIsImZvcm1Sb3V0ZSIsImZsYXRSb3V0ZXMiLCJzdWJSb3V0ZXMiLCJjaGlsZFJvdXRlIiwiZmlsdGVyQ29tcG9uZW50cyIsImRhdGVGb3JtYXQiLCJnZXRGaWx0ZXJzUGFuZWwiLCJmaWx0ZXJzIiwicHJveHkiLCJwYXJzZUZpbHRlcnNEYXRhIiwiZ2V0RmlsdGVyc0NvbXBvbmVudHMiLCJmb3JtYXRGaWx0ZXJzRGF0YSIsImNvbXBzIiwiZ2V0Q29tcG9uZW50c0ZvckZpbHRlciIsImZpbHRlcnNEYXRhIiwiX2NvbXBvbmVudF9EaXRvVGFibGVIZWFkIiwiX2NvbXBvbmVudF9EaXRvU2NoZW1hSW5saW5lZCIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9jb21wb25lbnRfRGl0b0VkaXRCdXR0b25zIiwiX2hvaXN0ZWRfOSIsImdldExpc3RDb21wb25lbnQiLCJmaWx0ZXJzRGF0YVBhdGgiLCJFZGl0b3JDb250ZW50IiwiSWNvbiIsImVkaXRvciIsIm1hcmtCdXR0b25zIiwiYmFzaWNOb2RlQnV0dG9ucyIsIm90aGVyTm9kZUJ1dHRvbnMiLCJ0b29sQnV0dG9ucyIsImVuYWJsZVJ1bGVzIiwic2V0VmFsdWVEZWJvdW5jZWQiLCJvblVwZGF0ZSIsIkVkaXRvciIsImdldFBvaW50IiwieCIsInkiLCJwcmV2WSIsIm1vdXNlbW92ZSIsImRpYWxvZ0NvbXBvbmVudCIsImdldE1hcmtBdHRyaWJ1dGVzIiwiaHJlZiIsIm1hcmtzIiwibm9kZXMiLCJ0b29scyIsIkRvY3VtZW50IiwiVGV4dCIsIlBhcmFncmFwaCIsIkJvbGQiLCJJdGFsaWMiLCJVbmRlcmxpbmUiLCJTdHJpa2UiLCJTbWFsbCIsIkNvZGUiLCJMaW5rV2l0aFRpdGxlIiwiQmxvY2txdW90ZSIsIkNvZGVCbG9jayIsIkhhcmRCcmVhayIsIkhlYWRpbmciLCJIb3Jpem9udGFsUnVsZSIsIkxpc3RJdGVtIiwiQnVsbGV0TGlzdCIsIk9yZGVyZWRMaXN0IiwiSGlzdG9yeSIsImV4dGVuc2lvbiIsInNldHRpbmdzTmFtZSIsImRlc2NyaXB0aW9ucyIsImFkZEJ1dHRvbiIsImljb24iLCJpZ25vcmVBY3RpdmUiLCJkZXNjcmlwdGlvbiIsInNldHRpbmdOYW1lIiwidW5kZXJzY29yZSIsImF0dHJpYnV0ZSIsIk1hcmsiLCJjb21tYW5kcyIsIkxpbmsiLCJub2RlIiwiX2NvbXBvbmVudF9WdWVNdWx0aXNlbGVjdCIsIlZ1ZU11bHRpc2VsZWN0IiwicGxhY2Vob2xkZXIiLCJzZWFyY2hhYmxlIiwidGFnZ2FibGUiLCJ0YWciLCJOdW1iZXJNaXhpbiIsIlN3aXRjaEJ1dHRvbiIsIm1hc2tlZFBhc3N3b3JkIiwiaGFzRWRpdGFibGVGb3JtcyIsImZvcm1hdEZpbGVTaXplIiwiZmlsZXNpemUiLCJWdWVVcGxvYWQiLCJhc0ZpbGVzIiwiYWNjZXB0IiwibWF4U2l6ZSIsInBhcnNlRmlsZVNpemUiLCJmaWxlIiwibmV3RmlsZSIsIm9sZEZpbGUiLCJ4aHIiLCJmaWxlcyIsInVwbG9hZCIsImxvZ2dlZERlcHJlY2F0aW9ucyIsImRlcHJlY2F0ZSIsIkRpdG9BZG1pbiIsImRpdG8iLCJ2aWV3cyIsImdldEFwaVVybCIsImlzQXBpVXJsIiwidmFsIiwidXNlcnMiLCJwYXJlbnRQYXRoIiwiYXBwIiwiY3JlYXRlQXBwIiwiRGl0b1Jvb3QiLCJWdWVOb3RpZmljYXRpb25zIiwiY3JlYXRlUm91dGVyIiwiY3JlYXRlV2ViSGlzdG9yeSIsIlJlcXVlc3RFcnJvciIsImhlYWRlcnMiLCJpc0Fic29sdXRlVXJsIiwiY29tYmluZVVybHMiLCJmb3JtYXRRdWVyeSIsImJhc2VVcmwiLCJyZWxhdGl2ZVVybCJdLCJtYXBwaW5ncyI6Im1wR0FFQSxNQUFBQSxHQUFlQyxXQUFTLENBQ3RCLE1BQU8sR0FDUCxnQkFBaUIsQ0FBRSxFQUNuQixLQUFNLEtBQ04sVUFBVyxDQUFFLEVBQ2IsWUFBYSxLQUNiLGNBQWUsSUFDakIsQ0FBQyxFQ0ZNLFNBQVNDLEVBQWVDLEVBQVVDLEVBQU8sQ0FDOUMsT0FBT0QsRUFDSCxHQUFHQSxLQUFZQyxJQUNmQSxDQUNOLENBRU8sU0FBU0MsR0FBb0JGLEVBQVUsQ0FDNUMsTUFBTUcsRUFBT0MsRUFBYSxjQUFDSixDQUFRLEVBQ25DLE9BQUFHLEdBQUEsTUFBQUEsRUFBTSxNQUNDQSxDQUNULENBTU8sU0FBU0UsR0FBa0JMLEVBQVVNLEVBQVMsR0FBTyxDQUMxRCxPQUFPQSxFQUFTSixHQUFvQkYsQ0FBUSxFQUFJSSxFQUFB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