{"version":3,"sources":["node_modules/browser-pack/_prelude.js","assets/scripts/lib/bookmarks.js","assets/scripts/lib/component-module.js","assets/scripts/lib/contact-us.js","assets/scripts/lib/cta-bar-bottom.js","assets/scripts/lib/cta-bar-top.js","assets/scripts/lib/documentation-contextual.js","assets/scripts/lib/documentation.js","assets/scripts/lib/drawer.js","assets/scripts/lib/event-bus.js","assets/scripts/lib/fetcher.js","assets/scripts/lib/filter-components.js","assets/scripts/lib/footer-units.js","assets/scripts/lib/fw-media.js","assets/scripts/lib/generic-modal.js","assets/scripts/lib/hero-products.js","assets/scripts/lib/home-hero.js","assets/scripts/lib/how-it-works.js","assets/scripts/lib/internal-search.js","assets/scripts/lib/legal-compliance.js","assets/scripts/lib/lit-order.js","assets/scripts/lib/market-applications.js","assets/scripts/lib/megamenu.js","assets/scripts/lib/menu-top-bar.js","assets/scripts/lib/meter-selector/button-set.js","assets/scripts/lib/meter-selector/frame.js","assets/scripts/lib/meter-selector/input-box.js","assets/scripts/lib/meter-selector/step-bar.js","assets/scripts/lib/misc.js","assets/scripts/lib/modal-trigger.js","assets/scripts/lib/modals.js","assets/scripts/lib/modules/affiliates.js","assets/scripts/lib/modules/find-distributor.js","assets/scripts/lib/modules/global-message.js","assets/scripts/lib/modules/index.js","assets/scripts/lib/modules/locations-map.js","assets/scripts/lib/modules/meter-selector.js","assets/scripts/lib/modules/my-saved-page.js","assets/scripts/lib/modules/recent-posts.js","assets/scripts/lib/modules/solution-area.js","assets/scripts/lib/pardot-form.js","assets/scripts/lib/patents.js","assets/scripts/lib/product-catalog.js","assets/scripts/lib/products-accessories.js","assets/scripts/lib/quick-links.js","assets/scripts/lib/search-results.js","assets/scripts/lib/slideshow.js","assets/scripts/lib/software-card.js","assets/scripts/lib/software-firmware.js","assets/scripts/lib/spec-table.js","assets/scripts/lib/specifications.js","assets/scripts/lib/storage-manager.js","assets/scripts/lib/store.js","assets/scripts/lib/sub-nav.js","assets/scripts/lib/tabs.js","assets/scripts/lib/template-strings/my-saved-page.js","assets/scripts/lib/template-strings/recent-posts.js","assets/scripts/lib/template-strings/solution-area.js","assets/scripts/lib/template-strings/tabs-component.js","assets/scripts/lib/testimonial.js","assets/scripts/lib/timeline.js","assets/scripts/lib/video-player-link.js","assets/scripts/lib/video-player.js","assets/scripts/main.js","assets/scripts/polyfills/element.closest.js","assets/scripts/polyfills/matchMedia.js","db.json","node_modules/@popperjs/core/dist/cjs/popper.js","node_modules/axios/index.js","node_modules/axios/lib/adapters/xhr.js","node_modules/axios/lib/axios.js","node_modules/axios/lib/cancel/Cancel.js","node_modules/axios/lib/cancel/CancelToken.js","node_modules/axios/lib/cancel/isCancel.js","node_modules/axios/lib/core/Axios.js","node_modules/axios/lib/core/InterceptorManager.js","node_modules/axios/lib/core/buildFullPath.js","node_modules/axios/lib/core/createError.js","node_modules/axios/lib/core/dispatchRequest.js","node_modules/axios/lib/core/enhanceError.js","node_modules/axios/lib/core/mergeConfig.js","node_modules/axios/lib/core/settle.js","node_modules/axios/lib/core/transformData.js","node_modules/axios/lib/defaults.js","node_modules/axios/lib/helpers/bind.js","node_modules/axios/lib/helpers/buildURL.js","node_modules/axios/lib/helpers/combineURLs.js","node_modules/axios/lib/helpers/cookies.js","node_modules/axios/lib/helpers/isAbsoluteURL.js","node_modules/axios/lib/helpers/isURLSameOrigin.js","node_modules/axios/lib/helpers/normalizeHeaderName.js","node_modules/axios/lib/helpers/parseHeaders.js","node_modules/axios/lib/helpers/spread.js","node_modules/axios/lib/utils.js","node_modules/core-js/es/array/find.js","node_modules/core-js/es/array/from.js","node_modules/core-js/es/array/includes.js","node_modules/core-js/es/object/assign.js","node_modules/core-js/es/promise/index.js","node_modules/core-js/es/string/includes.js","node_modules/core-js/es/symbol/iterator.js","node_modules/core-js/features/promise/index.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/array-methods.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/bind-context.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/internals/entry-unbind.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/function-to-string.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/global.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/hide.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/is-pure.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/internals/string-at.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/user-agent.js","node_modules/core-js/internals/validate-set-prototype-of-arguments.js","node_modules/core-js/internals/validate-string-method-arguments.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/wrapped-well-known-symbol.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/modules/es.promise.finally.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/modules/esnext.aggregate-error.js","node_modules/core-js/modules/esnext.promise.all-settled.js","node_modules/core-js/modules/esnext.promise.any.js","node_modules/core-js/modules/esnext.promise.try.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/intersection-observer/intersection-observer.js","node_modules/lory.js/dist/lory.js","node_modules/nodelist-foreach-polyfill/index.js","node_modules/process/browser.js","node_modules/qs/lib/formats.js","node_modules/qs/lib/index.js","node_modules/qs/lib/parse.js","node_modules/qs/lib/stringify.js","node_modules/qs/lib/utils.js","node_modules/showdown/dist/showdown.js","node_modules/timers-browserify/main.js","node_modules/tippy.js/dist/tippy.cjs.js","node_modules/vue-js-modal/dist/index.js","node_modules/vue/dist/vue.min.js","node_modules/vuex/dist/vuex.common.js","views/partials/shared/meter-selector-button-set.hbs","views/partials/shared/meter-selector-content.hbs","views/partials/shared/meter-selector-frame-question.hbs","views/partials/shared/meter-selector-frame-separator.hbs","views/partials/shared/meter-selector-frame.hbs","views/partials/shared/meter-selector-input-box.hbs","views/partials/shared/meter-selector-paginator.hbs","views/partials/shared/meter-selector-product-item-h.hbs","views/partials/shared/meter-selector-product-item-v.hbs","views/partials/shared/meter-selector-step-bar.hbs"],"names":[],"mappings":"AAAA;;;;;;;;ACAA;;AACA;;;;AAEA,IAAM,SAAS,GAAG,SAAZ,SAAY,GAAM;AAEpB,MAAI,aAAa,GAAG,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAApB;;AAEA,MAAI,mBAAmB,GAAG,SAAtB,mBAAsB,CAAC,EAAD,EAAQ;AAC9B,uBAAI,SAAJ,CAAc,UAAd,EAA0B;AACtB,MAAA,KAAK,EAAE,CAAC,MAAD,CADe;AAEtB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,KADX;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,IAAI,EAAE;AAHH,SAAP;AAKH,OARqB;AAStB,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,WAAyB,KAAK,IAA9B,EAAP;AACH;AAHK,OATY;AActB,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH;AAHE,OAde;AAmBtB,MAAA,OAAO,EAAE;AACL,QAAA,cADK,4BACY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH;AARI,OAnBa;AA6BtB,MAAA,OA7BsB,qBA6BZ;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,IAA9U;AAEA,aAAK,IAAL,GAAY,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,IAAxO,CAHM,CAKN;;AAEA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH;AArCqB,KAA1B;;AAwCA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,gCAAyB,EAAzB;AADE,KAAR,EAEG,MAFH,+BAEiC,EAFjC,GAEuC,IAFvC;AAGH,GA5CD;;AA8CA,MAAI,aAAa,CAAC,MAAd,GAAuB,CAA3B,EAA8B;AAC1B,IAAA,aAAa,CAAC,OAAd,CAAsB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACnC,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,8BAAyC,KAAzC;AACA,MAAA,mBAAmB,CAAC,KAAD,CAAnB;AACH,KAHD;AAIH;AAEJ,CAzDD;;eA2De,S;;;;;;;;;;;ACbf;;AACA;;;;;;;;;;;;;;AAEA,IAAM,eAAe,GAAG;AACpB,EAAA,SAAS,EAAE,mBAAC,MAAD,EAAS,OAAT,EAAqB;AAC5B,IAAA,eAAe,CAAC,QAAhB,CAAyB,IAAzB;AAA+B,MAAA,MAAM,EAAN;AAA/B,OAA0C,OAA1C;AACH,GAHmB;AAKpB,EAAA,IAAI,EAAE,gBAAM;AACR,IAAA,eAAe,CAAC,QAAhB,CAAyB,OAAzB,CAAiC,gBAAqF;AAAA,UAAlF,MAAkF,QAAlF,MAAkF;AAAA,UAA1E,UAA0E,QAA1E,UAA0E;AAAA,UAA9D,QAA8D,QAA9D,QAA8D;AAAA,UAApD,MAAoD,QAApD,MAAoD;AAAA,UAA5C,QAA4C,QAA5C,QAA4C;AAAA,4BAAlC,KAAkC;AAAA,UAAlC,KAAkC,2BAA1B,IAA0B;AAAA,UAAjB,UAAiB;;AAClH,UAAM,KAAK,GAAG,MAAM,IAAI,EAAxB;;AACA,UAAM,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,MAA1B,CAAd;AACA,MAAA,KAAK,CAAC,OAAN,CAAc,UAAA,EAAE,EAAI;AAChB,QAAA,QAAQ,IAAI,QAAQ,CAAC,kBAAD,CAApB;AACA,YAAM,QAAQ,GAAG,IAAI,kBAAJ;AACb,UAAA,EAAE,EAAE,CAAC,QAAD,IAAa,EADJ;AAEb,UAAA,KAAK,EAAE,iBAFM;AAGb,UAAA,UAAU,EAAE,UAAF,aAAE,UAAF,uBAAE,UAAU,CAAE,MAAZ,CAAmB,UAAC,GAAD,SAA6B;AAAA,gBAAtB,IAAsB,SAAtB,IAAsB;AAAA,gBAAb,OAAa;;AACxD,YAAA,GAAG,CAAC,KAAK,GAAC,IAAP,CAAH,GAAkB,OAAlB;AACA,mBAAO,GAAP;AACH,WAHW,EAGT,EAHS,CAHC;AAOb,UAAA,QAAQ,EAAR;AAPa,WAQV,UARU,EAAjB;AAWA,QAAA,KAAK,IAAI,QAAQ,CAAC,MAAT,CAAgB,EAAhB,EAAoB,IAApB,CAAT;AACH,OAdD;AAeH,KAlBD;AAmBH;AAzBmB,CAAxB;AA4BA,eAAe,CAAC,QAAhB,GAA2B,EAA3B;eAEe,e;;;;;;;;;;;AClFf;;AACA;;AACA;;;;AACA;AAEA,IAAM,SAAS,GAAG,SAAZ,SAAY,GAAM;AACpB,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,qBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,IAAA,KAAK,EAAE,CAAC,aAAD,CADiB;AAExB,IAAA,OAAO,EAAE;AACL,MAAA,WADK,yBACS;AACV,6BAAS,KAAT,CAAe,eAAf,EADU,CAGV;AACA;AACA;AACA;AACA;AACA;;AACH;AAVI,KAFe;AAcxB,IAAA,OAdwB,qBAcd,CACT;AAfuB,GAA5B;AAkBH,CArBD;;eAuBe,S;;;;;;;;;;;AC5Bf;;AACA;;AACA;;AACA;;;;AAEA,IAAM,YAAY,GAAG,SAAf,YAAe,GAAM;AACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAT,CAA0B,yBAA1B,CAAf;;AAEA,MAAI,iBAAiB,GAAG,SAApB,iBAAoB,CAAC,EAAD,EAAQ;AAC5B,uBAAI,SAAJ,CAAc,yBAAd,EAAyC;AACrC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,KADP;AAEH,UAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QAFnB;AAGH,UAAA,QAAQ,EAAE,KAHP;AAIH,UAAA,eAAe,EAAE,KAJd;AAKH,UAAA,QAAQ,EAAE,IALP;AAMH,UAAA,WAAW,EAAE,KANV;AAOH,UAAA,KAAK,EAAE;AAPJ,SAAP;AASH,OAXoC;AAYrC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,OAZ2B;AAiBrC,MAAA,KAAK,EAAE;AACH,QAAA,gBAAgB,EAAE,4BAAW;AAAA;;AACvB,cAAI,KAAK,gBAAL,IAAyB,IAA7B,EAAmC;AACjC,iBAAK,QAAL;AACA,iBAAK,YAAL;AACA,iBAAK,QAAL,GAAgB,IAAhB;;AAEA,iCAAS,GAAT,CAAa,WAAb,EAA0B,YAAM;AAC5B,cAAA,KAAI,CAAC,SAAL;;AACA,cAAA,KAAI,CAAC,QAAL,GAAgB,IAAhB;AACH,aAHD;;AAIA,iCAAS,GAAT,CAAa,aAAb,EAA4B,YAAM;AAC9B,kBAAI,CAAC,KAAI,CAAC,eAAV,EAA2B;AACvB,gBAAA,KAAI,CAAC,WAAL;;AACA,gBAAA,KAAI,CAAC,QAAL,GAAgB,KAAhB;AACH,eAHD,MAGO;AAAE;AAAS;AACrB,aALD;AAMD,WAfD,MAeO;AACH,iBAAK,QAAL,GAAgB,KAAhB;;AACF,iCAAS,IAAT,CAAc,WAAd;;AACA,iCAAS,IAAT,CAAc,aAAd;;AACA,YAAA,QAAQ,CAAC,aAAT,CAAuB,+BAAvB,EAAwD,SAAxD,CAAkE,MAAlE,CAAyE,QAAzE;AACA,iBAAK,WAAL;AACA,YAAA,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,KAAlD,CAAwD,OAAxD,GAAkE,MAAlE;AAEA,gBAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,SAAvB,CAAb;AACA,iBAAK,QAAL,CAAc,UAAd,CAAyB,MAAzB;AACD;AACJ,SA5BA,CA6BH;AACA;AACA;;AA/BG,OAjB8B;AAkDrC,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ,eAAK,WAAL,GAAmB,CAAC,KAAK,WAAzB;AACH,SAHI;AAIL,QAAA,SAJK,uBAIO;AACR,cAAI,CAAC,KAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,QAA9B,CAAuC,QAAvC,CAAD,IAAqD,CAAC,KAAK,QAA3D,IAAuE,KAAK,gBAAhF,EAAkG;AAC9F,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,GAA9B,CAAkC,QAAlC;AACH;AACJ,SARI;AASL,QAAA,WATK,yBASS;AACV,cAAI,KAAK,QAAT,EAAmB;AACf,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,MAA9B,CAAqC,QAArC;AACH;AACJ,SAbI;AAcL,QAAA,QAdK,sBAcM;AAAA;;AACP;AACA,UAAA,UAAU,CAAC,YAAM;AACb,YAAA,MAAI,CAAC,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,GAA9B,CAAkC,QAAlC;AACH,WAFS,EAEP,IAFO,CAAV;AAGH,SAnBI;AAoBL,QAAA,YApBK,0BAoBU;AAAA;;AACX,cAAI,OAAO,GAAE;AACT,YAAA,IAAI,EAAE,IADG;AAET,YAAA,UAAU,EAAE,KAFH;AAGT,YAAA,SAAS,EAAE;AAHF,WAAb;;AAKA,cAAM,YAAY,GAAG,SAAf,YAAe,CAAC,OAAD,EAAa;AAC9B,YAAA,OAAO,CAAC,OAAR,CAAgB,UAAA,MAAM,EAAI;AACtB,kBAAI,EAAE,MAAM,CAAC,iBAAP,GAA2B,CAA7B,CAAJ,EAAqC;AACjC,gBAAA,MAAI,CAAC,eAAL,GAAuB,KAAvB;AACA,gBAAA,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,KAAlD,CAAwD,OAAxD,GAAkE,OAAlE;AACH,eAHD,MAGO;AACH,gBAAA,MAAI,CAAC,eAAL,GAAuB,IAAvB;AACA,gBAAA,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,KAAlD,CAAwD,OAAxD,GAAkE,MAAlE;AACH;AACJ,aARD;AASH,WAVD;;AAWA,cAAI,QAAQ,GAAG,IAAI,oBAAJ,CAAyB,YAAzB,EAAuC,OAAvC,CAAf;AACA,eAAK,QAAL,GAAgB,QAAhB;AACA,cAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,SAAvB,CAAb;AAEA,UAAA,QAAQ,CAAC,OAAT,CAAiB,MAAjB;AACH;AA1CI,OAlD4B;AA8FrC,MAAA,OA9FqC,qBA8F3B;AAAA;;AACN,6BAAS,GAAT,CAAa,WAAb,EAA0B,YAAM;AAC5B,UAAA,MAAI,CAAC,SAAL;;AACA,UAAA,MAAI,CAAC,QAAL,GAAgB,IAAhB;AACA,UAAA,MAAI,CAAC,QAAL,GAAgB,IAAhB;AACH,SAJD;;AAKA,6BAAS,GAAT,CAAa,aAAb,EAA4B,YAAM;AAC9B,cAAI,CAAC,MAAI,CAAC,eAAV,EAA2B;AACvB,YAAA,MAAI,CAAC,WAAL;;AACA,YAAA,MAAI,CAAC,QAAL,GAAgB,KAAhB;AACA,YAAA,MAAI,CAAC,QAAL,GAAgB,IAAhB;AACH,WAJD,MAIO;AAAE;AAAS;AACrB,SAND;;AAOA,6BAAS,GAAT,CAAa,eAAb,EAA8B,YAAM;AAChC,UAAA,MAAI,CAAC,WAAL,GAAmB,KAAnB;AACH,SAFD;;AAGA,YAAI,KAAK,QAAT,EAAmB;AACf,eAAK,QAAL;AACA,eAAK,YAAL;AACH;AACJ;AAlHoC,KAAzC;;AAqHA;AAEA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,oCAA6B,EAA7B,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,mCAGqC,EAHrC,GAG2C,IAH3C;AAIH,GA5HD;;AA8HA,MAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,IAAA,MAAM,CAAC,OAAP,CAAe,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC5B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,kCAA6C,KAA7C;AACA,MAAA,iBAAiB,CAAC,KAAD,CAAjB;AACH,KAHD;AAIH;AAEJ,CAxID;;eA0Ie,Y;;;;;;;;;;;AC/If;;AACA;;AACA;;AACA;;AACA;;;;AACA;AAEA,IAAM,SAAS,GAAG,SAAZ,SAAY,GAAM;AACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,sBAAvB,CAAf;;AACA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAI,iBAAiB,GAAG,SAApB,iBAAoB,GAAM;AAC1B,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,KAAK,EAAE,kBAAM,KAAN,CAAY,SAAZ,IAAyB,EAD7B;AAEH,UAAA,SAAS,EAAE,KAFR;AAGH,UAAA,WAAW,EAAE;AAAC,YAAA,IAAI,EAAE;AAAP,WAHV;AAIH,UAAA,aAAa,EAAE,IAJZ;AAKH;AACA,UAAA,UAAU,EAAE,KANT;AAOH,UAAA,QAAQ,EAAE,KAPP;AAQH,UAAA,SAAS,EAAE,IARR;AASH,UAAA,WAAW,EAAE,KATV;AAUH,UAAA,eAAe,EAAE,EAVd;AAWH,UAAA,KAAK,EAAE;AAXJ,SAAP;AAaH,OAfiC;AAgBlC,MAAA,OAAO,EAAE,mBAAU;AACf,QAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,KAAK,YAAvC;AACA,aAAK,YAAL;AACH,OAnBiC;AAoBlC,MAAA,SAAS,EAAE,qBAAU;AACjB,QAAA,MAAM,CAAC,mBAAP,CAA2B,QAA3B,EAAqC,KAAK,YAA1C;AACH,OAtBiC;AAuBlC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,OAvBwB;AA4BlC,MAAA,KAAK,EAAE;AACH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,QAAL,GAAgB,KAAK,gBAArB,CADyB,CAEzB;AACH,SAJE;AAKH,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,SAAL,IAAkB,IAAtB,EAA4B;AACxB,iBAAK,SAAL;AACH,WAFD,MAEO,IAAI,KAAK,SAAL,IAAkB,MAAtB,EAA8B;AACjC,iBAAK,WAAL;AACH,WAFM,MAEA,IAAI,KAAK,SAAL,IAAkB,KAAtB,EAA6B;AAChC,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,MAA9B,CAAqC,QAArC;AACH;AACJ,SAbE;AAcH,QAAA,WAAW,EAAE,uBAAW;AACpB,eAAK,eAAL,GAAuB,KAAK,WAAL,GAAmB,EAAnB,GAAwB,KAAK,KAAL,CAAW,UAAX,CAAsB,aAAtB,CAAoC,cAApC,EAAoD,OAApD,CAA4D,QAA3G;AACH;AAhBE,OA5B2B;AA8ClC,MAAA,OAAO,EAAE;AACL,QAAA,YADK,0BACU;AACX,cAAM,EAAE,GAAG,KAAK,OAAL,CAAa,GAAxB;AACA,cAAM,IAAI,GAAG,QAAQ,CAAC,eAAT,CAAyB,SAAzB,IAAsC,QAAQ,CAAC,IAAT,CAAc,SAAjE;AACA,cAAM,IAAI,GAAG,KAAK,SAAL,IAAkB,EAAE,CAAC,qBAAH,GAA2B,GAA1D;;AAEA,cAAI,KAAK,SAAL,KAAmB,IAAvB,EAA4B;AACxB,iBAAK,SAAL,GAAiB,IAAjB;AACH;;AAED,cAAI,IAAI,GAAG,IAAX,EAAiB;AACb,YAAA,EAAE,CAAC,SAAH,CAAa,GAAb,CAAiB,2BAAjB;AACH,WAFD,MAEO;AACH,YAAA,EAAE,CAAC,SAAH,CAAa,MAAb,CAAoB,2BAApB;AACH;AACJ,SAfI;AAgBL,QAAA,aAhBK,yBAgBS,CAhBT,EAgBY;AACb,eAAK,WAAL,GAAmB,CAAC,KAAK,WAAzB;AACH,SAlBI;AAoBL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,QAAA,QA7BK,sBA6BM;AAEP,cAAI,QAAQ,CAAC,aAAT,CAAuB,IAAvB,CAAJ,EAAkC;AAC9B,gBAAI,SAAS,GAAG,QAAQ,CAAC,aAAT,CAAuB,IAAvB,EAA6B,SAA7C;;AACA,8BAAM,MAAN,CAAa,aAAb,EAA4B,SAA5B;;AACA,iBAAK,KAAL,GAAa,kBAAM,KAAN,CAAY,SAAzB;AACH;AACJ,SApCI;AAqCL,QAAA,UArCK,wBAqCQ;AAAA;;AACT,cAAI,OAAO,GAAE;AACT,YAAA,IAAI,EAAE,IADG;AAET,YAAA,UAAU,EAAE,KAFH;AAGT,YAAA,SAAS,EAAE;AAHF,WAAb;;AAKA,cAAM,WAAW,GAAG,SAAd,WAAc,CAAC,OAAD,EAAa;AAC7B,YAAA,OAAO,CAAC,OAAR,CAAgB,UAAA,MAAM,EAAI;AACtB,kBAAI,EAAE,MAAM,CAAC,iBAAP,GAA2B,CAA7B,CAAJ,EAAqC;AACjC;AACA,gBAAA,KAAI,CAAC,SAAL,GAAiB,IAAjB;AACH,eAHD,MAGO;AACH;AACA,gBAAA,KAAI,CAAC,SAAL,GAAiB,KAAjB;AACH;AACJ,aARD;AASH,WAVD;;AAWA,cAAI,QAAQ,GAAG,IAAI,oBAAJ,CAAyB,WAAzB,EAAsC,OAAtC,CAAf;;AAEA,cAAI,QAAQ,CAAC,aAAT,CAAuB,IAAvB,CAAJ,EAAkC;AAC9B,gBAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,IAAvB,EAA6B,UAA1C;AACA,YAAA,QAAQ,CAAC,OAAT,CAAiB,MAAjB;AACH,WAHD,MAGO;AAAC;AAAQ;AAEnB,SA7DI;AA8DL,QAAA,UA9DK,wBA8DQ;AAAA;;AACT,cAAI,eAAe,GAAG,QAAQ,CAAC,gBAAT,CAA0B,+BAA1B,CAAtB;AACA,cAAI,OAAO,GAAG,EAAd;AACA,eAAK,UAAL,GAAkB,eAAe,CAAC,MAAhB,GAAyB,CAAzB,GAA6B,IAA7B,GAAoC,KAAtD;;AAEA,cAAI,KAAK,UAAT,EAAqB;AACjB;AACA;AACA;AACA;AACA,YAAA,eAAe,CAAC,OAAhB,CAAwB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACrC,cAAA,OAAO,CAAC,IAAR,CAAa;AACT,gBAAA,IAAI,EAAE,IAAI,CAAC,SADF;AAET,gBAAA,GAAG,EAAE,IAAI,CAAC,YAAL,CAAkB,MAAlB,EAA0B,MAA1B,CAAiC,CAAjC;AAFI,eAAb,EADqC,CAKrC;AACA;AACA;AACA;AACA;AAEA;AAEH,aAbD,EALiB,CAoBjB;;AACA,iBAAK,WAAL,GAAmB,OAAnB;;AAEA,8BAAM,MAAN,CAAa,gBAAb,EAA+B,OAA/B;;AACA,iBAAK,SAAL,CAAe,YAAM;AACjB,cAAA,MAAI,CAAC,cAAL;AACH,aAFD;AAGH;AACJ,SA/FI;AAgGL,QAAA,UAhGK,wBAgGQ;AACT,eAAK,QAAL,GAAgB,kBAAM,KAAN,CAAY,QAA5B;AACH,SAlGI;AAmGL,QAAA,eAnGK,6BAmGa;AACd,cAAI,SAAS,GAAG,CAAhB;AACA,cAAI,IAAI,GAAG,IAAX;;AACA,mBAAS,YAAT,GAAwB;AACpB,gBAAI,IAAI,CAAC,gBAAT,EAA2B;AACvB,kBAAK,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAAxC,IAA+C,CAAnD,EAAsD;AAClD,gBAAA,IAAI,CAAC,SAAL,GAAiB,KAAjB;AACH,eAFD,MAEO,IAAK,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAAxC,GAA8C,SAAlD,EAA6D;AAChE,qCAAS,KAAT,CAAe,aAAf;;AACA,gBAAA,IAAI,CAAC,SAAL,GAAiB,IAAjB,CAFgE,CAGhE;AACH,eAJM,MAIA;AACH,qCAAS,KAAT,CAAe,WAAf;;AACA,gBAAA,IAAI,CAAC,SAAL,GAAiB,MAAjB,CAFG,CAGH;AACH;;AACD,cAAA,SAAS,GAAI,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAApD;AACH,aAbD,MAaO;AACH;AACH;AACJ;;AAED,UAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,YAAlC,EAAgD,IAAhD;AAEH,SA3HI;AA4HL,QAAA,SA5HK,uBA4HO;AACR,cAAI,CAAC,KAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,QAA9B,CAAuC,QAAvC,CAAL,EAAuD;AACnD,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,GAA9B,CAAkC,QAAlC;AACH;AACJ,SAhII;AAiIL,QAAA,WAjIK,yBAiIS;AACV,eAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,MAA9B,CAAqC,QAArC;AACH,SAnII;AAoIL,QAAA,cApIK,4BAoIY;AAAA;;AACb,cAAI,OAAO,GAAG;AACV,YAAA,IAAI,EAAE,IADI;AAEV,YAAA,UAAU,EAAE,KAFF;AAGV;AACA,YAAA,SAAS,EAAE,CAAC,CAAD,EAAI,EAAJ,EAAQ,EAAR,EAAY,EAAZ,EAAgB,EAAhB,EAAoB,EAApB,EAAwB,EAAxB,EAA4B,EAA5B,EAAgC,EAAhC,EAAoC,EAApC,EAAwC,CAAxC,CAJD,CAKV;;AALU,WAAd;;AAQA,cAAM,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,OAAD,EAAa;AAAA;AAAA;AAAA;;AAAA;AAClC,mCAAkB,OAAlB,8HAA2B;AAAA,oBAAlB,KAAkB;AACvB,gBAAA,KAAK,CAAC,MAAN,CAAa,mBAAb,GAAmC,KAAK,CAAC,gBAAN,CAAuB,MAA1D;AACH,eAHiC,CAKlC;;AALkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMlC,gBAAM,kBAAkB,GAAG,OAAO,CAAC,MAAR,CAAe,UAAC,IAAD,EAAO,OAAP,EAAmB;AAC7D,kBAAI,OAAO,CAAC,mBAAR,IAA+B,IAAI,GAAG,IAAI,CAAC,mBAAR,GAA8B,CAAjE,CAAJ,EAAyE;AACrE,uBAAO,OAAP;AACH,eAFD,MAEO;AACH,uBAAO,IAAP;AACH;AACA,aAN0B,EAMxB,IANwB,CAA3B;;AAOA,gBAAI,kBAAJ,EAAwB;AACpB,cAAA,MAAI,CAAC,aAAL,GAAqB,kBAAkB,CAAC,OAAnB,CAA2B,EAAhD;AACH;AACJ,WAhBD;;AAkBA,cAAI,QAAQ,GAAG,IAAI,oBAAJ,CAAyB,gBAAzB,EAA2C,OAA3C,CAAf;AACA,cAAI,OAAO,GAAG,EAAd;AAEA,eAAK,WAAL,CAAiB,OAAjB,CAAyB,UAAC,MAAD,EAAY;AACjC,gBAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,sBAAoC,MAAM,CAAC,GAA3C,SAAb;;AACA,gBAAI,MAAJ,EAAY;AAAE,cAAA,OAAO,CAAC,IAAR,CAAa,MAAb;AAAuB;AACxC,WAHD,EA9Ba,CAkCb;;AACA,UAAA,OAAO,CAAC,OAAR,CAAgB,UAAC,MAAD,EAAY;AACxB,YAAA,QAAQ,CAAC,OAAT,CAAiB,MAAjB;AACH,WAFD;AAGH;AA1KI,OA9CyB;AA0NlC,MAAA,OA1NkC,qBA0NxB;AAAA;;AACN;AACA,aAAK,QAAL;AACA,aAAK,UAAL;AACA,aAAK,UAAL;AACA,aAAK,UAAL;AACA,aAAK,eAAL;AAEA,aAAK,eAAL,GAAuB,KAAK,KAAL,CAAW,UAAX,CAAsB,aAAtB,CAAoC,cAApC,EAAoD,OAApD,CAA4D,QAAnF,CARM,CASN;;AACA,6BAAS,GAAT,iBAA6B,YAAM;AAC/B,UAAA,MAAI,CAAC,WAAL,GAAmB,IAAnB;AACH,SAFD,EAVM,CAaN;;;AACA,6BAAS,GAAT,CAAa,gBAAb,EAA+B,YAAM;AACjC,UAAA,MAAI,CAAC,aAAL;AACH,SAFD;;AAGA,6BAAS,GAAT,CAAa,eAAb,EAA8B,YAAM;AAChC,UAAA,MAAI,CAAC,WAAL,GAAmB,KAAnB;AACH,SAFD;AAGH;AA9OiC,KAAtC;;AAkPA,uBAAI,SAAJ,CAAc,iBAAd,EAAiC;AAC7B,MAAA,KAAK,EAAE,CAAC,aAAD,EAAgB,WAAhB,EAA6B,YAA7B,EAA2C,UAA3C,EAAuD,eAAvD,CADsB;AAE7B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,WAAW,EAAE,KADV;AAEH,UAAA,cAAc,EAAE,IAFb,CAGH;;AAHG,SAAP;AAKH,OAR4B;AAS7B,MAAA,QAAQ,EAAE;AACN,QAAA,qBAAqB,EAAE,iCAAW;AAC9B,iBAAO,KAAK,aAAZ;AACH;AAHK,OATmB;AAc7B,MAAA,KAAK,EAAE;AACH,yBAAiB,yBAAW;AACxB,eAAK,cAAL,GAAsB,KAAK,aAA3B;AACH,SAHE;AAIH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAA,UAAU,EAAE,sBAAW;AACnB,eAAK,aAAL;AACH;AAhBE,OAdsB;AAgC7B,MAAA,QAAQ,oUAhCqB;AAqC7B,MAAA,OAAO,EAAE;AACL,QAAA,IADK,gBACA,CADA,EACG;AACJ;AACA,UAAA,MAAM,CAAC,QAAP,CAAgB,IAAhB,cAA2B,CAAC,CAAC,MAAF,CAAS,KAApC,EAFI,CAGJ;AACH,SALI;AAML,QAAA,aANK,2BAMW;AAAA;;AACZ,cAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,UAAvB,CAAb;AACA,UAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,YAAM;AACpC,gBAAI,MAAM,CAAC,OAAP,GAAiB,MAAM,CAAC,SAA5B,EAAuC;AACnC,cAAA,MAAI,CAAC,WAAL,GAAmB,IAAnB;AACH,aAFD,MAEO;AACH,cAAA,MAAI,CAAC,WAAL,GAAmB,KAAnB;AACH;AACJ,WAND;AAOH;AAfI,OArCoB;AAsD7B,MAAA,OAtD6B,qBAsDnB;AACN,aAAK,SAAL,CAAe,YAAW;AACtB,cAAG,KAAK,UAAR,EAAoB;AAChB,iBAAK,aAAL;AACH;AACJ,SAJD;AAKH;AA5D4B,KAAjC;;AA+DA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,MAAD,CAD2B;AAElC,MAAA,QAAQ;AAF0B,KAAtC;;AAOA;AAEA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,EAAE,sBADA;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,CAGU,sBAHV,EAGkC,IAHlC;AAIH,GA/TD;;AAiUA,MAAG,MAAH,EAAW;AACP,IAAA,iBAAiB;AACpB;AAEJ,CAzUD;;eA2Ue,S;;;;;;;;;;;AClVf;;AACA;;AACA;;;;;;;;;;;;AAEA,IAAM,uBAAuB,GAAG,SAA1B,uBAA0B,GAAM;AAElC,MAAI,IAAI,GAAG,QAAQ,CAAC,gBAAT,CAA0B,UAA1B,CAAX;;AAEA,MAAI,wBAAwB,GAAG,SAA3B,wBAA2B,CAAC,EAAD,EAAQ;AACnC,uBAAI,SAAJ,CAAc,mCAAd,EAAmD;AAC/C,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,EADR;AACY;AACf,UAAA,MAAM,EAAE,IAFL;AAGH,UAAA,SAAS,EAAE,IAHR;AAIH,UAAA,UAAU,EAAE,IAJT;AAKH,UAAA,KAAK,EAAE;AALJ,SAAP;AAOH,OAT8C;AAU/C,MAAA,KAAK,EAAE;AACH,qBAAa,qBAAW;AACpB,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,SAAL,CAAe,OAAf,CAAuB,UAAA,IAAI,EAAI;AAC3B,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,iBAAmD,IAAI,CAAC,GAAxD,WAAN;AACH,WAFD;AAGA,eAAK,MAAL,GAAc,MAAd;AACH,SAPE;AAQH,iBAAS,iBAAW;AAChB,eAAK,QAAL;AACH;AAVE,OAVwC;AAsB/C,MAAA,OAAO,EAAE;AACL,QAAA,eADK,2BACW,IADX,EACiB;AAClB,cAAI,IAAI,GAAG,KAAK,SAAL,CAAe,IAAf,CAAoB,UAAA,IAAI,EAAI;AACnC,mBAAO,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAAvB;AACH,WAFU,CAAX;;AAIA,cAAI,CAAC,IAAL,EAAW;AACP,iBAAK,SAAL,gCAAqB,KAAK,SAA1B,IAAqC,IAArC;AACH,WAFD,MAEO;AACH,iBAAK,SAAL,CAAe,MAAf,CAAsB,KAAK,SAAL,CAAe,OAAf,CAAuB,IAAvB,CAAtB,EAAmD,CAAnD;AACH;AACJ,SAXI;AAYL,QAAA,WAZK,uBAYO,IAZP,EAYa;AACd,eAAK,KAAL,CAAW,IAAX,CAAgB,IAAhB;AACH,SAdI;AAeL,QAAA,QAfK,sBAeM;AACP,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,KAAL,CAAW,OAAX,CAAmB,UAAA,IAAI,EAAI;AACvB,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,eAAiD,IAAI,CAAC,GAAtD,WAAN;AACH,WAFD;AAGA,eAAK,SAAL,GAAiB,MAAjB;AACH;AArBI,OAtBsC;AA6C/C,MAAA,OA7C+C,qBA6CrC;AAAA;;AACN,6BAAS,GAAT,CAAa,YAAb,EAA2B,UAAC,IAAD,EAAU;AACjC,UAAA,KAAI,CAAC,eAAL,CAAqB,IAArB;AACH,SAFD;;AAGA,6BAAS,GAAT,CAAa,cAAb,EAA6B,UAAC,IAAD,EAAU;AACnC,UAAA,KAAI,CAAC,WAAL,CAAiB,IAAjB;AACH,SAFD;;AAGA,aAAK,QAAL,GAPM,CAOW;;AAEjB,aAAK,UAAL,GAAkB,KAAK,CAAC,IAAN,CAAW,KAAK,GAAL,CAAS,gBAAT,CAA0B,WAA1B,CAAX,EAAmD,MAArE;AACH;AAvD8C,KAAnD;;AA0DA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,KADX;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,IAAI,EAAE,YAHH;AAIH,UAAA,IAAI,EAAE,IAJH;AAKH,UAAA,GAAG,EAAE,IALF;AAMH,UAAA,MAAM,EAAE,IANL;AAMW;AACd,UAAA,UAAU,EAAE,IAPT;AAQH,UAAA,WAAW,EAAE,IARV;AAQe;AAClB,UAAA,WAAW,EAAE;AATV,SAAP;AAWH,OAbyB;AAc1B,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,WAAyB,KAAK,IAA9B,EAAP;AACH;AAHK,OAdgB;AAmB1B,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,kBAAU,kBAAW;AACjB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SARE;AASH,sBAAc,sBAAW;AACrB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AAbE,OAnBmB;AAkC1B,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,+BAAS,KAAT,CAAe,YAAf,EAA6B;AAAC,oBAAQ,KAAK,IAAd;AAAoB,mBAAO,KAAK,GAAhC;AAAqC,kBAAM,KAAK;AAAhD,WAA7B;AACH,SAHI;AAIL,QAAA,cAJK,4BAIY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SAXI;AAYL,QAAA,YAZK,0BAYU;AACX,eAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,SAdI;AAeL,QAAA,UAfK,wBAeQ;AACT,cAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,gBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,iBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,gBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,gBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,iBAAK,WAAL,GAAmB,WAAnB;AACA,iBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC;AACH;AACJ;AA1BI,OAlCiB;AA8D1B,MAAA,OA9D0B,qBA8DhB;AAAA;;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACA,aAAK,IAAL,GAAY,KAAK,KAAL,CAAW,IAAX,CAAgB,SAA5B;AACA,aAAK,GAAL,GAAW,KAAK,KAAL,CAAW,IAAX,CAAgB,YAAhB,CAA6B,MAA7B,CAAX;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,+BAAS,KAAT,CAAe,cAAf,EAA+B;AAAC,oBAAQ,MAAI,CAAC,IAAd;AAAoB,mBAAO,MAAI,CAAC,GAAhC;AAAqC,kBAAM,MAAI,CAAC;AAAhD,WAA/B;AACH,SAFD;AAGA,aAAK,UAAL;AACH;AAvEyB,KAA9B;;AA0EA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,qBAAc,EAAd;AADE,KAAR,EAEG,MAFH,oBAEsB,EAFtB,GAE4B,IAF5B;AAGH,GAxID;;AA0IA,MAAI,IAAI,CAAC,MAAL,GAAc,CAAlB,EAAqB;AACjB,IAAA,IAAI,CAAC,OAAL,CAAa,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC1B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,mBAA8B,KAA9B;AACA,MAAA,wBAAwB,CAAC,KAAD,CAAxB;AACH,KAHD;AAIH;AAEJ,CArJD;;eAuJe,uB;;;;;;;;;;;AC3Jf;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,CAAC,GAAD,EAAS;AACxB,SAAO,kBAAkB,CAAC,GAAD,CAAzB;AACH,CAFD;;AAIA,IAAM,aAAa,GAAG,SAAhB,aAAgB,GAAM;AAExB,MAAI,aAAa,GAAG,QAAQ,CAAC,gBAAT,CAA0B,gBAA1B,CAApB;;AAEA,MAAM,wBAAwB,GAAG,SAA3B,wBAA2B,CAAC,EAAD,EAAQ;AACrC,uBAAI,SAAJ,CAAc,wBAAd,EAAwC;AACpC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,WAAW,EAAE,CADX;AACc;AAChB,YAAA,UAAU,EAAE,IAFV;AAEgB;AAClB,YAAA,YAAY,EAAE,IAHZ;AAGkB;AACpB,YAAA,YAAY,EAAE,IAJZ;AAIkB;AACpB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAOF,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,QAAQ,EAAE,EARR;AASF,YAAA,OAAO,EAAE,EATP;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,SAAS,EAAE,EAXT;AAWa;AACf,YAAA,cAAc,EAAE,IAZd;AAYoB;AACtB,YAAA,aAAa,EAAE,IAbb;AAamB;AACrB,YAAA,QAAQ,EAAE,IAdR;AAeF,YAAA,UAAU,EAAE,IAfV;AAgBF,YAAA,UAAU,EAAE,IAhBV;AAiBF;AACA,YAAA,SAAS,EAAE,IAlBT;AAkBe;AACjB,YAAA,QAAQ,EAAE,KAnBR;AAoBF,YAAA,KAAK,EAAE,IApBL;AAoBW;AACb;AACA,qBAAO,eAtBL;AAuBF,YAAA,YAAY,EAAE;AAvBZ,WADH;AA0BH,UAAA,SAAS,EAAE;AA1BR,SAAP;AA4BH,OA9BmC;AA+BpC,MAAA,UAAU,EAAE;AACR,qCAA6B,2BADrB;AAER,2BAAmB,0CAFX;AAGR,yBAAiB,0BAHT;AAIR,sBAAc;AAJN,OA/BwB;AAqCpC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,SANK;AAON,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,IAAL,CAAU,YAAV,GAAyB,EAA7B,EAAiC;AAC7B,gBAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iCAAY,KAAK,IAAL,CAAU,YAAtB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAoD;AACvD,+BAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAnC,GAAkD,CAA5D,cAAiE,KAAK,IAAL,CAAU,YAA3E;AACH,aAFM,MAEA;AACH,+BAAW,KAAK,IAAL,CAAU,YAAV,IAA0B,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAlD,CAAD,GAAyD,CAAnE,cAAwE,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,WAA3G;AACH;AACJ,WARD,MAQO;AACH,mBAAO,KAAK,IAAL,CAAU,YAAjB;AACH;AACJ,SAnBK;AAoBN,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,KAAK,IAAL,CAAU,WAAjB;AACH,SAtBK;AAuBN,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,kBAAM,KAAN,CAAY,WAAnB;AACH;AAzBK,OArC0B;AAgEpC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,KAA3B,CADc,CAGd;;AACA,cAAI,KAAK,KAAL,CAAW,MAAX,IAAqB,CAAzB,EAA4B;AACxB,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,gBAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SAbE;AAcH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AACH,SAjBE;AAkBH,wBAAgB,uBAAW;AAAA;;AACvB,eAAK,UAAL;AACA,eAAK,UAAL,GAFuB,CAEJ;AACnB;AACA;;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,EAAtB,CALuB,CAOvB;;AACA,cAAI,MAAM,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AACxC,mBAAO,EAAE,CAAC,IAAH,IAAW,OAAlB;AACH,WAFY,EAEV,GAFU,CAEN,UAAA,EAAE,EAAI;AACT,mBAAO,EAAE,CAAC,KAAV;AACH,WAJY,CAAb;;AAMA,cAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,iBAAK,gBAAL,CAAsB,MAAtB;AACH,WAFD,MAEO;AACH;AACA,iBAAK,IAAL,CAAU,QAAV,GAAqB,EAArB,CAFG,CAGH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AAC3B,qBAAO,EAAE,CAAC,IAAH,IAAW,SAAlB;AACH,aAFD,EAEG,OAFH,CAEW,UAAA,IAAI,EAAI;AACf,cAAA,KAAI,CAAC,YAAL,CAAkB,KAAI,CAAC,IAAL,SAAlB,EAAmC,IAAI,CAAC,KAAxC;AACH,aAJD;AAKH,WAzBsB,CA2BvB;;;AACA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,mBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,WAFe,CAAhB;AAGA,eAAK,IAAL,CAAU,aAAV,GAA0B,SAAS,GAAG,SAAS,CAAC,KAAb,GAAqB,IAAxD;AAEH,SAnDE;AAoDH,QAAA,IAAI,EAAE,gBAAW;AACb,cAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACH,WAHD,MAGO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAmD;AACtD,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAHM,MAGA;AACH,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAVY,CAYb;AACA;;AACH,SAlEE;AAmEH,6BAAqB,4BAAW;AAC5B,eAAK,SAAL;AACH;AArEE,OAhE6B;AAwIpC,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SALI;AAML,QAAA,aANK,yBAMS,EANT,EAMa,CANb,EAMgB,IANhB,EAMsB;AACvB,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB,mBADwB,CAChB;AACX;;AACD,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAAtB;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,SAAvC;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,IAAI,KAAK,gBAAb,EAA+B;AAC3B,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,KAAV;AAAiB,wBAAQ,IAAzB;AAA+B,wBAAQ;AAAvC,eAA3C;AACH,aAFD,MAEO;AACH,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,OAAV;AAAmB,wBAAQ,IAA3B;AAAiC,wBAAQ;AAAzC,eAA3C;AACH;AACJ,WAND,MAMO;AACH,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;;AACD,UAAA,OAAO,CAAC,GAAR,CAAY,KAAK,IAAL,CAAU,OAAtB;AACH,SA7BI;AA8BL;AACA,QAAA,YA/BK,wBA+BQ,EA/BR,EA+BY,KA/BZ,EA+BmB,IA/BnB,EA+ByB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AACD,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,KAAT;AACH,WAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,eAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH,SAvCI;AAwCL;AACA,QAAA,SAzCK,uBAyCO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFQ,CAEmB;AAC9B,SA5CI;AA6CL,QAAA,gBA7CK,4BA6CY,MA7CZ,EA6CoB;AACrB,cAAI,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAP,CAAY,GAAZ,CAAD,CAAjC;AACA,cAAI,MAAM,oCAAV,CAFqB,CAGrB;;AACA,cAAI,IAAI,GAAG,IAAX;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,EAAE;AACJ,cAAA,KAAK,EAAE,QADH;AAEJ,cAAA,IAAI,EAAE,KAAK;AAFP;AADE,WAAlB,EAMK,IANL,CAMU,UAAS,QAAT,EAAmB;AACrB,YAAA,IAAI,CAAC,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,IAAT,CAAc,OAAnC;AACH,WARL,WASW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAXL;AAYH,SA/DI;AAgEL,QAAA,MAhEK,oBAgEI;AAAA;;AACL,cAAI,WAAW,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,QAApB,EAAlB;AACA,cAAI,KAAK,GAAE,KAAK,IAAL,CAAU,KAArB;AACA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,SAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAMA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAC9C,mBAAO,IAAI,CAAC,IAAL,IAAa,MAApB;AACH,WAFgB,EAEd,GAFc,CAEV,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJgB,EAId,QAJc,EAAjB;AAMA,cAAI,WAAW,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAC/C,mBAAO,IAAI,CAAC,IAAL,IAAa,OAApB;AACH,WAFiB,EAEf,GAFe,CAEX,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJiB,EAIf,QAJe,EAAlB;AAMA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,SAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;;AAMA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,SAAS,CAAC,KAAjB;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,WAA3B;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,GAAtB;;AACA,cAAI,KAAJ,EAAW;AACP,iBAAK,IAAL,CAAU,SAAV,IAAsB,OAAK,kBAAkB,CAAC,KAAD,CAA7C;AACH;;AACD,eAAK,IAAL,CAAU,SAAV,cAA0B,aAAa,KAAK,EAAlB,GAAuB,cAAc,aAArC,GAAqD,EAA/E,SAAoF,UAAU,KAAK,EAAf,GAAoB,WAAW,UAA/B,GAA4C,EAAhI,SAAqI,WAAW,KAAK,EAAhB,GAAqB,YAAY,WAAjC,GAA+C,EAApL,SAAyL,aAAa,KAAK,EAAlB,GAAuB,cAAc,aAArC,GAAqD,EAA9O,6BAAmQ,wBAAwB,EAA3R,mBAAsS,UAAtS;AAEH,SA7GI;AA+GL,QAAA,UA/GK,sBA+GM,CA/GN,EA+GS;AACV,cAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAnB;AACA,cAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAA1B;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AACA,UAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,UAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AACA,cAAI,KAAJ;;AACA,cAAI,CAAC,CAAC,MAAN,EAAc;AACV,YAAA,KAAK,GAAG,CAAC,CAAC,MAAF,CAAS,SAAjB;AACH,WAFD,MAEO;AACH,YAAA,KAAK,GAAG,CAAR;AACH;;AACD,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAlB;AAEA,UAAA,QAAQ,CAAC,aAAT,CAAuB,4BAAvB,EAAqD,KAArD,GAA6D,KAA7D;AACA,eAAK,UAAL;AACA,eAAK,UAAL,CAAgB,CAAhB;AACH,SAjII;AAkIL,QAAA,UAlIK,wBAkIQ;AACT,eAAK,SAAL,GAAiB,IAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,aAAT,CAAuB,sCAAvB,CAAjB;AACA,cAAI,UAAJ,EACI,UAAU,CAAC,SAAX,CAAqB,GAArB,CAAyB,SAAzB;AACP,SAxII;AAyIL,QAAA,aAzIK,2BAyIW;AACZ,eAAK,SAAL,GAAiB,KAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,aAAT,CAAuB,sCAAvB,CAAjB;AACA,cAAI,UAAJ,EACI,UAAU,CAAC,SAAX,CAAqB,MAArB,CAA4B,SAA5B;AACP,SA/II;AAgJL,QAAA,UAhJK,sBAgJM,KAhJN,EAgJa;AAAA;;AAEd,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,KAAK,GAAG,KAAH,GAAW,KAAK,IAAL,CAAU,KAApE;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,GAAG,CAAH,GAAO,KAAK,IAAL,CAAU,WAA9C;AAEA,eAAK,MAAL;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,cAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CAPc,CAQd;AACA;;AAEA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,OAAO,GAAG,EAAd;AACA,cAAI,IAAI,GAAG,EAAX;AACA,cAAI,KAAK,GAAG,EAAZ;AACA,cAAI,OAAO,GAAG,EAAd;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,oBAAO,IAAI,CAAC,IAAZ;AACI,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ,mBAAK,MAAL;AACI,gBAAA,IAAI,CAAC,IAAL,CAAU,IAAI,CAAC,KAAf;AACA;;AACJ,mBAAK,OAAL;AACI,gBAAA,KAAK,CAAC,IAAN,CAAW,IAAI,CAAC,KAAhB;AACA;;AACJ,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ;AACI;AAdR;AAgBH,WAjBD;AAmBA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AACA,cAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD,CAAhC;AACA,cAAI,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAN,CAAW,GAAX,CAAD,CAAjC;AACA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AAEA,cAAI,WAAW,GAAG;AACd,YAAA,CAAC,EAAE,KAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,IAAL,CAAU,KAA5B,GAAoC,IADzB;AAEd,YAAA,KAAK,EAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAAD,IAAmC,EAAnC,GAAwC,IAAxC,GAA+C,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,MAA9B,CAAqC,CAArC,KAA2C,GAA3C,GAAiD,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,KAA9B,CAAoC,CAApC,CAAjD,GAA0F,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAFlI;AAEiK;AAC/K,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAHrB;AAId,YAAA,QAAQ,EAAE,OAAO,IAAI,EAAX,GAAgB,IAAhB,GAAuB,OAJnB;AAKd,YAAA,KAAK,EAAE,QAAQ,IAAI,EAAZ,GAAiB,IAAjB,GAAwB,QALjB;AAMd,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UANrB;AAOd,YAAA,cAAc,EAAE,wBAAwB,EAP1B;AAQd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU;AARF,WAAlB;AAWA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,KAA3B;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,oBACC,WADD;AADI,WAAlB,EAKK,IALL,CAKU,UAAS,QAAT,EAAmB;AACrB;AACA;AACA;AACA,gBAAI,YAAJ,EAAkB,mBAAlB;;AACA,gBAAI,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAAtB,IAAgC,CAApC,EAAuC;AACnC,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AAEH,aAJD,MAKK;AAED,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAAtB;AACH;;AAED,gBAAI,QAAQ,CAAC,IAAT,CAAc,UAAd,IAA4B,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,MAAzB,GAAkC,CAAlE,EACA;AAAA,kBAuBgB,OAvBhB;;AAAA;AACI,oBAAI,WAAW,GAAG,EAAlB;AACA,gBAAA,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,OAAzB,CAAiC,UAAA,GAAG,EAAI;AACpC,sBAAI,aAAa,GAAG,QAAQ,CAAC,aAAT,CAAuB,GAAvB,CAApB;AACA,kBAAA,aAAa,CAAC,IAAd,GAAmB,GAAnB;AACA,kBAAA,aAAa,CAAC,SAAd,GAA0B,GAA1B;AACA,kBAAA,aAAa,CAAC,gBAAd,CAA+B,OAA/B,EAAwC,UAAU,CAAV,EAAa;AACjD,oBAAA,CAAC,CAAC,eAAF;AACA,oBAAA,IAAI,CAAC,UAAL,CAAgB,aAAa,CAAC,SAA9B;AACH,mBAHD;AAIA,kBAAA,WAAW,CAAC,IAAZ,CAAiB,aAAjB;AACH,iBATD,EAFJ,CAaI;;AACA,gBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,MAAM,EAAI;AAC3B,yBAAO,MAAM,CAAC,UAAd,EAA0B;AACtB,oBAAA,MAAM,CAAC,WAAP,CAAmB,MAAM,CAAC,UAA1B;AACH;AACJ,iBAJD;;AAdJ,2CAoBa,CApBb;AAqBQ,kBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE;AAAA,2BAAI,EAAE,CAAC,MAAH,CAAU,WAAW,CAAC,CAAD,CAArB,CAAJ;AAAA,mBAAvB;;AACA,sBAAI,CAAC,GAAG,CAAJ,GAAQ,WAAW,CAAC,MAAxB,EAAgC;AACxB,oBAAA,OAAO,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CADc;AAE5B,oBAAA,OAAO,CAAC,KAAR,CAAc,WAAd,GAA4B,KAA5B;AACA,oBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE;AAAA,6BAAI,EAAE,CAAC,MAAH,CAAU,OAAV,CAAJ;AAAA,qBAAvB;AACH;AA1BT;;AAoBI,qBAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAC,WAAW,CAAC,MAA9B,EAAsC,CAAC,EAAvC,EAA2C;AAAA,wBAAlC,CAAkC;AAO1C;;AACD,gBAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,yBAAI,OAAO,CAAC,SAAR,CAAkB,GAAlB,CAAsB,MAAtB,CAAJ;AAAA,iBAAnC;AA5BJ;AA8BC,aA/BD,MA+BO;AACH,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;AACH,aAjDoB,CAkDrB;AACA;AACA;AAEA;;;AACA,gBAAI,UAAU,IAAI,UAAU,CAAC,MAAX,GAAoB,CAAlC,IACA,MAAM,CAAC,SAAP,CAAiB,MAAM,CAAC,SAAP,CAAiB,MAAjB,GAAwB,CAAzC,EAA4C,KAA5C,IAAqD,gBADzD,CAC0E;AAD1E,cAEM;AAAE;AACJ,gBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAuB;AACnB,kBAAA,KAAK,EAAE,gBADY;AAEnB,kBAAA,IAAI,EAAE,eAFa;AAGnB,kBAAA,QAAQ,EAAE,QAHS;AAInB,kBAAA,MAAM,EAAE,UAJW;AAKnB,kBAAA,KAAK,EAAE,QAAQ,CAAC,IAAT,CAAc;AALF,iBAAvB;AAOH,eAjEoB,CAmErB;;;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAvC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAA/C;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,aAAL;AAEH,WA/EL,WAgFW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACA,YAAA,IAAI,CAAC,aAAL;AACH,WAnFL;AAoFH,SAtSI;AAuSL,QAAA,UAvSK,sBAuSM,GAvSN,EAuSW;AACZ,cAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA/C,EAAkD;AAC9C,iBAAK,IAAL,CAAU,WAAV;AACH,WAFD,MAEO,IAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAAzD,EAAqE;AACxE,iBAAK,IAAL,CAAU,WAAV;AACH,WAFM,MAEA;AACH;AACH;;AAED,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;;AACA,eAAK,UAAL;AACA,eAAK,UAAL;AACH,SAnTI;AAoTL,QAAA,eApTK,2BAoTW,IApTX,EAoTiB;AAClB,cAAI,IAAI,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,IAAI,EAAI;AACxC,mBAAO,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAAvB;AACH,WAFU,CAAX;;AAIA,cAAI,CAAC,IAAL,EAAW;AACP,iBAAK,IAAL,CAAU,SAAV,gCAA0B,KAAK,IAAL,CAAU,SAApC,IAA+C,IAA/C;AACH,WAFD,MAEO;AACH,iBAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,KAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,IAA5B,CAA3B,EAA6D,CAA7D;AACH;AACJ,SA9TI;AA+TL;AACA,QAAA,aAhUK,2BAgUW;AACZ,eAAK,MAAL;AACA,cAAI,GAAG,aAAM,MAAM,CAAC,QAAP,CAAgB,QAAtB,SAAiC,KAAK,IAAL,CAAU,SAA3C,CAAP;AACA,UAAA,OAAO,CAAC,SAAR,CAAkB,EAAlB,EAAqB,EAArB,EAAwB,GAAxB;AACH,SApUI;AAqUL;AACA,QAAA,QAtUK,sBAsUM;AAAA;;AACP,cAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAnB;AACA,cAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAA1B;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AACA,UAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,UAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AAGA,cAAI,MAAM,GAAG,MAAM,CAAC,QAAP,CAAgB,MAAhB,CAAuB,MAAvB,CAA8B,CAA9B,EAAiC,KAAjC,CAAuC,GAAvC,EAA4C,MAA5C,CAAmD,UAAA,IAAI,EAAI;AACpE,mBAAO,IAAI,IAAI,EAAf;AACH,WAFY,CAAb;AAIA,cAAI,WAAW,GAAG,EAAlB;AACA,cAAI,IAAJ;AAEA,UAAA,MAAM,CAAC,OAAP,CAAe,UAAA,KAAK,EAAI;AACpB,gBAAI,IAAI,GAAG,KAAK,CAAC,KAAN,CAAY,CAAZ,EAAe,KAAK,CAAC,OAAN,CAAc,GAAd,CAAf,CAAX;AACA,gBAAI,OAAO,GAAG,KAAK,CAAC,KAAN,CAAY,KAAK,CAAC,OAAN,CAAc,GAAd,IAAqB,CAAjC,CAAd;AAEA,gBAAI,KAAK,GAAG,EAAZ;;AACA,gBAAI,IAAI,IAAI,MAAZ,EAAoB;AAChB,cAAA,IAAI,GAAG,QAAQ,CAAC,OAAD,CAAf;AACH,aAFD,MAEO,IAAI,IAAI,IAAI,gBAAZ,EAA8B;AACjC,kBAAI,OAAO,IAAI,OAAX,IAAsB,OAAO,IAAI,KAArC,EAA4C;AACxC;AACH,eAFD,MAEO;AACH,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,MAAI,CAAC,IAAL,CAAU;AAHd,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;AACJ,aAfM,MAeA,IAAI,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAA5B,EAA+B;AAClC,kBAAI,YAAY,GAAG,OAAO,CAAC,KAAR,CAAc,GAAd,CAAnB;AACA,cAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,IAAI,EAAI;AACzB,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,kBAAkB,CAAC,IAAD;AAHtB,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH,eAXD;AAYH,aAdM,MAcA,IAAI,IAAI,CAAC,iBAAL,MAA4B,SAAhC,EAA2C;AAC9C,cAAA,KAAK,GAAG;AACJ,wBAAQ,SADJ;AAEJ,yBAAS,wBAFL;AAGJ,wBAAQ;AAHJ,eAAR;AAMA,cAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH,aAXM,MAYF,IAAI,IAAI,CAAC,iBAAL,MAA4B,SAAhC,EAA2C;AAC5C,cAAA,KAAK,GAAG;AACJ,wBAAQ,IADJ;AAEJ,yBAAS,OAFL;AAGJ,wBAAQ,kBAAkB,CAAC,OAAD;AAHtB,eAAR;AAMA,cAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;;AAED,YAAA,MAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,WAApB;AACH,WA9DD;AAgEA,cAAI,IAAJ,EACI,KAAK,IAAL,CAAU,WAAV,GAAwB,IAAxB;AAEP,SAzZI;AA0ZL,QAAA,WA1ZK,uBA0ZO,EA1ZP,EA0ZW;AACZ,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AACrC,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,4BAAvB,EAAqD,qBAArD,GAA6E,GAA7E,GAAmF,MAAM,CAAC,OAA1F,GAAoG,GAA9G;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAE,GADO;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKP,GALO,CAAV;AAMH,SAnaI;AAoaL,QAAA,SApaK,uBAoaO;AACR;AACA;AACA;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,IAAI,CAAC,IAAL,CAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,EAAnC,CAAvB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA1B,GAA8B,IAA9B,GAAqC,KAA5D;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAApC,GAAiD,IAAjD,GAAwD,KAA/E;AACH,SA3aI;AA4aL,QAAA,IA5aK,kBA4aE;AAAA;;AACH,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,CAAjC,KAAuC,EAAvC,GAA4C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,KAAjC,CAAuC,CAAvC,CAA5C,GAAwF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAApI;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CAHG,CAG2D;AAE9D;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,EAAD,EAAK,GAAL,EAAa;AACxC,gBAAI,EAAE,KAAK,MAAI,CAAC,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA;AACrC,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,GAAxB;;AACA,YAAA,MAAI,CAAC,UAAL;;AACA,YAAA,MAAI,CAAC,UAAL;AACH,WALD;;AAMA,+BAAS,GAAT,CAAa,YAAb,EAA2B,UAAC,IAAD,EAAU;AACjC,YAAA,MAAI,CAAC,eAAL,CAAqB,IAArB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,iBAAb,EAAgC,UAAC,KAAD,EAAQ,IAAR,EAAiB;AAC7C,gBAAI,IAAI,IAAI,eAAZ,EAA6B;AACzB;AACA,kBAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAnB;AACA,kBAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAA1B;AACA,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;AACA,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACA,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;;AACA,cAAA,MAAI,CAAC,UAAL;;AACA,cAAA,MAAI,CAAC,UAAL,CAAgB,KAAhB;AACH;AACJ,WAZD;;AAaA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,EAAjB;AACH,WAFD,EAlCG,CAsCH;;;AACA,eAAK,IAAL,CAAU,OAAV,GAAoB,MAAM,CAAC,8BAAP,CAAsC,OAA1D;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,8BAAP,CAAsC,YAA/D;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,8BAAP,CAAsC,OAAtC,CAA8C,MAAvE,CAzCG,CA0CH;AACA;AACA;AAEA;;AACA,eAAK,IAAL,CAAU,iBAAV,GAA8B,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,EAApC,GAAyC,KAAzC,GAAiD,IAA/E,CA/CG,CAiDH;;AACA,eAAK,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,CAApC,GAAwC,IAAxC,GAA+C,KAApE;;AACA,UAAA,MAAM,CAAC,UAAP,GAAoB,YAAM;AACrB,YAAA,MAAI,CAAC,QAAL;AACJ,WAFD;;AAIA,cAAI,MAAM,CAAC,sBAAP,IAAiC,MAAM,CAAC,UAA5C,EAAwD;AACpD,iBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,uBAAS,MAAM,CAAC,2BAAjB;AAA8C,sBAAQ,SAAtD;AAAiE,sBAAQ,MAAM,CAAC;AAAhF,aAA3C;AACH;AACJ;AAteI,OAxI2B;AAgnBpC,MAAA,OAhnBoC,qBAgnB1B;AACN,aAAK,IAAL;AACA,aAAK,SAAL,GAFM,CAGN;AACA;AACA;AACA;AACA;AACA;AACH;AAznBmC,KAAxC;;AA4nBA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,UAAT,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OANyB;AAO1B,MAAA,UAAU,EAAE;AACR,yBAAiB;AADT,OAPc;AAU1B,MAAA,QAAQ,qSAVkB;AAe1B,MAAA,OAAO,EAAE,EAfiB;AAkB1B,MAAA,OAlB0B,qBAkBhB,CAET;AApByB,KAA9B,EA7nBqC,CAopBrC;;;AACA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,WAAT,CADuB;AAE9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OAN6B;AAO9B,MAAA,QAAQ,iTAPsB;AAY9B,MAAA,OAAO,EAAE;AACL,QAAA,UADK,sBACM,MADN,EACa;AACd,iBAAO,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,EAAF,IAAQ,MAAM,CAAC,EAAnB;AAAA,WAA1B,MAAqD,SAA5D;AACH;AAHI,OAZqB;AAkB9B,MAAA,OAlB8B,qBAkBpB,CAET;AApB6B,KAAlC,EArpBqC,CA4qBrC;;;AACA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,YAApB,EAAkC,WAAlC,CADuB;AAE9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,KAAK,UADb;AAEH,UAAA,YAAY,EAAE,KAFX;AAGH,UAAA,EAAE,EAAE,IAHD;AAIH,UAAA,MAAM,EAAE,IAJL;AAIW;AACd,UAAA,UAAU,EAAE,IALT;AAMH,UAAA,WAAW,EAAE,IANV;AAMe;AAClB,UAAA,WAAW,EAAE;AAPV,SAAP;AASH,OAZ6B;AAa9B,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,SAHK;AAIN,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,kBAAkB,CAAC,KAAK,OAAL,CAAa,GAAd,CAAzB;AACH,SANK;AAON,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,KAAK,OAAL,CAAa,GAAb,GAAmB,KAAK,OAAL,CAAa,GAAb,CAAiB,OAAjB,CAAyB,eAAzB,EAA0C,gBAA1C,CAAnB,GAAiF,IAAxF;AACH,SATK;AAUN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,UADU;AAElB,wBAAY,KAAK,OAAL,CAAa,OAAb,CAAqB,KAArB,CAA2B,GAA3B,EAAgC,CAAhC,EAAmC,IAAnC,EAFM;AAGlB,qBAAS,KAAK,OAAL,CAAa,IAHJ;AAIlB,2BAAe,KAAK,OAAL,CAAa,OAJV;AAKlB,wBAAY,KAAK,OAAL,CAAa,QALP;AAMlB,0BAAc,KAAK,OAAL,CAAa;AANT,WAAf,CAAP;AAQH;AAnBK,OAboB;AAkC9B,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,0BAAkB,yBAAW;AACzB,cAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,KAA+B,CAAlC,EAAoC;AAChC,iBAAK,SAAL,GAAiB,KAAjB;AACH;AACJ,SARE;AASH,mBAAW,mBAAW;AAAA;;AAClB;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,MAAI,CAAC,EAAL,GAAU,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,YAAA,MAAI,CAAC,YAAL,GAAoB,MAAI,CAAC,KAAL,CAAW,QAAX,WAAuB,MAAI,CAAC,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH,WAHD;AAIH,SAfE;AAgBH,kBAAU,kBAAW;AACjB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SApBE;AAqBH,sBAAc,sBAAW;AACrB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AAzBE,OAlCuB;AA6D9B,MAAA,QAAQ,ilHA7DsB;AAwG9B,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,+BAAS,KAAT,CAAe,YAAf,EAA6B;AAAC,oBAAQ,KAAK,OAAL,CAAa,IAAtB;AAA4B,mBAAO,KAAK,OAAL,CAAa,GAAhD;AAAqD,kBAAM,KAAK,OAAL,CAAa;AAAxE,WAA7B;AACH,SAHI;AAIL,QAAA,cAJK,4BAIY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,YAFsB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SAXI;AAYL,QAAA,YAZK,0BAYU;AACX,eAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,SAdI;AAeL,QAAA,UAfK,wBAeQ;AACT,cAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B;AACA,gBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,OAAnC,CAA2C,KAA3C,EAAkD,IAAlD,EAAwD,KAAxD,CAA8D,MAA9D,CAAd;AACA,iBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,gBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,GAA0B,OAA1B,CAAkC,KAAlC,EAAyC,GAAzC,CAAvB;AAAqE;AACrE,gBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,GAAwB,OAAxB,CAAgC,KAAhC,EAAuC,GAAvC,CAAlB;AAEA,iBAAK,WAAL,GAAmB,WAAnB;AACA,iBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC,SAA2D,WAAW,IAAI,EAAf,GAAoB,EAApB,GAAyB,GAApF;AACH;AACJ;AA3BI,OAxGqB;AAqI9B,MAAA,OArI8B,qBAqIpB;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACA,aAAK,UAAL;AAEA,YAAI,IAAI,GAAG,IAAX;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,cAAI,OAAO,GAAG,IAAI,CAAC,IAAL,CAAU,OAAxB;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,KAAK,GAAG,IAAI,CAAC,OAAL,CAAa,KAAzB;AACA,gBAAI,KAAK,GAAG,IAAI,CAAC,IAAL,CAAU,KAAtB;AACA,gBAAI,GAAG,8BAAuB,kBAAkB,CAAC,KAAD,CAAzC,gBAAsD,kBAAkB,CAAC,KAAD,CAAxE,gBAAqF,kBAAkB,CAAC,OAAD,CAAvG,CAAP;AACA,gBAAI,UAAU,GAAG,IAAI,CAAC,GAAL,CAAS,gBAAT,CAA0B,GAA1B,CAAjB;AACA,YAAA,UAAU,CAAC,OAAX,CAAmB,UAAA,EAAE;AAAA,qBAAI,EAAE,CAAC,gBAAH,CAAoB,OAApB,EAA6B,UAAC,CAAD;AAAA,uBAClD,kBAAM,GAAN,CAAU,GAAV,EACC,IADD,CACM,UAAS,QAAT,EAAmB,CACxB,CAFD,CADkD;AAAA,eAA7B,CAAJ;AAAA,aAArB;AAKH;AACJ,SAdD;AAgBH;AA3J6B,KAAlC;;AA8JA,uBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,MAAA,KAAK,EAAE,CAAC,MAAD,CADiB;AAExB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAE,IADL,CAEH;;AAFG,SAAP;AAIH,OAPuB;AAQxB,MAAA,KAAK,EAAE;AACH,0BAAkB,yBAAW;AACzB,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,UAAA,IAAI,EAAI;AAChC,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,eAAiD,kBAAkB,CAAC,IAAI,CAAC,GAAN,CAAnE,WAAN;AACH,WAFD;AAGA,eAAK,MAAL,GAAc,MAAd;AACH;AAPE,OARiB;AAiBxB,MAAA,OAAO,EAAE,CACL;AACA;AACA;AACA;AACA;AACA;AACA;AAPK,OAjBe;AA0BxB,MAAA,OA1BwB,qBA0Bd,CACN;AACA;AACA;AACH;AA9BuB,KAA5B;;AAiCA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,2BAAoB,EAApB,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,0BAG4B,EAH5B,GAGkC,IAHlC;AAIH,GAh3BD;;AAk3BA,MAAI,aAAa,CAAC,MAAd,GAAuB,CAA3B,EAA8B;AAC1B,IAAA,aAAa,CAAC,OAAd,CAAsB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACnC,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,yBAAoC,KAApC;AACA,MAAA,wBAAwB,CAAC,KAAD,CAAxB;AACH,KAHD;AAIH,GA33BuB,CA63BxB;AACA;;AAEH,CAh4BD;;eAk4Be,a;;;;;;;;;;;AC74Bf;;AACA;;AACA;;AACA;;;;AAEA,IAAM,MAAM,GAAG,SAAT,MAAS,GAAM;AACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,CAAhB;;AAEA,MAAI,iBAAiB,GAAG,SAApB,iBAAoB,CAAC,EAAD,EAAQ;AAC5B;AACA,uBAAI,SAAJ,CAAc,iBAAd,EAAiC;AAC7B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,EADR;AAEH,UAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QAFnB;AAGH,UAAA,KAAK,EAAE;AAHJ,SAAP;AAKH,OAP4B;AAQ7B,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,OARmB;AAa7B,MAAA,KAAK,EAAE;AACH,QAAA,WAAW,EAAE,uBAAW;AACpB,eAAK,QAAL,GAAgB,KAAK,WAArB;AACH;AAHE,OAbsB;AAkB7B,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW;AACZ,eAAK,SAAL,GAAiB,CAAjB;AACH,SAHI;AAIL,QAAA,SAJK,qBAIK,CAJL,EAIQ;AACT,cAAI,SAAS,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,MAAxC;;AAEA,cAAI,SAAS,KAAK,KAAK,SAAvB,EAAkC;AAC9B;AACA,iBAAK,YAAL,CAAkB,SAAlB;AACA,iBAAK,GAAL,CAAS,aAAT,CAAuB,0BAAvB,EAAmD,SAAnD,CAA6D,MAA7D,CAAoE,QAApE;AAEA,iBAAK,GAAL,CAAS,aAAT,wBAAuC,SAAvC,QAAqD,SAArD,CAA+D,GAA/D,CAAmE,QAAnE;AACH;AACJ,SAdI;AAeL,QAAA,aAfK,2BAeW;AAEZ,cAAI,CAAC,QAAL,EAAe;AACX;AACA,gBAAI,mBAAmB,GAAG,KAAK,GAAL,CAAS,gBAAT,CAA0B,mCAA1B,CAA1B;AACA,YAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAC,IAAD,EAAU;AAClC,cAAA,IAAI,CAAC,KAAL,GAAa,IAAb;AACH,aAFD;AAGH;AACJ,SAxBI;AAyBL;AACA,QAAA,WA1BK,yBA0BS;AAEV,cAAI,KAAK,QAAT,EAAmB,CAAE;AACpB,WADD,MACO;AAAE;AACL;AACA,gBAAI,OAAO,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,EAAwC,OAAxC,CAAgD,MAA9D;AACA,iBAAK,SAAL,GAAiB,OAAjB;AACA,iBAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,EAAwC,SAAxC,CAAkD,GAAlD,CAAsD,QAAtD;AACH;AACJ;AAnCI,OAlBoB;AAuD7B,MAAA,OAvD6B,qBAuDnB;AAAA;;AACN;AACA,aAAK,WAAL,GAFM,CAEc;AACpB;;AACA,6BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,CAAD,EAAO;AACjC,UAAA,KAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,SAFD;;AAGA,6BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,CAAD,EAAO;AAClC,UAAA,KAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,SAFD;AAGH;AAjE4B,KAAjC,EAF4B,CAsE5B;;;AACA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,KAAK,EAAE,CAAC,WAAD,EAAc,UAAd,CADuB;AAE9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,EADR;AAEH,UAAA,QAAQ,EAAE;AAFP,SAAP;AAIH,OAP6B;AAQ9B,MAAA,KAAK,EAAE;AACH,QAAA,SAAS,EAAE,qBAAW;AAClB,eAAK,QAAL,GAAgB,KAAK,SAAL,IAAkB,KAAK,SAAvB,GAAmC,IAAnC,GAA0C,KAA1D;AACH;AAHE,OARuB;AAa9B,MAAA,OAAO,EAAE;AACL,QAAA,SADK,qBACK,CADL,EACQ;AACT,+BAAS,KAAT,CAAe,gBAAf,EAAiC,KAAK,SAAtC;AACH;AAHI,OAbqB;AAkB9B,MAAA,OAlB8B,qBAkBpB;AACN,aAAK,SAAL,GAAiB,KAAK,GAAL,CAAS,OAAT,CAAiB,MAAlC;AACH;AApB6B,KAAlC,EAvE4B,CA8F5B;;;AACA,uBAAI,SAAJ,CAAc,yBAAd,EAAyC;AACrC,MAAA,KAAK,EAAE,CAAC,WAAD,EAAc,UAAd,CAD8B;AACH;AAClC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,OAAO,EAAE,EADN;AAEH,UAAA,QAAQ,EAAE,KAFP;AAEc;AACjB,UAAA,MAAM,EAAE,KAHL,CAGY;;AAHZ,SAAP;AAKH,OARoC;AASrC,MAAA,KAAK,EAAE;AACH,QAAA,SAAS,EAAE,mBAAS,GAAT,EAAc;AACrB,eAAK,QAAL,GAAgB,KAAK,OAAL,IAAgB,GAAhB,GAAsB,IAAtB,GAA6B,KAA7C;AACH,SAHE;AAIH,QAAA,QAAQ,EAAE,oBAAW;AACjB,cAAI,CAAC,KAAK,QAAV,EAAoB;AAChB,iBAAK,MAAL,GAAc,KAAd,CADgB,CACK;AAErB;;AACA,gBAAI,KAAK,QAAT,EAAmB;AAEnB,kBAAI,WAAW,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,mCAAvB,CAAlB;AACA,kBAAI,aAAa,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,+BAAvB,EAAwD,qBAAxD,GAAgF,MAApG;AAEA,cAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,gBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,gBAAA,qBAAqB,CAAC,YAAW;AAC7B,kBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,iBAFoB,CAArB;AAGH,eAPoB,CAArB;AASA,cAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,gBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,eAFD;AAIA,mBAAK,WAAL;AACC;AACJ,WAxBD,MAwBO;AACH;AACA,iBAAK,MAAL,GAAc,IAAd;AACH;AACJ;AAjCE,OAT8B;AA4CrC,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW;AACZ,cAAI,YAAY,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,OAA3B,CAAmC,KAAtD;;AAEA,+BAAS,KAAT,CAAe,eAAf,EAAgC,YAAhC;;AAEA,cAAI,KAAK,QAAT,EAAmB;AACf;AACA,iBAAK,eAAL,CAAqB,CAArB;AACH;AACJ,SAVI;AAWL;AACA,QAAA,eAZK,2BAYW,CAZX,EAYc;AACf,cAAI,WAAW,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,mCAAvB,CAAlB;AACA,cAAI,aAAa,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,+BAAvB,EAAwD,qBAAxD,GAAgF,MAApG;;AAEA,cAAI,KAAK,MAAL,IAAe,IAAnB,EAAyB;AACrB,iBAAK,MAAL,GAAc,KAAd;AAEA,YAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,cAAA,qBAAqB,CAAC,YAAW;AAC7B,gBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,eAFoB,CAArB;AAGH,aAPoB,CAArB;AASA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,aAFD;AAIH,WAhBD,MAgBO;AACH,iBAAK,MAAL,GAAc,IAAd;AACA,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,aAFD;AAGH;AACJ,SAvCI;AAwCL,QAAA,WAxCK,yBAwCS;AACV,cAAI,SAAS,GAAG,KAAK,GAAL,CAAS,SAAzB;AACA,cAAI,YAAY,GAAG,MAAM,CAAC,OAA1B,CAFU,CAGV;AACA;;AACA,cAAI,SAAS,GAAG,YAAhB,EAA8B;AAC1B,gBAAI,MAAM,GAAG,KAAK,GAAL,CAAS,qBAAT,GAAiC,GAAjC,GAAuC,MAAM,CAAC,OAA3D;AACA,YAAA,UAAU,CAAC,YAAW;AAClB,cAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,gBAAA,GAAG,EAAG,MAAM,GAAG,EADH;AAEZ,gBAAA,QAAQ,EAAE;AAFE,eAAhB;AAIH,aALS,EAKR,GALQ,CAAV;AAMH;AACJ,SAtDI;AAwDL,QAAA,UAxDK,wBAwDQ;AACT,cAAI,KAAK,QAAT,EAAmB,CACf;AACH,WAFD,MAEO;AACH;AAEA;AACA,gBAAI,iBAAiB,GAAG,KAAK,GAAL,CAAS,gBAAT,CAA0B,mCAA1B,CAAxB;AACA,YAAA,iBAAiB,CAAC,OAAlB,CAA0B,UAAC,IAAD,EAAU;AAChC,cAAA,IAAI,CAAC,KAAL,GAAa,EAAb;AACH,aAFD;AAGH;AACJ;AApEI,OA5C4B;AAkHrC,MAAA,OAlHqC,qBAkH3B;AACN,YAAI,UAAU,GAAG,KAAK,GAAL,CAAS,OAAT,CAAiB,KAAlC;AACA,aAAK,OAAL,GAAe,UAAf;AACA,aAAK,UAAL;AACH;AAtHoC,KAAzC,EA/F4B,CAwN5B;;;AACA;AAEA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,oBAAa,EAAb,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,mBAGqB,EAHrB,GAG2B,IAH3B;AAIH,GA/ND;;AAiOA,MAAI,OAAO,CAAC,MAAR,GAAiB,CAArB,EAAwB;AACpB,IAAA,OAAO,CAAC,OAAR,CAAgB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC7B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,kBAA6B,KAA7B;AACA,MAAA,iBAAiB,CAAC,KAAD,CAAjB;AACH,KAHD;AAIH;AACJ,CA1OD;;eA4Oe,M;;;;;;;;;;;ACjPf;;;;AAEA,IAAM,QAAQ,GAAG,IAAI,kBAAJ,EAAjB;eAEe,Q;;;;;;;;;;;ACmCf;;AACA;;;;;;;;;;;;;;AAEA,IAAM,OAAO,GAAG,SAAV,OAAU,OAA6F;AAAA,MAAd,IAAc,uEAAP,EAAO;;AAAA,uBAA3F,IAA2F;AAAA,MAA3F,IAA2F,0BAApF,OAAoF;AAAA,MAA3E,KAA2E,QAA3E,KAA2E;AAAA,MAA9D,QAA8D,QAApE,IAAoE;AAAA,MAApD,QAAoD,QAApD,OAAoD;AAAA,MAA3C,KAA2C,QAA3C,KAA2C;AAAA,MAApC,OAAoC,QAApC,OAAoC;AAAA,MAAxB,OAAwB;;AAAA,6BAUrG,IAVqG,CAErG,cAFqG;AAAA,MAErG,cAFqG,qCAEpF,IAFoF;AAAA,8BAUrG,IAVqG,CAGrG,qBAHqG;AAAA,MAGrG,qBAHqG,sCAG7E,IAH6E;AAAA,8BAUrG,IAVqG,CAIrG,mBAJqG;AAAA,MAIrG,mBAJqG,sCAI/E,IAJ+E;AAAA,MAKrG,GALqG,GAUrG,IAVqG,CAKrG,GALqG;AAAA,qBAUrG,IAVqG,CAMrG,MANqG;AAAA,MAMrG,MANqG,6BAM5F,KAN4F;AAAA,2BAUrG,IAVqG,CAOrG,YAPqG;AAAA,MAOvF,aAPuF,mCAOvE,EAPuE;AAAA,MAQrG,YARqG,GAUrG,IAVqG,CAQrG,YARqG;AAAA,2BAUrG,IAVqG,CASrG,YATqG;AAAA,MASrG,YATqG,mCAStF,GATsF;;AAAA,2BAY9C,aAZ8C,CAYjG,IAZiG;AAAA,MAY3F,QAZ2F,mCAYhF,EAZgF;AAAA,6BAY9C,aAZ8C,CAY5E,MAZ4E;AAAA,MAY5E,MAZ4E,qCAYnE,EAZmE;AAAA,MAY/D,YAZ+D,GAY9C,aAZ8C,CAY/D,YAZ+D;AAczG;AACI,IAAA,IAAI,EAAJ,IADJ;AAEI,IAAA,KAAK;AACD,MAAA,OAAO,EAAE,MADR;AAED,MAAA,UAAU,EAAE,MAFX;AAGD,MAAA,kBAAkB,EAAE;AAAE,QAAA,IAAI,EAAE,OAAR;AAAiB,mBAAS;AAA1B,OAHnB;AAID,MAAA,yBAAyB,EAAE;AAAE,QAAA,IAAI,EAAE,OAAR;AAAiB,mBAAS;AAA1B,OAJ1B;AAKD,MAAA,uBAAuB,EAAE;AAAE,QAAA,IAAI,EAAE,OAAR;AAAiB,mBAAS;AAA1B;AALxB,OAME,KANF,CAFT;AAUI,IAAA,IAAI,EAAE,gBAAW;AACb,UAAM,SAAS,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAT,CAAc,IAAd,CAA9B;;AACA,UAAI,IAAI;AACJ,QAAA,GAAG,EAAE,KAAK,OAAL,IAAgB,GADjB;AAEJ,QAAA,MAAM,EAAE,KAAK,UAAL,IAAmB,MAFvB;AAGJ,QAAA,YAAY,EAAZ,YAHI;AAIJ,QAAA,cAAc,EAAd,cAJI;AAKJ,QAAA,mBAAmB,EAAnB,mBALI;AAMJ,QAAA,qBAAqB,EAArB,qBANI;AAOJ,QAAA,YAAY,EAAE,KAAK,gBAAL,IAAyB,YAPnC;AAQJ,QAAA,IAAI,EAAE,IARF;AASJ,QAAA,MAAM,EAAN,MATI;AAUJ,QAAA,QAAQ,EAAR;AAVI,SAWD,SAXC,CAAR;;AAcA,UAAI,KAAK,kBAAL,KAA4B,SAAhC,EAA2C;AACvC,QAAA,IAAI,CAAC,cAAL,GAAsB,KAAK,kBAA3B;AACH;;AAED,UAAI,KAAK,uBAAL,KAAiC,SAArC,EAAgD;AAC5C,QAAA,IAAI,CAAC,mBAAL,GAA2B,KAAK,uBAAhC;AACH;;AAED,UAAI,KAAK,yBAAL,KAAmC,SAAvC,EAAkD;AAC9C,QAAA,IAAI,CAAC,qBAAL,GAA6B,KAAK,yBAAlC;AACH;;AAED,aAAO,IAAP;AACH,KAvCL;AAwCI,IAAA,OAAO,EAAE,mBAAW;AAChB,MAAA,QAAO,IAAI,QAAO,CAAC,IAAR,CAAa,IAAb,CAAX;;AACA,UAAI,KAAK,cAAT,EAAyB;AACrB,aAAK,KAAL;AACH;AACJ,KA7CL;AA8CI,IAAA,KAAK;AACD,MAAA,MAAM,EAAC;AACH,QAAA,OAAO,EAAE,mBAAW;AAChB,cAAI,KAAK,mBAAT,EAA8B;AAC1B,iBAAK,aAAL;AACH;AACJ,SALE;AAMH,QAAA,IAAI,EAAE;AANH,OADN;AASD,MAAA,QAAQ,EAAE;AACN,QAAA,OAAO,EAAE,mBAAW;AAChB,cAAI,KAAK,qBAAT,EAAgC;AAC5B,iBAAK,aAAL;AACH;AACJ,SALK;AAMN,QAAA,IAAI,EAAE;AANA;AATT,OAiBE,KAjBF,CA9CT;AAiEI,IAAA,OAAO;AACH,MAAA,aAAa,EAAE,oBAAS,YAAU;AAAE,aAAK,KAAL;AAAc,OAAnC,EAAqC,YAArC,CADZ;AAEH,MAAA,KAAK,EAAE,eAAS,WAAT,EAAsB,OAAtB,EAA+B;AAClC,YAAM,KAAK,GAAG,IAAd;;AAEA,YAAI,KAAK,GAAL,IAAY,KAAK,YAArB,EAAmC;AAC/B,iBAAO;AACH,YAAA,GAAG,EAAE,KAAK,GADP;AAEH,YAAA,MAAM,EAAE,KAAK,MAFV;AAGH,YAAA,MAAM,EAAE,KAAK,MAHV;AAIH,YAAA,IAAI,EAAE,KAAK;AAJR,aAKA,KAAK,YALL,MAMA,OANA,GAOJ,IAPI,CAOC,UAAU,QAAV,EAAoB;AACxB,gBAAI,CAAC,WAAD,IAAgB,WAAW,CAAC,QAAD,CAA/B,EAA0C;AACtC,cAAA,KAAK,CAAC,IAAN,GAAa,QAAQ,CAAC,IAAtB;AACH;AACJ,WAXM,CAAP;AAYH;AACJ;AAnBE,OAoBA,OApBA;AAjEX,KAuFO,OAvFP;AAyFH,CAvGD;;eAyGe,O;;;;;;;;;;;ACnJf;;AACA;;;;AAEO,IAAM,QAAQ,GAAG;AACpB,EAAA,KAAK,EAAE,CAAC,MAAD,EAAS,OAAT,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC,UAAnC,CADa;AAEpB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,EAAE,EAAE,IADD;AAEH,MAAA,SAAS,EAAE;AAFR,KAAP;AAIH,GAPmB;AAQpB;AACA;AACA,EAAA,QAAQ,kkBAVY;AAuBpB,EAAA,KAAK,EAAE;AACH,oBAAgB,uBAAW;AACvB,WAAK,UAAL;AACH,KAHE;AAIH,qBAAiB,wBAAW;AACxB,WAAK,iBAAL;AACH;AANE,GAvBa;AA+BpB,EAAA,QAAQ,EAAE;AACN,IAAA,WAAW,EAAE,uBAAW;AACpB,aAAO,IAAI,CAAC,SAAL,CAAe;AAClB,gBAAQ,KAAK,IAAL,CAAU,YADA;AAElB,kBAAU,KAAK,QAAL,IAAiB,IAFT;AAGlB,iBAAS,kBAAkB,CAAC,KAAK,EAAN;AAHT,OAAf,CAAP;AAKH;AAPK,GA/BU;AAwCpB,EAAA,OAAO,EAAE;AACL,IAAA,aADK,yBACS,EADT,EACa,CADb,EACgB,IADhB,EACsB;AACvB,2BAAS,KAAT,CAAe,eAAf,EAAgC,EAAhC,EAAoC,CAApC,EAAuC,IAAvC;AACH,KAHI;AAIL,IAAA,UAJK,wBAIQ;AAAA;;AACT,UAAI,IAAI,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,EAAE,EAAI;AACpC,eAAO,EAAE,CAAC,KAAH,IAAY,KAAI,CAAC,EAAxB;AACH,OAFU,CAAX;AAGA,WAAK,SAAL,GAAiB,IAAI,GAAG,IAAH,GAAU,KAA/B;AACH,KATI;AAUL,IAAA,iBAVK,+BAUe;AAAA;;AAChB,UAAI,KAAK,IAAL,KAAc,SAAlB,EAA6B;AACzB;AACA,YAAI,IAAI,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,EAAE,EAAI;AACpC;AACA;AACA,iBAAO,EAAE,CAAC,KAAH,IAAY,MAAI,CAAC,EAAxB;AACH,SAJU,CAAX;AAKA,aAAK,SAAL,GAAiB,IAAI,GAAG,IAAH,GAAU,KAA/B,CAPyB,CAQzB;AACH;AACJ;AArBI,GAxCW;AA+DpB,EAAA,OA/DoB,qBA+DV;AACN,SAAK,EAAL,GAAU,kBAAkB,CAAC,KAAK,KAAL,CAAW,KAAX,CAAiB,KAAlB,CAA5B,CADM,CAEN;;AACA,SAAK,UAAL,GAHM,CAIN;;AACA,QAAI,KAAK,KAAL,CAAW,KAAX,CAAiB,OAAjB,CAAyB,UAA7B,EAAyC;AACrC,WAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,KAAL,CAAW,KAAX,CAAiB,OAAjB,CAAyB,UAApD;AACH;AACJ;AAvEmB,CAAjB;;AA0EA,IAAM,SAAS,GAAG;AACrB,EAAA,KAAK,EAAE,CAAC,MAAD,EAAS,aAAT,CADc;AAErB,EAAA,UAAU,EAAE;AACR,qBAAiB;AADT,GAFS;AAKrB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,MAAM,EAAG,KAAK,WAAL,GAAmB,IAAnB,GAA0B,KADhC;AACwC;AAC3C,MAAA,WAAW,EAAE,IAFV;AAEgB;AACnB,MAAA,QAAQ,EAAE,IAHP;AAIH,MAAA,SAAS,EAAE,IAJR;AAKH,MAAA,eAAe,EAAE;AALd,KAAP;AAOH,GAboB;AAcrB,EAAA,KAAK,EAAE;AACH,IAAA,WAAW,EAAE,uBAAW;AACpB,UAAI,KAAK,WAAL,IAAoB,IAAxB,EAA8B;AAC1B,aAAK,QAAL,GAAgB,KAAK,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,UAA9C;AACA,aAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,YAA/C;AACH;AACJ,KANE;AAOH,qBAAiB;AACb,MAAA,IAAI,EAAE,IADO;AAEb,MAAA,OAFa,qBAEH;AACN,aAAK,SAAL,CAAe,YAAM;AACjB;;;;;;;;AAQH,SATD;AAUH;AAbY;AAPd,GAdc;AAqCrB,EAAA,OAAO,EAAE;AACL,IAAA,WADK,yBACS;AACV,WAAK,eAAL;AACH,KAHI;AAKL,IAAA,eALK,6BAKa;AACd,UAAI,WAAW,GAAG,KAAK,KAAL,CAAW,cAA7B;AACA,UAAI,aAAa,GAAG,KAAK,KAAL,CAAW,cAAX,CAA0B,qBAA1B,GAAkD,MAAtE;;AAEA,UAAI,KAAK,MAAL,IAAe,IAAnB,EAAyB;AACrB,aAAK,MAAL,GAAc,KAAd;AAEA,QAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,UAAA,qBAAqB,CAAC,YAAW;AAC7B,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,WAFoB,CAArB;AAGH,SAPoB,CAArB;AASA,QAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,SAFD;AAIH,OAhBD,MAgBO;AACH,aAAK,MAAL,GAAc,IAAd;AACA,QAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,QAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,SAFD;AAGH;AACJ,KAhCI;AAiCL,IAAA,YAjCK,0BAiCU;AACX,WAAK,eAAL,GAAuB,CAAC,KAAK,eAA7B;AACH,KAnCI;AAoCL,IAAA,gBApCK,4BAoCY,KApCZ,EAoCmB;AAAA;;AACpB,aADoB,CAEpB;;AACA,UAAI,KAAJ,EAAW;AACP,aAAK,WAAL,GAAmB,KAAnB;AACH,OAFD,MAEO;AACH,aAAK,WAAL,GAAmB,KAAK,WAAL,IAAoB,IAApB,GAA2B,IAA3B,GAAkC,CAAC,KAAK,WAA3D;AACH;;AAED,UAAI,WAAW,GAAG,CAAlB;AACA,UAAI,SAAS,GAAG,KAAK,KAAL,CAAW,cAA3B;;AAEA,UAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AACnB,aAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,CAApB,EAAuB,CAAC,EAAxB,EAA4B;AACxB,cAAI,EAAE,GAAG,MAAI,CAAC,GAAL,CAAS,aAAT,iCAAgD,CAAhD,OAAT;;AACA,cAAI,UAAU,GAAG,EAAE,CAAC,qBAAH,GAA2B,MAA5C;AACA,cAAI,QAAQ,GAAG,MAAM,CAAC,gBAAP,CAAwB,EAAxB,CAAf;AACA,cAAI,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAV,CAA3B;AAEA,UAAA,WAAW,GAAG,WAAW,GAAG,UAAd,GAA2B,UAAzC;AACH;;AACD,QAAA,WAAW,GAAG,WAAW,GAAG,CAA5B,CATmB,CASY;AAClC,OAVD;;AAYA,MAAA,QAAQ;;AAER,UAAI,KAAK,WAAL,IAAoB,IAAxB,EAA8B;AAC1B,QAAA,SAAS,CAAC,KAAV,CAAgB,SAAhB,GAA4B,WAAW,GAAG,IAA1C;AACH,OAFD,MAEO;AACH,QAAA,SAAS,CAAC,KAAV,CAAgB,SAAhB,GAA4B,MAA5B;AACH;AACJ;AAnEI,GArCY;AA0GrB,EAAA,OA1GqB,qBA0GX,CAET;AA5GoB,CAAlB;;AA+GA,IAAM,wBAAwB,GAAG;AACpC,EAAA,KAAK,EAAE,CAAC,MAAD,CAD6B;AAEpC,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO,EAAP;AAEH,GALmC;AAMpC,EAAA,QAAQ,EAAE;AACN,IAAA,SAAS,EAAE,qBAAW;AAClB,uBAAU,KAAK,IAAL,SAAV;AACH;AAHK,GAN0B;AAWpC,EAAA,QAAQ,4fAX4B;AAqBpC,EAAA,OAAO,EAAE;AACL,IAAA,YADK,wBACQ,CADR,EACW;AACZ,UAAI,IAAI,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,IAAnC;AACA,UAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,KAApC;;AACA,2BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,KAAjD,EAAwD,IAAxD;AACH;AALI,GArB2B;AA4BpC,EAAA,OA5BoC,qBA4B1B,CAET;AA9BmC,CAAjC;;AAiCA,IAAM,OAAO,GAAG;AACnB,EAAA,KAAK,EAAE,CAAC,MAAD,EAAS,KAAT,CADY;AAEnB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,IAAI,EAAE,IADH;AAEH,MAAA,QAAQ,EAAE,KAFP;AAGH,MAAA,QAAQ,EAAE;AAHP,KAAP;AAKH,GARkB;AASnB,EAAA,KAAK,EAAE;AACH,wBAAoB,2BAAW;AAC3B,WAAK,QAAL,GAAgB,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,GAA9B,GAAoC,IAApC,GAA2C,KAA3D;AACH;AAHE,GATY;AAcnB,EAAA,QAAQ,uGAdW;AAiBnB,EAAA,OAAO,EAAE;AACL,IAAA,YADK,wBACQ,GADR,EACa;AACd,UAAG,GAAG,KAAK,KAAX,EAAkB;AACd,6BAAS,KAAT,CAAe,gBAAf,EAAiC,KAAK,IAAL,SAAjC,EAAkD,GAAlD;;AACA,6BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;AACH,OAHD,MAGO;AACH;AACH;AACJ;AARI,GAjBU;AA2BnB,EAAA,OA3BmB,qBA2BT;AACN,SAAK,QAAL,GAAgB,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,GAA9B,GAAoC,IAApC,GAA2C,KAA3D;AACH;AA7BkB,CAAhB;;AAgCA,IAAM,UAAU,GAAG;AACtB,EAAA,KAAK,EAAE,CAAC,MAAD,CADe;AAEtB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,QAAQ,EAAE;AADP,KAAP;AAGH,GANqB;AAOtB,EAAA,QAAQ,EAAE;AACN,IAAA,SAAS,EAAE,qBAAW;AAClB,uBAAU,KAAK,IAAL,SAAV;AACH;AAHK,GAPY;AAYtB,EAAA,UAAU,EAAE;AACR,gBAAY;AADJ,GAZU;AAetB,EAAA,KAAK,EAAE;AACH,wBAAoB,2BAAW;AAC3B,WAAK,QAAL,GAAgB,EAAhB;AACA,WAAK,SAAL;;AACA,UAAI,KAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,IAAL,CAAU,UAAtC,EAAkD;AAC9C,6BAAS,KAAT,CAAe,gBAAf,EAAiC,KAAK,IAAL,SAAjC,EAAkD,CAAlD;AACH;AACJ,KAPE;AAQH,uBAAmB,0BAAW;AAC1B,WAAK,QAAL,GAAgB,EAAhB;AACA,WAAK,SAAL;;AACA,2BAAS,KAAT,CAAe,gBAAf,EAAiC,KAAK,IAAL,SAAjC,EAAkD,CAAlD;AACH;AAZE,GAfe;AA6BtB,EAAA,QAAQ,yJA7Bc;AAkCtB,EAAA,OAAO,EAAE;AACL,IAAA,SADK,uBACO;AACR,UAAI,KAAK,IAAL,CAAU,UAAV,IAAwB,CAA5B,EAA+B;AAC3B;AACA,aAAI,IAAI,IAAI,GAAG,CAAf,EAAkB,IAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAhD,EAAmD,IAAI,EAAvD,EAA2D;AACvD,eAAK,QAAL,CAAc,IAAd,CAAmB,IAAnB;AACH;AACJ,OALD,MAKO;AACH,YAAG,KAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAlD,EAAqD;AACjD;AACA,eAAI,IAAI,KAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAtC,EAAyC,KAAI,GAAG,KAAK,IAAL,CAAU,WAAV,GAAwB,CAA/B,IAAoC,KAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAA3G,EAA8G,KAAI,EAAlH,EAAsH;AAClH,iBAAK,QAAL,CAAc,IAAd,CAAmB,KAAnB,EADkH,CAElH;AACH;AACJ,SAND,MAMO;AACH;AACA,eAAI,IAAI,MAAI,GAAG,KAAK,IAAL,CAAU,WAAzB,EAAsC,MAAI,GAAG,KAAK,IAAL,CAAU,WAAV,GAAwB,CAA/B,IAAoC,MAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAxG,EAA2G,MAAI,EAA/G,EAAmH;AAC/G,iBAAK,QAAL,CAAc,IAAd,CAAmB,MAAnB;AACH;;AACD,eAAK,QAAL,CAAc,IAAd,CAAmB,KAAnB;;AACA,eAAI,IAAI,MAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAtC,EAAyC,MAAI,GAAG,KAAK,IAAL,CAAU,UAAV,GAAuB,CAAvE,EAA0E,MAAI,EAA9E,EAAkF;AAC9E,iBAAK,QAAL,CAAc,IAAd,CAAmB,MAAnB;AACH;AACJ;AACJ;AACJ;AAzBI,GAlCa;AA6DtB,EAAA,OA7DsB,qBA6DZ;AACN,SAAK,SAAL;AACH;AA/DqB,CAAnB;;;;;;;;;;;AC7PP;;AACA;;;;AAEA,IAAM,WAAW,GAAG,SAAd,WAAc,GAAM;AAEtB,MAAI,WAAW,GAAG,QAAQ,CAAC,aAAT,CAAuB,0BAAvB,CAAlB;;AAEA,MAAI,sBAAsB,GAAG,SAAzB,sBAAyB,GAAM;AAC/B,uBAAI,SAAJ,CAAc,qBAAd,EAAqC;AACjC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,kBAAM,KAAN,CAAY,KADvB;AAEH,UAAA,gBAAgB,EAAE;AAFf,SAAP;AAIH,OANgC;AAOjC,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,KAAnB;AACH,SAHK;AAIN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,KADU;AAElB,wBAAY,YAFM;AAGlB,sBAAU,iBAHQ;AAIlB,qBAAS,KAAK;AAJI,WAAf,CAAP;AAMH;AAXK,OAPuB;AAoBjC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAzB;AACA,eAAK,OAAL;AACH;AAJE,OApB0B;AA0BjC,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW;AACZ,4BAAM,MAAN,CAAa,UAAb,EAAyB,CAAC,CAAC,MAAF,CAAS,KAAlC;;AACA,eAAK,QAAL;AACH,SAJI;AAKL,QAAA,OALK,qBAKK;AACN,cAAI,MAAM,GAAG,KAAK,KAAL,CAAW,MAAxB,CADM,CAEN;;AACA,cAAI,YAAY,GAAG,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,IAAuC,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,IAA5E,GAAmF,IAAtG;AACA,eAAK,gBAAL,GAAwB,YAAxB;AACH,SAVI;AAWL,QAAA,QAXK,sBAWM;AACP,cAAI,IAAI,GAAG,KAAK,GAAL,CAAS,aAAT,0BAAwC,kBAAM,KAAN,CAAY,KAApD,YAAiE,KAAK,GAAL,CAAS,aAAT,0BAAwC,kBAAM,KAAN,CAAY,KAApD,UAA+D,SAAhI,GAA4I,IAAvJ;AACA,eAAK,gBAAL,GAAwB,IAAxB;AACH,SAdI;AAeL,QAAA,QAfK,sBAeM;AACP,cAAI,MAAM,GAAG,KAAK,KAAL,CAAW,MAAxB;AACA,cAAI,YAAY,GAAG,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,IAAxD;AACA,cAAI,KAAK,aAAO,YAAY,CAAC,MAAb,GAAsB,CAAvB,GAA4B,CAAlC,OAAT,CAHO,CAG2C;;AAClD,UAAA,MAAM,CAAC,KAAP,CAAa,QAAb,GAAwB,KAAxB;AACH;AApBI,OA1BwB;AAgDjC,MAAA,OAhDiC,qBAgDvB;AAAA;;AACN,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,KAAI,CAAC,QAAL;;AACA,UAAA,KAAI,CAAC,QAAL;AACH,SAHD;AAIA,aAAK,OAAL;AACH;AAtDgC,KAArC;;AAyDA,uBAAI,SAAJ,CAAc,qBAAd,EAAqC;AACjC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,kBAAM,KAAN,CAAY,WADvB;AAEH,UAAA,gBAAgB,EAAE,IAFf;AAGH,UAAA,SAAS,EAAE,EAHR;AAIH,UAAA,KAAK,EAAE;AAJJ,SAAP;AAMH,OARgC;AASjC,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,KADU;AAElB,wBAAY,YAFM;AAGlB,sBAAU,UAHQ;AAIlB,qBAAS,KAAK;AAJI,WAAf,CAAP;AAMH;AARK,OATuB;AAmBjC,MAAA,KAAK,EAAE,EAnB0B;AAsBjC,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW;AACZ,cAAI,GAAG,GAAG,CAAC,CAAC,MAAF,CAAS,KAAnB;AACA,cAAI,EAAE,GAAG,KAAK,KAAL,CAAW,MAApB;AACA,cAAI,IAAI,GAAG,EAAE,CAAC,OAAH,CAAW,EAAE,CAAC,aAAd,EAA6B,OAA7B,CAAqC,IAAhD;;AACA,cAAI,IAAJ,EAAU;AACN,YAAA,QAAQ,CAAC,MAAT,8BAAsC,IAAtC;AACH;;AACD,eAAK,QAAL;AACA,UAAA,MAAM,CAAC,QAAP,CAAgB,IAAhB,GAAuB,GAAvB;AACH,SAVI;AAWL,QAAA,OAXK,qBAWK;AACN,cAAI,IAAI,GAAG,KAAK,GAAL,CAAS,aAAT,0BAAwC,kBAAM,KAAN,CAAY,WAApD,YAAuE,KAAK,GAAL,CAAS,aAAT,0BAAwC,kBAAM,KAAN,CAAY,WAApD,UAAqE,SAA5I,GAAwJ,IAAnK;AACA,eAAK,gBAAL,GAAwB,IAAxB;AACH,SAdI;AAeL,QAAA,QAfK,sBAeM;AACP,cAAI,MAAM,GAAG,KAAK,KAAL,CAAW,MAAxB;AACA,cAAI,YAAY,GAAG,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,IAAxD;AACA,cAAI,KAAK,aAAO,YAAY,CAAC,MAAb,GAAsB,CAAvB,GAA4B,CAAlC,OAAT,CAHO,CAG0C;;AACjD,UAAA,MAAM,CAAC,KAAP,CAAa,QAAb,GAAwB,KAAxB;AACH;AApBI,OAtBwB;AA6CjC,MAAA,OA7CiC,qBA6CvB;AAAA;;AACN,aAAK,OAAL;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,MAAI,CAAC,QAAL;AACH,SAFD;AAGH;AAlDgC,KAArC;;AAqDA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE;AADE,KAAR,EAEG,MAFH,6BAEsC,IAFtC;AAGH,GAlHD;;AAoHA,MAAI,WAAJ,EAAiB;AACb,IAAA,sBAAsB;AACzB;AAEJ,CA5HD;;eA8He,W;;;;;;;;;;;ACjIf;;AACA;;AACA;;;;AAEA,IAAM,OAAO,GAAG,SAAV,OAAU,GAAM;AAElB,MAAI,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,CAAZ;;AACA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAI,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,EAAD,EAAQ;AAC3B,uBAAI,SAAJ,CAAc,mBAAd,EAAmC;AAC/B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,EADP;AAEH,UAAA,SAAS,EAAE;AAFR,SAAP;AAIH,OAN8B;AAO/B,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV;AACA,eAAK,MAAL,CAAY,IAAZ,CACI,mBAAW,QAAX,CAAoB,KAAK,QAAzB,EAAmC,KAAK,SAAxC,CADJ,EAEI,mBAAW,IAFf,EAGI,mBAAW,OAHf;AAKH;AARI,OAPsB;AAiB/B,MAAA,OAjB+B,qBAiBrB;AACN,aAAK,QAAL,GAAgB,KAAK,GAAL,CAAS,aAAT,CAAuB,wBAAvB,EAAiD,OAAjD,CAAyD,QAAzE;AACA,aAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,IAAX,GAAkB,KAAK,KAAL,CAAW,IAAX,CAAgB,SAAlC,GAA8C,IAA/D;AACH;AApB8B,KAAnC;;AAuBA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,4BAAqB,EAArB;AADE,KAAR,EAEG,MAFH,2BAE6B,EAF7B,GAEmC,IAFnC;AAGH,GA3BD;;AA6BA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,0BAAqC,KAArC;AACA,MAAA,gBAAgB,CAAC,KAAD,CAAhB;AACH,KAHD;AAIH;AACJ,CAxCD;;eA0Ce,O;;;;;;;;;;;AC1Cf;;AACA;;AACA;;;;AANA;;;AAQA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,IAAM,aAAa,GAAG,SAAhB,aAAgB,GAAM;AACxB,MAAI,QAAQ,GAAG,IAAI,kBAAJ,CAAQ;AACnB,IAAA,OAAO,EAAE;AACL,MAAA,YADK,wBACQ,OADR,EACiB;AAClB,aAAK,MAAL,CAAY,IAAZ,CACI,qBAAa,QAAb,CAAsB,OAAtB,CADJ,EAEI,qBAAa,IAFjB,EAGI,qBAAa,OAHjB,EAII,qBAAa,MAJjB;AAMH;AARI;AADU,GAAR,CAAf;AAaA,MAAI,SAAS,GAAG,EAAhB;AAEA,EAAA,QAAQ,CAAC,gBAAT,CAA0B,YAA1B,EAAwC,OAAxC,CAAgD,UAAC,IAAD,EAAU;AACtD,QAAI,IAAI,GAAG;AACP,iBAAW,IAAI,CAAC,OAAL,CAAa,OADjB;AAEP,iBAAW,IAAI,CAAC;AAFT,KAAX;AAIA,IAAA,SAAS,CAAC,IAAV,CAAe,IAAf;AACH,GAND;;AAQA,MAAI,SAAJ,EAAe;AACX,IAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,UAAC,CAAD,EAAO;AACtC,UAAI,CAAC,CAAC,MAAF,CAAS,YAAT,CAAsB,MAAtB,CAAJ,EAAmC;AAC/B,YAAI,MAAM,GAAG,CAAC,CAAC,MAAF,CAAS,YAAT,CAAsB,MAAtB,CAAb;;AAEA,aAAK,IAAI,CAAC,GAAC,CAAX,EAAc,CAAC,GAAG,SAAS,CAAC,MAA5B,EAAoC,CAAC,EAArC,EAAyC;AACrC,cAAI,MAAM,CAAC,QAAP,YAAoB,SAAS,CAAC,CAAD,CAAT,CAAa,OAAjC,EAAJ,EAAiD;AAC7C,YAAA,CAAC,CAAC,cAAF;AAEA,YAAA,QAAQ,CAAC,YAAT,CAAsB,SAAS,CAAC,CAAD,CAAT,CAAa,OAAnC;AACA,mBAAO,KAAP;AACH;AACJ;AACJ;AACJ,KAbD;AAcH;AACJ,CAxCD;;eA0Ce,a;;;;;;;;;;;ACpDf;;AACA;;AACA;;AACA;;;;AAEA,IAAM,WAAW,GAAG,SAAd,WAAc,GAAM;AAEtB,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,gBAA1B,CAAd;;AAEA,MAAM,sBAAsB,GAAG,SAAzB,sBAAyB,CAAC,EAAD,EAAQ;AACnC,uBAAI,SAAJ,CAAc,uBAAd,EAAuC;AACnC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,UAAU,EAAE,IADT;AAEH,UAAA,UAAU,EAAE,IAFT;AAGH,UAAA,OAAO,EAAE,IAHN;AAIH,UAAA,YAAY,EAAE,EAJX;AAKH,UAAA,aAAa,EAAE,CALZ;AAMH,UAAA,YAAY,EAAE,IANX,CAMgB;;AANhB,SAAP;AAQH,OAVkC;AAWnC,MAAA,KAAK,EAAE;AACH,QAAA,aAAa,EAAE,yBAAW,CAEzB;AAHE,OAX4B;AAgBnC,MAAA,OAAO,EAAE;AACL,QAAA,IADK,kBACE;AAAA;;AACH;AACA;AACA,cAAI,KAAK,GAAL,CAAS,gBAAT,CAA0B,+BAA1B,EAA2D,MAA3D,GAAoE,CAAxE,EAA2E;AACvE,iBAAK,OAAL,GAAe,IAAf,CADuE,CAGvE;;AACA,iBAAK,GAAL,CAAS,gBAAT,CAA0B,+BAA1B,EAA2D,OAA3D,CAAmE,UAAC,IAAD,EAAO,KAAP,EAAiB;AAChF,cAAA,IAAI,CAAC,OAAL,CAAa,EAAb,GAAkB,KAAK,GAAG,CAA1B,CADgF,CAEhF;;AACA,cAAA,KAAI,CAAC,YAAL,CAAkB,IAAlB,CAAuB;AACnB,gBAAA,GAAG,EAAE,IAAI,CAAC;AADS,eAAvB;AAGH,aAND;AAOH,WAXD,MAWO;AACH;AACA,iBAAK,GAAL,CAAS,aAAT,CAAuB,+BAAvB,EAAwD,OAAxD,CAAgE,EAAhE,GAAqE,CAArE;AACH;;AAED,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,KAAX,GAAmB,KAAK,KAAL,CAAW,KAAX,CAAiB,SAApC,GAAgD,IAApE;AACH,SArBI;AAsBL,QAAA,iBAtBK,6BAsBa,EAtBb,EAsBiB;AAClB,eAAK,aAAL,GAAqB,EAArB;AACH;AAxBI,OAhB0B;AA0CnC,MAAA,OA1CmC,qBA0CzB;AAAA;;AACN,aAAK,IAAL,GADM,CAEN;;AACA,6BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,UAAA,MAAI,CAAC,iBAAL,CAAuB,EAAvB;AACH,SAFD;AAGH;AAhDkC,KAAvC;;AAmDA,uBAAI,SAAJ,CAAc,qBAAd,EAAqC;AACjC,MAAA,KAAK,EAAE,CAAC,eAAD,CAD0B;AAEjC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,EAAE,EAAE,IADD;AAEH,UAAA,QAAQ,EAAE;AAFP,SAAP;AAIH,OAPgC;AAQjC,MAAA,KAAK,EAAE;AACH,QAAA,aAAa,EAAE,yBAAW;AACtB,eAAK,QAAL,GAAgB,KAAK,aAAL,IAAsB,KAAK,EAA3B,GAAgC,IAAhC,GAAuC,KAAvD;AACH;AAHE,OAR0B;AAajC,MAAA,OAAO,EAAE,EAbwB;AAgBjC,MAAA,OAhBiC,qBAgBvB;AAAA;;AACN,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,MAAI,CAAC,EAAL,GAAU,MAAI,CAAC,GAAL,CAAS,OAAT,CAAiB,EAA3B;AACA,UAAA,MAAI,CAAC,QAAL,GAAgB,MAAI,CAAC,aAAL,IAAsB,MAAI,CAAC,EAA3B,GAAgC,IAAhC,GAAuC,KAAvD;AACH,SAHD;AAIH;AArBgC,KAArC;;AAwBA,uBAAI,SAAJ,CAAc,0BAAd,EAA0C;AACtC,MAAA,KAAK,EAAE,CAAC,cAAD,EAAiB,eAAjB,CAD+B;AAEtC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OALqC;AAMtC,MAAA,QAAQ,oRAN8B;AAWtC,MAAA,OAAO,EAAE,EAX6B;AActC,MAAA,OAdsC,qBAc5B,CAET;AAhBqC,KAA1C;;AAmBA,uBAAI,SAAJ,CAAc,8BAAd,EAA8C;AAC1C,MAAA,KAAK,EAAE,CAAC,OAAD,EAAU,IAAV,EAAgB,eAAhB,CADmC;AAE1C,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE;AADP,SAAP;AAGH,OANyC;AAO1C,MAAA,QAAQ,EAAE;AACN,QAAA,QAAQ,EAAE,oBAAW;AACjB,gCAAe,KAAK,KAApB;AACH;AAHK,OAPgC;AAY1C,MAAA,KAAK,EAAE;AACH,QAAA,aAAa,EAAE,yBAAW;AACtB,eAAK,QAAL,GAAgB,KAAK,aAAL,IAAsB,KAAK,EAA3B,GAAgC,IAAhC,GAAuC,KAAvD;AACH;AAHE,OAZmC;AAiB1C,MAAA,QAAQ,uLAjBkC;AAoB1C,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,EAArC;AACH;AAJI,OApBiC;AA0B1C,MAAA,OA1B0C,qBA0BhC;AACN,aAAK,QAAL,GAAgB,KAAK,aAAL,IAAsB,KAAK,EAA3B,GAAgC,IAAhC,GAAuC,KAAvD;AACH;AA5ByC,KAA9C;;AA+BA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,2BAAoB,EAApB,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,0BAG4B,EAH5B,GAGkC,IAHlC;AAIH,GAlID;;AAoIA;;AAEA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,yBAAoC,KAApC;AACA,MAAA,sBAAsB,CAAC,KAAD,CAAtB;AACH,KAHD;AAIH;AAEJ,CAjJD;;eAmJe,W;;;;;;;;;;;ACxJf;;AACA;;;;AAEA,IAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AAEnB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAT,CAAuB,YAAvB,CAAlB;;AAEA,MAAI,eAAe,GAAG,SAAlB,eAAkB,GAAM;AACxB,uBAAI,SAAJ,CAAc,WAAd,EAA2B;AACvB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACJ,UAAA,UAAU,EAAE;AADR,SAAP;AAGH,OALsB;AAMvB,MAAA,OANuB,qBAMb;AAAA;;AACN,aAAK,GAAL,CAAS,gBAAT,EAA2B,UAAC,EAAD,EAAQ;AAC/B,UAAA,KAAI,CAAC,UAAL,GAAkB,EAAlB;AACH,SAFD;AAGH;AAVsB,KAA3B;;AAaA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,YAAD,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACJ,UAAA,QAAQ,EAAE,KADN;AAEJ,UAAA,SAAS,EAAE,KAFP;AAGJ,UAAA,EAAE,EAAE;AAHA,SAAP;AAKH,OARyB;AAS1B,MAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,sBAAW;AACnB,eAAK,QAAL,GAAgB,KAAK,UAAL,IAAmB,KAAK,EAAxB,GAA6B,IAA7B,GAAoC,KAApD;AACH,SAHE;AAIH,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,SAAL,IAAkB,KAAK,QAA3B,EAAqC;AACjC,iBAAK,SAAL;AACH,WAFD,MAEO;AACH,iBAAK,UAAL;AACH;AACJ,SAVE;AAWH,QAAA,QAAQ,EAAE,oBAAW;AACjB,cAAI,KAAK,QAAT,EAAmB;AACf,iBAAK,SAAL;AACH,WAFD,MAEO;AACH,iBAAK,UAAL;AACH;AACJ;AAjBE,OATmB;AA4B1B,MAAA,OAAO,EAAE;AACP,QAAA,YADO,0BACQ;AACX,eAAK,OAAL,CAAa,KAAb,CAAmB,gBAAnB,EAAqC,KAAK,QAAL,GAAgB,IAAhB,GAAuB,KAAK,EAAjE,EADW,CAEb;AACD,SAJM;AAKP,QAAA,SALO,uBAKK;AACV;AACA,eAAK,SAAL,GAAiB,IAAjB;AACD,SARM;AASP,QAAA,UATO,wBASM;AACX;AACA,eAAK,SAAL,GAAiB,KAAjB;AACD,SAZM;AAaP,QAAA,SAbO,uBAaK;AACV,eAAK,KAAL,CAAW,KAAX,CAAiB,IAAjB;AACD,SAfM;AAgBP,QAAA,UAhBO,wBAgBM;AACX,eAAK,KAAL,CAAW,KAAX,CAAiB,KAAjB;AACD,SAlBM;AAmBP,QAAA,IAnBO,kBAmBA;AACH,eAAK,EAAL,GAAU,KAAK,CAAC,IAAN,CAAW,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,CAAX,EAA0D,OAA1D,CAAkE,KAAK,GAAvE,CAAV;AACH;AArBM,OA5BiB;AAmD1B,MAAA,OAnD0B,qBAmDhB;AACN,aAAK,IAAL;AACH;AArDyB,KAA9B;;AAwDA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE;AADE,KAAR,EAEG,MAFH,eAEwB,IAFxB;AAGH,GAzED;;AA2EA,MAAI,SAAJ,EAAe;AACX,IAAA,eAAe;AAClB;AAEJ,CAnFD;;eAqFe,Q;;;;;;;;;;;ACxFf;;AACA;;AACA;;;;AAEO,IAAM,QAAQ,GAAG;AACpB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,SAAS,EAAE,EADR;AAEH,MAAA,QAAQ,EAAE;AAFP,KAAP;AAIH,GANmB;AAOpB,EAAA,OAAO,EAAE;AACL,IAAA,YADK,wBACQ,CADR,EACW;AACZ,WAAK,SAAL,GAAiB,CAAjB;AACH,KAHI;AAIL,IAAA,SAJK,qBAIK,CAJL,EAIQ;AACT,UAAI,SAAS,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,MAAxC;;AAEA,UAAI,SAAS,KAAK,KAAK,SAAvB,EAAkC;AAC9B;AACA,aAAK,YAAL,CAAkB,SAAlB;AACA,aAAK,GAAL,CAAS,aAAT,CAAuB,uBAAvB,EAAgD,SAAhD,CAA0D,MAA1D,CAAiE,QAAjE;AAEA,aAAK,GAAL,CAAS,aAAT,wBAAuC,SAAvC,QAAqD,SAArD,CAA+D,GAA/D,CAAmE,QAAnE;AACH;AACJ,KAdI;AAeL,IAAA,aAfK,yBAeS,GAfT,EAec;AACf,WAAK,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;;AACA,UAAI,CAAC,KAAK,QAAV,EAAoB;AAChB;AACA,YAAI,mBAAmB,GAAG,KAAK,GAAL,CAAS,gBAAT,CAA0B,6BAA1B,CAA1B;AACA,QAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAC,IAAD,EAAU;AAClC,UAAA,IAAI,CAAC,KAAL,GAAa,IAAb;AACH,SAFD;AAGH;AACJ,KAxBI;AAyBL;AACA,IAAA,WA1BK,yBA0BS;AAAA;;AACV;AACA;AACA,UAAI,GAAG,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAV;AACA,WAAK,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AAEA,MAAA,GAAG,CAAC,gBAAJ,CAAqB,QAArB,EAA8B,YAAM;AAChC,QAAA,KAAI,CAAC,aAAL,CAAmB,GAAnB;AACH,OAFD;;AAKA,UAAI,KAAK,QAAT,EAAmB;AAAE;AACjB,YAAI,OAAO,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,IAA0C,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,EAAwC,OAAxC,CAAgD,MAA1F,GAAmG,IAAjH;AACA,aAAK,SAAL,GAAiB,OAAjB;AACH,OAHD,MAGO;AAAE;AACL;AACA,YAAI,QAAO,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,IAA0C,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,EAAwC,OAAxC,CAAgD,MAA1F,GAAmG,IAAjH;;AACA,aAAK,SAAL,GAAiB,QAAjB;;AACA,YAAI,KAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,CAAJ,EAA6C;AACzC,eAAK,GAAL,CAAS,aAAT,CAAuB,eAAvB,EAAwC,SAAxC,CAAkD,GAAlD,CAAsD,QAAtD;AACH;AACJ;AACJ;AAhDI,GAPW;AAyDpB,EAAA,OAzDoB,qBAyDV;AAAA;;AACN,SAAK,WAAL,GADM,CACc;AACpB;;AACA,yBAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,CAAD,EAAO;AACjC,MAAA,MAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,KAFD;;AAGA,yBAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,CAAD,EAAO;AAClC,MAAA,MAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,KAFD;AAGH;AAlEmB,CAAjB;;AAqEA,IAAM,QAAQ,GAAG;AACpB,EAAA,KAAK,EAAE,CAAC,WAAD,EAAc,UAAd,CADa;AAEpB,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,SAAS,EAAE,EADR;AAEH,MAAA,QAAQ,EAAE,KAFP;AAGH,MAAA,KAAK,EAAE,IAHJ;AAIH,MAAA,KAAK,EAAE;AAJJ,KAAP;AAMH,GATmB;AAUpB,EAAA,QAAQ,EAAE;AACN,IAAA,WAAW,EAAE,uBAAW;AACpB,aAAO,IAAI,CAAC,SAAL,CAAe;AAClB,gBAAQ,OADU;AAElB,oBAAY,QAFM;AAGlB,kBAAU,MAHQ;AAIlB,iBAAS,KAAK,KAJI;AAKlB,cAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAA3B,cAAwC,KAAK,KAA7C;AALY,OAAf,CAAP;AAOH;AATK,GAVU;AAqBpB,EAAA,KAAK,EAAE;AACH,IAAA,SAAS,EAAE,qBAAW;AAClB,WAAK,QAAL,GAAgB,KAAK,SAAL,IAAkB,KAAK,SAAvB,GAAmC,IAAnC,GAA0C,KAA1D;AACH;AAHE,GArBa;AA0BpB,EAAA,OAAO,EAAE;AACL,IAAA,SADK,qBACK,CADL,EACQ;AACT,2BAAS,KAAT,CAAe,gBAAf,EAAiC,KAAK,SAAtC;AACH,KAHI;AAIL,IAAA,IAJK,kBAIE;AACH,WAAK,KAAL,GAAa,KAAK,GAAL,CAAS,SAAtB,CADG,CAEH;;AACA,WAAK,KAAL,GAAa,KAAK,CAAC,SAAN,CAAgB,KAAhB,CAAsB,IAAtB,CAA2B,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAA3B,EAA6E,OAA7E,CAAqF,KAAK,GAA1F,IAAiG,CAA9G;AACH;AARI,GA1BW;AAoCpB,EAAA,OApCoB,qBAoCV;AACN,SAAK,SAAL,GAAiB,KAAK,GAAL,CAAS,OAAT,CAAiB,MAAlC;AACA,SAAK,IAAL;AACH;AAvCmB,CAAjB;;AA0CA,IAAM,eAAe,GAAG;AAC3B,EAAA,KAAK,EAAE,CAAC,WAAD,EAAc,UAAd,CADoB;AACO;AAClC,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO;AACH,MAAA,OAAO,EAAE,EADN;AAEH,MAAA,QAAQ,EAAE,KAFP;AAEc;AACjB,MAAA,MAAM,EAAE,KAHL;AAGY;AACf,MAAA,KAAK,EAAE,IAJJ;AAKH,MAAA,KAAK,EAAE;AALJ,KAAP;AAOH,GAV0B;AAW3B,EAAA,QAAQ,EAAE;AACN,IAAA,WAAW,EAAE,uBAAW;AACpB,aAAO,IAAI,CAAC,SAAL,CAAe;AAClB,gBAAQ,OADU;AAElB,oBAAY,QAFM;AAGlB,kBAAU,MAHQ;AAIlB,iBAAS,KAAK,KAJI;AAKlB,cAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAA3B,cAAwC,KAAK,KAA7C;AALY,OAAf,CAAP;AAOH;AATK,GAXiB;AAsB3B,EAAA,KAAK,EAAE;AACH,IAAA,SAAS,EAAE,mBAAS,GAAT,EAAc;AACrB,WAAK,QAAL,GAAgB,KAAK,OAAL,IAAgB,GAAhB,GAAsB,IAAtB,GAA6B,KAA7C;AACH,KAHE;AAIH,IAAA,QAAQ,EAAE,oBAAW;AACjB,UAAI,CAAC,KAAK,QAAV,EAAoB;AAChB,aAAK,MAAL,GAAc,KAAd,CADgB,CACK;AAErB;;AACA,YAAI,KAAK,QAAT,EAAmB;AAEnB,cAAI,WAAW,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,6BAAvB,CAAlB;AACA,cAAI,aAAa,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,yBAAvB,EAAkD,qBAAlD,GAA0E,MAA9F;AAEA,UAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,YAAA,qBAAqB,CAAC,YAAW;AAC7B,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,aAFoB,CAArB;AAGH,WAPoB,CAArB;AASA,UAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,WAFD;AAIA,eAAK,WAAL;AACC;AACJ,OAxBD,MAwBO;AACH;AACA,aAAK,MAAL,GAAc,IAAd;AACH;AACJ;AAjCE,GAtBoB;AAyD3B,EAAA,OAAO,EAAE;AACL,IAAA,YADK,wBACQ,CADR,EACW;AACZ,UAAI,YAAY,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,OAA3B,CAAmC,KAAtD;;AAEA,2BAAS,KAAT,CAAe,eAAf,EAAgC,YAAhC;;AAEA,UAAI,KAAK,QAAT,EAAmB;AACf;AACA,aAAK,eAAL,CAAqB,CAArB;AACH;AACJ,KAVI;AAWL,IAAA,WAXK,yBAWS;AACV,UAAI,SAAS,GAAG,KAAK,GAAL,CAAS,SAAzB;AACA,UAAI,YAAY,GAAG,MAAM,CAAC,OAA1B;;AACA,UAAI,SAAS,GAAG,YAAhB,EAA8B;AAC1B,YAAI,MAAM,GAAG,KAAK,GAAL,CAAS,qBAAT,GAAiC,GAAjC,GAAuC,MAAM,CAAC,OAA3D;AACA,QAAA,UAAU,CAAC,YAAW;AAClB,UAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,YAAA,GAAG,EAAG,MAAM,GAAG,EADH;AAEZ,YAAA,QAAQ,EAAE;AAFE,WAAhB;AAIH,SALS,EAKR,GALQ,CAAV;AAMH;AACJ,KAvBI;AAwBL;AACA,IAAA,eAzBK,2BAyBW,CAzBX,EAyBc;AACf,UAAI,WAAW,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,6BAAvB,CAAlB;AACA,UAAI,aAAa,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,yBAAvB,EAAkD,qBAAlD,GAA0E,MAA9F;;AAEA,UAAI,KAAK,MAAL,IAAe,IAAnB,EAAyB;AACrB,aAAK,MAAL,GAAc,KAAd;AAEA,QAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,UAAA,qBAAqB,CAAC,YAAW;AAC7B,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,WAFoB,CAArB;AAGH,SAPoB,CAArB;AASA,QAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,SAFD;AAIH,OAhBD,MAgBO;AACH,aAAK,MAAL,GAAc,IAAd;AACA,QAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,QAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,SAFD;AAGH;AACJ,KApDI;AAsDL,IAAA,UAtDK,wBAsDQ;AACT,UAAI,KAAK,QAAT,EAAmB,CACf;AACH,OAFD,MAEO;AACH;AAEA;AACA,YAAI,iBAAiB,GAAG,KAAK,GAAL,CAAS,gBAAT,CAA0B,6BAA1B,CAAxB;AACA,QAAA,iBAAiB,CAAC,OAAlB,CAA0B,UAAC,IAAD,EAAU;AAChC,UAAA,IAAI,CAAC,KAAL,GAAa,EAAb;AACH,SAFD;AAGH;AACJ,KAlEI;AAmEL,IAAA,IAnEK,kBAmEE;AACH,WAAK,KAAL,GAAa,KAAK,CAAC,SAAN,CAAgB,KAAhB,CAAsB,IAAtB,CAA2B,QAAQ,CAAC,gBAAT,CAA0B,wCAA1B,CAA3B,EAAgG,OAAhG,CAAwG,KAAK,GAA7G,IAAoH,CAAjI;AACA,WAAK,KAAL,GAAa,KAAK,CAAC,SAAN,CAAgB,KAAhB,CAAsB,IAAtB,CAA2B,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAA3B,EAA8E,KAAK,KAAL,GAAa,CAA3F,EAA+F,SAA5G;AACH;AAtEI,GAzDkB;AAiI3B,EAAA,OAjI2B,qBAiIjB;AACN,QAAI,UAAU,GAAG,KAAK,GAAL,CAAS,OAAT,CAAiB,KAAlC;AACA,SAAK,OAAL,GAAe,UAAf;AACA,SAAK,UAAL;AACA,SAAK,IAAL;AACH;AAtI0B,CAAxB;;;AA0IP,IAAM,UAAU,GAAG,SAAb,UAAa,GAAM;AACrB,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAT,CAA0B,eAA1B,CAAlB;;AAEA,MAAI,cAAc,GAAG,SAAjB,cAAiB,CAAC,EAAD,EAAQ;AACzB;AACA,uBAAI,SAAJ,CAAc,cAAd,EAA8B,QAA9B,EAFyB,CAIzB;;;AACA,uBAAI,SAAJ,CAAc,eAAd,EAA+B,QAA/B,EALyB,CAOzB;;;AACA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC,eAAtC;;AAEA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,iBAAU,EAAV,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,gBAGkB,EAHlB,GAGwB,IAHxB;AAIH,GAdD;;AAgBA,MAAI,SAAS,CAAC,MAAV,GAAmB,CAAvB,EAA0B;AACtB,IAAA,SAAS,CAAC,OAAV,CAAkB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC/B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,eAA0B,KAA1B;AACA,MAAA,cAAc,CAAC,KAAD,CAAd;AACH,KAHD;AAIH;AACJ,CAzBD;;eA2Be,U;;;;;;;;;;;ACxRf;;AACA;;;;AAEA,IAAM,cAAc,GAAG,SAAjB,cAAiB,GAAM;AAEzB,MAAI,SAAS,GAAG,QAAQ,CAAC,gBAAT,CAA0B,sBAA1B,CAAhB;;AAEA,MAAI,yBAAyB,GAAG,SAA5B,yBAA4B,CAAC,EAAD,EAAQ;AACpC,uBAAI,SAAJ,CAAc,iBAAd,EAAiC;AAC7B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,KAAK,EAAE,MAAM,CAAC,gBAAP,GAA0B,MAAM,CAAC,aAAjC,GAAiD,IADrD;AAEH,UAAA,IAAI,EAAE;AAFH,SAAP;AAIH,OAN4B;AAO7B,MAAA,KAAK,EAAE;AACH,iBAAS,iBAAW;AAChB,cAAI,KAAK,KAAL,IAAc,EAAlB,EAAsB;AAClB;AACA,iCAAS,KAAT,CAAe,iBAAf,EAAkC,IAAlC,EAAwC,KAAK,IAA7C;AACH;AACJ;AANE,OAPsB;AAe7B,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW,IADX,EACiB;AAClB,cAAI,KAAK,GAAG,KAAK,KAAjB,CADkB,CAElB;AACA;;AACA,+BAAS,KAAT,CAAe,iBAAf,EAAkC,KAAlC,EAAyC,IAAzC;AACH;AANI,OAfoB;AAuB7B,MAAA,OAvB6B,qBAuBnB;AACN,aAAK,IAAL,GAAY,KAAK,KAAL,CAAW,IAAX,CAAgB,OAAhB,CAAwB,IAApC;;AACA,6BAAS,KAAT,CAAe,iBAAf,EAAkC,KAAK,KAAvC,EAA8C,KAAK,IAAnD;AACH;AA1B4B,KAAjC;;AA6BA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,6BAAsB,EAAtB;AADE,KAAR,EAEG,MAFH,4BAE8B,EAF9B,GAEoC,IAFpC;AAGH,GAjCD;;AAmCA,MAAI,SAAS,CAAC,MAAV,GAAmB,CAAvB,EAA0B;AACtB,IAAA,SAAS,CAAC,OAAV,CAAkB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC/B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,2BAAsC,KAAtC;AACA,MAAA,yBAAyB,CAAC,KAAD,CAAzB;AACH,KAHD;AAIH;AAEJ,CA9CD;;eAgDe,c;;;;;;;;;;;ACnDf;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,CAAC,GAAD,EAAS;AACxB,SAAO,kBAAkB,CAAC,GAAD,CAAzB;AACH,CAFD;;AAIA,IAAM,KAAK,GAAG,SAAR,KAAQ,GAAM;AAEhB,MAAI,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,QAA1B,CAAZ;;AAEA,MAAM,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,EAAD,EAAQ;AAC7B,uBAAI,SAAJ,CAAc,gBAAd,EAAgC;AAC5B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,WAAW,EAAE,CADX;AACc;AAChB,YAAA,UAAU,EAAE,IAFV;AAEgB;AAClB,YAAA,YAAY,EAAE,IAHZ;AAGkB;AACpB,YAAA,YAAY,EAAE,IAJZ;AAIkB;AACpB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAOF,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,QAAQ,EAAE,EARR;AASF,YAAA,OAAO,EAAE,EATP;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,SAAS,EAAE,EAXT;AAWa;AACf,YAAA,cAAc,EAAE,IAZd;AAYoB;AACtB,YAAA,aAAa,EAAE,IAbb;AAamB;AACrB,YAAA,QAAQ,EAAE,IAdR;AAeF,YAAA,UAAU,EAAE,IAfV;AAgBF,YAAA,UAAU,EAAE,IAhBV;AAiBF;AACA,YAAA,SAAS,EAAE,IAlBT;AAkBe;AACjB,YAAA,QAAQ,EAAE,KAnBR;AAoBF,qBAAO,OApBL;AAqBF,YAAA,YAAY,EAAE,UArBZ,CAsBF;;AAtBE;AADH,SAAP;AA0BH,OA5B2B;AA6B5B,MAAA,UAAU,EAAE;AACR,qCAA6B,2BADrB;AAER,2BAAmB,0CAFX;AAGR,yBAAiB,0BAHT;AAIR,sBAAc;AAJN,OA7BgB;AAmC5B,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAA7B;AACH,SANK;AAON,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,IAAL,CAAU,YAAV,GAAyB,EAA7B,EAAiC;AAC7B,gBAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iCAAY,KAAK,IAAL,CAAU,YAAtB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAoD;AACvD,+BAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAnC,GAAkD,CAA5D,cAAiE,KAAK,IAAL,CAAU,YAA3E;AACH,aAFM,MAEA;AACH,+BAAW,KAAK,IAAL,CAAU,YAAV,IAA0B,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAlD,CAAD,GAAyD,CAAnE,cAAwE,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,WAA3G;AACH;AACJ,WARD,MAQO;AACH,mBAAO,KAAK,IAAL,CAAU,YAAjB;AACH;AACJ,SAnBK;AAoBN,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,KAAK,IAAL,CAAU,WAAjB;AACH;AAtBK,OAnCkB;AA2D5B,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,KAA3B,CADc,CAGd;;AACA,cAAI,KAAK,KAAL,CAAW,MAAX,IAAqB,CAAzB,EAA4B;AACxB,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,gBAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SAbE;AAcH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AACH,SAjBE;AAkBH,wBAAgB,uBAAW;AACvB,eAAK,UAAL,GADuB,CACJ;AACnB;AACA;;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,EAAtB,CAJuB,CAMvB;;AACA,cAAI,MAAM,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AACxC,mBAAO,EAAE,CAAC,IAAH,IAAW,OAAlB;AACH,WAFY,EAEV,GAFU,CAEN,UAAA,EAAE,EAAI;AACT,mBAAO,EAAE,CAAC,KAAV;AACH,WAJY,CAAb,CAPuB,CAavB;;AACA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,mBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,WAFe,CAAhB;AAGA,eAAK,IAAL,CAAU,aAAV,GAA0B,SAAS,GAAG,SAAS,CAAC,KAAb,GAAqB,IAAxD;AAEH,SArCE;AAsCH,QAAA,IAAI,EAAE,gBAAW;AACb,cAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACH,WAHD,MAGO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAmD;AACtD,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAHM,MAGA;AACH,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAVY,CAYb;AACA;;AACH,SApDE;AAqDH,6BAAqB,4BAAW;AAC5B,eAAK,SAAL;AACH;AAvDE,OA3DqB;AAqH5B,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ;AACA,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB;AACA,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SAPI;AAQL,QAAA,aARK,yBAQS,EART,EAQa,CARb,EAQgB,IARhB,EAQsB;AACvB,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AAED,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAAtB;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,SAAvC;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CATuB,CAUvB;AACA;AACA;AACA;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,IAAI,KAAK,gBAAb,EAA+B;AAC3B,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,KAAV;AAAiB,wBAAQ,IAAzB;AAA+B,wBAAQ;AAAvC,eAA3C;AACH,aAFD,MAEO;AACH,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,OAAV;AAAmB,wBAAQ,IAA3B;AAAiC,wBAAQ;AAAzC,eAA3C;AACH;AACJ,WAND,MAMO;AACH,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ,CADG,CAIH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ,SApCI;AAqCL;AACA,QAAA,YAtCK,wBAsCQ,EAtCR,EAsCY,KAtCZ,EAsCmB,IAtCnB,EAsCyB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAS;;AACtC,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,KAAT;AACH,WAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,eAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH,SA5CI;AA6CL;AACA,QAAA,SA9CK,uBA8CO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFQ,CAEmB;AAC9B,SAjDI;AAmDL,QAAA,MAnDK,oBAmDI;AAAA;;AACL,cAAI,WAAW,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,QAApB,EAAlB;AAEA,cAAI,cAAc,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAClD,mBAAO,IAAI,CAAC,IAAL,IAAa,UAApB;AACH,WAFoB,EAElB,GAFkB,CAEd,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJoB,EAIlB,QAJkB,EAArB;AAMA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAC9C,mBAAO,IAAI,CAAC,IAAL,IAAa,MAApB;AACH,WAFgB,EAEd,GAFc,CAEV,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJgB,EAId,QAJc,EAAjB;AAMA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,SAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAMA,cAAI,YAAY,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAChD,mBAAO,IAAI,CAAC,IAAL,IAAa,QAApB;AACH,WAFkB,EAEhB,GAFgB,CAEZ,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJkB,EAIhB,QAJgB,EAAnB;;AAMA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,KAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,SAAS,CAAC,KAAjB;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,WAA3B;AAEA,eAAK,IAAL,CAAU,SAAV,cAA0B,cAAc,KAAK,EAAnB,GAAwB,wBAAwB,cAAhD,GAAiE,EAA3F,SAAgG,UAAU,KAAK,EAAf,GAAoB,WAAW,UAA/B,GAA4C,EAA5I,SAAiJ,YAAY,KAAK,EAAjB,GAAsB,aAAa,YAAnC,GAAkD,EAAnM,SAAwM,aAAa,KAAK,EAAlB,GAAuB,cAAc,aAArC,GAAqD,EAA7P,6BAAkR,wBAAwB,EAA1S,mBAAqT,UAArT;AAEH,SA7FI;AA8FL,QAAA,UA9FK,sBA8FM,KA9FN,EA8Fa;AAAA;;AACd;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,GAAG,CAAH,GAAO,KAAK,IAAL,CAAU,WAA9C;AACA,eAAK,MAAL;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,WAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CALc,CAMd;;AAEA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,QAAQ,GAAG,EAAf;AACA,cAAI,IAAI,GAAG,EAAX;AACA,cAAI,MAAM,GAAG,EAAb;AACA,cAAI,OAAO,GAAG,EAAd;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,oBAAO,IAAI,CAAC,IAAZ;AACI,mBAAK,UAAL;AACI,gBAAA,QAAQ,CAAC,IAAT,CAAc,IAAI,CAAC,KAAnB;AACA;;AACJ,mBAAK,MAAL;AACI,gBAAA,IAAI,CAAC,IAAL,CAAU,IAAI,CAAC,KAAf;AACA;;AACJ,mBAAK,QAAL;AACI,gBAAA,MAAM,CAAC,IAAP,CAAY,IAAI,CAAC,KAAjB;AACA;;AACJ,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ;AACI;AAdR;AAgBH,WAjBD;AAmBA,cAAI,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAT,CAAc,GAAd,CAAD,CAApC;AACA,cAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD,CAAhC;AACA,cAAI,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAP,CAAY,GAAZ,CAAD,CAAlC;AACA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AAEA,cAAI,WAAW,GAAG;AACd,YAAA,CAAC,EAAE,KAAK,GAAG,KAAH,GAAW,IADL;AAEd,YAAA,KAAK,EAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAAD,IAAmC,EAAnC,GAAwC,IAAxC,GAA+C,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,MAA9B,CAAqC,CAArC,KAA2C,GAA3C,GAAiD,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,KAA9B,CAAoC,CAApC,CAAjD,GAA0F,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAFlI;AAEiK;AAC/K,YAAA,iBAAiB,EAAE,WAAW,IAAI,EAAf,GAAoB,IAApB,GAA2B,WAHhC;AAId,YAAA,QAAQ,EAAE,OAAO,IAAI,EAAX,GAAgB,IAAhB,GAAuB,OAJnB;AAKd,YAAA,MAAM,EAAE,SAAS,IAAI,EAAb,GAAkB,IAAlB,GAAyB,SALnB;AAMd,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UANrB;AAOd,YAAA,cAAc,EAAE,wBAAwB,EAP1B;AAQd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU;AARF,WAAlB,CAlDc,CA6Dd;;AACA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,oBACC,WADD;AADI,WAAlB,EAKK,IALL,CAKU,UAAS,QAAT,EAAmB;AACrB;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAvC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAA/C,CAJqB,CAKrB;AACH,WAXL,WAYW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAdL;AAeH,SA3KI;AA4KL,QAAA,UA5KK,sBA4KM,GA5KN,EA4KW;AACZ,cAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA/C,EAAkD;AAC9C,iBAAK,IAAL,CAAU,WAAV;AACH,WAFD,MAEO,IAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAAzD,EAAqE;AACxE,iBAAK,IAAL,CAAU,WAAV;AACH,WAFM,MAEA;AACH;AACH;;AACD,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;;AACA,eAAK,UAAL;AACH,SAtLI;AAuLL,QAAA,eAvLK,2BAuLW,IAvLX,EAuLiB;AAClB,cAAI,IAAI,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,IAAI,EAAI;AACxC,mBAAO,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAAvB;AACH,WAFU,CAAX;;AAIA,cAAI,CAAC,IAAL,EAAW;AACP,iBAAK,IAAL,CAAU,SAAV,gCAA0B,KAAK,IAAL,CAAU,SAApC,IAA+C,IAA/C;AACH,WAFD,MAEO;AACH,iBAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,KAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,IAA5B,CAA3B,EAA6D,CAA7D;AACH;AACJ,SAjMI;AAkML;AACA,QAAA,aAnMK,2BAmMW;AACZ,cAAI,GAAG,aAAM,MAAM,CAAC,QAAP,CAAgB,QAAtB,SAAiC,KAAK,IAAL,CAAU,SAA3C,CAAP;AACA,UAAA,OAAO,CAAC,SAAR,CAAkB,EAAlB,EAAqB,EAArB,EAAwB,GAAxB;AACH,SAtMI;AAuML;AACA,QAAA,QAxMK,sBAwMM;AAAA;;AACP,cAAI,MAAM,GAAG,MAAM,CAAC,QAAP,CAAgB,MAAhB,CAAuB,MAAvB,CAA8B,CAA9B,EAAiC,KAAjC,CAAuC,GAAvC,EAA4C,MAA5C,CAAmD,UAAA,IAAI,EAAI;AACpE,mBAAO,IAAI,IAAI,EAAf;AACH,WAFY,CAAb,CADO,CAIP;AACA;;AAEA,cAAI,WAAW,GAAG,EAAlB;AACA,cAAI,IAAJ;AAEA,UAAA,MAAM,CAAC,OAAP,CAAe,UAAA,KAAK,EAAI;AACpB,gBAAI,IAAI,GAAG,KAAK,CAAC,KAAN,CAAY,CAAZ,EAAe,KAAK,CAAC,OAAN,CAAc,GAAd,CAAf,CAAX;AACA,gBAAI,OAAO,GAAG,KAAK,CAAC,KAAN,CAAY,KAAK,CAAC,OAAN,CAAc,GAAd,IAAqB,CAAjC,CAAd,CAFoB,CAGpB;AACA;;AAEA,gBAAI,KAAK,GAAG,EAAZ;;AACA,gBAAI,IAAI,IAAI,MAAZ,EAAoB;AAChB;AACA;AACA,cAAA,IAAI,GAAG,QAAQ,CAAC,OAAD,CAAf;AACH,aAJD,MAIO,IAAI,IAAI,IAAI,gBAAZ,EAA8B;AACjC,kBAAI,OAAO,IAAI,OAAX,IAAsB,OAAO,IAAI,KAArC,EAA4C;AACxC;AACH,eAFD,MAEO;AACH,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,MAAI,CAAC,IAAL,CAAU;AAHd,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;AACJ,aAfM,MAeA,IAAI,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAA5B,EAA+B;AAClC,kBAAI,YAAY,GAAG,OAAO,CAAC,KAAR,CAAc,GAAd,CAAnB;AACA,cAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,IAAI,EAAI;AACzB,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,kBAAkB,CAAC,IAAD;AAHtB,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH,eAXD;AAYH,aAdM,MAcA;AACH,cAAA,KAAK,GAAG;AACJ,wBAAQ,IADJ;AAEJ,yBAAS,OAFL;AAGJ,wBAAQ,kBAAkB,CAAC,OAAD;AAHtB,eAAR;AAMA,cAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;;AAED,YAAA,MAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,WAApB,CArDoB,CAsDpB;AAEH,WAxDD;AA0DA,eAAK,IAAL,CAAU,WAAV,GAAwB,IAAxB;AAEH,SA9QI;AA+QL,QAAA,WA/QK,uBA+QO,EA/QP,EA+QW;AACZ,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AACrC,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,oBAAvB,EAA6C,qBAA7C,GAAqE,GAArE,GAA2E,MAAM,CAAC,OAAlF,GAA4F,GAAtG,CAFY,CAGZ;;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAE,GADO;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKP,GALO,CAAV;AAMH,SAzRI;AA0RL,QAAA,SA1RK,uBA0RO;AACR;AACA;AACA;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,IAAI,CAAC,IAAL,CAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,EAAnC,CAAvB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA1B,GAA8B,IAA9B,GAAqC,KAA5D;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAApC,GAAiD,IAAjD,GAAwD,KAA/E;AACH,SAjSI;AAkSL,QAAA,IAlSK,kBAkSE;AAAA;;AACH,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAAtB,CAAsC,CAAtC,KAA4C,EAA5C,GAAiD,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAAtB,CAAsC,KAAtC,CAA4C,CAA5C,CAAjD,GAAkG,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAA9I;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CAHG,CAG2D;AAC9D;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,EAAD,EAAK,GAAL,EAAa;AACxC,gBAAI,EAAE,KAAK,MAAI,CAAC,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA;AACrC,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,GAAxB;;AACA,YAAA,MAAI,CAAC,UAAL;AACH,WAJD;;AAKA,+BAAS,GAAT,CAAa,YAAb,EAA2B,UAAC,IAAD,EAAU;AACjC,YAAA,MAAI,CAAC,eAAL,CAAqB,IAArB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,iBAAb,EAAgC,UAAC,KAAD,EAAQ,IAAR,EAAiB;AAC7C,gBAAI,IAAI,IAAI,eAAZ,EAA6B;AACzB,cAAA,MAAI,CAAC,UAAL,CAAgB,KAAhB;AACH;AACJ,WAJD;;AAKA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,EAAjB;AACH,WAFD,EAxBG,CA2BH;;;AACA,eAAK,IAAL,CAAU,OAAV,GAAoB,MAAM,CAAC,sBAAP,CAA8B,OAAlD;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,sBAAP,CAA8B,YAAvD;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,sBAAP,CAA8B,OAA9B,CAAsC,MAA/D,CA9BG,CA+BH;AACA;AACA;AAGA;;AACA,eAAK,IAAL,CAAU,iBAAV,GAA8B,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,EAApC,GAAyC,KAAzC,GAAiD,IAA/E,CArCG,CAuCH;;AACA,eAAK,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,CAApC,GAAwC,IAAxC,GAA+C,KAApE,CAxCG,CAyCH;AACA;AACA;AACH;AA9UI,OArHmB;AAqc5B,MAAA,OArc4B,qBAqclB;AAAA;;AACN,aAAK,IAAL;AACA,aAAK,SAAL,GAFM,CAGN;;AACA,YAAI,MAAM,CAAC,QAAP,CAAgB,MAApB,EAA4B;AACxB,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,MAAI,CAAC,QAAL;AACH,WAFD;AAGH;AACJ;AA9c2B,KAAhC,EAD6B,CAmd7B;;;AACA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,MAAD,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OAN+B;AAOhC,MAAA,QAAQ,iRAPwB;AAYhC,MAAA,OAAO,EAAE;AACL,QAAA,UADK,sBACM,MADN,EACa;AACd,iBAAO,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,EAAF,IAAQ,MAAM,CAAC,EAAnB;AAAA,WAA1B,MAAqD,SAA5D;AACH;AAHI,OAZuB;AAkBhC,MAAA,OAlBgC,qBAkBtB,CAET;AApB+B,KAApC,EApd6B,CA2e7B;;;AACA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,YAApB,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,KAAK,UADb;AAEH,UAAA,YAAY,EAAE,KAFX;AAGH,UAAA,EAAE,EAAE,IAHD;AAIH,UAAA,MAAM,EAAE,IAJL;AAIW;AACd,UAAA,UAAU,EAAE,IALT;AAMH,UAAA,WAAW,EAAE,IANV;AAMe;AAClB,UAAA,WAAW,EAAE;AAPV,SAAP;AASH,OAZ+B;AAahC,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAA7B;AACH,SAHK;AAIN,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,kBAAkB,CAAC,KAAK,OAAL,CAAa,GAAd,CAAzB;AACH,SANK;AAON,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,KAAK,OAAL,CAAa,GAAb,CAAiB,OAAjB,CAAyB,eAAzB,EAA0C,gBAA1C,CAAP;AACH,SATK;AAUN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,eADU;AAElB,wBAAY,KAAK,OAAL,CAAa,OAFP;AAGlB,qBAAS,KAAK,OAAL,CAAa,IAHJ;AAIlB,wBAAY,KAAK,OAAL,CAAa;AAJP,WAAf,CAAP;AAMH;AAjBK,OAbsB;AAgChC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,0BAAkB,yBAAW;AACzB,cAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,KAA+B,CAAlC,EAAoC;AAChC,iBAAK,SAAL,GAAiB,KAAjB;AACH;AACJ,SARE;AASH,mBAAW,mBAAW;AAAA;;AAClB;AACA,eAAK,SAAL,CAAe,YAAM;AACjB;AACA,YAAA,MAAI,CAAC,EAAL,GAAU,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,eAAtC;AACA,YAAA,MAAI,CAAC,YAAL,GAAoB,MAAI,CAAC,KAAL,CAAW,QAAX,WAAuB,MAAI,CAAC,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH,WAJD;AAKH,SAhBE;AAiBH,kBAAU,kBAAW;AACjB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SArBE;AAsBH,sBAAc,sBAAW;AACrB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AA1BE,OAhCyB;AA4DhC,MAAA,QAAQ,0mGA5DwB;AAgGhC,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,+BAAS,KAAT,CAAe,YAAf,EAA6B;AAAC,oBAAQ,KAAK,OAAL,CAAa,IAAtB;AAA4B,mBAAO,KAAK,OAAL,CAAa,GAAhD;AAAqD,kBAAM,KAAK,OAAL,CAAa;AAAxE,WAA7B;AACH,SAHI;AAIL,QAAA,cAJK,4BAIY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,iBAFsB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SAXI;AAYL,QAAA,YAZK,0BAYU;AACX,eAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,SAdI;AAeL,QAAA,UAfK,wBAeQ;AACT,cAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,gBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,iBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,gBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,gBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,iBAAK,WAAL,GAAmB,WAAnB;AACA,iBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC,SAA2D,WAAW,IAAI,EAAf,GAAoB,EAApB,GAAyB,GAApF;AACH;AACJ;AA1BI,OAhGuB;AA4HhC,MAAA,OA5HgC,qBA4HtB;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,eAAtC;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D,CAFM,CAGN;;AACA,aAAK,UAAL;AACH;AAjI+B,KAApC;;AAoIA,uBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,MAAA,KAAK,EAAE,CAAC,MAAD,CADiB;AAExB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAE,IADL,CAEH;;AAFG,SAAP;AAIH,OAPuB;AAQxB,MAAA,KAAK,EAAE;AACH,0BAAkB,yBAAW;AACzB,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,UAAA,IAAI,EAAI;AAChC,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,eAAiD,kBAAkB,CAAC,IAAI,CAAC,GAAN,CAAnE,WAAN;AACH,WAFD;AAGA,eAAK,MAAL,GAAc,MAAd;AACH;AAPE,OARiB;AAiBxB,MAAA,OAAO,EAAE,CACL;AACA;AACA;AACA;AACA;AACA;AACA;AAPK,OAjBe;AA0BxB,MAAA,OA1BwB,qBA0Bd,CACN;AACA;AACA;AACH;AA9BuB,KAA5B;;AAiCA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,mBAAY,EAAZ,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,kBAGoB,EAHpB,GAG0B,IAH1B;AAIH,GArpBD;;AAupBA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,iBAA4B,KAA5B;AACA,MAAA,gBAAgB,CAAC,KAAD,CAAhB;AACH,KAHD;AAIH;;AAED,EAAA,MAAM,CAAC,YAAP,GAAsB,UAAtB;AACA,EAAA,MAAM,CAAC,WAAP,GAAqB,UAArB;AAEH,CArqBD;;eAuqBe,K;;;;;;;;;;;AClrBf;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,CAAC,GAAD,EAAS;AACxB,SAAO,kBAAkB,CAAC,GAAD,CAAzB;AACH,CAFD;;AAIA,IAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AAEnB,MAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAT,CAA0B,YAA1B,CAAf;;AAEA,MAAM,mBAAmB,GAAG,SAAtB,mBAAsB,CAAC,EAAD,EAAQ;AAChC,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,WAAW,EAAE,CADX;AACc;AAChB,YAAA,UAAU,EAAE,IAFV;AAEgB;AAClB,YAAA,YAAY,EAAE,IAHZ;AAGkB;AACpB,YAAA,YAAY,EAAE,IAJZ;AAIkB;AACpB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAOF,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,QAAQ,EAAE,EARR;AASF,YAAA,OAAO,EAAE,EATP;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,SAAS,EAAE,EAXT;AAWa;AACf,YAAA,cAAc,EAAE,IAZd;AAYoB;AACtB,YAAA,aAAa,EAAE,IAbb;AAamB;AACrB,YAAA,QAAQ,EAAE,IAdR;AAeF,YAAA,UAAU,EAAE,IAfV;AAgBF,YAAA,UAAU,EAAE,IAhBV;AAiBF;AACA,YAAA,SAAS,EAAE,IAlBT;AAkBe;AACjB,YAAA,QAAQ,EAAE,KAnBR;AAoBF,YAAA,KAAK,EAAE,IApBL;AAoBW;AACb,YAAA,KAAK,EAAE,iBArBL;AAsBF,YAAA,aAAa,EAAE,IAtBb;AAuBF,YAAA,YAAY,EAAE,IAvBZ;AAwBF,YAAA,WAAW,EAAE,KAxBX;AAyBF,YAAA,WAAW,EAAE,IAzBX;AAyBiB;AACnB,qBAAO,WA1BL;AA2BF,YAAA,YAAY,EAAE;AA3BZ;AADH,SAAP;AA+BH,OAjC+B;AAkChC,MAAA,UAAU,EAAE;AACR,qCAA6B,2BADrB;AAER,2BAAmB,0CAFX;AAGR,yBAAiB,0BAHT;AAIR,sBAAc;AAJN,OAlCoB;AAwChC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,SANK;AAON,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,IAAL,CAAU,YAAV,GAAyB,EAA7B,EAAiC;AAC7B,gBAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iCAAY,KAAK,IAAL,CAAU,YAAtB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAoD;AACvD,+BAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAnC,GAAkD,CAA5D,cAAiE,KAAK,IAAL,CAAU,YAA3E;AACH,aAFM,MAEA;AACH,+BAAW,KAAK,IAAL,CAAU,YAAV,IAA0B,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAlD,CAAD,GAAyD,CAAnE,cAAwE,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,WAA3G;AACH;AACJ,WARD,MAQO;AACH,mBAAO,KAAK,IAAL,CAAU,YAAjB;AACH;AACJ,SAnBK;AAoBN,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,KAAK,IAAL,CAAU,WAAjB;AACH,SAtBK;AAuBN,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,kBAAM,KAAN,CAAY,WAAnB;AACH;AAzBK,OAxCsB;AAmEhC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,KAA3B,CADc,CAGd;;AACA,cAAI,KAAK,KAAL,CAAW,MAAX,IAAqB,CAAzB,EAA4B;AACxB,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,gBAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SAbE;AAcH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AACH,SAjBE;AAkBH,wBAAgB,uBAAW;AAAA;;AACvB,eAAK,UAAL,GADuB,CACJ;AACnB;AACA;;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,EAAtB,CAJuB,CAMvB;;AACA,cAAI,MAAM,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AACxC,mBAAO,EAAE,CAAC,IAAH,IAAW,OAAlB;AACH,WAFY,EAEV,GAFU,CAEN,UAAA,EAAE,EAAI;AACT,mBAAO,EAAE,CAAC,KAAV;AACH,WAJY,CAAb;;AAMA,cAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,iBAAK,gBAAL,CAAsB,MAAtB;AACH,WAFD,MAEO;AACH;AACA,iBAAK,IAAL,CAAU,QAAV,GAAqB,EAArB,CAFG,CAGH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AAC3B,qBAAO,EAAE,CAAC,IAAH,IAAW,SAAlB;AACH,aAFD,EAEG,OAFH,CAEW,UAAA,IAAI,EAAI;AACf,cAAA,KAAI,CAAC,YAAL,CAAkB,KAAI,CAAC,IAAL,SAAlB,EAAmC,IAAI,CAAC,KAAxC;AACH,aAJD;AAKH,WAxBsB,CA0BvB;;;AACA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,mBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,WAFe,CAAhB;AAGA,eAAK,IAAL,CAAU,aAAV,GAA0B,SAAS,GAAG,SAAS,CAAC,KAAb,GAAqB,IAAxD;AAEH,SAlDE;AAmDH,QAAA,IAAI,EAAE,gBAAW;AACb,cAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACH,WAHD,MAGO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAmD;AACtD,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAHM,MAGA;AACH,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAVY,CAYb;AACA;;AACH,SAjEE;AAkEH,6BAAqB,4BAAW;AAC5B,eAAK,SAAL;AACH,SApEE;AAqEH,0BAAkB,yBAAW;AACzB,4BAAM,MAAN,CAAa,oBAAb,EAAmC,KAAK,IAAL,CAAU,SAA7C,EADyB,CACgC;AAEzD;;;AACA,cAAI,QAAJ;AAEA,eAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,UAAC,IAAD,EAAU;AAClC,gBAAI,GAAG,0BAAmB,IAAI,CAAC,UAAxB,+BAAuD,IAAI,CAAC,IAA5D,0BAAgF,IAAI,CAAC,GAArF,6BAA2G,IAAI,CAAC,UAAL,IAAmB,IAAnB,GAA0B,KAA1B,GAAkC,IAA7I,CAAP;;AACA,gBAAI,QAAJ,EAAc;AACV,cAAA,QAAQ,GAAG,GAAG,aAAM,QAAN,iBAAqB,GAArB,cAAgC,QAAhC,CAAd;AACH,aAFD,MAEO;AACH,cAAA,QAAQ,GAAG,GAAG,GAAG,GAAH,GAAS,IAAvB;AACH;AACJ,WAPD;AASA,eAAK,IAAL,CAAU,aAAV,GAA0B,QAA1B,CAfyB,CAiBzB;AACA;AACA;AACA;AACA;AACA;AACA;AACH;AA7FE,OAnEyB;AAmKhC,MAAA,OAAO,EAAE;AACL,QAAA,QADK,oBACI,CADJ,EACO;AACR;AACA,cAAI,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,IAA8B,CAAlC,EAAqC;AACjC,YAAA,CAAC,CAAC,eAAF;AACH;AACJ,SANI;AAOL,QAAA,aAPK,2BAOW;AACZ;AACA,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB;AACA,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SAbI;AAcL,QAAA,aAdK,yBAcS,EAdT,EAca,CAdb,EAcgB,IAdhB,EAcsB;AACvB,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AACD,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAAtB;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,SAAvC;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CARuB,CASvB;AACA;AACA;AACA;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,IAAI,KAAK,gBAAb,EAA+B;AAC3B,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,KAAV;AAAiB,wBAAQ,IAAzB;AAA+B,wBAAQ;AAAvC,eAA3C;AACH,aAFD,MAEO;AACH,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,OAAV;AAAmB,wBAAQ,IAA3B;AAAiC,wBAAQ;AAAzC,eAA3C;AACH;AACJ,WAND,MAMO;AACH,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ,CADG,CAIH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ,SAzCI;AA0CL;AACA,QAAA,YA3CK,wBA2CQ,EA3CR,EA2CY,KA3CZ,EA2CmB,IA3CnB,EA2CyB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAE;AAAS;;AACvC,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,KAAT;AACH,WAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,eAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH,SAjDI;AAkDL;AACA,QAAA,SAnDK,uBAmDO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFQ,CAEmB;AAC9B,SAtDI;AAuDL,QAAA,gBAvDK,4BAuDY,MAvDZ,EAuDoB;AACrB;AACA,cAAI,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAP,CAAY,GAAZ,CAAD,CAAjC,CAFqB,CAGrB;;AACA,cAAI,MAAM,oCAAV,CAJqB,CAKrB;;AACA,cAAI,IAAI,GAAG,IAAX;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,EAAE;AACJ,cAAA,KAAK,EAAE,QADH;AAEJ,cAAA,IAAI,EAAE,KAAK;AAFP;AADE,WAAlB,EAMK,IANL,CAMU,UAAS,QAAT,EAAmB;AACrB;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,IAAT,CAAc,OAAnC;AACH,WATL,WAUW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAZL;AAaH,SA5EI;AA8EL,QAAA,UA9EK,sBA8EM,KA9EN,EA8Ea;AAAA;;AAEd;AACA;AACA,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,KAAK,GAAG,KAAH,GAAW,KAAK,IAAL,CAAU,KAApE;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,GAAG,CAAH,GAAO,KAAK,IAAL,CAAU,WAA9C,CALc,CAOd;;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,cAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CATc,CAUd;AACA;;AAEA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,OAAO,GAAG,EAAd;AACA,cAAI,IAAI,GAAG,EAAX;AACA,cAAI,KAAK,GAAG,EAAZ;AACA,cAAI,OAAO,GAAG,EAAd;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,oBAAO,IAAI,CAAC,IAAZ;AACI,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ,mBAAK,MAAL;AACI,gBAAA,IAAI,CAAC,IAAL,CAAU,IAAI,CAAC,KAAf;AACA;;AACJ,mBAAK,OAAL;AACI,gBAAA,KAAK,CAAC,IAAN,CAAW,IAAI,CAAC,KAAhB;AACA;;AACJ,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ;AACI;AAdR;AAgBH,WAjBD;AAmBA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AACA,cAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD,CAAhC;AACA,cAAI,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAN,CAAW,GAAX,CAAD,CAAjC;AACA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AAEA,cAAI,WAAW,GAAG;AACd,YAAA,CAAC,EAAE,KAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,IAAL,CAAU,KAA5B,GAAoC,IADzB;AAEd,YAAA,KAAK,EAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAAD,IAAmC,EAAnC,GAAwC,IAAxC,GAA+C,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,MAA9B,CAAqC,CAArC,KAA2C,GAA3C,GAAiD,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,KAA9B,CAAoC,CAApC,CAAjD,GAA0F,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAFlI;AAEiK;AAC/K,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAHrB;AAId,YAAA,QAAQ,EAAE,OAAO,IAAI,EAAX,GAAgB,IAAhB,GAAuB,OAJnB;AAKd,YAAA,KAAK,EAAE,QAAQ,IAAI,EAAZ,GAAiB,IAAjB,GAAwB,QALjB;AAMd,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UANrB;AAOd,YAAA,cAAc,EAAE,wBAAwB,EAP1B;AAQd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU;AARF,WAAlB,CAvDc,CAkEd;;AACA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,oBACC,WADD;AADI,WAAlB,EAKK,IALL,CAKU,UAAS,QAAT,EAAmB;AACrB;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAvC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAA/C,CAJqB,CAKrB;AAEH,WAZL,WAaW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAfL;AAgBH,SAjKI;AAkKL,QAAA,UAlKK,sBAkKM,GAlKN,EAkKW;AACZ,cAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA/C,EAAkD;AAC9C,iBAAK,IAAL,CAAU,WAAV;AACH,WAFD,MAEO,IAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAAzD,EAAqE;AACxE,iBAAK,IAAL,CAAU,WAAV;AACH,WAFM,MAEA;AACH;AACH;;AACD,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;;AACA,eAAK,UAAL;AACH,SA5KI;AA6KL;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAA,kBAzLK,8BAyLc,IAzLd,EAyLoB;AACrB,cAAI,QAAQ,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,UAAC,IAAD,EAAU;AAChD,mBAAO,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAAvB;AACH,WAFc,CAAf;AAGA,cAAI,WAAJ;;AACA,cAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAAyB;AACrB,YAAA,WAAW,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,GAApB,CAAwB,UAAC,IAAD,EAAU;AAC5C,kBAAI,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAApB,EAAwB;AACpB,uBAAO,IAAI,GAAG,IAAd;AACH,eAFD,MAEO;AACH,uBAAO,IAAP;AACH;AACJ,aANa,CAAd;AAOH,WARD,MAQO;AACH,YAAA,WAAW,gCACJ,KAAK,IAAL,CAAU,SADN,IAEP,IAFO,EAAX;AAIH;;AACD,eAAK,IAAL,CAAU,SAAV,GAAsB,WAAtB;AACH,SA7MI;AA8ML,QAAA,cA9MK,0BA8MU,EA9MV,EA8Mc;AACf;AACA;AACA;AACA;AACA;AACA;AAEA,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,UAAC,IAAD,EAAU;AACvD,mBAAO,IAAI,CAAC,EAAL,KAAY,EAAnB;AACH,WAFqB,CAAtB;AAGH,SAzNI;AA2NL,QAAA,WA3NK,uBA2NO,EA3NP,EA2NW;AACZ,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AACrC,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,wBAAvB,EAAiD,qBAAjD,GAAyE,GAAzE,GAA+E,MAAM,CAAC,OAAtF,GAA+F,GAAzG,CAFY,CAGZ;;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAE,GADO;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKP,GALO,CAAV;AAMH,SArOI;AAsOL,QAAA,SAtOK,uBAsOO;AACR;AACA;AACA;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,IAAI,CAAC,IAAL,CAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,EAAnC,CAAvB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA1B,GAA8B,IAA9B,GAAqC,KAA5D;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAApC,GAAiD,IAAjD,GAAwD,KAA/E;AACH,SA7OI;AA8OL,QAAA,YA9OK,wBA8OQ,IA9OR,EA8Oc;AACf,cAAI,IAAI,CAAC,SAAL,IAAkB,KAAK,IAAL,CAAU,WAAhC,EAA6C;AACzC;AACA,iBAAK,IAAL,CAAU,WAAV,GAAwB,IAAxB;AACH;AACJ,SAnPI;AAoPL,QAAA,WApPK,uBAoPO,IApPP,EAoPa;AACd,cAAK,IAAI,CAAC,SAAL,IAAkB,KAAK,IAAL,CAAU,WAA7B,IAA6C,KAAK,IAAL,CAAU,WAA3D,EAAwE;AACpE,iBAAK,IAAL,CAAU,SAAV,GAAsB,EAAtB,CADoE,CAC1C;;AAC1B,iBAAK,IAAL,CAAU,WAAV,GAAwB,KAAxB,CAFoE,CAErC;AAClC;AACJ,SAzPI;AA0PL,QAAA,IA1PK,kBA0PE;AAAA;;AACH,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,CAAjC,KAAuC,EAAvC,GAA4C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,KAAjC,CAAuC,CAAvC,CAA5C,GAAwF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAApI;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CAHG,CAG2D;AAC9D;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,EAAD,EAAK,GAAL,EAAa;AACxC,gBAAI,EAAE,KAAK,MAAI,CAAC,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA;AACrC,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,GAAxB;;AACA,YAAA,MAAI,CAAC,UAAL;AACH,WAJD,EAXG,CAgBH;AACA;AACA;;;AACA,+BAAS,GAAT,CAAa,uBAAb,EAAsC,UAAC,IAAD,EAAU;AAC5C,YAAA,MAAI,CAAC,kBAAL,CAAwB,IAAxB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,iBAAb,EAAgC,UAAC,KAAD,EAAQ,IAAR,EAAiB;AAC7C,gBAAI,IAAI,IAAI,eAAZ,EAA6B;AACzB,cAAA,MAAI,CAAC,UAAL,CAAgB,KAAhB;AACH;AACJ,WAJD;;AAKA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,EAAjB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,kBAAb,EAAiC,UAAC,EAAD,EAAQ;AACrC,YAAA,MAAI,CAAC,cAAL,CAAoB,EAApB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,IAAD,EAAU;AACrC,YAAA,MAAI,CAAC,YAAL,CAAkB,IAAlB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,aAAb,EAA4B,UAAC,IAAD,EAAU;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,IAAjB;AACH,WAFD,EApCG,CAwCH;;;AACA,eAAK,IAAL,CAAU,OAAV,GAAoB,MAAM,CAAC,8BAAP,CAAsC,OAA1D;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,8BAAP,CAAsC,YAA/D;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,8BAAP,CAAsC,OAAtC,CAA8C,MAAvE,CA3CG,CA4CH;AACA;AACA;AAGA;;AACA,eAAK,IAAL,CAAU,iBAAV,GAA8B,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,EAApC,GAAyC,KAAzC,GAAiD,IAA/E,CAlDG,CAoDH;;AACA,eAAK,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,CAApC,GAAwC,IAAxC,GAA+C,KAApE,CArDG,CAsDH;AACA;AACA;;AAGA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,MAAI,CAAC,KAAL,CAAW,UAAX,CAAsB,YAAtB,CAAmC,MAAnC,EAA2C,SAA3C,CAAqD,CAArD,CAAxB,CADiB,CAEjB;;AACA,YAAA,MAAI,CAAC,IAAL,CAAU,YAAV,2HAAmI,MAAI,CAAC,IAAL,CAAU,WAA7I;AACH,WAJD;AAKH;AA1TI,OAnKuB;AA+dhC,MAAA,OA/dgC,qBA+dtB;AACN,aAAK,IAAL;AACA,aAAK,SAAL,GAFM,CAIN;AACA;AACA;AACA;AACA;AACA;AACH;AAze+B,KAApC;;AA8eA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,MAAD,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OANyB;AAO1B,MAAA,UAAU,EAAE;AACR,yBAAiB;AADT,OAPc;AAU1B,MAAA,QAAQ,0QAVkB;AAe1B,MAAA,OAAO,EAAE,EAfiB;AAkB1B,MAAA,OAlB0B,qBAkBhB,CAET;AApByB,KAA9B,EA/egC,CAsgBhC;;;AACA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,KAAK,EAAE,CAAC,MAAD,CADuB;AAE9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OAN6B;AAO9B,MAAA,QAAQ,wTAPsB;AAY9B,MAAA,OAAO,EAAE;AACL,QAAA,UADK,sBACM,MADN,EACa;AACd,iBAAO,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,EAAF,IAAQ,MAAM,CAAC,EAAnB;AAAA,WAA1B,MAAqD,SAA5D;AACH,SAHI;AAIL,QAAA,OAJK,mBAIG,MAJH,EAIW;AACZ,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,EAAF,IAAQ,MAAM,CAAC,EAAnB;AAAA,WAA1B,CAAZ;;AACA,cAAI,KAAJ,EAAW;AACP,mBAAQ;AACJ,cAAA,GAAG,EAAE,KAAK,CAAC,GADP;AAEJ,cAAA,UAAU,EAAE,KAAK,CAAC;AAFd,aAAR;AAIH,WALD,MAKO;AACH,mBAAO,IAAP;AACH;AACJ;AAdI,OAZqB;AA6B9B,MAAA,OA7B8B,qBA6BpB,CAET;AA/B6B,KAAlC,EAvgBgC,CAyiBhC;;;AACA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,YAApB,EAAkC,SAAlC,EAA6C,aAA7C,CADuB;AAE9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,KAAK,UADb;AAEH,UAAA,YAAY,EAAE,KAFX;AAGH,UAAA,EAAE,EAAE,IAHD;AAIH,UAAA,MAAM,EAAE,IAJL;AAIW;AACd,UAAA,UAAU,EAAE,IALT;AAMH,UAAA,WAAW,EAAE,IANV;AAMe;AAClB,UAAA,WAAW,EAAE,IAPV;AAQH,UAAA,UAAU,EAAE,KAAK,OAAL,GAAe,KAAK,OAAL,CAAa,UAA5B,GAAyC,IARlD;AASH,UAAA,GAAG,EAAE,KAAK,OAAL,GAAe,KAAK,OAAL,CAAa,GAA5B,GAAkC,IATpC;AAUH,UAAA,KAAK,EAAE,IAVJ;AAWH,UAAA,QAAQ,EAAE,KAAK,WAAL,GAAmB,IAAnB,GAA0B;AAXjC,SAAP;AAaH,OAhB6B;AAiB9B,MAAA,QAAQ;AACJ,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,SAHG;AAIJ,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,kBAAkB,CAAC,KAAK,OAAL,CAAa,GAAd,CAAzB;AACH,SANG;AAOJ,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,KAAK,OAAL,CAAa,GAAb,CAAiB,OAAjB,CAAyB,eAAzB,EAA0C,gBAA1C,CAAP;AACH,SATG;AAUJ,QAAA,QAAQ,EAAE,oBAAW;AACjB,iBAAO,MAAM,CAAC,uBAAd;AACH;AAZG,uBAaQ,sBAAW;AACnB,eAAO,KAAK,OAAL,CAAa,GAAb,GAAmB,KAAK,OAAL,CAAa,GAAb,CAAiB,OAAjB,CAAyB,eAAzB,EAA0C,gBAA1C,CAAnB,GAAiF,IAAxF;AACH,OAfG,CAjBsB;AAkC9B,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,uBAAe,uBAAW;AACtB,cAAI,KAAK,WAAT,EAAsB;AAClB,iBAAK,QAAL,GAAgB,IAAhB;AACH;AACJ,SARE;AASH,0BAAkB,yBAAW;AAAA;;AACzB,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,UAAC,IAAD,EAAU;AAC7C,mBAAO,IAAI,CAAC,EAAL,IAAW,MAAI,CAAC,EAAvB;AACH,WAFW,CAAZ;AAGA,eAAK,QAAL,GAAgB,KAAK,CAAC,MAAN,GAAe,CAAf,GAAmB,IAAnB,GAA0B,KAA1C;;AACA,cAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,iBAAK,GAAL,GAAW,KAAK,CAAC,CAAD,CAAL,CAAS,GAApB;AACA,iBAAK,UAAL,GAAkB,KAAK,CAAC,CAAD,CAAL,CAAS,UAA3B;AACH,WARwB,CASzB;AACA;AACA;AACA;;AACH,SAtBE;AAuBH,mBAAW,mBAAW;AAAA;;AAClB;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,MAAI,CAAC,EAAL,GAAU,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,YAAA,MAAI,CAAC,YAAL,GAAoB,MAAI,CAAC,KAAL,CAAW,QAAX,WAAuB,MAAI,CAAC,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH,WAHD;AAIH,SA7BE;AA8BH,kBAAU,kBAAW;AACjB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SAlCE;AAmCH,sBAAc,sBAAW;AACrB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SAvCE;AAwCH,eAAO,eAAW;AAAA;;AACd,cAAI,CAAC,KAAK,WAAV,EAAuB;AACnB;AACA,iBAAK,KAAL,GAAa,KAAK,GAAL,CAAS,KAAT,CAAe,OAAf,KAA2B,QAAQ,CAAC,KAAK,GAAN,CAAR,IAAsB,CAAjD,GAAqD,IAArD,GAA4D,KAAK,GAAL,IAAY,EAAZ,GAAiB,IAAjB,GAAwB,KAAjG;AACH,WAHD,MAGO;AACH;AACA,iBAAK,KAAL,GAAa,KAAK,GAAL,CAAS,KAAT,CAAe,OAAf,KAA2B,QAAQ,CAAC,KAAK,GAAN,CAAR,IAAsB,CAAjD,GAAqD,IAArD,GAA4D,KAAzE;AACH,WAPa,CASd;;;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,gBAAI,MAAI,CAAC,KAAL,IAAc,MAAI,CAAC,GAAL,KAAa,EAA3B,IAAiC,MAAI,CAAC,QAA1C,EAAoD;AAChD,mCAAS,KAAT,CAAe,uBAAf,EAAwC;AACpC,gBAAA,EAAE,EAAE,MAAI,CAAC,OAAL,CAAa,EADmB;AAEpC,gBAAA,UAAU,EAAE,MAAI,CAAC,OAAL,CAAa,UAFW;AAGpC,gBAAA,OAAO,EAAE,MAAI,CAAC,OAAL,CAAa,OAHc;AAIpC,gBAAA,OAAO,EAAE,MAAI,CAAC,OAAL,CAAa,OAJc;AAKpC,gBAAA,IAAI,EAAE,MAAI,CAAC,OAAL,CAAa,IALiB;AAMpC,gBAAA,GAAG,EAAE,MAAI,CAAC,GAN0B;AAOpC,gBAAA,UAAU,EAAE,MAAI,CAAC,UAPmB;AAQpC,gBAAA,GAAG,EAAE,MAAI,CAAC,OAAL,CAAa;AARkB,eAAxC;AAUH;AACJ,WAbD,EAVc,CAyBd;;AACA,cAAI,KAAK,QAAL,IAAiB,KAAK,WAA1B,EAAuC;AACnC,iCAAS,KAAT,CAAe,cAAf;AACH;AACJ,SArEE;AAsEH,sBAAc,sBAAW;AACrB,cAAI,KAAK,KAAL,IAAc,KAAK,GAAL,KAAa,EAA3B,IAAiC,KAAK,QAA1C,EAAoD;AAChD,iCAAS,KAAT,CAAe,uBAAf,EAAwC;AACpC,cAAA,EAAE,EAAE,KAAK,OAAL,CAAa,EADmB;AAEpC,cAAA,UAAU,EAAE,KAAK,OAAL,CAAa,UAFW;AAGpC,cAAA,OAAO,EAAE,KAAK,OAAL,CAAa,OAHc;AAIpC,cAAA,OAAO,EAAE,KAAK,OAAL,CAAa,OAJc;AAKpC,cAAA,IAAI,EAAE,KAAK,OAAL,CAAa,IALiB;AAMpC,cAAA,GAAG,EAAE,KAAK,GAN0B;AAOpC,cAAA,UAAU,EAAE,KAAK,UAPmB;AAQpC,cAAA,GAAG,EAAE,KAAK,OAAL,CAAa;AARkB,aAAxC;AAUH;AACJ,SAnFE;AAoFH,mBAAW,mBAAW;AAClB;AACA,cAAI,CAAC,KAAK,OAAV,EAAmB;AACf,iBAAK,GAAL,GAAW,EAAX;AACA,iBAAK,UAAL,GAAkB,IAAlB;AACH;AACJ;AA1FE,OAlCuB;AA8H9B,MAAA,QAAQ,kwGA9HsB;AA0K9B,MAAA,OAAO,EAAE;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAA,cAZK,4BAYY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,YAFsB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SAnBI;AAoBL,QAAA,YApBK,0BAoBU;AACX,eAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,SAtBI;AAuBL,QAAA,UAvBK,wBAuBQ;AACT,cAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,gBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,iBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,gBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,gBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,iBAAK,WAAL,GAAmB,WAAnB;AACA,iBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC,SAA2D,WAAW,IAAI,EAAf,GAAoB,EAApB,GAAyB,GAApF;AACH;AACJ,SAlCI;AAmCL,QAAA,SAnCK,uBAmCO;AACR,cAAI,CAAC,KAAK,GAAV,EAAe;AACX,iBAAK,KAAL,GAAa,KAAb;AACH,WAFD,MAEO,IAAI,QAAQ,CAAC,KAAK,GAAN,CAAR,GAAqB,CAAzB,EAA4B;AAC/B,iBAAK,KAAL,GAAa,KAAb;AACH,WAFM,MAEA;AACH,gBAAI,IAAI,GAAG;AACP,cAAA,EAAE,EAAE,KAAK,OAAL,CAAa,EADV;AAEP,cAAA,UAAU,EAAE,KAAK,OAAL,CAAa,UAFlB;AAGP,cAAA,OAAO,EAAE,KAAK,OAAL,CAAa,OAHf;AAIP,cAAA,OAAO,EAAE,KAAK,OAAL,CAAa,OAJf;AAKP,cAAA,IAAI,EAAE,KAAK,OAAL,CAAa,IALZ;AAMP,cAAA,GAAG,EAAE,KAAK,GANH;AAOP,cAAA,UAAU,EAAE,KAAK,UAPV;AAQP,cAAA,GAAG,EAAE,KAAK,OAAL,CAAa;AARX,aAAX;;AAUA,iCAAS,KAAT,CAAe,uBAAf,EAAwC,IAAxC;AACH;AACJ,SArDI;AAsDL,QAAA,cAtDK,4BAsDY;AACb,+BAAS,KAAT,CAAe,kBAAf,EAAmC,KAAK,EAAxC;AACH;AAxDI,OA1KqB;AAoO9B,MAAA,OApO8B,qBAoOpB;AAAA;;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC,CADM,CAEN;;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACA,aAAK,UAAL,GAJM,CAMN;;AACA,6BAAS,GAAT,CAAa,kBAAb,EAAiC,UAAC,EAAD,EAAQ;AACrC,cAAI,EAAE,IAAI,MAAI,CAAC,EAAf,EAAmB;AACf,YAAA,MAAI,CAAC,GAAL,GAAW,EAAX;AACA,YAAA,MAAI,CAAC,UAAL,GAAkB,IAAlB;AACH;AACJ,SALD;AAMH;AAjP6B,KAAlC,EA1iBgC,CA8xBhC;;;AACA,uBAAI,SAAJ,CAAc,MAAd,EAAsB;AAClB,MAAA,KAAK,EAAE,CAAC,aAAD,CADW;AAElB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,IADR;AAEH,UAAA,QAAQ,EAAE,IAFP;AAGH,UAAA,WAAW,EAAE;AAHV,SAAP;AAKH,OARiB;AASlB,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,kBAAM,KAAN,CAAY,YAAnB;AACH,SAHK;AAIN,QAAA,QAAQ,EAAE,oBAAW;AACjB,iBAAO,MAAM,CAAC,uBAAd;AACH;AANK,OATQ;AAiBlB,MAAA,KAAK,EAAE;AACH,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,SAAT,EAAoB;AAChB,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,GAA9B,CAAkC,WAAlC;AACH,WAFD,MAEO;AACH,iBAAK,GAAL,CAAS,UAAT,CAAoB,SAApB,CAA8B,MAA9B,CAAqC,WAArC;AACH;AACJ,SAPE;AAQH,QAAA,WAAW,EAAE,uBAAW;AACpB,cAAI,KAAK,WAAL,CAAiB,MAAjB,IAA2B,CAA/B,EAAkC;AAC9B,mCAAS,UAAT,CAAoB,KAAK,QAAzB;AACH;AACJ,SAZE;AAaH;AACA,QAAA,WAAW,EAAE,uBAAW;AACpB,eAAK,GAAL,CAAS,KAAT,CAAe,OAAf,GAAyB,KAAK,WAAL,GAAmB,MAAnB,GAA4B,OAArD;AACH;AAhBE,OAjBW;AAmClB,MAAA,QAAQ,yVAnCU;AA0ClB,MAAA,OAAO,EAAE;AACL,QAAA,OADK,mBACG,MADH,EACW;AACZ,cAAI,KAAK,GAAG,KAAK,WAAL,CAAiB,IAAjB,CAAsB,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,EAAF,IAAQ,MAAM,CAAC,EAAnB;AAAA,WAAvB,CAAZ;;AACA,cAAI,KAAJ,EAAW;AACP,mBAAQ;AACJ,cAAA,GAAG,EAAE,KAAK,CAAC,GADP;AAEJ,cAAA,UAAU,EAAE,KAAK,CAAC;AAFd,aAAR;AAIH,WALD,MAKO;AACH,mBAAO,IAAP;AACH;AACJ,SAXI;AAYL,QAAA,WAZK,yBAYS;AAAA;;AACV;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,gBAAI,YAAY,GAAG,MAAI,CAAC,GAAL,CAAS,aAAT,CAAuB,8BAAvB,CAAnB;;AACA,YAAA,MAAI,CAAC,SAAL,GAAiB,YAAY,GAAG,IAAH,GAAU,KAAvC,CAFiB,CAGjB;AACH,WAJD;AAKH,SAnBI;AAoBL,QAAA,OApBK,qBAoBK;AACN,eAAK,QAAL,GAAgB,KAAK,GAAL,CAAS,OAAT,CAAiB,qBAAjB,IAA0C,KAAK,GAAL,CAAS,OAAT,CAAiB,qBAAjB,EAAwC,YAAxC,CAAqD,MAArD,CAA1C,GAAyG,IAAzH;AACH,SAtBI;AAuBL,QAAA,YAvBK,wBAuBQ,IAvBR,EAuBc;AACf,cAAI,IAAI,CAAC,SAAL,IAAkB,KAAK,WAA3B,EAAwC;AACpC,iBAAK,WAAL,GAAmB,IAAnB;AACH;AACJ,SA3BI;AA4BL,QAAA,WA5BK,uBA4BO,IA5BP,EA4Ba;AACd,cAAK,IAAI,CAAC,SAAL,IAAkB,KAAK,WAAxB,IAAwC,KAAK,WAAjD,EAA8D;AAC3D,iBAAK,WAAL,GAAmB,KAAnB,CAD2D,CACjC;AAC5B;AACJ,SAhCI;AAiCL,QAAA,IAjCK,kBAiCE;AAAA;;AACH,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,IAAD,EAAU;AACrC,YAAA,MAAI,CAAC,YAAL,CAAkB,IAAlB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,aAAb,EAA4B,UAAC,IAAD,EAAU;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,IAAjB;AACH,WAFD;AAGH;AAxCI,OA1CS;AAoFlB,MAAA,OApFkB,qBAoFR;AAAA;;AACN,6BAAS,GAAT,CAAa,cAAb,EAA6B,YAAM;AAC/B,UAAA,OAAI,CAAC,WAAL;AACH,SAFD;;AAGA,aAAK,OAAL;AACA,aAAK,IAAL;AACH;AA1FiB,KAAtB;;AA6FA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,uBAAgB,EAAhB,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,sBAGwB,EAHxB,GAG8B,IAH9B;AAIH,GAh4BD;;AAk4BA,MAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAAyB;AACrB,IAAA,QAAQ,CAAC,OAAT,CAAiB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC9B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,qBAAgC,KAAhC;AACA,MAAA,mBAAmB,CAAC,KAAD,CAAnB;AACH,KAHD;AAIH,GA34BkB,CA64BnB;;AAEH,CA/4BD;;eAi5Be,Q;;;;;;;;;;;ACh6Bf;;AACA;;AACA;;;;;;;;;;AAEA;AACA;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,GAAM;AAErB,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAT,CAA0B,cAA1B,CAAb;;AAEA,MAAM,qBAAqB,GAAG,SAAxB,qBAAwB,CAAC,EAAD,EAAQ;AAElC,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,IADP;AAEH,UAAA,OAAO,EAAE;AACL,YAAA,cAAc,EAAE,oBADX;AAEL,YAAA,iBAAiB,EAAE;AAFd,WAFN;AAMH,UAAA,IAAI,EAAE,IANH;AAOH,UAAA,MAAM,EAAE,IAPL;AAQH,UAAA,YAAY,EAAE;AARX,SAAP;AAUH,OAZiC;AAalC,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,eAAK,IAAL,GAAY,gBAAK,KAAK,QAAV,EAAoB,KAAK,OAAzB,CAAZ;AACH,SAHI;AAIL,QAAA,YAJK,0BAIU;AAAA;;AACX,eAAK,QAAL,CAAc,gBAAd,CAA+B,kBAA/B,EAAmD,YAAM;AACrD,YAAA,KAAI,CAAC,YAAL,GAAoB,KAAI,CAAC,IAAL,CAAU,WAAV,KAA0B,CAA9C;AACH,WAFD;;AAIA,+BAAS,GAAT,CAAa,cAAb,EAA6B,UAAC,MAAD,EAAY;AACrC,YAAA,KAAI,CAAC,YAAL,GAAoB,MAApB;;AACA,YAAA,KAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,MAAM,GAAG,CAA3B;AACH,WAHD;AAIH,SAbI;AAcL,QAAA,QAdK,sBAcM;AAAA;;AACP,cAAI,IAAI,GAAG;AACP,oBAAQ,OADD;AAEP,wBAAY,cAFL;AAGP,sBAAU,MAHH;AAIP,qBAAS,IAJF;AAKP,kBAAM;AALC,WAAX;AAOA,eAAK,QAAL,CAAc,gBAAd,CAA+B,IAA/B,EAAqC,OAArC,CAA6C,UAAC,KAAD,EAAQ,CAAR,EAAc;AACvD,YAAA,KAAK,CAAC,OAAN,CAAc,OAAd,GAAwB,IAAI,CAAC,SAAL,mBACjB,IADiB;AAEpB,uBAAS,MAAI,CAAC,GAAL,CAAS,gBAAT,CAA0B,0BAA1B,EAAsD,CAAtD,EAAyD,SAF9C;AAGpB,oBAAO,CAAC,GAAG,CAAL,GAAU,EAAV,cAAmB,CAAC,GAAG,CAAvB,cAAgC,CAAC,GAAG,CAApC;AAHc,eAAxB;AAKH,WAND;AAOH;AA7BI,OAbyB;AA4ClC,MAAA,OA5CkC,qBA4CxB;AACN,aAAK,QAAL,GAAgB,KAAK,GAAL,CAAS,aAAT,CAAuB,sBAAvB,CAAhB;AACA,aAAK,MAAL,GAAc,KAAK,GAAL,CAAS,gBAAT,CAA0B,qBAA1B,EAAiD,MAA/D;AACA,aAAK,QAAL;AACA,aAAK,YAAL;AACA,aAAK,QAAL;AACH;AAlDiC,KAAtC;;AAqDA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,cAAD,CAD2B;AAElC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAE,IADL;AAEH,UAAA,QAAQ,EAAE,IAFP;AAGH,UAAA,KAAK,EAAE;AAHJ,SAAP;AAKH,OARiC;AASlC,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,OADU;AAElB,wBAAY,cAFM;AAGlB,sBAAU,MAHQ;AAIlB,qBAAS,KAAK,KAJI;AAKlB,kBAAM,KAAK,MAAL,GAAc,EAAd,cAAuB,KAAK,MAA5B,IAAuC,KAAK,MAAL,CAAY,QAAZ;AAL3B,WAAf,CAAP;AAOH;AATK,OATwB;AAqBlC,MAAA,KAAK,EAAE;AACH,QAAA,YAAY,EAAE,wBAAW;AACrB,eAAK,QAAL,GAAgB,KAAK,MAAL,IAAe,KAAK,YAApB,GAAmC,IAAnC,GAA0C,KAA1D;AACH;AAHE,OArB2B;AA0BlC,MAAA,OAAO,EAAE;AACL,QAAA,IADK,kBACE;AACH;AACA,eAAK,MAAL,GAAc,GAAG,OAAH,CAAW,IAAX,CAAgB,KAAK,GAAL,CAAS,UAAT,CAAoB,QAApC,EAA8C,KAAK,GAAnD,IAA0D,CAAxE;AAEA,eAAK,QAAL,GAAgB,KAAK,MAAL,IAAe,KAAK,YAApB,GAAmC,IAAnC,GAA0C,KAA1D;AACA,eAAK,KAAL,GAAa,KAAK,GAAL,CAAS,aAAT,CAAuB,GAAvB,EAA4B,SAAzC;AACH,SAPI;AAQL,QAAA,WARK,yBAQS;AACV,+BAAS,KAAT,CAAe,cAAf,EAA+B,KAAK,MAApC;AACH;AAVI,OA1ByB;AAsClC,MAAA,OAtCkC,qBAsCxB;AACN,aAAK,IAAL;AACH;AAxCiC,KAAtC;;AA2CA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,yBAAkB,EAAlB;AADE,KAAR,EAEG,MAFH,wBAE0B,EAF1B,GAEgC,IAFhC;AAIH,GAtGD;;AAwGA,MAAI,IAAI,CAAC,MAAL,GAAc,CAAlB,EAAqB;AACjB,IAAA,IAAI,CAAC,OAAL,CAAa,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC1B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,uBAAkC,KAAlC;AACA,MAAA,qBAAqB,CAAC,KAAD,CAArB;AACH,KAHD;AAIH;AAEJ,CAnHD;;eAqHe,U;;;;;;;;;;;AC5Hf;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAGA,IAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AAEnB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,WAAvB,CAAb;AACA,MAAI,UAAU,GAAG,EAAjB;AACA,MAAI,eAAe,GAAK,CAAxB;;AAEA,MAAM,eAAe,GAAG,SAAlB,eAAkB,GACpB;AACA,IAAA,UAAU,CAAC,MAAX,GAAoB,CAApB;AACA,IAAA,eAAe,GAAK,CAApB;AACA,QAAM,SAAS,GAAS,QAAQ,CAAC,aAAT,CAAuB,6BAAvB,CAAxB;AACA,QAAM,YAAY,GAAM,QAAQ,CAAC,aAAT,CAAuB,iBAAvB,CAAxB;AACA,QAAM,SAAS,GAAS,QAAQ,CAAC,gBAAT,CAA0B,mBAA1B,CAAxB;AACA,QAAM,QAAQ,GAAU,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,CAAxB;;AAEA,SAAI,IAAI,CAAC,GAAC,CAAV,EAAa,CAAC,GAAE,SAAS,CAAC,MAA1B,EAAkC,CAAC,EAAnC,EAAwD;AACpD;AAAC,MAAA,SAAS,CAAC,CAAD,CAAT,CAAa,SAAb,CAAuB,MAAvB,CAA8B,kBAA9B;AAAkD;;AAEvD,SAAI,IAAI,EAAC,GAAC,CAAV,EAAa,EAAC,GAAE,QAAQ,CAAC,MAAzB,EAAiC,EAAC,EAAlC,EAAwD;AACpD;AAAC,MAAA,QAAQ,CAAC,EAAD,CAAR,CAAY,SAAZ,CAAsB,MAAtB,CAA6B,kBAA7B;AAAiD;;AAEtD,IAAA,SAAS,CAAC,SAAV,CAAoB,GAApB,CAAwB,YAAxB,EAdA,CAcwD;;AACxD,IAAA,YAAY,CAAC,SAAb,CAAuB,GAAvB,CAA2B,kBAA3B;AACC,GAjBL;;AAoBA,MAAM,mBAAmB,GAAG,SAAtB,mBAAsB,GAAM;AAC9B,uBAAI,SAAJ,CAAc,mBAAd,EAAmC;AAC/B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QADpB;AAEF,YAAA,iBAAiB,EAAE,IAFjB;AAGF,YAAA,mBAAmB,EAAE,IAHnB;AAIF,YAAA,gBAAgB,EAAE,IAJhB;AAKF,YAAA,cAAc,EAAE,KALd;AAMF,YAAA,cAAc,EAAE,KANd;AAMqB;AACvB,YAAA,eAAe,EAAE,KAPf;AAQF,YAAA,iBAAiB,EAAE,KARjB;AASF,YAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QATpB;AAUF,YAAA,UAAU,EAAE,KAVV;AAWF,YAAA,KAAK,EAAE,iBAXL;AAYF,YAAA,SAAS,EAAE;AAZT;AADH,SAAP;AAgBH,OAlB8B;AAmB/B,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AANK,OAnBqB;AA2B/B,MAAA,KAAK,EAAE;AACH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;;AACA,cAAI,CAAC,KAAK,IAAL,CAAU,QAAf,EAAyB;AACrB;AACA,iBAAK,IAAL,CAAU,cAAV,GAA2B,KAA3B;AACH;;AACD,eAAK,YAAL;AACH,SARE;AASH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACH,SAXE;AAYH;AACA,kCAA0B,iCAAW;AACjC,cAAI,CAAC,KAAK,IAAL,CAAU,QAAf,EAAyB;AACrB,gBAAI,KAAK,IAAL,CAAU,iBAAV,KAAgC,IAApC,EAA0C;AACtC,cAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,KAAK,YAAxC;AACH,aAFD,MAEO;AACH,cAAA,QAAQ,CAAC,mBAAT,CAA6B,OAA7B,EAAsC,KAAK,YAA3C;AACH;AACJ,WAND,MAMO;AACH,YAAA,QAAQ,CAAC,mBAAT,CAA6B,OAA7B,EAAsC,KAAK,YAA3C;AACH;AACJ,SAvBE;AAwBH,0BAAkB,yBAAW;AACzB,cAAI,aAAa,GAAG,KAAK,GAAL,CAAS,UAA7B,CADyB,CAEzB;;AACA,kBAAQ,KAAK,IAAL,CAAU,SAAlB;AACI,iBAAK,KAAL;AACI,cAAA,aAAa,CAAC,SAAd,CAAwB,MAAxB,CAA+B,QAA/B;AACA;;AACJ,iBAAK,IAAL;AACI,cAAA,aAAa,CAAC,SAAd,CAAwB,MAAxB,CAA+B,QAA/B;AACA;;AACJ,iBAAK,MAAL;AACI,cAAA,aAAa,CAAC,SAAd,CAAwB,GAAxB,CAA4B,QAA5B;AACA;;AACJ;AACI;AAXR;AAaH;AAxCE,OA3BwB;AAqE/B,MAAA,OAAO,EAAE;AACL,QAAA,gBADK,8BACc;AACf,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC,CADe,CACuC;;AACtD,cAAM,MAAM,GAAG,KAAK,IAAL,CAAU,cAAzB;;AACA,cAAG,MAAM,IAAI,IAAb,EACI;AAAC,YAAA,QAAQ,CAAC,IAAT,CAAc,SAAd,CAAwB,GAAxB,CAA4B,aAA5B;AAA4C,WADjD,MAGI;AAAC,YAAA,QAAQ,CAAC,IAAT,CAAc,SAAd,CAAwB,MAAxB,CAA+B,aAA/B;AAA+C;;AACpD,UAAA,eAAe;AAClB,SATI;AAUL,QAAA,YAVK,wBAUQ,CAVR,EAUW;AACZ,cAAI,MAAM,GAAG,CAAC,CAAC,MAAf;AACA,cAAI,QAAQ,GAAG,KAAK,GAApB;;AACA,cAAI,CAAC,QAAQ,CAAC,QAAT,CAAkB,MAAlB,CAAL,EAAgC;AAC5B,iBAAK,IAAL,CAAU,iBAAV,GAA8B,IAA9B;AACH;AACJ,SAhBI;AAiBL,QAAA,YAjBK,0BAiBU;AAAA;;AACX,cAAI,SAAS,GAAG,CAAhB;;AACA,cAAM,YAAY,GAAG,SAAf,YAAe,GAAM;AACvB,gBAAK,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAAxC,IAA+C,CAAnD,EAAsD;AAClD,cAAA,KAAI,CAAC,IAAL,CAAU,SAAV,GAAsB,KAAtB;AACH,aAFD,MAEO,IAAK,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAAxC,GAA8C,SAAlD,EAA6D;AAChE,cAAA,KAAI,CAAC,IAAL,CAAU,SAAV,GAAsB,IAAtB;AACH,aAFM,MAEA;AACH,cAAA,KAAI,CAAC,IAAL,CAAU,SAAV,GAAsB,MAAtB;AACH;;AACD,YAAA,SAAS,GAAI,QAAQ,CAAC,IAAT,CAAc,qBAAd,EAAD,CAAwC,GAApD;AACH,WATD,CAFW,CAYX;;;AACI,UAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,YAAlC,EAbO,CAcX;AACA;AACA;AACH,SAlCI;AAmCL,QAAA,IAnCK,kBAmCE;AAAA;;AACH,+BAAS,GAAT,CAAa,oBAAb,EAAmC,UAAC,EAAD,EAAQ;AACvC,YAAA,MAAI,CAAC,IAAL,CAAU,gBAAV,GAA6B,EAA7B;AACA,YAAA,MAAI,CAAC,IAAL,CAAU,cAAV,GAA2B,IAA3B;AACA,YAAA,MAAI,CAAC,IAAL,CAAU,eAAV,GAA4B,KAA5B;AACH,WAJD;AAMA;;;;;;;;;;;;;;;;;AAkBH;AA5DI,OArEsB;AAmI/B,MAAA,OAnI+B,qBAmIrB;AACN,aAAK,IAAL;AACA,aAAK,YAAL;AACH;AAtI8B,KAAnC,EAD8B,CA2I9B;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;AAuBD;;;;;;;;;;;;;;;AAgBC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDC;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,MAAD,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OALyB;AAM1B,MAAA,OAAO,EAAE,EANiB;AAQ1B,MAAA,OAR0B,qBAQhB,CAET;AAVyB,KAA9B;;AAaA,uBAAI,SAAJ,CAAc,gBAAd,EAAgC;AAC5B,MAAA,KAAK,EAAE,CAAC,MAAD,CADqB;AAE5B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QADnB;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,QAAQ,EAAE,KAHP;AAIH,UAAA,KAAK,EAAE;AAJJ,SAAP;AAMH,OAT2B;AAU5B,MAAA,QAAQ,EAAE;AACN,QAAA,UAAU,EAAE,sBAAW;AACnB,iBAAO,KAAK,IAAL,CAAU,gBAAjB;AACH,SAHK;AAIN,QAAA,eAAe,EAAE,2BAAW;AACxB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AANK,OAVkB;AAkB5B,MAAA,KAAK,EAAE;AACH;AACA,QAAA,UAAU,EAAE,sBAAW;AACnB,eAAK,QAAL,GAAgB,KAAK,EAAL,IAAW,KAAK,UAAhB,GAA6B,IAA7B,GAAoC,KAApD;AACH,SAJE;AAKH,QAAA,eAAe,EAAE,2BAAW;AACxB,eAAK,QAAL,GAAgB,kBAAM,KAAN,CAAY,QAA5B;AACA,eAAK,IAAL;AACH;AARE,OAlBqB;AA4B5B,MAAA,OAAO,EAAE;AACL,QAAA,IADK,gBACA,CADA,EACG;AACJ;AACA,UAAA,CAAC,CAAC,cAAF;;AACA,+BAAS,KAAT,CAAe,MAAf,EAAuB;AAAC,8BAAkB;AAAnB,WAAvB;AACH,SALI;AAML,QAAA,IANK,kBAME;AAAA;;AACH,cAAI,KAAK,GAAG,KAAK,QAAL,CAAc,IAAd,CAAmB,UAAA,IAAI,EAAI;AACnC;AACA;AACA,mBAAO,IAAI,CAAC,EAAL,KAAY,MAAI,CAAC,EAAxB;AACH,WAJW,CAAZ;;AAMA,cAAI,KAAJ,EAAW;AACP,iBAAK,KAAL,GAAa,KAAK,CAAC,KAAnB;AACH;AACJ;AAhBI,OA5BmB;AA8C5B,MAAA,OA9C4B,qBA8ClB;AACN,YAAI,SAAS,GAAG,KAAK,CAAC,IAAN,CAAW,QAAQ,CAAC,gBAAT,CAA0B,0BAA1B,CAAX,CAAhB;AACA,aAAK,EAAL,GAAU,aAAa,SAAS,CAAC,OAAV,CAAkB,KAAK,GAAvB,IAA8B,CAA3C,CAAV,CAFM,CAIN;AACA;AACH;AApD2B,KAAhC;;AAuDA,uBAAI,SAAJ,CAAc,kBAAd,EAAkC;AAC9B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QADnB;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,KAAK,EAAE;AAHJ,SAAP;AAKH,OAP6B;AAQ9B,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,OARoB;AAa9B,MAAA,KAAK,EAAE;AACH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,QAAL,GAAgB,KAAK,gBAArB;AACA,eAAK,IAAL;AACH;AAJE,OAbuB;AAmB9B,MAAA,OAAO,EAAE;AACL,QAAA,IADK,kBACE;AAAA;;AACH,cAAI,KAAK,QAAT,EAAmB;AACf;AACA,iBAAK,GAAL,CAAS,gBAAT,CAA0B,OAA1B,EAAmC,UAAC,CAAD,EAAO;AACtC,cAAA,CAAC,CAAC,cAAF;;AACA,cAAA,MAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,aAHD;AAIA,iBAAK,QAAL;AAEH,WARD,MAQO;AACH;AACA,iBAAK,GAAL,CAAS,mBAAT,CAA6B,OAA7B,EAAsC,UAAC,CAAD,EAAO;AACzC,cAAA,MAAI,CAAC,YAAL,CAAkB,CAAlB;AACH,aAFD;AAGH;AACJ,SAhBI;AAiBL,QAAA,YAjBK,wBAiBQ,CAjBR,EAiBW;AACZ;AACA,+BAAS,KAAT,CAAe,oBAAf,EAAoC,KAAK,EAAzC;AACH,SApBI;AAqBL;AACA,QAAA,QAtBK,sBAsBM;AACP,eAAK,KAAL,GAAa,KAAK,GAAL,CAAS,SAAtB;;AACA,4BAAM,MAAN,CAAa,YAAb,EAA2B;AAAC,kBAAM,KAAK,EAAZ;AAAe,qBAAQ,KAAK;AAA5B,WAA3B;AACH;AAzBI,OAnBqB;AA8C9B,MAAA,OA9C8B,qBA8CpB;AACN,YAAI,SAAS,GAAG,KAAK,CAAC,IAAN,CAAW,QAAQ,CAAC,gBAAT,CAA0B,gCAA1B,CAAX,CAAhB;AACA,aAAK,EAAL,GAAU,aAAa,SAAS,CAAC,OAAV,CAAkB,KAAK,GAAvB,IAA8B,CAA3C,CAAV;AACA,aAAK,IAAL;AACH;AAlD6B,KAAlC;;AAqDA,uBAAI,SAAJ,CAAc,eAAd,EAA+B;AAC3B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,UAAU,EAAE,IADT;AAEH,UAAA,QAAQ,EAAE,EAFP;AAGH,UAAA,KAAK,EAAE;AAHJ,SAAP;AAKH,OAP0B;AAQ3B,MAAA,OAAO,EAAE,EARkB;AAW3B,MAAA,OAX2B,qBAWjB,CAET;AAb0B,KAA/B;;AAgBA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,UAAD,EAAY,YAAZ,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE,IADH;AAEH,UAAA,QAAQ,EAAE;AAFP,SAAP;AAIH,OAP+B;AAQhC,MAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,sBAAW;AACnB,eAAK,QAAL,GAAgB,KAAK,UAAL,KAAoB,KAAK,IAAzB,GAAgC,IAAhC,GAAuC,KAAvD;AACH;AAHE,OARyB;AAahC,MAAA,OAAO,EAAE;AACL;AACA;AACA;AACA;AACA,QAAA,UALK,sBAKM,CALN,EAKS;AACV;AACA;AACA,cAAI,IAAI,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,IAAnC;;AACA,cAAI,IAAJ,EAAU;AACN,YAAA,QAAQ,CAAC,MAAT,8BAAsC,IAAtC;AACH;AACJ;AAZI,OAbuB;AA6BhC,MAAA,OA7BgC,qBA6BtB;AACN,aAAK,IAAL,GAAY,KAAK,GAAL,CAAS,YAAT,CAAsB,MAAtB,EAA8B,KAA9B,CAAoC,CAApC,EAAuC,WAAvC,EAAZ;AACA,aAAK,QAAL,GAAgB,KAAK,UAAL,IAAmB,KAAK,IAAxB,GAA+B,IAA/B,GAAsC,KAAtD;AACH;AAhC+B,KAApC;;AAmCA,uBAAI,SAAJ,CAAc,QAAd,EAAwB;AACpB,MAAA,KAAK,EAAE,CAAC,MAAD,CADa;AAEpB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAE,KADL;AAEH,UAAA,oBAAoB,EAAE,KAFnB;AAGH,UAAA,UAAU,EAAE,IAHT;AAGe;AAClB,UAAA,aAAa,EAAE,IAJZ;AAIkB;AACrB,UAAA,SAAS,EAAE,IALR;AAMH,UAAA,OAAO,EAAE;AANN,SAAP;AAQH,OAXmB;AAYpB,MAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,sBAAW;AACnB;AACA,cAAI,IAAI,GAAG,IAAX;;AACA,cAAI,KAAK,UAAL,IAAmB,KAAK,UAAL,CAAgB,OAAhB,CAAwB,MAAxB,EAAgC,EAAhC,MAAwC,EAA3D,IAAiE,KAAK,UAAL,CAAgB,MAAhB,GAAyB,CAA9F,EAAiG;AAC7F,iBAAK,oBAAL,GAA4B,IAA5B;AACA,iBAAK,SAAL,GAAiB,IAAjB;AACA,iBAAK,UAAL,GAH6F,CAI7F;AACH,WALD,MAKO;AACH,iBAAK,oBAAL,GAA4B,KAA5B;AACH;AACJ,SAZE;AAaH,QAAA,MAAM,EAAE,kBAAW;AAAA;;AACf,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,SAAL,CAAe,YAAM;AACjB,cAAA,MAAI,CAAC,KAAL,CAAW,YAAX,CAAwB,KAAxB;AACH,aAFD;AAGH;AACJ;AAnBE,OAZa;AAiCpB,MAAA,QAAQ,EAAE;AACN;AACA;AACA,QAAA,SAAS,EAAE,qBAAW;AAClB,2BAAU,MAAM,CAAC,aAAjB,gBAAoC,KAAK,aAAzC;AACH,SALK;AAMN,QAAA,UAAU,EAAE,sBAAW;AACnB,2BAAU,MAAM,CAAC,cAAjB,gBAAqC,KAAK,aAA1C;AACH,SARK;AASN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,2BAAU,MAAM,CAAC,oBAAjB,gBAA2C,KAAK,aAAhD;AACH,SAXK;AAYN,QAAA,aAAa,EAAE,yBAAW;AACtB,2BAAU,MAAM,CAAC,iBAAjB,gBAAwC,KAAK,aAA7C;AACH,SAdK;AAeN,QAAA,QAAQ,EAAE,oBAAW;AACjB,iBAAO,kBAAM,KAAN,CAAY,WAAnB;AACH,SAjBK;AAkBN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,QADU;AAElB,wBAAY,QAFM;AAGlB,sBAAU,UAHQ;AAIlB,qBAAS,KAAK,aAAL,GAAqB,KAAK,aAA1B,GAA0C,EAJjC;AAKlB,0BAAc;AALI,WAAf,CAAP;AAOH;AA1BK,OAjCU;AA6DpB,MAAA,OAAO,EAAE;AACL,QAAA,UADK,wBACQ;AACT,UAAA,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,SAAlD,CAA4D,GAA5D,CAAgE,SAAhE;AACH,SAHI;AAIL,QAAA,aAJK,2BAIW;AACZ,UAAA,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,SAAlD,CAA4D,MAA5D,CAAmE,SAAnE;AACH,SANI;AAOL,QAAA,YAPK,0BAOU;AACX,eAAK,MAAL,GAAc,CAAC,KAAK,MAApB;AACH,SATI;AAUL,QAAA,UAAU,EAAE,oBAAS,YAAW;AAC5B,eAAK,UAAL;AACA,eAAK,aAAL,GAAqB,KAAK,UAA1B;AACA,cAAI,MAAM,GAAG,eAAb,CAH4B,CAI5B;;AACA,cAAI,IAAI,GAAG,IAAX;;AACA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACd,YAAA,MAAM,EAAE;AACJ,cAAA,CAAC,EAAE,KAAK,UADJ;AAEJ,cAAA,IAAI,EAAE,KAAK;AAFP;AADM,WAAlB,EAMC,IAND,CAMM,UAAS,GAAT,EAAc;AAChB;AACA,YAAA,IAAI,CAAC,SAAL,GAAiB,KAAjB;AACA,YAAA,IAAI,CAAC,OAAL,GAAe,GAAG,CAAC,IAAJ,CAAS,OAAT,CAAiB,KAAjB,CAAuB,CAAvB,EAA0B,CAA1B,CAAf;AACA,YAAA,IAAI,CAAC,aAAL;AACH,WAXD,WAYO,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAdD;AAeH,SArBW,EAqBT,IArBS;AAVP,OA7DW;AA8FpB,MAAA,OA9FoB,qBA8FV,CACT;AA/FmB,KAAxB;;AAkGA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,SAAD,EAAY,WAAZ,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAGH,OAN+B;AAOhC,MAAA,QAAQ,uMAPwB;AAYhC,MAAA,KAAK,EAAE,EAZyB;AAehC,MAAA,OAAO,EAAE,EAfuB;AAkBhC,MAAA,OAlBgC,qBAkBtB,CAET;AApB+B,KAApC;;AAuBA,uBAAI,SAAJ,CAAc,aAAd,EAA6B;AACzB,MAAA,KAAK,EAAE,CAAC,SAAD,EAAY,WAAZ,CADkB;AAEzB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAGH,OANwB;AAOzB,MAAA,QAAQ,+vBAPiB;AAqBzB,MAAA,KAAK,EAAE,EArBkB;AAwBzB,MAAA,OAAO,EAAE,EAxBgB;AA2BzB,MAAA,OA3ByB,qBA2Bf,CAET;AA7BwB,KAA7B;;AAiCA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,aADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,cAGuB,IAHvB;AAIH,GA/xBD;;AA0zBA,MAAI,IAAJ,EACI;AAAA;AACA,MAAA,mBAAmB;AACnB,UAAI,UAAU,GAAU,IAAxB;AACA,UAAM,YAAY,GAAM,QAAQ,CAAC,aAAT,CAAuB,iBAAvB,CAAxB;AACA,UAAM,QAAQ,GAAU,QAAQ,CAAC,gBAAT,CAA0B,6BAA1B,CAAxB;AACA,UAAM,WAAW,GAAO,QAAQ,CAAC,aAAT,CAAuB,gBAAvB,CAAxB;AACA,UAAM,SAAS,GAAS,QAAQ,CAAC,aAAT,CAAuB,6BAAvB,CAAxB;AACA,UAAM,WAAW,GAAO,QAAQ,CAAC,gBAAT,CAA0B,yBAA1B,CAAxB;AACA,UAAM,UAAU,GAAQ,QAAQ,CAAC,aAAT,CAAuB,2BAAvB,CAAxB;AACA,UAAM,aAAa,GAAK,QAAQ,CAAC,aAAT,CAAuB,8BAAvB,CAAxB,CATA,CAWR;;AACA,MAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,UAAA,CAAC,EAChC;AACA;AACA,YAAI,CAAC,WAAW,CAAC,QAAZ,CAAqB,CAAC,CAAC,MAAvB,CAAD,IAAmC,CAAC,YAAY,CAAC,QAAb,CAAsB,CAAC,CAAC,MAAxB,CAApC,IAAuE,WAAW,CAAC,SAAZ,CAAsB,QAAtB,CAA+B,QAA/B,CAA3E,EACI;AACA,UAAA,WAAW,CAAC,SAAZ,CAAsB,MAAtB,CAA6B,QAA7B;AACA,UAAA,YAAY,CAAC,SAAb,CAAuB,MAAvB,CAA8B,mBAA9B;AACA,UAAA,QAAQ,CAAC,aAAT,CAAuB,oCAAvB,EAA6D,SAA7D,CAAuE,MAAvE,CAA8E,QAA9E;AACC;AACJ,OATL,EAZQ,CAsBR;;AACQ,MAAA,UAAU,CAAC,gBAAX,CAA4B,OAA5B,EAAoC,UAAS,CAAT,EAChC;AACA,QAAA,CAAC,CAAC,cAAF;AACA,YAAM,WAAW,GAAG,UAAU,CAAC,MAA/B,CAFA,CAEgH;;AAChH,YAAM,QAAQ,GAAM,WAAW,GAAE,CAAjC,CAHA,CAKA;;AACA,YAAI,WAAW,GAAG,CAAlB,EACI;AACA,cAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,GAAE,CAAX,CAA5B,CADA,CAEA;;AACA,UAAA,QAAQ,CAAC,aAAT,iBAAgC,WAAhC,GAA+C,SAA/C,CAAyD,MAAzD,CAAgE,kBAAhE;AACA,UAAA,QAAQ,CAAC,aAAT,iBAAgC,WAAhC,wBAAgE,SAAhE,CAA0E,MAA1E,CAAiF,iBAAjF,EAJA,CAKA;;AACA,UAAA,QAAQ,CAAC,aAAT,iBAAgC,QAAhC,GAA4C,SAA5C,CAAsD,GAAtD,CAA0D,kBAA1D;AACA,UAAA,QAAQ,CAAC,aAAT,iBAAgC,QAAhC,wBAA6D,SAA7D,CAAuE,GAAvE,CAA2E,iBAA3E;AACA,UAAA,aAAa,CAAC,SAAd,GAA0B,SAAS,CAAC,GAApC;AACA,UAAA,UAAU,CAAC,MAAX,GAAqB,WAAW,GAAE,CAAlC;AACC,SAXL,MAYK,IAAG,WAAW,IAAI,CAAlB,EAA0G;AAC3G;AACA,YAAA,SAAS,CAAC,SAAV,CAAoB,GAApB,CAAwB,YAAxB;AACA,YAAA,YAAY,CAAC,SAAb,CAAuB,GAAvB,CAA2B,kBAA3B;AACC;AACJ,OAxBL,EAvBA,CAyDR;;AACQ,UAAM,aAAa,GAAG,SAAhB,aAAgB,CAAS,IAAT,EAAe,GAAf,EAAoB,WAApB,EAClB;AACA,YAAM,aAAa,GAAO,QAAQ,CAAC,aAAT,CAAuB,mBAAvB,CAA1B;AACA,YAAM,aAAa,GAAO,QAAQ,CAAC,aAAT,iBAAgC,IAAhC,EAA1B;AACA,YAAM,eAAe,GAAK,QAAQ,CAAC,gBAAT,iBAAmC,IAAnC,uBAA1B,CAHA,CAKA;;AACA,YAAG,IAAI,IAAG,CAAV,EACI;AACA,UAAA,eAAe,GAAE,IAAjB;AACA,UAAA,aAAa,CAAC,SAAd,CAAwB,MAAxB,CAA+B,kBAA/B;AACC,SAVL,CAWA;;;AACA,YAAG,eAAe,IAAI,SAAnB,IAAgC,eAAe,CAAC,MAAhB,GAAuB,CAA1D,EACI;AACA,eAAI,IAAI,CAAC,GAAC,CAAV,EAAY,CAAC,GAAC,eAAe,CAAC,MAA9B,EAAqC,CAAC,EAAtC,EACI;AAAC,YAAA,eAAe,CAAC,CAAD,CAAf,CAAmB,SAAnB,CAA6B,MAA7B,CAAoC,iBAApC;AAAuD;AAC3D,SAhBL,CAmBA;AACA;;;AACA,YAAG,IAAI,GAAE,CAAT,EACI;AACA,UAAA,eAAe,GAAE,IAAjB;AACA,UAAA,YAAY,CAAC,SAAb,CAAuB,MAAvB,CAA8B,kBAA9B;AACA,UAAA,SAAS,CAAC,SAAV,CAAoB,MAApB,CAA2B,YAA3B;AACA,UAAA,UAAU,CAAC,IAAI,GAAC,CAAN,CAAV,GAAqB;AAAC,YAAA,GAAG,EAAE,WAAN;AAAmB,YAAA,MAAM,EAAC;AAA1B,WAArB;;AAEA,cAAG,GAAG,IAAI,gBAAV,EACI;AACA,YAAA,QAAQ,CAAC,aAAT,iBAAgC,IAAhC,mBAA6C,GAA7C,GAAoD,SAApD,CAA8D,GAA9D,CAAkE,iBAAlE;AACA,YAAA,aAAa,CAAC,SAAd,GAA0B,WAA1B;AACC;AACJ,SAZL,MAaK,IAAI,IAAI,IAAI,CAAZ,EACD;AACA,UAAA,eAAe,GAAC,CAAhB;AACA,UAAA,YAAY,CAAC,SAAb,CAAuB,GAAvB,CAA2B,kBAA3B;AACA,UAAA,SAAS,CAAC,SAAV,CAAoB,GAApB,CAAwB,YAAxB;AACC;;AACL,QAAA,aAAa,CAAC,SAAd,CAAwB,GAAxB,CAA4B,kBAA5B;AACC,OA1CL,CA1DA,CAsGA;;;AACA,UAAM,QAAQ,GAAC,SAAT,QAAS,CAAC,WAAD,EAAc,SAAd,EAAyB,SAAzB,EACX;AACA,YAAM,QAAQ,GAAa,CAA3B;AACA,YAAM,QAAQ,GAAa,QAAQ,CAAC,WAAD,CAAnC;AACA,QAAA,eAAe,GAAY,QAAQ,GAAG,CAAtC;AACA,YAAM,QAAQ,GAAa,WAAW,eAAtC;AACA,YAAM,GAAG,GAAkB,UAAU,SAArC;AACA,YAAM,UAAU,GAAW,QAAQ,CAAC,aAAT,WAA0B,QAA1B,cAA3B;AACA,YAAM,gBAAgB,GAAK,QAAQ,CAAC,aAAT,iBAAgC,QAAhC,cAA3B;AACA,YAAM,gBAAgB,GAAK,QAAQ,CAAC,aAAT,iBAAgC,QAAQ,GAAC,CAAzC,cAA3B;AACA,YAAM,GAAG,GAAkB,SAAS,CAAC,SAArC,CATA,CAWA;;AACA,YAAG,UAAU,IAAI,SAAjB,EACI;AACA,UAAA,UAAU,CAAC,SAAX,CAAqB,MAArB,CAA4B,QAA5B,EADA,CAEA;;AACA,cAAG,gBAAgB,IAAI,SAAvB,EACI;AAAC,YAAA,gBAAgB,CAAC,SAAjB,CAA2B,MAA3B,CAAkC,QAAlC;AAA6C,WAJlD,CAKA;;;AACA,cAAG,gBAAgB,IAAI,SAAvB,EACI;AAAC,YAAA,gBAAgB,CAAC,SAAjB,CAA2B,MAA3B,CAAkC,QAAlC;AAA4C,WAPjD,CASA;;;AACA,eAAK,IAAI,CAAC,GAAI,QAAQ,GAAC,CAAvB,EAA4B,CAAC,IAAG,QAAhC,EAA0C,CAAC,EAA3C,EACI;AACA,YAAA,QAAQ,CAAC,aAAT,iBAAgC,CAAhC,GAAqC,SAArC,CAA+C,MAA/C,CAAsD,QAAtD;AACC;AACJ,SA3BL,CA6BA;;;AACA,QAAA,QAAQ,CAAC,aAAT,CAAuB,QAAvB,EAAiC,SAAjC,CAA2C,GAA3C,CAA+C,QAA/C;AACA,QAAA,QAAQ,CAAC,aAAT,WAA0B,QAA1B,cAAsC,GAAtC,GAA6C,SAA7C,CAAuD,GAAvD,CAA2D,QAA3D;AACA,QAAA,SAAS,CAAC,SAAV,CAAoB,GAApB,CAAwB,QAAxB;AACA,QAAA,aAAa,CAAC,eAAD,EAAkB,SAAlB,EAA6B,GAA7B,CAAb;AACC,OAnCL;AAqCR;AACA;;;AACQ,WAAI,IAAI,CAAC,GAAC,CAAV,EAAY,CAAC,GAAC,QAAQ,CAAC,MAAvB,EAA8B,CAAC,EAA/B,EACI;AACA,QAAA,QAAQ,CAAC,CAAD,CAAR,CAAY,gBAAZ,CAA6B,OAA7B,EAAqC,UAAS,CAAT,EAC7B;AACA,UAAA,CAAC,CAAC,cAAF,GADA,CAEA;;AACA,cAAI,MAAM,CAAC,UAAP,GAAoB,IAAxB,EACQ;AACA,gBAAG,CAAC,CAAC,MAAF,CAAS,SAAT,CAAmB,QAAnB,CAA4B,QAA5B,CAAH,EACI;AACA,cAAA,WAAW,CAAC,SAAZ,CAAsB,MAAtB,CAA6B,QAA7B;AACA,cAAA,YAAY,CAAC,SAAb,CAAuB,MAAvB,CAA8B,mBAA9B;AACA,cAAA,CAAC,CAAC,MAAF,CAAS,SAAT,CAAmB,MAAnB,CAA0B,QAA1B;AACC,aALL,MAOI;AACA,cAAA,eAAe,GAAG,CAAlB;AACA,kBAAM,UAAU,GAAQ,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAxB,CAFA,CAEyF;;AACzF,kBAAM,aAAa,GAAK,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAxB,CAHA,CAGyF;;AACzF,kBAAM,eAAe,GAAG,QAAQ,CAAC,aAAT,CAAuB,+BAAvB,CAAxB,CAJA,CAIyF;;AACzF,kBAAM,MAAM,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,MAAhC,CALA,CAOA;;AACA,mBAAI,IAAI,GAAC,GAAC,CAAV,EAAY,GAAC,GAAE,UAAU,CAAC,MAA1B,EAAkC,GAAC,EAAnC,EACQ;AAAC,gBAAA,UAAU,CAAC,GAAD,CAAV,CAAc,SAAd,CAAwB,MAAxB,CAA+B,QAA/B;AAAyC,eATlD,CAWA;;;AACA,kBAAG,eAAe,IAAI,IAAtB,EACI;AACA,gBAAA,eAAe,CAAC,SAAhB,CAA0B,MAA1B,CAAiC,QAAjC;AACC,eAfL,CAiBA;;;AACA,mBAAI,IAAI,GAAC,GAAC,CAAV,EAAY,GAAC,GAAE,aAAa,CAAC,MAA7B,EAAqC,GAAC,EAAtC,EACI;AAAC,gBAAA,aAAa,CAAC,GAAD,CAAb,CAAiB,SAAjB,CAA2B,MAA3B,CAAkC,QAAlC;AAA4C;;AAEjD,cAAA,CAAC,CAAC,MAAF,CAAS,SAAT,CAAmB,GAAnB,CAAuB,QAAvB,EArBA,CAqBwF;;AACxF,cAAA,WAAW,CAAC,SAAZ,CAAsB,GAAtB,CAA0B,QAA1B,EAtBA,CAsBwF;;AACxF,cAAA,YAAY,CAAC,SAAb,CAAuB,GAAvB,CAA2B,mBAA3B;AACA,cAAA,QAAQ,CAAC,aAAT,uCAAsD,MAAtD,GAAgE,SAAhE,CAA0E,GAA1E,CAA8E,QAA9E,EAxBA,CAwBwF;AACvF;AACJ,WAnCT,CAoCA;AApCA,eAsCQ;AACA;AACA,kBAAM,EAAE,GAAG,CAAC,CAAC,MAAb;AACA,kBAAM,SAAS,GAAG,EAAE,CAAC,OAAH,CAAW,MAA7B;AACA,cAAA,aAAa,CAAC,CAAD,EAAI,SAAJ,EAAgB,EAAE,CAAC,SAAnB,CAAb,CAJA,CAI4G;AAC3G;AACR,SAhDT;AAiDC,OAjML,CAkMA;;;AACA,WAAI,IAAI,GAAC,GAAC,CAAV,EAAY,GAAC,GAAC,WAAW,CAAC,MAA1B,EAAiC,GAAC,EAAlC,EACI;AACA,QAAA,WAAW,CAAC,GAAD,CAAX,CAAe,gBAAf,CAAgC,WAAhC,EAA4C,UAAS,CAAT,EACxC;AACA,UAAA,CAAC,CAAC,cAAF;AACA,cAAM,QAAQ,GAAI,CAAC,CAAC,MAAF,CAAS,UAAT,CAAoB,UAApB,CAA+B,UAA/B,CAA0C,OAA1C,CAAkD,IAApE,CAFA,CAE2E;;AAC3E,cAAM,eAAe,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,MAAzC;AACA,cAAM,SAAS,GAAG,CAAC,CAAC,MAApB;;AACA,cAAG,MAAM,CAAC,UAAP,GAAoB,IAAvB,EACI;AACA,YAAA,UAAU,GAAG,UAAU,CAAC,YACpB;AAAC,cAAA,QAAQ,CAAE,QAAF,EAAY,eAAZ,EAA6B,SAA7B,CAAR;AAAiD,aAD/B,EACiC,GADjC,CAAvB;AAEC;AACJ,SAXL,EADA,CAcA;;;AACA,QAAA,WAAW,CAAC,GAAD,CAAX,CAAe,gBAAf,CAAgC,UAAhC,EAA2C,UAAS,CAAT,EACvC;AAAI,UAAA,YAAY,CAAC,UAAD,CAAZ;AAA2B,SADnC,EAfA,CAkBA;;;AACA,QAAA,WAAW,CAAC,GAAD,CAAX,CAAe,gBAAf,CAAgC,OAAhC,EAAwC,UAAS,CAAT,EACpC;AACA,UAAA,CAAC,CAAC,cAAF;AACA,cAAM,QAAQ,GAAI,CAAC,CAAC,MAAF,CAAS,UAAT,CAAoB,UAApB,CAA+B,UAA/B,CAA0C,OAA1C,CAAkD,IAApE,CAFA,CAE2E;;AAC3E,cAAM,eAAe,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,MAAzC;AACA,cAAM,SAAS,GAAG,CAAC,CAAC,MAApB;AACA,UAAA,QAAQ,CAAE,QAAF,EAAY,eAAZ,EAA6B,SAA7B,CAAR;AACC,SAPL;AAQC;AA/NL;AAiOC,GAtjCc,CAqkCnB;AACA;AACA;AACA;;AAEH,CA1kCD;;eA4kCe,Q;;;;;;;;;;;AChmCf;;AACA;;AACA;;;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,GAAM;AACrB,MAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,UAAvB,CAAb;;AAEA,MAAI,qBAAqB,GAAG,SAAxB,qBAAwB,GAAM;AAC9B,uBAAI,SAAJ,CAAc,SAAd,EAAyB;AACrB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,IADR;AAEH,UAAA,MAAM,EAAE;AAFL,SAAP;AAIH,OANoB;AAOrB,MAAA,KAAK,EAAE;AACH,QAAA,MAAM,EAAE,kBAAW;AACf;AACA,cAAI,KAAK,MAAT,EAAiB;AACb,YAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,KAAK,YAAxC;AACH,WAFD,MAEO;AACH,YAAA,QAAQ,CAAC,mBAAT,CAA6B,OAA7B,EAAsC,KAAK,YAA3C;AACH;AACJ;AARE,OAPc;AAiBrB,MAAA,OAAO,EAAE;AACL,QAAA,MADK,kBACE,EADF,EACM;AACP,eAAK,SAAL,GAAiB,EAAjB;AACH,SAHI;AAIL,QAAA,YAJK,wBAIQ,CAJR,EAIW;AACZ,cAAI,MAAM,GAAG,CAAC,CAAC,MAAf;AACA,cAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,UAAvB,CAAb;;AACA,cAAI,CAAC,MAAM,CAAC,QAAP,CAAgB,MAAhB,CAAL,EAA8B;AAC1B,iBAAK,MAAL,GAAc,KAAd;AACA,iBAAK,SAAL,GAAiB,IAAjB;AACH;AACJ;AAXI,OAjBY;AA8BrB,MAAA,OA9BqB,qBA8BX;AAAA;;AACN;AACA,aAAK,GAAL,CAAS,gBAAT,CAA0B,gBAA1B,EAA4C,OAA5C,CAAoD,UAAC,IAAD,EAAO,KAAP,EAAiB;AACjE,cAAI,IAAI,CAAC,aAAL,CAAmB,kBAAnB,CAAJ,EAA4C;AACxC,YAAA,IAAI,CAAC,OAAL,CAAa,EAAb,GAAkB,KAAlB;AACH;AACJ,SAJD,EAFM,CAON;;AACA,6BAAS,GAAT,CAAa,QAAb,EAAuB,UAAC,EAAD,EAAQ;AAC3B,UAAA,KAAI,CAAC,MAAL,CAAY,EAAZ;AACH,SAFD,EARM,CAWN;;;AACA,6BAAS,GAAT,CAAa,WAAb,EAA0B,UAAC,KAAD,EAAW;AACjC,UAAA,KAAI,CAAC,MAAL,GAAc,KAAd;AACH,SAFD;AAGH;AA7CoB,KAAzB;;AA+CA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,WAAD,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,KAAK,EAAE,IADJ;AAEH,UAAA,QAAQ,EAAE,KAFP;AAGH,UAAA,SAAS,EAAE;AAHR,SAAP;AAKH,OARyB;AAS1B,MAAA,KAAK,EAAE;AACH,QAAA,SAAS,EAAE,qBAAW;AAClB,eAAK,QAAL,GAAkB,KAAK,SAAL,IAAkB,KAAK,KAAxB,IAAkC,KAAK,KAAL,KAAe,IAAlD,GAA0D,IAA1D,GAAiE,KAAjF;AACH,SAHE;AAIH,QAAA,QAAQ,EAAE,oBAAW;AACjB;AACA,+BAAS,KAAT,CAAe,WAAf,EAA4B,KAAK,QAAL,GAAgB,IAAhB,GAAuB,KAAnD;AACH;AAPE,OATmB;AAkB1B,MAAA,OAAO,EAAE;AACL;AACA,QAAA,WAFK,uBAEO,CAFP,EAEU;AACX;AACA,eAAK,QAAL,GAAgB,KAAK,SAAL,GAAiB,CAAC,KAAK,QAAvB,GAAkC,KAAlD;;AACA,+BAAS,KAAT,CAAe,QAAf,EAAyB,KAAK,KAA9B;AACH;AANI,OAlBiB;AA0B1B,MAAA,OA1B0B,qBA0BhB;AAAA;;AACN;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,MAAI,CAAC,KAAL,GAAa,MAAI,CAAC,GAAL,CAAS,OAAT,CAAiB,EAAjB,IAAuB,IAApC;AACA,UAAA,MAAI,CAAC,SAAL,GAAiB,MAAI,CAAC,GAAL,CAAS,OAAT,CAAiB,EAAjB,GAAsB,IAAtB,GAA6B,KAA9C;AACH,SAHD;AAIH;AAhCyB,KAA9B;;AAmCA,uBAAI,SAAJ,CAAc,eAAd,EAA+B;AAC3B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,UAAU,EAAE,IADT;AAEH,UAAA,QAAQ,EAAE,EAFP;AAGH,UAAA,KAAK,EAAE;AAHJ,SAAP;AAKH,OAP0B;AAQ3B,MAAA,OAAO,EAAE,EARkB;AAU3B,MAAA,OAV2B,qBAUjB,CAET;AAZ0B,KAA/B;;AAeA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,UAAD,EAAY,YAAZ,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE,IADH;AAEH,UAAA,QAAQ,EAAE;AAFP,SAAP;AAIH,OAP+B;AAQhC;AACA;AACA;AACA;AACA;AACA,MAAA,OAAO,EAAE;AACR,QAAA,UADQ,sBACG,CADH,EACM;AACP;AACA;AACA,cAAI,IAAI,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,IAAnC;;AACA,cAAI,IAAJ,EAAU;AACN,YAAA,QAAQ,CAAC,MAAT,8BAAsC,IAAtC;AACH;AACJ;AARI,OAbuB;AAwBhC,MAAA,OAxBgC,qBAwBtB,CACN;AACA;AACH;AA3B+B,KAApC;;AA8BA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,YADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,aAGsB,IAHtB;AAIH,GApID;;AAsIA,MAAI,MAAJ,EAAY;AACR,IAAA,qBAAqB;AACxB;AACJ,CA5ID;;eA8Ie,U;;;;;;AClJf;;AACA;;;;;;;;;;;;AAEA,mBAAI,SAAJ,CACI,eADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,OAAO,EAAE,KADN;AAEH,IAAA,QAAQ,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KAFP;AAGH,IAAA,UAAU,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KAHT;AAIH,IAAA,QAAQ,EAAE,QAJP;AAKH,IAAA,eAAe,EAAE,MALd;AAMH,IAAA,YAAY,EAAE;AAAE,MAAA,IAAI,EAAE,KAAR;AAAe,iBAAS;AAAxB,KANX;AAOH,IAAA,cAAc,EAAE;AAPb,GADX;AAUI,EAAA,IAVJ,kBAUU;AAAA;;AACF,WAAO;AACH,MAAA,MAAM,EAAE,KAAK,OAAL,IAAgB,KAAK,OAAL,CAAa,GAAb,CAAiB,UAAA,CAAC;AAAA,eAAI,CAAC,CAAC,CAAC,QAAH,IAAe,CAAC,CAAC,KAArB;AAAA,OAAlB,EAA+C,GAA/C,CAAmD,UAAA,CAAC;AAAA,eAAI,KAAI,CAAC,YAAL,CAAkB,OAAlB,CAA0B,CAA1B,KAAgC,CAApC;AAAA,OAApD;AADrB,KAAP;AAGH,GAdL;AAeI,EAAA,KAAK,EAAE;AACH,IAAA,MAAM,EAAE;AACJ,MAAA,SAAS,EAAE,IADP;AAEJ,MAAA,OAFI,mBAEI,CAFJ,EAEM;AACN,YAAM,GAAG,GAAG,IAAZ;AACA,YAAM,KAAK,GAAI,CAAC,CAAC,MAAF,CAAS,UAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAa;AAAE,cAAI,CAAC,CAAL,EAAQ;AAAE,mBAAO,CAAP;AAAW;;AAAC,8CAAW,CAAX,IAAc,GAAG,CAAC,OAAJ,CAAY,CAAZ,CAAd;AAAgC,SAA9E,EAAiF,EAAjF,CAAf;AACA,aAAK,QAAL,IAAkB,KAAK,QAAL,CAAc,KAAd,CAAlB;AACH;AANG;AADL,GAfX;AAyBI,EAAA,QAAQ,EAAG,EAzBf;AA2BI,EAAA,OA3BJ,qBA2Bc,CACT,CA5BL;AA6BI,EAAA,aA7BJ,2BA6BoB,CACf,CA9BL;AA+BI,EAAA,OAAO,EAAE;AACL,IAAA,MADK,kBACE,CADF,EACK;AACN,UAAI,CAAC,KAAK,QAAV,EAAoB;AAChB,YAAM,MAAM,GAAG,EAAf;AACA,QAAA,MAAM,CAAC,CAAD,CAAN,GAAa,KAAK,MAAL,CAAY,CAAZ,CAAb;AACA,aAAK,MAAL,GAAc,MAAd;AACH;;AAED,WAAK,cAAL,CAAoB;AAAE,QAAA,KAAK,EAAE,KAAK,OAAL,CAAa,CAAb;AAAT,OAApB;AACH;AATI,GA/Bb;AA0CI,EAAA,QAAQ,EAAR;AA1CJ,CAFJ;;;;;ACHA;;AACA;;AACA;;AACA;;;;;;;;;;;;AAEA,mBAAI,SAAJ,CACI,UADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,YAAY,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KADX;AAEH,IAAA,WAAW,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KAFV;AAGH,IAAA,gBAAgB,EAAE,MAHf;AAIH,IAAA,WAAW,EAAE,MAJV;AAKH,IAAA,iBAAiB,EAAE,MALhB;AAMH,IAAA,aAAa,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KANZ;AAOH,IAAA,KAAK,EAAE,MAPJ;AAQH,IAAA,QAAQ,EAAE,QARP;AASH,IAAA,aAAa,EAAE,QATZ;AAUH,IAAA,mBAAmB,EAAE;AAAE,MAAA,IAAI,EAAE,OAAR;AAAiB,iBAAS;AAA1B,KAVlB;AAWH,IAAA,aAAa,EAAE,MAXZ;AAYH,IAAA,OAAO,EAAE,MAZN;AAaH,IAAA,MAAM,EAAE;AAbL,GADX;AAgBI,EAAA,IAhBJ,kBAgBU;AACF,WAAO;AACH,MAAA,MAAM,EAAE;AADL,KAAP;AAGH,GApBL;AAqBI,EAAA,KAAK,EAAE;AACH,IAAA,MADG,kBACI,CADJ,EACO;AACN,UAAM,SAAS,GAAG,6BAAlB;AACA,UAAM,cAAc,GAAG,uBAAvB;AACA,UAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CAAb;;AAEA,UAAG,CAAH,EAAM;AACF,QAAA,IAAI,CAAC,SAAL,CAAe,GAAf,CAAmB,SAAnB;AACA,YAAM,KAAK,GAAG,QAAQ,CAAC,aAAT,CAAuB,KAAvB,CAAd;AACA,QAAA,KAAK,CAAC,SAAN,CAAgB,GAAhB,CAAoB,cAApB;AACA,QAAA,IAAI,CAAC,WAAL,CAAiB,KAAjB;AACH,OALD,MAKO;AACH,YAAM,MAAK,GAAG,QAAQ,CAAC,aAAT,YAA2B,cAA3B,EAAd;;AAEA,QAAA,MAAK,IAAI,IAAI,CAAC,WAAL,CAAiB,MAAjB,CAAT;AACA,QAAA,IAAI,CAAC,SAAL,CAAe,MAAf,CAAsB,SAAtB;AACH;AACJ;AAjBE,GArBX;AAwCI,EAAA,QAAQ,EAAG;AACP,IAAA,SADO,uBACI;AACP,aAAO,OAAO,CAAC,KAAK,WAAN,CAAP,IAA6B,CAAC,OAAO,CAAC,KAAK,MAAN,CAA5C;AACH,KAHM;AAIP,IAAA,iBAJO,+BAIa;AAChB,aAAO,KAAK,gBAAZ;AACH,KANM;AAOP,IAAA,gBAPO,8BAOW;AACd,aAAO,OAAO,CAAC,KAAK,aAAN,CAAd;AACH,KATM;AAUP,IAAA,UAVO,wBAUK;AACR,aAAO,KAAK,SAAL,IAAmB,KAAK,gBAA/B;AACH;AAZM,GAxCf;AAsDI,EAAA,OAtDJ,qBAsDc,CACT,CAvDL;AAwDI,EAAA,aAxDJ,2BAwDoB,CACf,CAzDL;AA0DI,EAAA,OAAO,EAAE;AACL,IAAA,WADK,yBACQ;AACT,WAAK,aAAL,IAAsB,KAAK,aAAL,EAAtB;AACH,KAHI;AAIL,IAAA,IAJK,kBAIC;AACF,WAAK,MAAL,GAAc,CAAC,KAAK,MAApB;AACH,KANI;AAOL,IAAA,MAPK,oBAOG;AACJ,WAAK,QAAL,IAAiB,KAAK,QAAL,EAAjB;AACH;AATI,GA1Db;AAqEI,EAAA,QAAQ,EAAR;AArEJ,CAFJ;;AA2EA,mBAAI,SAAJ,CACI,oBADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,KAAK,EAAE;AADJ,GADX;AAII,EAAA,QAAQ,EAAE;AAJd,CAFJ;;AAUA,mBAAI,SAAJ,CACI,mBADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,KAAK,EAAE,MADJ;AAEH,IAAA,OAAO,EAAE;AAAE,MAAA,IAAI,EAAE,MAAR;AAAgB,iBAAS;AAAzB,KAFN;AAGH,IAAA,KAAK,EAAE,MAHJ;AAIH,IAAA,YAAY,EAAE,MAJX;AAKH,IAAA,cAAc,EAAE;AALb,GADX;AAQI,EAAA,IARJ,kBAQW;AACH,WAAO;AACH,MAAA,YAAY,EAAE,KAAK;AADhB,KAAP;AAGH,GAZL;AAaI,EAAA,QAAQ,EAAE;AACN,IAAA,SADM,uBACK;AACP,aAAO,KAAK,OAAL,CAAa,MAAb,IAAuB,KAAK,KAAL,GAAa,CAApC,IAAyC,KAAK,OAAL,CAAa,QAA7D;AACH,KAHK;AAIN,IAAA,eAJM,6BAIW;AACb,aAAO,KAAK,OAAL,CAAa,QAApB;AACH,KANK;AAON,IAAA,KAPM,mBAOC;AACH,UAAM,MAAM,GAAG,KAAK,OAAL,CAAa,KAA5B;;AACA,UAAI,CAAC,MAAL,EAAa;AACT,eAAO,IAAP;AACH;;AAED,UAAM,KAAK,GAAG,MAAM,CAAC,CAAD,CAApB;AAEA,aAAO;AAAE,QAAA,KAAK,EAAE,KAAK,CAAC,KAAf;AAAsB,QAAA,WAAW,EAAE,KAAK,CAAC;AAAzC,OAAP;AACH,KAhBK;AAiBN,IAAA,aAjBM,2BAiBS;AACX,UAAI,KAAK,OAAL,CAAa,MAAjB,EAAyB;AACrB,YAAI,CAAC,KAAK,YAAN,IAAsB,CAAC,KAAK,YAAL,CAAkB,KAA7C,EAAoD;AAChD,iBAAO,EAAP;AACH;;AAED,eAAO,QAAO,KAAK,YAAL,CAAkB,KAAzB,MAAmC,QAAnC,GAA8C,KAAK,YAAL,CAAkB,KAAhE,GAAwE,CAAC,KAAK,YAAL,CAAkB,KAAnB,CAA/E;AACH,OAND,MAMK;AACD,YAAI,CAAC,KAAK,YAAN,IAAsB,CAAC,KAAK,YAAL,CAAkB,UAA7C,EAAyD;AACrD,cAAM,GAAG,GAAG,EAAZ;;AAEA,cAAI,KAAK,YAAL,IAAqB,KAAK,OAAL,CAAa,OAAtC,EAA+C;AAC3C,YAAA,GAAG,CAAC,QAAJ,GAAe;AAAE,cAAA,KAAK,EAAE,KAAK;AAAd,aAAf;AACH;;AAED,iBAAO,GAAP;AACH;;AAED,eAAO,KAAK,YAAL,CAAkB,UAAzB;AACH;AACJ,KArCK;AAsCN,IAAA,GAtCM,iBAsCD;AACD,aAAO,KAAK,OAAL,CAAa,QAAb,CAAsB,IAAtB,EAAP;AACH;AAxCK,GAbd;AAuDI,EAAA,OAAO,EAAE;AACL,IAAA,QADK,oBACI,CADJ,EACM;AAAA,0BACwD,KAAK,OAD7D;AAAA,UACC,KADD,iBACC,KADD;AAAA,UACgB,EADhB,iBACQ,MADR;AAAA,UACoB,QADpB,iBACoB,QADpB;AAAA,gDAC8B,UAD9B;AAAA,UACyC,KADzC,sCACiD,EADjD;AAEP,UAAI,KAAK,GAAG,IAAZ;;AAEA,UAAI,KAAK,OAAL,CAAa,MAAjB,EAAyB;AACrB,YAAM,KAAK,GAAG,CAAC,CAAC,GAAF,CAAM,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,KAAN;AAAA,SAAP,CAAd;AACA,YAAM,MAAM,GAAG,CAAC,CAAC,CAAC,IAAF,CAAO,UAAA,CAAC;AAAA,iBAAI,OAAO,CAAC,CAAC,CAAC,aAAH,CAAX;AAAA,SAAR,KAAyC,EAA1C,EAA8C,aAA9C,IAA+D,EAA9E;AACA,YAAM,SAAS,GAAG,QAAQ,IAAI,QAAQ,CAAC,CAAD,CAAtC;;AACA,YAAM,KAAK,uBAAM,SAAN,EAAkB,KAAK,CAAC,MAAN,KAAiB,CAAjB,GAAqB,KAAK,CAAC,CAAD,CAA1B,GAAgC,KAAlD,CAAX;;AACA,QAAA,KAAK,GAAG,KAAK,CAAC,MAAN,KAAiB,CAAjB,GAAqB,IAArB,GAA4B;AAAE,UAAA,KAAK,EAAL,KAAF;AAAS,UAAA,EAAE,EAAF,EAAT;AAAa,UAAA,KAAK,EAAL,KAAb;AAAoB,UAAA,KAAK,EAAL,KAApB;AAA2B,UAAA,MAAM,EAAN,MAA3B;AAAmC,UAAA,KAAK,EAAL;AAAnC,SAApC;AACH,OAND,MAMO;AAAA,YACY,UADZ,GAC+C,CAD/C,CACK,KADL;AAAA,YACwB,QADxB,GAC+C,CAD/C,CACwB,QADxB;AAAA,YACkC,QADlC,GAC+C,CAD/C,CACkC,QADlC;AAEH,YAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,OAAL,CAAa,KAAd,CAAxB;AAEA,QAAA,KAAK,GAAG;AACJ,UAAA,KAAK,EAAE,UADH;AAEJ,UAAA,UAAU,EAAE,CAFR;AAGJ,UAAA,MAAM,EAAE,QAHJ;AAIJ,UAAA,KAAK,EAAL;AAJI,SAAR;;AAOA,YAAM,UAAS,GAAG,QAAQ,IAAI,QAAQ,CAAC,CAAD,CAAtC;;AACA,YAAM,OAAK,uBAAM,UAAN,EAAkB,KAAK,CAAC,KAAxB,CAAX;;AAEA,YAAI,QAAQ,IAAI,QAAQ,CAAC,MAAT,GAAkB,CAA9B,KAAoC,QAAQ,IAAI,QAAhD,CAAJ,EAA+D;AAC3D,cAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAAzB;AACA,UAAA,OAAK,CAAC,QAAD,CAAL,GAAkB,QAAQ,GAAG,QAAQ,CAAC,KAAZ,GAAoB,QAAQ,CAAC,KAAvD;AACH;;AAED,YAAM,OAAO,GAAG,KAAK,CAAC,KAAN,KAAgB,EAAhB,IAAsB,KAAK,CAAC,KAAN,KAAgB,SAAtC,IAAmD,KAAK,CAAC,KAAN,KAAgB,IAAnF;AACA,QAAA,KAAK,GAAG,CAAC,OAAD,qBAAgB,KAAhB;AAAuB,UAAA,KAAK,EAAL,KAAvB;AAA8B,UAAA,EAAE,EAAF,EAA9B;AAAkC,UAAA,KAAK,EAAL;AAAlC,aAA4C,IAApD;AACH;;AAED,WAAK,KAAL,CAAW,OAAX,EAAoB,KAApB;AACH,KAnCI;AAoCL,IAAA,oBApCK,gCAoCgB,IApChB,EAoCsB;AACvB,WAAK,cAAL,mBAAyB,IAAzB;AAA+B,QAAA,aAAa,EAAE,KAAK;AAAnD;AACH;AAtCI,GAvDb;AA+FI,EAAA,QAAQ,EAAE;AA/Fd,CAFJ;;;;;AC1FA;;AACA;;;;;;;;;;AAEA,mBAAI,SAAJ,CACI,cADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,KAAK,EAAE,MADJ;AAEH,IAAA,WAAW,EAAE,MAFV;AAGH,IAAA,QAAQ,EAAE,MAHP;AAIH,IAAA,KAAK,EAAE,MAJJ;AAKH,IAAA,QAAQ,EAAE,MALP;AAMH,IAAA,eAAe,EAAE,KANd;AAOH,IAAA,QAAQ,EAAE,QAPP;AAQH,IAAA,YAAY,EAAE;AAAE,MAAA,IAAI,EAAE,MAAR;AAAgB,iBAAS;AAAzB,KARX;AASH,IAAA,cAAc,EAAE;AATb,GADX;AAYI,EAAA,IAZJ,kBAYU;AACF,QAAM,IAAI,GAAG;AACT,MAAA,aAAa,EAAE,KADN;AAET,MAAA,aAAa,EAAE,EAFN;AAGT,MAAA,UAAU,EAAE,EAHH;AAIT,MAAA,aAAa,EAAE,KAAK,QAJX;AAKT,MAAA,UAAU,EAAE,KAAK,KALR;AAMT,MAAA,YAAY,EAAE,KAAK,YANV;AAOT,MAAA,iBAAiB,EAAE,IAPV;AAQT,MAAA,iBAAiB,EAAE;AARV,KAAb;;AAWA,QAAI,KAAK,YAAL,CAAkB,QAAtB,EAAgC;AAC5B,MAAA,IAAI,CAAC,aAAL,GAAqB,KAAK,QAAL,CAAc,KAAd,CAAoB,KAApB,KAA8B,KAAK,YAAL,CAAkB,QAAlB,CAA2B,KAA9E;AACH;;AAED,QAAI,KAAK,YAAL,CAAkB,QAAtB,EAAgC;AAC5B,MAAA,IAAI,CAAC,aAAL,GAAqB,KAAK,YAAL,CAAkB,QAAlB,CAA2B,KAAhD;AACH;;AAED,QAAI,KAAK,YAAL,CAAkB,KAAtB,EAA6B;AACzB,MAAA,IAAI,CAAC,UAAL,GAAkB,KAAK,YAAL,CAAkB,KAAlB,CAAwB,QAAxB,EAAlB;AACH;;AAED,IAAA,IAAI,CAAC,iBAAL,GAAyB,IAAI,CAAC,UAA9B;AAEA,WAAO,IAAP;AACH,GAvCL;AAwCI,EAAA,KAAK,EAAE;AACH,IAAA,aAAa,EAAE;AACX,MAAA,OADW,mBACH,CADG,EACA,CADA,EACG;AACV,YAAI,CAAC,KAAK,aAAV,EAAyB;AACrB;AACH;;AACD,YAAM,MAAM,GAAG,CAAC,GAAG,KAAK,QAAL,CAAc,KAAjB,GAAyB,KAAK,QAAL,CAAc,IAAvD;AAEA,aAAK,YAAL,qBACO,KAAK,YADZ;AAEI,UAAA,QAAQ,EAAE;AAFd;;AAKA,YAAI,CAAC,CAAC,KAAK,SAAN,IAAmB,KAAK,aAAL,KAAuB,EAA3C,KAAkD,MAAlD,IAA4D,KAAK,eAArE,EAAsF;AAClF,cAAI,KAAK,eAAL,CAAqB,MAAM,CAAC,KAA5B,CAAJ,EAAwC;AACpC,gBAAM,cAAc,GAAG,KAAK,eAAL,CAAqB,MAAM,CAAC,KAA5B,EAAmC,CAAnC,KAAyC,EAAhE;AACA,iBAAK,aAAL,GAAqB,cAAc,CAAC,KAAf,IAAwB,EAA7C;AACH;AACJ;AACJ,OAlBU;AAmBX,MAAA,SAAS,EAAE;AAnBA,KADZ;AAsBH,IAAA,aAAa,EAAE;AACX,MAAA,OADW,mBACH,CADG,EACA;AACP,YAAI,CAAC,KAAK,aAAV,EAAyB;AACrB;AACH;;AAED,aAAK,YAAL,qBACO,KAAK,YADZ;AAEI,UAAA,QAAQ,EAAE,KAAK,aAAL,CAAmB,OAAnB,CAA2B,IAA3B,CAAgC,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,KAAF,KAAY,CAAhB;AAAA,WAAjC;AAFd;AAIH,OAVU;AAWX,MAAA,SAAS,EAAE;AAXA,KAtBZ;AAmCH,IAAA,UAAU,EAAE;AACR,MAAA,OADQ,mBACA,CADA,EACG;AACP,YAAI,CAAC,KAAK,UAAV,EAAsB;AAClB;AACH;;AAHM,0BAK8B,KAAK,KALnC;AAAA,YAKC,UALD,eAKC,UALD;AAAA,+CAKa,QALb;AAAA,YAKa,QALb,qCAKwB,CALxB;AAMP,YAAI,MAAM,GAAG,CAAb;AACA,YAAI,MAAM,GAAG,CAAb;AAEA,YAAI,KAAK,GAAG,CAAC,CAAC,OAAF,CAAU,aAAV,EAAyB,UAAS,EAAT,EAAY;AACzC,cAAM,CAAC,UAAD,IAAe,EAAE,KAAK,GAAtB,IAA6B,CAAC,CAAC,OAAF,CAAU,GAAV,MAAmB,CAAhD,IAAqD,CAAE,MAAM,EAA9D,IAAuE,QAAQ,GAAG,CAAX,IAAgB,EAAE,KAAK,GAAvB,IAA8B,CAAE,MAAM,EAAlH,EAAyH;AACzH,mBAAO,EAAP;AACH;;AAED,iBAAO,EAAP;AACH,SANW,CAAZ;AAQA,YAAM,EAAE,GAAG,KAAK,CAAC,OAAN,CAAc,GAAd,CAAX;;AACA,YAAI,EAAE,GAAG,CAAC,CAAV,EAAa;AACT,cAAM,IAAI,GAAG,KAAK,CAAC,MAAN,GAAe,EAAf,GAAoB,CAApB,GAAwB,QAArC;;AAEA,cAAI,IAAI,GAAG,CAAX,EAAc;AACX,YAAA,KAAK,GAAG,KAAK,CAAC,SAAN,CAAgB,CAAhB,EAAmB,KAAK,CAAC,MAAN,GAAe,IAAlC,CAAR;AACF;AACJ;;AAED,YAAM,YAAY,GAAG,UAAU,CAAC,KAAD,CAA/B;AACA,aAAK,iBAAL,GAAyB,IAAzB;;AAEA,YAAI,KAAK,KAAL,CAAW,UAAf,EAA2B;AAAA,sCACU,KAAK,KAAL,CAAW,UADrB;AAAA,cAChB,KADgB,yBAChB,KADgB;AAAA,6DACT,GADS;AAAA,cACT,GADS,uCACH,IADG;AAAA,cACG,GADH,yBACG,GADH;;AAGvB,cAAK,GAAG,KAAK,IAAR,IAAgB,GAAG,GAAG,KAAvB,IAAkC,GAAG,IAAI,GAAG,GAAG,KAAnD,EAA2D;AACtD,iBAAK,iBAAL,GAAyB,KAAzB;AACJ;AACJ;;AAED,aAAK,UAAL,GAAkB,KAAlB;AAEA,aAAK,YAAL,qBACO,KAAK,YADZ;AAEI,UAAA,KAAK,EAAE,KAAK,KAAK,EAAV,GAAe,EAAf,GAAoB,UAAU,CAAC,KAAD;AAFzC;AAIH,OA5CO;AA6CR,MAAA,SAAS,EAAE;AA7CH,KAnCT;AAkFH,IAAA,YAlFG,wBAkFU,CAlFV,EAkFa;AACZ,WAAK,SAAL;AACH,KApFE;AAqFH,IAAA,YArFG,0BAqFW;AACV,WAAK,cAAL,CAAoB;AAAE,QAAA,KAAK,EAAE,KAAK;AAAd,OAApB;AACH;AAvFE,GAxCX;AAiII,EAAA,QAAQ,EAAG;AACP,IAAA,YADO,0BACO;AACV,aAAO,KAAK,iBAAL,IAA0B,KAAK,MAAL,GAAc,OAAO,KAAK,MAAL,CAAY,KAAZ,IAAqB,KAAK,MAAL,CAAY,KAAxC,CAAd,GAA+D,EAAzF,CAAP;AACH,KAHM;AAIP,IAAA,aAJO,2BAIQ;AACX,UAAG,CAAC,KAAK,eAAT,EAAyB;AACrB,eAAO,IAAP;AACH;;AAED,UAAM,MAAM,GAAG,CAAC,KAAK,aAAL,GAAqB,KAAK,QAAL,CAAc,KAAnC,GAA2C,KAAK,QAAL,CAAc,IAA1D,KAAmE,EAAlF;AAEA,aAAO;AAAE,QAAA,OAAO,EAAE,KAAK,eAAL,CAAqB,MAAM,CAAC,KAA5B,KAAsC;AAAjD,OAAP;AACH,KAZM;AAaP,IAAA,UAbO,wBAaK;AACR,UAAM,GAAG,GAAG,IAAZ;AACA,aAAO;AACH,QAAA,KAAK,EAAE;AACH,UAAA,MAAM,EAAE;AADL,SADJ;AAIH,QAAA,QAAQ,kBAAW,GAAG,CAAC,UAAJ,CAAe,KAA1B;AAJL,OAAP;AAMH,KArBM;AAsBP,IAAA,MAtBO,oBAsBC;AACJ,aAAO,KAAK,aAAL,GAAqB,KAAK,YAAL,CAAkB,QAAvC,GAAkD,KAAK,YAAL,CAAkB,QAA3E;AACH;AAxBM,GAjIf;AA2JI,EAAA,OA3JJ,qBA2Jc;AACN,SAAK,SAAL;AACH,GA7JL;AA8JI,EAAA,aA9JJ,2BA8JoB,CACf,CA/JL;AAgKI,EAAA,OAAO,EAAE;AAEL,IAAA,SAFK,uBAEM;AACP,WAAK,QAAL,IAAiB,KAAK,QAAL,CAAc,KAAK,YAAnB,CAAjB;AACH,KAJI;AAKL,IAAA,WALK,yBAKQ;AACT,WAAK,iBAAL,GAAyB,KAAK,UAA9B;AACH;AAPI,GAhKb;AAyKI,EAAA,QAAQ,EAAR;AAzKJ,CAFJ;;;;;ACHA;;AACA;;;;;;;;;;AAEA,mBAAI,SAAJ,CACI,aADJ,EAEI;AACI,EAAA,KAAK,EAAE;AACH,IAAA,KAAK,EAAE,KADJ;AAEH,IAAA,QAAQ,EAAE,QAFP;AAGH,IAAA,OAAO,EAAE,MAHN;AAIH,IAAA,cAAc,EAAE;AAAE,MAAA,IAAI,EAAE,KAAR;AAAe,iBAAS;AAAxB,KAJb;AAKH,IAAA,MAAM,EAAE;AAAE,MAAA,IAAI,EAAE,MAAR;AAAgB,iBAAS;AAAzB;AALL,GADX;AAQI,EAAA,IARJ,kBAQU;AACF,WAAO;AACH,MAAA,WAAW,EAAG;AACV,yBAAkB;AADR,OADX;AAIH,MAAA,YAAY,EAAE,KAJX;AAKH,MAAA,WAAW,EAAE;AALV,KAAP;AAOH,GAhBL;AAiBI,EAAA,KAAK,EAAE;AACH,IAAA,OAAO,EAAE;AACL,MAAA,OADK,qBACK;AACN,aAAK,QAAL;AACH,OAHI;AAIL,MAAA,SAAS,EAAE;AAJN,KADN;AAOH,IAAA,KAAK,EAAE;AACH,MAAA,OADG,qBACO;AACN,aAAK,YAAL,GAAoB,IAApB;AACH,OAHE;AAIH,MAAA,SAAS,EAAE;AAJR;AAPJ,GAjBX;AA+BI,EAAA,QAAQ,EAAG;AACP,IAAA,QADO,sBACI;AACP,UAAM,GAAG,GAAG,IAAZ;AACA,aAAO,KAAK,KAAL,CAAW,GAAX,CAAe,UAAC,CAAD,EAAI,CAAJ,EAAU;AAC5B,YAAM,OAAO,GAAG;AACZ,8BAAqB,IADT;AAEZ,wCAA+B,CAAC,KAAK,GAAG,CAAC,OAF7B;AAGZ,uCAA8B,CAAC,IAAI,GAAG,CAAC;AAH3B,SAAhB;AAMA,iCAAW,CAAX;AAAc,UAAA,aAAa,EAAE,GAAG,CAAC,cAAJ,CAAmB,CAAnB,CAA7B;AAAoD,UAAA,OAAO,EAAP;AAApD;AACH,OARM,CAAP;AASH,KAZM;AAaP,IAAA,OAbO,qBAaG;AACN,aAAQ,KAAK,cAAL,IAAuB,KAAK,cAAL,CAAoB,MAA5C,IAAuD,CAA9D;AACH;AAfM,GA/Bf;AAgDI,EAAA,OAhDJ,qBAgDc;AACN,IAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,KAAK,QAAvC;AAEA,SAAK,KAAL,CAAW,IAAX,CAAgB,gBAAhB,CAAiC,YAAjC,EAA+C,KAAK,SAApD;AACA,SAAK,KAAL,CAAW,IAAX,CAAgB,gBAAhB,CAAiC,WAAjC,EAA8C,KAAK,SAAnD;AAEA,IAAA,QAAQ,CAAC,gBAAT,CAA0B,SAA1B,EAAqC,KAAK,OAA1C;AACA,IAAA,QAAQ,CAAC,gBAAT,CAA0B,UAA1B,EAAsC,KAAK,OAA3C;AAEA,IAAA,QAAQ,CAAC,gBAAT,CAA0B,WAA1B,EAAuC,KAAK,QAA5C;AACA,IAAA,QAAQ,CAAC,gBAAT,CAA0B,WAA1B,EAAuC,KAAK,QAA5C;AACH,GA3DL;AA4DI,EAAA,aA5DJ,2BA4DoB;AACZ,IAAA,MAAM,CAAC,mBAAP,CAA2B,QAA3B,EAAqC,KAAK,QAA1C;AAEA,SAAK,KAAL,CAAW,IAAX,CAAgB,mBAAhB,CAAoC,YAApC,EAAkD,KAAK,SAAvD;AACA,SAAK,KAAL,CAAW,IAAX,CAAgB,mBAAhB,CAAoC,WAApC,EAAiD,KAAK,SAAtD;AAEA,IAAA,QAAQ,CAAC,mBAAT,CAA6B,SAA7B,EAAwC,KAAK,OAA7C;AACA,IAAA,QAAQ,CAAC,mBAAT,CAA6B,UAA7B,EAAyC,KAAK,OAA9C;AAEA,IAAA,QAAQ,CAAC,mBAAT,CAA6B,WAA7B,EAA0C,KAAK,QAA/C;AACA,IAAA,QAAQ,CAAC,mBAAT,CAA6B,WAA7B,EAA0C,KAAK,QAA/C;AACH,GAvEL;AAwEI,EAAA,OAxEJ,qBAwEa;AACL,QAAI,KAAK,YAAT,EAAuB;AACnB,WAAK,QAAL;AACA,WAAK,YAAL,GAAoB,KAApB;AACH;AACJ,GA7EL;AA8EI,EAAA,OAAO,EAAE;AACL,IAAA,QADK,sBACK;AACN,UAAI,IAAI,GAAG,CAAX;AAEA,UAAM,CAAC,GAAG,MAAM,CAAC,UAAjB;AACA,UAAM,IAAI,GAAG,KAAK,KAAL,CAAW,IAAxB;AACA,UAAM,QAAQ,GAAI,IAAI,IAAI,IAAI,CAAC,UAAd,IAA6B,EAA9C;AACA,UAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAArB;AACA,UAAM,GAAG,GAAG,IAAI,GAAI,IAAI,CAAC,WAAL,GAAmB,IAAI,CAAC,UAAxB,GAAqC,KAAK,MAA9C,GAAwD,CAAxE;;AAEA,UAAI,CAAC,GAAG,GAAR,EAAa;AACT,YAAM,KAAK,GAAI,CAAC,GAAG,GAAG,CAAP,IAAY,CAAE,CAA7B;AAEA,YAAM,EAAE,GAAG,CAAC,GAAG,CAAf;AACA,YAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,OAAN,CAAzB;AACA,YAAM,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAAC,WAAT,GAAuB,QAAQ,CAAC,UAAhE;;AAEA,YAAI,QAAQ,IAAI,EAAE,GAAG,WAArB,EAAkC;AAC9B,UAAA,IAAI,GAAG,CAAC,WAAW,GAAG,EAAf,IAAqB,CAAC,CAA7B;AACH;;AAED,YAAI,KAAK,GAAG,IAAZ,EAAkB;AACd,UAAA,IAAI,GAAG,KAAP;AACH;AACJ;;AAED,UAAI,IAAJ,EAAU;AACR,QAAA,IAAI,CAAC,KAAL,CAAW,SAAX,wBAAqC,IAArC;AACD;;AAED,WAAK,WAAL,qBACO,KAAK,WADZ;AAEI,yBAAiB,GAAG,KAAK,CAAR,GAAY,IAAZ,GAAmB,CAAC,GAAG;AAF5C;AAIH,KAlCI;AAmCL,IAAA,gBAnCK,4BAmCY,CAnCZ,EAmCc;AACf,aAAO,KAAK,cAAL,IAAuB,KAAK,cAAL,CAAoB,CAApB,CAA9B;AACH,KArCI;AAsCL,IAAA,KAtCK,mBAsCoB;AAAA,UAAnB,cAAmB,uEAAF,CAAE;AACrB,WAAK,QAAL,IAAiB,KAAK,QAAL,CAAc,cAAd,CAAjB;AACH,KAxCI;AAyCL,IAAA,WAzCK,uBAyCO,CAzCP,EAyCS;AACV,UAAI,CAAC,GAAG,KAAK,OAAb,EAAqB;AACjB;AACH;;AAED,WAAK,QAAL,IAAiB,KAAK,QAAL,CAAc,CAAd,CAAjB;AACH,KA/CI;AAgDL,IAAA,SAhDK,uBAgDM;AACP,WAAK,WAAL,GAAmB,IAAnB;AACH,KAlDI;AAmDL,IAAA,OAnDK,qBAmDI;AACL,WAAK,WAAL,GAAmB,KAAnB;AACH,KArDI;AAsDL,IAAA,QAtDK,oBAsDI,CAtDJ,EAsDM;AACP,UAAM,GAAG,GAAG,KAAK,KAAL,CAAW,IAAvB;;AACA,UAAI,CAAC,GAAD,IAAQ,CAAC,KAAK,WAAlB,EAA+B;AAC3B;AACH;;AAED,UAAM,OAAO,GAAG,CAAC,CAAC,OAAF,IAAa,CAAC,CAAC,CAAC,OAAF,CAAU,CAAV,KAAgB,CAAC,CAAC,cAAF,CAAiB,CAAjB,CAAhB,IAAuC,EAAxC,EAA4C,KAAzE;;AAEA,UAAI,GAAG,CAAC,eAAJ,KAAwB,SAA5B,EAAuC;AACnC,YAAM,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC,eAA3B;AACA,YAAM,UAAU,GAAG,GAAG,CAAC,KAAJ,CAAU,SAAV,CAAoB,KAApB,CAA0B,uBAA1B,KAAsD,EAAzE;AACA,YAAM,CAAC,GAAG,UAAU,CAAC,CAAD,CAAV,GAAgB,QAAQ,CAAC,UAAU,CAAC,CAAD,CAAX,CAAxB,GAA0C,CAApD;AAEA,YAAM,QAAQ,GAAG,GAAG,CAAC,UAAJ,IAAkB,EAAnC;AACA,YAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAT,GAAkB,CAAnB,CAArB;AACA,YAAM,CAAC,GAAG,MAAM,CAAC,UAAjB;AACA,YAAM,GAAG,GAAG,IAAI,GAAI,IAAI,CAAC,WAAL,GAAmB,IAAI,CAAC,UAAxB,GAAqC,KAAK,MAA9C,GAAwD,CAAxE;AACA,YAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAP,IAAY,CAAC,CAA1B;AAEA,YAAM,GAAG,GAAI,EAAb;AACA,YAAI,EAAE,GAAG,CAAT;;AAEA,YAAI,IAAI,GAAG,CAAX,EAAc;AACV,UAAA,EAAE,GAAG,CAAC,GAAC,GAAP;;AAEA,cAAI,EAAE,GAAG,CAAT,EAAY;AACR,YAAA,EAAE,GAAG,CAAL;AACH;AACJ,SAND,MAMO,IAAI,IAAI,GAAG,CAAP,IAAY,IAAI,GAAG,CAAvB,EAA0B;AAC7B,UAAA,EAAE,GAAG,CAAC,GAAC,GAAP;;AAEA,cAAI,EAAE,GAAG,IAAT,EAAe;AACX,YAAA,EAAE,GAAG,IAAL;AACH;AACJ;;AAED,YAAM,cAAc,wBAAiB,EAAjB,QAApB;;AAEA,YAAI,UAAU,CAAC,CAAD,CAAd,EAAmB;AACf,UAAA,GAAG,CAAC,KAAJ,CAAU,SAAV,GAAsB,GAAG,CAAC,KAAJ,CAAU,SAAV,CAAoB,OAApB,CAA4B,UAAU,CAAC,CAAD,CAAtC,EAA2C,cAA3C,CAAtB;AACH,SAFD,MAEO;AACH,UAAA,GAAG,CAAC,KAAJ,CAAU,SAAV,IAAwB,cAAc,GAAG,GAAzC;AACH;AACJ;;AAED,MAAA,GAAG,CAAC,eAAJ,GAAsB,OAAtB;AACH;AApGI,GA9Eb;AAoLI,EAAA,QAAQ,EAAR;AApLJ,CAFJ;;;;;;;;;;;;ACFA;;;;;AAKO,SAAS,QAAT,CAAkB,IAAlB,EAAwB,IAAxB,EAA8B;AACpC,MAAI,OAAJ;AACA,SAAO,YAAW;AACjB,QAAM,OAAO,GAAG,IAAhB;AACM,QAAM,IAAI,GAAG,SAAb;;AACN,QAAM,KAAK,GAAG,SAAR,KAAQ,GAAW;AACxB,MAAA,OAAO,GAAG,IAAV;AACA,MAAA,IAAI,CAAC,KAAL,CAAW,OAAX,EAAoB,IAApB;AACA,KAHD;;AAIA,IAAA,YAAY,CAAC,OAAD,CAAZ;AACA,IAAA,OAAO,GAAG,UAAU,CAAC,KAAD,EAAQ,IAAR,CAApB;AACA,GATD;AAUA;;AAAA,C,CAED;;AACO,IAAM,eAAe,GAAG,SAAlB,eAAkB,CAAC,MAAD,EAAY;AACvC,MAAI,QAAQ,GAAG,MAAM,CAAC,QAAP,CAAgB,MAAhB,CAAuB,SAAvB,CAAiC,CAAjC,CAAf;AAAA,MACI,aAAa,GAAG,QAAQ,CAAC,KAAT,CAAe,GAAf,CADpB;AAAA,MAEI,cAFJ;AAAA,MAGI,CAHJ;;AAKA,OAAK,CAAC,GAAG,CAAT,EAAY,CAAC,GAAG,aAAa,CAAC,MAA9B,EAAsC,CAAC,EAAvC,EAA2C;AACvC,IAAA,cAAc,GAAG,aAAa,CAAC,CAAD,CAAb,CAAiB,KAAjB,CAAuB,GAAvB,CAAjB;;AAEA,QAAI,cAAc,CAAC,CAAD,CAAd,KAAsB,MAA1B,EAAkC;AAC9B,aAAO,cAAc,CAAC,CAAD,CAAd,KAAsB,SAAtB,GAAkC,IAAlC,GAAyC,kBAAkB,CAAC,cAAc,CAAC,CAAD,CAAf,CAAlE;AACH;AACJ;AACJ,CAbM,C,CAeP;;;;;AACO,SAAS,cAAT,CAAwB,CAAxB,EAA2B;AACjC,MAAI,CAAC,GAAG,QAAQ,CAAC,MAAT,CAAgB,KAAhB,CAAsB,cAAc,CAAd,GAAkB,kBAAxC,CAAR;AACA,SAAO,CAAC,GAAG,CAAC,CAAC,GAAF,EAAH,GAAa,EAArB;AACA;;;;;;;;;;ACnCD;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,IAAM,QAAQ,GAAG,IAAI,kBAAJ,CAAQ;AACrB,EAAA,OAAO,EAAE;AACL,IAAA,qBADK,mCACmB;AACpB,2BAAS,KAAT,CAAe,gBAAf;AACH,KAHI;AAKL,IAAA,WALK,uBAKO,IALP,EAKa;AACd,WAAK,MAAL,CAAY,IAAZ,CACI,kBAAU,QAAV,CAAmB,IAAI,CAAC,OAAxB,CADJ,EAEI,kBAAU,IAAV,CAAe,IAAI,CAAC,IAApB,CAFJ,EAGI,kBAAU,OAAV,CAAkB,IAAI,CAAC,OAAvB,CAHJ,EAII,kBAAU,MAAV,CAAiB,IAAI,CAAC,IAAtB,CAJJ;AAMH,KAZI;AAcL,IAAA,WAdK,uBAcO,IAdP,EAca;AACd,WAAK,MAAL,CAAY,IAAZ,CACI,kBAAU,QAAV,CAAmB,IAAnB,CADJ,EAEI,kBAAU,IAFd,EAGI,kBAAU,OAHd,EAII,kBAAU,MAJd;AAMH,KArBI;AAsBL,IAAA,UAtBK,sBAsBM,IAtBN,EAsBY;AACb;AACA,WAAK,MAAL,CAAY,OAAZ;AACH;AAzBI;AADY,CAAR,CAAjB;;;AA8BA,IAAM,OAAO,GAAG,SAAV,OAAU,GAAM;AAClB,EAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,UAAC,CAAD,EAAO;AACtC,QAAI,CAAC,CAAC,MAAF,CAAS,YAAT,CAAsB,MAAtB,CAAJ,EAAmC;AAC/B,UAAI,QAAQ,GAAG,CAAC,CAAC,MAAF,CAAS,YAAT,CAAsB,MAAtB,EAA8B,KAA9B,CAAoC,GAApC,EAAyC,CAAzC,CAAf;;AACA,UAAI,CAAC,CAAC,CAAC,MAAF,CAAS,SAAT,CAAmB,QAAnB,CAA4B,4BAA5B,CAAD,IAA8D,QAAlE,EAA4E;AAExE,YAAI,QAAQ,KAAK,cAAjB,EAAiC;AAC7B,UAAA,CAAC,CAAC,cAAF;AACA,UAAA,QAAQ,CAAC,qBAAT;AACH;;AACD,YAAI,MAAM,CAAC,aAAX,EAA0B;AACtB,UAAA,MAAM,CAAC,aAAP,CAAqB,OAArB,CAA6B,UAAC,IAAD,EAAU;AACnC,gBAAI,QAAQ,KAAK,IAAI,CAAC,WAAtB,EAAmC;AAC/B,cAAA,CAAC,CAAC,cAAF;AACA,kBAAI,WAAW,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,WAAjB,IAAgC,IAAlD;AACA,kBAAI,YAAY,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,YAAjB,IAAiC,IAApD;AACA,kBAAI,gBAAgB,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,aAAjB,IAAkC,IAAzD;AACA,kBAAI,eAAe,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,eAAjB,IAAoC,IAA1D;AACA,kBAAI,iBAAiB,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,iBAAjB,IAAsC,IAA9D;AACA,kBAAI,OAAO,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,OAAjB,IAA4B,IAA1C;AACA,kBAAI,QAAQ,GAAG,CAAC,CAAC,MAAF,CAAS,OAAT,CAAiB,QAAjB,IAA6B,IAA5C;AACA,kBAAI,mBAAmB,GAAG,QAAQ,CAAC,MAAnC;;AAEA,kBAAI,mBAAmB,IAAI,EAA3B,EAA+B;AAC3B,oBAAI,WAAW,IAAI,WAAW,IAAI,EAAlC,EAAsC;AAClC,kBAAA,mBAAmB,GAAG,MAAM,mBAA5B;AACA,kBAAA,mBAAmB,GAAG,mBAAmB,CAAC,OAApB,CAA4B,IAA5B,EAAiC,GAAjC,CAAtB;AACA,sBAAI,mBAAmB,CAAC,UAApB,CAA+B,GAA/B,CAAJ,EACI,mBAAmB,GAAG,mBAAmB,CAAC,KAApB,CAA0B,CAA1B,CAAtB,CAJ8B,CAIsB;AAC3D,iBALD,MAKO;AACH,sBAAI,IAAI,CAAC,GAAL,CAAS,OAAT,CAAiB,GAAjB,IAAwB,CAAC,CAA7B,EAAgC;AAC5B,oBAAA,mBAAmB,GAAG,MAAM,mBAA5B;AACA,oBAAA,mBAAmB,GAAG,mBAAmB,CAAC,OAApB,CAA4B,IAA5B,EAAiC,GAAjC,CAAtB;AACH;AACJ;AACJ;;AACD,kBAAI,MAAM,CAAC,oBAAX,EAAiC;AAAA,oBASpB,cAToB,GAS7B,SAAS,cAAT,CAAwB,MAAxB,EAAgC,OAAhC,EAAyC,OAAzC,EAAkD;AAAE;AAChD;;AACA,sBAAI,OAAO,KAAK,OAAhB,EAAyB;AACrB,2BAAO,MAAP;AACH;;AACD,sBAAI,MAAM,CAAC,cAAP,CAAsB,OAAtB,CAAJ,EAAoC;AAChC,oBAAA,MAAM,CAAC,OAAD,CAAN,GAAkB,MAAM,CAAC,OAAD,CAAxB;AACA,2BAAO,MAAM,CAAC,OAAD,CAAb;AACH;;AACD,yBAAO,MAAP;AACH,iBAnB4B;;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,oBAAI,SAAS,GAAG,MAAM,CAAC,oBAAP,EAAhB;AACA,oBAAI,SAAS,GAAG,MAAM,CAAC,mBAAP,EAAhB;AAYA,gBAAA,cAAc,CAAC,SAAD,EAAY,iBAAZ,EAA+B,iBAA/B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,gBAAZ,EAA8B,gBAA9B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,eAAZ,EAA6B,eAA7B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,eAAZ,EAA6B,eAA7B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,oBAAZ,EAAkC,oBAAlC,CAAd;AAEA,gBAAA,cAAc,CAAC,SAAD,EAAY,iBAAZ,EAA+B,iBAA/B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,gBAAZ,EAA8B,gBAA9B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,eAAZ,EAA6B,eAA7B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,eAAZ,EAA6B,eAA7B,CAAd;AACA,gBAAA,cAAc,CAAC,SAAD,EAAY,oBAAZ,EAAkC,oBAAlC,CAAd;AAEA,oBAAI,iBAAiB,GAAG,EAAxB;AACA,oBAAI,MAAM,GAAG,MAAM,CAAC,IAAP,CAAY,SAAZ,CAAb;AACA,oBAAI,MAAM,GAAG,MAAM,CAAC,IAAP,CAAY,SAAZ,CAAb;AAEA,gBAAA,iBAAiB,GAAG,MAAM,CAAC,MAAP,CAAc,UAAA,CAAC;AAAA,yBAAI,CAAC,IAAI,WAAT;AAAA,iBAAf,EAAqC,GAArC,CAAyC,UAAA,GAAG;AAAA,mCAAO,GAAP,cAAc,SAAS,CAAC,GAAD,CAAvB;AAAA,iBAA5C,EAA4E,IAA5E,CAAiF,GAAjF,CAApB;AACA,gBAAA,iBAAiB,IAAI,MAAM,MAAM,CAAC,MAAP,CAAc,UAAA,CAAC;AAAA,yBAAI,CAAC,IAAI,WAAT;AAAA,iBAAf,EAAqC,GAArC,CAAyC,UAAA,GAAG;AAAA,mCAAO,GAAP,cAAc,SAAS,CAAC,GAAD,CAAvB;AAAA,iBAA5C,EAA4E,IAA5E,CAAiF,GAAjF,CAA3B;;AACA,oBAAI,mBAAmB,IAAI,EAA3B,EAA+B;AAC3B,kBAAA,mBAAmB,IAAI,MAAM,iBAA7B;AACH,iBAFD,MAEO;AACH,kBAAA,mBAAmB,GAAG,MAAM,iBAA5B;AACH;;AACD,gBAAA,OAAO,CAAC,GAAR,CAAY,mBAAZ,EAAiC,iBAAjC;AACH;;AAED,kBAAI,mBAAmB,IAAI,EAA3B,EAA+B;AAC3B,gBAAA,mBAAmB,IAAI,kCAAkC,eAAzD;AACH,eAFD,MAEO;AACH,gBAAA,mBAAmB,IAAI,kCAAkC,eAAzD;AACH;;AAED,kBAAI,QAAQ,IAAI,gBAAZ,IAAgC,iBAAhC,IAAqD,WAArD,IAAoE,YAAxE,EAAsF;AAClF,gBAAA,QAAQ,CAAC,WAAT,CAAqB;AACjB,kBAAA,OAAO,EAAE;AACL,oBAAA,GAAG,EAAE,WAAW,IAAI,WAAW,KAAK,EAA/B,GAAqC,UAAG,IAAI,CAAC,GAAR,2BAA4B,WAA5B,IAA4C,mBAAjF,GAAyG,IAAI,CAAC,GAAL,GAAW,mBADpH;AAEL,oBAAA,IAAI,YAAK,OAAO,GAAG,OAAH,KAAZ;AAFC,mBADQ;AAKjB,kBAAA,IAAI,EAAE,IAAI,CAAC,WALM;AAMjB,kBAAA,OAAO,EAAE;AAAC,8EAAmD,IAAI,CAAC,WAAxD;AAAD,mBANQ;AAOjB,kBAAA,IAAI,EAAE;AACF,oBAAA,kBAAkB,EAAE,gBADlB;AAEF,oBAAA,2BAA2B,EAAE,eAF3B;AAGF,oBAAA,SAAS,EAAE,IAAI,CAAC,WAHd;AAIF,oBAAA,YAAY,EAAE,YAJZ;AAKF,oBAAA,iBAAiB,EAAjB,iBALE;AAMF,oBAAA,QAAQ,EAAE;AANR;AAPW,iBAArB;AAgBH,eAjBD,MAiBO;AACH,gBAAA,QAAQ,CAAC,WAAT,CAAqB;AACjB,kBAAA,OAAO,EAAE;AACL,oBAAA,GAAG,EAAE,IAAI,CAAC,GAAL,GAAW,mBADX;AAEL,oBAAA,IAAI,YAAK,OAAO,GAAG,OAAH,KAAZ;AAFC,mBADQ;AAKjB,kBAAA,IAAI,EAAE,IAAI,CAAC,WALM;AAMjB,kBAAA,OAAO,EAAE;AAAC,8EAAmD,IAAI,CAAC,WAAxD;AAAD;AANQ,iBAArB;AAQH;AACJ;AACJ,WAzGD;AA0GH;AACJ;AACJ,KArHD,MAqHO;AACH,MAAA,OAAO,CAAC,GAAR,CAAY,UAAZ,EAAwB,CAAC,CAAC,MAA1B;AACA;AACH;AACJ,GA1HD;;AA6HA,MAAI,gBAAgB,GAAI,SAApB,gBAAoB,CAAC,CAAD,EAAQ;AAC5B,QAAI,MAAM,CAAC,WAAX,EAAwB;AACpB,UAAI,IAAI,GAAG;AACP,gBAAQ,MAAM,CAAC,WAAP,CAAmB,YADpB;AAEP,cAAM,MAAM,CAAC,WAAP,CAAmB,OAFlB;AAGP,iBAAS,MAAM,CAAC,WAAP,CAAmB;AAHrB,OAAX;AAKA,UAAI,IAAI,GAAG,CAAC,CAAC,MAAF,CAAS,YAAT,CAAsB,MAAtB,CAAX;AACA,UAAI,MAAM,GAAG,CAAC,CAAC,MAAf;AACA,UAAI,KAAK,GAAG,QAAQ,CAAC,aAAT,CAAuB,kBAAvB,CAAZ;;AAEA,WAAK,IAAI,CAAC,GAAC,CAAX,EAAc,CAAC,GAAG,MAAM,CAAC,WAAP,CAAmB,KAAnB,CAAyB,MAA3C,EAAmD,CAAC,EAApD,EAAwD;AACpD,YAAI,IAAI,GAAG,MAAM,CAAC,WAAP,CAAmB,KAAnB,CAAyB,CAAzB,CAAX;;AACA,YAAI,KAAK,IAAI,KAAK,CAAC,QAAN,CAAe,MAAf,CAAb,EAAqC;AACjC;AACH,SAFD,MAEO,IAAI,IAAI,CAAC,QAAL,WAAiB,IAAjB,EAAJ,EAA8B;AACjC,UAAA,CAAC,CAAC,cAAF;AAEA,UAAA,IAAI,qBACG,IADH;AAEA,oBAAQ;AAFR,YAAJ;AAIA,UAAA,QAAQ,CAAC,WAAT,CAAqB,IAArB;AACA,iBAAO,KAAP;AACH;AACJ;AACJ;AACJ,GA3BD;;AA6BA,EAAA,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,EAAmC,YAAW;AAC1C,IAAA,UAAU,CAAC,YAAW;AAClB,MAAA,QAAQ,CAAC,gBAAT,CAA0B,SAA1B,EAAqC,OAArC,CAA6C,UAAA,CAAC,EAAI;AAC9C,YAAI,CAAC,CAAC,IAAF,CAAO,WAAP,GAAqB,OAArB,CAA6B,MAA7B,KAAwC,CAAC,CAA7C,EAAgD;AAC5C;AACA,cAAI,CAAC,CAAC,CAAC,SAAF,CAAY,QAAZ,CAAqB,4BAArB,CAAL,EAAyD;AACrD,YAAA,CAAC,CAAC,SAAF,CAAY,GAAZ,CAAgB,4BAAhB;AACA,YAAA,CAAC,CAAC,gBAAF,CAAmB,OAAnB,EAA4B,gBAA5B;AACH;AACJ;AACJ,OARD;AASH,KAVS,EAUP,GAVO,CAAV;AAWH,GAZD,EA3JkB,CAyKlB;AACA;AACA;AACA;;AAEA,EAAA,QAAQ,CAAC,gBAAT,CAA0B,SAA1B,EAAqC,OAArC,CAA6C,UAAA,CAAC,EAAI;AAC9C;AACA,QAAI,CAAC,CAAC,IAAF,CAAO,WAAP,GAAqB,OAArB,CAA6B,MAA7B,KAAwC,CAAC,CAA7C,EAAgD;AAC5C;AACA,UAAI,CAAC,CAAC,CAAC,SAAF,CAAY,QAAZ,CAAqB,4BAArB,CAAL,EAAyD;AACrD,QAAA,CAAC,CAAC,SAAF,CAAY,GAAZ,CAAgB,4BAAhB;AACA,QAAA,CAAC,CAAC,gBAAF,CAAmB,OAAnB,EAA4B,gBAA5B;AACH;AACJ;AACJ,GATD;AAUH,CAxLD,C,CA0LA;;;;;;;;;;;;;ACrOA;;AACA;;;;;;;;;;;;AAEA,IAAI,cAAc,GAAG;AACnB,EAAA,MAAM,EAAE,MADW;AAEnB,EAAA,UAAU,EAAE,KAFO;AAGnB,EAAA,QAAQ,EAAE,IAHS;AAInB,EAAA,SAAS,EAAE,IAJQ;AAKnB,EAAA,OAAO,EAAE,WALU;AAMnB,EAAA,KAAK,EAAE;AANY,CAArB;;AASA,IAAI,eAAe,GAAG,SAAlB,eAAkB,CAAC,OAAD,EAAU,OAAV,EAAsB;AACxC,SAAQ;AAAC,IAAA,QAAQ,qIACyF,OAAO,GAAG,OAAH,uBADhG,kRAMH,OANG;AAAT,GAAR;AAWH,CAZD;;AAcA,IAAI,aAAa,GAAG,SAAhB,aAAgB,CAAC,EAAD,EAAK,KAAL,EAAe;AAC/B,SAAO;AAAC,IAAA,QAAQ,+VAIF,KAAK,iDAAwC,KAAxC,cAJH,wKAMsE,EANtE;AAAT,GAAP;AAaH,CAdD;;AAgBA,IAAM,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,QAAD,EAAW,IAAX,EAAiB,OAAjB,EAA0B,MAA1B;AAAA,SACrB;AACI,IAAA,QAAQ,EAAE,QADd;AAEI,IAAA,IAAI,EAAE;AAAC,MAAA,IAAI,EAAE;AAAP,KAFV;AAGI,IAAA,OAAO;AACH,MAAA,IAAI,EAAE;AADH,OAEA,cAFA,MAGA,OAHA,CAHX;AAQI,IAAA,MAAM,EAAE;AARZ,GADqB;AAAA,CAAzB;;AAaA,IAAM,UAAU,GAAG,gBAAgB,CAC/B,UAAC,EAAD,EAAK,KAAL;AAAA,SAAgB,aAAa,CAAC,EAAD,EAAK,KAAL,CAA7B;AAAA,CAD+B,EAE/B,OAF+B,EAG/B;AAAC,EAAA,OAAO,EAAE;AAAV,CAH+B,CAAnC;;AAMA,IAAM,iBAAiB,GAAG,gBAAgB,CACtC,UAAC,OAAD;AAAA,SAAa,eAAe,WAAI,OAAJ,GAAe,uBAAf,CAA5B;AAAA,CADsC,EAEtC,cAFsC,EAGtC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHsC,CAA1C;;AAMA,IAAM,iBAAiB,GAAG,gBAAgB,CACtC,eAAe,CAAC,EAAD,EAAK,6BAAL,CADuB,EAEtC,cAFsC,EAGtC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHsC,EAItC,UAAC,IAAD;AAAA,SAAW;AACP,cAAU,kBAAM;AACR;AACA,UAAI,SAAS,GAAG,QAAQ,CAAC,aAAT,CAAuB,gDAAvB,CAAhB;AACA,MAAA,SAAS,CAAC,WAAV,CAAsB,IAAtB;AACH;AALE,GAAX;AAAA,CAJsC,CAA1C;;AAaA,IAAM,eAAe,GAAG,gBAAgB,CACpC,eAAe,CAAC,EAAD,EAAK,qBAAL,CADqB,EAEpC,YAFoC,EAGpC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHoC,EAIpC,UAAC,KAAD;AAAA,SAAY;AACR,cAAU,kBAAM;AACR;AACA,UAAI,SAAS,GAAG,QAAQ,CAAC,aAAT,CAAuB,+CAAvB,CAAhB;AACA,MAAA,SAAS,CAAC,WAAV,CAAsB,KAAtB;AACH;AALG,GAAZ;AAAA,CAJoC,CAAxC;;AAaA,IAAM,YAAY,GAAG,gBAAgB,CACjC,eAAe,CAAC,EAAD,EAAK,iBAAL,CADkB,EAEjC,SAFiC,EAGjC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHiC,EAIjC,UAAC,OAAD;AAAA,SAAc;AACV,cAAU,kBAAM;AACR;AACA;AACA,UAAI,SAAS,GAAG,QAAQ,CAAC,aAAT,CAAuB,2CAAvB,CAAhB;AACA,MAAA,SAAS,CAAC,WAAV,CAAsB,OAAtB;AACH;AANK,GAAd;AAAA,CAJiC,CAArC;;AAcA,IAAM,YAAY,GAAG,gBAAgB,CACjC,UAAC,OAAD;AAAA,SAAa,eAAe,WAAI,OAAJ,GAAe,iBAAf,CAA5B;AAAA,CADiC,EAEjC,SAFiC,EAGjC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHiC,CAArC;;AAMA,IAAM,SAAS,GAAG;AACd,EAAA,QAAQ,EAAE,kBAAC,OAAD;AAAA,WAAa,eAAe,WAC3B,OAAO,CAAC,IAAR,4EAEG,OAAO,CAAC,IAFX,4CAD2B,sFAOf,OAAO,CAAC,GAPO,yJAQrB,cARqB,CAA5B;AAAA,GADI;AAWd,EAAA,IAAI,EAAE,cAAC,KAAD;AAAA,WAAY;AAAC,cAAQ;AAAT,KAAZ;AAAA,GAXQ;AAYd,EAAA,OAAO,EAAE,iBAAC,IAAD;AAAA,6BACF,cADE;AAEL,MAAA,OAAO,EAAE;AAFJ,OAGF,IAHE;AAAA,GAZK;AAiBd,EAAA,MAAM,EAAE,gBAAC,IAAD;AAAA,WAAW;AACf,gBAAU,kBAAM;AACZ,YAAI,EAAE,GAAG,kBAAM,KAAN,CAAY,IAArB;AAEA,YAAI,MAAM,GAAG,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,CAAb;AACA,YAAI,GAAG,GAAG,QAAQ,CAAC,aAAT,CAAuB,yBAAvB,EAAkD,YAAlD,CAA+D,KAA/D,CAAV;;AACA,YAAI,SAAS,qBACN,IADM;AAET,UAAA,IAAI,EAAE;AAFG,UAAb;;AAKA,QAAA,MAAM,CAAC,gBAAP,CAAwB,SAAxB,EAAmC,UAAC,KAAD,EAAW;AAC1C;AACA,cAAI,KAAK,CAAC,MAAN,IAAgB,8BAApB,EAAoD;AAChD,YAAA,UAAU,CAAC,KAAD,CAAV;AACA,YAAA,QAAQ,CAAC,KAAD,CAAR;AACA,YAAA,WAAW,CAAC,KAAD,CAAX;AACH;AACJ,SAPD;;AASA,YAAM,QAAQ,GAAG,SAAX,QAAW,CAAC,KAAD,EAAW;AACxB,cAAI,MAAM,CAAC,aAAX,EAA0B;AACtB,YAAA,MAAM,CAAC,aAAP,CAAqB,WAArB,CAAiC,IAAI,CAAC,SAAL,CAAe,SAAf,CAAjC,EAA4D,GAA5D;AACH,WAFD,MAEO;AACH,YAAA,MAAM,CAAC,MAAP,GAAgB,YAAW;AACvB,cAAA,MAAM,CAAC,aAAP,CAAqB,WAArB,CAAiC,IAAI,CAAC,SAAL,CAAe,SAAf,CAAjC,EAA4D,GAA5D;AACH,aAFD;AAGH;AACJ,SARD;;AAUA,YAAM,UAAU,GAAG,SAAb,UAAa,CAAC,KAAD,EAAW;AAC1B,cAAI;AACA,gBAAI,KAAI,GAAG,QAAO,KAAK,CAAC,IAAb,MAAsB,QAAtB,GAAiC,KAAK,CAAC,IAAvC,GAA8C,IAAI,CAAC,KAAL,CAAW,KAAK,CAAC,IAAjB,CAAzD,CADA,CAEA;;;AACA,gBAAI,KAAI,CAAC,IAAT,EAAe;AACX,kBAAK,GAAG,CAAC,QAAJ,CAAa,KAAI,CAAC,IAAlB,CAAL,EAA+B;AAC3B,gBAAA,MAAM,CAAC,KAAP,CAAa,MAAb,aAAyB,KAAI,CAAC,OAAL,GAAe,EAAxC;AACH;AACJ;AACJ,WARD,CAQE,OAAO,CAAP,EAAU;AAAE,YAAA,OAAO,CAAC,GAAR,CAAY,oBAAZ,EAAkC,CAAlC;AAAuC;AACxD,SAVD;;AAYA,YAAM,WAAW,GAAG,SAAd,WAAc,CAAC,KAAD,EAAW;AAC3B,cAAI;AACA,gBAAI,SAAS,GAAG,QAAO,KAAK,CAAC,IAAb,MAAsB,QAAtB,GAAiC,KAAK,CAAC,IAAvC,GAA8C,IAAI,CAAC,KAAL,CAAW,KAAK,CAAC,IAAjB,CAA9D;AACA,YAAA,SAAS;AACL,cAAA,SAAS,EAAT;AADK,eAEF,IAFE,CAAT;;AAIA,gBAAI,SAAS,CAAC,SAAV,CAAoB,MAAxB,EAAgC;AAC5B;AACA,mCAAS,KAAT,CAAe,gBAAf,EAAiC,SAAjC;AACH;AACJ,WAVD,CAUE,OAAO,CAAP,EAAU;AAAE,YAAA,OAAO,CAAC,GAAR,CAAY,oBAAZ,EAAkC,CAAlC;AAAuC;AACxD,SAZD;AAaH,OAvDc;AAwDf,gBAAW,kBAAM;AACb;AACA,6BAAS,KAAT,CAAe,aAAf,EAA8B,IAA9B;AACH;AA3Dc,KAAX;AAAA;AAjBM,CAAlB;;AAgFA,IAAM,SAAS,GAAG,gBAAgB,CAC7B,UAAC,KAAD,EAAQ,OAAR;AAAA,SAAoB,eAAe,kEAE1B,KAF0B,mFAK1B,OAL0B,6BAOjC,cAPiC,CAAnC;AAAA,CAD6B,EAS9B,SAT8B,EAU9B;AAAE,EAAA,KAAK,EAAC,MAAR;AAAgB,EAAA,MAAM,EAAE,MAAxB;AAAgC,EAAA,MAAM,EAAE,CAAxC;AAA2C,EAAA,OAAO,EAAE;AAApD,CAV8B,EAW9B;AACI,EAAA,MAAM,EAAE,kBAAM;AACV,QAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CAAb;AACA,IAAA,IAAI,CAAC,SAAL,CAAe,GAAf,CAAmB,iBAAnB;AACH,GAJL;AAKI,EAAA,MAAM,EAAE,kBAAM;AACV,QAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CAAb;AACA,IAAA,IAAI,CAAC,SAAL,CAAe,MAAf,CAAsB,iBAAtB;AACH;AARL,CAX8B,CAAlC;;AAuBA,IAAM,YAAY,GAAG,gBAAgB,CACjC,UAAC,OAAD;AAAA,SAAc,eAAe,CAAC,OAAD,EAAU,iBAAV,CAA7B;AAAA,CADiC,EAEjC,SAFiC,EAGjC;AAAC,EAAA,OAAO,EAAE;AAAV,CAHiC,CAArC;;AAMA,IAAM,SAAS,GAAG,gBAAgB,CAC9B,UAAC,OAAD,EAAc;AAAC,SAAO;AAAC,IAAA,QAAQ,6UAIjB,OAAO,CAAC,IAJS,0LASR,OAAO,CAAC,IATA,mFASwE,OAAO,CAAC,EAThF,mNAUoH,OAAO,CAAC,KAV5H;AAAT,GAAP;AAcZ,CAf2B,EAgB9B,MAhB8B,EAiB9B;AAAC,EAAA,OAAO,EAAE;AAAV,CAjB8B,CAAlC;;;;;;AC9NA;;AACA;;AACA;;;;AAEA,4BAAgB,SAAhB,CAA0B,aAA1B,EAAyC;AACrC,EAAA,MAAM,EAAE,aAD6B;AAErC,EAAA,UAAU,EAAE,CACR;AACI,IAAA,IAAI,EAAE,UADV;AAEI,IAAA,IAFJ,kBAEU;AACF,aAAO;AACH,QAAA,IAAI,EAAE,IADH;AAEH,QAAA,GAAG,EAAE,EAFF;AAGH,QAAA,QAAQ,EAAE,IAHP;AAIH,QAAA,WAAW,EAAE,IAJV;AAKH,QAAA,YAAY,EAAE,CALX;AAMH,QAAA,IAAI,EAAE,IANH;AAOH,QAAA,MAAM,EAAE;AAPL,OAAP;AASH,KAZL;AAaI,IAAA,KAAK,EAAE;AACH,MAAA,QADG,sBACO;AACN,aAAK,KAAL;AACH;AAHE,KAbX;AAkBI,IAAA,OAAO,EAAE;AACL,MAAA,QADK,sBACM;AAAA;;AACP,aAAK,IAAL,GAAY,gBAAK,KAAK,GAAV,EAAe;AACvB,UAAA,cAAc,EAAE,qBADO;AAEvB,UAAA,uBAAuB,EAAG,kBAFH;AAGvB,UAAA,iBAAiB,EAAE,kBAHI;AAIvB,UAAA,iBAAiB,EAAE,kBAJI;AAKvB,UAAA,cAAc,EAAE,CALO;AAMvB,UAAA,iBAAiB,EAAE;AANI,SAAf,CAAZ;AAQI,aAAK,GAAL,CAAS,gBAAT,CAA0B,kBAA1B,EAA8C,YAAM;AAChD,UAAA,KAAI,CAAC,YAAL,GAAoB,KAAI,CAAC,IAAL,CAAU,WAAV,EAApB;AACH,SAFD,EATG,CAaH;AACA;;AACA,aAAK,GAAL,CAAS,aAAT,CAAuB,mBAAvB,EAA4C,gBAA5C,CAA6D,eAA7D,EAA8E,YAAM;AAChF,UAAA,KAAI,CAAC,cAAL;AACH,SAFD;AAIA,aAAK,cAAL;AACP,OArBI;AAsBL,MAAA,MAAM,EAAE,oBAAS,YAAW;AACxB,aAAK,cAAL;AACH,OAFO,EAEL,GAFK,CAtBH;AAyBL,MAAA,cAzBK,4BAyBY;AACb,YAAI,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAP,GAAoB,KAAK,GAAL,CAAS,aAAT,CAAuB,6BAAvB,EAAsD,qBAAtD,GAA8E,KAAnG,CAA9B;AAEA,YAAI,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAP,GAAoB,KAAK,GAAL,CAAS,aAAT,CAAuB,iCAAvB,EAA0D,qBAA1D,GAAkF,KAAvG,CAA9B,CAHa,CAIb;;AACA,aAAK,MAAL,GAAc,eAAe,IAAI,eAAnB,IAAuC,eAAe,IAAI,eAAe,GAAG,CAArC,IAA0C,eAAe,IAAI,eAAe,GAAG,CAAtH,GAA2H,IAA3H,GAAkI,KAAhJ;AACH,OA/BI;AAgCL,MAAA,WAhCK,yBAgCS;AAAA;;AACV,YAAI,GAAG,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAV;AACA,aAAK,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AAEA,QAAA,GAAG,CAAC,gBAAJ,CAAqB,QAArB,EAA8B,YAAM;AAChC,UAAA,MAAI,CAAC,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AACH,SAFD;AAGH,OAvCI;AAwCL,MAAA,KAxCK,mBAwCG;AACJ,YAAI,KAAK,QAAT,EAAmB;AACf,eAAK,KAAL,CAAW,IAAX,CAAgB,MAAhB;AACH,SAFD,MAEO;AACH,cAAI,KAAK,KAAL,CAAW,IAAf,EAAqB;AACjB;AACH,WAFD,MAEO;AACH,iBAAK,KAAL,CAAW,IAAX,CAAgB,OAAhB,CAAwB,KAAK,IAA7B;AACH;AACJ;;AACD,aAAK,IAAL,CAAU,KAAV;AAEH;AApDI,KAlBb;AAwEI,IAAA,OAxEJ,qBAwEc;AACN,WAAK,IAAL,GAAY,KAAK,KAAL,CAAW,IAAvB;AACA,WAAK,QAAL;AACA,WAAK,WAAL;AACA,WAAK,KAAL;AAEA,MAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,KAAK,MAAvC;AACH,KA/EL;AAgFI,IAAA,SAhFJ,uBAgFgB;AACR,MAAA,MAAM,CAAC,mBAAP,CAA2B,QAA3B,EAAqC,KAAK,MAA1C;AACH;AAlFL,GADQ;AAFyB,CAAzC;;;;;ACJA;;AACA;;AACA;;AACA;;;;;;;;;;AAMA,4BAAgB,SAAhB,CAA0B,mBAA1B,EAA+C;AAC3C,EAAA,MAAM,EAAE,mBADmC;AAE3C,EAAA,UAAU,EAAE,CACR,yBAAQ;AACJ,IAAA,IAAI,EAAE,UADF;AAEJ,IAAA,IAFI,kBAEE;AACF,aAAO;AACH,QAAA,IAAI,EAAE;AAAE,UAAA,QAAQ,EAAE;AAAZ,SADH;AAEH,QAAA,WAAW,EAAE;AAFV,OAAP;AAIH,KAPG;AAQJ,IAAA,OAAO,EAAE;AACL,MAAA,eADK,6BACa;AACd,YAAI,IAAI,GAAG,IAAX;;AAEA,YAAI,KAAK,MAAL,CAAY,OAAhB,EAAyB;AACrB,eAAK,WAAL,GAAmB,IAAnB;AAEA,eAAK,KAAL,CAAW,UAAS,GAAT,EAAc;AACrB;AACA,gBAAM,QAAQ,GAAG,GAAG,CAAC,IAArB,CAFqB,CAGrB;;AACA,YAAA,IAAI,CAAC,IAAL,GAAY;AACR,cAAA,QAAQ,EAAR,QADQ;AAER,cAAA,UAAU,EAAE;AACR,kDACO,oBADP;AAEI,kBAAA,UAAU,EAAE;AACR,qCAAiB,oBADT;AAER,4CAAwB;AAFhB;AAFhB;AADQ;AAFJ,aAAZ;AAaH,WAjBD,EAiBG;AACC,YAAA,MAAM,oBACC,KAAK,MADN;AADP,WAjBH;AAsBH,SAzBD,MAyBO;AACH,eAAK,WAAL,GAAmB,KAAnB;AACH;AAEJ;AAjCI;AARL,GAAR,EA2CG;AACC,IAAA,mBAAmB,EAAE;AADtB,GA3CH,CADQ,CAF+B;AAkD3C,EAAA,KAAK,EAAE;AAlDoC,CAA/C;;;;;;;ACTA;;AACA;;AACA;;;;;;;;AAEA,IAAM,cAAc,GAAG,gCAAe,mCAAf,CAAvB;AAEA,IAAM,sBAAsB,GAAG,iBAA/B;;AAEA,IAAM,cAAc,GAAG,SAAjB,cAAiB,CAAA,EAAE,EAAI;AACzB,SAAO,sBAAsB,GAAC,GAAvB,GAA2B,EAAlC;AACH,CAFD;;AAIA,IAAM,cAAc,GAAG,SAAjB,cAAiB,CAAA,EAAE,EAAI;AACzB,SAAO,QAAQ,CAAC,cAAc,CAAC,GAAf,CAAmB,cAAc,CAAC,EAAD,CAAjC,KAA0C,CAA3C,CAAf;AACH,CAFD;;AAIA,IAAM,aAAa,GAAG,SAAhB,aAAgB,CAAC,EAAD,EAAQ;AAC1B,EAAA,cAAc,CAAC,QAAf,CAAwB,cAAc,CAAC,EAAD,CAAtC;AACH,CAFD;;AAIA,4BAAgB,SAAhB,CAA0B,iBAA1B,EAA6C;AACzC,EAAA,MAAM,EAAE,iBADiC;AAEzC,EAAA,UAAU,EAAE,CACR;AACI,IAAA,KAAK,EAAE;AACH,MAAA,SAAS,EAAE;AADR,KADX;AAII,IAAA,IAAI,EAAE,UAJV;AAKI,IAAA,IAAI,EAAE;AAAA,aAAO;AACT,QAAA,MAAM,EAAE;AADC,OAAP;AAAA,KALV;AAQI,IAAA,OAAO,EAAE,mBAAW;AAAA;;AAChB,UAAM,EAAE,GAAG,KAAK,OAAL,CAAa,GAAxB;;AAEA,UAAI,cAAc,IAAI,EAAE,CAAC,SAAH,CAAa,QAAb,CAAsB,cAAtB,CAAlB,IAA2D,EAAE,CAAC,EAAlE,EAAsE;AAClE,YAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,EAAJ,CAA5B;AACA,YAAM,SAAS,GAAG,KAAK,SAAL,IAAkB,CAApC;;AACA,YAAI,KAAK,IAAI,SAAb,EAAwB;AACpB;AACH,SAFD,MAEO;AACH,eAAK,MAAL,GAAc,IAAd;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,KAAI,CAAC,aAAL;AACH,WAFD;AAGH;AACJ,OAXD,MAWO;AACH,aAAK,MAAL,GAAc,IAAd;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,KAAI,CAAC,aAAL;AACH,SAFD;AAGH;AACJ,KA5BL;AA6BI,IAAA,OAAO,EAAE;AACL,MAAA,KADK,mBACG;AACJ,YAAM,EAAE,GAAG,KAAK,OAAL,CAAa,GAAxB;AAEA,aAAK,MAAL,GAAc,KAAd;;AAEA,YAAI,cAAc,IAAI,EAAE,CAAC,SAAH,CAAa,QAAb,CAAsB,cAAtB,CAAlB,IAA2D,EAAE,CAAC,EAAlE,EAAsE;AAClE,UAAA,aAAa,CAAC,EAAE,CAAC,EAAJ,CAAb;AACH;;AAED,YAAM,KAAK,GAAG,IAAI,KAAJ,CAAU,kBAAV,CAAd;AACA,QAAA,EAAE,CAAC,aAAH,CAAiB,KAAjB;AACH,OAZI;AAaL,MAAA,aAbK,2BAaW;AAAA;;AACZ,YAAI,cAAc,GAAG,0BAAe,uBAAf,CAArB;AACA,QAAA,OAAO,CAAC,GAAR,CAAY,KAAK,GAAjB;;AACA,YAAI,cAAc,IAAI,EAAtB,EAA0B;AACtB,eAAK,GAAL,CAAS,KAAT,CAAe,OAAf,GAAyB,MAAzB;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,UAAU,CAAC,YAAM;AACb,cAAA,MAAI,CAAC,IAAL;AACH,aAFS,EAEP,IAFO,CAAV;AAGH,WAJD;AAKH,SAPD,MAOO;AACH,eAAK,GAAL,CAAS,KAAT,CAAe,OAAf,GAAyB,OAAzB;AACH;AACJ,OA1BI;AA2BL,MAAA,IA3BK,kBA2BE;AAAA;;AACH,YAAI,KAAK,GAAG,QAAQ,CAAC,aAAT,CAAuB,+BAAvB,CAAZ;AACA,YAAM,EAAE,GAAG,KAAK,OAAL,CAAa,GAAxB;AACA,YAAM,SAAS,GAAG,IAAI,KAAJ,CAAU,iBAAV,CAAlB;;AACA,YAAI,KAAJ,EAAW;AACP,UAAA,KAAK,CAAC,gBAAN,CAAuB,OAAvB,EAAgC,YAAM;AAClC,YAAA,EAAE,CAAC,aAAH,CAAiB,SAAjB;AACA,YAAA,MAAI,CAAC,GAAL,CAAS,KAAT,CAAe,OAAf,GAAyB,OAAzB;AACH,WAHD;AAIH;AACJ;AArCI;AA7Bb,GADQ;AAF6B,CAA7C;;;;;ACpBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;ACPA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,4BAAgB,SAAhB,CAA0B,gBAA1B,EAA4C;AACxC,EAAA,MAAM,EAAE,gBADgC;AAExC,EAAA,UAAU,EAAE,CACR;AACI,IAAA,IAAI,EAAE,UADV;AAEI,IAAA,IAFJ,kBAEU;AACF,aAAO;AACH,QAAA,MAAM,EAAE,CADL;AAEH,QAAA,aAAa,EAAE,IAFZ;AAGH,QAAA,QAAQ,EAAE,IAHP;AAIH,QAAA,SAAS,EAAE,EAJR;AAKH,QAAA,OAAO,EAAE,MAAM,CAAC,gBAAP,CAAwB,OAL9B;AAMH,QAAA,IAAI,EAAE,MAAM,CAAC,gBAAP,CAAwB,SAN3B;AAOH,QAAA,0BAA0B,EAAE,IAPzB;AAQH,QAAA,KAAK,EAAE;AARJ,OAAP;AAUH,KAbL;AAcI,IAAA,QAAQ,EAAE;AACN,MAAA,QAAQ,EAAE,oBAAW;AACjB,eAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,KAdd;AAmBI,IAAA,KAAK,EAAE;AACH,MAAA,SADG,uBACS;AACR,YAAM,IAAI,GAAG,KAAK,GAAL,CAAS,sBAAT,CAAgC,6BAAhC,CAAb;;AACA,aAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,IAAI,CAAC,MAAzB,EAAiC,CAAC,EAAlC,EAAsC;AAClC,cAAM,CAAC,GAAG,IAAI,CAAC,CAAD,CAAd;AACA,cAAM,CAAC,GAAG,KAAK,SAAL,CAAe,CAAf,CAAV;AAEH;AACJ,OARE;AASH,MAAA,MATG,oBASK;AACJ,aAAK,YAAL;AACA,aAAK,iBAAL;AACH,OAZE;AAaH,MAAA,QAbG,sBAaO;AACN,YAAG,KAAK,QAAL,KAAkB,IAArB,EAA0B;AACtB,eAAK,0BAAL,CAAgC,IAAhC;AACH;AACJ,OAjBE;AAkBH,MAAA,QAAQ,EAAE,oBAAW;AACjB,YAAI,KAAK,QAAT,EAAmB;AACf,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,UAAnB;AACA,UAAA,GAAG,CAAC,KAAJ,CAAU,cAAV,CAAyB,QAAzB;AACH;AACJ;AAvBE,KAnBX;AA4CI,IAAA,OA5CJ,qBA4Cc;AACN,WAAK,iBAAL;AACA,MAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,KAAK,MAAvC;AACH,KA/CL;AAgDI,IAAA,SAhDJ,uBAgDgB;AACR,MAAA,MAAM,CAAC,mBAAP,CAA2B,QAA3B,EAAqC,KAAK,MAA1C;AACH,KAlDL;AAmDI,IAAA,OAAO,EAAE;AACL,MAAA,0BADK,sCACsB,OADtB,EAC+B;AAChC,YAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CAAb;;AACA,YAAI,KAAK,QAAL,KAAkB,IAAlB,IAA0B,KAAK,0BAAnC,EAA8D;AAC1D,UAAA,IAAI,CAAC,WAAL,CAAiB,KAAK,0BAAtB;AACA,eAAK,0BAAL,GAAkC,IAAlC;AACH;;AAED,YAAI,OAAO,KAAK,IAAhB,EAAqB;AACjB,iBAAO,IAAP;AACH;;AAED,YAAM,GAAG,GAAG,KAAK,0BAAL,IAAmC,QAAQ,CAAC,aAAT,CAAuB,KAAvB,CAA/C;AACA,QAAA,IAAI,CAAC,WAAL,CAAiB,GAAjB;AACA,QAAA,GAAG,CAAC,SAAJ,CAAc,GAAd,CAAkB,mCAAlB;AACA,QAAA,GAAG,CAAC,WAAJ,CAAgB,OAAhB;AAEA,aAAK,0BAAL,GAAkC,GAAlC;AACH,OAlBI;AAmBL,MAAA,YAnBK,0BAmBU;AACX,YAAI,MAAM,GAAG,MAAM,CAAC,gBAAP,CAAwB,QAAQ,CAAC,eAAjC,EAAkD,EAAlD,CAAb;AAAA,YACA,GAAG,GAAG,CAAC,KAAK,CAAC,SAAN,CAAgB,KAAhB,CACE,IADF,CACO,MADP,EAEE,IAFF,CAEO,EAFP,EAGE,KAHF,CAGQ,mBAHR,KAGiC,MAAM,CAAC,KAAP,KAAiB,EAAjB,IAAuB,CAAC,EAAD,EAAK,GAAL,CAHzD,EAIE,CAJF,CADN;AAAA,YAMA,GAAG,GAAI,iBAAD,CAAoB,KAApB,CAA0B,IAAI,MAAJ,CAAW,MAAM,GAAN,GAAY,GAAvB,EAA4B,GAA5B,CAA1B,EAA4D,CAA5D,CANN;AAOA,eAAO;AACH,UAAA,GAAG,EAAE,GADF;AAEH,UAAA,SAAS,EAAE,GAFR;AAGH,UAAA,GAAG,EAAE,MAAM,GAAN,GAAY,GAHd;AAIH,UAAA,EAAE,EAAE,GAAG,CAAC,CAAD,CAAH,CAAO,WAAP,KAAuB,GAAG,CAAC,MAAJ,CAAW,CAAX;AAJxB,SAAP;AAMH,OAjCI;AAkCL,MAAA,kBAlCK,8BAkCc,EAlCd,EAkCkB,KAlClB,EAkCyB,KAlCzB,EAkC+B;AAAA,iCAChB,KAAK,YAAL,EADgB;AAAA,YACxB,GADwB,sBACxB,GADwB;;AAEhC,QAAA,EAAE,CAAC,KAAH,CAAS,GAAG,GAAC,KAAb,IAAsB,KAAtB;AACH,OArCI;AAsCL,MAAA,aAtCK,2BAsCU;AAEX,YAAG,CAAC,KAAK,QAAT,EAAmB;AACf,eAAK,eAAL;AACH;;AAED,YAAI,SAAS,GAAG,CAAhB;AACA,YAAI,UAAU,GAAG,CAAjB;AAEA,YAAM,SAAS,GAAG,IAAlB;AACA,YAAM,UAAU,GAAG,GAAnB;AACA,YAAM,SAAS,GAAG,SAAS,GAAC,UAA5B;AACA,YAAM,cAAc,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,WAA9C;AACA,YAAM,eAAe,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,YAA/C;AACA,YAAM,eAAe,GAAG,cAAc,GAAC,eAAvC;;AAGA,YAAG,eAAe,GAAG,SAArB,EAA+B;AAC3B,UAAA,SAAS,GAAG,cAAZ;AACA,UAAA,UAAU,GAAG,cAAc,GAAC,SAA5B;AACH,SAHD,MAGO;AACH,UAAA,SAAS,GAAG,eAAe,GAAC,SAA5B;AACA,UAAA,UAAU,GAAG,eAAb;AACH;;AAED,eAAO;AACH,UAAA,CAAC,EAAE,SADA;AAEH,UAAA,CAAC,EAAE,UAFA;AAGH,UAAA,CAAC,EAAE,SAAS,GAAC,SAHV;AAIH,UAAA,CAAC,EAAE,UAAU,GAAC;AAJX,SAAP;AAMH,OArEI;AAsEL,MAAA,YAtEK,0BAsES;AACV,YAAI,CAAC,GAAG,CAAR;AACA,YAAI,CAAC,GAAG,CAAR;;AAEA,YAAI,KAAK,MAAL,KAAgB,IAAhB,IAAwB,MAAM,CAAC,UAAP,GAAoB,GAAhD,EAAoD;AAAA,oCAChB,KAAK,aAAL,EADgB;AAAA,cACtC,KADsC,uBACxC,CADwC;AAAA,cAC7B,KAD6B,uBAC/B,CAD+B;AAAA,cACtB,CADsB,uBACtB,CADsB;;AAEhD,cAAM,MAAM,GAAG,KAAK,OAAL,CAAa,KAAK,MAAlB,CAAf;AACA,UAAA,CAAC,GAAG,MAAM,CAAC,WAAP,CAAmB,CAAnB,IAAwB,KAAxB,GAAgC,CAAC,CAArC;AACA,UAAA,CAAC,GAAG,MAAM,CAAC,WAAP,CAAmB,CAAnB,IAAwB,KAAxB,GAAgC,CAAC,CAArC;AAEA,cAAM,WAAW,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,WAA3C;AACA,cAAM,YAAY,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,YAA5C;AAEA,cAAM,OAAO,GAAG,CAAC,CAAC,GAAG,WAAL,IAAoB,CAAC,CAArC;AACA,cAAM,MAAM,GAAG,CAAC,CAAC,GAAG,YAAL,IAAqB,CAAC,CAArC;;AAEA,cAAI,CAAC,GAAG,OAAR,EAAiB;AACb,YAAA,CAAC,GAAG,OAAJ;AACH;;AAED,cAAI,CAAC,GAAG,MAAR,EAAgB;AACZ,YAAA,CAAC,GAAG,MAAJ;AACH;AACJ;;AAED,aAAK,GAAL,CAAS,aAAT,CAAuB,KAAvB,CAA6B,qBAA7B,cAAyD,CAAzD,gBAAgE,CAAhE;AACA,aAAK,KAAL,CAAW,kBAAX,CAA8B,KAA9B,CAAoC,IAApC,aAA8C,CAA9C;AACA,aAAK,KAAL,CAAW,kBAAX,CAA8B,KAA9B,CAAoC,GAApC,aAA6C,CAA7C;AACH,OAlGI;AAmGL,MAAA,IAnGK,gBAmGA,EAnGA,EAmGG;AACJ,aAAK,QAAL,GAAgB,EAAhB;AACH,OArGI;AAsGL,MAAA,MAtGK,oBAsGG;AACJ,YAAM,OAAO,GAAG,IAAhB;;AAEA,YAAI,KAAK,aAAT,EAAwB;AACpB,UAAA,YAAY,CAAC,KAAK,aAAN,CAAZ;AACH;;AAED,aAAK,aAAL,GAAqB,UAAU,CAAC,YAAU;AACtC,UAAA,OAAO,CAAC,aAAR,GAAwB,IAAxB;AACA,UAAA,OAAO,CAAC,iBAAR;AACH,SAH8B,EAG5B,GAH4B,CAA/B;AAKA,aAAK,YAAL;AACH,OAnHI;AAoHL,MAAA,iBApHK,+BAoHc;AAAA,mCACc,KAAK,aAAL,EADd;AAAA,YACL,KADK,wBACP,CADO;AAAA,YACI,KADJ,wBACE,CADF;;AAGf,YAAM,SAAS,GAAG,EAAlB;AACA,aAAK,IAAL,CAAU,OAAV,CAAkB,UAAA,CAAC,EAAI;AAAA,8CACJ,CAAC,CAAC,WADE;AAAA,cACZ,CADY;AAAA,cACT,CADS;;AAEnB,cAAM,IAAI,GAAG,IAAI,CAAC,KAAL,CAAW,CAAC,GAAG,KAAf,CAAb;;AACA,cAAM,KAAK,GAAG,IAAI,CAAC,KAAL,CAAW,CAAC,GAAG,KAAf,CAAd;;AAEA,UAAA,SAAS,CAAC,IAAV,mBACO,CADP;AAEI,YAAA,WAAW,EAAE,WAAI,KAAJ,mBAAkB,IAAlB;AAFjB;AAIH,SATD;AAWA,aAAK,SAAL,GAAiB,SAAjB;AACH,OApII;AAqIL,MAAA,eArIK,6BAqIa;AACd,YAAI,SAAS,GAAG,IAAhB;AACA,YAAI,UAAU,GAAG,GAAjB;AACA,YAAI,SAAS,GAAG,SAAS,GAAC,UAA1B;AACA,YAAI,WAAW,GAAG,MAAM,CAAC,UAAzB;AACA,YAAI,UAAU,GAAG,IAAI,CAAC,KAAL,CAAW,WAAW,GAAG,SAAzB,CAAjB;AACA,YAAI,GAAG,GAAG,KAAK,GAAL,CAAS,UAAnB;AACA,QAAA,GAAG,CAAC,KAAJ,CAAU,MAAV,aAAsB,UAAtB;AACH;AA7II,KAnDb;AAkMI,IAAA,UAAU,EAAE;AACR,yBAAmB;AACf,QAAA,IAAI,EAAE,iBADS;AAEf,QAAA,KAAK,EAAE,CAAC,IAAD,EAAO,MAAP,EAAe,MAAf,EAAuB,QAAvB,EAAiC,4BAAjC,CAFQ;AAGf,QAAA,IAHe,kBAGT;AACF,iBAAO;AACH,YAAA,aAAa,EAAE,IADZ;AAEH,YAAA,YAAY,EAAE;AAFX,WAAP;AAIH,SARc;AASf,QAAA,QAAQ,EAAE;AACN,UAAA,WAAW,EAAE,uBAAW;AACpB,mBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,sBAAQ,OADU;AAElB,0BAAY,cAFM;AAGlB,wBAAU,MAHQ;AAIlB,uBAAS,KAAK,IAAL,CAAU;AAJD,aAAf,CAAP;AAMH;AARK,SATK;AAmBf,QAAA,KAAK,EAAE;AACH,UAAA,IADG,kBACG;AACF,iBAAK,UAAL;AACA,iBAAK,aAAL,CAAmB,UAAnB,CAA8B,EAA9B;AACH,WAJE;AAKH,UAAA,MALG,oBAKK;AACJ,iBAAK,UAAL;AACA,iBAAK,aAAL,CAAmB,UAAnB,CAA8B,EAA9B;;AACA,gBAAI,KAAK,MAAT,EAAiB;AACb;AACA,kBAAI,WAAW,GAAG,QAAQ,CAAC,aAAT,kBAAiC,KAAK,EAAL,GAAU,CAA3C,EAAlB;AACA,cAAA,WAAW,CAAC,KAAZ,CAAkB,MAAlB,GAA2B,GAA3B;AACH;AACJ;AAbE,SAnBQ;AAkCf,QAAA,OAAO,EAAE;AACL,UAAA,MADK,oBACG;AACJ,iBAAK,IAAL,CAAU,KAAK,EAAf;AACH,WAHI;AAIL,UAAA,OAJK,qBAII;AACL,iBAAK,IAAL,CAAU,IAAV;AACH,WANI;AAOL,UAAA,UAPK,wBAOO;AACR,gBAAI,KAAK,MAAL,IAAe,MAAM,CAAC,UAAP,GAAoB,GAAvC,EAA2C;AACvC,mBAAK,0BAAL,CAAgC,KAAK,YAArC;AACH,aAFD,MAEO;AACH,mBAAK,iBAAL;AACH;AACJ,WAbI;AAcL,UAAA,iBAdK,+BAcc;AACf,iBAAK,aAAL,CAAmB,MAAnB,CAA0B,aAA1B,CAAwC,gBAAxC,EAA0D,WAA1D,CAAsE,KAAK,YAA3E;AACH;AAhBI,SAlCM;AAoDf,QAAA,OApDe,qBAoDL;AACN,cAAM,OAAO,GAAG,IAAhB;AACA,eAAK,YAAL,GAAoB,KAAK,GAAL,CAAS,QAAT,CAAkB,CAAlB,CAApB;AACA,cAAM,QAAQ,GAAG,uBAAM,KAAK,GAAX,EAAgB;AAC7B,YAAA,OAAO,EAAE,EADoB;AAE7B,YAAA,QAAQ,EAAE,MAFmB;AAG7B,YAAA,SAAS,EAAE,IAHkB;AAI7B,YAAA,WAAW,EAAE,IAJgB;AAK7B,YAAA,SAAS,EAAE,KAAK,IAAL,CAAU,SALQ;AAM7B,YAAA,OAAO,EAAE,QANoB;AAO7B,YAAA,MAAM,EAAE,EAPqB;AAQ7B,YAAA,QAR6B,oBAQpB,QARoB,EAQV;AACf,cAAA,OAAO,CAAC,aAAR,GAAwB,QAAxB;AACA,cAAA,OAAO,CAAC,iBAAR;AACA,cAAA,QAAQ,CAAC,IAAT;AACH,aAZ4B;AAa7B,YAAA,MAb6B,kBAatB,QAbsB,EAaZ;AACb,qBAAO,KAAP;AACH;AAf4B,WAAhB,CAAjB;AAiBH;AAxEc;AADX;AAlMhB,GADQ;AAF4B,CAA5C;;;;;ACJA;;AAEA;;AACA;;AAEA;;AACA;;AAGA;;AACA;;AACA;;AACA;;AAGA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;AAEA,4BAAgB,SAAhB,CAA0B,iBAA1B,EAA6C;AACzC,EAAA,MAAM,EAAE,iBADiC;AAEzC,EAAA,UAAU,EAAE,CACR,yBAAQ;AACJ,IAAA,KAAK,EAAE;AACH,MAAA,YAAY,EAAE;AAAE,QAAA,IAAI,EAAE,MAAR;AAAgB,mBAAS;AAAzB,OADX;AAEH,MAAA,QAAQ,EAAE;AAAE,QAAA,IAAI,EAAE,MAAR;AAAgB,mBAAS;AAAzB,OAFP;AAGH,MAAA,kBAAkB,EAAE;AAAE,QAAA,IAAI,EAAE,MAAR;AAAgB,mBAAS;AAAzB;AAHjB,KADH;AAMJ,IAAA,IAAI,EAAE,gBAAU;AACZ,aAAO;AACH;AACA,QAAA,IAAI,EAAE,EAFH;AAIH;AACA,QAAA,KAAK,EAAE,KAAK,YALT;AAOH;AACA,QAAA,KAAK,EAAE,EARJ;AASH,QAAA,UAAU,EAAE,CATT;AAUH,QAAA,UAAU,EAAE,EAVT;AAYH,QAAA,SAAS,EAAE,EAZR;AAaH,QAAA,WAAW,EAAE,EAbV;AAcH,QAAA,gBAAgB,EAAE,IAdf;AAeH,QAAA,MAAM,EAAE,EAfL;AAgBH,QAAA,QAAQ,EAAE,IAhBP;AAiBH,QAAA,UAAU,EAAE,EAjBT;AAkBH,QAAA,aAAa,EAAE,KAlBZ;AAmBH,QAAA,WAAW,EAAE;AAnBV,OAAP;AAqBH,KA5BG;AA6BJ,IAAA,QAAQ,EAAE;AACN,MAAA,YADM,0BACS;AACX,eAAO,kBAAM,KAAN,CAAY,KAAnB;AACH,OAHK;AAIN,MAAA,OAJM,qBAIG;AAAA;;AACL,YAAM,OAAO,GAAG,KAAK,UAAL,CAAgB,MAAhB,CAAuB,UAAC,CAAD,EAAI,CAAJ;AAAA,iBAAU,CAAC,GAAG,MAAI,CAAC,UAAnB;AAAA,SAAvB,EAAuD,MAAvD,CAA8D,UAAC,CAAD,EAAI,EAAJ,EAAW;AACrF,cAAI,CAAC,EAAL,EAAS;AACL,mBAAO,CAAP;AACH;;AAED,cAAM,KAAK,GAAG,EAAE,CAAC,MAAH,CAAU,UAAC,EAAD,EAAK,CAAL;AAAA,qCAAgB,EAAhB,MAAuB,CAAC,CAAC,KAAzB;AAAA,WAAV,EAA6C,EAA7C,CAAd;AAEA,mCAAW,CAAX,MAAiB,KAAjB;AACH,SARe,EAQb,EARa,CAAhB;AAUA,eAAO,OAAP;AACH,OAhBK;AAiBN,MAAA,UAjBM,wBAiBM;AACR,YAAI,KAAK,aAAT,EAAwB;AACpB,iBAAO,KAAP;AACH;;AAED,YAAM,SAAS,GAAG,KAAK,YAAL,CAAkB,KAAK,UAAvB,CAAlB;AACA,eAAO,OAAO,CAAC,SAAS,CAAC,IAAV,CAAe,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,MAAN;AAAA,SAAhB,CAAD,CAAd;AACH,OAxBK;AAyBN,MAAA,aAzBM,2BAyBS;AACX,eAAO,KAAK,aAAL,IAAsB,KAAK,SAAL,CAAe,MAAf,KAA0B,CAAhD,IAAqD,KAAK,UAAjE;AACH,OA3BK;AA4BN,MAAA,KA5BM,mBA4BC;AACH,YAAI,KAAK,aAAT,EAAwB;AAAA,qBACD,KAAK,IAAN,IAAe,EADb;AAAA,cACZ,KADY,QACZ,KADY;;AAEpB,iBAAO,KAAP;AACH;;AAED,YAAM,GAAG,GAAG,KAAK,MAAL,CAAY,KAAK,UAAjB,CAAZ;AACA,eAAQ,GAAG,IAAI,GAAG,CAAC,QAAZ,IAAyB,IAAhC;AACH,OApCK;AAqCN,MAAA,OArCM,qBAqCG;AACL,YAAI,CAAC,KAAK,aAAV,EAAyB;AACrB,iBAAO,IAAP;AACH;;AAHI,oBAKgB,KAAK,IAAN,IAAe,EAL9B;AAAA,YAKG,OALH,SAKG,OALH;;AAML,eAAO,OAAP;AACH,OA5CK;AA6CN,MAAA,UA7CM,wBA6CM;AACR,YAAM,OAAO,GAAG,KAAK,IAAL,CAAU,aAAV,IAA2B,EAA3C;AACA,eAAO,OAAO,CAAC,UAAf;AACH,OAhDK;AAiDN,MAAA,SAjDM,uBAiDK;AACP,YAAM,OAAO,GAAG,KAAK,IAAL,CAAU,aAAV,IAA2B,EAA3C;;AACA,YAAI,KAAK,aAAT,EAAwB;AACpB,iBAAO,OAAO,CAAC,iBAAf;AACH;;AAED,eAAO,OAAO,CAAC,SAAf;AACH,OAxDK;AAyDN,MAAA,SAzDM,uBAyDK;AACP,YAAI,KAAK,aAAT,EAAwB;AACpB,iBAAO,IAAP;AACH;;AAED,eAAO,KAAK,IAAL,CAAU,aAAV,IAA2B,KAAK,IAAL,CAAU,aAAV,CAAwB,eAA1D;AACH,OA/DK;AAgEN,MAAA,cAhEM,4BAgEU;AACZ,YAAM,OAAO,GAAG,KAAK,IAAL,CAAU,aAAV,IAA2B,EAA3C;AACA,eAAO,OAAO,CAAC,YAAf;AACH,OAnEK;AAoEN,MAAA,aApEM,2BAoES;AACX,YAAI,CAAC,KAAK,aAAV,EAAyB;AACrB,iBAAO,IAAP;AACH;;AAED,eAAO,KAAK,IAAL,CAAU,aAAV,IAA2B;AAAE,UAAA,KAAK,EAAE,KAAK,IAAL,CAAU,aAAV,CAAwB;AAAjC,SAAlC;AACH;AA1EK,KA7BN;AAyGJ,IAAA,KAAK,EAAE;AACH,MAAA,aADG,2BACY;AACX,YAAI,CAAC,KAAK,aAAV,EAAyB;AACrB;AACH;;AAHU,8BAKW,KAAK,IALhB,CAKH,IALG;AAAA,YAKH,IALG,gCAKI,EALJ;AAMX,YAAM,UAAU,GAAG,KAAK,UAAxB;AAEA,YAAM,SAAS,GAAG,IAAI,CAAC,MAAL,CAAY,UAAC,CAAD,EAAI,CAAJ,EAAO,EAAP,EAAc;AACxC,cAAI,CAAC,CAAC,CAAC,SAAP,EAAiB;AACb,mBAAO,CAAP;AACH;;AAED,cAAM,SAAS,GAAG,CAAC,CAAC,SAAF,CAAY,GAAZ,CAAgB,UAAC,CAAD,EAAG,CAAH,EAAS;AACvC,qCAAW,CAAX;AAAc,cAAA,aAAa,EAAE,CAA7B;AAAgC,cAAA,QAAQ,EAAE;AAA1C;AACH,WAFiB,EAEf,MAFe,CAER,UAAA,CAAC;AAAA,mBAAI,CAAC,CAAC,CAAC,MAAP;AAAA,WAFO,CAAlB;AAIA,8CAAW,CAAX,sBAAiB,SAAjB;AACH,SAViB,EAUf,EAVe,CAAlB;AAYA,aAAK,WAAL,GAAmB,SAAS,CAAC,GAAV,CAAc,UAAC,CAAD,EAAI,CAAJ,EAAU;AAAA,cAC/B,QAD+B,GACK,CADL,CAC/B,QAD+B;AAAA,cACrB,aADqB,GACK,CADL,CACrB,aADqB;AAAA,cACH,IADG,4BACK,CADL;;AAEvC,iBAAO,UAAU,CAAC,CAAC,CAAC,QAAH,CAAV,IAA0B,UAAU,CAAC,CAAC,CAAC,QAAH,CAAV,CAAuB,CAAC,CAAC,aAAzB,CAAjC;AACH,SAHkB,CAAnB;AAKA,aAAK,SAAL,GAAiB,SAAjB;AACH,OA3BE;AA4BH,MAAA,WA5BG,uBA4BS,CA5BT,EA4BW;AACV,YAAI,KAAK,aAAT,EAAwB;AACpB,eAAK,6BAAL;AACA,eAAK,gBAAL,GAAwB,KAAxB;AACA,eAAK,MAAL,GAAc,EAAd;AACA;AACH;;AANS,2BAQiB,KAAK,MAAL,CAAY,KAAK,UAAjB,CARjB;AAAA,YAQF,cARE,gBAQF,cARE;;AASV,YAAI,SAAS,GAAG,KAAK,YAAL,CAAkB,KAAK,UAAvB,CAAhB;;AAEA,YAAI,CAAC,SAAL,EAAiB;AACb,iBAAO,EAAP;AACH;;AAED,QAAA,SAAS,GAAG,SAAS,CAAC,GAAV,CAAc,UAAC,CAAD,EAAI,CAAJ;AAAA,mCAAgB,CAAhB;AAAmB,YAAA,KAAK,EAAE;AAA1B;AAAA,SAAd,CAAZ;AAEA,YAAM,OAAO,GAAG,KAAK,WAAL,CAAiB,MAAjB,CAAwB,UAAA,CAAC;AAAA,iBAAI,CAAJ;AAAA,SAAzB,CAAhB;AACA,YAAM,aAAa,GAAG,OAAO,CAAC,MAAR,CAAe,UAAC,CAAD,EAAI,CAAJ;AAAA,mCAAgB,CAAhB,sBAAoB,CAAC,CAAC,EAAtB,EAA2B,CAAC,CAAC,KAA7B;AAAA,SAAf,EAAsD,EAAtD,CAAtB;AAEA,aAAK,SAAL,GAAiB,SAAS,CAAC,MAAV,CAAiB,UAAA,CAAC,EAAI;AACnC,cAAI,CAAC,CAAC,CAAC,cAAP,EAAsB;AAClB,mBAAO,IAAP;AACH;;AAED,cAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,cAAH,CAAvB;AAEA,iBAAO,CAAC,KAAK,OAAO,CAAP,KAAa,QAAb,GAAwB,CAAC,KAAK,CAAC,CAAC,WAAhC,GAA8C,CAAC,CAAC,OAAF,CAAU,CAAC,CAAC,WAAZ,KAA4B,CAA/E,CAAR;AACH,SARgB,CAAjB;AAUA,YAAM,OAAO,GAAG,KAAK,SAAL,CAAe,GAAf,CAAmB,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,KAAN;AAAA,SAApB,CAAhB;AACA,YAAM,eAAe,GAAG,OAAO,CAAC,MAAR,CAAe,UAAA,CAAC;AAAA,iBAAI,OAAO,CAAC,OAAR,CAAgB,CAAC,CAAC,KAAlB,KAA4B,CAAhC;AAAA,SAAhB,CAAxB;;AA/BU,oBAiC2C,cAAc,IAAI,EAjC7D;AAAA,yCAiCF,cAjCE;AAAA,YAiCF,cAjCE,qCAiCe,SAjCf;AAAA,kCAiC0B,OAjC1B;AAAA,YAiC0B,OAjC1B,8BAiCoC,EAjCpC;;AAmCV,YAAI,cAAc,KAAK,KAAvB,EAA8B;AAC1B,eAAK,gBAAL,GAAwB,EAAE,CAAC,eAAe,CAAC,IAAhB,CAAqB,UAAA,CAAC;AAAA,mBAAI,OAAO,CAAC,OAAR,CAAgB,CAAC,CAAC,EAAlB,KAAyB,CAA7B;AAAA,WAAtB,KAAyD,KAA1D,KAAoE,IAAtE,CAAxB;AACH,SAFD,MAEO,IAAI,cAAc,KAAK,KAAvB,EAA8B;AACjC,eAAK,gBAAL,GAAwB,eAAe,CAAC,MAAhB,CAAuB,UAAA,CAAC;AAAA,mBAAI,OAAO,CAAC,OAAR,CAAgB,CAAC,CAAC,EAAlB,KAAyB,CAA7B;AAAA,WAAxB,EAAwD,MAAxD,KAAmE,OAAO,CAAC,MAAnG;AACH,SAFM,MAEA;AACH,eAAK,gBAAL,GAAwB,KAAK,SAAL,CAAe,MAAf,KAA0B,eAAe,CAAC,MAAlE;AACH;;AAED,aAAK,MAAL,GAAc,CAAC,eAAe,CAAC,IAAhB,CAAqB,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,MAAN;AAAA,SAAtB,KAAuC,EAAxC,EAA4C,MAA5C,IAAsD,EAApE;AACH,OAxEE;AAyEH,MAAA,OAAO,EAAE;AACL,QAAA,OAAO,EAAE,mBAAU;AACf,eAAK,IAAL,GAAY;AACR,YAAA,cAAc,EAAE,KAAK,aAAL,IAAsB,KAAK;AADnC,WAAZ;;AAKA,cAAI,KAAK,QAAT,EAAkB;AACd,YAAA,YAAY,CAAC,KAAK,QAAN,CAAZ;AACH;;AAED,cAAI,CAAC,KAAK,aAAV,EAAyB;AACrB,iBAAK,QAAL;AACH,WAFD,MAEK;AACD,iBAAK,QAAL,GAAgB,UAAU,CAAC,KAAK,QAAN,EAAgB,GAAhB,CAA1B;AACH;AAEJ,SAjBI;AAkBL,QAAA,IAAI,EAAE;AAlBD,OAzEN;AA6FH,MAAA,IAAI,EAAE;AACF,QAAA,OAAO,EAAE,iBAAS,CAAT,EAAW;AAChB,cAAI,CAAC,CAAD,IAAM,CAAC,CAAC,CAAC,aAAb,EAA4B;AACxB;AACH;;AAHe,sBAKkC,CAAC,CAAC,aAAF,IAAmB,EALrD;AAAA,cAKR,YALQ,SAKR,YALQ;AAAA,cAKM,SALN,SAKM,SALN;AAAA,cAKiB,YALjB,SAKiB,YALjB;;AAMhB,cAAM,IAAI,GAAG,CAAC,CAAC,IAAF,IAAU,EAAvB,CANgB,CAQhB;;AACA,cAAI,YAAY,KAAK,SAArB,EAAgC;AAC5B,iBAAK,KAAL,GAAa,YAAb;AACH,WAXe,CAahB;;;AACA,WAAC,SAAD,IAAc,KAAK,OAAL,CAAa,CAAb,CAAd;AAEA,eAAK,KAAL,GAAa,IAAI,CAAC,GAAL,CAAS,UAAA,CAAC;AAAA,mBAAK;AAAE,cAAA,KAAK,EAAE,CAAC,CAAC;AAAX,aAAL;AAAA,WAAV,CAAb;;AAEA,cAAI,YAAJ,EAAkB;AACd,iBAAK,UAAL,GAAkB,KAAK,KAAL,CAAW,MAA7B;AACH;;AAED,eAAK,aAAL,GAAqB,KAAK,KAAL,CAAW,MAAX,IAAqB,KAAK,UAA/C;AAEA,eAAK,QAAL;AACH,SA1BC;AA2BF,QAAA,IAAI,EAAE;AA3BJ,OA7FH;AA0HH,MAAA,UA1HG,sBA0HQ,CA1HR,EA0HW;AACV,aAAK,WAAL,GAAoB,IAApB;AACA,aAAK,QAAL;AACH,OA7HE;AA8HH,MAAA,WA9HG,uBA8HS,CA9HT,EA8HW,CACb;AA/HE,KAzGH;AA0OJ,IAAA,OAAO,EAAE,mBAAW;AAChB,UAAM,IAAI,GAAG,QAAQ,CAAC,gBAAT,CAA0B,iBAA1B,CAAb;;AACA,WAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,IAAI,CAAC,MAAzB,EAAiC,CAAC,EAAlC,EAAqC;AAAE,YAAM,CAAC,GAAG,IAAI,CAAC,CAAD,CAAd;AAAmB,QAAA,CAAC,CAAC,SAAF,CAAY,GAAZ,CAAgB,oBAAhB;AAAwC;AACrG,KA7OG;AA8OJ,IAAA,OA9OI,qBA8OK;AACL,UAAI,KAAK,aAAT,EAAwB;AACpB,aAAK,WAAL;AACH;AACJ,KAlPG;AAmPJ,IAAA,OAAO,EAAE;AACL;AACA,MAAA,QAAQ,EAAE,oBAAU;AAChB,YAAM,KAAK,GAAG,IAAd;;AACA,YAAI,OAAO,qBAAO,KAAK,OAAZ,CAAX;;AAEA,aAAK,KAAL,CAAW,UAAS,QAAT,EAAkB;AACzB,UAAA,KAAK,CAAC,OAAN,CAAc,QAAQ,CAAC,IAAT,IAAiB,EAA/B;AACH,SAFD,EAEG;AACC,UAAA,MAAM,oBACC,KAAK,MADN;AAEF,YAAA,IAAI,EAAE,KAAK;AAFT,aAGC,OAHD,CADP;AAMC,UAAA,gBAAgB,EAAE,0BAAU,MAAV,EAAkB;AAChC,mBAAO,eAAG,SAAH,CAAa,MAAb,EAAqB;AAAC,cAAA,WAAW,EAAE;AAAd,aAArB,CAAP;AACH;AARF,SAFH;AAYH,OAlBI;AAoBL;AACA,MAAA,QAAQ,EAAE,kBAAS,CAAT,EAAW;AACjB,aAAK,OAAL,CAAa,KAAK,IAAlB;AACH,OAvBI;AAwBL,MAAA,OAAO,EAAE,iBAAS,IAAT,EAAc;AAAA;;AAAA,kCAC+D,IAD/D,CACX,aADW;AAAA,wDACM,OADN;AAAA,YACM,OADN,sCACgB,EADhB;AAAA,YACoB,SADpB,uBACoB,SADpB;AAAA,YACkC,cADlC;AAAA,YACuD,GADvD,4BAC+D,IAD/D;;AAEnB,YAAI,aAAa,GAAG,EAApB;;AAEA,YAAI,CAAC,SAAL,EAAgB;AACZ,UAAA,aAAa;AACT,YAAA,OAAO,qBACA,OAAO,CAAC,MAAR,CAAe,UAAC,CAAD,EAAI,CAAJ;AAAA,qBAAU,CAAC,GAAG,MAAI,CAAC,QAAnB;AAAA,aAAf,CADA,CADE;AAIT,YAAA,SAAS,EAAE,OAAO,CAAC,MAAR,CAAe,UAAC,CAAD,EAAI,CAAJ;AAAA,qBAAU,CAAC,IAAI,MAAI,CAAC,QAApB;AAAA,aAAf;AAJF,aAKN,cALM,CAAb;AAQA,eAAK,kBAAL,CAAwB,IAAxB;AACH,SAVD,MAUO;AACH,UAAA,aAAa;AACT,YAAA,OAAO,+BACA,OADA,sBAEA,SAAS,CAAC,MAAV,CAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,qBAAU,CAAC,GAAG,MAAI,CAAC,QAAnB;AAAA,aAAjB,CAFA,EADE;AAKT,YAAA,SAAS,EAAE,SAAS,CAAC,MAAV,CAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,qBAAU,CAAC,IAAI,MAAI,CAAC,QAApB;AAAA,aAAjB;AALF,aAMN,cANM,CAAb;AAQH;;AAED,aAAK,IAAL,qBACO,GADP;AAEI,UAAA,aAAa,EAAb,aAFJ;AAGI,UAAA,QAAQ,EAAE,aAAa,CAAC,SAAd,CAAwB,MAAxB,GAAiC;AAH/C;AAKH,OAtDI;AAwDL;AACA,MAAA,MAzDK,kBAyDE,UAzDF,EAyDc,IAzDd,EAyDoB;AACrB,YAAM,IAAI,GAAI,IAAI,IAAI,IAAI,CAAC,IAAd,IAAwB,KAAK,IAAL,CAAU,IAAlC,IAA0C,EAAvD;AACA,eAAO,IAAI,CAAC,UAAD,CAAJ,IAAoB,EAA3B;AACH,OA5DI;AA6DL,MAAA,YA7DK,wBA6DQ,UA7DR,EA6DoB,IA7DpB,EA6D0B;AAC3B,YAAM,GAAG,GAAG,KAAK,MAAL,CAAY,UAAZ,EAAwB,IAAxB,CAAZ;AACA,eAAO,GAAG,CAAC,SAAJ,IAAiB,EAAxB;AACH,OAhEI;AAiEL,MAAA,QAjEK,sBAiEM;AACP,aAAK,aAAL;;AAEA,YAAI,KAAK,aAAT,EAAuB;AACnB;AACH;;AAED,aAAK,WAAL,GAAmB,KAAK,UAAL,CAAgB,KAAK,UAArB,uBAAuC,KAAK,UAAL,CAAgB,KAAK,UAArB,CAAvC,IAA2E,EAA9F;AACH,OAzEI;AA0EL,MAAA,aA1EK,2BA0EW;AAAA;;AACZ,YAAM,IAAI,GAAG,KAAK,IAAL,CAAU,IAAV,IAAkB,EAA/B;;AACA,YAAI,IAAI,CAAC,MAAL,KAAgB,CAApB,EAAuB;AACnB;AACH;;AAED,YAAM,UAAU,GAAG,KAAK,UAAxB;AAEA,aAAK,UAAL,GAAkB,UAAU,CAAC,GAAX,CAAe,UAAC,CAAD,EAAI,CAAJ,EAAU;AACvC,cAAM,GAAG,GAAG,IAAI,CAAC,CAAD,CAAJ,IAAW,EAAvB;;AAEA,cAAI,GAAG,CAAC,QAAR,EAAkB;AACd,mBAAO,GAAG,CAAC,QAAX;AACH;;AAED,cAAI,CAAC,IAAI,MAAI,CAAC,UAAd,EAA0B;AACtB,mBAAO,EAAP;AACH;;AAED,cAAI,CAAC,CAAL,EAAQ;AACJ,mBAAO,EAAP;AACH;;AAED,cAAM,KAAK,GAAG,CAAC,CAAC,GAAF,CAAM,UAAA,CAAC,EAAI;AACrB,gBAAI,QAAO,CAAC,CAAC,KAAT,MAAmB,QAAvB,EAAgC;AAAA,0BACD,MAAI,CAAC,IAAL,CAAU,aAAV,IAA2B,EAD1B;AAAA,0CACpB,SADoB;AAAA,kBACpB,SADoB,gCACR,EADQ;;AAE5B,kBAAI,CAAC,CAAC,KAAF,CAAQ,MAAR,IAAkB,CAAtB,EAAyB;AACrB,uBAAO,CAAC,CAAC,KAAF,CAAQ,IAAR,EAAP;AACH;;AACD,kBAAM,KAAK,GAAG,CAAC,CAAC,KAAF,CAAQ,MAAR,GAAe,CAA7B;AACA,qBAAO,CAAC,CAAC,KAAF,CAAQ,CAAR,iBAAmB,KAAnB,SAA8B,SAArC;AACH;;AAED,mBAAO,CAAC,CAAC,KAAT;AACH,WAXa,EAWX,IAXW,CAWN,GAXM,CAAd;AAYA,iBAAO,KAAP;AACH,SA5BiB,CAAlB;AA6BH,OA/GI;AAgHL,MAAA,iBAhHK,+BAgHyB;AAAA;;AAAA,YAAZ,IAAY,uEAAP,KAAO;;AAC1B,YAAI,KAAK,aAAT,EAAwB;AACpB,eAAK,KAAL,CAAW,QAAX,CAAoB,IAApB;AACA;AACH;;AAED,aAAK,UAAL,sBAAsB,KAAK,UAA3B;AAEA,YAAM,OAAO,GAAG,KAAK,SAAL,CAAe,GAAf,CAAmB,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,KAAN;AAAA,SAApB,CAAhB;;AAEA,YAAG,IAAH,EAAQ;AACJ,eAAK,UAAL,CAAgB,KAAK,UAArB,IAAmC,KAAK,SAAL,CAAe,GAAf,CAAmB,UAAA,CAAC;AAAA,mBAAI,MAAI,CAAC,kBAAL,CAAwB,CAAxB,CAAJ;AAAA,WAApB,CAAnC;AACH,SAFD,MAEO;AACH,cAAM,IAAI,GAAG,KAAK,WAAL,CAAiB,MAAjB,CAAwB,UAAC,CAAD,EAAI,CAAJ;AAAA,mBAAW,CAAC,CAAD,GAAK,CAAL,qBAAa,CAAb,sBAAiB,CAAC,CAAC,KAAnB,EAA2B,CAA3B,EAAX;AAAA,WAAxB,EAAmE,EAAnE,CAAb;AACA,eAAK,UAAL,CAAgB,KAAK,UAArB,IAAmC,OAAO,CAAC,GAAR,CAAY,UAAA,CAAC;AAAA,mBAAI,IAAI,CAAC,CAAD,CAAJ,IAAW,EAAf;AAAA,WAAb,CAAnC;AACH;;AAED,aAAK,WAAL,GAAmB,EAAnB;AACA,aAAK,UAAL,IAAmB,CAAnB;AACH,OAnII;AAoIL,MAAA,iBApIK,+BAoIe;AAChB,aAAK,iBAAL,CAAuB,IAAvB;AACH,OAtII;AAuIL,MAAA,gBAvIK,4BAuIY,UAvIZ,EAuIwB;AACzB,aAAK,UAAL,GAAkB,UAAlB;AACH,OAzII;AA0IL,MAAA,6BA1IK,2CA0I0B;AAAA;;AAC3B,YAAM,UAAU,sBAAO,KAAK,UAAZ,CAAhB;;AACA,aAAK,SAAL,CAAe,OAAf,CAAuB,UAAC,CAAD,EAAI,CAAJ,EAAU;AAAA,cACrB,QADqB,GACe,CADf,CACrB,QADqB;AAAA,cACX,aADW,GACe,CADf,CACX,aADW;AAAA,cACO,IADP,4BACe,CADf;;AAE7B,cAAI,CAAC,UAAU,CAAC,QAAD,CAAf,EAA2B;AACvB,YAAA,UAAU,CAAC,QAAD,CAAV,GAAuB,EAAvB;AACH;;AAED,cAAI,CAAC,MAAI,CAAC,WAAL,CAAiB,CAAjB,CAAL,EAA0B;AACtB,YAAA,UAAU,CAAC,QAAD,CAAV,CAAqB,aAArB,IAAsC,MAAI,CAAC,kBAAL,CAAwB,CAAxB,CAAtC;AACA;AACH;;AAED,UAAA,UAAU,CAAC,QAAD,CAAV,CAAqB,aAArB,IAAsC,MAAI,CAAC,WAAL,CAAiB,CAAjB,CAAtC;AACH,SAZD;AAcA,aAAK,UAAL,GAAkB,UAAlB;AACH,OA3JI;AA4JL,MAAA,kBA5JK,8BA4Jc,CA5Jd,EA4JgB;AACjB,eAAO;AAAE,UAAA,KAAK,EAAE,CAAC,CAAC,QAAF,CAAW,MAAX,CAAkB,UAAC,CAAD,EAAI,CAAJ;AAAA,qCAAgB,CAAhB,sBAAoB,CAApB,EAAwB,MAAxB;AAAA,WAAlB,EAAqD,EAArD;AAAT,SAAP;AACH,OA9JI;AA+JL,MAAA,mBA/JK,+BA+Je,IA/Jf,EA+JqB,IA/JrB,EA+J0B;AAC3B,YAAI,CAAC,IAAL,EAAU;AACN;AACH;;AAED,YAAM,UAAU;AACZ,UAAA,KAAK,EAAE,oBADK;AAEZ,UAAA,IAAI,EAAE,MAFM;AAGZ,UAAA,QAAQ,EAAE;AAHE,WAIT,IAJS,CAAhB;;AAOA,YAAI;AACA,cAAI,IAAI,KAAK,WAAb,EAA0B;AACtB,YAAA,MAAM,CAAC,sBAAP,CAA8B,UAA9B;AACH,WAFD,MAEO;AACH,YAAA,MAAM,CAAC,0BAAP,CAAkC,UAAlC;AACH;AACJ,SAND,CAME,OAAM,GAAN,EAAW;AACT,UAAA,OAAO,CAAC,GAAR,CAAY,6BAAZ,EAA2C,GAA3C;AACH;AACJ,OApLI;AAqLL,MAAA,sBArLK,oCAqL4B;AAAA,YAAV,IAAU,uEAAH,EAAG;;AAC7B,YAAI,CAAC,MAAM,CAAC,SAAP,CAAiB,IAAI,CAAC,aAAtB,CAAL,EAA0C;AACvC;AACF;;AAED,YAAI,CAAC,IAAD,IAAS,IAAI,CAAC,KAAL,KAAe,SAA5B,EAAuC;AACnC;AACH,SAP4B,CAS7B;;;AACA,YAAM,GAAG,GAAG,KAAK,MAAL,CAAY,KAAK,UAAjB,CAAZ;AACA,YAAM,QAAQ,GAAG,KAAK,SAAL,CAAe,IAAI,CAAC,aAApB,CAAjB;AACA,YAAM,aAAa,GAAG,QAAQ,CAAC,QAAT,IAAqB,GAAG,CAAC,QAA/C;AACA,YAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAV,CAAxB;AAEA,aAAK,mBAAL,CAAyB;AACrB,UAAA,MAAM,EAAE,QAAQ,GAAG,aAAH,GAAmB,QAAQ,CAAC,UADvB;AAErB,UAAA,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC,KAAL,CAAW,KAAd,GAAsB,IAAI,CAAC,KAFrB;AAGrB,UAAA,WAAW,EAAE,QAAQ,GAAG,QAAH,GAAc;AAHd,SAAzB;AAKH,OAzMI;AA0ML,MAAA,kBA1MK,gCA0MwB;AAAA,YAAV,IAAU,uEAAH,EAAG;;AACzB,YAAI,CAAC,KAAK,WAAV,EAAuB;AACnB;AACH;;AAED,aAAK,WAAL,GAAmB,KAAnB,CALyB,CAOzB;;AACA,YAAM,CAAC,GAAG,KAAK,UAAf;AACA,YAAM,MAAM,GAAG,KAAK,QAAL,CAAc,MAAM,CAAC,CAAC,GAAG,CAAL,CAApB,EAA6B,CAA7B,CAAf;AACA,YAAM,UAAU,GAAG,IAAI,CAAC,aAAL,IAAsB,KAAK,QAAL,CAAc,MAAM,CAAC,IAAI,CAAC,aAAL,CAAmB,YAApB,CAApB,EAAuD,CAAvD,CAAzC;;AAEA,YAAI,CAAC,GAAG,KAAK,KAAL,CAAW,MAAnB,EAA2B;AACvB,eAAK,mBAAL,CAAyB;AACrB,YAAA,MAAM,EAAN,MADqB;AAErB,YAAA,UAAU,EAAV,UAFqB;AAGrB,YAAA,QAAQ,EAAE,KAAK,KAAL,CAAW,CAAX,EAAc;AAHH,WAAzB,EAIG,WAJH;AAKH,SAND,MAMO,IAAI,CAAC,IAAI,KAAK,KAAL,CAAW,MAApB,EAA4B;AAC/B,eAAK,mBAAL,CAAyB;AACrB,YAAA,MAAM,EAAN,MADqB;AAErB,YAAA,UAAU,EAAV,UAFqB;AAGrB,YAAA,QAAQ,EAAE;AAHW,WAAzB,EAIG,WAJH;AAMH;AACJ,OApOI;AAqOL,MAAA,QArOK,oBAqOI,KArOJ,EAqOuB;AAAA,YAAZ,OAAY,uEAAF,CAAE;AACxB,YAAI,CAAC,GAAI,MAAM,CAAC,KAAD,CAAf;;AACA,eAAO,CAAC,CAAC,MAAF,GAAW,OAAlB,EAA2B;AAAC,UAAA,CAAC,GAAG,MAAM,CAAV;AAAa;;AACzC,eAAO,CAAP;AACH,OAzOI;AA0OL,MAAA,WA1OK,yBA0OS;AACV,YAAM,OAAO,GAAG,QAAQ,CAAC,gBAAT,CAA0B,KAAK,kBAA/B,CAAhB;AACA,YAAM,QAAQ,GAAG,KAAK,UAAL,CAAgB,MAAhB,CAAuB,UAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAa;AACjD,cAAI,CAAC,CAAL,EAAS;AACL,mBAAO,CAAP;AACH;;AAED,cAAM,EAAE,GAAG,CAAC,CAAC,MAAF,CAAS,UAAA,CAAC;AAAA,mBAAI,OAAO,CAAC,CAAC,CAAC,KAAH,CAAX;AAAA,WAAV,EAAgC,GAAhC,CAAoC,UAAA,CAAC;AAAA,mBAAK;AAAE,cAAA,KAAK,EAAE,CAAC,CAAC,KAAF,IAAW,CAAC,CAAC,MAAF,IAAY,CAAC,CAAC,MAAF,CAAS,KAArB,GAA6B,SAAS,CAAC,CAAC,MAAF,CAAS,KAA/C,GAAuD,EAAlE,CAAT;AAAgF,cAAA,KAAK,EAAE,CAAC,CAAC;AAAzF,aAAL;AAAA,WAArC,CAAX;AAEA,iBAAO,EAAE,CAAC,MAAH,GAAY,CAAZ,gCAAoB,CAApB,sBAA0B,EAA1B,KAAgC,CAAvC;AACH,SARgB,EAQb,EARa,CAAjB;AAUA,YAAM,YAAY,GAAG,QAAQ,CAAC,MAAT,CAAgB,UAAA,CAAC;AAAA,iBAAI,OAAO,CAAC,CAAC,CAAC,KAAH,CAAX;AAAA,SAAjB,EAAuC,GAAvC,CAA2C,UAAA,CAAC;AAAA,iBAAI,CAAC,CAAC,KAAF,CAAQ,WAAR,KAAwB,IAAxB,IAAgC,KAAK,CAAC,OAAN,CAAc,CAAC,CAAC,KAAhB,IAAyB,CAAC,CAAC,KAAF,CAAQ,IAAR,CAAa,IAAb,CAAzB,GAA8C,CAAC,CAAC,KAAF,CAAQ,QAAR,EAA9E,CAAJ;AAAA,SAA5C,EAAmJ,IAAnJ,CAAwJ,KAAxJ,CAArB;;AAEA,aAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,OAAO,CAAC,MAA5B,EAAoC,CAAC,EAArC,EAAwC;AACpC,cAAM,MAAM,GAAG,OAAO,CAAC,CAAD,CAAtB;AACA,UAAA,MAAM,CAAC,OAAP,CAAe,QAAf,GAA0B,YAA1B;AACH;AACJ;AA5PI,KAnPL;AAifJ,IAAA,UAAU,EAAE;AACR,kCAA6B;AACzB,QAAA,KAAK,EAAE,CAAC,MAAD,EAAS,QAAT,CADkB;AAEzB,QAAA,QAAQ,EAAE;AAFe,OADrB;AAKR,gCAA2B;AACvB,QAAA,KAAK,EAAE,CAAC,MAAD,EAAS,OAAT,EAAkB,SAAlB,EAA6B,cAA7B,CADgB;AAEvB,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO,EAAP;AAEH,SALsB;AAMvB,QAAA,QAAQ,EAAE;AACN,UAAA,gBAAgB,EAAE,4BAAW;AACzB,mBAAO,KAAK,IAAL,CAAU,aAAV,CAAwB,gBAA/B;AACH,WAHK;AAIN,UAAA,SAJM,uBAIK;AACP,mBAAO,KAAK,OAAL,IAAgB,KAAK,KAAL,KAAe,CAA/B,GAAmC,gBAAnC,GAAsD,gBAA7D;AACH;AANK,SANa;AAcvB,QAAA,UAAU,EAAE;AACR,4BAAkB;AACd,YAAA,KAAK,EAAE,CAAC,MAAD,EAAS,cAAT,EAAyB,kBAAzB,CADO;AAEd,YAAA,QAAQ,EAAE,qCAFI;AAGd,YAAA,UAAU,EAAE;AACR,0BAAY;AACR,gBAAA,KAAK,EAAE,CAAC,MAAD,CADC;AAER,gBAAA,IAAI,EAAE,gBAAW;AACb,yBAAO;AACH,oBAAA,YAAY,EAAE,KADX;AAEH,oBAAA,EAAE,EAAE,IAFD;AAGH,oBAAA,IAAI,EAAE;AAHH,mBAAP;AAKH,iBARO;AASR,gBAAA,QAAQ,EAAE;AACN,kBAAA,KAAK,EAAE,iBAAW;AACd,2BAAO,kBAAM,KAAN,CAAY,SAAZ,WAAyB,KAAK,IAA9B,EAAP;AACH;AAHK,iBATF;AAcR,gBAAA,KAAK,EAAE;AACH,kBAAA,KAAK,EAAE,iBAAW;AACd,yBAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH;AAHE,iBAdC;AAmBR,gBAAA,OAAO,EAAE;AACL,kBAAA,cADK,4BACY;AACb,sCAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,sBAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,sBAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,sBAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,qBAAhC;;AAKA,sCAAM,QAAN,CAAe,gBAAf;AACH;AARI,iBAnBD;AA6BR,gBAAA,OA7BQ,qBA6BE;AACN,uBAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,IAA9U;AAEA,uBAAK,IAAL,GAAY,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,IAAxO;AAEA,uBAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH;AAnCO;AADJ;AAHE,WADV;AA4CR,4BAAkB;AACd,YAAA,KAAK,EAAE,CAAC,MAAD,EAAS,cAAT,EAAyB,kBAAzB,CADO;AAEd,YAAA,QAAQ,EAAE,qCAFI;AAGd,YAAA,UAAU,EAAE;AACR,0BAAY;AACR,gBAAA,KAAK,EAAE,CAAC,MAAD,CADC;AAER,gBAAA,IAAI,EAAE,gBAAW;AACb,yBAAO;AACH,oBAAA,YAAY,EAAE,KADX;AAEH,oBAAA,EAAE,EAAE,IAFD;AAGH,oBAAA,IAAI,EAAE;AAHH,mBAAP;AAKH,iBARO;AASR,gBAAA,QAAQ,EAAE;AACN,kBAAA,KAAK,EAAE,iBAAW;AACd,2BAAO,kBAAM,KAAN,CAAY,SAAZ,WAAyB,KAAK,IAA9B,EAAP;AACH;AAHK,iBATF;AAcR,gBAAA,KAAK,EAAE;AACH,kBAAA,KAAK,EAAE,iBAAW;AACd,yBAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH;AAHE,iBAdC;AAmBR,gBAAA,OAAO,EAAE;AACL,kBAAA,cADK,4BACY;AACb,sCAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,sBAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,sBAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,sBAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,qBAAhC;;AAKA,sCAAM,QAAN,CAAe,gBAAf;AACH;AARI,iBAnBD;AA6BR,gBAAA,OA7BQ,qBA6BE;AACN,uBAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAApE,GAAgF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,IAA9U;AAEA,uBAAK,IAAL,GAAY,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA5B,GAAwC,WAAxC,GAAsD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,YAAzC,GAAwD,IAAxO;AAEA,uBAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH;AAnCO;AADJ;AAHE;AA5CV,SAdW;AAuGvB,QAAA,KAAK,EAAE,EAvGgB;AAyGvB,QAAA,QAAQ,EAAE;AAzGa,OALnB;AAgHR,8BAAwB;AACpB,QAAA,KAAK,EAAE,CAAC,OAAD;AADa;AAhHhB;AAjfR,GAAR,CADQ;AAF6B,CAA7C;;;;;ACpBA;;AACA;;AACA;;AAOA;;AAGA;;AACA;;AACA;;AACA;;;;AALA;AACA;AAMA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,4BAAgB,SAAhB,CAA0B,gBAA1B,EAA4C;AACxC,EAAA,MAAM,EAAE,gBADgC;AAExC,EAAA,UAAU,EAAE,CACR,sBAAK;AACD,IAAA,IAAI,EAAE,gBAAW;AACb,aAAO;AACH,QAAA,QAAQ,EAAE;AACN,UAAA,QAAQ,EAAE,EADJ;AAEN,UAAA,SAAS,EAAE,EAFL;AAGN,UAAA,QAAQ,EAAE,EAHJ;AAIN,UAAA,QAAQ,EAAE,EAJJ;AAKN,UAAA,cAAc,EAAE;AALV;AADP,OAAP;AASH,KAXA;AAYD,IAAA,QAAQ,EAAE;AACN,MAAA,aAAa,EAAE,yBAAW;AACtB,eAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAA7B;AACH,OAHK;AAIN,MAAA,cAAc,EAAE,0BAAW;AACvB,eAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,OANK;AAON,MAAA,aAAa,EAAE,yBAAW;AACtB,eAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,OATK;AAUN,MAAA,aAAa,EAAE,yBAAW;AACtB,eAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAA7B;AACH,OAZK;AAaN,MAAA,mBAAmB,EAAE,+BAAW;AAC5B,eAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,eAA7B;AACH;AAfK,KAZT;AA6BD,IAAA,KAAK,EAAE;AACH,MAAA,aAAa,EAAE,yBAAW;AACtB,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACH,OAHE;AAIH,MAAA,cAAc,EAAE,0BAAW;AACvB,aAAK,QAAL,CAAc,SAAd,GAA0B,KAAK,cAAL,CAAoB,CAApB,KAA0B,EAA1B,GAA+B,KAAK,cAAL,CAAoB,KAApB,EAA/B,GAA6D,KAAK,cAA5F;AACH,OANE;AAOH,MAAA,aAAa,EAAE,yBAAW;AACtB,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACH,OATE;AAUH,MAAA,aAAa,EAAE,yBAAW;AACtB,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACH,OAZE;AAaH,MAAA,mBAAmB,EAAE,+BAAW;AAC5B,aAAK,QAAL,CAAc,cAAd,GAA+B,KAAK,mBAAL,CAAyB,CAAzB,KAA+B,EAA/B,GAAoC,KAAK,mBAAL,CAAyB,KAAzB,EAApC,GAAuE,KAAK,mBAA3G;AACH;AAfE,KA7BN;AA8CD,IAAA,OAAO,EAAE;AACL,MAAA,YADK,0BACU;AACX,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACA,aAAK,QAAL,CAAc,SAAd,GAA0B,KAAK,cAAL,CAAoB,CAApB,KAA0B,EAA1B,GAA+B,KAAK,cAAL,CAAoB,KAApB,EAA/B,GAA6D,KAAK,cAA5F;AACA,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACA,aAAK,QAAL,CAAc,QAAd,GAAyB,KAAK,aAAL,CAAmB,CAAnB,KAAyB,EAAzB,GAA8B,KAAK,aAAL,CAAmB,KAAnB,EAA9B,GAA2D,KAAK,aAAzF;AACA,aAAK,QAAL,CAAc,cAAd,GAA+B,KAAK,mBAAL,CAAyB,CAAzB,KAA+B,EAA/B,GAAoC,KAAK,mBAAL,CAAyB,KAAzB,EAApC,GAAuE,KAAK,mBAA3G;AACH;AAPI,KA9CR;AAuDD,IAAA,OAvDC,qBAuDS;AACN,WAAK,YAAL;AACH,KAzDA;AA0DD,IAAA,OA1DC,qBA0DS,CACT,CA3DA;AA4DD,IAAA,UAAU,EAAE;AACR,MAAA,eAAe,EAAE;AACb,QAAA,IAAI,EAAE,mBADO;AAEb,QAAA,QAAQ,EAAE,4BAFG;AAGb,QAAA,KAAK,EAAE;AACH,UAAA,UAAU,EAAE,CAAC,MAAD,EAAS,MAAT,CADT;AAEH,UAAA,WAAW,EAAE;AAAE,YAAA,IAAI,EAAE,MAAR;AAAgB,uBAAS;AAAzB,WAFV;AAGH,UAAA,SAAS,EAAE,QAHR;AAIH,UAAA,SAAS,EAAE;AAJR,SAHM;AASb,QAAA,IAAI,EAAE,gBAAW;AACb,cAAM,IAAI,GAAG;AACT,YAAA,OAAO,EAAE;AADA,WAAb;AAIA,iBAAO,IAAP;AACH,SAfY;AAgBb,QAAA,OAhBa,qBAgBH;AAAA;;AACN,cAAM,YAAY,GAAG,KAAK,MAAL,WAArB;AACA,cAAM,SAAS,GAAG,YAAY,IAAI,YAAY,CAAC,CAAD,CAA9C;AACA,cAAM,QAAQ,GAAG,SAAS,IAAI,SAAS,CAAC,QAAxC;;AACA,cAAI,QAAJ,EAAc;AAEV,YAAA,QAAQ,CAAC,OAAT,CAAiB,UAAA,CAAC,EAAI;AAClB,kBAAM,OAAO,GAAG,CAAC,CAAC,gBAAlB;;AACA,kBAAI,CAAC,OAAD,IAAY,OAAO,CAAC,GAAR,KAAgB,KAAhC,EAAsC;AAClC;AACH;;AAED,kBAAM,KAAK,GAAG,OAAO,CAAC,SAAtB;AACA,kBAAM,IAAI,GAAG,OAAO,CAAC,QAAR,CAAiB,CAAjB,CAAb;AACA,kBAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,QAAL,CAAc,CAAd,CAAR,IAA4B,IAAI,CAAC,QAAL,CAAc,CAAd,EAAiB,IAA1D;AACA,kBAAM,EAAE,GAAG,KAAK,CAAC,KAAjB;;AAEA,cAAA,KAAI,CAAC,OAAL,CAAa,IAAb,CAAkB;AAAC,gBAAA,EAAE,EAAF,EAAD;AAAK,gBAAA,IAAI,EAAJ;AAAL,eAAlB;AACH,aAZD;AAaH;AACJ,SApCY;AAqCb,QAAA,OAAO,EAAE;AACL,UAAA,MAAM,EAAE,gBAAS,CAAT,EAAY;AAChB,iBAAK,SAAL,CAAe,CAAC,CAAC,MAAF,CAAS,KAAxB;AACH;AAHI;AArCI,OADT;AA4CR,MAAA,aAAa,EAAE;AACX,QAAA,IAAI,EAAE,gBADK;AAEX,QAAA,KAAK,EAAE,CAAC,UAAD,CAFI;AAGX,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,OAAO,EAAE,EADN;AAEH,YAAA,UAAU,EAAE;AAFT,WAAP;AAIH,SARU;AASX,QAAA,KAAK,EAAE;AACH,qBAAW,mBAAW;AAClB,iBAAK,UAAL,GAAkB,KAAK,OAAL,CAAa,GAAb,CAAiB,UAAC,IAAD,EAAU;AACzC,+BAAU,IAAI,CAAC,IAAf;AACH,aAFiB,EAEf,IAFe,MAAlB;AAGH;AALE,SATI;AAgBX,QAAA,UAAU,EAAE;AACR,UAAA,WAAW,EAAE;AACT,YAAA,IAAI,EAAE,cADG;AAET;AACA,YAAA,KAAK,EAAE,CAAC,SAAD,EAAY,UAAZ,CAHE;AAIT,YAAA,IAAI,EAAE,gBAAW;AACb,kBAAM,IAAI,GAAG;AACT,gBAAA,EAAE,EAAE,IADK;AAET,gBAAA,SAAS,EAAE,IAFF;AAGT,gBAAA,YAAY,EAAE,KAHL;AAIT,gBAAA,IAAI,EAAE;AAJG,eAAb;AAOA,qBAAO,IAAP;AACH,aAbQ;AAcT,YAAA,KAAK,EAAE;AACH,cAAA,SAAS,EAAE,qBAAW;AAClB,oBAAI,KAAK,GAAG,KAAK,SAAL,GAAiB,KAAjB,GAAyB,QAArC;AACA,oBAAI,GAAG,GAAG,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAA4B,MAA5B,CAAV;AACA,oBAAI,IAAI,GAAG,KAAK,KAAL,CAAW,GAAX,CAAe,SAA1B;AAEA,oBAAI,GAAG,GAAG;AACN,wBAAM,KAAK,EADL;AAEN,yBAAO,GAFD;AAGN,0BAAQ;AAHF,iBAAV;;AAMA,qCAAS,KAAT,CAAe,gBAAf,EAAiC,KAAjC,EAAwC,GAAxC;AACH,eAbE;AAcH,mCAAqB,4BAAW;AAC5B,qBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,CAAgC,KAAK,EAArC,IAA2C,IAA3C,GAAkD,KAAtE;AACH;AAhBE,aAdE;AAgCT,YAAA,OAhCS,qBAgCC;AACN,mBAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAAtC;AACA,mBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,WAAmC,KAAK,EAAxC,KAAgD,IAAhD,GAAuD,KAA3E;AACH,aAnCQ;AAoCT,YAAA,OAAO,EAAE;AACL,cAAA,cADK,4BACY;AACb,kCAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,kBAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,kBAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,kBAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,iBAAhC;;AAKA,kCAAM,QAAN,CAAe,gBAAf;AACH;AARI;AApCA;AADL,SAhBD;AAiEX,QAAA,OAAO,EAAE;AACL,UAAA,aADK,2BACW;AACZ,YAAA,OAAO,CAAC,GAAR,CAAY,iBAAZ;AACH;AAHI,SAjEE;AAsEX,QAAA,OAtEW,qBAsED;AAAA;;AACN,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,KAAD,EAAQ,KAAR,EAAkB;AAC7C,gBAAK,KAAK,IAAI,KAAd,EAAqB;AACjB,cAAA,MAAI,CAAC,OAAL,CAAa,IAAb,CAAkB,KAAlB;AACH,aAFD,MAEO;AACH,kBAAI,KAAK,GAAG,MAAI,CAAC,OAAL,CAAa,IAAb,CAAkB,UAAC,IAAD,EAAU;AACpC,uBAAO,IAAI,CAAC,EAAL,IAAW,KAAK,CAAC,EAAxB;AACH,eAFW,CAAZ;;AAIA,kBAAI,KAAK,GAAG,MAAI,CAAC,OAAL,CAAa,GAAb,CAAiB,UAAC,IAAD,EAAU;AACnC,uBAAO,IAAI,CAAC,EAAZ;AACH,eAFW,EAET,OAFS,CAED,KAAK,CAAC,EAFL,CAAZ;;AAGA,kBAAI,KAAJ,EAAW;AACP,gBAAA,MAAI,CAAC,OAAL,CAAa,MAAb,CAAoB,MAAI,CAAC,OAAL,CAAa,OAAb,CAAqB,KAArB,CAApB,EAAiD,CAAjD;AACH;AAEJ;AACJ,WAhBD;AAiBH;AAxFU,OA5CP;AAsIR,MAAA,OAAO,EAAE;AACL,QAAA,IAAI,EAAE,UADD;AAEL,QAAA,KAAK,EAAE,CAAC,UAAD,CAFF;AAGL,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,EAAE,EAAE,IADD;AAEH,YAAA,YAAY,EAAE,KAFX;AAGH,YAAA,IAAI,EAAE,YAHH;AAIH,YAAA,MAAM,EAAE,IAJL;AAIW;AACd,YAAA,UAAU,EAAE,IALT;AAMH,YAAA,WAAW,EAAE,IANV;AAMe;AAClB,YAAA,WAAW,EAAE;AAPV,WAAP;AASH,SAbI;AAcL,QAAA,UAAU,EAAE,EAdP;AAiBL,QAAA,KAAK,EAAE;AACH,gCAAsB,6BAAW;AAC7B,iBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,SAAd,CAAwB,QAAxB,CAAiC,KAAK,EAAtC,IAA4C,IAA5C,GAAmD,KAAvE;AACH,WAHE;AAIH,oBAAU,kBAAW;AACjB,gBAAI,KAAK,MAAT,EAAiB;AACb,mBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AARE,SAjBF;AA2BL,QAAA,OAAO,EAAE;AACL,UAAA,YADK,0BACU;AACX,iBAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,WAHI;AAIL,UAAA,cAJK,4BAIY;AACb,8BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,cAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,cAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,cAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,aAAhC;;AAKA,8BAAM,QAAN,CAAe,gBAAf;AACH,WAXI;AAYL,UAAA,UAZK,wBAYQ;AACT,gBAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,kBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,mBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,kBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,kBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,mBAAK,WAAL,GAAmB,WAAnB;AACA,mBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC,SAA2D,WAAW,IAAI,EAAf,GAAoB,EAApB,GAAyB,GAApF;AACH;AACJ;AAvBI,SA3BJ;AAoDL,QAAA,OApDK,qBAoDK;AACN,eAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,eAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,SAAd,CAAwB,QAAxB,WAAoC,KAAK,EAAzC,KAAiD,IAAjD,GAAwD,KAA5E;AACA,eAAK,UAAL;AACH;AAxDI,OAtID;AAgMR,MAAA,YAAY,EAAE;AACV,QAAA,IAAI,EAAE,gBADI;AAEV,QAAA,KAAK,EAAE,CAAC,UAAD,CAFG;AAGV,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,EAAE,EAAE,IADD;AAEH,YAAA,YAAY,EAAE,KAFX;AAGH,YAAA,IAAI,EAAE,iBAHH;AAIH,YAAA,MAAM,EAAE,IAJL;AAIW;AACd,YAAA,UAAU,EAAE,IALT;AAMH,YAAA,WAAW,EAAE,IANV;AAMe;AAClB,YAAA,WAAW,EAAE;AAPV,WAAP;AASH,SAbS;AAcV,QAAA,UAAU,EAAE,EAdF;AAiBV,QAAA,KAAK,EAAE;AACH,qCAA2B,kCAAW;AAClC,iBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,cAAd,CAA6B,QAA7B,CAAsC,KAAK,EAA3C,IAAiD,IAAjD,GAAwD,KAA5E;AACH,WAHE;AAIH,oBAAU,kBAAW;AACjB,gBAAI,KAAK,MAAT,EAAiB;AACb,mBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AARE,SAjBG;AA2BV,QAAA,OAAO,EAAE;AACL,UAAA,YADK,0BACU;AACX,iBAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,WAHI;AAIL,UAAA,cAJK,4BAIY;AACb,8BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,cAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,cAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,cAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,aAAhC;;AAKA,8BAAM,QAAN,CAAe,gBAAf;AACH,WAXI;AAYL,UAAA,UAZK,wBAYQ;AACT,gBAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,kBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,mBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,kBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,kBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,mBAAK,WAAL,GAAmB,WAAnB;AACA,mBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC;AACH;AACJ;AAvBI,SA3BC;AAoDV,QAAA,OApDU,qBAoDA;AACN,eAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,eAAtC;AACA,eAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,cAAd,CAA6B,QAA7B,WAAyC,KAAK,EAA9C,KAAsD,IAAtD,GAA6D,KAAjF;AACA,eAAK,UAAL;AACH;AAxDS,OAhMN;AA0PR,MAAA,YAAY,EAAE;AACV,QAAA,IAAI,EAAE,eADI;AAEV,QAAA,KAAK,EAAE,CAAC,UAAD,CAFG;AAGV,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,EAAE,EAAE,IADD;AAEH,YAAA,YAAY,EAAE,KAFX;AAGH,YAAA,IAAI,EAAE;AAHH,WAAP;AAKH,SATS;AAUV,QAAA,UAAU,EAAE,EAVF;AAaV,QAAA,KAAK,EAAE;AACH,+BAAqB,4BAAW;AAC5B,iBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,CAAgC,KAAK,EAArC,IAA2C,IAA3C,GAAkD,KAAtE;AACH;AAHE,SAbG;AAkBV,QAAA,OAAO,EAAE;AACL,UAAA,cADK,4BACY;AACb,8BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,cAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,cAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,cAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,aAAhC;;AAKA,8BAAM,QAAN,CAAe,gBAAf;AACH,WARI;AASL,UAAA,WATK,yBASS;AACV,gBAAI,YAAY,GAAG,KAAK,KAAL,CAAW,YAAX,CAAwB,SAA3C;AACA,iBAAK,MAAL,CAAY,IAAZ,CACI,0BAAkB,QAAlB,CAA2B,YAA3B,CADJ,EAEI,0BAAkB,IAFtB,EAGI,0BAAkB,OAHtB;AAKH;AAhBI,SAlBC;AAoCV,QAAA,OApCU,qBAoCA;AACN,eAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,eAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,WAAmC,KAAK,EAAxC,KAAgD,IAAhD,GAAuD,KAA3E;AACH;AAvCS,OA1PN;AAmSR,MAAA,WAAW,EAAE;AACT,QAAA,IAAI,EAAE,cADG;AAET,QAAA,KAAK,EAAE,CAAC,UAAD,CAFE;AAGT,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,EAAE,EAAE,IADD;AAEH,YAAA,YAAY,EAAE,KAFX;AAGH,YAAA,IAAI,EAAE;AAHH,WAAP;AAKH,SATQ;AAUT,QAAA,UAAU,EAAE,EAVH;AAaT,QAAA,KAAK,EAAE;AACH,+BAAqB,4BAAW;AAC5B,iBAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,CAAgC,KAAK,EAArC,IAA2C,IAA3C,GAAkD,KAAtE;AACH;AAHE,SAbE;AAkBT,QAAA,OAAO,EAAE;AACL,UAAA,cADK,4BACY;AACb,8BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,cAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,cAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,cAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,aAAhC;;AAKA,8BAAM,QAAN,CAAe,gBAAf;AACH;AARI,SAlBA;AA4BT,QAAA,OA5BS,qBA4BC;AACN,eAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAAtC;AACA,eAAK,YAAL,GAAoB,KAAK,QAAL,CAAc,QAAd,CAAuB,QAAvB,WAAmC,KAAK,EAAxC,KAAgD,IAAhD,GAAuD,KAA3E;AACH;AA/BQ;AAnSL,KA5DX;AAkYD,IAAA,QAAQ,EAAE;AACN,MAAA,QAAQ,EAAE;AADJ,KAlYT;AAqYD,IAAA,UAAU,EAAE;AACR,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAP;AACH;AAHK;AADF,KArYX;AA4YD,IAAA,iBAAiB,EAAE;AACf,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAP;AACH;AAHK;AADK,KA5YlB;AAmZD,IAAA,YAAY,EAAE;AACV,MAAA,QAAQ,EAAE;AADA;AAnZb,GAAL,CADQ;AAF4B,CAA5C,E,CA8ZA;AACA;;;;;AClbA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;;;AAKA,4BAAgB,SAAhB,CAA0B,eAA1B,EAA2C;AACvC,EAAA,MAAM,EAAE,eAD+B;AAEvC,EAAA,UAAU,EAAE,CACR,yBAAQ;AACJ,IAAA,IAAI,EAAE,gBAAU;AACZ,UAAM,IAAI,GAAG;AACT,QAAA,IAAI,EAAE;AACF,UAAA,SAAS,EAAE,IADT;AAEF,UAAA,WAAW,EAAE,IAFX;AAGF,UAAA,OAAO,EAAE,EAHP;AAIF,UAAA,KAAK,EAAE;AAJL;AADG,OAAb;AASA,aAAO,IAAP;AACH,KAZG;AAaJ,IAAA,QAAQ,EAAE;AACN,MAAA,QAAQ,EAAE,oBAAW;AACjB,eAAO,kBAAM,KAAN,CAAY,WAAnB;AACH,OAHK;AAIN,MAAA,iBAAiB,EAAE,6BAAW;AAC1B,eAAO,IAAI,CAAC,SAAL,CAAe;AAClB,kBAAQ,UADU;AAElB,sBAAY,UAFM;AAGlB,oBAAU,KAAK,MAAL,CAAY,MAHJ;AAIlB,mBAAS;AAJS,SAAf,CAAP;AAMH,OAXK;AAYN,MAAA,qBAAqB,EAAE,iCAAW;AAC9B,eAAO,IAAI,CAAC,SAAL,CAAe;AAClB,kBAAQ,UADU;AAElB,sBAAY,UAFM;AAGlB,oBAAU,KAAK,MAAL,CAAY,UAHJ;AAIlB,mBAAS;AAJS,SAAf,CAAP;AAMH,OAnBK;AAoBN,MAAA,sBAAsB,EAAE,kCAAW;AAC/B,eAAO,IAAI,CAAC,SAAL,CAAe;AAClB,kBAAQ,UADU;AAElB,sBAAY,UAFM;AAGlB,oBAAU,KAAK,MAAL,CAAY,WAHJ;AAIlB,mBAAS;AAJS,SAAf,CAAP;AAMH;AA3BK,KAbN;AA2CJ,IAAA,KAAK,EAAE;AACH,kBAAY,oBAAW;AACnB,aAAK,MAAL,CAAY,IAAZ,GAAmB,KAAK,QAAxB;AACH;AAHE,KA3CH;AAgDJ,IAAA,OAAO,EAAE;AACL,MAAA,QAAQ,EAAE,kBAAS,CAAT,EAAW;AACjB,YAAM,KAAK,GAAG,IAAd;;AAEA,aAAK,KAAL,CAAW,UAAS,QAAT,EAAkB;AACzB,cAAI,QAAQ,GAAI,EAAhB;AACA,cAAI,WAAW,GAAG,KAAlB;;AAFyB,qBAGI,QAAQ,CAAC,IAAT,IAAiB,EAHrB;AAAA,cAGjB,OAHiB,QAGjB,OAHiB;AAAA,cAGL,IAHK;;AAKzB,cAAI,CAAC,OAAL,EAAc;AACV,mBAAO,KAAP;AACH;;AAED,cAAI,KAAK,CAAC,IAAN,IAAc,KAAK,CAAC,IAAN,CAAW,OAA7B,EAAsC;AAClC,YAAA,QAAQ,GAAG,KAAK,CAAC,IAAN,CAAW,OAAtB;AACA,YAAA,WAAW,GAAG,KAAK,CAAC,IAAN,CAAW,WAAzB;AACH;;AAED,UAAA,KAAK,CAAC,IAAN,qBACO,IADP;AAEI,YAAA,OAAO,+BACA,QADA,sBAEA,OAFA,EAFX;AAMI,YAAA,WAAW,EAAX,WANJ;AAOI,YAAA,aAAa,EAAE,IAAI,CAAC,WAAL,GAAmB,IAAI,CAAC;AAP3C;AASH,SAvBD,EAuBG;AACC,UAAA,MAAM,oBACC,KAAK,MADN;AAEF,YAAA,IAAI,EAAG,KAAK,IAAL,IAAa,KAAK,IAAL,CAAU,QAAxB,IAAqC,CAFzC;AAGF,YAAA,QAAQ,EAAE;AAHR;AADP,SAvBH;AA8BH;AAlCI,KAhDL;AAoFJ,IAAA,UAAU,EAAE;AACR,gCAA2B;AACvB,QAAA,KAAK,EAAE,CAAC,MAAD,EAAS,QAAT,CADgB;AAEvB,QAAA,QAAQ,EAAE;AAFa,OADnB;AAKR,8BAAyB;AACrB,QAAA,KAAK,EAAE,CAAC,MAAD,CADc;AAErB,QAAA,QAAQ,EAAE;AAFW;AALjB;AApFR,GAAR,CADQ;AAF2B,CAA3C;;;;;ACTA;;AACA;;AACA;;AAGA;;AACA;;AACA;;AACA;;;;AAEA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,4BAAgB,SAAhB,CAA0B,gBAA1B,EAA4C;AACxC,EAAA,MAAM,EAAE,gBADgC;AAExC,EAAA,UAAU,EAAE,CACR,sBAAK;AACD,IAAA,IAAI,EAAE,gBAAW;AACb,aAAO;AACH,QAAA,QAAQ,EAAE,IADP;AAEH,QAAA,KAAK,EAAE;AAFJ,OAAP;AAIH,KANA;AAOD,IAAA,KAAK,EAAE;AACH,MAAA,QAAQ,EAAE,oBAAW;AACjB,YAAI,CAAC,KAAK,QAAV,EAAoB;AAChB,eAAK,MAAL,CAAY,IAAZ,CAAiB,cAAjB;AACH;AACJ;AALE,KAPN;AAcD,IAAA,OAAO,EAAE;AACL,MAAA,SAAS,EAAE,mBAAS,EAAT,EAAY;AAAA;;AACnB,YAAI,KAAK,UAAL,IAAmB,EAAvB,EAA2B;AACvB,eAAK,UAAL,GAAkB,EAAlB;AACA,eAAK,SAAL,CAAe,YAAM;AACjB,YAAA,KAAI,CAAC,WAAL;AACH,WAFD;AAGH,SALD,MAKO;AACH;AACA,cAAG,KAAK,QAAR,EAAkB;AACd,iBAAK,UAAL,GAAkB,IAAlB;AACH;AACJ;AACJ,OAbI;AAcL,MAAA,SAdK,uBAcO;AACR,YAAM,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,0CAAvB,EAAmE,SAAnE,CAA6E,IAA7E,CAAb;AACA,QAAA,OAAO,CAAC,GAAR,CAAY,0BAAkB,IAA9B;AACA,aAAK,MAAL,CAAY,IAAZ,CACI,0BAAkB,QADtB,EAEI,0BAAkB,IAFtB,EAGI,0BAAkB,OAHtB,EAII,0BAAkB,MAAlB,CAAyB,IAAzB,CAJJ;AAMH,OAvBI;AAwBL,MAAA,gBAAgB,EAAG,4BAAY;AAC3B,aAAK,MAAL,CAAY,IAAZ,CAAiB,cAAjB;AACH,OA1BI;AA2BL,MAAA,aA3BK,2BA2BW;AAAA;;AACZ;AACA;AACA,YAAI,GAAG,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAV;AACA,aAAK,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AAEA,QAAA,GAAG,CAAC,gBAAJ,CAAqB,QAArB,EAA8B,YAAM;AAChC,UAAA,MAAI,CAAC,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AACH,SAFD;AAGH,OApCI;AAqCL,MAAA,WArCK,yBAqCS;AACV,YAAI,EAAE,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,qCAAvB,CAAT;AACA,YAAI,SAAS,GAAG,EAAE,CAAC,SAAnB;AACA,YAAI,YAAY,GAAG,MAAM,CAAC,OAA1B,CAHU,CAIV;AACA;;AACA,YAAI,SAAS,GAAG,YAAhB,EAA8B;AAC1B,cAAI,MAAM,GAAG,EAAE,CAAC,qBAAH,GAA2B,GAA3B,GAAiC,MAAM,CAAC,OAArD;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAG,MAAM,GAAG,EADH;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKR,GALQ,CAAV;AAMH;AACJ;AApDI,KAdR;AAoED,IAAA,UAAU,EAAE;AACR,8BAAwB;AACpB,QAAA,IAAI,EAAE,sBADc;AAEpB,QAAA,QAAQ,EAAE,iCAFU;AAGpB,QAAA,KAAK,EAAE;AACH,UAAA,KAAK,EAAE,CAAC,MAAD,EAAS,MAAT,CADJ;AAEH,UAAA,UAAU,EAAE,CAAC,MAAD,EAAS,MAAT,CAFT;AAGH,UAAA,WAAW,EAAE;AAAC,YAAA,IAAI,EAAE,MAAP;AAAe,uBAAS;AAAxB,WAHV;AAIH,UAAA,KAAK,EAAE;AAJJ,SAHa;AASpB,QAAA,IAAI,EAAE,gBAAW;AACb,iBAAO;AACH,YAAA,KAAK,EAAE;AADJ,WAAP;AAGH,SAbmB;AAcpB,QAAA,QAAQ,EAAE;AACN,UAAA,WAAW,EAAE,uBAAW;AACpB,mBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,sBAAQ,OADU;AACD;AACjB,0BAAY,QAFM;AAEI;AACtB,wBAAU,MAHQ;AAGA;AAClB,uBAAS,KAAK,KAJI;AAIG;AACrB,oBAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAA3B,cAAwC,KAAK,KAA7C;AALY,aAAf,CAAP;AAOH;AATK,SAdU;AAyBpB,QAAA,OAzBoB,qBAyBV;AACN,eAAK,KAAL,GAAa,KAAK,CAAC,SAAN,CAAgB,KAAhB,CAAsB,IAAtB,CAA2B,QAAQ,CAAC,gBAAT,CAA0B,yBAA1B,CAA3B,EAAkF,KAAK,KAAL,GAAa,CAA/F,EAAmG,SAAhH;AACH;AA3BmB;AADhB,KApEX;AAmGD,IAAA,OAAO,EAAE;AACL,MAAA,KAAK,EAAE;AADF,KAnGR;AAsGD,IAAA,UAAU,EAAE;AACR,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,OADU;AACD;AACjB,wBAAY,QAFM;AAEI;AACtB,sBAAU,MAHQ;AAGA;AAClB,qBAAS,KAAK,KAJI;AAIG;AACrB,kBAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAA3B,cAAwC,KAAK,KAA7C;AALY,WAAf,CAAP;AAOH;AATK,OADF;AAYR,MAAA,OAZQ,qBAYE;AACN,aAAK,KAAL,GAAa,KAAK,GAAL,CAAS,SAAtB;AACH;AAdO,KAtGX;AAsHD,IAAA,cAAc,EAAE;AACZ,MAAA,KAAK,EAAE;AADK,KAtHf;AAyHD,IAAA,iBAAiB,EAAE;AACf,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,OADU;AACD;AACjB,wBAAY,QAFM;AAEI;AACtB,sBAAU,MAHQ;AAGA;AAClB,qBAAS,KAAK,KAJI;AAIG;AACrB,kBAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAA3B,cAAwC,KAAK,KAA7C;AALY,WAAf,CAAP;AAOH;AATK,OADK;AAYf,MAAA,OAZe,qBAYL;AACN,aAAK,KAAL,GAAa,KAAK,CAAC,SAAN,CAAgB,KAAhB,CAAsB,IAAtB,CAA2B,QAAQ,CAAC,gBAAT,CAA0B,yBAA1B,CAA3B,EAAkF,KAAK,KAAL,GAAa,CAA/F,EAAmG,SAAhH;AACH;AAdc,KAzHlB;AAyID,IAAA,OAzIC,qBAyIS;AACN,WAAK,aAAL;AACH;AA3IA,GAAL,CADQ;AAF4B,CAA5C;;;;;;;;;;ACZA;;AACA;;;;AAEA,IAAM,kBAAkB,GAAG,mBAAI,SAAJ,CAAc,aAAd,EAA6B;AACpD,EAAA,IAAI,EAAE,gBAAW;AACb,WAAO,EAAP;AAEH,GAJmD;AAKpD,EAAA,QAAQ,EAAE;AACN,IAAA,SAAS,EAAE,qBAAW;AAClB,aAAQ;AACJ,QAAA,IAAI,EAAE,kBAAM,KAAN,CAAY;AADd,OAAR;AAGH;AALK,GAL0C;AAYpD,EAAA,OAAO,EAAE;AACL,IAAA,YADK,0BACU;AAAA;;AACX,UAAI,MAAM,GAAG,KAAK,GAAlB;AACA,UAAI,GAAG,GAAG,KAAK,GAAL,CAAS,YAAT,CAAsB,KAAtB,CAAV;AAEA,MAAA,MAAM,CAAC,gBAAP,CAAwB,SAAxB,EAAmC,UAAC,KAAD,EAAW;AAC1C,YAAI,KAAK,CAAC,MAAN,IAAgB,8BAApB,EAAoD;AAChD,UAAA,KAAI,CAAC,SAAL,CAAe,YAAM;AACjB,YAAA,UAAU,CAAC,KAAD,CAAV;AACA,YAAA,QAAQ,CAAC,KAAD,CAAR;AACH,WAHD;AAIH;AACJ,OAPD;;AASA,UAAM,QAAQ,GAAG,SAAX,QAAW,CAAC,KAAD,EAAW;AACxB;AACA,YAAI,MAAM,CAAC,aAAX,EAA0B;AACtB,UAAA,MAAM,CAAC,aAAP,CAAqB,WAArB,CAAiC,IAAI,CAAC,SAAL,CAAe,KAAI,CAAC,SAApB,CAAjC,EAAiE,GAAjE;AACH,SAFD,MAEO;AACH,UAAA,MAAM,CAAC,MAAP,GAAgB,YAAW;AACvB,YAAA,MAAM,CAAC,aAAP,CAAqB,WAArB,CAAiC,IAAI,CAAC,SAAL,CAAe,KAAK,SAApB,CAAjC,EAAiE,GAAjE;AACH,WAFD;AAGH;AACJ,OATD;;AAWA,UAAM,UAAU,GAAG,SAAb,UAAa,CAAC,KAAD,EAAW;AAC1B,YAAI,IAAI,GAAG,IAAI,CAAC,KAAL,CAAW,KAAK,CAAC,IAAjB,CAAX,CAD0B,CAE1B;;AACA,YAAI,IAAI,CAAC,IAAT,EAAe;AACX,cAAK,GAAG,CAAC,QAAJ,CAAa,IAAI,CAAC,IAAlB,CAAL,EAA+B;AAC3B,YAAA,MAAM,CAAC,KAAP,CAAa,MAAb,aAAyB,IAAI,CAAC,OAAL,GAAe,EAAxC;;AACA,gBAAI,IAAI,CAAC,MAAT,EAAiB;AACb,cAAA,KAAI,CAAC,WAAL;AACH;AACJ;AACJ;AACJ,OAXD;AAaH,KAtCI;AAuCL,IAAA,WAvCK,yBAuCS;AACV,UAAI,MAAM,GAAG,KAAK,GAAlB;AACA,UAAI,SAAS,GAAG,MAAM,CAAC,SAAvB;AACA,UAAI,YAAY,GAAG,MAAM,CAAC,OAA1B;;AAEA,UAAI,SAAS,GAAG,YAAhB,EAA8B;AAC1B,YAAI,MAAM,GAAG,MAAM,CAAC,qBAAP,GAA+B,GAA/B,GAAqC,MAAM,CAAC,OAA5C,GAAsD,GAAnE;AACA,QAAA,UAAU,CAAC,YAAW;AAClB,UAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,YAAA,GAAG,EAAG,MAAM,GAAG,EADH;AAEZ,YAAA,QAAQ,EAAE;AAFE,WAAhB;AAIH,SALS,EAKR,GALQ,CAAV;AAMH;AACJ;AArDI,GAZ2C;AAmEpD,EAAA,OAnEoD,qBAmE1C;AACN,SAAK,YAAL;AACH;AArEmD,CAA7B,CAA3B;;;;AAwEA,IAAM,UAAU,GAAG,SAAb,UAAa,GAAM;AAErB,MAAI,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,cAA1B,CAAZ;;AAEA,MAAI,eAAe,GAAG,SAAlB,eAAkB,CAAC,EAAD,EAAQ;AAC1B,IAAA,kBAAkB;AAElB,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,yBAAkB,EAAlB;AADE,KAAR,EAEG,MAFH,wBAE0B,EAF1B,GAEgC,IAFhC;AAGH,GAND;;AAQA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,uBAAkC,KAAlC;AACA,MAAA,eAAe,CAAC,KAAD,CAAf;AACH,KAHD;AAIH;AAEJ,CAnBD;;;;;;;;;;;;AC3EA;;AACA;;AACA;;;;AAEA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,IAAM,OAAO,GAAG,SAAV,OAAU,GAAM;AAElB,MAAI,WAAW,GAAG,QAAQ,CAAC,gBAAT,CAA0B,UAA1B,CAAlB;;AAEA,MAAI,kBAAkB,GAAG,SAArB,kBAAqB,CAAC,EAAD,EAAQ;AAC7B,uBAAI,SAAJ,CAAc,SAAd,EAAyB;AACrB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACJ,UAAA,UAAU,EAAE;AADR,SAAP;AAGH,OALoB;AAMrB,MAAA,OAAO,EAAE;AACL,QAAA,YADK,0BACU;AACX,eAAK,MAAL,CAAY,IAAZ,CACI,qBAAa,QADjB,EAEI,qBAAa,IAFjB,EAGI,qBAAa,OAHjB,EAII,qBAAa,MAAb,CAAoB,KAAK,UAAzB,CAJJ;AAMH;AARI,OANY;AAgBrB,MAAA,OAhBqB,qBAgBX;AAAA;;AACR,aAAK,SAAL,CAAe,YAAM;AACnB,UAAA,KAAI,CAAC,UAAL,GAAkB,KAAI,CAAC,KAAL,CAAW,UAA7B;AACD,SAFD;AAGD;AApBoB,KAAzB;;AAuBA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,qBAAc,EAAd;AADE,KAAR,EAEG,MAFH,oBAEsB,EAFtB,GAE4B,IAF5B;AAGH,GA3BD;;AA6BA,MAAI,WAAW,CAAC,MAAZ,GAAqB,CAAzB,EAA4B;AACxB,IAAA,WAAW,CAAC,OAAZ,CAAoB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACjC,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,mBAA8B,KAA9B;AACA,MAAA,kBAAkB,CAAC,KAAD,CAAlB;AACH,KAHD;AAIH;AAEJ,CAxCD;;eA0Ce,O;;;;;;;;;;;AChDf;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,IAAM,cAAc,GAAG,SAAjB,cAAiB,GAAM;AAEzB,MAAI,OAAO,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,CAAd;;AAEA,MAAM,yBAAyB,GAAG,SAA5B,yBAA4B,CAAC,EAAD,EAAQ;AACtC,uBAAI,SAAJ,CAAc,0BAAd,EAA0C;AACtC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,WAAW,EAAE,CADX;AACc;AAChB,YAAA,UAAU,EAAE,IAFV;AAEgB;AAClB,YAAA,YAAY,EAAE,IAHZ;AAGkB;AACpB,YAAA,YAAY,EAAE,IAJZ;AAIkB;AACpB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAMuB;AACzB,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,QAAQ,EAAE,EARR;AASF,YAAA,OAAO,EAAE,EATP;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,SAAS,EAAE,EAXT;AAWa;AACf,YAAA,cAAc,EAAE,IAZd;AAYoB;AACtB,YAAA,aAAa,EAAE,IAbb;AAcF,YAAA,QAAQ,EAAE,IAdR;AAeF,YAAA,UAAU,EAAE,IAfV;AAgBF,YAAA,UAAU,EAAE,IAhBV;AAiBF;AACA,YAAA,SAAS,EAAE,IAlBT;AAkBe;AACjB,YAAA,QAAQ,EAAE,KAnBR;AAoBF,YAAA,YAAY,EAAE,IApBZ;AAqBF,YAAA,OAAO,EAAE,EArBP;AAsBF,YAAA,WAAW,EAAE,EAtBX;AAuBF,YAAA,KAAK,EAAE,iBAvBL;AAwBF,YAAA,gBAAgB,EAAE,IAxBhB;AAyBF,qBAAO;AAzBL;AADH,SAAP;AA8BH,OAhCqC;AAiCtC,MAAA,UAAU,EAAE;AACR,qCAA6B,2BADrB;AAER,2BAAmB,0CAFX;AAGR,yBAAiB,0BAHT;AAIR,sBAAc;AAJN,OAjC0B;AAuCtC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAtB,CAAgC,CAAhC,KAAsC,EAAtC,GAA2C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAtB,CAAgC,KAAhC,CAAsC,CAAtC,CAA3C,GAAsF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAnH;AACH,SANK;AAON,QAAA,YAAY,EAAE,wBAAW;AACrB,iBAAO,kBAAM,KAAN,CAAY,KAAnB;AACH,SATK;AAUN,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,IAAL,CAAU,YAAV,GAAyB,CAA7B,EAAgC;AAC5B,gBAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iCAAY,KAAK,IAAL,CAAU,YAAtB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAoD;AACvD,+BAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAnC,GAAkD,CAA5D,cAAiE,KAAK,IAAL,CAAU,YAA3E;AACH,aAFM,MAEA;AACH,+BAAW,KAAK,IAAL,CAAU,YAAV,IAA0B,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAlD,CAAD,GAAyD,CAAnE,cAAwE,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,WAA3G;AACH;AACJ,WARD,MAQO;AACH,mBAAO,KAAK,IAAL,CAAU,YAAjB;AACH;AACJ;AAtBK,OAvC4B;AA+DtC,MAAA,KAAK,EAAE;AACH,QAAA,YAAY,EAAE,wBAAW;AACrB,eAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,YAA9B,CADqB,CAErB;;AACA,eAAK,MAAL,GAHqB,CAIrB;AACH,SANE;AAOH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,KAA3B,CADc,CAGd;;AACA,cAAI,KAAK,KAAL,CAAW,MAAX,IAAqB,CAAzB,EAA4B;AACxB,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,gBAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SAnBE;AAoBH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AACH,SAvBE;AAwBH,wBAAgB,uBAAW;AACvB,eAAK,UAAL,GADuB,CACJ;AACnB;AAEA;;AACA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,mBAAO,IAAI,CAAC,IAAL,IAAa,eAApB;AACH,WAFe,CAAhB;AAGA,eAAK,IAAL,CAAU,aAAV,GAA0B,SAAS,GAAG,SAAS,CAAC,KAAb,GAAqB,IAAxD;AACH,SAjCE;AAkCH,4BAAoB,2BAAW;AAC3B,cAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACH,WAHD,MAGO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAmD;AACtD,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAHM,MAGA;AACH,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH;;AAED,eAAK,UAAL,GAZ2B,CAa3B;AACH,SAhDE;AAiDH,6BAAqB,4BAAW;AAC5B,eAAK,SAAL;AACH;AAnDE,OA/D+B;AAoHtC,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ;AACA,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB;AACA,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SAPI;AAQL,QAAA,aARK,yBAQS,EART,EAQa,CARb,EAQgB,IARhB,EAQsB;AACvB,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AACD,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAA9B;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,SAAvC;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CARuB,CAQI;;AAE3B,cAAI,OAAJ,EAAa;AACT,oBAAO,IAAP;AACI,mBAAK,iBAAL;AACI,oBAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AAC7C,yBAAO,CAAC,CAAC,IAAT;AACH,iBAFmB,CAApB,CADJ,CAII;;AACA,oBAAI,aAAa,CAAC,OAAd,CAAsB,iBAAtB,IAA2C,CAAC,CAAhD,EAAmD;AAC/C,sBAAI,KAAK,GAAG,aAAa,CAAC,OAAd,CAAsB,iBAAtB,CAAZ;AACA,uBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACA,uBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IACI;AAAC,6BAAS,KAAV;AACA,4BAAQ,IADR;AAEA,4BAAQ;AAFR,mBADJ;AAKH,iBARD,MAQO;AACH,uBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IACI;AAAC,6BAAS,KAAV;AACA,4BAAQ,IADR;AAEA,4BAAQ;AAFR,mBADJ;AAIH;;AACD;;AACJ,mBAAK,eAAL;AACI,qBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IACI;AAAC,2BAAS,OAAV;AACA,0BAAQ,IADR;AAEA,0BAAQ;AAFR,iBADJ;AAIA;;AACJ;AACI,qBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IACI;AAAC,2BAAS,KAAV;AACA,0BAAQ,IADR;AAEA,0BAAQ;AAFR,iBADJ;AA5BR;AAkCH,WAnCD,MAmCO;AACH,gBAAI,MAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ,CADG,CAIH;;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,MAAzB,EAA+B,CAA/B;AACH;;AACD,UAAA,OAAO,CAAC,GAAR,CAAY,oCAAZ,EAAkD,KAAK,IAAL,CAAU,OAA5D;AAEH,SA9DI;AA+DL,QAAA,iBA/DK,6BA+Da,KA/Db,EA+DoB;AACrB,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CADqB,CACM;AAC3B;AACA;;AACA,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,IAAT;AACH,WAFW,CAAZ;;AAGA,cAAI,KAAK,CAAC,OAAN,CAAc,KAAK,CAAC,IAApB,IAA4B,CAAC,CAAjC,EAAoC;AAChC,gBAAI,KAAK,GAAG,KAAK,CAAC,OAAN,CAAc,KAAK,CAAC,IAApB,CAAZ;;AAEA,gBAAI,KAAK,IAAL,CAAU,OAAV,CAAkB,KAAlB,EAAyB,KAAzB,IAAkC,KAAK,CAAC,KAAxC,IAAiD,KAAK,IAAL,CAAU,OAAV,CAAkB,KAAlB,EAAyB,IAAzB,IAAiC,KAAK,CAAC,IAA5F,EAAkG;AAC9F;AACA;AACH,aAHD,MAGO;AACH;AACA,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACA,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C,KAA3C;AACH;AAEJ,WAZD,MAYO;AACH,iBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C,KAA3C;AACH,WArBoB,CAsBrB;;AACH,SAtFI;AAuFL;AACA,QAAA,YAxFK,wBAwFQ,EAxFR,EAwFY,KAxFZ,EAwFmB,IAxFnB,EAwFyB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAE;AAAS;;AACvC,cAAI,KAAJ,EAAW;AACP,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ,WAPD,MAOO;AACH,gBAAI,OAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,IAAT;AACH,aAFW,EAET,OAFS,CAED,IAFC,CAAZ,CADG,CAIH;;;AACA,gBAAI,OAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,OAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SA1GI;AA2GL;AACA,QAAA,SA5GK,uBA4GO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFQ,CAEmB;AAC9B,SA/GI;AAiHL,QAAA,MAjHK,oBAiHI;AAAA;;AACL,cAAI,WAAW,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,QAApB,EAAlB;AACA,cAAI,UAAU,GAAG,KAAK,YAAtB;AAEA,cAAI,YAAY,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAChD,mBAAO,IAAI,CAAC,IAAL,IAAa,QAApB;AACH,WAFkB,EAEhB,GAFgB,CAEZ,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJkB,EAIhB,QAJgB,EAAnB;AAMA,cAAI,gBAAgB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACpD,mBAAO,IAAI,CAAC,IAAL,IAAa,iBAApB;AACH,WAFsB,EAEpB,GAFoB,CAEhB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJsB,EAIpB,QAJoB,EAAvB;AAKA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AAC7C,mBAAO,IAAI,CAAC,IAAL,IAAa,UAApB;AACH,WAFe,EAEb,GAFa,CAET,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJe,EAIb,QAJa,EAAhB;AAMA,cAAI,iBAAiB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACrD,mBAAO,IAAI,CAAC,IAAL,IAAa,aAApB;AACH,WAFuB,EAErB,GAFqB,CAEjB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJuB,EAIrB,QAJqB,EAAxB;AAMA,cAAI,iBAAiB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACrD,mBAAO,IAAI,CAAC,IAAL,IAAa,aAApB;AACH,WAFuB,EAErB,GAFqB,CAEjB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJuB,EAIrB,QAJqB,EAAxB;AAMA,cAAI,eAAe,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACnD,mBAAO,IAAI,CAAC,IAAL,IAAa,iBAApB;AACH,WAFqB,EAEnB,GAFmB,CAEf,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJqB,EAInB,QAJmB,EAAtB;;AAMA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,KAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,eAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,SAAS,CAAC,KAAjB;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,WAA3B;AAEA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,SAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAKA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,SAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAMA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAKA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAMA,cAAI,iBAAiB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACrD,mBAAO,IAAI,CAAC,IAAL,IAAa,aAApB;AACH,WAFuB,EAErB,GAFqB,CAEjB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJuB,EAIrB,QAJqB,EAAxB;AAKA,cAAI,iBAAiB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACrD,mBAAO,IAAI,CAAC,IAAL,IAAa,aAApB;AACH,WAFuB,EAErB,GAFqB,CAEjB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJuB,EAIrB,QAJqB,EAAxB;AAMA,cAAI,kBAAkB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACtD,mBAAO,IAAI,CAAC,IAAL,IAAa,cAApB;AACH,WAFwB,EAEtB,GAFsB,CAElB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJwB,EAItB,QAJsB,EAAzB;AAKA,cAAI,kBAAkB,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACtD,mBAAO,IAAI,CAAC,IAAL,IAAa,cAApB;AACH,WAFwB,EAEtB,GAFsB,CAElB,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,KAAZ;AACH,WAJwB,EAItB,QAJsB,EAAzB;AAKA,cAAI,aAAa,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,IAAI,EAAI;AACjD,mBAAO,IAAI,CAAC,IAAL,IAAa,cAAb,IAA+B,IAAI,CAAC,IAAL,IAAa,cAAnD;AACH,WAFmB,EAEjB,GAFiB,CAEb,UAAA,IAAI,EAAI;AACX,mBAAO,IAAI,CAAC,aAAZ;AACH,WAJmB,EAIjB,QAJiB,EAApB;AAMA,eAAK,IAAL,CAAU,SAAV,aAAyB,UAAU,KAAK,EAAf,GAAoB,YAAY,UAAhC,GAA6C,EAAtE,SAA2E,YAAY,KAAK,EAAjB,GAAsB,aAAa,YAAnC,GAAkD,EAA7H,SAAkI,gBAAgB,KAAK,EAArB,GAA0B,sBAAsB,gBAAhD,GAAmE,EAArM,SAA0M,iBAAiB,KAAK,EAAtB,GAA2B,kBAAkB,iBAA7C,GAAiE,EAA3Q,SAAgR,iBAAiB,KAAK,EAAtB,GAA2B,kBAAkB,iBAA7C,GAAiE,EAAjV,SAAsV,eAAe,KAAK,EAApB,GAAyB,sBAAsB,eAA/C,GAAiE,EAAvZ,4BAA2a,wBAAwB,EAAnc,SAAwc,SAAS,KAAK,EAAd,GAAmB,eAAe,SAAlC,GAA8C,EAAtf,mBAAigB,UAAjgB,EArGK,CAuGL;AACA;AACH,SA1NI;AA2NL,QAAA,UA3NK,wBA2NQ;AAAA;;AACT;AACA,eAAK,MAAL;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,oBAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CAJS,CAKT;AACA;;AAEA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,eAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,MAAM,GAAG,EAAb;AACA,cAAI,eAAe,GAAG,EAAtB;AACA,cAAI,WAAW,GAAG,EAAlB;AACA,cAAI,WAAW,GAAG,EAAlB;AACA,cAAI,QAAQ,GAAG,EAAf;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,oBAAO,IAAI,CAAC,IAAZ;AACI,mBAAK,QAAL;AACI,gBAAA,MAAM,CAAC,IAAP,CAAY,IAAI,CAAC,KAAjB;AACA;;AACJ,mBAAK,iBAAL;AACI,gBAAA,eAAe,CAAC,IAAhB,CAAqB,IAAI,CAAC,KAA1B;AACA;;AACJ,mBAAK,aAAL;AACI,gBAAA,WAAW,CAAC,IAAZ,CAAiB,IAAI,CAAC,KAAtB;AACA;;AACJ,mBAAK,aAAL;AACI,gBAAA,WAAW,CAAC,IAAZ,CAAiB,IAAI,CAAC,KAAtB;AACA;;AACJ,mBAAK,UAAL;AACI,gBAAA,QAAQ,CAAC,IAAT,CAAc,IAAI,CAAC,KAAnB;;AACJ;AACI;AAhBR;AAkBH,WAnBD;;AAqBA,cAAM,QAAQ,GAAG,SAAX,QAAW,CAAC,KAAD,EAAW;AACxB,gBAAI,MAAM,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAC,IAAD,EAAU;AAC1C,qBAAO,IAAI,CAAC,IAAL,KAAc,KAArB;AACH,aAFY,CAAb;;AAGA,mBAAO,MAAM,GAAG,MAAM,CAAC,KAAV,GAAkB,IAA/B;AACH,WALD;;AAOA,cAAM,gBAAgB,GAAG,SAAnB,gBAAmB,GAAM;AAC3B,gBAAI,MAAM,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAC,IAAD,EAAU;AAC1C,qBAAO,IAAI,CAAC,IAAL,KAAc,cAAd,IAAgC,IAAI,CAAC,IAAL,KAAc,cAArD;AACH,aAFY,CAAb;;AAGA,mBAAO,MAAM,GAAG,MAAM,CAAC,aAAV,GAA0B,IAAvC;AACH,WALD;;AAOA,cAAI,WAAW,GAAG;AACd;AACA,YAAA,KAAK,EAAE,KAAK,YAFE;AAGd,YAAA,MAAM,EAAE,MAAM,CAAC,IAAP,CAAY,GAAZ,KAAoB,EAApB,GAAyB,IAAzB,GAAgC,kBAAkB,CAAC,MAAM,CAAC,IAAP,CAAY,GAAZ,CAAD,CAH5C;AAId,YAAA,eAAe,EAAE,eAAe,CAAC,IAAhB,CAAqB,GAArB,KAA6B,EAA7B,GAAkC,IAAlC,GAAyC,kBAAkB,CAAC,eAAe,CAAC,IAAhB,CAAqB,GAArB,CAAD,CAJ9D;AAKd,YAAA,WAAW,EAAE,WAAW,CAAC,IAAZ,CAAiB,GAAjB,KAAyB,EAAzB,GAA8B,IAA9B,GAAqC,kBAAkB,CAAC,WAAW,CAAC,IAAZ,CAAiB,GAAjB,CAAD,CALtD;AAMd,YAAA,WAAW,EAAE,WAAW,CAAC,IAAZ,CAAiB,GAAjB,KAAyB,EAAzB,GAA8B,IAA9B,GAAqC,kBAAkB,CAAC,WAAW,CAAC,IAAZ,CAAiB,GAAjB,CAAD,CANtD;AAOd,YAAA,OAAO,EAAE,QAAQ,CAAC,SAAD,CAPH;AAQd,YAAA,OAAO,EAAE,QAAQ,CAAC,SAAD,CARH;AASd,YAAA,aAAa,EAAE,gBAAgB,EATjB;AAUd,YAAA,YAAY,EAAE,QAAQ,CAAC,cAAD,CAVR;AAWd,YAAA,YAAY,EAAE,QAAQ,CAAC,cAAD,CAXR;AAYd,YAAA,eAAe,EAAE,QAAQ,CAAC,iBAAD,CAAR,IAA+B,IAA/B,GAAsC,IAAtC,GAA6C,kBAAkB,CAAC,QAAQ,CAAC,iBAAD,CAAT,CAZlE;AAad,YAAA,cAAc,EAAE,QAAQ,CAAC,gBAAD,CAbV;AAcd,YAAA,cAAc,EAAE,QAAQ,CAAC,gBAAD,CAdV;AAed,YAAA,WAAW,EAAE,QAAQ,CAAC,aAAD,CAfP;AAgBd,YAAA,WAAW,EAAE,QAAQ,CAAC,aAAD,CAhBP;AAiBd,YAAA,aAAa,EAAE,wBAAwB,EAjBzB;AAkBd,YAAA,QAAQ,EAAE,QAAQ,CAAC,IAAT,CAAc,GAAd,KAAsB,EAAtB,GAA2B,IAA3B,GAAkC,kBAAkB,CAAC,QAAQ,CAAC,IAAT,CAAc,GAAd,CAAD,CAlBhD;AAmBd,YAAA,KAAK,EAAE,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,KAAiC,EAAjC,GAAsC,IAAtC,GAA6C,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,MAA9B,CAAqC,CAArC,KAA2C,GAA3C,GAAiD,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,KAA9B,CAAoC,CAApC,CAAjD,GAA0F,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAnBhI;AAoBd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU,WApBF;AAqBd,YAAA,QAAQ,EAAE;AArBI,WAAlB;AAwBA,UAAA,OAAO,CAAC,GAAR,CAAY,WAAZ;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACd,YAAA,MAAM,oBACC,WADD;AADQ,WAAlB,EAKK,IALL,CAKU,UAAS,QAAT,EAAmB;AACrB;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAd,GAA6B,QAAQ,CAAC,IAAT,CAAc,YAA3C,GAA0D,CAAnF;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,OAAd,GAAwB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAA9C,GAAuD,CAAhF;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,gBAAV,GAA6B,QAAQ,CAAC,IAAT,CAAc,gBAA3C,CALqB,CAMrB;AACH,WAZL,WAaW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAfL;AAgBH,SAnUI;AAoUL,QAAA,UApUK,sBAoUM,GApUN,EAoUW;AACZ,cAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA/C,EAAkD;AAC9C,iBAAK,IAAL,CAAU,WAAV;AACH,WAFD,MAEO,IAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAAzD,EAAqE;AACxE,iBAAK,IAAL,CAAU,WAAV;AACH,WAFM,MAEA;AACH;AACH;;AACD,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;AACH,SA7UI;AA8UL,QAAA,eA9UK,2BA8UW,IA9UX,EA8UiB;AAClB,cAAI,IAAI,GAAG,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,UAAA,IAAI,EAAI;AACxC,mBAAO,IAAI,CAAC,EAAL,IAAW,IAAI,CAAC,EAAvB;AACH,WAFU,CAAX;;AAIA,cAAI,CAAC,IAAL,EAAW;AACP,iBAAK,IAAL,CAAU,SAAV,gCAA0B,KAAK,IAAL,CAAU,SAApC,IAA+C,IAA/C;AACH,WAFD,MAEO;AACH,iBAAK,IAAL,CAAU,SAAV,CAAoB,MAApB,CAA2B,KAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,IAA5B,CAA3B,EAA6D,CAA7D;AACH;AACJ,SAxVI;AAyVL;AACA,QAAA,aA1VK,2BA0VW;AACZ,cAAI,GAAG,aAAM,MAAM,CAAC,QAAP,CAAgB,QAAtB,cAAkC,KAAK,IAAL,CAAU,SAA5C,CAAP;;AACA,cAAI,OAAO,CAAC,KAAR,IAAiB,IAAjB,IAAyB,OAAO,CAAC,KAAR,KAAkB,GAA/C,EAAoD;AAChD,YAAA,OAAO,CAAC,SAAR,CAAkB,GAAlB,EAAsB,EAAtB,EAAyB,GAAzB;AACH;AACJ,SA/VI;AAgWL;AACA,QAAA,QAjWK,sBAiWM;AAAA;;AACP,cAAI,MAAM,GAAG,MAAM,CAAC,QAAP,CAAgB,MAAhB,CAAuB,MAAvB,CAA8B,CAA9B,EAAiC,KAAjC,CAAuC,GAAvC,EAA4C,MAA5C,CAAmD,UAAA,IAAI,EAAI;AACpE,mBAAO,IAAI,IAAI,EAAf;AACH,WAFY,CAAb,CADO,CAIP;AACA;;AAEA,cAAI,WAAW,GAAG,EAAlB;AAEA,UAAA,MAAM,CAAC,OAAP,CAAe,UAAA,KAAK,EAAI;AACpB,gBAAI,IAAI,GAAG,KAAK,CAAC,KAAN,CAAY,CAAZ,EAAe,KAAK,CAAC,OAAN,CAAc,GAAd,CAAf,CAAX;AACA,gBAAI,OAAO,GAAG,KAAK,CAAC,KAAN,CAAY,KAAK,CAAC,OAAN,CAAc,GAAd,IAAqB,CAAjC,CAAd,CAFoB,CAGpB;AACA;;AAEA,gBAAI,KAAK,GAAG,EAAZ;;AACA,gBAAI,IAAI,IAAI,MAAZ,EAAoB;AAChB,cAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,QAAQ,CAAC,OAAD,CAAhC;AACH,aAFD,MAEO,IAAI,IAAI,IAAI,OAAZ,EAAqB;AACxB,cAAA,MAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,OAAzB;AACH,aAFM,MAEA,IAAI,IAAI,IAAI,eAAZ,EAA6B;AAChC,kBAAI,OAAO,IAAI,OAAX,IAAsB,OAAO,IAAI,KAArC,EAA4C;AACxC;AACH,eAFD,MAEO;AACH,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,MAAI,CAAC,IAAL,CAAU;AAHd,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;AACJ,aAfM,MAeA,IAAI,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAA5B,EAA+B;AAClC,kBAAI,YAAY,GAAG,OAAO,CAAC,KAAR,CAAc,GAAd,CAAnB;AACA,cAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,IAAI,EAAI;AACzB,gBAAA,KAAK,GAAG;AACJ,0BAAQ,IADJ;AAEJ,2BAAS,IAFL;AAGJ,0BAAQ,kBAAkB,CAAC,IAAD;AAHtB,iBAAR;AAMA,gBAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH,eAXD;AAYH,aAdM,MAcA;AACH,cAAA,KAAK,GAAG;AACJ,wBAAQ,IADJ;AAEJ,yBAAS,OAFL;AAGJ,wBAAQ,kBAAkB,CAAC,OAAD;AAHtB,eAAR;AAMA,cAAA,WAAW,gCACJ,WADI,IAEP,KAFO,EAAX;AAIH;;AAED,YAAA,MAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,WAApB,CArDoB,CAuDpB;AAEH,WAzDD;AA0DH,SApaI;AAqaL,QAAA,WAraK,yBAqaS;AACV,4BAAM,MAAN,CAAa,UAAb;AACH,SAvaI;AAwaL,QAAA,WAxaK,uBAwaO,EAxaP,EAwaW;AACZ,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AACrC,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,8BAAvB,EAAuD,qBAAvD,GAA+E,GAA/E,GAAqF,MAAM,CAAC,OAA5F,GAAsG,GAAhH,CAFY,CAGZ;;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAE,GADO;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKP,GALO,CAAV;AAMH,SAlbI;AAmbL,QAAA,SAnbK,uBAmbO;AACR;AACA;AACA;AACA;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,IAAI,CAAC,IAAL,CAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,CAAnC,CAAvB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA1B,GAA8B,IAA9B,GAAqC,KAA5D;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAApC,GAAiD,IAAjD,GAAwD,KAA/E;AACH,SA3bI;AA4bL,QAAA,IA5bK,kBA4bE;AAAA;;AACH;AACA,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAtB,CAAgC,CAAhC,KAAsC,EAAtC,GAA2C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAtB,CAAgC,KAAhC,CAAsC,CAAtC,CAA3C,GAAsF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAAlI;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,kBAAM,KAAN,CAAY,KAArC;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CALG,CAK2D;;AAC9D,eAAK,IAAL,CAAU,iBAAV,GAA8B,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,EAApC,GAAyC,KAAzC,GAAiD,IAA/E,CANG,CAMkF;;AACrF,eAAK,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,CAApC,GAAwC,IAAxC,GAA+C,KAApE,CAPG,CAOwE;;AAC3E,eAAK,IAAL,CAAU,OAAV,GAAoB,KAAK,KAAL,CAAW,WAAX,CAAuB,OAAvB,CAA+B,OAAnD;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,KAAL,CAAW,WAAX,CAAuB,OAAvB,CAA+B,WAAvD,CATG,CAWH;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,mBAAb,EAAkC,UAAC,KAAD,EAAW;AACzC,YAAA,MAAI,CAAC,iBAAL,CAAuB,KAAvB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,EAAD,EAAK,GAAL,EAAa;AACxC,gBAAI,EAAE,KAAK,MAAI,CAAC,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA;AACrC,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,GAAxB;AACH,WAHD;;AAIA,+BAAS,GAAT,CAAa,YAAb,EAA2B,UAAC,IAAD,EAAU;AACjC,YAAA,MAAI,CAAC,eAAL,CAAqB,IAArB;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,EAAjB;AACH,WAFD,EA5BG,CAgCH;;;AACA,cAAI,MAAM,CAAC,aAAX,EAA0B;AACtB,iBAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,MAAM,CAAC,aAA9B;AACH;;AACD,eAAK,IAAL,CAAU,OAAV,GAAoB,MAAM,CAAC,wBAAP,CAAgC,OAApD;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,wBAAP,GAAkC,MAAM,CAAC,wBAAP,CAAgC,YAAlE,GAAiF,CAA1G;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,wBAAP,CAAgC,OAAhC,GAA0C,MAAM,CAAC,wBAAP,CAAgC,OAAhC,CAAwC,MAAlF,GAA2F,CAApH;AACA,eAAK,IAAL,CAAU,gBAAV,GAA6B,MAAM,CAAC,wBAAP,GAAkC,MAAM,CAAC,wBAAP,CAAgC,gBAAlE,GAAqF,IAAlH,CAvCG,CAyCH;AACA;AACA;AACA;AAEA;AACA;AACA;AACH;AA7eI,OApH6B;AAmmBtC,MAAA,OAnmBsC,qBAmmB5B;AACN,aAAK,IAAL;AACA,aAAK,SAAL,GAFM,CAGN;AACA;AACA;AACA;AACA;AACA;AACH;AA5mBqC,KAA1C,EADsC,CAgnBtC;;;AACA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,MAAD,CAD2B;AAElC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OANiC;AAOlC,MAAA,QAAQ,uQAP0B;AAYlC,MAAA,OAAO,EAAE,EAZyB;AAelC,MAAA,OAfkC,qBAexB,CAET;AAjBiC,KAAtC,EAjnBsC,CAqoBtC;;;AACA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,OAApB,CAD2B;AAElC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,KADR;AAEH,UAAA,YAAY,EAAE,KAFX;AAGH,UAAA,EAAE,EAAE,KAAK,OAAL,CAAa,EAAb,IAAmB;AAHpB,SAAP;AAKH,OARiC;AASlC,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,SAA7B;AACH,SAHK;AAIN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,OADU;AAElB,wBAAY,cAFM;AAGlB,2BAAe,KAAK,OAAL,CAAa,KAHV;AAIlB,qBAAS,KAAK,OAAL,CAAa,WAAb,GAA2B,KAAK,OAAL,CAAa,WAAb,CAAyB,OAAzB,CAAiC,KAAjC,EAAwC,EAAxC,EAA4C,OAA5C,CAAoD,MAApD,EAA2D,EAA3D,CAA3B,GAA4F,IAJnF;AAKlB,kBAAM,KAAK,KAAL,GAAa,EAAb,cAAsB,KAAK,KAAL,GAAa,CAAnC,IAAyC,CAAC,KAAK,KAAL,GAAa,CAAd,EAAiB,QAAjB;AAL7B,WAAf,CAAP;AAOH;AAZK,OATwB;AAuBlC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,mBAAW,mBAAW;AAClB,eAAK,EAAL,GAAU,KAAK,OAAL,CAAa,EAAb,IAAmB,IAA7B;AACA,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH;AAPE,OAvB2B;AAgClC,MAAA,QAAQ,ooFAhC0B;AAqElC,MAAA,OAAO,EAAE;AACL,QAAA,cADK,4BACY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,WAFsB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH;AARI,OArEyB;AA+ElC,MAAA,OA/EkC,qBA+ExB;AACN;AACA;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH;AAnFiC,KAAtC;;AAsFA,uBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,MAAA,KAAK,EAAE,CAAC,MAAD,CADiB;AAExB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAE,IADL;AAEH,UAAA,SAAS,EAAE;AAFR,SAAP;AAIH,OAPuB;AAQxB,MAAA,KAAK,EAAE;AACH,0BAAkB,yBAAW;AACzB,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,IAAL,CAAU,SAAV,CAAoB,OAApB,CAA4B,UAAA,IAAI,EAAI;AAChC,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,eAAiD,IAAI,CAAC,GAAtD,WAAN;AACH,WAFD;AAGA,eAAK,MAAL,GAAc,MAAd;AACH;AAPE,OARiB;AAiBxB,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,cAAI,MAAM,GAAG,yDAAb;AACA,eAAK,IAAL,CAAU,OAAV,CAAkB,OAAlB,CAA0B,UAAA,IAAI,EAAI;AAC9B,YAAA,MAAM,aAAM,MAAN,SAAe,kBAAkB,CAAC,IAAI,CAAC,IAAN,CAAjC,eAAiD,IAAI,CAAC,GAAtD,WAAN;AACH,WAFD;AAGA,eAAK,SAAL,GAAiB,MAAjB;AACH;AAPI,OAjBe;AA0BxB,MAAA,OA1BwB,qBA0Bd;AACN,YAAI,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,CAAxC,EAA2C;AACvC,eAAK,QAAL;AACH;AACJ;AA9BuB,KAA5B;;AAiCA,uBAAI,SAAJ,CAAc,SAAd,EAAyB;AACrB,MAAA,KAAK,EAAE,CAAC,MAAD,CADc;AAErB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,IADP;AACa;AAChB,UAAA,aAAa,EAAE,IAFZ;AAEkB;AACrB,UAAA,aAAa,EAAE,IAHZ;AAGkB;AACrB,UAAA,QAAQ,EAAE,IAJP;AAIa;AAChB,UAAA,aAAa,EAAE,IALZ;AAKkB;AACrB,UAAA,aAAa,EAAE,IANZ;AAMkB;AAErB,UAAA,KAAK,EAAE,IARJ;AASH,UAAA,KAAK,EAAE,IATJ;AAUH,UAAA,MAAM,EAAE,IAVL;AAWH,UAAA,SAAS,EAAE,IAXR;AAYH,UAAA,SAAS,EAAE,IAZR;AAaH,UAAA,UAAU,EAAE,IAbT;AAeH,UAAA,UAAU,EAAE,IAfT;AAgBH,UAAA,UAAU,EAAE,IAhBT;AAiBH,UAAA,WAAW,EAAE,IAjBV;AAkBH,UAAA,MAAM,EAAE,IAlBL;AAoBH,UAAA,IAAI,EAAE,IApBH;AAqBH,UAAA,WAAW,EAAE,IArBV;AAsBH,UAAA,KAAK,EAAE;AAtBJ,SAAP;AAwBH,OA3BoB;AA4BrB,MAAA,KAAK,EAAE;AACH,wBAAgB,uBAAW;AACvB,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,IAAT;AACH,WAFW,CAAZ;;AAGA,cAAI,EAAE,KAAK,CAAC,OAAN,WAAiB,KAAK,IAAtB,YAAmC,CAAC,CAAtC,CAAJ,EAA8C;AAC1C,iBAAK,QAAL,GAAgB,IAAhB;AACH;;AACD,cAAI,EAAE,KAAK,CAAC,OAAN,WAAiB,KAAK,IAAtB,YAAmC,CAAC,CAAtC,CAAJ,EAA8C;AAC1C,iBAAK,QAAL,GAAgB,IAAhB;AACH;AACJ,SAXE;AAYH,6BAAqB,4BAAW;AAC5B,eAAK,gBAAL;AACA,eAAK,aAAL,GAF4B,CAG5B;;AACA,eAAK,QAAL,GAAgB,IAAhB;AACA,eAAK,QAAL,GAAgB,IAAhB;AACA,eAAK,aAAL,GAAqB,KAAK,UAA1B;AACA,eAAK,aAAL,GAAqB,KAAK,UAA1B,CAP4B,CAS5B;;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;AACH,SAxBE;AAyBH,oBAAY,oBAAW;AACnB;AACA;AACA,cAAI,KAAK,QAAL,IAAiB,KAAK,UAAtB,IAAoC,KAAK,QAAL,IAAiB,EAAzD,EAA6D;AACzD,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;AACH,WAHD,MAGO,IAAI,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAAtC,IAA2D,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAArG,EAAwH;AAC3H;AACA,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;AACH;;AAED,eAAK,aAAL,CAAmB,KAAnB;AACA,eAAK,aAAL,GAAqB,KAAK,QAAL,IAAiB,IAAjB,GAAwB,KAAK,UAA7B,GAA0C,KAAK,QAApE;AACA,eAAK,aAAL,GAAqB,KAAK,QAA1B;AAEH,SAzCE;AA0CH,oBAAY,oBAAW;AACnB;AACA;AACA,cAAI,KAAK,QAAL,IAAiB,KAAK,UAAtB,IAAoC,KAAK,QAAL,IAAiB,EAAzD,EAA6D;AACzD,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;AACH,WAHD,MAGO,IAAI,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAAtC,IAA2D,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAArG,EAAwH;AAC3H;AACA,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,YAA0D,KAAK,IAA/D;AACH;;AAED,eAAK,aAAL,CAAmB,KAAnB;AACA,eAAK,aAAL,GAAqB,KAAK,QAAL,IAAiB,IAAjB,GAAwB,KAAK,UAA7B,GAA0C,KAAK,QAApE;AACA,eAAK,aAAL,GAAqB,KAAK,QAA1B;AACH,SAzDE;AA0DH,yBAAiB,yBAAW;AACxB;AACA,cAAI,UAAU,CAAC,KAAK,aAAN,CAAV,IAAkC,UAAU,CAAC,KAAK,aAAN,CAAhD,EAAsE;AAClE,iBAAK,aAAL,GAAqB,CAAC,UAAU,CAAC,KAAK,aAAN,CAAV,GAAiC,UAAU,CAAC,KAAK,WAAN,CAA5C,EAAgE,QAAhE,EAArB;AACH;;AAED,eAAK,aAAL,GAAqB,KAAK,aAAL,IAAsB,KAAK,UAA3B,GAAwC,IAAxC,GAA+C,KAAK,aAAzE;AACA,eAAK,UAAL;AAEH,SAnEE;AAoEH,yBAAiB,yBAAW;AACxB;AACA,cAAI,UAAU,CAAC,KAAK,aAAN,CAAV,IAAkC,UAAU,CAAC,KAAK,aAAN,CAAhD,EAAsE;AAClE,iBAAK,aAAL,GAAqB,CAAC,UAAU,CAAC,KAAK,aAAN,CAAV,GAAiC,UAAU,CAAC,KAAK,WAAN,CAA5C,EAAgE,QAAhE,EAArB;AACH;;AAED,eAAK,aAAL,GAAqB,KAAK,aAAL,IAAsB,KAAK,UAA3B,GAAwC,IAAxC,GAA+C,KAAK,aAAzE;AACA,eAAK,UAAL;AACH;AA5EE,OA5Bc;AA0GrB,MAAA,OAAO,EAAE;AACL,QAAA,aAAa,EAAE,oBAAS,UAAS,IAAT,EAAe;AACnC;AACA,cAAI,KAAK,GAAG;AACR,YAAA,IAAI,YAAK,IAAL,cAAa,KAAK,KAAlB,eAA4B,IAAI,IAAI,KAAR,GAAgB,KAAK,QAArB,GAAgC,KAAK,QAAjE,cAA6E,KAAK,WAAlF,CADI;AAER,YAAA,KAAK,EAAE,IAAI,IAAI,KAAR,GAAgB,KAAK,QAArB,GAAgC,KAAK,QAFpC;AAGR,YAAA,IAAI,YAAK,KAAK,IAAV,SAAiB,IAAjB;AAHI,WAAZ,CAFmC,CAOnC;;AACA,cAAI,KAAK,CAAC,KAAN,KAAgB,IAApB,EAA0B;AACtB,iCAAS,KAAT,CAAe,mBAAf,EAAoC,KAApC;AACH;AAEJ,SAZc,EAYZ,GAZY,CADV;AAcL,QAAA,WAAW,EAAE,oBAAS,UAAS,CAAT,EAAY,IAAZ,EAAkB;AAChC,cAAI,EAAE,GAAG,CAAC,CAAC,MAAX;AACA,cAAI,GAAG,GAAG,IAAI,IAAI,KAAR,GAAgB,EAAE,CAAC,KAAnB,GAA2B,KAAK,QAA1C;AACA,cAAI,GAAG,GAAG,IAAI,IAAI,KAAR,GAAgB,EAAE,CAAC,KAAnB,GAA2B,KAAK,QAA1C,CAHgC,CAIhC;;AACA,cAAI,IAAI,IAAI,KAAZ,EAAmB;AACf,gBAAI,UAAU,CAAC,GAAD,CAAV,IAAmB,UAAU,CAAC,GAAD,CAAjC,EAAwC;AACpC,cAAA,GAAG,GAAG,CAAC,UAAU,CAAC,GAAD,CAAV,GAAkB,UAAU,CAAC,KAAK,WAAN,CAA7B,EAAiD,QAAjD,EAAN;AACH;AACJ,WAJD,MAIO,IAAI,IAAI,IAAI,KAAZ,EAAmB;AACtB,gBAAI,UAAU,CAAC,GAAD,CAAV,IAAmB,UAAU,CAAC,GAAD,CAAjC,EAAwC;AACpC,cAAA,GAAG,GAAG,CAAC,UAAU,CAAC,GAAD,CAAV,GAAkB,UAAU,CAAC,KAAK,WAAN,CAA7B,EAAiD,QAAjD,EAAN;AACH;AACJ;;AAED,eAAK,QAAL,GAAgB,GAAhB;AACA,eAAK,QAAL,GAAgB,GAAhB;AAEA,eAAK,aAAL,GAAqB,KAAK,aAAL,KAAuB,KAAK,QAA5B,IAAwC,KAAK,QAAL,KAAkB,IAA1D,GAAiE,KAAK,QAAtE,GAAiF,KAAK,aAA3G;AACA,eAAK,aAAL,GAAqB,KAAK,aAAL,KAAuB,KAAK,QAA5B,IAAwC,KAAK,QAAL,KAAkB,IAA1D,GAAiE,KAAK,QAAtE,GAAiF,KAAK,aAA3G;AAEH,SArBQ,EAqBN,GArBM,CAdR;AAoCL,QAAA,UApCK,wBAoCQ;AAAA;;AACT,eAAK,KAAL,CAAW,QAAX,CAAoB,gBAApB,CAAqC,OAArC,EAA8C,UAAA,CAAC,EAAI;AAC/C,YAAA,MAAI,CAAC,WAAL,CAAiB,CAAjB,EAAoB,KAApB;AACD,WAFH,EAEK,KAFL;AAGE,eAAK,KAAL,CAAW,QAAX,CAAoB,gBAApB,CAAqC,OAArC,EAA8C,UAAA,CAAC,EAAI;AACjD,YAAA,MAAI,CAAC,WAAL,CAAiB,CAAjB,EAAoB,KAApB;AACD,WAFD,EAEG,KAFH;AAGL,SA3CI;AA4CL,QAAA,UA5CK,wBA4CQ;AACT;AACA,eAAK,KAAL,GAAa,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAAzC;AACA,eAAK,KAAL,GAAa,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAAzC;AACA,eAAK,MAAL,GAAc,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,MAA1C,CAJS,CAMT;;AACA,eAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA7C;AACA,eAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAA7C;AACA,eAAK,UAAL,GAAkB,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA9C;AAEA,eAAK,gBAAL;AACH,SAxDI;AAyDL,QAAA,gBAzDK,8BAyDc;AACf;AACA,eAAK,UAAL,GAAkB,KAAK,IAAL,CAAU,YAAV,IAA0B,IAA1B,GAAiC,KAAK,KAAtC,GAA8C,KAAK,SAArE;AACA,eAAK,UAAL,GAAkB,KAAK,IAAL,CAAU,YAAV,IAA0B,IAA1B,GAAiC,KAAK,KAAtC,GAA8C,KAAK,SAArE;AACA,eAAK,WAAL,GAAmB,KAAK,IAAL,CAAU,YAAV,IAA0B,IAA1B,GAAiC,KAAK,MAAtC,GAA+C,KAAK,UAAvE;AACA,eAAK,UAAL;AACH,SA/DI;AAgEL,QAAA,aAhEK,2BAgEW;AACZ,cAAI,UAAU,GAAG,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAA5B,GAAoC,IAAI,CAAC,KAAL,CAAW,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAAvC,CAApC,GAAoF,IAArG;AACA,eAAK,WAAL,GAAmB,UAAU,CAAC,KAAK,IAAL,CAAU,YAAX,CAA7B;AACH,SAnEI;AAoEL,QAAA,UApEK,wBAoEQ;AACT,eAAK,MAAL,kBAAsB,KAAK,aAAL,KAAuB,IAAvB,GAA8B,KAAK,UAAnC,GAAgD,KAAK,aAA3E,oBAAkG,KAAK,aAAL,KAAuB,IAAvB,GAA8B,KAAK,UAAnC,GAAgD,KAAK,aAAvJ,sBAAgL,KAAK,UAArL,sBAA2M,KAAK,UAAhN;AACH;AAtEI,OA1GY;AAkLrB,MAAA,OAlLqB,qBAkLX;AAAA;;AACN,aAAK,UAAL;AACA,aAAK,UAAL,GAFM,CAGN;;AACA,aAAK,SAAL,CAAe,YAAM;AACjB;AACA,UAAA,MAAI,CAAC,aAAL,GAAqB,MAAI,CAAC,IAAL,CAAU,YAAV,IAA0B,IAA1B,GAAiC,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAA7D,GAAqE,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAAtH;AACA,UAAA,MAAI,CAAC,aAAL,GAAqB,MAAI,CAAC,IAAL,CAAU,YAAV,IAA0B,IAA1B,GAAiC,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAA7D,GAAqE,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,SAAtH;AAEA,UAAA,MAAI,CAAC,IAAL,GAAY,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,IAAxC;AACA,UAAA,MAAI,CAAC,KAAL,GAAa,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAAzC;AACH,SAPD;AAWH;AAjMoB,KAAzB;;AAqMA,uBAAI,SAAJ,CAAc,mBAAd,EAAmC;AAC/B,MAAA,KAAK,EAAE,CAAC,MAAD,CADwB;AAE/B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,IADP;AACa;AAChB,UAAA,aAAa,EAAE,IAFZ;AAEkB;AACrB,UAAA,aAAa,EAAE,IAHZ;AAGkB;AACrB,UAAA,QAAQ,EAAE,IAJP;AAIa;AAChB,UAAA,aAAa,EAAE,IALZ;AAMH,UAAA,aAAa,EAAE,IANZ;AAQH,UAAA,GAAG,EAAE,IARF;AASH;AACA;AACA;AACA;AACA;AACA;AAEA,UAAA,UAAU,EAAE,CAhBT;AAiBH,UAAA,UAAU,EAAE,IAjBT;AAkBH,UAAA,WAAW,EAAE,IAlBV;AAmBH,UAAA,MAAM,EAAE,IAnBL;AAqBH,UAAA,IAAI,EAAE,IArBH;AAsBH,UAAA,WAAW,EAAE,IAtBV;AAwBH,UAAA,MAAM,EAAE,IAxBL;AAwBW;AACd,UAAA,KAAK,EAAE,IAzBJ,CAyBS;;AAzBT,SAAP;AA2BH,OA9B8B;AA+B/B,MAAA,KAAK,EAAE;AACH,wBAAgB,uBAAW;AACvB,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,IAAT;AACH,WAFW,CAAZ;;AAGA,cAAI,EAAE,KAAK,CAAC,OAAN,WAAiB,KAAK,IAAtB,YAAmC,CAAC,CAAtC,CAAJ,EAA8C;AAC1C,iBAAK,QAAL,GAAgB,IAAhB;AACH;;AACD,cAAI,EAAE,KAAK,CAAC,OAAN,WAAiB,KAAK,IAAtB,YAAmC,CAAC,CAAtC,CAAJ,EAA8C;AAC1C,iBAAK,QAAL,GAAgB,IAAhB;AACH;;AACD,cAAI,KAAK,CAAC,OAAN,CAAc,iBAAd,IAAmC,CAAC,CAAxC,EAA2C;AACvC,iBAAK,MAAL,GAAc,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAC,IAAD,EAAU;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,iBAApB;AACH,aAFa,EAEX,IAFW,CAEN,WAFM,EAAd;AAGH,WAJD,MAIO;AACH,iBAAK,MAAL,GAAc,IAAd;AACH;AACJ,SAlBE;AAmBH,kBAAU,kBAAW;AACjB,eAAK,WAAL,GAAmB,IAAnB;;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAkD,IAAlD,EAAwD,cAAxD;;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAkD,IAAlD,EAAwD,cAAxD;;AACA,eAAK,WAAL;AACH,SAxBE;AAyBH,uBAAe,uBAAW;AAAA;;AACtB,cAAI,KAAK,WAAL,KAAqB,MAArB,IAA+B,KAAK,WAAL,KAAqB,IAAxD,EAA8D;AAC1D,iBAAK,SAAL,CAAe,YAAM;AACjB;AACA,cAAA,MAAI,CAAC,UAAL;;AACA,cAAA,MAAI,CAAC,UAAL;;AACA,cAAA,MAAI,CAAC,IAAL,GAAY,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,IAAxC,CAJiB,CAMjB;;AACA,cAAA,MAAI,CAAC,QAAL,GAAgB,IAAhB;AACA,cAAA,MAAI,CAAC,QAAL,GAAgB,IAAhB,CARiB,CAUjB;;AACA,cAAA,MAAI,CAAC,aAAL,GAAqB,MAAI,CAAC,GAA1B;AACA,cAAA,MAAI,CAAC,aAAL,GAAqB,MAAI,CAAC,UAA1B,CAZiB,CAcjB;;AACA,cAAA,MAAI,CAAC,KAAL,GAAa,MAAI,CAAC,KAAL,KAAe,IAAf,GAAsB,MAAI,CAAC,KAA3B,GAAmC,MAAI,CAAC,KAAL,CAAW,QAAX,GAAsB,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,KAAlD,GAA0D,IAA1G,CAfiB,CAgBjB;AACH,aAjBD;AAmBH,WApBD,MAoBO;AACH;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;AACH;AACJ,SAnDE;AAoDH,oBAAY,oBAAW;AACnB,cAAI,KAAK,QAAL,IAAiB,KAAK,UAAtB,IAAoC,KAAK,QAAL,IAAiB,EAAzD,EAA6D;AACzD,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;AACH,WAHD,MAGO,IAAI,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAAtC,IAA2D,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAArG,EAAwH;AAC3H;AACA,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;AACH,WARkB,CAUnB;;;AACA,eAAK,aAAL,GAAqB,KAAK,QAAL,IAAiB,IAAjB,GAAwB,KAAK,GAA7B,GAAmC,KAAK,QAA7D;AACA,eAAK,aAAL,GAAqB,KAAK,QAA1B;;AACA,cAAI,KAAK,QAAL,KAAkB,IAAtB,EAA4B;AACxB,iBAAK,aAAL,CAAmB,KAAnB;AACH;AACJ,SApEE;AAqEH,oBAAY,oBAAW;AACnB,cAAI,KAAK,QAAL,IAAiB,KAAK,UAAtB,IAAoC,KAAK,QAAL,IAAiB,EAAzD,EAA6D;AACzD,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;AACH,WAHD,MAGO,IAAI,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAAtC,IAA2D,UAAU,CAAC,KAAK,QAAN,CAAV,GAA4B,UAAU,CAAC,KAAK,UAAN,CAArG,EAAwH;AAC3H;AACA,iBAAK,QAAL,GAAgB,IAAhB;;AACA,iCAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,IAAjD,EAAuD,cAAvD;AACH,WARkB,CAUnB;;;AACA,eAAK,aAAL,GAAqB,KAAK,QAAL,IAAiB,IAAjB,GAAwB,KAAK,UAA7B,GAA0C,KAAK,QAApE;AACA,eAAK,aAAL,GAAqB,KAAK,QAA1B;;AACA,cAAI,KAAK,QAAL,KAAkB,IAAtB,EAA4B;AACxB,iBAAK,aAAL,CAAmB,KAAnB;AACH;AACJ,SArFE;AAsFH;AACA,6BAAqB,4BAAW;AAC5B;AACA,eAAK,WAAL,GAAmB,MAAnB,CAF4B,CAI5B;AACA;;AACA,eAAK,WAAL;AACH,SA9FE;AAgGH,yBAAiB,yBAAW;AACxB;AACA,cAAI,UAAU,CAAC,KAAK,aAAN,CAAV,IAAkC,UAAU,CAAC,KAAK,aAAN,CAAhD,EAAsE;AAClE,iBAAK,aAAL,GAAqB,CAAC,UAAU,CAAC,KAAK,aAAN,CAAV,GAAiC,UAAU,CAAC,KAAK,WAAN,CAA5C,EAAgE,QAAhE,EAArB;AACH;;AAED,eAAK,aAAL,GAAqB,KAAK,aAAL,IAAsB,KAAK,UAA3B,GAAwC,IAAxC,GAA+C,KAAK,aAAzE;AACA,eAAK,UAAL;AAEH,SAzGE;AA0GH,yBAAiB,yBAAW;AACxB;AACA,cAAI,UAAU,CAAC,KAAK,aAAN,CAAV,IAAkC,UAAU,CAAC,KAAK,aAAN,CAAhD,EAAsE;AAClE,iBAAK,aAAL,GAAqB,CAAC,UAAU,CAAC,KAAK,aAAN,CAAV,GAAiC,UAAU,CAAC,KAAK,WAAN,CAA5C,EAAgE,QAAhE,EAArB;AACH;;AAED,eAAK,aAAL,GAAqB,KAAK,aAAL,IAAsB,KAAK,UAA3B,GAAwC,IAAxC,GAA+C,KAAK,aAAzE;AACA,eAAK,UAAL;AACH;AAlHE,OA/BwB;AAmJ/B,MAAA,OAAO,EAAE;AACL,QAAA,aAAa,EAAE,oBAAS,UAAS,IAAT,EAAe;AACnC;AACA,cAAI,KAAK,GAAG;AACR,YAAA,IAAI,YAAK,IAAL,cAAa,KAAK,KAAlB,eAA4B,IAAI,IAAI,KAAR,GAAgB,KAAK,QAArB,GAAgC,KAAK,QAAjE,cAA6E,KAAK,WAAlF,CADI;AAER,YAAA,KAAK,EAAE,IAAI,IAAI,KAAR,GAAgB,KAAK,QAArB,GAAgC,KAAK,QAFpC;AAGR,YAAA,IAAI,YAAK,KAAK,IAAV,SAAiB,IAAjB,CAHI;AAIR,YAAA,aAAa,EAAE,KAAK;AAJZ,WAAZ,CAFmC,CAQnC;;AACA,cAAI,KAAK,CAAC,KAAN,KAAgB,IAApB,EAA0B;AACtB,iCAAS,KAAT,CAAe,mBAAf,EAAoC,KAApC;AACH;AAEJ,SAbc,EAaZ,GAbY,CADV;AAeL,QAAA,WAAW,EAAE,oBAAS,UAAS,CAAT,EAAY,IAAZ,EAAkB;AACpC,cAAI,EAAE,GAAG,CAAC,CAAC,MAAX;AACA,cAAI,GAAG,GAAG,IAAI,IAAI,KAAR,GAAgB,EAAE,CAAC,KAAnB,GAA2B,KAAK,QAA1C;AACA,cAAI,GAAG,GAAG,IAAI,IAAI,KAAR,GAAgB,EAAE,CAAC,KAAnB,GAA2B,KAAK,QAA1C;;AACA,cAAI,IAAI,IAAI,KAAZ,EAAmB;AACf,gBAAI,UAAU,CAAC,GAAD,CAAV,IAAmB,UAAU,CAAC,GAAD,CAAjC,EAAwC;AACpC,cAAA,GAAG,GAAG,CAAC,UAAU,CAAC,GAAD,CAAV,GAAkB,UAAU,CAAC,KAAK,WAAN,CAA7B,EAAiD,QAAjD,EAAN;AACH;AACJ,WAJD,MAIO,IAAI,IAAI,IAAI,KAAZ,EAAmB;AACtB,gBAAI,UAAU,CAAC,GAAD,CAAV,IAAmB,UAAU,CAAC,GAAD,CAAjC,EAAwC;AACpC,cAAA,GAAG,GAAG,CAAC,UAAU,CAAC,GAAD,CAAV,GAAkB,UAAU,CAAC,KAAK,WAAN,CAA7B,EAAiD,QAAjD,EAAN;AACH;AACJ;;AAED,eAAK,QAAL,GAAgB,GAAhB;AACA,eAAK,QAAL,GAAgB,GAAhB;AAEA,eAAK,aAAL,GAAqB,KAAK,aAAL,KAAuB,KAAK,QAA5B,IAAwC,KAAK,QAAL,KAAkB,IAA1D,GAAiE,KAAK,QAAtE,GAAiF,KAAK,aAA3G;AACA,eAAK,aAAL,GAAqB,KAAK,aAAL,KAAuB,KAAK,QAA5B,IAAwC,KAAK,QAAL,KAAkB,IAA1D,GAAiE,KAAK,QAAtE,GAAiF,KAAK,aAA3G;AACH,SAnBY,EAmBX,GAnBW,CAfR;AAmCL,QAAA,UAnCK,wBAmCQ;AAAA;;AACT,eAAK,KAAL,CAAW,QAAX,CAAoB,gBAApB,CAAqC,OAArC,EAA8C,UAAA,CAAC,EAAI;AAC/C,YAAA,MAAI,CAAC,WAAL,CAAiB,CAAjB,EAAoB,KAApB;AACD,WAFH,EAEK,KAFL;AAGE,eAAK,KAAL,CAAW,QAAX,CAAoB,gBAApB,CAAqC,OAArC,EAA8C,UAAA,CAAC,EAAI;AACjD,YAAA,MAAI,CAAC,WAAL,CAAiB,CAAjB,EAAoB,KAApB;AACD,WAFD,EAEG,KAFH;AAGL,SA1CI;AA2CL,QAAA,WA3CK,yBA2CS;AAAA;;AACV,eAAK,GAAL,CAAS,gBAAT,CAA0B,QAA1B,EAAoC,OAApC,CAA4C,UAAC,IAAD,EAAU;AAClD,gBAAI,IAAI,GAAG,IAAI,CAAC,OAAL,CAAa,QAAxB;AACA,gBAAI,IAAI,GAAG,IAAI,CAAC,OAAL,CAAa,QAAb,GAAwB,IAAI,CAAC,OAAL,CAAa,QAAb,CAAsB,WAAtB,EAAxB,GAA8D,IAAzE;;AAEA,gBAAI,MAAI,CAAC,MAAL,IAAe,IAAnB,EAAyB;AACrB,kBAAI,IAAI,CAAC,YAAL,CAAkB,OAAlB,KAA8B,MAAlC,EAA0C;AACtC;AACH,eAFD,MAEO,IAAI,IAAI,IAAI,MAAI,CAAC,IAAL,CAAU,YAAtB,EAAoC;AACvC,gBAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,OAArB;AACH,eAFM,MAEA;AACH,gBAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,MAArB;AACH;AACJ,aARD,MAQO;AACH,kBAAI,IAAI,CAAC,YAAL,CAAkB,OAAlB,KAA8B,MAAlC,EAA0C;AACtC;AACH,eAFD,MAEO,IAAI,IAAI,CAAC,QAAL,CAAc,MAAI,CAAC,MAAnB,KAA8B,IAAI,IAAI,MAAI,CAAC,IAAL,CAAU,YAApD,EAAkE;AACrE,gBAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,OAArB;AACH,eAFM,MAEA;AACH,gBAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,MAArB;AACH;AACJ;AACJ,WArBD;AAsBH,SAlEI;AAmEL,QAAA,UAnEK,wBAmEQ;AACT,eAAK,MAAL,kBAAsB,KAAK,aAAL,KAAuB,IAAvB,GAA8B,KAAK,UAAnC,GAAgD,KAAK,aAA3E,oBAAkG,KAAK,aAAL,KAAuB,IAAvB,GAA8B,KAAK,UAAnC,GAAgD,KAAK,aAAvJ,sBAAgL,KAAK,UAArL,sBAA2M,KAAK,UAAhN;AACH,SArEI;AAsEL,QAAA,UAtEK,sBAsEM,CAtEN,EAsES;AACV,eAAK,WAAL,GAAmB,CAAC,CAAC,MAAF,CAAS,KAAT,IAAkB,MAAlB,GAA2B,IAA3B,GAAkC,CAAC,CAAC,MAAF,CAAS,KAA9D,CADU,CAC2D;;AACrE,cAAI,CAAC,CAAC,MAAF,CAAS,KAAT,KAAmB,MAAnB,IAA6B,CAAC,CAAC,MAAF,CAAS,KAAT,KAAmB,IAApD,EAA0D;AACtD,gBAAI,IAAI,GAAG,IAAI,CAAC,KAAL,CAAW,KAAK,GAAL,CAAS,aAAT,0BAAwC,CAAC,CAAC,MAAF,CAAS,KAAjD,UAA4D,OAA5D,CAAoE,QAA/E,CAAX,CADsD,CAC+C;AAErG;;AACA,iBAAK,GAAL,GAAW,IAAI,CAAC,GAAhB;AACA,iBAAK,UAAL,GAAkB,IAAI,CAAC,GAAvB;AACA,iBAAK,UAAL,GAAkB,IAAI,CAAC,GAAvB;AACA,iBAAK,WAAL,GAAmB,IAAI,CAAC,IAAxB;AACH;AAEJ,SAlFI;AAmFL,QAAA,SAnFK,uBAmFO;AACR,cAAI,IAAI,GAAG,KAAK,IAAL,CAAU,YAArB,CADQ,CAER;;AACA,eAAK,GAAL,CAAS,gBAAT,WAAoC,OAApC,CAA4C,UAAC,IAAD,EAAU;AAClD;AACA,gBAAI,IAAI,CAAC,YAAL,CAAkB,OAAlB,KAA8B,MAAlC,EAA0C;AACtC;AACH,aAFD,MAEO,IAAI,IAAI,CAAC,OAAL,CAAa,QAAb,KAA0B,IAA9B,EAAoC;AACvC,cAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,MAArB;AACH,aAFM,MAEA;AACH,cAAA,IAAI,CAAC,KAAL,CAAW,OAAX,GAAqB,OAArB;AACH;AACJ,WATD;AAUH;AAhGI,OAnJsB;AAqP/B,MAAA,OArP+B,qBAqPrB;AAAA;;AACN,aAAK,SAAL,CAAe,YAAM;AACjB;AACA,UAAA,OAAI,CAAC,WAAL,GAFiB,CAGjB;;AACH,SAJD;AAKH;AA3P8B,KAAnC;;AA8PA,uBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,MAAA,KAAK,EAAE,CAAC,MAAD,CADiB;AAExB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE,iBADH;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,SAAS,EAAE,IAHR;AAIH,UAAA,aAAa,EAAE;AAJZ,SAAP;AAMH,OATuB;AAUxB,MAAA,KAAK,EAAE;AACH,wBAAgB,uBAAW;AACvB,eAAK,UAAL;AACH;AAHE,OAViB;AAexB,MAAA,OAAO,EAAE;AACL,QAAA,aADK,yBACS,EADT,EACa,CADb,EACgB,IADhB,EACsB;AACvB;AACA;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,EAAhC,EAAoC,CAApC,EAAuC,IAAvC;AACH,SALI;AAML,QAAA,UANK,wBAMQ;AAAA;;AACT,cAAI,IAAI,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,EAAE,EAAI;AACpC,mBAAO,EAAE,CAAC,KAAH,IAAY,OAAI,CAAC,EAAxB;AACH,WAFU,CAAX;AAGA,eAAK,SAAL,GAAiB,IAAI,GAAG,IAAH,GAAU,KAA/B;AACA,eAAK,aAAL,GAAqB,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAN,CAArB,GAAoC,IAA7D;AACH;AAZI,OAfe;AA6BxB,MAAA,OA7BwB,qBA6Bd;AACN,aAAK,EAAL,GAAU,kBAAkB,CAAC,KAAK,KAAL,CAAW,KAAX,CAAiB,KAAlB,CAA5B;AACH;AA/BuB,KAA5B;;AAkCA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,6BAAsB,EAAtB,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,4BAG8B,EAH9B,GAGoC,IAHpC;AAIH,GAtuCD,CAJyB,CA4uCzB;;;AACA,MAAI,OAAO,CAAC,MAAR,GAAiB,CAArB,EAAwB;AACpB,IAAA,OAAO,CAAC,OAAR,CAAgB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC7B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,2BAAsC,KAAtC;AACA,MAAA,yBAAyB,CAAC,KAAD,CAAzB;AACH,KAHD;AAIH;AAEJ,CApvCD;;eAsvCe,c;;;;;;;;;;;AC9vCf;;AACA;;;;AAEA,IAAM,mBAAmB,GAAG,SAAtB,mBAAsB,GAAM;AAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAjB;;AAEA,MAAI,mBAAmB,GAAG,SAAtB,mBAAsB,CAAC,EAAD,EAAQ;AAC9B,uBAAI,SAAJ,CAAc,+BAAd,EAA+C;AAC3C,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,SAAS,EAAE,IADR;AAEH,UAAA,QAAQ,EAAE,EAFP;AAGH,UAAA,YAAY,EAAE,EAHX;AAIH,UAAA,UAAU,EAAE,KAJT;AAKH,UAAA,UAAU,EAAE,IALT;AAMH,UAAA,YAAY,EAAE,IANX;AAOH,UAAA,UAAU,EAAE;AAPT,SAAP;AASH,OAX0C;AAY3C,MAAA,KAAK,EAAE;AACH,QAAA,UAAU,EAAE,sBAAW;AACnB,eAAK,UAAL,GAAkB,KAAK,UAAL,GAAkB,KAAK,YAAvB,GAAsC,KAAK,QAA7D;AACH,SAHE;AAIH,QAAA,SAAS,EAAE,qBAAW;AAAA;;AAClB,cAAI,KAAK,SAAT,EAAoB;AAChB,iBAAK,SAAL,CAAe,YAAM;AACjB,cAAA,KAAI,CAAC,QAAL,GAAgB,KAAI,CAAC,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,QAA9C;AACA,cAAA,KAAI,CAAC,YAAL,GAAoB,KAAI,CAAC,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,YAAlD;AACA,cAAA,KAAI,CAAC,UAAL,GAAkB,KAAI,CAAC,UAAL,GAAkB,KAAI,CAAC,YAAvB,GAAsC,KAAI,CAAC,QAA7D;AACH,aAJD;AAKH;AACJ;AAZE,OAZoC;AA0B3C,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV,cAAI,WAAW,GAAG,KAAK,KAAL,CAAW,gBAA7B;AACA,cAAI,aAAa,GAAG,KAAK,KAAL,CAAW,YAAX,CAAwB,qBAAxB,GAAgD,MAApE;;AAEA,cAAI,KAAK,UAAL,IAAmB,IAAvB,EAA6B;AACzB,iBAAK,UAAL,GAAkB,KAAlB;AAEA,YAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,cAAA,qBAAqB,CAAC,YAAW;AAC7B,gBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,eAFoB,CAArB;AAGH,aAPoB,CAArB;AASA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,aAFD;AAIH,WAhBD,MAgBO;AACH,iBAAK,UAAL,GAAkB,IAAlB;AACA,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,aAFD;AAGH;AACJ,SA5BI;AA6BL,QAAA,IA7BK,kBA6BE;AAAA;;AACH;AACA,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,cAAX,CAA0B,gBAA1B,CAA2C,eAA3C,EAA4D,MAAhF;AACA,eAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,YAAX,CAAwB,gBAAxB,CAAyC,eAAzC,EAA0D,MAA3E;AACA,eAAK,UAAL,GAAkB,KAAK,YAAL,GAAoB,KAAK,SAA3C;AAEA,eAAK,SAAL,GAAiB,KAAK,SAAL,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA7C,CANG,CAQH;;AACA,cAAI,KAAK,SAAT,EAAoB;AAChB,iBAAK,SAAL,CAAe,YAAM;AACjB,cAAA,MAAI,CAAC,QAAL,GAAgB,MAAI,CAAC,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,QAA9C;AACA,cAAA,MAAI,CAAC,YAAL,GAAoB,MAAI,CAAC,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,YAAlD;AACA,cAAA,MAAI,CAAC,UAAL,GAAkB,MAAI,CAAC,UAAL,GAAkB,MAAI,CAAC,YAAvB,GAAsC,MAAI,CAAC,QAA7D;AACH,aAJD;AAKH;AACJ;AA7CI,OA1BkC;AAyE3C,MAAA,OAzE2C,qBAyEjC;AACN,aAAK,IAAL;AACH;AA3E0C,KAA/C;;AA8EA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,kCAA2B,EAA3B,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,iCAGmC,EAHnC,GAGyC,IAHzC;AAKH,GApFD;;AAsFA,MAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAA0B;AACtB,IAAA,QAAQ,CAAC,OAAT,CAAiB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC9B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,gCAA2C,KAA3C;AACA,MAAA,mBAAmB,CAAC,KAAD,CAAnB;AACH,KAHD;AAIH;AAEJ,CAhGD;;eAkGe,mB;;;;;;;;;;;ACrGf;;AACA;;AACA;;AACA;;;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,GAAM;AAErB,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,cAA1B,CAAd;;AAEA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAI,qBAAqB,GAAG,SAAxB,qBAAwB,CAAC,EAAD,EAAQ;AAChC,uBAAI,SAAJ,CAAc,aAAd,EAA6B;AACzB,MAAA,QAAQ,EAAE;AACN,QAAA,QAAQ,EAAE,oBAAW;AACjB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH;AAHK,OADe;AAMzB,MAAA,KAAK,EAAE;AACH,QAAA,QAAQ,EAAE,oBAAW;AACjB,cAAI,CAAC,KAAK,QAAV,EAAoB;AAChB,iBAAK,MAAL,CAAY,IAAZ,CAAiB,YAAjB;AACH;AACJ;AALE,OANkB;AAazB,MAAA,OAAO,EAAE;AACL,QAAA,YADK,0BACU;AACX,cAAI,KAAK,GAAG,KAAK,KAAL,CAAW,KAAX,CAAiB,SAAjB,CAA2B,IAA3B,CAAZ;AACA,eAAK,MAAL,CAAY,IAAZ,CACI,wBAAgB,QADpB,EAEI,wBAAgB,IAFpB,EAGI,wBAAgB,OAHpB,EAII,wBAAgB,MAAhB,CAAuB,KAAvB,CAJJ;AAMH;AATI;AAbgB,KAA7B;;AA0BA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,yBAAkB,EAAlB;AADE,KAAR,EAEG,MAFH,wBAE0B,EAF1B,GAEgC,IAFhC;AAGH,GA9BD;;AAgCA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,uBAAkC,KAAlC;AACA,MAAA,qBAAqB,CAAC,KAAD,CAArB;AACH,KAHD;AAIH;AAEJ,CA7CD;;eA+Ce,U;;;;;;;;;;;ACpDf;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,IAAM,aAAa,GAAG,SAAhB,aAAgB,GAAM;AAExB,MAAI,MAAM,GAAG,QAAQ,CAAC,gBAAT,CAA0B,iBAA1B,CAAb;;AAEA,MAAM,wBAAwB,GAAG,SAA3B,wBAA2B,CAAC,EAAD,EAAQ;AACrC,uBAAI,SAAJ,CAAc,yBAAd,EAAyC;AACrC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,UAAU,EAAE,IADV;AAEF,YAAA,aAAa,EAAE,IAFb;AAGF,YAAA,KAAK,EAAE,IAHL;AAIF,YAAA,WAAW,EAAE,CAJX;AAIc;AAChB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAOF,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,OAAO,EAAE,EARP;AASF,YAAA,YAAY,EAAE,IATZ;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,cAAc,EAAE,IAXd;AAWoB;AACtB,YAAA,QAAQ,EAAE,IAZR;AAaF,YAAA,SAAS,EAAE,IAbT;AAae;AACjB,YAAA,MAAM,EAAE,EAdN;AAeF,YAAA,KAAK,EAAE,iBAfL;AAgBF,YAAA,UAAU,EAAE,IAhBV;AAiBF,YAAA,eAAe,EAAE,IAjBf;AAkBF,qBAAO,gBAlBL;AAmBF,YAAA,oBAAoB,EAAE,EAnBpB;AAoBF,YAAA,UAAU,EAAE,EApBV;AAqBF,YAAA,kBAAkB,EAAE,EArBlB;AAsBF,YAAA,cAAc,EAAE,EAtBd;AAuBF,YAAA,cAAc,EAAE,EAvBd;AAwBF,YAAA,WAAW,EAAE,EAxBX;AAyBF,YAAA,aAAa,EAAE,EAzBb;AA0BF,YAAA,iBAAiB,EAAE,IA1BjB;AA2BF,YAAA,yBAAyB,EAAE,KA3BzB;AA4BF,YAAA,0BAA0B,EAAE,KA5B1B;AA6BF,YAAA,mBAAmB,EAAE,KA7BnB;AA8BF,YAAA,mBAAmB,EAAE,KA9BnB;AA+BF,YAAA,wBAAwB,EAAE,KA/BxB;AAgCF,YAAA,sBAAsB,EAAE,KAhCtB;AAiCF,YAAA,yBAAyB,EAAE,KAjCzB;AAkCF,YAAA,sBAAsB,EAAE,KAlCtB;AAmCF,YAAA,kBAAkB,EAAE,CAAC,CAnCnB;AAoCF,YAAA,gBAAgB,EAAE,CApChB;AAqCF,YAAA,0BAA0B,EAAE,KArC1B;AAsCF,YAAA,eAAe,EAAE,MAAM,CAAC;AAtCtB,WADH;AAyCH,UAAA,SAAS,EAAE;AAzCR,SAAP;AA2CH,OA7CoC;AA8CrC,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAnB;AACH,SANK;AAON,QAAA,aAAa,EAAE,yBAAW;AACtB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,gBADU;AAElB,wBAAY,QAFM;AAGlB,sBAAU,KAAK,IAAL,CAAU,KAHF;AAIlB,qBAAS,KAAK,IAAL,CAAU,YAAV,IAA0B,CAJjB;AAKlB,uBAAW,MALO;AAMlB,qBAAS,gBANS;AAOlB,oBAAQ,uBAPU;AAQlB,kBAAM;AARY,WAAf,CAAP;AAUH,SAlBK;AAmBN,QAAA,aAAa,EAAE,yBAAW;AACtB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,gBADU;AAElB,wBAAY,QAFM;AAGlB,sBAAU,KAAK,IAAL,CAAU,KAHF;AAIlB,qBAAS,KAAK,IAAL,CAAU,YAAV,IAA0B;AAJjB,WAAf,CAAP;AAMH,SA1BK;AA2BN,QAAA,cAAc,EAAE,0BAAW;AACvB,iBAAO,KAAK,IAAL,CAAU,eAAV,GAA4B,SAA5B,GAAwC,IAA/C;AACH;AA7BK,OA9C2B;AA6ErC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,cAAI,QAAQ,GAAG,EAAf;AACA,cAAI,KAAK,GAAG,kBAAM,KAAN,CAAY,SAAxB;;AAEA,eAAK,IAAI,IAAT,IAAiB,KAAjB,EAAwB;AACpB,YAAA,QAAQ,gCAAO,QAAP,sBAAoB,KAAK,CAAC,IAAD,CAAzB,EAAR;AACH;;AAED,eAAK,IAAL,CAAU,SAAV,GAAsB,QAAQ,CAAC,MAAT,CAAgB,UAAC,IAAD,EAAU;AAC5C,mBAAO,IAAI,KAAK,EAAhB;AACH,WAFqB,CAAtB;AAGH,SAZE;AAaH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AAEA,eAAK,UAAL;AACH,SAlBE;AAmBH,wBAAgB,uBAAW;AACvB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFuB,CAEI;;AAC3B,eAAK,UAAL;AACA,eAAK,UAAL,GAJuB,CAIJ;AACtB,SAxBE;AAyBH,sBAAc,qBAAW;AACrB,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CADqB,CACM;AAC3B;AACH;AA5BE,OA7E8B;AA2GrC,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SALI;AAML,QAAA,aANK,yBAMS,EANT,EAMa,CANb,EAMgB,IANhB,EAMsB;AACvB,cAAI,EAAE,KAAK,QAAX,EAAqB;AACjB;AACH;;AAED,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAA9B;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B,CAPuB,CAQvB;AACA;AACA;AACA;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,IAAI,KAAK,gBAAb,EAA+B;AAC3B,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,KAAV;AAAiB,wBAAQ,IAAzB;AAA+B,wBAAQ,CAAC,CAAC,aAAF,CAAgB;AAAvD,eAA3C;AACH,aAFD,MAEO;AACH,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,OAAV;AAAmB,wBAAQ,IAA3B;AAAiC,wBAAQ,CAAC,CAAC,aAAF,CAAgB;AAAzD,eAA3C;AACH;AACJ,WAND,MAMO;AACH,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ,CADG,CAIH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ,SAhCI;AAiCL;AACA,QAAA,YAlCK,wBAkCQ,EAlCR,EAkCY,KAlCZ,EAkCmB,IAlCnB,EAkCyB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA,WADX,CAE1B;;AACA,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,KAAT;AACH,WAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,eAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH,SAzCI;AA0CL;AACA,QAAA,SA3CK,uBA2CO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACH,SA7CI;AA8CL,QAAA,UA9CK,wBA8CQ;AACT,eAAK,SAAL,GAAiB,IAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kCAA1B,CAAjB;AACA,UAAA,UAAU,CAAC,OAAX,CAAmB,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,GAAlB,CAAsB,SAAtB,CAAJ;AAAA,WAA1B;AACH,SAnDI;AAoDL,QAAA,aApDK,2BAoDW;AACZ,eAAK,SAAL,GAAiB,KAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kCAA1B,CAAjB;AACA,UAAA,UAAU,CAAC,OAAX,CAAmB,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,SAAzB,CAAJ;AAAA,WAA1B;AACH,SAzDI;AA0DL;AACA,QAAA,UA3DK,wBA2DQ;AACT,cAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,YAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,uBAAS,OADS;AAElB,sBAAQ,WAFU;AAGlB,0BAAY,WAHM;AAIlB,wBAAU,eAJQ;AAKlB,uBAAS,QALS;AAMlB,8BAAgB;AANE,aAAtB;AAQH;;AACD,eAAK,IAAL,CAAU,mBAAV,GAAgC,IAAhC;AACH,SAvEI;AAwEL,QAAA,SAxEK,uBAwEO;AACR,cAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,YAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,uBAAS,OADS;AAElB,sBAAQ,WAFU;AAGlB,0BAAY,UAHM;AAIlB,wBAAU,eAJQ;AAKlB,uBAAS,QALS;AAMlB,8BAAgB;AANE,aAAtB;AAQH;;AACD,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,cAAjC;AACA,eAAK,IAAL,CAAU,kBAAV,GAA+B,KAAK,IAAL,CAAU,cAAzC;AACA,eAAK,IAAL,CAAU,mBAAV,GAAgC,IAAhC;AACH,SAtFI;AAuFL,QAAA,gBAvFK,8BAuFc;AACf,eAAK,cAAL,CAAoB,CAApB,EAAuB,CAAvB;AACH,SAzFI;AA0FL,QAAA,cA1FK,4BA0FY;AACb,eAAK,cAAL,CAAoB,CAApB,EAAuB,CAAvB;AACH,SA5FI;AA6FL,QAAA,cA7FK,0BA6FU,MA7FV,EA6FkB,IA7FlB,EA6FwB;AACzB,cAAI,cAAc,GAAG,qBAArB,CADyB,CAEzB;;AAEA,cAAI,IAAI,IAAI,CAAZ,EAAe;AACX,iBAAK,IAAL,CAAU,wBAAV,GAAqC,IAArC;AACA,iBAAK,IAAL,CAAU,sBAAV,GAAmC,KAAnC;AACH,WAHD,MAIK,IAAI,IAAI,IAAI,CAAZ,EAAe;AAChB,iBAAK,IAAL,CAAU,sBAAV,GAAmC,IAAnC;AACA,iBAAK,IAAL,CAAU,wBAAV,GAAqC,KAArC;AACH;;AAED,4BAAM,KAAN,CAAY,cAAZ,EAA4B;AACxB,YAAA,KAAK,EAAE,KAAK,IAAL,CAAU,cADO;AAExB,YAAA,MAAM,EAAE,MAFgB;AAGxB,YAAA,QAAQ,EAAE;AAHc,WAA5B,EAIG,IAJH,CAIQ,UAAU,QAAV,EAAoB;AACxB,gBAAI,QAAQ,CAAC,IAAT,CAAc,OAAlB,EAA2B;AACvB,cAAA,OAAO,CAAC,GAAR,CAAY,QAAQ,CAAC,IAAT,CAAc,OAA1B;;AACA,kBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,gBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,2BAAS,OADS;AAElB,0BAAQ,UAFU;AAGlB,8BAAY,UAHM;AAIlB,4BAAU,MAJQ;AAKlB,2BAAS,MALS;AAMlB,kCAAgB;AANE,iBAAtB;AAQH;AACJ,aAZD,MAaK;AACD,cAAA,OAAO,CAAC,GAAR,CAAY,4CAA4C,QAAQ,CAAC,IAAT,CAAc,OAAtE;AACH;AACJ,WArBD,WAqBS,UAAU,KAAV,EAAiB;AACtB,YAAA,OAAO,CAAC,GAAR,CAAY,qCAAqC,KAAjD;AACH,WAvBD;AAwBH,SAlII;AAmIL,QAAA,UAnIK,wBAmIQ;AAAA;;AACT;AACA,eAAK,IAAL,CAAU,iBAAV,GAA8B,KAA9B,CAFS,CAIT;;AACA,eAAK,IAAL,CAAU,eAAV,GAA4B,IAA5B,CALS,CAKyB;;AAClC,cAAI,OAAO,GAAG,MAAM,CAAC,YAArB;;AAEA,cAAI,KAAK,IAAL,CAAU,UAAV,IAAwB,iBAA5B,EAA+C;AAAE;AAC7C,YAAA,OAAO,GAAG,yCAAV;AACH;;AAED,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CAZS,CAaT;;AACA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,KAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,gBAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,OAAO,GAAG,EAAd;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,gBAAI,IAAI,CAAC,KAAL,KAAe,IAAf,IAAuB,IAAI,CAAC,KAAL,KAAe,KAA1C,EAAiD;AAC7C,cAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACH;AACJ,WAJD;AAMA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC,CAnCS,CAoCT;;AAEA,cAAI,WAAW,GAAG;AACd,YAAA,CAAC,EAAE,KAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,UAAjC,GAA8C,KAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,IAAL,CAAU,KAA5B,GAAoC,IADvE;AAEd,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAFrB;AAGd,YAAA,cAAc,EAAE,wBAAwB,KAAK,wBAAwB,EAA7B,GAAkC,IAH5D;AAId,YAAA,KAAK,EAAE,wBAAwB,KAAK,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAAL,GAAqC,IAJtD;AAKd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU;AALF,WAAlB;AAQA,eAAK,IAAL,CAAU,WAAV,GAAwB,WAAxB;AAEA,cAAI,UAAU,GAAG,WAAW,CAAC,CAA7B,CAhDS,CAkDT;;AACA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,oBACC,WADD;AADI,WAAlB,EAKC,IALD,CAKM,UAAS,QAAT,EAAmB;AACrB;AACA;AACA;AACA;AACA,gBAAI,YAAJ,EAAkB,mBAAlB;;AAEA,gBAAI,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAAtB,IAAgC,CAApC,EAAuC;AACnC,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,8CAA1B,CAAtB;AAEA,cAAA,IAAI,CAAC,IAAL,CAAU,iBAAV,GAA8B,KAA9B;AACH,aALD,MAMK;AACD,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,gCAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,yDAA1B,CAAtB;AAEA,cAAA,IAAI,CAAC,IAAL,CAAU,iBAAV,GAA8B,IAA9B;AACH;;AACD,gBAAI,QAAQ,CAAC,IAAT,CAAc,UAAd,IAA4B,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,MAAzB,GAAkC,CAAlE,EACA;AAAA,kBA+BgB,OA/BhB;;AAAA;AACI,oBAAI,WAAW,GAAG,EAAlB;AAEA,gBAAA,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,OAAzB,CAAiC,UAAA,GAAG,EAAI;AACpC,sBAAI,aAAa,GAAG,QAAQ,CAAC,aAAT,CAAuB,GAAvB,CAApB;AACA,kBAAA,aAAa,CAAC,IAAd,gBAAyB,GAAzB;AACA,kBAAA,aAAa,CAAC,SAAd,GAA0B,GAA1B,CAHoC,CAIpC;AACA;AACA;AACA;;AACA,kBAAA,WAAW,CAAC,IAAZ,CAAiB,aAAjB;AACH,iBATD,EAHJ,CAaI;;AACA,gBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,MAAM,EAAI;AAC3B,yBAAO,MAAM,CAAC,UAAd,EAA0B;AACtB,oBAAA,MAAM,CAAC,WAAP,CAAmB,MAAM,CAAC,UAA1B;AACH;AACJ,iBAJD;;AAdJ,2CAmBa,CAnBb;AAoBQ,kBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE,EAAI;AACvB,wBAAI,aAAa,GAAG,WAAW,CAAC,CAAD,CAAX,CAAe,SAAf,CAAyB,IAAzB,CAApB;AACA,oBAAA,aAAa,CAAC,gBAAd,CAA+B,OAA/B,EAAwC,UAAU,CAAV,EAAa;AACjD,sBAAA,CAAC,CAAC,eAAF;AACA,sBAAA,IAAI,CAAC,UAAL,CAAgB,CAAhB,EAFiD,CAGjD;AACH,qBAJD;AAMA,oBAAA,EAAE,CAAC,MAAH,CAAU,aAAV;AACH,mBATD;;AAUA,sBAAI,CAAC,GAAG,CAAJ,GAAQ,WAAW,CAAC,MAAxB,EAAgC;AACxB,oBAAA,OAAO,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CADc,EAE5B;;AACA,oBAAA,OAAO,CAAC,KAAR,CAAc,WAAd,GAA4B,KAA5B;AACA,oBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE,EAAI;AACvB,sBAAA,EAAE,CAAC,MAAH,CAAU,OAAO,CAAC,SAAR,CAAkB,IAAlB,CAAV;AACH,qBAFD;AAGH;AArCT;;AAmBI,qBAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,WAAW,CAAC,MAAhC,EAAwC,CAAC,EAAzC,EAA6C;AAAA,wBAApC,CAAoC;AAmB5C;;AAED,gBAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,yBAAI,OAAO,CAAC,SAAR,CAAkB,GAAlB,CAAsB,MAAtB,CAAJ;AAAA,iBAAnC;AAxCJ;AAyCC,aA1CD,MA0CO;AACH,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;AACH,aA/DoB,CAgErB;AACA;AACA;;;AAEA,gBAAI,QAAQ,CAAC,IAAT,CAAc,OAAlB,EAA2B;AACvB;AACA,cAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,GAAtB,CAA0B,UAAC,IAAD,EAAU;AACpD,oBAAI,IAAI,CAAC,KAAL,IAAc,IAAI,CAAC,UAAvB,EAAmC;AAC/B,sBAAI,IAAI,CAAC,KAAL,CAAW,OAAX,CAAmB,KAAnB,IAA4B,CAAC,CAAjC,EAAoC;AAChC,6CACO,IADP;AAEI,4CAAe,IAAI,CAAC,KAAL,CAAW,OAAX,CAAmB,KAAnB,EAA0B,EAA1B,CAAf,CAFJ;AAGI,kCAAY,IAAI,CAAC;AAHrB;AAKH,mBAND,MAMO;AACH,6CACO,IADP;AAEI,yCAAY,IAAI,CAAC,KAAjB,CAFJ;AAGI,kCAAY,IAAI,CAAC;AAHrB;AAKH;AACJ,iBAdD,MAcO;AACH,2CAAW,IAAX;AACH;AACJ,eAlBmB,CAApB,CAFuB,CAqBvB;AACI;AACJ;;AACI,cAAA,IAAI,CAAC,IAAL,CAAU,UAAV,GAAuB,IAAvB,CAxBmB,CAyBvB;;AACA,cAAA,IAAI,CAAC,IAAL,CAAU,0BAAV,GAAuC,IAAvC;AACH,aA3BD,MA2BO;AACH,cAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,IAApB;AACA,cAAA,IAAI,CAAC,IAAL,CAAU,0BAAV,GAAuC,IAAvC;AACH,aAlGoB,CAoGrB;;;AACA,gBAAI,UAAU,IAAI,UAAU,CAAC,MAAX,GAAoB,CAAlC,IAAuC,MAAM,CAAC,SAA9C,IACA,MAAM,CAAC,SAAP,CAAiB,MAAM,CAAC,SAAP,CAAiB,MAAjB,GAAwB,CAAzC,EAA4C,KAA5C,IAAqD,gBADzD,CAC0E;AAD1E,cAEM;AAAE;AACJ,gBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAuB;AACnB,kBAAA,KAAK,EAAE,gBADY;AAEnB,kBAAA,IAAI,EAAE,QAFa;AAGnB,kBAAA,QAAQ,EAAE,QAHS;AAInB,kBAAA,MAAM,EAAE,UAJW;AAKnB,kBAAA,KAAK,EAAE,QAAQ,CAAC,IAAT,CAAc;AALF,iBAAvB;AAOH,eA/GoB,CAiHrB;;;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAvC,CAlHqB,CAoHrB;;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,MAAV,GAAmB,QAAQ,CAAC,IAAT,CAAc,kBAAjC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC,CAtHqB,CAuHrB;;AAEA,YAAA,IAAI,CAAC,aAAL;AACH,WA/HD,WAgIO,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACA,YAAA,IAAI,CAAC,aAAL;AACH,WAnID;;AAqIA,cAAI,KAAK,IAAL,CAAU,eAAd,EAA+B;AAC3B,gBAAI,KAAK,IAAL,CAAU,aAAV,IAA2B,KAAK,IAAL,CAAU,UAAzC,EAAqD;AACjD;AACA,kBAAI,MAAM,GAAG,KAAK,IAAL,CAAU,UAAvB;AACA,kBAAI,MAAM,GAAG,EAAb;AACA,kBAAI,MAAM,GAAG,EAAb;AACA,kBAAI,UAAU,GAAG,aAAjB;AACA,kBAAI,UAAU,GAAG,aAAjB,CANiD,CAOjD;AACA;AAEA;;AACA,mBAAK,IAAL,CAAU,yBAAV,GAAsC,KAAtC;AACA,mBAAK,IAAL,CAAU,0BAAV,GAAuC,KAAvC;AACA,mBAAK,IAAL,CAAU,mBAAV,GAAgC,KAAhC;AACA,mBAAK,IAAL,CAAU,mBAAV,GAAgC,KAAhC;AACA,mBAAK,IAAL,CAAU,wBAAV,GAAqC,KAArC;AACA,mBAAK,IAAL,CAAU,sBAAV,GAAmC,KAAnC;AACA,mBAAK,IAAL,CAAU,yBAAV,GAAsC,KAAtC;AACA,mBAAK,IAAL,CAAU,sBAAV,GAAmC,KAAnC;AACA,mBAAK,IAAL,CAAU,kBAAV,GAA+B,CAAC,CAAhC,CAnBiD,CAoBjD;;AACA,gCAAM,GAAN,CAAU,UAAV,EAAsB;AAClB,gBAAA,MAAM,EAAE;AACJ,kBAAA,MAAM,EAAE,MADJ;AAEJ,kBAAA,IAAI,EAAE;AAFF;AADU,eAAtB,EAKG,IALH,CAKQ,UAAU,QAAV,EAAoB;AACxB,oBAAI,QAAQ,CAAC,IAAT,CAAc,OAAlB,EAA2B;AACvB,sBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,oBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,+BAAS,mBADS;AAElB,sCAAgB,eAFE;AAGlB,8BAAQ,gBAHU;AAIlB,kCAAY,mBAJM;AAKlB,gCAAU,MAAM,CAAC,UAAP,CAAkB,IAAlB,EAAuB,EAAvB,CALQ;AAMlB,+BAAS,WANS;AAOlB,sCAAgB;AAPE,qBAAtB;AASH;;AACD,kBAAA,IAAI,CAAC,IAAL,CAAU,yBAAV,GAAsC,IAAtC;AACA,kBAAA,MAAM,GAAG,QAAQ,CAAC,IAAT,CAAc,OAAvB;AACA,kBAAA,IAAI,CAAC,eAAL,CAAqB,MAArB;AACH,iBAfD,MAgBK;AACD,kBAAA,OAAO,CAAC,GAAR,CAAY,wCAAwC,QAAQ,CAAC,IAAT,CAAc,OAAlE;;AACA,sBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,oBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,+BAAS,mBADS;AAElB,sCAAgB,eAFE;AAGlB,8BAAQ,gBAHU;AAIlB,kCAAY,yBAJM;AAKlB,gCAAU,MAAM,CAAC,UAAP,CAAkB,IAAlB,EAAuB,EAAvB,CALQ;AAMlB,+BAAS,GANS;AAOlB,sCAAgB;AAPE,qBAAtB;AASH;;AACD,kBAAA,IAAI,CAAC,IAAL,CAAU,yBAAV,GAAsC,IAAtC;AACH;AACJ,eArCD,WAqCS,UAAU,KAAV,EAAiB;AACtB,gBAAA,OAAO,CAAC,GAAR,CAAY,sCAAsC,KAAlD;;AACA,oBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,kBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,6BAAS,mBADS;AAElB,oCAAgB,eAFE;AAGlB,4BAAQ,gBAHU;AAIlB,gCAAY,yBAJM;AAKlB,8BAAU,MAAM,CAAC,UAAP,CAAkB,IAAlB,EAAuB,EAAvB,CALQ;AAMlB,6BAAS,GANS;AAOlB,oCAAgB;AAPE,mBAAtB;AASH;;AACD,gBAAA,IAAI,CAAC,IAAL,CAAU,yBAAV,GAAsC,IAAtC;AACH,eAnDD,EArBiD,CA0EjD;;;AACA,gCAAM,GAAN,CAAU,UAAV,EAAsB;AAClB,gBAAA,MAAM,EAAE;AACJ,kBAAA,MAAM,EAAE,MADJ;AAEJ,kBAAA,IAAI,EAAE;AAFF;AADU,eAAtB,EAKG,IALH,CAKQ,UAAU,QAAV,EAAoB;AACxB,oBAAI,QAAQ,CAAC,IAAT,CAAc,OAAlB,EAA2B;AACvB,kBAAA,IAAI,CAAC,IAAL,CAAU,mBAAV,GAAgC,KAAhC;AACA,kBAAA,IAAI,CAAC,IAAL,CAAU,mBAAV,GAAgC,KAAhC;AACA,kBAAA,IAAI,CAAC,IAAL,CAAU,sBAAV,GAAmC,IAAnC;AACA,kBAAA,MAAM,GAAG,QAAQ,CAAC,IAAT,CAAc,OAAvB;AACA,kBAAA,IAAI,CAAC,eAAL,CAAqB,MAArB;AACH,iBAND,MAMO;AACH,sBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,oBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,+BAAS,mBADS;AAElB,sCAAgB,eAFE;AAGlB,8BAAQ,gBAHU;AAIlB,kCAAY,yBAJM;AAKlB,gCAAU,MAAM,CAAC,UAAP,CAAkB,IAAlB,EAAuB,EAAvB,CALQ;AAMlB,+BAAS,GANS;AAOlB,sCAAgB;AAPE,qBAAtB;AASH;;AACD,kBAAA,IAAI,CAAC,IAAL,CAAU,0BAAV,GAAuC,IAAvC;AACH;AACJ,eA1BD,WA0BS,UAAU,KAAV,EAAiB;AACtB,gBAAA,OAAO,CAAC,GAAR,CAAY,sCAAsC,KAAlD;;AACA,oBAAI,MAAM,IAAI,MAAM,CAAC,SAArB,EAAgC;AAC5B,kBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAsB;AAClB,6BAAS,mBADS;AAElB,oCAAgB,eAFE;AAGlB,4BAAQ,gBAHU;AAIlB,gCAAY,yBAJM;AAKlB,8BAAU,MAAM,CAAC,UAAP,CAAkB,IAAlB,EAAuB,EAAvB,CALQ;AAMlB,6BAAS,GANS;AAOlB,oCAAgB;AAPE,mBAAtB;AASH;;AACD,gBAAA,IAAI,CAAC,IAAL,CAAU,0BAAV,GAAuC,IAAvC;AACH,eAxCD;AAyCH;;AAED,iBAAK,IAAL,CAAU,aAAV,GAA0B,KAAK,IAAL,CAAU,UAApC;AACH;AACJ,SApbI;AAsbL,QAAA,eAtbK,2BAsbW,EAtbX,EAsbe;AAChB;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,EAAE,CAAC,WAAH,CAAe,QAAf,EAA3B;;AACA,eAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,EAAE,CAAC,OAAH,CAAW,MAA/B,EAAuC,CAAC,EAAxC,EAA4C;AACxC,YAAA,EAAE,CAAC,OAAH,CAAW,CAAX,EAAc,YAAd,GAA6B,EAAE,CAAC,OAAH,CAAW,CAAX,EAAc,YAAd,CAA2B,OAA3B,CAAmC,KAAnC,EAA0C,EAA1C,CAA7B;AACH;;AACD,cAAI,OAAO,GAAG,EAAE,CAAC,OAAH,CAAW,MAAzB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,EAAE,CAAC,OAAH,CAAW,KAAX,CAAiB,CAAjB,EAAqB,OAAO,GAAG,CAAV,GAAc,CAAd,GAAkB,OAAvC,CAAvB;AACA,eAAK,IAAL,CAAU,kBAAV,GAA+B,EAAE,CAAC,OAAH,CAAW,KAAX,CAAiB,CAAjB,EAAqB,OAAO,GAAG,CAAV,GAAc,CAAd,GAAkB,OAAvC,CAA/B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,EAAE,CAAC,OAA9B;AACH,SAhcI;AAkcL,QAAA,eAlcK,2BAkcW,EAlcX,EAkce;AAChB,cAAM,SAAS,GAAG,IAAI,qBAAS,SAAb,CAAuB;AAAC,YAAA,oCAAoC,EAAE,IAAvC;AAA6C,YAAA,oBAAoB,EAAE;AAAnE,WAAvB,CAAlB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,SAAS,CAAC,QAAV,CAAmB,EAAE,CAAC,QAAtB,CAAxB;AACA,eAAK,IAAL,CAAU,aAAV,GAA0B,EAAE,CAAC,UAA7B;AACA,eAAK,IAAL,CAAU,oBAAV,GAAiC,EAAE,CAAC,iBAApC;AACH,SAvcI;AAycL,QAAA,QAzcK,sBAycM;AACP;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAhD;AAEA,eAAK,IAAL,CAAU,WAAV,qBACO,KAAK,IAAL,CAAU,WADjB;AAEI,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU;AAFpB,aAJO,CAQP;;AACA,cAAI,IAAI,GAAG,IAAX;AAEA,cAAI,OAAO,GAAG,MAAM,CAAC,YAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CAZO,CAaP;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACd,YAAA,MAAM,oBACC,KAAK,IAAL,CAAU,WADX;AADQ,WAAlB,EAKC,IALD,CAKM,UAAS,QAAT,EAAmB;AACrB;AACA,gBAAI,OAAO,GAAG,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,GAAtB,CAA0B,UAAC,IAAD,EAAU;AAC9C,kBAAI,IAAI,CAAC,KAAL,IAAc,IAAI,CAAC,UAAvB,EAAmC;AAC/B,oBAAI,IAAI,CAAC,KAAL,CAAW,OAAX,CAAmB,KAAnB,IAA4B,CAAC,CAAjC,EAAoC;AAChC,2CAAW,IAAX;AAAiB,0CAAe,IAAI,CAAC,KAAL,CAAW,OAAX,CAAmB,KAAnB,EAA0B,EAA1B,CAAf;AAAjB;AACH,iBAFD,MAEO;AACH,2CAAW,IAAX;AAAiB,uCAAY,IAAI,CAAC,KAAjB;AAAjB;AACH;AACJ,eAND,MAMO;AACH,yCAAW,IAAX;AACH;AACJ,aAVa,CAAd,CAFqB,CAarB;;AAEA,gBAAI,OAAJ,EAAa;AAAA;;AAAC,oCAAA,IAAI,CAAC,IAAL,CAAU,OAAV,EAAkB,IAAlB,8CAA0B,OAA1B;AAAmC;AACpD,WArBD,WAsBO,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAxBD;AAyBH,SAjfI;AAkfL,QAAA,MAlfK,oBAkfI;AACL,cAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAAnB;AACA,cAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,8CAA1B,CAA1B;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AAEA,UAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,gCAA1B,CAAf;AACA,UAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,yDAA1B,CAAtB;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AAEA,eAAK,aAAL,CAAmB,KAAK,IAAL,CAAU,UAA7B;AACA,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,IAAL,CAAU,UAA5B,CAVK,CAWL;;AAEA,eAAK,UAAL;AACA,eAAK,UAAL;AACH,SAjgBI;AAkgBL,QAAA,SAlgBK,uBAkgBO;AAAA;;AACR,cAAI,MAAM,GAAG,2BAAgB,SAAhB,CAAb;;AACA,cAAI,MAAJ,EAAY;AACR,gBAAI,WAAW,GAAG,MAAM,CAAC,KAAP,CAAa,GAAb,CAAlB;AACA,gBAAI,OAAO,GAAG,EAAd;AAEA,iBAAK,SAAL,CAAe,YAAM;AACjB;AACA,cAAA,WAAW,CAAC,OAAZ,CAAoB,UAAC,IAAD,EAAU;AAC1B,oBAAI,IAAI,GAAG,QAAQ,CAAC,aAAT,oBAAkC,IAAlC,YAA8C,QAAQ,CAAC,aAAT,oBAAkC,IAAlC,UAA4C,YAA5C,CAAyD,MAAzD,CAA9C,GAAiH,IAA5H;AAEA,gBAAA,OAAO,CAAC,IAAR,CAAa;AACT,kBAAA,KAAK,YAAK,IAAL,CADI;AAET,kBAAA,IAAI,EAAE;AAFG,iBAAb;AAIH,eAPD;AAQA,cAAA,MAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,OAApB;AACH,aAXD;AAaH;AACJ,SAthBI;AAuhBL,QAAA,UAvhBK,sBAuhBM,CAvhBN,EAuhBS;AACV;AACA,cAAI,KAAJ;;AACA,cAAI,CAAC,CAAC,MAAN,EAAc;AACV,YAAA,KAAK,GAAG,CAAC,CAAC,MAAF,CAAS,SAAjB;AACH,WAFD,MAEO;AACH,YAAA,KAAK,GAAG,CAAR;AACH,WAPS,CAQV;;;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,eAAK,MAAL;AACH,SAliBI;AAmiBL,QAAA,aAniBK,yBAmiBS,CAniBT,EAmiBY;AACb,cAAI,YAAY,GAAG,QAAQ,2BAAgB,GAAhB,CAA3B;AACA,cAAI,MAAM,GAAG,MAAM,CAAC,QAAP,CAAgB,IAAhB,CAAqB,OAArB,CAA6B,YAA7B,EAA2C,QAAM,kBAAkB,CAAC,CAAD,CAAnE,CAAb;AACA,UAAA,OAAO,CAAC,SAAR,CAAkB,IAAlB,EAAwB,EAAxB,EAA4B,MAA5B;AACH,SAviBI;AAwiBL,QAAA,UAxiBK,wBAwiBQ;AACT,cAAI,KAAK,GAAG,2BAAgB,GAAhB,CAAZ;AACA,cAAI,OAAO,GAAG,2BAAgB,SAAhB,CAAd;AACA,cAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,gCAA1B,CAAnB;AACA,cAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,yDAA1B,CAA1B;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AACA,UAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,qBAA1B,CAAf;AACA,UAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,8CAA1B,CAAtB;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;;AAEA,cAAI,KAAJ,EAAW;AACP,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,CAAC,OAAN,CAAc,KAAd,EAAqB,GAArB,CAAvB;AACA,iBAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,CAAC,OAAN,CAAc,KAAd,EAAqB,GAArB,CAAlB;AACH;;AAED,cAAI,OAAJ,EAAa;AACT,iBAAK,SAAL;AACH,WAFD,MAEO;AACH,iBAAK,UAAL;AACH;AAGJ,SA9jBI;AA+jBL,QAAA,IA/jBK,kBA+jBE;AAAA;;AACH;AACA,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC,CAFG,CAGH;;AACA,cAAI,QAAQ,GAAG,EAAf;AACA,cAAI,KAAK,GAAG,kBAAM,KAAN,CAAY,SAAxB;;AAEA,eAAK,IAAI,IAAT,IAAiB,KAAjB,EAAwB;AACpB,YAAA,QAAQ,gCAAO,QAAP,sBAAoB,KAAK,CAAC,IAAD,CAAzB,EAAR;AACH;;AAED,eAAK,IAAL,CAAU,SAAV,GAAsB,QAAQ,CAAC,MAAT,CAAgB,UAAC,IAAD,EAAU;AAC5C,mBAAO,IAAI,KAAK,EAAhB;AACH,WAFqB,CAAtB,CAXG,CAeH;;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CAhBG,CAgB2D;;AAC9D,cAAI,MAAM,CAAC,QAAP,CAAgB,MAApB,EAA4B;AACxB,gBAAI,KAAK,GAAG,2BAAgB,GAAhB,CAAZ;AACA,gBAAI,OAAO,GAAG,2BAAgB,SAAhB,CAAd;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,CAAC,OAAN,CAAc,KAAd,EAAqB,GAArB,CAAvB;AACA,iBAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,CAAC,OAAN,CAAc,KAAd,EAAqB,GAArB,CAAlB,CAJwB,CAKxB;AACA;AACA;;AACA,gBAAI,KAAK,IAAI,CAAC,OAAd,EAAuB;AACnB,mBAAK,UAAL;AACH;AACJ;;AAED,UAAA,MAAM,CAAC,UAAP,GAAoB,YAAM;AACtB,YAAA,MAAI,CAAC,UAAL;AACH,WAFD,CA9BG,CAkCH;;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAIA,eAAK,UAAL;AAGH,SA5mBI;AA6mBL,QAAA,UA7mBK,wBA6mBQ;AACT,cAAI,IAAI,GAAG,IAAX;;AACA,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB,iBAAK,KAAL,CAAW,eAAX,CAA2B,gBAA3B,CAA4C,OAA5C,EAAqD,UAAS,KAAT,EAAgB;AACjE,kBAAI,KAAK,CAAC,OAAN,KAAkB,EAAtB,EAA0B;AACtB,gBAAA,KAAK,CAAC,cAAN;AACA,gBAAA,IAAI,CAAC,MAAL;AACH;AACJ,aALD;AAMH,WAPD,MAOO;AACH,iBAAK,KAAL,CAAW,gBAAX,CAA4B,gBAA5B,CAA6C,OAA7C,EAAsD,UAAS,KAAT,EAAgB;AAClE,kBAAI,KAAK,CAAC,OAAN,KAAkB,EAAtB,EAA0B;AACtB,gBAAA,KAAK,CAAC,cAAN;AACA,gBAAA,IAAI,CAAC,MAAL;AACH;AACJ,aALD;AAMH;AACJ;AA9nBI,OA3G4B;AA2uBrC,MAAA,OA3uBqC,qBA2uB3B;AACN,aAAK,IAAL;;AACA,YAAI,MAAM,CAAC,QAAP,CAAgB,MAApB,EAA4B;AACxB,eAAK,SAAL;AACH;;AACD,YAAI,KAAK,KAAL,IAAc,KAAK,KAAL,CAAW,YAA7B,EAA2C;AACvC,eAAK,IAAL,CAAU,kBAAV,GAA+B,KAAK,KAAL,CAAW,YAAX,CAAwB,YAAvD;AACH;AACJ,OAnvBoC;AAovBrC,MAAA,OApvBqC,qBAovB3B;AACN,YAAI,IAAI,GAAG,IAAX;AACA,QAAA,UAAU,CAAC,YAAW;AAClB,cAAI,IAAI,CAAC,KAAL,IAAc,IAAI,CAAC,KAAL,CAAW,YAA7B,EAA2C;AACvC,gBAAI,SAAS,GAAG,IAAI,CAAC,IAAL,CAAU,kBAA1B;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,kBAAV,GAA+B,IAAI,CAAC,KAAL,CAAW,YAAX,CAAwB,YAAvD;AAEA,gBAAI,SAAS,IAAI,IAAI,CAAC,IAAL,CAAU,kBAA3B,EACI,IAAI,CAAC,IAAL,CAAU,gBAAV;AACP;AACJ,SARS,EAQP,IARO,CAAV;AASH;AA/vBoC,KAAzC;;AAkwBA,uBAAI,SAAJ,CAAc,eAAd,EAA+B;AAC3B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CADoB;AAE3B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,EAAE,EAAE,IADD;AAEH,UAAA,SAAS,EAAE,KAFR;AAGH,UAAA,QAAQ,EAAE,IAHP;AAIH,UAAA,KAAK,EAAE,CAJJ;AAKH,UAAA,KAAK,EAAE;AALJ,SAAP;AAOH,OAV0B;AAW3B,MAAA,KAAK,EAAE;AACH,wBAAgB,uBAAW;AACvB,eAAK,UAAL;AACH,SAHE;AAIH,uBAAe,sBAAW;AACtB,eAAK,QAAL;AACH;AANE,OAXoB;AAmB3B,MAAA,QAAQ,EAAE;AACN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,QADU;AAElB,wBAAY,QAFM;AAGlB,sBAAU,SAHQ;AAIlB,qBAAS,KAAK,KAJI;AAKlB,2BAAe,KAAK,KAAL,GAAa,KAAK,KAAlB,GAA0B;AALvB,WAAf,CAAP;AAOH;AATK,OAnBiB;AA8B3B,MAAA,OAAO,EAAE;AACL,QAAA,aADK,yBACS,EADT,EACa,CADb,EACgB,IADhB,EACsB;AACvB,+BAAS,KAAT,CAAe,eAAf,EAAgC,EAAhC,EAAoC,CAApC,EAAuC,IAAvC;AACH,SAHI;AAIL,QAAA,UAJK,wBAIQ;AAAA;;AACT,cAAI,KAAK,EAAL,IAAW,0BAAf,EAA2C;AACvC,gBAAI,IAAI,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,EAAE,EAAI;AACpC,qBAAO,kBAAkB,CAAC,EAAE,CAAC,IAAJ,CAAlB,IAA+B,MAAI,CAAC,EAA3C;AACH,aAFU,CAAX;AAGA,iBAAK,SAAL,GAAiB,IAAI,GAAG,IAAH,GAAU,KAA/B;AACH,WALD,MAKO;AACH,gBAAI,KAAI,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,EAAE,EAAI;AACpC,qBAAO,kBAAkB,CAAC,EAAE,CAAC,KAAJ,CAAlB,IAAgC,MAAI,CAAC,EAA5C;AACH,aAFU,CAAX;;AAGA,iBAAK,SAAL,GAAiB,KAAI,GAAG,IAAH,GAAU,KAA/B;AACH;AACJ,SAhBI;AAiBL,QAAA,QAjBK,sBAiBM;AACP;AACA,cAAI,SAAS,GAAG,KAAK,KAAL,CAAW,KAAX,CAAiB,KAAjC;AACA,cAAI,QAAQ,GAAG,KAAK,IAAL,CAAU,MAAV,CAAiB,MAAjB,CAAwB,UAAC,IAAD,EAAU;AAC7C,mBAAO,IAAI,CAAC,WAAL,CAAiB,QAAjB,OAAgC,SAAvC;AACH,WAFc,EAEZ,CAFY,CAAf;AAGA,eAAK,KAAL,GAAa,QAAQ,GAAG,QAAQ,CAAC,KAAZ,GAAoB,CAAzC;AACH,SAxBI;AAyBL,QAAA,IAzBK,kBAyBE;AACH,eAAK,KAAL,GAAa,KAAK,KAAL,CAAW,KAAX,CAAiB,SAA9B;AACH;AA3BI,OA9BkB;AA2D3B,MAAA,OA3D2B,qBA2DjB;AACN,aAAK,EAAL,GAAU,kBAAkB,CAAC,KAAK,KAAL,CAAW,KAAX,CAAiB,KAAlB,CAA5B;AACA,aAAK,UAAL;AACA,aAAK,IAAL,GAHM,CAIN;AACH;AAhE0B,KAA/B,EAnwBqC,CAs0BrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAEA,uBAAI,SAAJ,CAAc,eAAd,EAA+B;AAC3B,MAAA,KAAK,EAAE,CAAC,MAAD,CADoB;AAE3B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OAL0B;AAM3B,MAAA,QAAQ;AANmB,KAA/B;;AAUA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,MAAD,CAD2B;AAElC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OALiC;AAMlC,MAAA,QAAQ,uQAN0B;AAalC,MAAA,OAAO,EAAE;AACL,QAAA,qBADK,iCACiB,CADjB,EACoB;AACrB,eAAK,IAAL,CAAU,UAAV,GAAuB,CAAC,CAAC,aAAF,CAAgB,SAAvC;AACA,eAAK,OAAL,CAAa,MAAb;AACH;AAJI;AAbyB,KAAtC;;AAoBA,uBAAI,SAAJ,CAAc,YAAd,EAA4B;AACxB,MAAA,KAAK,EAAE,CAAC,MAAD,CADiB;AAExB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OALuB;AAMxB,MAAA,QAAQ,orBANgB;AAqBxB,MAAA,OAAO,EAAE;AACL,QAAA,aADK,yBACS,CADT,EACY;AACb,UAAA,MAAM,CAAC,IAAP,CAAY,CAAZ;AACH;AAHI;AArBe,KAA5B;;AA2BA,uBAAI,SAAJ,CAAc,oBAAd,EAAoC;AAChC,MAAA,KAAK,EAAE,CAAC,MAAD,CADyB;AAEhC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OAL+B;AAMhC,MAAA,QAAQ,4sBANwB;AAqBhC,MAAA,OAAO,EAAE;AACL,QAAA,aADK,yBACS,CADT,EACY;AACb,UAAA,MAAM,CAAC,IAAP,CAAY,CAAZ;AACH;AAHI;AArBuB,KAApC,EAj5BqC,CA66BrC;;;AACA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,WAAT,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OALyB;AAM1B,MAAA,QAAQ,wPANkB;AAW1B,MAAA,OAAO,EAAE,EAXiB;AAc1B,MAAA,OAd0B,qBAchB,CAET;AAhByB,KAA9B,EA96BqC,CAi8BrC;;;AACA,uBAAI,SAAJ,CAAc,cAAd,EAA8B;AAC1B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,WAApB,CADmB;AAE1B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,UAAU,EAAE,IADT;AAEH,UAAA,MAAM,EAAE,IAFL;AAEW;AACd,UAAA,UAAU,EAAE,IAHT;AAIH,UAAA,WAAW,EAAE,IAJV;AAIe;AAClB,UAAA,WAAW,EAAE;AALV,SAAP;AAOH,OAVyB;AAW1B,MAAA,KAAK,EAAE;AACH,kBAAU,kBAAW;AACjB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ,SALE;AAMH,sBAAc,sBAAW;AACrB,cAAI,KAAK,MAAT,EAAiB;AACb,iBAAK,WAAL,GAAmB,KAAK,UAAL,GAAkB,MAAM,CAAC,YAAzB,GAAwC,MAAM,CAAC,WAAlE;AACH;AACJ;AAVE,OAXmB;AAuB1B,MAAA,QAAQ,EAAE;AACN,2BAAmB,2BAAW;AAC1B,cAAI,KAAK,GAAG,IAAI,MAAJ,CAAW,KAAK,IAAL,CAAU,KAArB,EAA4B,IAA5B,CAAZ;;AACA,cAAI,KAAK,OAAL,CAAa,WAAjB,EAA8B;AAC1B,gBAAI,WAAW,GAAG,KAAK,IAAL,CAAU,KAA5B;AACA,gBAAM,YAAY,GAAG,KAAK,OAAL,CAAa,WAAb,CAAyB,KAAzB,CAA+B,KAA/B,CAArB;;AACA,gBAAI,YAAY,KAAK,IAAjB,IAAyB,YAAY,CAAC,MAAb,GAAsB,CAAnD,EAAsD;AAAE,cAAA,WAAW,GAAG,YAAY,CAAC,CAAD,CAA1B;AAA8B;;AAEtF,mBAAO,KAAK,OAAL,CAAa,WAAb,CAAyB,OAAzB,CAAiC,KAAjC,4DAAwF,WAAxF,aAAP;AACH;AACJ,SAVK;AAWN,4BAAoB,4BAAW;AAC3B,cAAI,KAAK,GAAG,IAAI,MAAJ,CAAW,KAAK,IAAL,CAAU,KAArB,EAA4B,IAA5B,CAAZ;;AACA,cAAI,KAAK,OAAL,CAAa,KAAjB,EAAwB;AACpB;AACA,gBAAI,WAAW,GAAG,KAAK,IAAL,CAAU,KAA5B;AACA,gBAAM,YAAY,GAAG,KAAK,OAAL,CAAa,KAAb,CAAmB,KAAnB,CAAyB,KAAzB,CAArB;;AACA,gBAAI,YAAY,KAAK,IAAjB,IAAyB,YAAY,CAAC,MAAb,GAAsB,CAAnD,EAAsD;AAAE,cAAA,WAAW,GAAG,YAAY,CAAC,CAAD,CAA1B;AAA8B;;AAEtF,mBAAO,KAAK,OAAL,CAAa,KAAb,CAAmB,OAAnB,CAA2B,KAA3B,6DAAmF,WAAnF,aAAP;AACH;;AAED,iBAAO,KAAK,OAAL,CAAa,KAApB,CAX2B,CAWA;AAC9B,SAvBK;AAwBN,sBAAc,sBAAW;AACrB,iBAAO,KAAK,OAAL,CAAa,OAAb,GAAuB,KAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,CAA6B,eAA7B,EAA8C,gBAA9C,CAAvB,GAAyF,IAAhG;AACH,SA1BK;AA2BN,sBAAc,sBAAW;AACrB,cAAI,KAAK,UAAT,EAAqB;AACjB,mBAAO,KAAK,UAAL,CAAgB,QAAhB,CAAyB,gBAAzB,IAA6C,QAA7C,GAAwD,OAA/D;AACH;AACJ,SA/BK;AAgCN,mBAAW,mBAAW;AAClB,cAAI,SAAJ,CADkB,CAElB;AACA;AACA;AACA;AACA;;AACA,iBAAO,SAAS,GAAG,OAAH,GAAa,IAA7B;AACH,SAxCK;AAyCN,uBAAe,uBAAW;AACtB,cAAI,IAAJ,CADsB,CAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAO,IAAI,GAAG,IAAI,CAAC,SAAL,CAAe,IAAf,CAAH,GAA0B,IAArC;AACH;AA7EK,OAvBgB;AAsG1B,MAAA,QAAQ,ihDAtGkB;AAmI1B,MAAA,OAAO,EAAE;AACL,QAAA,IADK,kBACE;AACH,eAAK,IAAI,IAAT,IAAiB,MAAM,CAAC,kBAAxB,EAA4C;AACxC,gBAAI,MAAM,CAAC,kBAAP,CAA0B,IAA1B,KAAmC,KAAK,OAAL,CAAa,WAApD,EAAiE;AAC7D,mBAAK,UAAL,GAAkB,IAAlB;AACH;AACJ;AACJ,SAPI;AAQL,QAAA,YARK,0BAQU;AACX,eAAK,UAAL,GAAkB,CAAC,KAAK,UAAxB;AACH,SAVI;AAWL,QAAA,UAXK,wBAWQ;AACT,cAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,gBAAI,OAAO,GAAG,KAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,CAAmC,KAAnC,CAAyC,GAAzC,CAAd;AACA,iBAAK,MAAL,GAAc,OAAO,CAAC,MAAR,GAAiB,CAAjB,GAAqB,IAArB,GAA4B,KAA1C;AAEA,gBAAI,gBAAgB,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAgB,CAAhB,EAAmB,IAAnB,EAAvB;AACA,gBAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,CAAd,EAAiB,IAAjB,EAAlB;AAEA,iBAAK,WAAL,GAAmB,WAAnB;AACA,iBAAK,KAAL,CAAW,aAAX,CAAyB,SAAzB,aAAwC,gBAAxC,SAA2D,WAAW,IAAI,EAAf,GAAoB,EAApB,GAAyB,GAApF;AACH;AACJ;AAtBI,OAnIiB;AA2J1B,MAAA,OA3J0B,qBA2JhB;AACN;AACA,aAAK,UAAL;AAEA,YAAI,IAAI,GAAG,IAAX;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,cAAI,OAAO,GAAG,IAAI,CAAC,IAAL,CAAU,OAAxB;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,KAAK,GAAG,IAAI,CAAC,OAAL,CAAa,KAAzB;AACA,gBAAI,KAAK,GAAG,IAAI,CAAC,IAAL,CAAU,KAAtB;AACA,gBAAI,GAAG,8BAAuB,kBAAkB,CAAC,KAAD,CAAzC,gBAAsD,kBAAkB,CAAC,KAAD,CAAxE,gBAAqF,kBAAkB,CAAC,OAAD,CAAvG,CAAP;AACA,gBAAI,UAAU,GAAG,IAAI,CAAC,GAAL,CAAS,gBAAT,CAA0B,GAA1B,CAAjB;AACA,YAAA,UAAU,CAAC,OAAX,CAAmB,UAAA,EAAE;AAAA,qBAAI,EAAE,CAAC,gBAAH,CAAoB,OAApB,EAA6B,UAAC,CAAD;AAAA,uBAClD,kBAAM,GAAN,CAAU,GAAV,EACC,IADD,CACM,UAAS,QAAT,EAAmB,CACrB;AACH,iBAHD,CADkD;AAAA,eAA7B,CAAJ;AAAA,aAArB;AAMH;AACJ,SAfD;AAiBH;AAjLyB,KAA9B;;AAoLA,uBAAI,SAAJ,CAAc,iBAAd,EAAiC;AAC7B,MAAA,KAAK,EAAE,CAAC,MAAD,CADsB;AAE7B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAEH,OAL4B;AAM7B,MAAA,QAAQ,0lBANqB;AAgB7B,MAAA,OAAO,EAAE;AACL,QAAA,YADK,wBACQ,CADR,EACW;AACZ,cAAI,IAAI,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,IAAnC;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,OAAhB,CAAwB,KAApC,CAFY,CAGZ;;AACA,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC,EAAiD,KAAjD,EAAwD,IAAxD;AACH;AANI,OAhBoB;AAwB7B,MAAA,OAxB6B,qBAwBnB,CAET;AA1B4B,KAAjC;;AA6BA,uBAAI,SAAJ,CAAc,2BAAd,EAA2C;AACvC,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,aAAT,CADgC;AAEvC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,MAAM,EAAG,KAAK,WAAL,GAAmB,IAAnB,GAA0B,KADhC;AACwC;AAC3C,UAAA,eAAe,EAAE;AAFd,SAAP;AAIH,OAPsC;AAQvC,MAAA,QAAQ,EAAE;AACN,QAAA,cAAc,EAAE,0BAAW;AACvB,iBAAO,KAAK,IAAL,CAAU,QAAjB;AACH;AAHK,OAR6B;AAavC,MAAA,KAAK,EAAE,EAbgC;AAevC,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV,eAAK,eAAL;AACH,SAHI;AAKL,QAAA,eALK,6BAKa;AACd,cAAI,WAAW,GAAG,KAAK,KAAL,CAAW,cAA7B;AACA,cAAI,aAAa,GAAG,KAAK,KAAL,CAAW,cAAX,CAA0B,qBAA1B,GAAkD,MAAtE;;AAEA,cAAI,KAAK,MAAL,IAAe,IAAnB,EAAyB;AACrB,iBAAK,MAAL,GAAc,KAAd;AAEA,YAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,cAAA,qBAAqB,CAAC,YAAW;AAC7B,gBAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,eAFoB,CAArB;AAGH,aAPoB,CAArB;AASA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,aAFD;AAIH,WAhBD,MAgBO;AACH,iBAAK,MAAL,GAAc,IAAd;AACA,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,YAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,aAFD;AAGH;AACJ,SAhCI;AAiCL,QAAA,YAjCK,0BAiCU;AACX,eAAK,eAAL,GAAuB,CAAC,KAAK,eAA7B;AACH;AAnCI,OAf8B;AAoDvC,MAAA,OApDuC,qBAoD7B,CAET;AAtDsC,KAA3C;;AAyDA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,4BAAqB,EAArB,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,2BAG6B,EAH7B,GAGmC,IAHnC;AAIH,GAhtCD;;AAktCA,MAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,IAAA,MAAM,CAAC,OAAP,CAAe,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC5B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,0BAAqC,KAArC;AACA,MAAA,wBAAwB,CAAC,KAAD,CAAxB;AACH,KAHD;AAIH,GA3tCuB,CA6tCxB;AACA;AACA;AACA;AACA;;AAEH,CAnuCD;;eAquCe,a;;;;;;;;;;;AC7uCf;;AACA;;AACA;;;;AAIA,IAAM,SAAS,GAAG,SAAZ,SAAY,GAAM;AACpB,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAT,CAAwB,kBAAxB,CAApB;AACA,MAAI,CAAC,WAAL,EAAkB;AAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAZ,CAA6B,uBAA7B,CAAjB;;AAEA,MAAM,oBAAoB,GAAG,SAAvB,oBAAuB,GAAM;AAC/B,QAAI,WAAW,GAAG,CAAlB;AACA,QAAM,MAAM,GAAG,WAAW,CAAC,aAAZ,CAA0B,2BAA1B,CAAf;AACA,QAAM,MAAM,GAAG,WAAW,CAAC,aAAZ,CAA0B,2BAA1B,CAAf;AACA,QAAM,SAAS,GAAG,WAAW,CAAC,aAAZ,CAA0B,qCAA1B,CAAlB;AACA,QAAM,WAAW,GAAG,QAAQ,CAAC,MAA7B;AACA,QAAM,YAAY,GAAG,WAAW,CAAC,gBAAZ,CAA6B,OAA7B,CAArB;AACA,QAAM,aAAa,GAAG,QAAQ,CAAC,gBAAT,CAA0B,2BAA1B,CAAtB;AAEA,QAAM,MAAM,GAAG,WAAW,CAAC,aAAZ,CAA0B,4BAA1B,CAAf;AACA,QAAM,UAAU,GAAG,EAAnB,CAV+B,CAUR;;AACvB,QAAM,OAAO,GAAG,CAAhB;AACA,QAAM,MAAM,GAAG,CAAC,UAAU,GAAG,OAAd,IAAyB,CAAxC;AACA,QAAM,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC,EAAd,GAAmB,CAAzC;AAEA,QAAM,OAAO,GAAG,KAAhB,CAf+B,CAeR;;AACvB,QAAM,WAAW,GAAG,GAApB;AAEA,QAAI,cAAc,GAAQ,IAA1B;AACA,QAAI,WAAW,GAAW,CAA1B;AACA,QAAI,aAAa,GAAS,IAA1B;AACA,QAAI,iBAAiB,GAAK,IAA1B;AACA,QAAI,aAAa,GAAS,IAA1B;AACA,QAAI,WAAW,GAAW,CAA1B,CAvB+B,CAyB/B;;AACA,QAAM,qBAAqB,GAAG,SAAxB,qBAAwB,GAAY;AACtC,UAAI,YAAY,CAAC,MAAb,GAAsB,CAAtB,IAA2B,MAAM,CAAC,UAAP,IAAsB,WAArD,EACI;AACA,QAAA,WAAW,GAAG,MAAM,CAAC,UAArB,CADA,CAC4D;;AAC5D,YAAI,MAAM,CAAC,UAAP,IAAqB,GAAzB,EACI;AACA,eAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,YAAY,CAAC,MAAjC,EAAyC,CAAC,EAA1C,EACI;AACA,gBAAM,GAAG,GAAG,YAAY,CAAC,CAAD,CAAxB;AACA,gBAAM,GAAG,GAAG,GAAG,CAAC,OAAJ,CAAY,GAAxB;;AACA,gBAAI,GAAG,IAAI,MAAX,EAAmB;AAAE,cAAA,GAAG,CAAC,GAAJ,GAAU,GAAV;AAAe;AACnC;AACJ,SARL,MAUI;AACA,eAAK,IAAI,EAAC,GAAG,CAAb,EAAgB,EAAC,GAAG,YAAY,CAAC,MAAjC,EAAyC,EAAC,EAA1C,EACI;AACA,gBAAM,IAAG,GAAG,YAAY,CAAC,EAAD,CAAxB;AACA,gBAAM,IAAG,GAAG,IAAG,CAAC,OAAJ,CAAY,IAAxB;AACA,YAAA,IAAG,CAAC,GAAJ,GAAU,IAAV;AACC;AACJ;AACJ;AACR,KAvBD,CA1B+B,CAmD/B;;;AACA,QAAM,WAAW,GAAG,SAAd,WAAc,CAAU,QAAV,EAAoB;AACpC,UAAI,IAAI,GAAG,QAAQ,CAAC,gBAAT,CAA0B,OAA1B,CAAX;;AAEA,UAAI,QAAJ,EAAc;AACV,aAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,IAAI,CAAC,MAAzB,EAAiC,CAAC,EAAlC,EAAsC;AAAE,UAAA,IAAI,CAAC,CAAD,CAAJ,CAAQ,IAAR;AAAiB;AAC5D,OAFD,MAGK;AACD,aAAK,IAAI,GAAC,GAAG,CAAb,EAAgB,GAAC,GAAG,IAAI,CAAC,MAAzB,EAAiC,GAAC,EAAlC,EAAsC;AAAE,UAAA,IAAI,CAAC,GAAD,CAAJ,CAAQ,KAAR;AAAkB;AAC7D;AACJ,KATD,CApD+B,CA+D/B;;;AACA,QAAI,YAAY,CAAC,MAAb,GAAsB,CAAtB,IAA2B,aAAa,CAAC,MAAd,GAAuB,CAAtD,EAAyD;AACrD;AACA,WAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,aAAa,CAAC,MAAlC,EAA0C,CAAC,EAA3C,EAA+C;AAC3C,QAAA,aAAa,CAAC,CAAD,CAAb,CAAiB,gBAAjB,CAAkC,OAAlC,EAA2C,UAAU,CAAV,EAAa;AACpD,UAAA,WAAW,CAAC,KAAD,CAAX;AACA,UAAA,aAAa,GAAG,KAAhB;AACA,UAAA,cAAc,CAAC,aAAD,CAAd;AACH,SAJD;AAKH;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AACA,UAAM,cAAc,GAAG;AAAE,QAAA,OAAO,EAAE,IAAX;AAAiB,QAAA,UAAU,EAAE,IAA7B;AAAmC,QAAA,SAAS,EAAE;AAA9C,OAAvB;AACA,UAAM,QAAQ,GAAG,IAAI,gBAAJ,CAAqB,UAAU,YAAV,EAAwB;AAC1D,YAAM,aAAa,GAAG,QAAQ,CAAC,aAAT,CAAuB,kCAAvB,CAAtB;AAD0D;AAAA;AAAA;;AAAA;AAE1D,+BAAuB,YAAvB,8HAAqC;AAAA,gBAA1B,QAA0B;;AACjC,gBAAI,QAAQ,CAAC,IAAT,KAAkB,WAAtB,EAAmC;AAC/B,kBAAI,aAAa,IAAI,IAArB,EAA2B;AACvB,gBAAA,WAAW,CAAC,IAAD,CAAX;;AACA,oBAAI,iBAAiB,IAAI,IAAzB,EAA+B;AAC3B,kBAAA,aAAa,GAAG,IAAhB;AACA,kBAAA,aAAa,CAAC,cAAD,CAAb,CAF2B,CAEK;;AAChC,kBAAA,cAAc,CAAC,IAAD,CAAd;AACH;AACJ;AACJ;AACJ;AAbyD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc7D,OAdgB,CAAjB;AAeA,MAAA,QAAQ,CAAC,OAAT,CAAiB,QAAQ,CAAC,IAA1B,EAAgC,cAAhC;AAEH,KArG8B,CAyG/B;;;AACA,QAAM,cAAc,GAAG,SAAjB,cAAiB,GAAM;AACzB,MAAA,WAAW,IAAI,WAAf;AACA,UAAM,QAAQ,GAAG,WAAW,GAAG,OAA/B;AACA,UAAM,IAAI,GAAG,QAAQ,GAAG,aAAxB;AACA,MAAA,MAAM,CAAC,YAAP,CAAoB,kBAApB,YAA2C,IAA3C,eAAoD,aAAa,GAAG,IAApE;;AAEA,UAAI,QAAQ,IAAI,CAAhB,EAAmB;AAAE,QAAA,SAAS,CAAC,CAAD,CAAT;AAAc;AACtC,KAPD,CA1G+B,CAmH/B;;;AACA,QAAM,cAAc,GAAG,SAAjB,cAAiB,CAAU,IAAV,EAAgB;AACnC,UAAI,IAAI,KAAK,IAAb,EAAmB;AACf,QAAA,cAAc,GAAG,MAAM,CAAC,WAAP,CAAmB,YAAY;AAAE,UAAA,cAAc;AAAI,SAAnD,EAAqD,WAArD,CAAjB;AACH,OAFD,MAGK;AAAE,QAAA,aAAa,CAAC,cAAD,CAAb;AAA+B;AACzC,KALD,CApH+B,CA2H/B;;;AACA,QAAM,SAAS,GAAG,SAAZ,SAAY,CAAU,SAAV,EAAqB;AACnC,MAAA,WAAW,GAAG,CAAd;AACA,MAAA,WAAW,IAAI,SAAf;;AAEA,UAAI,WAAW,GAAG,WAAlB,EAA+B;AAAE,QAAA,WAAW,GAAG,CAAd;AAAiB;;AAClD,UAAI,WAAW,GAAG,CAAlB,EAAqB;AAAE,QAAA,WAAW,GAAG,WAAd;AAA2B;;AAElD,MAAA,WAAW,CAAC,aAAZ,CAA0B,qBAA1B,EAAiD,SAAjD,CAA2D,MAA3D,CAAkE,cAAlE;AACA,MAAA,WAAW,CAAC,aAAZ,4BAA8C,WAA9C,QAA8D,SAA9D,CAAwE,GAAxE,CAA4E,cAA5E;AACH,KATD,CA5H+B,CAsI/B;;;AACA,IAAA,MAAM,CAAC,gBAAP,CAAwB,OAAxB,EAAiC,UAAU,CAAV,EAAa;AAC1C,MAAA,CAAC,CAAC,cAAF;AACA,MAAA,SAAS,CAAC,CAAC,CAAF,CAAT;AACH,KAHD;AAIA,IAAA,MAAM,CAAC,gBAAP,CAAwB,OAAxB,EAAiC,UAAU,CAAV,EAAa;AAC1C,MAAA,CAAC,CAAC,cAAF;AACA,MAAA,SAAS,CAAC,CAAD,CAAT;AACH,KAHD;AAIA,IAAA,SAAS,CAAC,gBAAV,CAA2B,OAA3B,EAAoC,UAAU,CAAV,EAAa;AAC7C,MAAA,CAAC,CAAC,cAAF;AACA,MAAA,SAAS,CAAC,SAAV,CAAoB,MAApB,CAA2B,SAA3B;AACA,MAAA,aAAa,GAAG,CAAC,aAAjB;AACA,MAAA,cAAc,CAAC,aAAD,CAAd;AAEA,MAAA,iBAAiB,GAAG,aAApB,CAN6C,CAMV;AACtC,KAPD,EA/I+B,CAwJ/B;;AACA,IAAA,cAAc,CAAC,IAAD,CAAd,CAzJ+B,CA0J/B;;AACA,IAAA,qBAAqB;;AACrB,IAAA,MAAM,CAAC,QAAP,GAAkB,YACd;AACA,MAAA,YAAY,CAAC,aAAD,CAAZ;AACA,MAAA,aAAa,GAAG,UAAU,CAAC,qBAAD,EAAwB,IAAxB,CAA1B,CAFA,CAEqE;AACpE,KAJL;AAKH,GAjKD;;AAoKA,MAAI,WAAJ,EAAiB;AACb;AACA,QAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAAyB;AAAE,MAAA,oBAAoB;AAAK,KAApD,CACA;AADA,SAEK;AAAE,QAAA,WAAW,CAAC,aAAZ,CAA0B,kBAA1B,EAA8C,SAA9C,CAAwD,GAAxD,CAA4D,MAA5D;AAAsE;AAChF;AACJ,CA/KD;;eAiLe,S;;;;;;;;;;;ACvLf;;AACA;;AACA;;AACA;;;;AAEA,IAAM,YAAY,GAAG,SAAf,YAAe,GAAM;AACvB,qBAAI,GAAJ,CAAQ,sBAAR;;AACA,MAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAT,CAA0B,0BAA1B,CAAf;;AAEA,MAAI,uBAAuB,GAAG,SAA1B,uBAA0B,CAAC,EAAD,EAAQ;AAClC,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,KADX;AAEH,UAAA,EAAE,EAAE,IAFD;AAGH,UAAA,IAAI,EAAE;AAHH,SAAP;AAKH,OAPiC;AAQlC,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,WAAyB,KAAK,IAA9B,EAAP;AACH;AAHK,OARwB;AAalC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH;AAHE,OAb2B;AAkBlC,MAAA,OAAO,EAAE;AACL,QAAA,cADK,4BACY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,KAAK,IAFiB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SARI;AASL,QAAA,WATK,yBASS;AACV,cAAI,YAAY,GAAG,KAAK,KAAL,CAAW,YAAX,CAAwB,SAA3C;AACA,eAAK,MAAL,CAAY,IAAZ,CACI,0BAAkB,QAAlB,CAA2B,YAA3B,CADJ,EAEI,0BAAkB,IAFtB,EAGI,0BAAkB,OAHtB;AAKH;AAhBI,OAlByB;AAoClC,MAAA,OApCkC,qBAoCxB;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAA5B,GAAyC,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAArE,GAAkF,IAA5F;AAEA,aAAK,IAAL,GAAY,YAAZ;AAEA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACH;AA1CiC,KAAtC;;AA6CA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,qCAA8B,EAA9B;AADE,KAAR,EAEG,MAFH,oCAEsC,EAFtC,GAE4C,IAF5C;AAGH,GAjDD;;AAmDA,MAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAAyB;AACrB,IAAA,QAAQ,CAAC,OAAT,CAAiB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC9B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,mCAA8C,KAA9C;AACA,MAAA,uBAAuB,CAAC,KAAD,CAAvB;AACH,KAHD;AAIH;AAEJ,CA9DD;;eAgEe,Y;;;;;;;;;;;ACrEf;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,IAAM,UAAU,GAAG,SAAb,UAAa,CAAC,GAAD,EAAS;AACxB,SAAO,kBAAkB,CAAC,GAAD,CAAzB;AACH,CAFD;;AAIA,IAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AAEnB,MAAI,QAAQ,GAAG,QAAQ,CAAC,gBAAT,CAA0B,WAA1B,CAAf;;AACA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAM,mBAAmB,GAAG,SAAtB,mBAAsB,CAAC,EAAD,EAAQ;AAChC,uBAAI,SAAJ,CAAc,mBAAd,EAAmC;AAC/B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AACF,YAAA,WAAW,EAAE,CADX;AACc;AAChB,YAAA,UAAU,EAAE,IAFV;AAEgB;AAClB,YAAA,YAAY,EAAE,IAHZ;AAGkB;AACpB,YAAA,YAAY,EAAE,IAJZ;AAIkB;AACpB,YAAA,cAAc,EAAE,IALd;AAKoB;AACtB,YAAA,iBAAiB,EAAE,IANjB;AAOF,YAAA,OAAO,EAAE,EAPP;AAQF,YAAA,QAAQ,EAAE,EARR;AASF,YAAA,OAAO,EAAE,EATP;AAUF,YAAA,SAAS,EAAE,EAVT;AAUa;AACf,YAAA,cAAc,EAAE,IAXd;AAWoB;AACtB,YAAA,aAAa,EAAE,IAZb;AAYmB;AACrB,YAAA,QAAQ,EAAE,IAbR;AAcF,YAAA,UAAU,EAAE,IAdV;AAeF,YAAA,UAAU,EAAE,IAfV;AAgBF;AACA,YAAA,SAAS,EAAE,IAjBT;AAiBe;AACjB;AACA,YAAA,KAAK,EAAE,IAnBL;AAoBF,YAAA,iBAAiB,EAAE,IApBjB;AAqBF,qBAAO,UArBL;AAsBF,YAAA,YAAY,EAAE;AAtBZ,WADH;AAyBH,UAAA,SAAS,EAAE;AAzBR,SAAP;AA2BH,OA7B8B;AA8B/B,MAAA,UAAU,EAAE;AACR,qCAA6B,2BADrB;AAER,2BAAmB,0CAFX;AAGR,yBAAiB,0BAHT;AAIR,sBAAc;AAJN,OA9BmB;AAoC/B,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK;AAIN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,CAAjC,KAAuC,EAAvC,GAA4C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,KAAjC,CAAuC,CAAvC,CAA5C,GAAwF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAArH;AACH,SANK;AAON,QAAA,SAAS,EAAE,qBAAW;AAClB,cAAI,KAAK,IAAL,CAAU,YAAV,GAAyB,EAA7B,EAAiC;AAC7B,gBAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iCAAY,KAAK,IAAL,CAAU,YAAtB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAoD;AACvD,+BAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAnC,GAAkD,CAA5D,cAAiE,KAAK,IAAL,CAAU,YAA3E;AACH,aAFM,MAEA;AACH,+BAAW,KAAK,IAAL,CAAU,YAAV,IAA0B,KAAK,IAAL,CAAU,WAAV,GAAwB,CAAlD,CAAD,GAAyD,CAAnE,cAAwE,KAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,WAA3G;AACH;AACJ,WARD,MAQO;AACH,mBAAO,KAAK,IAAL,CAAU,YAAjB;AACH;AACJ,SAnBK;AAoBN,QAAA,QAAQ,EAAE,oBAAW;AACjB,iBAAO,kBAAM,KAAN,CAAY,WAAnB;AACH;AAtBK,OApCqB;AA6D/B,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,IAAL,CAAU,SAAV,GAAsB,KAAK,KAA3B,CADc,CAGd;;AACA,cAAI,KAAK,KAAL,CAAW,MAAX,IAAqB,CAAzB,EAA4B;AACxB,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,gBAFC,CAAZ;;AAGA,gBAAI,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZ,mBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ;AACJ,SAbE;AAcH,QAAA,gBAAgB,EAAE,4BAAW;AACzB,eAAK,IAAL,CAAU,QAAV,GAAqB,KAAK,gBAA1B;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,gBAAN,GAAyB,IAAzB,GAAgC,KAAK,IAAL,CAAU,cAArE;AACH,SAjBE;AAkBH,wBAAgB,uBAAW;AAAA;;AACvB,eAAK,UAAL;AACA,eAAK,UAAL,GAFuB,CAEJ;AACnB;AACA;AAEA;;AACA,cAAI,YAAY,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AAC9C,mBAAO,EAAE,CAAC,IAAH,IAAW,aAAlB;AACH,WAFkB,EAEhB,GAFgB,CAEZ,UAAA,EAAE,EAAI;AACT,mBAAO,EAAE,CAAC,KAAV;AACH,WAJkB,CAAnB,CAPuB,CAavB;;AACA,cAAI,SAAS,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,mBAAO,IAAI,CAAC,IAAL,IAAa,eAApB;AACH,WAFe,CAAhB;AAGA,eAAK,IAAL,CAAU,aAAV,GAA0B,SAAS,GAAG,SAAS,CAAC,KAAb,GAAqB,IAAxD;;AAGA,cAAI,YAAY,CAAC,MAAb,GAAsB,CAA1B,EAA6B;AACzB,iBAAK,gBAAL,CAAsB,YAAtB;AACH,WAFD,MAEO;AACH;AACA,iBAAK,IAAL,CAAU,QAAV,GAAqB,EAArB,CAFG,CAGH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,UAAA,EAAE,EAAI;AAC3B,qBAAO,EAAE,CAAC,IAAH,IAAW,SAAlB;AACH,aAFD,EAEG,OAFH,CAEW,UAAA,IAAI,EAAI;AACf,cAAA,KAAI,CAAC,YAAL,CAAkB,KAAI,CAAC,IAAL,SAAlB,EAAmC,IAAI,CAAC,KAAxC;AACH,aAJD;AAKH;AACJ,SAlDE;AAmDH,4BAAoB,2BAAW;AAC3B,cAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,CAA7B,EAAgC;AAC5B,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACH,WAHD,MAGO,IAAI,KAAK,IAAL,CAAU,WAAV,IAAyB,KAAK,IAAL,CAAU,UAAvC,EAAmD;AACtD,iBAAK,IAAL,CAAU,UAAV,GAAuB,KAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAHM,MAGA;AACH,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACA,iBAAK,IAAL,CAAU,UAAV,GAAuB,IAAvB;AACH,WAV0B,CAY3B;AACA;;AACH,SAjEE;AAkEH,6BAAqB,4BAAW;AAC5B,eAAK,SAAL;AACH;AApEE,OA7DwB;AAmI/B,MAAA,OAAO,EAAE;AACL,QAAA,aADK,2BACW;AACZ;AACA,cAAI,KAAK,IAAL,CAAU,QAAd,EAAwB;AACpB;AACA,iBAAK,IAAL,CAAU,cAAV,GAA2B,CAAC,KAAK,IAAL,CAAU,cAAtC;AACH;AACJ,SAPI;AAQL,QAAA,aARK,yBAQS,EART,EAQa,CARb,EAQgB,IARhB,EAQsB;AACvB,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AAED,cAAI,IAAI,GAAG,IAAX;AACA,cAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,aAAF,CAAgB,KAAjB,CAAtB;AACA,cAAI,KAAK,GAAG,CAAC,CAAC,aAAF,CAAgB,UAAhB,CAA2B,SAAvC;AACA,cAAI,OAAO,GAAG,CAAC,CAAC,aAAF,CAAgB,OAA9B;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CATuB,CASG;AAC1B;AACA;AACA;AACA;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,IAAI,KAAK,eAAb,EAA8B;AAC1B,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,KAAV;AAAiB,wBAAQ,IAAzB;AAA+B,wBAAQ;AAAvC,eAA3C;AACH,aAFD,MAEO;AACH,mBAAK,IAAL,CAAU,OAAV,gCAAwB,KAAK,IAAL,CAAU,OAAlC,IAA2C;AAAC,yBAAS,OAAV;AAAmB,wBAAQ,IAA3B;AAAiC,wBAAQ;AAAzC,eAA3C;AACH;AACJ,WAND,MAMO;AACH,gBAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,qBAAO,CAAC,CAAC,KAAT;AACH,aAFW,EAET,OAFS,CAED,KAFC,CAAZ,CADG,CAIH;;AACA,iBAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH;AACJ,SApCI;AAqCL;AACA,QAAA,YAtCK,wBAsCQ,EAtCR,EAsCY,KAtCZ,EAsCmB,IAtCnB,EAsCyB;AAC1B,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AACxB;AACH;;AACD,cAAI,KAAK,GAAG,KAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,CAAD,EAAO;AACrC,mBAAO,CAAC,CAAC,KAAT;AACH,WAFW,EAET,OAFS,CAED,KAFC,CAAZ;AAGA,eAAK,IAAL,CAAU,OAAV,CAAkB,MAAlB,CAAyB,KAAzB,EAA+B,CAA/B;AACH,SA9CI;AA+CL;AACA,QAAA,SAhDK,uBAgDO;AACR,eAAK,IAAL,CAAU,OAAV,GAAoB,EAApB;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,CAAxB,CAFQ,CAEmB;AAC9B,SAnDI;AAoDL,QAAA,gBApDK,4BAoDY,YApDZ,EAoD0B;AAC3B,cAAI,cAAc,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAb,CAAkB,GAAlB,CAAD,CAAvC,CAD2B,CAE3B;;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,cAArB;AACA,cAAI,MAAM,oCAAV,CAJ2B,CAK3B;;AACA,cAAI,IAAI,GAAG,IAAX;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAkB;AACV,YAAA,MAAM,EAAE;AACJ,cAAA,KAAK,EAAE,cADH;AAEJ,cAAA,IAAI,EAAE,KAAK;AAFP;AADE,WAAlB,EAMK,IANL,CAMU,UAAS,QAAT,EAAmB;AACrB;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,QAAV,GAAqB,QAAQ,CAAC,IAAT,CAAc,OAAnC;AACH,WATL,WAUW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,WAZL;AAaH,SAzEI;AA2EL,QAAA,UA3EK,sBA2EM,CA3EN,EA2ES;AACV,cAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAnB;AACA,cAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAA1B;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC;AACA,UAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,UAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACA,UAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,mBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,WAAnC,EANU,CAOV;;AACA,cAAI,KAAJ;;AACA,cAAI,CAAC,CAAC,MAAN,EAAc;AACV,YAAA,KAAK,GAAG,CAAC,CAAC,MAAF,CAAS,SAAjB;AACH,WAFD,MAEO;AACH,YAAA,KAAK,GAAG,CAAR;AACH,WAbS,CAcV;;;AACA,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAlB,CAfU,CAgBV;;AACA,UAAA,QAAQ,CAAC,aAAT,CAAuB,4BAAvB,EAAqD,KAArD,GAA6D,KAA7D;AACA,eAAK,UAAL;AACA,eAAK,UAAL;AACH,SA/FI;AAiGL,QAAA,UAjGK,sBAiGM,KAjGN,EAiGa;AAAA;;AAEd;AACA,eAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,KAAK,GAAG,KAAH,GAAW,KAAK,IAAL,CAAU,KAApE;AACA,eAAK,IAAL,CAAU,WAAV,GAAwB,KAAK,GAAG,CAAH,GAAO,KAAK,IAAL,CAAU,WAA9C,CAJc,CAKd;;AACA,cAAI,OAAO,GAAG,MAAM,CAAC,cAArB;AACA,cAAI,MAAM,aAAM,OAAN,SAAgB,OAAO,CAAC,OAAR,CAAgB,GAAhB,IAAuB,CAAC,CAAxB,GAA4B,EAA5B,GAAiC,GAAjD,CAAV,CAPc,CAQd;AACA;;AAEA,cAAI,IAAI,GAAG,IAAX;;AAEA,cAAI,wBAAwB,GAAG,SAA3B,wBAA2B,GAAM;AACjC,gBAAI,SAAS,GAAG,MAAI,CAAC,IAAL,CAAU,OAAV,CAAkB,IAAlB,CAAuB,UAAA,IAAI,EAAI;AAC3C,qBAAO,IAAI,CAAC,IAAL,IAAa,eAApB;AACH,aAFe,CAAhB;;AAGA,gBAAI,SAAJ,EAAe;AACX,qBAAO,IAAP;AACH,aAFD,MAEO;AACH,qBAAO,KAAP;AACH;AACJ,WATD;;AAWA,cAAI,OAAO,GAAG,EAAd;AACA,cAAI,IAAI,GAAG,EAAX;AACA,cAAI,WAAW,GAAG,EAAlB;AACA,cAAI,YAAY,GAAG,EAAnB;AAEA,eAAK,IAAL,CAAU,OAAV,CAAkB,GAAlB,CAAsB,UAAC,IAAD,EAAU;AAC5B,oBAAO,IAAI,CAAC,IAAZ;AACI,mBAAK,SAAL;AACI,gBAAA,OAAO,CAAC,IAAR,CAAa,IAAI,CAAC,KAAlB;AACA;;AACJ,mBAAK,MAAL;AACI,gBAAA,IAAI,CAAC,IAAL,CAAU,IAAI,CAAC,KAAf;AACA;;AACJ,mBAAK,aAAL;AACI,gBAAA,WAAW,CAAC,IAAZ,CAAiB,IAAI,CAAC,KAAtB;AACA;;AACJ,mBAAK,cAAL;AACI,gBAAA,YAAY,CAAC,IAAb,CAAkB,IAAI,CAAC,KAAvB;AACA;;AACJ;AACI;AAdR;AAgBH,WAjBD;AAmBA,cAAI,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAR,CAAa,GAAb,CAAD,CAAnC;AACA,cAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAL,CAAU,GAAV,CAAD,CAAhC;AACA,cAAI,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAZ,CAAiB,GAAjB,CAAD,CAAvC;AACA,cAAI,eAAe,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAb,CAAkB,GAAlB,CAAD,CAAxC;AAEA,cAAI,WAAW,GAAG;AACd,YAAA,CAAC,EAAE,KAAK,IAAL,CAAU,KAAV,GAAkB,KAAK,IAAL,CAAU,KAA5B,GAAoC,IADzB;AAEd,YAAA,KAAK,EAAE,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,KAAiC,EAAjC,GAAsC,IAAtC,GAA6C,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,MAA9B,CAAqC,CAArC,KAA2C,GAA3C,GAAiD,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,EAA8B,KAA9B,CAAoC,CAApC,CAAjD,GAA0F,KAAK,IAAL,CAAU,SAAV,CAAoB,IAApB,CAAyB,GAAzB,CAFhI;AAE+J;AAC7K,YAAA,OAAO,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAHrB;AAId,YAAA,QAAQ,EAAE,OAAO,IAAI,EAAX,GAAgB,IAAhB,GAAuB,OAJnB;AAKd,YAAA,WAAW,EAAE,cAAc,IAAI,EAAlB,GAAuB,IAAvB,GAA8B,cAL7B;AAMd,YAAA,YAAY,EAAE,eAAe,IAAI,EAAnB,GAAwB,IAAxB,GAA+B,eAN/B;AAOd,YAAA,aAAa,EAAE,wBAAwB,EAPzB;AAQd,YAAA,IAAI,EAAE,KAAK,IAAL,CAAU,WARF;AASd,YAAA,IAAI,EAAE,KAAK,QAAL,GAAgB,KAAK,QAArB,GAAgC,MAAM,CAAC;AAT/B,WAAlB,CArDc,CAiEd;;AACA,cAAI,UAAU,GAAG,KAAK,IAAL,CAAU,KAA3B;;AAEA,4BAAM,GAAN,CAAU,MAAV,EAAiB;AACT,YAAA,MAAM,oBACC,WADD;AADG,WAAjB,EAKK,IALL,CAKU,UAAS,QAAT,EAAmB;AACrB;AAC5B;AAC4B;AACA;AACA,gBAAI,YAAJ,EAAkB,mBAAlB;;AACA,gBAAI,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAAtB,IAAgC,CAApC,EAAuC;AACnC,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACH,aAHD,MAIK;AAED,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAAtB;AACH;;AAED,gBAAI,QAAQ,CAAC,IAAT,CAAc,UAAd,IAA4B,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,MAAzB,GAAkC,CAAlE,EACA;AAAA,kBAwBgB,OAxBhB;;AAAA;AACI,oBAAI,WAAW,GAAG,EAAlB;AACA,gBAAA,QAAQ,CAAC,IAAT,CAAc,UAAd,CAAyB,OAAzB,CAAiC,UAAA,GAAG,EAAI;AACpC,sBAAI,aAAa,GAAG,QAAQ,CAAC,aAAT,CAAuB,GAAvB,CAApB;AACA,kBAAA,aAAa,CAAC,IAAd,GAAmB,GAAnB;AACA,kBAAA,aAAa,CAAC,SAAd,GAA0B,GAA1B;AACA,kBAAA,aAAa,CAAC,gBAAd,CAA+B,OAA/B,EAAwC,UAAU,CAAV,EAAa;AACjD,oBAAA,CAAC,CAAC,eAAF;AACA,oBAAA,IAAI,CAAC,UAAL,CAAgB,aAAa,CAAC,SAA9B;AACH,mBAHD;AAIA,kBAAA,WAAW,CAAC,IAAZ,CAAiB,aAAjB;AACH,iBATD,EAFJ,CAaI;;AACA,gBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,MAAM,EAAI;AAC3B,yBAAO,MAAM,CAAC,UAAd,EAA0B;AACtB,oBAAA,MAAM,CAAC,WAAP,CAAmB,MAAM,CAAC,UAA1B;AACH;AACJ,iBAJD,EAdJ,CAmBI;;AAnBJ,2CAqBa,CArBb;AAsBQ,kBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE;AAAA,2BAAI,EAAE,CAAC,MAAH,CAAU,WAAW,CAAC,CAAD,CAArB,CAAJ;AAAA,mBAAvB;;AACA,sBAAI,CAAC,GAAG,CAAJ,GAAQ,WAAW,CAAC,MAAxB,EAAgC;AACxB,oBAAA,OAAO,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CADc;AAE5B,oBAAA,OAAO,CAAC,KAAR,CAAc,WAAd,GAA4B,KAA5B;AAEA,oBAAA,YAAY,CAAC,OAAb,CAAqB,UAAA,EAAE;AAAA,6BAAI,EAAE,CAAC,MAAH,CAAU,OAAV,CAAJ;AAAA,qBAAvB;AACH;AA5BT;;AAqBI,qBAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAC,WAAW,CAAC,MAA9B,EAAsC,CAAC,EAAvC,EAA2C;AAAA,wBAAlC,CAAkC;AAQ1C;;AACD,gBAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,yBAAI,OAAO,CAAC,SAAR,CAAkB,GAAlB,CAAsB,MAAtB,CAAJ;AAAA,iBAAnC;AA9BJ;AAgCC,aAjCD,MAiCO;AACH,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;AACH,aAnDoB,CAoDrB;AACA;AACA;AAEA;;;AACA,gBAAI,UAAU,IAAI,UAAU,CAAC,MAAX,GAAoB,CAAlC,IACA,MAAM,CAAC,SAAP,CAAiB,MAAM,CAAC,SAAP,CAAiB,MAAjB,GAAwB,CAAzC,EAA4C,KAA5C,IAAqD,gBADzD,CAC0E;AAD1E,cAEM;AAAE;AACJ,gBAAA,MAAM,CAAC,SAAP,CAAiB,IAAjB,CAAuB;AACnB,kBAAA,KAAK,EAAE,gBADY;AAEnB,kBAAA,IAAI,EAAE,UAFa;AAGnB,kBAAA,QAAQ,EAAE,QAHS;AAInB,kBAAA,MAAM,EAAE,UAJW;AAKnB,kBAAA,KAAK,EAAE,QAAQ,CAAC,IAAT,CAAc;AALF,iBAAvB;AAOH;;AAED,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,YAAvC;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,YAAV,GAAyB,QAAQ,CAAC,IAAT,CAAc,OAAd,CAAsB,MAA/C;AACA,YAAA,IAAI,CAAC,IAAL,CAAU,OAAV,GAAoB,QAAQ,CAAC,IAAT,CAAc,OAAlC;AAEA,YAAA,IAAI,CAAC,aAAL;AACH,WAhFL,WAiFW,UAAS,KAAT,EAAgB;AACnB,YAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACA,YAAA,IAAI,CAAC,aAAL;AAEH,WArFL;AAsFH,SA3PI;AA4PL,QAAA,UA5PK,sBA4PM,GA5PN,EA4PW;AACZ,cAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA/C,EAAkD;AAC9C,iBAAK,IAAL,CAAU,WAAV;AACH,WAFD,MAEO,IAAI,GAAG,IAAI,MAAP,IAAiB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAAzD,EAAqE;AACxE,iBAAK,IAAL,CAAU,WAAV;AACH,WAFM,MAEA;AACH;AACH;;AACD,+BAAS,KAAT,CAAe,eAAf,EAAgC,KAAK,IAAL,SAAhC;;AACA,eAAK,UAAL;AACA,eAAK,UAAL;AACH,SAvQI;AAyQL,QAAA,WAzQK,uBAyQO,EAzQP,EAyQW;AACZ,cAAI,EAAE,KAAK,KAAK,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AACrC,cAAI,GAAG,GAAG,KAAK,GAAL,CAAS,aAAT,CAAuB,uBAAvB,EAAgD,qBAAhD,GAAwE,GAAxE,GAA8E,MAAM,CAAC,OAArF,GAA+F,GAAzG,CAFY,CAGZ;;AACA,UAAA,UAAU,CAAC,YAAW;AAClB,YAAA,MAAM,CAAC,QAAP,CAAgB;AACZ,cAAA,GAAG,EAAE,GADO;AAEZ,cAAA,QAAQ,EAAE;AAFE,aAAhB;AAIH,WALS,EAKP,GALO,CAAV;AAMH,SAnRI;AAoRL,QAAA,SApRK,uBAoRO;AACR;AACA;AACA;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,IAAI,CAAC,IAAL,CAAU,KAAK,IAAL,CAAU,YAAV,GAAyB,EAAnC,CAAvB;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,CAA1B,GAA8B,IAA9B,GAAqC,KAA5D;AACA,eAAK,IAAL,CAAU,UAAV,GAAuB,KAAK,IAAL,CAAU,WAAV,KAA0B,KAAK,IAAL,CAAU,UAApC,GAAiD,IAAjD,GAAwD,KAA/E;AACH,SA3RI;AA4RL,QAAA,UA5RK,wBA4RQ;AACT,eAAK,SAAL,GAAiB,IAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,aAAT,CAAuB,sCAAvB,CAAjB;AACA,UAAA,UAAU,CAAC,SAAX,CAAqB,GAArB,CAAyB,SAAzB;AACH,SAjSI;AAkSL,QAAA,aAlSK,2BAkSW;AACZ,eAAK,SAAL,GAAiB,KAAjB;AAEA,cAAI,UAAU,GAAG,QAAQ,CAAC,aAAT,CAAuB,sCAAvB,CAAjB;AACA,UAAA,UAAU,CAAC,SAAX,CAAqB,MAArB,CAA4B,SAA5B;AACH,SAvSI;AAwSL,QAAA,IAxSK,kBAwSE;AAAA;;AACH,eAAK,IAAL,CAAU,QAAV,GAAqB,kBAAM,KAAN,CAAY,QAAjC;AACA,eAAK,IAAL,CAAU,SAAV,GAAsB,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,CAAjC,KAAuC,EAAvC,GAA4C,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAAtB,CAAiC,KAAjC,CAAuC,CAAvC,CAA5C,GAAwF,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAApI;AACA,eAAK,IAAL,CAAU,cAAV,GAA2B,KAAK,IAAL,CAAU,QAAV,GAAqB,KAArB,GAA6B,IAAxD,CAHG,CAG2D;AAC9D;;AACA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,CAAL,EAAQ,IAAR,EAAiB;AAC3C,YAAA,MAAI,CAAC,aAAL,CAAmB,EAAnB,EAAuB,CAAvB,EAA0B,IAA1B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAK,KAAL,EAAY,IAAZ,EAAqB;AAC/C,YAAA,MAAI,CAAC,YAAL,CAAkB,EAAlB,EAAsB,KAAtB,EAA6B,IAA7B;AACH,WAFD;;AAGA,+BAAS,GAAT,CAAa,gBAAb,EAA+B,UAAC,EAAD,EAAK,GAAL,EAAa;AACxC,gBAAI,EAAE,KAAK,MAAI,CAAC,IAAL,SAAX,EAA4B;AAAC;AAAQ;;AAAA;AACrC,YAAA,MAAI,CAAC,IAAL,CAAU,WAAV,GAAwB,GAAxB;;AACA,YAAA,MAAI,CAAC,UAAL;;AACA,YAAA,MAAI,CAAC,UAAL;AACH,WALD;;AAMA,+BAAS,GAAT,CAAa,iBAAb,EAAgC,UAAC,KAAD,EAAQ,IAAR,EAAiB;AAC7C,gBAAI,IAAI,IAAI,UAAZ,EAAwB;AACpB,kBAAI,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,wBAA1B,CAAnB;AACA,kBAAI,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,6DAA1B,CAA1B;AACA,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;AACA,cAAA,YAAY,GAAG,QAAQ,CAAC,gBAAT,CAA0B,aAA1B,CAAf;AACA,cAAA,mBAAmB,GAAG,QAAQ,CAAC,gBAAT,CAA0B,kDAA1B,CAAtB;AACA,cAAA,mBAAmB,CAAC,OAApB,CAA4B,UAAA,OAAO;AAAA,uBAAI,OAAO,CAAC,SAAR,CAAkB,MAAlB,CAAyB,MAAzB,CAAJ;AAAA,eAAnC;;AACA,cAAA,MAAI,CAAC,UAAL;;AAEA,cAAA,MAAI,CAAC,UAAL,CAAgB,KAAhB;AACH;AACJ,WAZD;;AAaA,+BAAS,GAAT,CAAa,eAAb,EAA8B,UAAC,EAAD,EAAQ;AAClC,YAAA,MAAI,CAAC,WAAL,CAAiB,EAAjB;AACH,WAFD,EA9BG,CAiCH;;;AACA,eAAK,IAAL,CAAU,OAAV,GAAoB,MAAM,CAAC,yBAAP,CAAiC,OAArD;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,yBAAP,CAAiC,YAA1D;AACA,eAAK,IAAL,CAAU,YAAV,GAAyB,MAAM,CAAC,yBAAP,CAAiC,OAAjC,CAAyC,MAAlE;AACA,eAAK,IAAL,CAAU,iBAAV,GAA8B,MAAM,CAAC,yBAAP,CAAiC,iBAA/D,CArCG,CAuCH;AACA;AACA;AACA;;AAEA,eAAK,IAAL,CAAU,iBAAV,GAA8B,QAAQ,CAAC,KAAK,IAAL,CAAU,YAAX,CAAR,IAAoC,EAApC,GAAyC,KAAzC,GAAiD,IAA/E,CA5CG,CA8CH;AACA;AACA;AACH;AAzVI,OAnIsB;AA8d/B,MAAA,OA9d+B,qBA8drB;AACN,aAAK,IAAL;AACA,aAAK,SAAL,GAFM,CAGN;AACA;AACA;AACA;AACA;AACA;AACH;AAve8B,KAAnC;;AA0eA,uBAAI,SAAJ,CAAc,mBAAd,EAAmC;AAC/B,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,UAAT,CADwB;AAE/B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OAN8B;AAO/B,MAAA,UAAU,EAAE;AACR,yBAAiB;AADT,OAPmB;AAU/B,MAAA,QAAQ,gSAVuB;AAe/B,MAAA,OAAO,EAAE,EAfsB;AAkB/B,MAAA,OAlB+B,qBAkBrB,CAET;AApB8B,KAAnC,EA3egC,CAkgBhC;;;AACA,uBAAI,SAAJ,CAAc,uBAAd,EAAuC;AACnC,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,WAAT,CAD4B;AAEnC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,IAAI,EAAE;AADH,SAAP;AAGH,OANkC;AAOnC,MAAA,QAAQ,2QAP2B;AAYnC,MAAA,OAAO,EAAE,EAZ0B;AAenC,MAAA,OAfmC,qBAezB,CAET;AAjBkC,KAAvC,EAngBgC,CAuhBhC;;;AACA,uBAAI,SAAJ,CAAc,uBAAd,EAAuC;AACnC,MAAA,KAAK,EAAE,CAAC,MAAD,EAAS,SAAT,EAAoB,WAApB,CAD4B;AAEnC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH;AACA,UAAA,YAAY,EAAE,KAFX;AAGH,UAAA,EAAE,EAAE;AAHD,SAAP;AAKH,OARkC;AASnC,MAAA,QAAQ,EAAE;AACN,QAAA,KAAK,EAAE,iBAAW;AACd,iBAAO,kBAAM,KAAN,CAAY,SAAZ,CAAsB,UAA7B;AACH,SAHK;AAIN,QAAA,WAAW,EAAE,uBAAW;AACpB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,KADU;AAElB,wBAAY,KAAK,OAAL,CAAa,YAFP;AAGlB,qBAAS,KAAK,OAAL,CAAa,IAHJ;AAIlB,2BAAe,KAAK,OAAL,CAAa,OAJV;AAKlB,wBAAY,KAAK,OAAL,CAAa,SAAb,CAAuB,QAAvB;AALM,WAAf,CAAP;AAOH;AAZK,OATyB;AAuBnC,MAAA,KAAK,EAAE;AACH,QAAA,KAAK,EAAE,iBAAW;AACd,eAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,CAAoB,KAAK,EAAzB,IAA+B,IAA/B,GAAsC,KAA1D;AACH,SAHE;AAIH,mBAAW,mBAAW;AAAA;;AAClB,eAAK,SAAL,CAAe,YAAM;AACjB;AACA,YAAA,MAAI,CAAC,EAAL,GAAU,MAAI,CAAC,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC;AACA,YAAA,MAAI,CAAC,YAAL,GAAoB,MAAI,CAAC,KAAL,CAAW,QAAX,WAAuB,MAAI,CAAC,EAA5B,KAAoC,IAApC,GAA2C,KAA/D;AACA,YAAA,OAAO,CAAC,GAAR,CAAY,iDAAZ,EAA+D,MAA/D;AACH,WALD;AAMH;AAXE,OAvB4B;AAoCnC,MAAA,QAAQ,mhFApC2B;AA+DnC,MAAA,OAAO,EAAE;AACL,QAAA,cADK,4BACY;AACb,4BAAM,MAAN,CAAa,iBAAb,EAAgC;AAC5B,YAAA,EAAE,EAAE,KAAK,EADmB;AAE5B,YAAA,IAAI,EAAE,YAFsB;AAG5B,YAAA,MAAM,EAAE,KAAK,YAAL,GAAoB,QAApB,GAA+B;AAHX,WAAhC;;AAKA,4BAAM,QAAN,CAAe,gBAAf;AACH,SARI;AASL;AACA;AACA;AACA;AACA;AACA;AACA,QAAA,YAfK,0BAeU;AACX,eAAK,MAAL,CAAY,IAAZ,CACI,0BAAkB,QAAlB,CAA2B,KAAK,OAAL,CAAa,YAAxC,CADJ,EAEI,0BAAkB,IAFtB,EAGI,0BAAkB,OAHtB;AAKH;AArBI,OA/D0B;AAsFnC,MAAA,OAtFmC,qBAsFzB;AACN,aAAK,EAAL,GAAU,KAAK,KAAL,CAAW,QAAX,CAAoB,OAApB,CAA4B,UAAtC,CADM,CAEN;;AACA,aAAK,YAAL,GAAoB,KAAK,KAAL,CAAW,QAAX,WAAuB,KAAK,EAA5B,KAAoC,IAApC,GAA2C,KAA/D,CAHM,CAIN;;AACA,YAAI,IAAI,GAAG,IAAX;AACA,aAAK,SAAL,CAAe,YAAM;AACjB,cAAI,OAAO,GAAG,IAAI,CAAC,IAAL,CAAU,OAAxB;;AAEA,cAAI,OAAJ,EAAa;AACT,gBAAI,KAAK,GAAG,IAAI,CAAC,OAAL,CAAa,KAAzB;AACA,gBAAI,KAAK,GAAG,IAAI,CAAC,IAAL,CAAU,KAAtB;AACA,gBAAI,GAAG,8BAAuB,kBAAkB,CAAC,KAAD,CAAzC,gBAAsD,kBAAkB,CAAC,KAAD,CAAxE,gBAAqF,kBAAkB,CAAC,OAAD,CAAvG,CAAP;AACA,gBAAI,UAAU,GAAG,IAAI,CAAC,GAAL,CAAS,gBAAT,CAA0B,GAA1B,CAAjB;AACA,YAAA,UAAU,CAAC,OAAX,CAAmB,UAAA,EAAE;AAAA,qBAAI,EAAE,CAAC,gBAAH,CAAoB,OAApB,EAA6B,UAAC,CAAD;AAAA,uBAClD,kBAAM,GAAN,CAAU,GAAV,EACC,IADD,CACM,UAAS,QAAT,EAAmB,CACrB;AACH,iBAHD,CADkD;AAAA,eAA7B,CAAJ;AAAA,aAArB;AAMH;AACJ,SAfD;AAiBH;AA7GkC,KAAvC;;AAgHA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,sBAAe,EAAf,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,qBAGuB,EAHvB,GAG6B,IAH7B;AAIH,GA5oBD;;AA8oBA,MAAI,QAAQ,CAAC,MAAT,GAAkB,CAAtB,EAAyB;AACrB,IAAA,QAAQ,CAAC,OAAT,CAAiB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC9B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,oBAA+B,KAA/B;AACA,MAAA,mBAAmB,CAAC,KAAD,CAAnB;AACH,KAHD;AAIH;AAEJ,CA1pBD;;eA4pBe,Q;;;;;;;;;;;ACzqBf;;AACA;;AACA;;;;AAEA;AAEI;AAEA;AACI,IAAM,kBAAkB,GAAG,SAArB,kBAAqB,GAAM;AAC7B,qBAAI,SAAJ,CAAc,qBAAd,EAAqC;AACjC,IAAA,KAAK,EAAE,CAAC,cAAD,CAD0B;AAEjC,IAAA,IAAI,EAAE,gBAAW;AACb,aAAO;AACH,QAAA,YAAY,EAAE,kBAAM,KAAN,CAAY,KADvB;AAEH,QAAA,OAAO,EAAE,EAFN;AAGH,QAAA,WAAW,EAAE,EAHV;AAIH,QAAA,SAAS,EAAE,EAJR;AAKH,QAAA,KAAK,EAAE,iBALJ;AAMH,QAAA,YAAY,EAAE,EANX;AAOH,QAAA,QAAQ,EAAE,IAPP;AAQH,QAAA,MAAM,EAAE;AARL,OAAP;AAUH,KAbgC;AAcjC,IAAA,QAAQ,EAAE;AACN,MAAA,YAAY,EAAE,wBAAW;AACrB,eAAO,kBAAM,KAAN,CAAY,KAAnB;AACH,OAHK;AAIN,MAAA,WAAW,EAAE,uBAAW;AACpB,eAAO,IAAI,CAAC,SAAL,CAAe;AAClB,kBAAQ,KADU;AAElB,sBAAY,UAFM;AAGlB,oBAAU,gBAHQ;AAIlB,mBAAS,KAAK,YAAL,GAAoB,KAAK,YAAzB,GAAwC;AAJ/B,SAAf,CAAP;AAMH;AAXK,KAduB;AA2BjC,IAAA,KAAK,EAAE;AACH,MAAA,YAAY,EAAE,wBAAW;AACrB,aAAK,YAAL,GAAoB,KAAK,YAAzB;AACA,aAAK,SAAL;AACH;AAJE,KA3B0B;AAiCjC,IAAA,OAAO,EAAE;AACL,MAAA,WADK,yBACS;AACV,0BAAM,MAAN,CAAa,UAAb;AACH,OAHI;AAKL,MAAA,SALK,uBAKO;AACR,aAAK,SAAL,GAAiB,KAAK,YAAL,IAAqB,IAArB,GAA4B,KAAK,OAAjC,GAA2C,KAAK,WAAjE;AACA,aAAK,YAAL,GAAoB,KAAK,YAAL,IAAqB,IAArB,GAA4B,KAAK,WAAjC,GAA+C,KAAK,OAAxE;AACH,OARI;AAUL,MAAA,aAVK,2BAUW;AACZ,aAAK,KAAL,CAAW,QAAX,CAAoB,OAApB;AACH;AAZI,KAjCwB;AA+CjC,IAAA,OA/CiC,qBA+CvB;AAAA;;AACN;AACA,WAAK,OAAL,GAAe,KAAK,KAAL,CAAW,WAAX,CAAuB,OAAvB,CAA+B,OAA9C;AACA,WAAK,WAAL,GAAmB,KAAK,KAAL,CAAW,WAAX,CAAuB,OAAvB,CAA+B,WAAlD;AACA,WAAK,SAAL;;AACA,2BAAS,GAAT,CAAa,YAAb,EAA2B,UAAC,KAAD,EAAW;AAClC,QAAA,KAAI,CAAC,MAAL,GAAc,KAAd;AACH,OAFD;AAIH;AAxDgC,GAArC;AA0DH,CA3DD;;;;AA6DA,IAAM,iBAAiB,GAAG,SAApB,iBAAoB,GAAM;AAC5B,qBAAI,SAAJ,CAAc,0BAAd,EAA0C;AACtC,IAAA,KAAK,EAAE,CAAC,WAAD,EAAc,cAAd,EAA8B,cAA9B,EAA8C,QAA9C,CAD+B;AAEtC,IAAA,IAAI,EAAE,gBAAW;AACb,aAAO;AACH,QAAA,WAAW,EAAE,IADV,CAEH;;AAFG,OAAP;AAIH,KAPqC;AAQtC,IAAA,OAAO,EAAE;AACL,MAAA,OADK,qBACK;AACN,YAAI,WAAW,GAAG,KAAK,KAAL,CAAW,YAA7B;AACA,YAAI,aAAa,GAAG,KAAK,WAAzB;;AAEA,YAAI,KAAK,MAAL,IAAe,IAAnB,EAAyB;AACrB;AACA,+BAAS,KAAT,CAAe,YAAf,EAA6B,KAA7B;;AAEA,UAAA,qBAAqB,CAAC,YAAW;AAC7B;AACA,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C,CAF6B,CAG7B;;AACA,YAAA,qBAAqB,CAAC,YAAW;AAC7B,cAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,KAA9B;AACH,aAFoB,CAArB;AAGH,WAPoB,CAArB;AASA,UAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,GAA9B;AACH,WAFD;AAIH,SAjBD,MAiBO;AACH;AACA,+BAAS,KAAT,CAAe,YAAf,EAA6B,IAA7B;;AACA,UAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,aAAa,GAAG,IAA9C;AACA,UAAA,WAAW,CAAC,gBAAZ,CAA6B,eAA7B,EAA8C,YAAM;AAChD,YAAA,WAAW,CAAC,KAAZ,CAAkB,SAAlB,GAA8B,MAA9B;AACH,WAFD;AAGH;AACJ;AA9BI,KAR6B;AAwCtC,IAAA,OAxCsC,qBAwC5B;AACN,WAAK,WAAL,GAAmB,KAAK,KAAL,CAAW,QAAX,CAAoB,qBAApB,GAA4C,MAA/D;AACH;AA1CqC,GAA1C;AA4CH,CA7CD,C,CAgDA;AACA;AACA;AACA;AACJ;AAEA;AACA;AACA;AACA;AACA;AACA;AAEJ;AAEA;;;;;;;;;;;;;ACrIA;;AACA;;AACA;;;;AAEA,IAAM,cAAc,GAAG,SAAjB,cAAiB,GAAM;AAEzB,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAT,CAA0B,+BAA1B,CAAd;;AAEA,MAAI,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,EAAD,EAAQ;AAC3B,uBAAI,SAAJ,CAAc,yBAAd,EAAyC;AACrC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,YAAY,EAAE,IADX;AAEH,UAAA,UAAU,EAAE,IAFT;AAGH,UAAA,WAAW,EAAE;AAHV,SAAP;AAKH,OAPoC;AAQrC,MAAA,QAAQ,EAAE;AACN,QAAA,aAAa,EAAE,yBAAW;AACtB,iBAAO,IAAI,CAAC,SAAL,CAAe;AAClB,oBAAQ,UADU;AAElB,wBAAY,qBAFM;AAGlB,sBAAU,UAHQ;AAIlB,qBAAS,KAAK,YAJI;AAKlB,0BAAc,KAAK;AALD,WAAf,CAAP;AAOH;AATK,OAR2B;AAmBrC,MAAA,OAAO,EAAE;AACL,QAAA,UADK,sBACM,CADN,EACS;AACV,cAAI,MAAM,GAAG,KAAK,KAAL,CAAW,QAAxB;AACA,cAAI,IAAI,GAAG,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,IAAhD;AACA,cAAI,EAAE,GAAG,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,OAArC,CAA6C,EAAtD;AACA,eAAK,YAAL,GAAoB,IAApB;AACA,eAAK,UAAL,GAAkB,EAAlB;;AACA,cAAI,CAAJ,EAAO;AACH,iBAAK,WAAL,GAAmB,CAAC,CAAC,MAAF,CAAS,KAA5B;AACH,WAFD,MAEO;AACH,iBAAK,WAAL,GAAmB,MAAM,CAAC,OAAP,CAAe,MAAM,CAAC,aAAtB,EAAqC,KAAxD;AACH;AAEJ,SAbI;AAcL,QAAA,MAdK,kBAcE,CAdF,EAcK;AACN;AACA,UAAA,MAAM,CAAC,IAAP,CAAY,KAAK,WAAjB,EAA8B,QAA9B;AACH;AAjBI,OAnB4B;AAsCrC,MAAA,OAtCqC,qBAsC3B;AACN,aAAK,UAAL;AACH;AAxCoC,KAAzC;;AA4CA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,mBAAY,EAAZ,CADE;AAEJ,MAAA,KAAK,EAAE;AAFH,KAAR,EAGG,MAHH,kBAGoB,EAHpB,GAG0B,IAH1B;AAIH,GAjDD;;AAmDA;AACA;;AAEA,MAAI,KAAK,CAAC,MAAN,GAAe,CAAnB,EAAsB;AAClB,IAAA,KAAK,CAAC,OAAN,CAAc,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC3B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,iBAA4B,KAA5B;AACA,MAAA,gBAAgB,CAAC,KAAD,CAAhB;AACH,KAHD;AAIH;AAEJ,CAjED;;eAmEe,c;;;;;;;;;;;ACvEf;;;;;;;;;;;;;;;;;;;AAoBA,IAAM,cAAc,GAAG,SAAjB,cAAiB,CAAA,OAAO,EAAI;AAC9B,MAAM,QAAQ,GAAG;AACb,IAAA,GAAG,EAAE,aAAS,GAAT,EAAc;AACf,aAAO,QAAQ,CAAC,QAAT,CAAkB,IAAlB,CAAuB,GAAvB,CAAP;AACH,KAHY;AAKb,IAAA,GAAG,EAAE,aAAS,GAAT,EAAc,KAAd,EAAqB;AACtB,aAAO,QAAQ,CAAC,QAAT,CAAkB,IAAlB,CAAuB,GAAvB,EAA4B,KAA5B,CAAP;AACH,KAPY;AASb,IAAA,MAAM,EAAE,gBAAS,GAAT,EAAc;AAClB,aAAO,QAAQ,CAAC,QAAT,CAAkB,OAAlB,CAA0B,GAA1B,CAAP;AACH,KAXY;AAab,IAAA,QAAQ,EAAE,kBAAS,GAAT,EAAc,GAAd,EAAmB;AACzB,UAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAR,CAApB;AACA,aAAO,QAAQ,CAAC,QAAT,CAAkB,IAAlB,CAAuB,GAAvB,EAA4B,GAA5B,CAAP;AACH,KAhBY;AAkBb,IAAA,QAAQ,EAAE,kBAAS,GAAT,EAAc,GAAd,EAAmB;AACzB,UAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAR,CAApB;AACA,aAAO,QAAQ,CAAC,QAAT,CAAkB,IAAlB,CAAuB,GAAvB,EAA4B,GAA5B,CAAP;AACH;AArBY,GAAjB;AAwBA,EAAA,QAAQ,CAAC,QAAT,GAAoB,OAAO,IAAI,qBAA/B;AAEA,SAAO,QAAP;AACH,CA5BD;;AA8BO,IAAM,qBAAqB,GAAG;AACjC,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc;AAChB,WAAO,cAAc,CAAC,OAAf,CAAuB,GAAvB,CAAP;AACH,GAHgC;AAKjC,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,KAAd,EAAqB;AACvB,WAAO,cAAc,CAAC,OAAf,CAAuB,GAAvB,EAA4B,KAA5B,CAAP;AACH,GAPgC;AASjC,EAAA,OAAO,EAAE,iBAAS,GAAT,EAAc;AACnB,WAAO,cAAc,CAAC,UAAf,CAA0B,GAA1B,CAAP;AACH,GAXgC;AAajC,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,GAAd,EAAmB;AACrB,QAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,IAAtB,CAA2B,GAA3B,KAAmC,CAApC,CAAxB;;AACA,IAAA,qBAAqB,CAAC,IAAtB,CAA2B,GAA3B,EAAgC,OAAO,GAAG,GAA1C;AACH,GAhBgC;AAkBjC,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,GAAd,EAAmB;AACrB,IAAA,qBAAqB,CAAC,IAAtB,CAA2B,GAA3B,EAAgC,GAAG,GAAG,CAAC,CAAvC;AACH;AApBgC,CAA9B;;AAuBA,IAAM,mBAAmB,GAAG;AAC/B,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc;AAChB,WAAO,YAAY,CAAC,OAAb,CAAqB,GAArB,CAAP;AACH,GAH8B;AAK/B,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,KAAd,EAAqB;AACvB,WAAO,YAAY,CAAC,OAAb,CAAqB,GAArB,EAA0B,KAA1B,CAAP;AACH,GAP8B;AAS/B,EAAA,OAAO,EAAE,iBAAS,GAAT,EAAc;AACnB,WAAO,YAAY,CAAC,UAAb,CAAwB,GAAxB,CAAP;AACH,GAX8B;AAa/B,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,GAAd,EAAmB;AACrB,QAAM,OAAO,GAAG,QAAQ,CAAC,mBAAmB,CAAC,IAApB,CAAyB,GAAzB,KAAiC,CAAlC,CAAxB;;AACA,IAAA,mBAAmB,CAAC,IAApB,CAAyB,GAAzB,EAA8B,OAAO,GAAG,GAAxC;AACH,GAhB8B;AAkB/B,EAAA,IAAI,EAAE,cAAS,GAAT,EAAc,GAAd,EAAmB;AACrB,IAAA,mBAAmB,CAAC,IAApB,CAAyB,GAAzB,EAA8B,GAAG,GAAG,CAAC,CAArC;AACH;AApB8B,CAA5B;;eAuBQ,c;;;;;;;;;;;AChGf;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,mBAAI,GAAJ,CAAQ,gBAAR;;AAEA,IAAM,KAAK,GAAG,IAAI,iBAAK,KAAT,CAAe;AACzB,EAAA,KAAK,EAAE;AACH,IAAA,SAAS,EAAE,EADR;AAEH,IAAA,QAAQ,EAAE,IAFP;AAEa;AAChB,IAAA,aAAa,EAAE,IAHZ;AAGkB;AACrB,IAAA,WAAW,EAAE,IAJV;AAIgB;AACnB,IAAA,WAAW,EAAE,EALV;AAMH,IAAA,iBAAiB,EAAE,KANhB;AAOH,IAAA,KAAK,EAAE,IAPJ;AAQH,IAAA,QAAQ,EAAE,EARP;AASH,IAAA,SAAS,EAAE;AAAE;AACT,MAAA,UAAU,EAAE,EADL;AAEP,MAAA,UAAU,EAAE,EAFL;AAGP,MAAA,SAAS,EAAE,EAHJ;AAIP,MAAA,SAAS,EAAE,EAJJ;AAKP,MAAA,eAAe,EAAE;AALV,KATR;AAgBH,IAAA,WAAW,EAAE,IAhBV;AAiBH,IAAA,YAAY,EAAE,EAjBX;AAkBH,IAAA,IAAI,EAAE;AAlBH,GADkB;AAsBzB,EAAA,SAAS,EAAG;AACR,IAAA,WADQ,uBACI,KADJ,EACW,KADX,EACkB;AACtB,MAAA,KAAK,CAAC,SAAN,GAAkB,KAAlB;AACH,KAHO;AAIR,IAAA,cAJQ,0BAIO,KAJP,EAIc,WAJd,EAI2B;AAC/B,MAAA,KAAK,CAAC,QAAN,GAAiB,WAAjB;AACH,KANO;AAOR,IAAA,mBAPQ,+BAOY,KAPZ,EAOmB,WAPnB,EAOgC;AACpC,MAAA,KAAK,CAAC,aAAN,GAAsB,WAAtB;AACH,KATO;AAUR,IAAA,iBAVQ,6BAUU,KAVV,EAUiB,WAVjB,EAU8B;AAClC,MAAA,KAAK,CAAC,WAAN,GAAoB,WAApB;AACH,KAZO;AAaR,IAAA,cAbQ,0BAaO,KAbP,EAac,OAbd,EAauB;AAC3B,MAAA,KAAK,CAAC,WAAN,GAAoB,OAApB;AACH,KAfO;AAgBR,IAAA,oBAhBQ,gCAgBa,KAhBb,EAgBoB,WAhBpB,EAgBiC;AACrC,MAAA,KAAK,CAAC,iBAAN,GAA0B,WAA1B;AACH,KAlBO;AAmBR,IAAA,QAnBQ,oBAmBC,KAnBD,EAmBQ,KAnBR,EAmBe;AACnB,UAAI,KAAJ,EAAW;AACP,QAAA,KAAK,CAAC,KAAN,GAAc,KAAd;AACH,OAFD,MAEO;AACH,QAAA,KAAK,CAAC,KAAN,GACK,KAAK,CAAC,KAAN,IAAe,IAAf,GAAsB,QAAtB,GACC,KAAK,CAAC,KAAN,IAAe,QAAf,GAA0B,IAA1B,GACA,IAHN;AAIH;AACJ,KA5BO;AA6BR,IAAA,UA7BQ,sBA6BG,KA7BH,EA6BU,GA7BV,EA6Be;AACnB,MAAA,KAAK,CAAC,QAAN,CAAe,IAAf,CAAoB,GAApB;AACH,KA/BO;AAgCR,IAAA,eAhCQ,2BAgCQ,KAhCR,EAgCe,IAhCf,EAgCqB;AACzB;AACA,UAAI,IAAI,CAAC,MAAL,IAAe,KAAnB,EAA0B;AACtB;AACA,QAAA,KAAK,CAAC,SAAN,CAAgB,IAAI,CAAC,IAArB,EAA2B,IAA3B,CAAgC,IAAI,CAAC,EAArC;AACH,OAHD,MAGO,IAAI,IAAI,CAAC,MAAL,IAAe,QAAnB,EAA6B;AAChC;AAEA,YAAI,KAAK,CAAC,SAAN,CAAgB,IAAI,CAAC,IAArB,EAA2B,QAA3B,CAAoC,IAAI,CAAC,EAAzC,CAAJ,EAAkD;AAC9C,UAAA,KAAK,CAAC,SAAN,CAAgB,IAAI,CAAC,IAArB,EAA2B,MAA3B,CAAkC,KAAK,CAAC,SAAN,CAAgB,IAAI,CAAC,IAArB,EAA2B,OAA3B,CAAmC,IAAI,CAAC,EAAxC,CAAlC,EAA+E,CAA/E;AACH;AACJ,OANM,MAMA;AACH;AACH;AACJ,KA9CO;AA+CR,IAAA,aA/CQ,yBA+CM,KA/CN,EA+Ca,IA/Cb,EA+CmB;AACvB,MAAA,KAAK,CAAC,SAAN,CAAgB,IAAI,CAAC,IAArB,IAA6B,IAAI,CAAC,GAAlC;AACH,KAjDO;AAkDR,IAAA,iBAlDQ,6BAkDU,KAlDV,EAkDiB,OAlDjB,EAkD0B;AAC9B;AACA,MAAA,KAAK,CAAC,SAAN,CAAgB,UAAhB,GAA6B,OAAO,CAAC,WAAR,CAAoB,GAApB,CAAwB,UAAA,CAAC;AAAA,yBAAO,CAAP;AAAA,OAAzB,CAA7B;AACA,MAAA,KAAK,CAAC,SAAN,CAAgB,UAAhB,GAA6B,OAAO,CAAC,WAAR,CAAoB,GAApB,CAAwB,UAAA,CAAC;AAAA,yBAAO,CAAP;AAAA,OAAzB,CAA7B;AACA,MAAA,KAAK,CAAC,SAAN,CAAgB,SAAhB,GAA4B,OAAO,CAAC,UAAR,CAAmB,GAAnB,CAAuB,UAAA,CAAC;AAAA,yBAAO,CAAP;AAAA,OAAxB,CAA5B;AACA,MAAA,KAAK,CAAC,SAAN,CAAgB,SAAhB,GAA4B,OAAO,CAAC,UAAR,CAAmB,GAAnB,CAAuB,UAAA,CAAC;AAAA,yBAAO,CAAP;AAAA,OAAxB,CAA5B;AACA,MAAA,KAAK,CAAC,SAAN,CAAgB,eAAhB,GAAkC,OAAO,CAAC,gBAAR,CAAyB,GAAzB,CAA6B,UAAA,CAAC;AAAA,yBAAO,CAAP;AAAA,OAA9B,CAAlC;AACH,KAzDO;AA0DR,IAAA,cA1DQ,0BA0DO,KA1DP,EA0Dc,IA1Dd,EA0DoB;AACxB,MAAA,KAAK,CAAC,WAAN,GAAoB,IAApB;AACH,KA5DO;AA6DR,IAAA,kBA7DQ,8BA6DW,KA7DX,EA6DkB,IA7DlB,EA6DwB;AAC5B,MAAA,KAAK,CAAC,YAAN,GAAqB,IAArB;AACH,KA/DO;AAgER,IAAA,OAhEQ,mBAgEA,KAhEA,EAgEO,EAhEP,EAgEW;AACf,MAAA,KAAK,CAAC,IAAN,GAAa,EAAb;AACH;AAlEO,GAtBa;AA0FzB,EAAA,OAAO,EAAE;AACL,IAAA,WADK,uBACO,OADP,EACgB;AACjB,UAAI,KAAK,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAZ;AACA,UAAI,KAAK,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAZ;AACA,UAAI,YAAY,GAAG,MAAM,CAAC,UAAP,CAAkB,qBAAlB,CAAnB,CAHiB,CAKjB;;AACA,UAAI,QAAQ,GAAG,KAAK,CAAC,OAAN,GAAgB,IAAhB,GAAuB,KAAtC;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,gBAAf,EAAiC,QAAjC;AAEA,MAAA,KAAK,CAAC,gBAAN,CAAuB,QAAvB,EAAgC,YAAM;AAClC,QAAA,QAAQ,GAAG,KAAK,CAAC,OAAN,GAAgB,IAAhB,GAAuB,KAAlC;AACA,QAAA,OAAO,CAAC,MAAR,CAAe,gBAAf,EAAiC,QAAjC;AACH,OAHD;AAKA,UAAI,aAAa,GAAG,KAAK,CAAC,OAAN,GAAgB,IAAhB,GAAuB,KAA3C;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,qBAAf,EAAsC,aAAtC;AAEA,MAAA,KAAK,CAAC,gBAAN,CAAuB,QAAvB,EAAgC,YAAM;AAClC,QAAA,aAAa,GAAG,KAAK,CAAC,OAAN,GAAgB,IAAhB,GAAuB,KAAvC;AACA,QAAA,OAAO,CAAC,MAAR,CAAe,qBAAf,EAAsC,aAAtC;AACH,OAHD;AAKA,UAAI,WAAW,GAAG,YAAY,CAAC,OAAb,GAAuB,IAAvB,GAA8B,KAAhD;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,mBAAf,EAAoC,WAApC;AAEA,MAAA,YAAY,CAAC,gBAAb,CAA8B,QAA9B,EAAuC,YAAM;AACzC,QAAA,WAAW,GAAG,YAAY,CAAC,OAAb,GAAuB,IAAvB,GAA8B,KAA5C;AACA,QAAA,OAAO,CAAC,MAAR,CAAe,mBAAf,EAAoC,WAApC;AACH,OAHD;AAIH,KA9BI;AA+BL,IAAA,WA/BK,uBA+BO,OA/BP,EA+BgB;AACjB;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,eAAf,EAAgC;AAAC,gBAAO,YAAR;AAAsB,QAAA,GAAG,EAAE,0BAAe,aAAf,EAA8B,KAA9B,CAAoC,GAApC;AAA3B,OAAhC;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,eAAf,EAAgC;AAAC,gBAAO,YAAR;AAAsB,QAAA,GAAG,EAAE,0BAAe,aAAf,EAA8B,KAA9B,CAAoC,GAApC;AAA3B,OAAhC;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,eAAf,EAAgC;AAAC,gBAAO,WAAR;AAAqB,QAAA,GAAG,EAAE,0BAAe,YAAf,EAA6B,KAA7B,CAAmC,GAAnC;AAA1B,OAAhC;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,eAAf,EAAgC;AAAC,gBAAO,WAAR;AAAqB,QAAA,GAAG,EAAE,0BAAe,YAAf,EAA6B,KAA7B,CAAmC,GAAnC;AAA1B,OAAhC;AACA,MAAA,OAAO,CAAC,MAAR,CAAe,eAAf,EAAgC;AAAC,gBAAO,iBAAR;AAA2B,QAAA,GAAG,EAAE,0BAAe,kBAAf,EAAmC,KAAnC,CAAyC,GAAzC;AAAhC,OAAhC,EANiB,CAQjB;;AAEA,MAAA,OAAO,CAAC,QAAR,CAAiB,gBAAjB;AACH,KA1CI;AA2CL,IAAA,eA3CK,2BA2CW,OA3CX,EA2CoB;AACrB;AACA,UAAI,MAAM,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,UAAxB,CAAmC,QAAnC,EAAb;AACA,UAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,UAAxB,CAAmC,QAAnC,EAAlB;AACA,UAAI,UAAU,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,SAAxB,CAAkC,QAAlC,EAAjB;AACA,UAAI,UAAU,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,SAAxB,CAAkC,QAAlC,EAAjB;AACA,UAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,eAAxB,CAAwC,QAAxC,EAAlB;AACA,MAAA,QAAQ,CAAC,MAAT,yBAAiC,MAAjC;AACA,MAAA,QAAQ,CAAC,MAAT,yBAAiC,WAAjC;AACA,MAAA,QAAQ,CAAC,MAAT,wBAAgC,UAAhC;AACA,MAAA,QAAQ,CAAC,MAAT,wBAAgC,UAAhC;AACA,MAAA,QAAQ,CAAC,MAAT,8BAAsC,WAAtC;AACH,KAvDI;AAwDL,IAAA,cAxDK,0BAwDU,OAxDV,EAwDmB;AACpB;AACA,UAAI,MAAM,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,UAAxB,CAAmC,QAAnC,EAAb;AACA,UAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,UAAxB,CAAmC,QAAnC,EAAlB;AACA,UAAI,UAAU,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,SAAxB,CAAkC,QAAlC,EAAjB;AACA,UAAI,UAAU,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,SAAxB,CAAkC,QAAlC,EAAjB;AACA,UAAI,WAAW,GAAG,OAAO,CAAC,KAAR,CAAc,SAAd,CAAwB,eAAxB,CAAwC,QAAxC,EAAlB;AAEA,UAAI,WAAW,GAAG;AACd,QAAA,UAAU,EAAE,MAAM,IAAI,EAAV,GAAe,IAAf,GAAsB,MAAM,CAAC,MAAP,CAAc,CAAd,KAAoB,GAApB,GAA0B,MAAM,CAAC,KAAP,CAAa,CAAb,CAA1B,GAA4C,MADhE;AAEd,QAAA,UAAU,EAAE,WAAW,IAAI,EAAf,GAAoB,IAApB,GAA2B,WAAW,CAAC,MAAZ,CAAmB,CAAnB,KAAyB,GAAzB,GAA+B,WAAW,CAAC,KAAZ,CAAkB,CAAlB,CAA/B,GAAsD,WAF/E;AAGd,QAAA,SAAS,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAAU,CAAC,MAAX,CAAkB,CAAlB,KAAwB,GAAxB,GAA8B,UAAU,CAAC,KAAX,CAAiB,CAAjB,CAA9B,GAAoD,UAH3E;AAId,QAAA,SAAS,EAAE,UAAU,IAAI,EAAd,GAAmB,IAAnB,GAA0B,UAAU,CAAC,MAAX,CAAkB,CAAlB,KAAwB,GAAxB,GAA8B,UAAU,CAAC,KAAX,CAAiB,CAAjB,CAA9B,GAAoD,UAJ3E;AAKd,QAAA,eAAe,EAAE,WAAW,IAAI,EAAf,GAAoB,IAApB,GAA2B,WAAW,CAAC,MAAZ,CAAmB,CAAnB,KAAyB,GAAzB,GAA+B,WAAW,CAAC,KAAZ,CAAkB,CAAlB,CAA/B,GAAsD;AALpF,OAAlB,CARoB,CAepB;AAEA;;AACA,UAAM,MAAM,sBAAZ,CAlBoB,CAmBpB;AACA;;AACA,wBAAM,GAAN,CAAU,MAAV,EAAkB;AACd,QAAA,MAAM,oBACC,WADD;AADQ,OAAlB,EAKC,IALD,CAKM,UAAS,QAAT,EAAmB;AACrB,QAAA,KAAK,CAAC,MAAN,CAAa,mBAAb,EAAkC,QAAQ,CAAC,IAAT,CAAc,OAAhD;AACA,QAAA,KAAK,CAAC,QAAN,CAAe,iBAAf;AACH,OARD,WASO,UAAS,KAAT,EAAgB;AACnB,QAAA,OAAO,CAAC,GAAR,CAAY,KAAZ;AACH,OAXD;AAYH,KAzFI;AA0FL,IAAA,SA1FK,qBA0FK,OA1FL,EA0Fc;AACf,UAAI,IAAI,GAAG,QAAQ,CAAC,aAAT,CAAuB,8BAAvB,IAAyD,QAAQ,CAAC,aAAT,CAAuB,8BAAvB,EAAuD,OAAvD,CAA+D,IAAxH,GAA+H,IAA1I,CADe,CAEf;;AACA,MAAA,KAAK,CAAC,MAAN,CAAa,gBAAb,EAA+B,IAA/B;;AACA,UAAI,IAAI,KAAK,OAAb,EAAsB;AAClB,QAAA,KAAK,CAAC,MAAN,CAAa,UAAb,EAAyB,QAAzB;AACH,OAFD,MAEO;AACH,QAAA,KAAK,CAAC,MAAN,CAAa,UAAb,EAAyB,IAAzB;AACH;AACJ,KAnGI;AAoGL,IAAA,QApGK,oBAoGI,OApGJ,EAoGa;AACd,UAAI,EAAE,GAAG,0BAAe,KAAf,KAAyB,EAAzB,GAA8B,IAA9B,GAAqC,0BAAe,KAAf,CAA9C;AACA,MAAA,KAAK,CAAC,MAAN,CAAa,SAAb,EAAwB,EAAxB,EAFc,CAGd;AACH;AAxGI;AA1FgB,CAAf,CAAd;eAsMe,K;;;;;;;;;;;AC7Mf;;AACA;;AACA;;;;AAEA,IAAM,MAAM,GAAG,SAAT,MAAS,GAAM;AACjB,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAT,CAA0B,UAA1B,CAAlB;;AAEA,MAAI,iBAAiB,GAAG,SAApB,iBAAoB,CAAC,EAAD,EAAQ;AAC5B,uBAAI,SAAJ,CAAc,iBAAd,EAAiC;AAC7B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,kBAAM,KAAN,CAAY,QADnB;AAEH,UAAA,OAAO,EAAE,kBAAM,KAAN,CAAY;AAFlB,SAAP;AAIH,OAN4B;AAO7B,MAAA,QAAQ,EAAE;AACN,QAAA,gBAAgB,EAAE,4BAAW;AACzB,iBAAO,kBAAM,KAAN,CAAY,QAAnB;AACH,SAHK,CAIN;AACA;AACA;;AANM,OAPmB;AAe7B,MAAA,KAAK,EAAE;AACH,QAAA,gBADG,8BACgB;AACf,eAAK,QAAL,GAAgB,KAAK,gBAArB;AACH,SAHE,CAIH;AACA;AACA;;AANG,OAfsB;AAuB7B,MAAA,OAAO,EAAE,EAvBoB;AA0B7B,MAAA,OA1B6B,qBA0BnB,CAET;AA5B4B,KAAjC;;AA+BA,uBAAI,SAAJ,CAAc,gBAAd,EAAgC;AAC5B,MAAA,KAAK,EAAE,CAAC,UAAD,CADqB;AAE5B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAGH,OAN2B;AAO5B,MAAA,OAAO,EAAE,EAPmB;AAU5B,MAAA,OAV4B,qBAUlB,CAET;AAZ2B,KAAhC;;AAeA,uBAAI,SAAJ,CAAc,gBAAd,EAAgC;AAC5B,MAAA,KAAK,EAAE,CAAC,SAAD,CADqB;AAE5B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAGH,OAN2B;AAO5B,MAAA,QAAQ,uSAPoB;AAY5B,MAAA,OAAO,EAAE;AACL,QAAA,IADK,gBACA,CADA,EACG;AACJ,UAAA,MAAM,CAAC,QAAP,CAAgB,IAAhB,cAA2B,CAAC,CAAC,MAAF,CAAS,KAApC,EADI,CAEJ;AACH;AAJI,OAZmB;AAkB5B,MAAA,OAlB4B,qBAkBlB,CAET;AApB2B,KAAhC;;AAuBA,uBAAI,SAAJ,CAAc,sBAAd,EAAsC;AAClC,MAAA,KAAK,EAAE,CAAC,MAAD,CAD2B;AAElC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO,EAAP;AAGH,OANiC;AAOlC,MAAA,QAAQ,sFAP0B;AAUlC,MAAA,OAAO,EAAE,EAVyB;AAalC,MAAA,OAbkC,qBAaxB,CAET;AAfiC,KAAtC;;AAkBA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,oBAAa,EAAb;AADE,KAAR,EAEG,MAFH,mBAEqB,EAFrB,GAE2B,IAF3B;AAGH,GA3FD;;AA6FA,MAAI,SAAS,CAAC,MAAV,GAAmB,CAAvB,EAA2B;AACvB,IAAA,SAAS,CAAC,OAAV,CAAkB,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC/B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,kBAA6B,KAA7B;AACA,MAAA,iBAAiB,CAAC,KAAD,CAAjB;AACH,KAHD;AAIH;AAEJ,CAvGD;;eAyGe,M;;;;;;;;;;;AChFf;;;;;;;;;;;;AAKA,IAAM,IAAI,GAAG,SAAP,IAAO,GAA4K;AAAA,iFAAP,EAAO;;AAAA,uBAAzK,IAAyK;AAAA,MAAzK,IAAyK,0BAAlK,MAAkK;AAAA,MAA1J,KAA0J,QAA1J,KAA0J;AAAA,MAA7I,QAA6I,QAAnJ,IAAmJ;AAAA,MAAnI,QAAmI,QAAnI,OAAmI;AAAA,MAA1H,OAA0H,QAA1H,OAA0H;AAAA,MAAjH,UAAiH,QAAjH,UAAiH;AAAA,MAArG,QAAqG,QAArG,QAAqG;AAAA,MAA3F,YAA2F,QAA3F,YAA2F;AAAA,MAA7E,OAA6E,QAA7E,OAA6E;AAAA,MAApE,cAAoE,QAApE,cAAoE;AAAA,MAApD,UAAoD,QAApD,UAAoD;AAAA,MAAxC,iBAAwC,QAAxC,iBAAwC;AAAA,MAAlB,OAAkB;;AACrL;AACI,IAAA,IAAI,EAAJ,IADJ;AAEI,IAAA,KAAK;AACD,MAAA,YAAY,EAAE,CAAC,MAAD,EAAS,MAAT,CADb;AAED,MAAA,WAAW,EAAE;AAFZ,OAGE,KAHF,CAFT;AAOI,IAAA,IAAI,EAAE,gBAAW;AACb,UAAM,SAAS,GAAG,QAAQ,IAAI,QAAQ,EAAtC;;AACA,UAAM,IAAI;AACN,QAAA,UAAU,EAAE,KAAK,YAAL,IAAqB;AAD3B,SAEH,SAFG,CAAV;;AAKA,aAAO,IAAP;AACH,KAfL;AAgBI,IAAA,OAAO,EAAE,mBAAW;AAChB,MAAA,QAAO,IAAI,QAAO,CAAC,IAAR,CAAa,IAAb,CAAX;AAEA,UAAM,WAAW,GAAG,EAApB;AACA,WAAK,SAAL,CAAe,OAAf,CAAuB,UAAA,CAAC,EAAI;AACxB,YAAM,GAAG,GAAG,CAAC,CAAC,MAAF,CAAS,gBAAT,CAA0B,GAAtC;;AACA,YAAG,CAAC,CAAC,KAAD,EAAQ,aAAR,EAAuB,QAAvB,CAAgC,GAAhC,CAAJ,EAAyC;AACrC;AACH;;AAED,YAAM,EAAE,GAAG,CAAC,CAAC,KAAb;AACA,YAAM,CAAC,GAAG,WAAW,CAAC,EAAD,CAArB;;AAEA,YAAG,CAAC,CAAJ,EAAM;AACF,UAAA,WAAW,CAAC,EAAD,CAAX,GAAkB,CAAlB;AACA;AACH;;AAED,QAAA,CAAC,CAAC,cAAF,CAAiB,CAAjB;AACH,OAfD;AAgBH,KApCL;AAqCI,IAAA,OAAO;AACH,MAAA,SAAS,EAAE,mBAAS,EAAT,EAAY;AACnB,aAAK,UAAL,GAAkB,EAAlB;AACH;AAHE,OAIA,OAJA,CArCX;AA2CI,IAAA,UAAU;AACN;AACI,QAAA,IAAI,EAAE,KADV;AAEI,QAAA,QAAQ,EAAE,kBAFd;AAGI,QAAA,KAAK;AACD,UAAA,KAAK,EAAE,CAAC,MAAD,EAAS,MAAT,CADN;AAED,UAAA,WAAW,EAAE;AAAC,YAAA,IAAI,EAAE,MAAP;AAAe,uBAAS;AAAxB,WAFZ;AAGD,UAAA,UAAU,EAAE,CAAC,MAAD,EAAS,MAAT,CAHX;AAID,UAAA,SAAS,EAAE;AAJV,WAKE,QALF,CAHT;AAUI,QAAA,IAAI,EAAE,gBAAW;AACb,mCACO,OADP;AAGH;AAdL,SAeO,UAfP;AAgBI,QAAA,OAAO,EAAE;AACL,UAAA,OAAO,EAAE,mBAAU;AACf,iBAAK,SAAL,CAAe,KAAK,KAApB;AACH,WAHI;AAIL,UAAA,cAAc,EAAE,wBAAS,CAAT,EAAW;AACvB,mBAAO,CAAC,CAAC,iBAAF,CAAoB,KAAK,cAAL,EAApB,CAAP;AACH,WANI;AAOL,UAAA,cAAc,EAAE,0BAAU;AACtB,mBAAO,KAAK,MAAL,WAAP;AACH;AATI;AAhBb,QADM;AA6BN;AACI,QAAA,IAAI,EAAE,aADV;AAEI,QAAA,QAAQ,EAAE,sBAFd;AAGI,QAAA,KAAK;AACD,UAAA,KAAK,EAAE,CAAC,MAAD,EAAS,MAAT,CADN;AAED,UAAA,UAAU,EAAE,CAAC,MAAD,EAAS,MAAT,CAFX;AAGD,UAAA,QAAQ,EAAE;AAAE,YAAA,IAAI,EAAE,MAAR;AAAgB,uBAAS;AAAzB,WAHT;AAID,UAAA,WAAW,EAAE;AAAC,YAAA,IAAI,EAAE,MAAP;AAAe,uBAAS;AAAxB,WAJZ;AAKD,UAAA,SAAS,EAAE;AALV,WAME,YANF,CAHT;AAWI,QAAA,IAAI,EAAE,gBAAW;AACb,cAAI,IAAI;AACJ,YAAA,OAAO,EAAE;AADL,aAED,cAFC,CAAR;;AAKA,iBAAO,IAAP;AACH;AAlBL,SAmBO,iBAnBP;AAoBI,QAAA,YAAY,EAAE,wBAAW;AACrB,eAAK,MAAL,CAAY,GAAZ,GAAkB,KAAK,OAAvB;AACH,SAtBL;AAuBI,QAAA,OAAO,EAAE;AACL,UAAA,OAAO,EAAE,mBAAU;AACf,iBAAK,SAAL,CAAe,KAAK,KAApB;AACH,WAHI;AAIL,UAAA,cAAc,EAAE,wBAAS,CAAT,EAAW;AACvB,iBAAK,iBAAL,CAAuB,CAAC,CAAC,cAAF,EAAvB;AACH,WANI;AAOL,UAAA,iBAAiB,EAAE,2BAAS,IAAT,EAAc;AAC7B,iBAAK,OAAL,GAAe,IAAf;AACH;AATI;AAvBb;AA7BM,OAgEH,UAhEG;AA3Cd,KA6GO,OA7GP;AA+GH,CAhHD;;eAkHe,I;;;;;;;;;;ACpJR,IAAM,eAAe,8OAArB;;AASA,IAAM,WAAW,msFAAjB;;AAiDA,IAAM,YAAY,slCAAlB;;AA2BA,IAAM,YAAY,61CAAlB;;AA2BA,IAAM,WAAW,y1CAAjB;;;;;;;;;;AChHA,IAAM,OAAO,yrBAAb;;AAiBA,IAAM,SAAS,8FAAf;;;;;;;;;;ACjBA,IAAM,mBAAmB,mKAAzB;;;;;;;;;;ACAA,IAAM,OAAO,+SAAb;;AASA,IAAM,GAAG,uJAAT;;;;;;;;;;;ACTP;;AACA;;;;AAEA,IAAM,WAAW,GAAG,SAAd,WAAc,GAAM;AAEtB,MAAI,eAAe,GAAG,QAAQ,CAAC,gBAAT,CAA0B,cAA1B,CAAtB;;AAEA,MAAI,sBAAsB,GAAG,SAAzB,sBAAyB,CAAC,EAAD,EAAQ;AACjC,uBAAI,SAAJ,CAAc,aAAd,EAA6B;AACzB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,IADP;AAEH,UAAA,OAAO,EAAE;AACL,YAAA,cAAc,EAAE,oBADX;AAEL,YAAA,iBAAiB,EAAE;AAFd,WAFN;AAMH,UAAA,IAAI,EAAE,IANH;AAOH,UAAA,YAAY,EAAE,CAPX;AAQH,UAAA,MAAM,EAAE;AARL,SAAP;AAUH,OAZwB;AAazB,MAAA,QAAQ,EAAE,EAbe;AAgBzB,MAAA,KAAK,EAAE,EAhBkB;AAmBzB,MAAA,OAAO,EAAE;AACL,QAAA,QADK,sBACM;AACP,eAAK,IAAL,GAAY,gBAAK,KAAK,QAAV,EAAoB,KAAK,OAAzB,CAAZ;AACH,SAHI;AAIL,QAAA,YAJK,0BAIU;AAAA;;AACX,eAAK,QAAL,CAAc,gBAAd,CAA+B,kBAA/B,EAAmD,YAAM;AACrD,YAAA,KAAI,CAAC,YAAL,GAAoB,KAAI,CAAC,IAAL,CAAU,WAAV,KAA0B,CAA9C;AACH,WAFD;AAGH,SARI;AASL,QAAA,SATK,uBASO;AACR,eAAK,IAAL,CAAU,IAAV;AACH,SAXI;AAYL,QAAA,SAZK,uBAYO;AACR,eAAK,IAAL,CAAU,IAAV;AACH;AAdI,OAnBgB;AAmCzB,MAAA,OAnCyB,qBAmCf;AACN,aAAK,QAAL,GAAgB,KAAK,GAAL,CAAS,aAAT,CAAuB,sBAAvB,CAAhB;AACA,aAAK,MAAL,GAAc,KAAK,GAAL,CAAS,gBAAT,CAA0B,qBAA1B,EAAiD,MAA/D;AACA,aAAK,QAAL;AACA,aAAK,YAAL;AACH;AAxCwB,KAA7B;;AA2CA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,yBAAkB,EAAlB;AADE,KAAR,EAEG,MAFH,wBAE0B,EAF1B,GAEgC,IAFhC;AAGH,GA/CD;;AAiDA,MAAI,eAAe,CAAC,MAAhB,GAAyB,CAA7B,EAAgC;AAC5B,IAAA,eAAe,CAAC,OAAhB,CAAwB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACrC,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,uBAAkC,KAAlC;AACA,MAAA,sBAAsB,CAAC,KAAD,CAAtB;AACH,KAHD;AAIH;AAEJ,CA5DD;;eA8De,W;;;;;;;;;;;ACjEf;;AACA;;AACA;;AACA;;;;AACA,mBAAI,GAAJ,CAAQ,sBAAR;;AAEA,IAAM,QAAQ,GAAG,SAAX,QAAW,GAAM;AAEnB,MAAI,aAAa,GAAG,QAAQ,CAAC,gBAAT,CAA0B,WAA1B,CAApB;;AAEA,MAAI,mBAAmB,GAAG,SAAtB,mBAAsB,CAAC,EAAD,EAAQ;AAC9B,uBAAI,SAAJ,CAAc,UAAd,EAA0B;AACtB,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,IADP;AAEH,UAAA,QAAQ,EAAE;AAFP,SAAP;AAIH,OANqB;AAOtB,MAAA,OAAO,EAAE;AACL,QAAA,YADK,0BACU;AAAA;;AACX;AACA;AACA,cAAI,GAAG,GAAG,MAAM,CAAC,UAAP,CAAkB,oBAAlB,CAAV;AACA,eAAK,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AAEA,UAAA,GAAG,CAAC,gBAAJ,CAAqB,QAArB,EAA8B,YAAM;AAChC,YAAA,KAAI,CAAC,QAAL,GAAgB,GAAG,CAAC,OAAJ,GAAc,IAAd,GAAqB,KAArC;AACH,WAFD;AAGH;AAVI,OAPa;AAmBtB,MAAA,OAnBsB,qBAmBZ;AACN,aAAK,YAAL;AACH;AArBqB,KAA1B;;AAwBA,uBAAI,SAAJ,CAAc,eAAd,EAA+B;AAC3B,MAAA,KAAK,EAAE,CAAC,UAAD,CADoB;AAE3B,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,OAAO,EAAE,EADN;AAEH,UAAA,MAAM,EAAE;AAFL,SAAP;AAIH,OAP0B;AAQ3B,MAAA,KAAK,EAAE;AACH,QAAA,QAAQ,EAAE,oBAAW;AACjB,cAAI,KAAK,QAAT,EAAmB;AACf,iBAAK,eAAL;AACH;AACJ;AALE,OARoB;AAe3B,MAAA,OAAO,EAAE;AACL,QAAA,SADK,uBACO;AACR,cAAI,IAAI,GAAG,IAAX;AAEA,iCAAM,KAAK,KAAL,CAAW,OAAjB,EAA0B;AACtB,YAAA,SAAS,EAAE,IADW;AAEtB,YAAA,KAAK,EAAE,IAFe;AAGtB,YAAA,WAAW,EAAE,IAHS;AAItB,YAAA,OAAO,EAAE,OAJa;AAKtB,YAAA,WAAW,EAAE,IALS;AAMtB,YAAA,MAAM,EAAE,EANc;AAOtB,YAAA,MAPsB,kBAOf,QAPe,EAOL;AACb;AACA,cAAA,IAAI,CAAC,MAAL,GAAc,IAAd;AACH,aAVqB;AAWtB,YAAA,MAXsB,kBAWf,QAXe,EAWL;AACb,cAAA,IAAI,CAAC,MAAL,GAAc,KAAd;AACH;AAbqB,WAA1B;AAeH,SAnBI;AAoBL,QAAA,aApBK,2BAoBW;AACZ,cAAI,KAAK,QAAT,EAAmB;AACf,gBAAI,OAAO,8EAC4B,KAAK,OAAL,CAAa,IADzC,oFAE4B,KAAK,OAAL,CAAa,KAFzC,sDAGA,KAAK,OAAL,CAAa,IAHb,qCAAX;AAMA,iBAAK,MAAL,CAAY,IAAZ,CACI,qBAAa,QAAb,CAAsB,OAAtB,CADJ,EAEI,qBAAa,IAFjB,EAGI,qBAAa,OAHjB;AAKH;AACJ,SAlCI;AAmCL,QAAA,eAnCK,6BAmCa;AACd,cAAI,MAAM,GAAG,KAAK,KAAL,CAAW,OAAxB;AACA,cAAI,QAAQ,GAAG,MAAM,CAAC,MAAtB;AACA,UAAA,QAAQ,CAAC,OAAT,GAHc,CAGM;AACvB,SAvCI;AAwCL,QAAA,eAxCK,6BAwCa;AACd,eAAK,OAAL,CAAa,IAAb,GAAoB,KAAK,KAAL,CAAW,OAAX,CAAmB,YAAnB,CAAgC,oBAAhC,CAApB;AACA,eAAK,OAAL,CAAa,KAAb,GAAqB,KAAK,KAAL,CAAW,IAAX,CAAgB,SAArC;AACA,eAAK,OAAL,CAAa,IAAb,GAAoB,KAAK,KAAL,CAAW,IAAX,CAAgB,SAApC;AACH;AA5CI,OAfkB;AA6D3B,MAAA,OA7D2B,qBA6DjB;AAAA;;AACN,aAAK,SAAL,CAAe,YAAM;AACjB,UAAA,MAAI,CAAC,SAAL;;AACA,cAAI,MAAI,CAAC,QAAT,EAAmB;AACf,YAAA,MAAI,CAAC,eAAL;AACH;AACJ,SALD;AAMA,aAAK,eAAL;AACH;AArE0B,KAA/B;;AAwEA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,sBAAe,EAAf;AADE,KAAR,EAEG,MAFH,qBAEuB,EAFvB,GAE6B,IAF7B;AAGH,GApGD;;AAsGA,MAAI,aAAa,CAAC,MAAd,GAAuB,CAA3B,EAA8B;AAC1B,IAAA,aAAa,CAAC,OAAd,CAAsB,UAAC,IAAD,EAAO,KAAP,EAAiB;AACnC,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,oBAA+B,KAA/B;AACA,MAAA,mBAAmB,CAAC,KAAD,CAAnB;AACH,KAHD;AAIH;AAEJ,CAjHD;;eAmHe,Q;;;;;;;;;;;ACzHf;;AACA;;AACA;;;;AAEA,IAAM,eAAe,GAAG,SAAlB,eAAkB,GAAM;AAE1B,MAAI,MAAM,GAAG,QAAQ,CAAC,gBAAT,CAA0B,oBAA1B,CAAb;;AACA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAI,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,EAAD,EAAQ;AAC3B,uBAAI,SAAJ,CAAc,4BAAd,EAA4C;AACxC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,EADP;AAEH,UAAA,SAAS,EAAE;AAFR,SAAP;AAIH,OANuC;AAOxC,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV,eAAK,MAAL,CAAY,IAAZ,CACI,mBAAW,QAAX,CAAoB,KAAK,QAAzB,EAAmC,KAAK,SAAxC,CADJ,EAEI,mBAAW,IAFf,EAGI,mBAAW,OAHf;AAKH;AAPI,OAP+B;AAgBxC,MAAA,OAhBwC,qBAgB9B;AACN,aAAK,QAAL,GAAgB,KAAK,KAAL,CAAW,OAAX,CAAmB,OAAnB,CAA2B,OAA3C;AACA,aAAK,SAAL,GAAkB,IAAlB;AACH;AAnBuC,KAA5C;;AAsBA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,+BAAwB,EAAxB;AADE,KAAR,EAEG,MAFH,8BAEgC,EAFhC,GAEsC,IAFtC;AAGH,GA1BD;;AA4BA,MAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,IAAA,MAAM,CAAC,OAAP,CAAe,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC5B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,6BAAwC,KAAxC;AACA,MAAA,gBAAgB,CAAC,KAAD,CAAhB;AACH,KAHD;AAIH;AACJ,CAvCD;;eAyCe,e;;;;;;;;;;;AC7Cf;;AACA;;AACA;;;;AAEA,IAAM,WAAW,GAAG,SAAd,WAAc,GAAM;AAEtB,MAAI,MAAM,GAAG,QAAQ,CAAC,gBAAT,CAA0B,eAA1B,CAAb;;AACA,qBAAI,GAAJ,CAAQ,sBAAR;;AAEA,MAAI,gBAAgB,GAAG,SAAnB,gBAAmB,CAAC,EAAD,EAAQ;AAC3B,uBAAI,SAAJ,CAAc,uBAAd,EAAuC;AACnC,MAAA,IAAI,EAAE,gBAAW;AACb,eAAO;AACH,UAAA,QAAQ,EAAE,EADP;AAEH,UAAA,SAAS,EAAE;AAFR,SAAP;AAIH,OANkC;AAOnC,MAAA,OAAO,EAAE;AACL,QAAA,WADK,yBACS;AACV,eAAK,MAAL,CAAY,IAAZ,CACI,mBAAW,QAAX,CAAoB,KAAK,QAAzB,EAAmC,KAAK,SAAxC,CADJ,EAEI,mBAAW,IAFf,EAGI,mBAAW,OAHf;AAKH;AAPI,OAP0B;AAgBnC,MAAA,OAhBmC,qBAgBzB;AACN,aAAK,QAAL,GAAgB,KAAK,KAAL,CAAW,OAAX,CAAmB,OAAnB,CAA2B,OAA3C;AACA,aAAK,SAAL,GAAiB,KAAK,KAAL,CAAW,IAAX,GAAkB,KAAK,KAAL,CAAW,IAAX,CAAgB,SAAlC,GAA8C,IAA/D;AACH;AAnBkC,KAAvC;;AAsBA,QAAI,kBAAJ,CAAQ;AACJ,MAAA,EAAE,0BAAmB,EAAnB;AADE,KAAR,EAEG,MAFH,yBAE2B,EAF3B,GAEiC,IAFjC;AAGH,GA1BD;;AA4BA,MAAI,MAAM,CAAC,MAAP,GAAgB,CAApB,EAAuB;AACnB,IAAA,MAAM,CAAC,OAAP,CAAe,UAAC,IAAD,EAAO,KAAP,EAAiB;AAC5B,MAAA,IAAI,CAAC,SAAL,CAAe,GAAf,wBAAmC,KAAnC;AACA,MAAA,gBAAgB,CAAC,KAAD,CAAhB;AACH,KAHD;AAIH;AACJ,CAvCD;;eAyCe,W;;;;;;AC5Cf;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAGA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AASA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAGA;;AACA;;;;AA/DA;AAaA;AAkCmD;AAcnD;AAIA,QAAQ,CAAC,gBAAT,CAA0B,kBAA1B,EAA8C,YAAM;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAvBgD,CAwBhD;;AACA,8BAAgB,IAAhB;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAtCgD,CAwChD;;AACA,MAAI,cAAc,GAAG,QAAQ,CAAC,aAAT,CAAuB,MAAvB,CAArB;;AACA,MAAI,UAAU,GAAG,SAAb,UAAa,GAAM;AACnB,QAAI,QAAQ,CAAC,aAAT,CAAuB,YAAvB,KAAwC,QAAQ,CAAC,aAAT,CAAuB,kCAAvB,CAA5C,EAAwG;AACpG,MAAA,cAAc,CAAC,SAAf,CAAyB,GAAzB,CAA6B,aAA7B;AACH,KAFD,MAEO;AACH,MAAA,cAAc,CAAC,SAAf,CAAyB,MAAzB,CAAgC,aAAhC;AACH;AACJ,GAND;;AAOA,MAAI,OAAO,GAAG;AACV,IAAA,OAAO,EAAE,IADC;AAEV,IAAA,SAAS,EAAE;AAFD,GAAd;AAIA,MAAI,QAAQ,GAAG,IAAI,gBAAJ,CAAqB,UAArB,CAAf;AACA,EAAA,QAAQ,CAAC,OAAT,CAAiB,cAAjB,EAAiC,OAAjC,EAtDgD,CAwDhD;;AACA,oBAAM,QAAN,CAAe,WAAf,EAzDgD,CA0DhD;;;AACA,oBAAM,QAAN,CAAe,UAAf;AACH,CA5DD;;AA8DA,kBAAM,QAAN,CAAe,aAAf,E,CAA+B;;;AAC/B,kBAAM,QAAN,CAAe,aAAf;;;;;AChIA,IAAI,CAAC,OAAO,CAAC,SAAR,CAAkB,OAAvB,EAAgC;AAC/B,EAAA,OAAO,CAAC,SAAR,CAAkB,OAAlB,GAA4B,OAAO,CAAC,SAAR,CAAkB,iBAAlB,IAC3B,OAAO,CAAC,SAAR,CAAkB,qBADnB;AAEA;;AAED,IAAI,CAAC,OAAO,CAAC,SAAR,CAAkB,OAAvB,EAAgC;AAC/B,EAAA,OAAO,CAAC,SAAR,CAAkB,OAAlB,GAA4B,SAAS,OAAT,CAAiB,CAAjB,EAAoB;AAC/C,QAAM,EAAE,GAAG,IAAX;AACA,QAAI,QAAQ,GAAG,IAAf;AACA,QAAI,CAAC,QAAQ,CAAC,eAAT,CAAyB,QAAzB,CAAkC,EAAlC,CAAL,EAA4C,OAAO,IAAP;;AAC5C,OAAG;AACF,UAAI,QAAQ,CAAC,OAAT,CAAiB,CAAjB,CAAJ,EAAyB,OAAO,QAAP;AACzB,MAAA,QAAQ,GAAG,QAAQ,CAAC,aAApB;AACA,KAHD,QAGS,QAAQ,KAAK,IAHtB;;AAIA,WAAO,IAAP;AACA,GATD;AAUA;;;;;AChBD;AACA,IAAI,EAAE,MAAM,CAAC,gBAAP,IAA2B,MAAM,CAAC,aAAlC,IAAmD,MAAM,CAAC,WAA1D,IAAyE,MAAM,CAAC,YAAhF,IAAgG,MAAM,CAAC,UAAzG,CAAJ,EAA0H;AACzH,MAAI,IAAI,GAAG,QAAQ,CAAC,oBAAT,CAA+B,MAA/B,EAAwC,CAAxC,CAAX;AACA,EAAA,IAAI,CAAC,SAAL,IAAkB,gBAAlB;AACA;AAED;;;AACA,MAAM,CAAC,UAAP,KAAsB,MAAM,CAAC,UAAP,GAAoB,YAAW;AACjD,eADiD,CAGjD;;AACA,MAAI,UAAU,GAAI,MAAM,CAAC,UAAP,IAAqB,MAAM,CAAC,KAA9C,CAJiD,CAMjD;;AACA,MAAI,CAAC,UAAL,EAAiB;AACb,QAAI,KAAK,GAAS,QAAQ,CAAC,aAAT,CAAuB,OAAvB,CAAlB;AAAA,QACI,MAAM,GAAQ,QAAQ,CAAC,oBAAT,CAA8B,QAA9B,EAAwC,CAAxC,CADlB;AAAA,QAEI,IAAI,GAAU,IAFlB;AAIA,IAAA,KAAK,CAAC,IAAN,GAAc,UAAd;AACA,IAAA,KAAK,CAAC,EAAN,GAAc,mBAAd;AAEA,IAAA,MAAM,CAAC,UAAP,CAAkB,YAAlB,CAA+B,KAA/B,EAAsC,MAAtC,EARa,CAUb;;AACA,IAAA,IAAI,GAAI,sBAAsB,MAAvB,IAAkC,MAAM,CAAC,gBAAP,CAAwB,KAAxB,EAA+B,IAA/B,CAAlC,IAA0E,KAAK,CAAC,YAAvF;AAEA,IAAA,UAAU,GAAG;AACT,MAAA,WAAW,EAAE,qBAAS,KAAT,EAAgB;AACzB,YAAI,IAAI,GAAG,YAAY,KAAZ,GAAoB,wCAA/B,CADyB,CAGzB;;AACA,YAAI,KAAK,CAAC,UAAV,EAAsB;AAClB,UAAA,KAAK,CAAC,UAAN,CAAiB,OAAjB,GAA2B,IAA3B;AACH,SAFD,MAEO;AACH,UAAA,KAAK,CAAC,WAAN,GAAoB,IAApB;AACH,SARwB,CAUzB;;;AACA,eAAO,IAAI,CAAC,KAAL,KAAe,KAAtB;AACH;AAbQ,KAAb;AAeH;;AAED,SAAO,UAAS,KAAT,EAAgB;AACnB,WAAO;AACH,MAAA,OAAO,EAAE,UAAU,CAAC,WAAX,CAAuB,KAAK,IAAI,KAAhC,CADN;AAEH,MAAA,KAAK,EAAE,KAAK,IAAI;AAFb,KAAP;AAIH,GALD;AAMH,CA3CyC,EAA1C;AA6CA;;AACC,aAAU;AACP;AACA,MAAI,MAAM,CAAC,UAAP,IAAqB,MAAM,CAAC,UAAP,CAAkB,KAAlB,EAAyB,gBAAlD,EAAoE;AAChE,WAAO,KAAP;AACH;;AAED,MAAI,eAAe,GAAG,MAAM,CAAC,UAA7B;AAAA,MACI,eAAe,GAAG,eAAe,CAAC,UAAD,CAAf,CAA4B,OADlD;AAAA,MAEI,WAAW,GAAO,KAFtB;AAAA,MAGI,SAAS,GAAS,CAHtB;AAAA,MAG4B;AACxB,EAAA,OAAO,GAAW,EAJtB;AAAA,MAI4B;AACxB,EAAA,YAAY,GAAM,SAAlB,YAAkB,CAAS,GAAT,EAAc;AAC5B;AACA,IAAA,YAAY,CAAC,SAAD,CAAZ;AAEA,IAAA,SAAS,GAAG,UAAU,CAAC,YAAW;AAC9B,WAAK,IAAI,CAAC,GAAG,CAAR,EAAW,EAAE,GAAG,OAAO,CAAC,MAA7B,EAAqC,CAAC,GAAG,EAAzC,EAA6C,CAAC,EAA9C,EAAkD;AAC9C,YAAI,GAAG,GAAW,OAAO,CAAC,CAAD,CAAP,CAAW,GAA7B;AAAA,YACI,SAAS,GAAK,OAAO,CAAC,CAAD,CAAP,CAAW,SAAX,IAAwB,EAD1C;AAAA,YAEI,OAAO,GAAO,eAAe,CAAC,GAAG,CAAC,KAAL,CAAf,CAA2B,OAF7C,CAD8C,CAK9C;AACA;;AACA,YAAI,OAAO,KAAK,GAAG,CAAC,OAApB,EAA6B;AACzB,UAAA,GAAG,CAAC,OAAJ,GAAc,OAAd;;AAEA,eAAK,IAAI,CAAC,GAAG,CAAR,EAAW,EAAE,GAAG,SAAS,CAAC,MAA/B,EAAuC,CAAC,GAAG,EAA3C,EAA+C,CAAC,EAAhD,EAAoD;AAChD,YAAA,SAAS,CAAC,CAAD,CAAT,CAAa,IAAb,CAAkB,MAAlB,EAA0B,GAA1B;AACH;AACJ;AACJ;AACJ,KAhBqB,EAgBnB,EAhBmB,CAAtB;AAiBH,GA1BL;;AA4BA,EAAA,MAAM,CAAC,UAAP,GAAoB,UAAS,KAAT,EAAgB;AAChC,QAAI,GAAG,GAAW,eAAe,CAAC,KAAD,CAAjC;AAAA,QACI,SAAS,GAAK,EADlB;AAAA,QAEI,KAAK,GAAS,CAFlB;;AAIA,IAAA,GAAG,CAAC,gBAAJ,GAAuB,UAAS,QAAT,EAAmB;AACtC;AACA,UAAI,CAAC,eAAL,EAAsB;AAClB;AACH,OAJqC,CAMtC;AACA;;;AACA,UAAI,CAAC,WAAL,EAAkB;AACd,QAAA,WAAW,GAAG,IAAd;AACA,QAAA,MAAM,CAAC,gBAAP,CAAwB,QAAxB,EAAkC,YAAlC,EAAgD,IAAhD;AACH,OAXqC,CAatC;;;AACA,UAAI,KAAK,KAAK,CAAd,EAAiB;AACb,QAAA,KAAK,GAAG,OAAO,CAAC,IAAR,CAAa;AACjB,UAAA,GAAG,EAAW,GADG;AAEjB,UAAA,SAAS,EAAK;AAFG,SAAb,CAAR;AAIH;;AAED,MAAA,SAAS,CAAC,IAAV,CAAe,QAAf;AACH,KAtBD;;AAwBA,IAAA,GAAG,CAAC,mBAAJ,GAA0B,UAAS,QAAT,EAAmB;AACzC,WAAK,IAAI,CAAC,GAAG,CAAR,EAAW,EAAE,GAAG,SAAS,CAAC,MAA/B,EAAuC,CAAC,GAAG,EAA3C,EAA+C,CAAC,EAAhD,EAAmD;AAC/C,YAAI,SAAS,CAAC,CAAD,CAAT,KAAiB,QAArB,EAA8B;AAC1B,UAAA,SAAS,CAAC,MAAV,CAAiB,CAAjB,EAAoB,CAApB;AACH;AACJ;AACJ,KAND;;AAQA,WAAO,GAAP;AACH,GAtCD;AAuCH,CAzEA,GAAD;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC38DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpzDA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACdA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;;ACHA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC19BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACngCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACriKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpuEA;AACA;;;ACDA;AACA;AACA;AACA;AACA;AACA;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACrkCA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA","file":"main.bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n\n let bookmarkItems = document.querySelectorAll('.bookmark-container');\n\n let bookmarkConstructor = (id) => {\n Vue.component('bookmark', {\n props: ['data'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n \n // console.log(\"saved\",this.saved);\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n new Vue({\n el: `.bookmark-container-${id}`,\n }).$mount(`.bookmark-container-${id}`, true);\n }\n\n if (bookmarkItems.length > 0) {\n bookmarkItems.forEach((item, index) => {\n item.classList.add(`bookmark-container-${index}`);\n bookmarkConstructor(index);\n })\n }\n\n}\n\nexport default bookmarks;","/*\n METHODS:\n\n # ComponentModule.AddModule(target, options)\n * Arguments:\n - {string} target\n - {Object} options\n * Usage:\n Register a Module. Registration allows starting a new Vue instance with the configuration that you provide in 'options' object. 'target' argument is used to find the elements in the DOM and provides the Vue instance an existing DOM element to mount on. It can be a CSS selector string.\n\n # ComponentModule.Init:\n The function that initializes every Module added.\n\n OBJECTS:\n\n # Options\n With the 'options' argument can pass the configuration options for Vue (https://vuejs.org/v2/api/#Options-Data) except 'el' and 'components' options, and additionally the next options:\n\n - {array[object]} components:\n this works like Local Registration Component in Veu (https://vuejs.org/v2/guide/components-registration.html), just is an array in place of an object and the id component must be in the 'name' parameter. i.e:\n\n [Directly in VUE]:\n\n new Vue({\n el: '#app',\n components: {\n 'component-a': ComponentA,\n 'component-b': ComponentB\n }\n });\n\n [HERE]:\n\n ...\n components: [ { name: 'component-a', ...ComponentA }, { name: 'component-b', ...ComponentB } ],\n ...\n\n - {string} prefix:\n this will be added to every id component as prefix, i.e:\n prefix = \"comp_\" and component.name = \"form\". So the final result will be 'comp_form' as id component.\n\n - {string} initFunc:\n this is just a simple function that is called before to create the Vue instance, for the preconditions\n\n - {boolean} mount:\n this value is true by default. If the value is true, will force the hydration of the module.\n\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst ComponentModule = {\n AddModule: (target, options) => {\n ComponentModule._modules.push({target, ...options});\n },\n\n Init: () => {\n ComponentModule._modules.forEach(({ prefix, components, initFunc, target, template, mount = true, ...vueOptions }) => {\n const _prfx = prefix || '';\n const found = document.querySelectorAll(target);\n found.forEach(el => {\n initFunc && initFunc(Vue);\n const instance = new Vue({\n el: !template && el,\n store: store,\n components: components?.reduce((obj, {name, ...options}) => {\n obj[_prfx+name] = options;\n return obj;\n }, {}),\n template,\n ...vueOptions,\n })\n\n mount && instance.$mount(el, true);\n });\n });\n },\n};\n\nComponentModule._modules = [];\n\nexport default ComponentModule;\n","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport EventBus from './event-bus';\n// import { contactModal } from \"./modals\";\n\nconst ContactUs = () => {\n Vue.use(VModal);\n\n Vue.component('contact-us', {\n props: ['contactOpen'],\n methods: {\n toggleModal() {\n EventBus.$emit('close-contact');\n\n // this.$modal.show(\n // contactModal.template,\n // contactModal.name,\n // contactModal.options,\n // contactModal.events\n // )\n },\n },\n mounted() {\n }\n });\n\n}\n\nexport default ContactUs;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus'\nimport ContactUs from './contact-us';\n\nconst ctaBarBottom = () => {\n const ctaBar = document.querySelectorAll('.persistent-cta--bottom');\n\n let ctaBarConstructor = (id) => {\n Vue.component('cta-bar-bottom-template', {\n data: function() {\n return {\n isSticky: false,\n isMobile: store.state.isMobile,\n scrolled: false,\n isFinalPosition: false,\n observer: null,\n contactOpen: false,\n store: store\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n computedIsMobile: function() {\n if (this.computedIsMobile == true) {\n this.initShow();\n this.detectFooter();\n this.isMobile = true;\n \n EventBus.$on('stick-nav', () => {\n this.stickyNav();\n this.isSticky = true;\n });\n EventBus.$on('unstick-nav', () => {\n if (!this.isFinalPosition) {\n this.unstickyNav();\n this.isSticky = false;\n } else { return; }\n });\n } else {\n this.isMobile = false;\n EventBus.$off('stick-nav');\n EventBus.$off('unstick-nav');\n document.querySelector('.persistent-cta--bottom-final').classList.remove('active');\n this.unstickyNav();\n document.querySelector('.persistent-cta--bottom').style.display = \"none\";\n\n let target = document.querySelector('.footer');\n this.observer.disconnect(target);\n }\n },\n // isSticky: function() {\n // this.contactOpen = this.isSticky ? this.contactOpen : false; \n // }\n },\n methods: {\n toggleContact() {\n this.contactOpen = !this.contactOpen;\n },\n stickyNav() {\n if (!this.$el.parentNode.classList.contains('active') && !this.isSticky && this.computedIsMobile) {\n this.$el.parentNode.classList.add(\"active\");\n } \n },\n unstickyNav() {\n if (this.isSticky) {\n this.$el.parentNode.classList.remove(\"active\");\n }\n },\n initShow() {\n // show bottom after 3 seconds\n setTimeout(() => {\n this.$el.parentNode.classList.add('active');\n }, 3000);\n },\n detectFooter() {\n let options= {\n root: null,\n rootMargin: '0px',\n threshold: 0\n }\n const handleSticky = (changes) => {\n changes.forEach(change => {\n if (!(change.intersectionRatio > 0)) {\n this.isFinalPosition = false;\n document.querySelector('.persistent-cta--bottom').style.display = 'block';\n } else {\n this.isFinalPosition = true;\n document.querySelector('.persistent-cta--bottom').style.display = 'none';\n }\n })\n }\n let observer = new IntersectionObserver(handleSticky, options);\n this.observer = observer;\n let target = document.querySelector('.footer');\n\n observer.observe(target);\n }\n },\n mounted() {\n EventBus.$on('stick-nav', () => {\n this.stickyNav();\n this.isSticky = true;\n this.scrolled = true;\n });\n EventBus.$on('unstick-nav', () => {\n if (!this.isFinalPosition) {\n this.unstickyNav();\n this.isSticky = false;\n this.scrolled = true;\n } else { return; }\n });\n EventBus.$on('close-contact', () => {\n this.contactOpen = false;\n });\n if (this.isMobile) {\n this.initShow();\n this.detectFooter();\n }\n }\n });\n\n ContactUs();\n\n new Vue({\n el: `.persistent-cta--bottom-${id}`,\n store: store,\n }).$mount(`.persistent-cta--bottom-${id}`, true);\n }\n\n if (ctaBar.length > 0) {\n ctaBar.forEach((item, index) => {\n item.classList.add(`persistent-cta--bottom-${index}`);\n ctaBarConstructor(index);\n })\n }\n\n}\n\nexport default ctaBarBottom;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport ContactUs from './contact-us';\nimport VModal from 'vue-js-modal';\n// import {quoteModal} from './modals';\n\nconst ctaBarTop = () => {\n const ctaBar = document.querySelector('.persistent-cta--top');\n Vue.use(VModal);\n\n let ctaBarConstructor = () => {\n Vue.component('cta-bar-top-template', {\n data: function() {\n return {\n title: store.state.pageTitle || '',\n showTitle: false,\n anchorLinks: {test: 'test'},\n currentAnchor: null,\n // store: store, //for testing only\n hasAnchors: false,\n isMobile: false,\n scrollDir: null,\n contactOpen: false,\n contactOpenText: '',\n store: store\n }\n },\n created: function(){\n window.addEventListener('scroll', this.handleScroll);\n this.handleScroll();\n },\n destroyed: function(){\n window.removeEventListener('scroll', this.handleScroll);\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n },\n watch: {\n computedIsMobile: function() {\n this.isMobile = this.computedIsMobile;\n // this.scrollDirection();\n },\n scrollDir: function() {\n if (this.scrollDir == \"up\") {\n this.stickyNav();\n } else if (this.scrollDir == \"down\") {\n this.unstickyNav();\n } else if (this.scrollDir == \"top\") {\n this.$el.parentNode.classList.remove(\"active\");\n }\n },\n contactOpen: function() {\n this.contactOpenText = this.contactOpen ? '' : this.$refs.contactBtn.querySelector('.button-text').dataset.openText; \n }\n },\n methods: {\n handleScroll() {\n const el = this.$parent.$el;\n const wTop = document.documentElement.scrollTop || document.body.scrollTop;\n const eTop = this.parentTop || el.getBoundingClientRect().top;\n\n if (this.parentTop === null){\n this.parentTop = eTop;\n }\n\n if (wTop > eTop) {\n el.classList.add(\"persistent-cta--top-fixed\");\n } else {\n el.classList.remove(\"persistent-cta--top-fixed\");\n }\n },\n toggleContact(e) {\n this.contactOpen = !this.contactOpen;\n },\n\n // toggleModal() {\n // this.$modal.show(\n // quoteModal.template(),\n // quoteModal.name, \n // quoteModal.options,\n // quoteModal.events\n // )\n // },\n\n setTitle() {\n \n if (document.querySelector('h1')) {\n let pageTitle = document.querySelector('h1').innerText;\n store.commit('updateTitle', pageTitle);\n this.title = store.state.pageTitle;\n }\n },\n detectHero() {\n let options= {\n root: null,\n rootMargin: '0px',\n threshold: 0\n }\n const toggleTitle = (changes) => {\n changes.forEach(change => {\n if (!(change.intersectionRatio > 0)) {\n // console.log('hero NOT visible');\n this.showTitle = true;\n } else {\n // console.log('hero visible');\n this.showTitle = false;\n }\n })\n }\n let observer = new IntersectionObserver(toggleTitle, options);\n \n if (document.querySelector('h1')) {\n let target = document.querySelector('h1').parentNode;\n observer.observe(target);\n } else {return;}\n\n },\n setAnchors() {\n let anchorContainer = document.querySelectorAll('.sub-nav__list-container li a');\n let anchors = [];\n this.hasAnchors = anchorContainer.length > 0 ? true : false;\n\n if (this.hasAnchors) {\n // let test = '';\n // document.addEventListener('click', () => {\n // console.log(\"clicked\");\n // });\n anchorContainer.forEach((item, index) => {\n anchors.push({\n name: item.innerText,\n key: item.getAttribute('href').substr(1)\n });\n // console.log(item)\n // this.$nextTick(() => {\n // item.addEventListener(\"click\", () => {\n // console.log(\"CLICKED\");\n // }, false);\n\n // })\n\n });\n \n // console.log(anchors);\n this.anchorLinks = anchors;\n\n store.commit('setPageAnchors', anchors);\n this.$nextTick(() => {\n this.observeAnchors();\n })\n }\n },\n initMobile() {\n this.isMobile = store.state.isMobile;\n },\n scrollDirection() {\n var scrollPos = 0;\n var self = this;\n function handleScroll() {\n if (self.computedIsMobile) {\n if ((document.body.getBoundingClientRect()).top == 0) {\n self.scrollDir = \"top\";\n } else if ((document.body.getBoundingClientRect()).top > scrollPos) {\n EventBus.$emit('unstick-nav');\n self.scrollDir = \"up\";\n // this.stickyNav();\n } else {\n EventBus.$emit('stick-nav');\n self.scrollDir = \"down\";\n // this.unstickyNav();\n }\n scrollPos = (document.body.getBoundingClientRect()).top;\n } else {\n return;\n }\n }\n\n window.addEventListener(\"scroll\", handleScroll, true);\n \n },\n stickyNav() {\n if (!this.$el.parentNode.classList.contains('active')) {\n this.$el.parentNode.classList.add(\"active\");\n } \n },\n unstickyNav() {\n this.$el.parentNode.classList.remove(\"active\");\n },\n observeAnchors() {\n let options = {\n root: null,\n rootMargin: '0px',\n // threshold: .25\n threshold: [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]\n // more thresholds = more accuracy\n }\n\n const setCurrentAnchor = (entries) => {\n for (let entry of entries) {\n entry.target._intersectionHeight = entry.intersectionRect.height;\n }\n \n // compare visibility of sections(all) after every intersection\n const mostVisibleSection = targets.reduce((prev, current) => {\n if (current._intersectionHeight > (prev ? prev._intersectionHeight : 0)) {\n return current;\n } else {\n return prev;\n }\n }, null);\n if (mostVisibleSection) {\n this.currentAnchor = mostVisibleSection.dataset.id;\n } \n }\n\n let observer = new IntersectionObserver(setCurrentAnchor, options);\n let targets = [];\n\n this.anchorLinks.forEach((anchor) => {\n let target = document.querySelector(`[data-id=\"${anchor.key}\"]`);\n if (target) { targets.push(target); }\n });\n // console.log(targets);\n targets.forEach((target) => {\n observer.observe(target);\n })\n }\n },\n mounted() {\n // console.log(this.$el)\n this.setTitle();\n this.detectHero();\n this.setAnchors();\n this.initMobile();\n this.scrollDirection();\n\n this.contactOpenText = this.$refs.contactBtn.querySelector('.button-text').dataset.openText; \n // for opening the contact tooltip from other modules\n EventBus.$on(`open-contact`, () => {\n this.contactOpen = true;\n });\n // for toggling the contact tooltip in the cta top bar only\n EventBus.$on('toggle-contact', () => {\n this.toggleContact();\n })\n EventBus.$on('close-contact', () => {\n this.contactOpen = false;\n });\n }\n \n });\n\n Vue.component('anchor-dropdown', {\n props: ['anchorLinks', 'showTitle', 'hasAnchors', 'isMobile', 'currentAnchor'],\n data: function() {\n return {\n showAnchors: false,\n dropdownAnchor: null\n // showTopBar: true,\n }\n },\n computed: {\n computedCurrentAnchor: function() {\n return this.currentAnchor;\n }\n },\n watch: {\n \"currentAnchor\": function() {\n this.dropdownAnchor = this.currentAnchor;\n },\n // showTopBar: function() {\n // let topBar = document.querySelector('.persistent-cta--top');\n // if (this.isMobile) {\n // if (this.showTopBar == true) {\n // topBar.classList.remove('hide-bar');\n // } else if (this.showTopBar == false) {\n // topBar.classList.add('hide-bar');\n // }\n // }\n // },\n hasAnchors: function() {\n this.detectAnchors();\n }\n },\n template: `\n \n `,\n methods: {\n jump(e) {\n // console.log(\"jump\");\n window.location.hash = `#${e.target.value}`;\n // console.log(e.target.value);\n },\n detectAnchors() {\n var subNav = document.querySelector(\".sub-nav\");\n window.addEventListener(\"scroll\", () => {\n if (window.scrollY > subNav.offsetTop ){\n this.showAnchors = true;\n } else {\n this.showAnchors = false;\n }\n })\n },\n },\n mounted() {\n this.$nextTick(function() {\n if(this.hasAnchors) {\n this.detectAnchors();\n }\n }); \n }\n })\n\n Vue.component('anchor-dropdown-item', {\n props: ['data'],\n template: `\n \n `,\n });\n\n ContactUs();\n\n new Vue({\n el: '.persistent-cta--top',\n store: store,\n }).$mount('.persistent-cta--top', true);\n }\n\n if(ctaBar) {\n ctaBarConstructor();\n } \n\n}\n\nexport default ctaBarTop;\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\n\nconst documentationContextual = () => {\n\n let docs = document.querySelectorAll('.doc-con');\n\n let documentationConstructor = (id) => {\n Vue.component('documentation-contextual-template', {\n data: function() {\n return {\n emailDocs: [], //for emailing,\n mailto: null,\n mailtoAll: null,\n totalItems: null,\n items: [],\n }\n },\n watch: {\n \"emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}:%20${item.url}%0D%0A`;\n });\n this.mailto = mailto;\n },\n \"items\": function() {\n this.shareAll();\n },\n },\n methods: {\n updateEmailDocs(data) {\n let item = this.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.emailDocs = [...this.emailDocs, data];\n } else {\n this.emailDocs.splice(this.emailDocs.indexOf(item),1);\n }\n },\n updateItems(data) {\n this.items.push(data);\n },\n shareAll() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.items.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailtoAll = mailto;\n },\n },\n mounted() {\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('update-items', (data) => {\n this.updateItems(data);\n });\n this.shareAll(); //init share all\n\n this.totalItems = Array.from(this.$el.querySelectorAll('.doc-card')).length;\n }\n });\n\n Vue.component('doc-con-item', {\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: \"documentId\",\n name: null,\n url: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.name, \"url\": this.url, \"id\": this.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails},`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.name = this.$refs.name.innerText;\n this.url = this.$refs.name.getAttribute('href');\n this.$nextTick(() => {\n EventBus.$emit('update-items', {\"name\": this.name, \"url\": this.url, \"id\": this.id})\n });\n this.initSeeAll();\n }\n });\n\n new Vue({\n el: `.doc-con-${id}`,\n }).$mount(`.doc-con-${id}`, true);\n }\n\n if (docs.length > 0) {\n docs.forEach((item, index) => {\n item.classList.add(`doc-con-${index}`);\n documentationConstructor(index);\n })\n }\n\n}\n\nexport default documentationContextual;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Documentation = () => {\n\n let documentation = document.querySelectorAll('.documentation');\n\n const documentationConstructor = (id) => {\n Vue.component('documentation-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n query: null, //search query\n // store: store\n class: 'documentation',\n trackingType: 'document'\n },\n isLoading: null\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.documentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n },\n lang: function() {\n return store.state.currentLang;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.addLoading();\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n if (brands.length > 0) {\n this.populateProducts(brands); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n \n },\n methods: {\n toggleFilters() {\n if (this.data.isMobile) {\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return; //abort if not documentation module\n }\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n }\n console.log(this.data.filters)\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {\n return;\n }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(brands) {\n let brandStr = decodeURIComponent(brands.join('|'));\n let apiUrl = `/api/GetDocumentProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: brandStr,\n lang: this.lang\n }\n })\n .then(function(response) {\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n let query= this.data.query;\n let productParams = this.data.filters.filter(item => {\n return item.type == \"product\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let langParams = this.data.filters.filter(item => {\n return item.type == \"lang\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let brandParams = this.data.filters.filter(item => {\n return item.type == \"brand\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let docTypeParams = this.data.filters.filter(item => {\n return item.type == \"docType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n\n let pageParams = this.data.currentPage;\n this.data.urlParams = \"?\"\n if (query) {\n this.data.urlParams +=\"q=\"+encodeURIComponent(query);\n }\n this.data.urlParams += `${productParams !== \"\" ? \"&product=\" + productParams : \"\"}${langParams !== \"\" ? \"&lang=\" + langParams : \"\"}${brandParams !== \"\" ? \"&brand=\" + brandParams : \"\"}${docTypeParams !== \"\" ? \"&docType=\" + docTypeParams : \"\"}&savedDocuments=${savedDocumentsTrueParams()}&page=${pageParams}`;\n\n },\n\n didYouMean(e) {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n this.data.query = query;\n\n document.querySelector('.hero-center__search-input').value = query;\n this.addLoading();\n this.getResults(e);\n },\n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n if (inputField)\n inputField.classList.add('loading');\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n if (inputField)\n inputField.classList.remove('loading');\n },\n getResults(query) {\n\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n\n this.getUrl();\n let baseUrl = window.documentAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/documentation\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var brand = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"brand\":\n brand.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let brandStr = decodeURIComponent(brand.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n brand: brandStr == \"\" ? null : brandStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n var searchTerm = this.data.query;\n\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n ///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n \n }\n else {\n\n didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n }\n\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=\"#\";\n anchorElement.innerText = dym;\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(anchorElement.innerText);\n });\n allElements.push(anchorElement);\n });\n\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n \n for (let i = 0; i el.append(allElements[i]));\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n commaEl.style.paddingLeft = \"7px\";\n didyoumeanEl.forEach(el => el.append(commaEl));\n }\n } \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && \n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"documentation\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n // SET RESULTS\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n self.data.trackId = response.data.trackId;\n self.removeLoading();\n\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n\n EventBus.$emit('scroll-to-top', this.data.class);\n this.addLoading();\n this.getResults();\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n this.getUrl();\n let url = `${window.location.pathname}${this.data.urlParams}`;\n history.pushState(\"\",\"\",url);\n },\n // handle deep linking on history change\n deeplink() {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n\n var initFilters = [];\n let page;\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n\n let entry = {}\n if (type == \"page\") {\n page = parseInt(content);\n } else if (type == \"savedDocuments\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else if (type.toLocaleLowerCase() == \"manuals\") {\n entry = {\n \"type\": \"docType\",\n \"value\": \"Manuals%20%26%20Guides\",\n \"name\": \"Manuals & Guides\"\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n else if (type.toLocaleLowerCase() != \"manuals\") {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n });\n\n if (page)\n this.data.currentPage = page;\n\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.documentation__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.documentId[0] == \"\" ? store.state.favorites.documentId.slice(1) : store.state.favorites.documentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n \n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.addLoading();\n this.getResults();\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n //this.updateHistory(value);\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n this.addLoading();\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n\n // init results\n this.data.results = window.initialDocumentationApiResults.results;\n this.data.totalResults = window.initialDocumentationApiResults.totalResults;\n this.data.shownResults = window.initialDocumentationApiResults.results.length;\n // this.data.results = fpodb.documentation.results;\n // this.data.totalResults = fpodb.documentation.totalResults;\n // this.data.shownResults = fpodb.documentation.results.length;\n \n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n window.onpopstate = () => {\n this.deeplink();\n }\n\n if (window.manualsAndGuidesFilter && window.hasManuals) {\n this.data.filters = [...this.data.filters, {\"value\": window.manualsAndGuidesFilterValue, \"type\": \"docType\", \"name\": window.manualsAndGuidesFilterName}];\n }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n },\n });\n\n Vue.component('doc-products', {\n props: ['data', 'category'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
\n \n
\n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('doc-results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
\n \n
\n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('doc-results-item', {\n props: ['data', 'content', 'isSelected', 'isLoading'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.documentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url ? this.content.url.replace('download=true', 'download=false') : null;\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"document\", \n \"category\": this.content.eyebrow.split(\"|\")[0].trim(),\n \"label\": this.content.name, \n \"productLine\": this.content.details, \n \"language\": this.content.language,\n \"documentId\": this.content.documentId\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"data.emailDocs\": function() {\n if(this.data.emailDocs.length === 0){\n this.isChecked = false;\n }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n template: `\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {{content.eyebrow}}\n \\{{moreContent}} \n \\{{seeAllLabel}}\n
\n \n {{content.name}}\n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n
\n `,\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.content.name, \"url\": this.content.url, \"id\": this.content.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"documentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n //let details = this.$refs.seeAllContent.innerHTML.split(/[,;]+/);\n let details = this.$refs.seeAllContent.innerHTML.replace(\" ; \", \", \").split(/[,]+/);\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join().replace(/ ,/g, ',');;\n let moreDetails = details.slice(3).join().replace(/ ,/g, ',');\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n })\n ));\n }\n });\n\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n // mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${encodeURIComponent(item.url)}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n // shareAll() {\n // let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n // this.data.results.forEach(item => {\n // mailto = `${mailto}${item.name}: ${item.url}%0D%0A`;\n // });\n // this.mailtoAll = mailto;\n // }\n },\n mounted() {\n // if (parseInt(this.data.totalResults) <= 5) {\n // this.shareAll();\n // }\n }\n });\n\n new Vue({\n el: `.documentation-${id}`,\n store: store\n }).$mount(`.documentation-${id}`, true);\n }\n\n if (documentation.length > 0) {\n documentation.forEach((item, index) => {\n item.classList.add(`documentation-${index}`);\n documentationConstructor(index);\n })\n }\n\n // window.seeLessLabel = \"see less\";\n // window.seeAllLabel = \"see more\";\n\n}\n\nexport default Documentation;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\nimport store from './store';\nimport {pardotFormInstance} from \"./pardot-form\";\n\nconst Drawer = () => {\n const drawers = document.querySelectorAll('.drawer__wrapper');\n \n let drawerConstructor = (id) => {\n // main component wrapper\n Vue.component('drawer-template', {\n data: function() {\n return {\n activeTab: '',\n isMobile: store.state.isMobile,\n store: store\n }\n },\n computed: {\n mobileState: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n mobileState: function() {\n this.isMobile = this.mobileState;\n }\n },\n methods: {\n setActiveTab(e) {\n this.activeTab = e;\n },\n handleTab(e) {\n let tabTarget = e.currentTarget.dataset.target;\n \n if (tabTarget !== this.activeTab) {\n // console.log(\"derp\");\n this.setActiveTab(tabTarget);\n this.$el.querySelector('.drawer__tab-item.active').classList.remove('active');\n \n this.$el.querySelector(`[data-target=${tabTarget}]`).classList.add('active');\n }\n },\n setResponsive() {\n\n if (!isMobile) {\n // remove inline styles from accordions\n let accordionContainers = this.$el.querySelectorAll('.drawer__drawer-content-container');\n accordionContainers.forEach((item) => {\n item.style = null;\n });\n }\n },\n // set the first tab to active\n initDesktop() {\n\n if (this.isMobile) { //under 768px\n } else { //over 768px\n // if desktop, check for desktop buttons and set initial tab\n let initial = this.$el.querySelector('[data-target]').dataset.target;\n this.activeTab = initial;\n this.$el.querySelector('[data-target]').classList.add('active');\n }\n }\n },\n mounted() {\n // console.log(store.state.isMobile);\n this.initDesktop(); //set the first tab to active on init\n //listen for child click events on the labels and pass targets to parent\n EventBus.$on('handle-mobile', (e) => {\n this.setActiveTab(e);\n })\n EventBus.$on('handle-desktop', (e) => {\n this.setActiveTab(e);\n })\n }\n });\n\n // desktop labels\n Vue.component('drawer-tab-label', {\n props: ['activeTab', 'isMobile'],\n data: function() {\n return {\n tabTarget: '',\n isActive: false\n }\n },\n watch: {\n activeTab: function() {\n this.isActive = this.activeTab == this.tabTarget ? true : false;\n }\n },\n methods: {\n handleTab(e) {\n EventBus.$emit('handle-desktop', this.tabTarget);\n }\n },\n mounted() {\n this.tabTarget = this.$el.dataset.target;\n }\n });\n\n // mobile accordion containers & labels\n Vue.component('drawer-content-template', {\n props: ['activeTab', 'isMobile'], //active tab \n data: function() {\n return {\n tabName: '',\n isActive: false, //is current tab the selected tab 'activeTab'\n isOpen: false, //is tab open\n }\n },\n watch: {\n activeTab: function(tab) {\n this.isActive = this.tabName == tab ? true : false;\n },\n isActive: function() {\n if (!this.isActive) {\n this.isOpen = false; //set accodion to close when not the active item\n\n // close the accordion\n if (this.isMobile) {\n\n let contentArea = this.$el.querySelector('.drawer__drawer-content-container');\n let contentHeight = this.$el.querySelector('.drawer__drawer-content-inner').getBoundingClientRect().height;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n this.scrollToTop();\n }\n } else {\n // if this is the active tab, set isOpen to true when isActive is true to pre open the tab on mobile\n this.isOpen = true;\n }\n }\n },\n methods: {\n handleMobile(e) {\n let mobileTarget = e.currentTarget.parentNode.dataset.tabId;\n\n EventBus.$emit('handle-mobile', mobileTarget);\n\n if (this.isMobile) {\n // toggle the accordion\n this.handleAccordion(e);\n }\n },\n // toggle accordions\n handleAccordion(e) {\n let contentArea = this.$el.querySelector('.drawer__drawer-content-container');\n let contentHeight = this.$el.querySelector('.drawer__drawer-content-inner').getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n scrollToTop() {\n let elmOffset = this.$el.offsetTop;\n let scrollOffset = window.scrollY;\n // console.log(\"el\",elmOffset);\n // console.log(\"window\",scrollOffset);\n if (elmOffset < scrollOffset) {\n let elmPos = this.$el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n\n initMobile() {\n if (this.isMobile) {\n // console.log(\"is mobile\");\n } else {\n // console.log(\"not mobile\");\n\n // remove all inline styles for accordions on desktop\n let contentContainers = this.$el.querySelectorAll('.drawer__drawer-content-container');\n contentContainers.forEach((item) => {\n item.style = ''\n });\n } \n }\n },\n mounted() {\n var initialTab = this.$el.dataset.tabId;\n this.tabName = initialTab;\n this.initMobile();\n }\n });\n\n // import pardot form component instance\n pardotFormInstance;\n\n new Vue({\n el: `.drawer-${id}`,\n store: store\n }).$mount(`.drawer-${id}`, true);\n }\n\n if (drawers.length > 0) {\n drawers.forEach((item, index) => {\n item.classList.add(`drawer-${index}`);\n drawerConstructor(index);\n })\n }\n}\n\nexport default Drawer;","import Vue from 'vue/dist/vue.min.js';\n\nconst EventBus = new Vue();\n\nexport default EventBus;","/*\n Fetcher is a decorator function to add the Vue Fetcher component.\n * Arguments:\n - {Object} options\n - {Object} conf\n * Usage:\n The 'options' argument is the same configuration for a Vue Component. in addition, the next options:\n\n - name [string]: name used for Fetcher component in Vue. (by default is 'fetch'. Remember considering the prefix option.)\n\n in the 'conf' argument you can provide the next options:\n\n - fetchOnCreated [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching from the start\n - fetchOnUpdateParams [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching when the params are updated\n - fetchOnUpdatePostData [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching when the 'post data' object is updated\n - url [string]: is the server URL that will be used for the request\n - method [string]: by default is 'GET', is the request method to be used when making the request\n - fetchOptions [object]: is the Axios config (https://github.com/axios/axios)\n - debounceWait [integer]: time to wait between every call to the fetch function, it uses for changes in fields for voiding multiple calls to the API when the user is typing ( time in milliseconds. by default: 500 milliseconds)\n\n Just Props:\n\n - url-prop [string]: replace the url option\n - method-prop [string]: replace the method option\n - fetch-on-created-prop [boolean]: replace the fetchOnCreated option\n - fetch-on-update-post-data-prop [boolean]: replace the fetchOnUpdatePostData option\n - fetch-on-update-params-prop [boolean]: replace the fetchOnUpdateParamsData option\n\n Methods:\n\n fetch(successFunc [function], options [Object]): you can call the fetch function for doing a call to the service or API. also you can pass the successFunc function for altering process by default when the response is successful, and the second parameter is for changing or modifying the Axios config (https://github.com/axios/axios)\n\n Others:\n\n Params ('params'): is an object with GET parameters for the request, you can use it as an object in the Vue Data (with v-model or as Vue variable).\n\n Post Data ('postData'): is an object with POST data parameters for the request, you can use it as an object in the Vue Data (with v-model or as Vue variable).\n\n*/\nimport axios from 'axios';\nimport { debounce } from 'lib/misc';\n\nconst fetcher = ({name = 'fetch', props, data: dataProp, created, watch, methods, ...options}, conf = {}) => {\n const {\n fetchOnCreated = true,\n fetchOnUpdatePostData = true,\n fetchOnUpdateParams = true,\n url,\n method = 'GET',\n fetchOptions: _fetchOptions = {},\n fetchTrigger,\n debounceWait = 500\n } = conf;\n\n const { data: postData = {}, params = {}, fetchOptions } = _fetchOptions;\n\n return {\n name,\n props: {\n urlProp: String,\n methodProp: String,\n fetchOnCreatedProp: { type: Boolean, default: undefined },\n fetchOnUpdatePostDataProp: { type: Boolean, default: undefined },\n fetchOnUpdateParamsProp: { type: Boolean, default: undefined },\n ...props\n },\n data: function() {\n const _dataProp = dataProp && dataProp.call(this);\n let data = {\n url: this.urlProp || url,\n method: this.methodProp || method,\n fetchOptions,\n fetchOnCreated,\n fetchOnUpdateParams,\n fetchOnUpdatePostData,\n fetchTrigger: this.fetchTriggerProp || fetchTrigger,\n data: null,\n params,\n postData,\n ..._dataProp,\n };\n\n if (this.fetchOnCreatedProp !== undefined) {\n data.fetchOnCreated = this.fetchOnCreatedProp;\n }\n\n if (this.fetchOnUpdateParamsProp !== undefined) {\n data.fetchOnUpdateParams = this.fetchOnUpdateParamsProp;\n }\n\n if (this.fetchOnUpdatePostDataProp !== undefined) {\n data.fetchOnUpdatePostData = this.fetchOnUpdatePostDataProp;\n }\n\n return data;\n },\n created: function() {\n created && created.call(this);\n if (this.fetchOnCreated) {\n this.fetch();\n }\n },\n watch: {\n params:{\n handler: function() {\n if (this.fetchOnUpdateParams) {\n this.debounceFetch();\n }\n },\n deep: true\n },\n postData: {\n handler: function() {\n if (this.fetchOnUpdatePostData) {\n this.debounceFetch();\n }\n },\n deep: true\n },\n ...watch\n },\n methods: {\n debounceFetch: debounce(function(){ this.fetch() }, debounceWait),\n fetch: function(successFunc, options) {\n const _this = this;\n\n if (this.url || this.fetchOptions) {\n return axios({\n url: this.url,\n method: this.method,\n params: this.params,\n data: this.postData,\n ...this.fetchOptions,\n ...options\n }).then(function (response) {\n if (!successFunc || successFunc(response)){\n _this.data = response.data;\n }\n });\n }\n },\n ...methods\n },\n ...options\n }\n};\n\nexport default fetcher;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\n\nexport const Checkbox = {\n props: ['data', 'label', 'value', 'type', 'category'],\n data: function() {\n return {\n id: null,\n isChecked: false,\n }\n },\n // template for product checkboxes only\n // static checkboxes are inline templates \n template: `\n
\n \n
\n `,\n watch: {\n \"data.filters\": function() {\n this.checkState();\n },\n \"data.products\": function() {\n this.checkProductState();\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": this.data.trackingType, \n \"action\": this.category || null, \n \"label\": decodeURIComponent(this.id)\n })\n }\n },\n methods: {\n updateFilters(el, e, type) {\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n let item = this.data.filters.find(el => {\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n },\n checkProductState() {\n if (this.type === \"product\") {\n // console.log(\"is product\");\n let item = this.data.filters.find(el => {\n // console.log(\"el\", el.value);\n // console.log(\"id\", this.id);\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n // console.log(this.isChecked);\n }\n }\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n // this.category = null;\n this.checkState();\n // if has saved docs filter, get the label\n if (this.$refs.input.dataset.savedLabel) {\n this.data.savedDocsLabel = this.$refs.input.dataset.savedLabel;\n }\n }\n};\n\nexport const Accordion = {\n props: ['data', 'defaultopen'],\n components: {\n 'checkbox-item': Checkbox\n }, \n data: function() {\n return {\n isOpen: (this.defaultopen ? true : false), //is the accordion open\n isTruncated: null, //is accordion content truncated \n openText: null,\n closeText: null,\n seeAllTypesText: false\n }\n },\n watch: {\n isTruncated: function() {\n if (this.isTruncated == true) {\n this.openText = this.$refs.expandText.dataset.expandText;\n this.closeText = this.$refs.expandText.dataset.collapseText;\n }\n },\n \"data.products\": {\n deep: true,\n handler() {\n this.$nextTick(() => {\n /*\n this.isTruncated = this.data.products.length > 0 ? this.isTruncated : null;\n if (this.$el.querySelector('.checkbox:nth-of-type(6)')) {\n this.toggleTruncation(true);\n } else {\n this.isTruncated = null;\n }\n */\n }); \n }\n }\n },\n methods: {\n handleClick() {\n this.toggleAccordion();\n },\n\n toggleAccordion() {\n let contentArea = this.$refs.outerContainer;\n let contentHeight = this.$refs.innerContainer.getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n toggleSeeAll() {\n this.seeAllTypesText = !this.seeAllTypesText\n },\n toggleTruncation(state) {\n return;\n // console.log(\"truncate this\");\n if (state) {\n this.isTruncated = state;\n } else {\n this.isTruncated = this.isTruncated == null ? true : !this.isTruncated;\n }\n\n var truncHeight = 0;\n let container = this.$refs.innerContainer;\n\n const truncate = () => {\n for (let i = 1; i < 6; i++) {\n let el = this.$el.querySelector(`.checkbox:nth-of-type(${i})`);\n let itemHeight = el.getBoundingClientRect().height;\n let elStyles = window.getComputedStyle(el);\n let itemMargin = parseFloat(elStyles.marginBottom);\n\n truncHeight = truncHeight + itemHeight + itemMargin;\n }\n truncHeight = truncHeight + 5; //little bit of wiggleroom\n }\n\n truncate();\n\n if (this.isTruncated == true) {\n container.style.maxHeight = truncHeight + \"px\";\n } else {\n container.style.maxHeight = 'none';\n }\n },\n },\n mounted() {\n \n }\n};\n\nexport const SelectedFiltersComponent = {\n props: ['data'],\n data: function() {\n return {\n }\n },\n computed: {\n className: function() {\n return `${this.data.class}__selected-filters`;\n } \n },\n template: `\n
\n
\n
\n \n {{filter.name}}\n
\n
\n
\n `,\n methods: {\n removeFilter(e) {\n let type = e.currentTarget.dataset.type;\n let value = e.currentTarget.dataset.value;\n EventBus.$emit('remove-filter', this.data.class, value, type);\n }\n },\n mounted() {\n \n }\n};\n\nexport const PageNum = {\n props: ['data', 'num'],\n data: function() {\n return {\n page: null,\n isActive: false,\n isSpacer: false\n }\n },\n watch: {\n \"data.currentPage\": function() {\n this.isActive = this.data.currentPage == this.num ? true : false;\n }\n },\n template: `\n {{num}}\n `,\n methods: {\n changePageTo(num) {\n if(num !== \"...\") {\n EventBus.$emit('change-page-to', this.data.class, num);\n EventBus.$emit('scroll-to-top', this.data.class);\n } else {\n return;\n }\n },\n },\n mounted() {\n this.isActive = this.data.currentPage == this.num ? true : false;\n }\n};\n\nexport const Pagination = {\n props: ['data'],\n data: function() {\n return {\n pageNums: [],\n }\n },\n computed: {\n className: function() {\n return `${this.data.class}__pagination-nums`;\n }\n }, \n components: {\n 'page-num': PageNum\n },\n watch: {\n \"data.currentPage\": function() {\n this.pageNums = [];\n this.initPages();\n if (this.data.currentPage > this.data.totalPages) {\n EventBus.$emit('change-page-to', this.data.class, 1);\n }\n },\n \"data.totalPages\": function() {\n this.pageNums = [];\n this.initPages();\n EventBus.$emit('change-page-to', this.data.class, 1);\n }\n },\n template: `\n
\n \n
\n `,\n methods: {\n initPages() {\n if (this.data.totalPages <= 6) {\n // if less than 6 pages, list all pages\n for(let page = 1; page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n }\n } else {\n if(this.data.currentPage > this.data.totalPages - 6) {\n // on the last 6 pages, do not add ellipsis\n for(let page = this.data.totalPages - 5; page < this.data.currentPage + 6 && page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n // console.log(page);\n } \n } else {\n // if not on the last 6 pages, add ellpisis\n for(let page = this.data.currentPage; page < this.data.currentPage + 3 && page < this.data.totalPages - 1; page++) {\n this.pageNums.push(page);\n }\n this.pageNums.push(\"...\");\n for(let page = this.data.totalPages - 1; page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n }\n }\n }\n }\n },\n mounted() {\n this.initPages();\n }\n};\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst FooterUnits = () => {\n\n let footerUnits = document.querySelector('.footer__units-container');\n\n let FooterUnitsConstructor = () => {\n Vue.component('footer-unit-toggler', {\n data: function() {\n return {\n selectedUnit: store.state.units,\n selectedUnitText: null\n }\n },\n computed: {\n units: function() {\n return store.state.units;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"Preference\",\n \"action\": \"Unit of measure\",\n \"label\": this.selectedUnitText\n })\n }\n },\n watch: {\n units: function() {\n this.selectedUnit = this.units;\n this.setTags();\n }\n },\n methods: {\n handleChange(e) {\n store.commit('setUnits', e.target.value);\n this.setWidth();\n },\n setTags() {\n let select = this.$refs.select;\n // console.log(select);\n let selectedText = select.options[select.selectedIndex] ? select.options[select.selectedIndex].text : null;\n this.selectedUnitText = selectedText;\n },\n initTags() {\n let text = this.$el.querySelector(`option[value=\"${store.state.units}\"]`) ? this.$el.querySelector(`option[value=\"${store.state.units}\"]`).innerText : null;\n this.selectedUnitText = text;\n },\n setWidth() {\n let select = this.$refs.select;\n let selectedText = select.options[select.selectedIndex].text;\n let width = `${(selectedText.length / 2) + 2}em`; //assumes each chara is ~.5em width, +2em buffer\n select.style.maxWidth = width;\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.initTags();\n this.setWidth();\n })\n this.setTags();\n }\n });\n\n Vue.component('footer-lang-toggler', {\n data: function() {\n return {\n selectedLang: store.state.currentLang,\n selectedLangText: null,\n languages: [],\n store: store\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"Preference\",\n \"action\": \"Language\",\n \"label\": this.selectedLangText\n })\n }\n },\n watch: {\n \n },\n methods: {\n handleChange(e) {\n let url = e.target.value;\n let el = this.$refs.select;\n let lang = el.options[el.selectedIndex].dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n this.setWidth();\n window.location.href = url;\n },\n setTags() {\n let text = this.$el.querySelector(`option[value=\"${store.state.currentLang}\"]`) ? this.$el.querySelector(`option[value=\"${store.state.currentLang}\"]`).innerText : null;\n this.selectedLangText = text;\n },\n setWidth() {\n let select = this.$refs.select;\n let selectedText = select.options[select.selectedIndex].text;\n let width = `${(selectedText.length / 2) + 2}em`;//assumes each chara is ~.5em width, +2em buffer\n select.style.maxWidth = width;\n }\n\n },\n mounted() {\n this.setTags();\n this.$nextTick(() => {\n this.setWidth();\n });\n }\n });\n\n new Vue({\n el: `.footer__units-container`,\n }).$mount(`.footer__units-container`, true);\n }\n\n if (footerUnits) {\n FooterUnitsConstructor();\n }\n\n}\n\nexport default FooterUnits;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst FWMedia = () => {\n\n let media = document.querySelectorAll('.fw-media--video');\n Vue.use(VModal);\n\n let mediaConstructor = (id) => {\n Vue.component('fw-media-template', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n // console.log(\"clicked\");\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n },\n mounted() {\n this.videoUrl = this.$el.querySelector('.fw-media__play-button').dataset.videoUrl;\n this.videoName = this.$refs.name ? this.$refs.name.innerHTML : null;\n }\n });\n \n new Vue({\n el: `.fw-media-video-${id}`,\n }).$mount(`.fw-media-video-${id}`, true);\n }\n\n if (media.length > 0) {\n media.forEach((item, index) => {\n item.classList.add(`fw-media-video-${index}`);\n mediaConstructor(index);\n })\n }\n}\n\nexport default FWMedia;","/* \nAllows for inline text links to trigger vue modals with any content\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {genericModal} from './modals';\n\nVue.use(VModal);\n\nconst genericModals = () => {\n let instance = new Vue({\n methods: {\n triggerModal(content) {\n this.$modal.show(\n genericModal.template(content),\n genericModal.name, \n genericModal.options,\n genericModal.events\n )\n }\n },\n });\n\n let modalData = [];\n\n document.querySelectorAll('.gen-modal').forEach((item) => {\n let data = {\n \"hashtag\": item.dataset.hashtag,\n \"content\": item.innerHTML\n }\n modalData.push(data);\n });\n\n if (modalData) {\n document.addEventListener('click', (e) => {\n if (e.target.getAttribute('href')) {\n let target = e.target.getAttribute('href');\n \n for (let i=0; i < modalData.length; i++) {\n if (target.includes(`#${modalData[i].hashtag}`)) {\n e.preventDefault();\n \n instance.triggerModal(modalData[i].content);\n return false;\n } \n }\n }\n });\n }\n}\n\nexport default genericModals;","import Vue from 'vue/dist/vue.min.js';\nimport {specsTableTemplate} from './spec-table';\nimport EventBus from './event-bus';\nimport store from './store';\n\nconst HeroProduct = () => {\n\n const heros = document.querySelectorAll('.hero-products');\n\n const heroProductConstructor = (id) => {\n Vue.component('hero-product-template', {\n data: function() {\n return {\n sizeSelect: null,\n viewConfig: null,\n gallery: null,\n galleryItems: [],\n selectedImage: 1,\n selectedItem: null //product name for passing to child spec table component\n }\n },\n watch: {\n selectedImage: function() {\n\n },\n },\n methods: {\n init() {\n // assign unique ID to each gallery item\n // if multiple images, set gallery array\n if (this.$el.querySelectorAll('.hero-products__gallery-image').length > 1) {\n this.gallery = true;\n\n // push images and their heights to array\n this.$el.querySelectorAll('.hero-products__gallery-image').forEach((item, index) => {\n item.dataset.id = index + 1;\n // console.log(item.clientHeight);\n this.galleryItems.push({\n src: item.src,\n });\n });\n } else {\n // if only one image, set id to 1 (the default selected image id)\n this.$el.querySelector('.hero-products__gallery-image').dataset.id = 1;\n }\n\n this.selectedItem = this.$refs.title ? this.$refs.title.innerText : null;\n },\n handleImageSelect(id) {\n this.selectedImage = id;\n },\n },\n mounted() {\n this.init();\n // recieve selected gallery item from child\n EventBus.$on('selectedImage', (id) => {\n this.handleImageSelect(id);\n });\n }\n });\n\n Vue.component('hero-products-image', {\n props: ['selectedImage'],\n data: function() {\n return {\n id: null,\n isActive: false\n }\n },\n watch: {\n selectedImage: function() {\n this.isActive = this.selectedImage == this.id ? true : false;\n }\n },\n methods: {\n\n },\n mounted() {\n this.$nextTick(() => {\n this.id = this.$el.dataset.id;\n this.isActive = this.selectedImage == this.id ? true : false;\n });\n }\n });\n\n Vue.component('hero-products-thumbnails', {\n props: ['galleryItems', 'selectedImage'],\n data: function() {\n return {\n }\n },\n template: `\n \n `,\n methods: {\n\n },\n mounted() {\n\n }\n });\n\n Vue.component('hero-products-thumbnail-item', {\n props: ['image', 'id', 'selectedImage'],\n data: function() {\n return {\n isActive: false\n }\n },\n computed: {\n imageUrl: function() {\n return `url('${this.image}')`\n }\n },\n watch: {\n selectedImage: function() {\n this.isActive = this.selectedImage == this.id ? true : false ;\n }\n },\n template: `\n
  • \n `,\n methods: {\n selectImage() {\n // emit id of clicked element to parent\n EventBus.$emit('selectedImage', this.id);\n }\n },\n mounted() {\n this.isActive = this.selectedImage == this.id ? true : false ;\n }\n });\n\n new Vue({\n el: `.hero-products-${id}`,\n store: store\n }).$mount(`.hero-products-${id}`, true);\n }\n\n specsTableTemplate();\n\n if (heros.length > 0) {\n heros.forEach((item, index) => {\n item.classList.add(`hero-products-${index}`);\n heroProductConstructor(index);\n })\n }\n\n}\n\nexport default HeroProduct;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst homeHero = () => {\n\n const component = document.querySelector('.home-hero');\n\n let heroConstructor = () => {\n Vue.component('home-hero', {\n data: function() {\n return {\n selectedId: null\n }\n },\n mounted() {\n this.$on('select-section', (id) => {\n this.selectedId = id;\n });\n }\n });\n\n Vue.component('hero-section', {\n props: ['selectedId'],\n data: function() {\n return {\n isActive: false,\n isHovered: false,\n id: null\n }\n },\n watch: {\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n },\n isHovered: function() {\n if (this.isHovered || this.isActive) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n },\n isActive: function() {\n if (this.isActive) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n }\n },\n methods: {\n toggleExpand() {\n this.$parent.$emit('select-section', this.isActive ? null : this.id);\n // this.isActive = !this.isActive;\n },\n mouseover() {\n // console.log(\"moused over\");\n this.isHovered = true;\n },\n mouseleave() {\n // console.log(\"mouse leave\");\n this.isHovered = false;\n },\n playVideo() {\n this.$refs.video.play();\n },\n pauseVideo() {\n this.$refs.video.pause();\n },\n init() {\n this.id = Array.from(document.querySelectorAll('.home-hero__area')).indexOf(this.$el);\n },\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.home-hero`,\n }).$mount(`.home-hero`, true);\n }\n\n if (component) {\n heroConstructor();\n }\n\n}\n\nexport default homeHero;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\nimport store from './store';\n\nexport const template = {\n data: function() {\n return {\n activeTab: '',\n isMobile: null\n }\n },\n methods: {\n setActiveTab(e) {\n this.activeTab = e;\n },\n handleTab(e) {\n let tabTarget = e.currentTarget.dataset.target;\n\n if (tabTarget !== this.activeTab) {\n // console.log(\"derp\");\n this.setActiveTab(tabTarget);\n this.$el.querySelector('.hiw__tab-item.active').classList.remove('active');\n\n this.$el.querySelector(`[data-target=${tabTarget}]`).classList.add('active');\n }\n },\n setResponsive(mql) {\n this.isMobile = mql.matches ? true : false;\n if (!this.isMobile) {\n // remove inline styles from accordions\n let accordionContainers = this.$el.querySelectorAll('.hiw__hiw-content-container');\n accordionContainers.forEach((item) => {\n item.style = null;\n });\n }\n },\n // set the first tab to active\n initDesktop() {\n // this is checking for a breakpoint *smaller* than\n // var isMobile in store.js\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.setResponsive(mql);\n });\n \n\n if (this.isMobile) { //under 650px\n let initial = this.$el.querySelector('[data-target]') ? this.$el.querySelector('[data-target]').dataset.target : null;\n this.activeTab = initial;\n } else { //over 650px\n // if desktop, check for desktop buttons and set initial tab\n let initial = this.$el.querySelector('[data-target]') ? this.$el.querySelector('[data-target]').dataset.target : null;\n this.activeTab = initial;\n if (this.$el.querySelector('[data-target]')) {\n this.$el.querySelector('[data-target]').classList.add('active');\n }\n }\n }\n },\n mounted() {\n this.initDesktop(); //set the first tab to active on init\n //listen for child click events on the labels and pass targets to parent\n EventBus.$on('handle-mobile', (e) => {\n this.setActiveTab(e);\n })\n EventBus.$on('handle-desktop', (e) => {\n this.setActiveTab(e);\n })\n }\n};\n\nexport const tabLabel = {\n props: ['activeTab', 'isMobile'],\n data: function() {\n return {\n tabTarget: '',\n isActive: false,\n index: null,\n label: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Drawer\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.index < 10 ? `0${this.index}` : `${this.index}`\n });\n }\n },\n watch: {\n activeTab: function() {\n this.isActive = this.activeTab == this.tabTarget ? true : false;\n }\n },\n methods: {\n handleTab(e) {\n EventBus.$emit('handle-desktop', this.tabTarget);\n },\n init() {\n this.label = this.$el.innerText;\n // console.log()\n this.index = Array.prototype.slice.call(document.querySelectorAll('.hiw__tab-labels li')).indexOf(this.$el) + 1;\n },\n },\n mounted() {\n this.tabTarget = this.$el.dataset.target;\n this.init();\n }\n};\n\nexport const contentTemplate = {\n props: ['activeTab', 'isMobile'], //active tab\n data: function() {\n return {\n tabName: '',\n isActive: false, //is current tab the selected tab 'activeTab'\n isOpen: false, //is tab openm\n label: null,\n index: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Drawer\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.index < 10 ? `0${this.index}` : `${this.index}`\n });\n }\n },\n watch: {\n activeTab: function(tab) {\n this.isActive = this.tabName == tab ? true : false;\n },\n isActive: function() {\n if (!this.isActive) {\n this.isOpen = false; //set accodion to close when not the active item\n\n // close the accordion\n if (this.isMobile) {\n\n let contentArea = this.$el.querySelector('.hiw__hiw-content-container');\n let contentHeight = this.$el.querySelector('.hiw__hiw-content-inner').getBoundingClientRect().height;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n this.scrollToTop();\n }\n } else {\n // if this is the active tab, set isOpen to true when isActive is true to pre open the tab on mobile\n this.isOpen = true;\n }\n }\n },\n methods: {\n handleMobile(e) {\n let mobileTarget = e.currentTarget.parentNode.dataset.tabId;\n\n EventBus.$emit('handle-mobile', mobileTarget);\n\n if (this.isMobile) {\n // toggle the accordion\n this.handleAccordion(e);\n }\n },\n scrollToTop() {\n let elmOffset = this.$el.offsetTop;\n let scrollOffset = window.scrollY;\n if (elmOffset < scrollOffset) {\n let elmPos = this.$el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n // toggle accordions\n handleAccordion(e) {\n let contentArea = this.$el.querySelector('.hiw__hiw-content-container');\n let contentHeight = this.$el.querySelector('.hiw__hiw-content-inner').getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n\n initMobile() {\n if (this.isMobile) {\n // console.log(\"is mobile\");\n } else {\n // console.log(\"not mobile\");\n\n // remove all inline styles for accordions on desktop\n let contentContainers = this.$el.querySelectorAll('.hiw__hiw-content-container');\n contentContainers.forEach((item) => {\n item.style = ''\n });\n }\n },\n init() {\n this.index = Array.prototype.slice.call(document.querySelectorAll('.hiw__area-content .hiw__hiw-container')).indexOf(this.$el) + 1;\n this.label = Array.prototype.slice.call(document.querySelectorAll('.hiw__tab-labels li'))[(this.index - 1)].innerText;\n }\n },\n mounted() {\n var initialTab = this.$el.dataset.tabId;\n this.tabName = initialTab;\n this.initMobile();\n this.init();\n }\n};\n\n\nconst HowItWorks = () => {\n const instances = document.querySelectorAll('.hiw__wrapper');\n\n let hiwConstructor = (id) => {\n // main component wrapper\n Vue.component('hiw-template', template);\n\n // desktop labels\n Vue.component('hiw-tab-label', tabLabel);\n\n // mobile accordion containers & labels\n Vue.component('hiw-content-template', contentTemplate);\n\n new Vue({\n el: `.hiw-${id}`,\n store: store\n }).$mount(`.hiw-${id}`, true);\n }\n\n if (instances.length > 0) {\n instances.forEach((item, index) => {\n item.classList.add(`hiw-${index}`);\n hiwConstructor(index);\n })\n }\n}\n\nexport default HowItWorks;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\n\nconst internalSearch = () => {\n\n let searchBar = document.querySelectorAll('.hero-center__search');\n\n let internalSearchConstructor = (id) => {\n Vue.component('internal-search', {\n data: function() {\n return {\n value: window.softwareHasQuery ? window.softwareQuery : null,\n type: null\n }\n },\n watch: {\n \"value\": function() {\n if (this.value == \"\") {\n //console.log(\"no value\")\n EventBus.$emit('internal-search', null, this.type);\n }\n }\n },\n methods: {\n handleSubmit(e, type) {\n let value = this.value;\n // console.log(value);\n // emit search query to documentation and software modules\n EventBus.$emit('internal-search', value, type);\n }\n },\n mounted() {\n this.type = this.$refs.form.dataset.type;\n EventBus.$emit('internal-search', this.value, this.type);\n }\n });\n\n new Vue({\n el: `.internal-search-${id}`,\n }).$mount(`.internal-search-${id}`, true);\n };\n\n if (searchBar.length > 0) {\n searchBar.forEach((item, index) => {\n item.classList.add(`internal-search-${index}`);\n internalSearchConstructor(index);\n })\n }\n\n}\n\nexport default internalSearch;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Legal = () => {\n\n let legal = document.querySelectorAll('.legal');\n\n const legalConstructor = (id) => {\n Vue.component('legal-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n class: 'legal',\n trackingType: 'document'\n // store: store\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.legalDocumentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n \n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {return; }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n \n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n\n let certTypeParams = this.data.filters.filter(item => {\n return item.type == \"certType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let langParams = this.data.filters.filter(item => {\n return item.type == \"lang\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let docTypeParams = this.data.filters.filter(item => {\n return item.type == \"docType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let regionParams = this.data.filters.filter(item => {\n return item.type == \"region\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n\n let pageParams = this.data.currentPage;\n\n this.data.urlParams = `?${certTypeParams !== \"\" ? \"&certificationType=\" + certTypeParams : \"\"}${langParams !== \"\" ? \"&lang=\" + langParams : \"\"}${regionParams !== \"\" ? \"®ion=\" + regionParams : \"\"}${docTypeParams !== \"\" ? \"&docType=\" + docTypeParams : \"\"}&savedDocuments=${savedDocumentsTrueParams()}&page=${pageParams}`;\n\n },\n getResults(query) {\n // let apiUrl = \"api/documents?\";\n this.data.currentPage = query ? 1 : this.data.currentPage;\n this.getUrl();\n let baseUrl = window.legalAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/legal\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var certType = [];\n var lang = [];\n var region = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"certType\":\n certType.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"region\":\n region.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let certTypeStr = decodeURIComponent(certType.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let regionStr = decodeURIComponent(region.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: query ? query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n certificationType: certTypeStr == \"\" ? null : certTypeStr,\n language: langStr == \"\" ? null : langStr,\n region: regionStr == \"\" ? null : regionStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n //console.log(response.data);\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.getResults();\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n let url = `${window.location.pathname}${this.data.urlParams}`;\n history.pushState(\"\",\"\",url);\n },\n // handle deep linking on history change\n deeplink() {\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n // console.log(params);\n // this.data.filters = []; //clear filters array first\n\n var initFilters = [];\n let page;\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n // console.log(\"TYPE\",type);\n // console.log(\"CONTENT\", content);\n\n let entry = {}\n if (type == \"page\") {\n // console.log(\"PAGE\", parseInt(content));\n // this.data.currentPage = parseInt(content);\n page = parseInt(content);\n } else if (type == \"savedDocuments\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n // console.log(this.initFilters);\n\n });\n\n this.data.currentPage = page;\n\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.legal__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.legalDocumentId[0] == \"\" ? store.state.favorites.legalDocumentId.slice(1) : store.state.favorites.legalDocumentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el ,value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.getResults();\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n // init results\n this.data.results = window.initialLegalApiResults.results;\n this.data.totalResults = window.initialLegalApiResults.totalResults;\n this.data.shownResults = window.initialLegalApiResults.results.length;\n // this.data.results = fpodb.legal.results;\n // this.data.totalResults = fpodb.legal.totalResults;\n // this.data.shownResults = fpodb.legal.results.length;\n\n\n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n if (window.location.search) {\n this.$nextTick(() => {\n this.deeplink();\n });\n }\n }\n });\n\n \n // results list\n Vue.component('legal-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('legal-results-item', {\n props: ['data', 'content', 'isSelected'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.legalDocumentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url.replace('download=true', 'download=false');\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"legalDocument\", \n \"category\": this.content.eyebrow, \n \"label\": this.content.name, \n \"language\": this.content.language\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"data.emailDocs\": function() {\n if(this.data.emailDocs.length === 0){\n this.isChecked = false;\n }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n // console.log(this.$refs.bookmark.dataset.documentId);\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n template: `\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n \n {{content.details}} \\{{moreContent}} \\{{seeAllLabel}} | {{content.language}}\n \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n
    \n `,\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.content.name, \"url\": this.content.url, \"id\": this.content.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"legalDocumentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n // console.log(\"saved\",this.saved);\n this.initSeeAll();\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n // mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${encodeURIComponent(item.url)}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n // shareAll() {\n // let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n // this.data.results.forEach(item => {\n // mailto = `${mailto}${item.name}: ${item.url}%0D%0A`;\n // });\n // this.mailtoAll = mailto;\n // }\n },\n mounted() {\n // if (parseInt(this.data.totalResults) <= 5) {\n // this.shareAll();\n // }\n }\n });\n\n new Vue({\n el: `.legal-${id}`,\n store: store\n }).$mount(`.legal-${id}`, true);\n }\n\n if (legal.length > 0) {\n legal.forEach((item, index) => {\n item.classList.add(`legal-${index}`);\n legalConstructor(index);\n })\n }\n\n window.seeLessLabel = \"see less\";\n window.seeAllLabel = \"see more\";\n\n}\n\nexport default Legal;\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport VModal from 'vue-js-modal';\nimport { instance } from \"./modal-trigger\";\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nVue.use(VModal);\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst LitOrder = () => {\n\n let litOrder = document.querySelectorAll('.lit-order');\n\n const litOrderConstructor = (id) => {\n Vue.component('lit-order-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n query: null, //search query,\n store: store,\n selectedItems: null,\n cartContents: null,\n isSubmitted: false,\n modalTarget: null, //modal hash for lit order form\n class: 'lit-order',\n trackingType: 'document'\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.documentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n },\n lang: function() {\n return store.state.currentLang;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n if (brands.length > 0) {\n this.populateProducts(brands); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n },\n \"data.emailDocs\": function() {\n store.commit('updateLitOrderCart', this.data.emailDocs); //store cart in store\n\n // construct data string for passing selected docs to pardot\n let itemsStr;\n \n this.data.emailDocs.forEach((item) => {\n let str = `DOCUMENT ID: ${item.partNumber} | DOCUMENT NAME: ${item.name} | QUANTITY: ${item.qty} | PRE-PUNCHED: ${item.prePunched == true ? \"yes\" : \"no\"}`;\n if (itemsStr) {\n itemsStr = str ? `${itemsStr} || ${str}` : `${itemsStr}`;\n } else {\n itemsStr = str ? str : null\n }\n });\n\n this.data.selectedItems = itemsStr;\n\n // get cart \n // this.$nextTick(() => {\n // // console.log(this.$refs.cart.$el);\n // // console.log(this.$refs.cart.$el.outerHTML);\n // let cart = this.$refs.cart.$el.outerHTML;\n // this.data.cartContents = cart;\n // })\n }\n \n },\n methods: {\n openCart(e) {\n // prevent opening cart if its empty\n if (this.data.emailDocs.length == 0) {\n e.stopPropagation();\n }\n },\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return; \n }\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) { return; }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(brands) {\n // need to concat options from all selected brands and remove options when brands are unselected \n let brandStr = decodeURIComponent(brands.join('|'));\n // // console.log(brandStr);\n let apiUrl = `/api/GetDocumentProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: brandStr,\n lang: this.lang\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n \n getResults(query) {\n\n // let apiUrl = \"api/documents?\";\n // console.log(\"QUERY\", query);\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n\n // this.getUrl();\n let baseUrl = window.documentAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/documentation\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var brand = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"brand\":\n brand.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let brandStr = decodeURIComponent(brand.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n brand: brandStr == \"\" ? null : brandStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n //console.log(response.data);\n\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.getResults();\n },\n // updateEmailDocs(data) {\n // // add or remove items to email\n // let item = this.data.emailDocs.find(item => {\n // return item.id == data.id;\n // });\n\n // if (!item) {\n // this.data.emailDocs = [...this.data.emailDocs, data];\n // } else {\n // this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n // }\n // },\n updateEmailDocData(data) {\n let existing = this.data.emailDocs.filter((item) => {\n return item.id == data.id;\n });\n let updatedData;\n if (existing.length > 0) {\n updatedData = this.data.emailDocs.map((item) => {\n if (data.id == item.id) {\n return item = data;\n } else {\n return item;\n }\n });\n } else {\n updatedData = [\n ...this.data.emailDocs,\n data\n ]\n }\n this.data.emailDocs = updatedData;\n },\n removeCartItem(id) {\n // let index = this.data.emailDocs.map((e) => {\n // return e.id\n // }).indexOf(id);\n // if (index > -1) {\n // this.data.emailDocs.splice(index,1);\n // }\n\n this.data.emailDocs = this.data.emailDocs.filter((item) => {\n return item.id !== id;\n });\n },\n \n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.lit-order__area-cards').getBoundingClientRect().top + window.scrollY -100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n handleSubmit(data) {\n if (data.modalName == this.data.modalTarget) {\n // set isSubmitted to true when form is submitted\n this.data.isSubmitted = true;\n }\n },\n handleClose(data) {\n if ((data.modalName == this.data.modalTarget) && this.data.isSubmitted) {\n this.data.emailDocs = []; //empty cart contents array on modal close (only if form is submitted)\n this.data.isSubmitted = false; //set is submitted back to false\n }\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.documentId[0] == \"\" ? store.state.favorites.documentId.slice(1) : store.state.favorites.documentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.getResults();\n });\n // EventBus.$on('email-docs', (data) => {\n // this.updateEmailDocs(data);\n // });\n EventBus.$on('update-email-doc-data', (data) => {\n this.updateEmailDocData(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n EventBus.$on('remove-cart-item', (id) => {\n this.removeCartItem(id);\n });\n EventBus.$on('form-submitted', (data) => {\n this.handleSubmit(data);\n });\n EventBus.$on('form-closed', (data) => {\n this.handleClose(data);\n });\n\n // init results\n this.data.results = window.initialDocumentationApiResults.results;\n this.data.totalResults = window.initialDocumentationApiResults.totalResults;\n this.data.shownResults = window.initialDocumentationApiResults.results.length;\n // this.data.results = fpodb.documentation.results;\n // this.data.totalResults = fpodb.documentation.totalResults;\n // this.data.shownResults = fpodb.documentation.results.length;\n\n\n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n\n \n this.$nextTick(() => {\n this.data.modalTarget = this.$refs.cartButton.getAttribute('href').substring(1);\n // dynamic cart component container for passing to generic form modal \n this.data.cartContents = `
    `;\n })\n }\n },\n mounted() {\n this.init();\n this.initPages();\n\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n\n \n\n Vue.component('lit-products', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('lit-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"document\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n },\n qtyData(result) {\n let saved = this.data.emailDocs.find(i => i.id == result.id);\n if (saved) {\n return ({\n qty: saved.qty,\n prePunched: saved.prePunched \n });\n } else {\n return null;\n }\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('lit-results-item', {\n props: ['data', 'content', 'isSelected', 'qtyData', 'cartVersion'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n prePunched: this.qtyData ? this.qtyData.prePunched : null,\n qty: this.qtyData ? this.qtyData.qty : null,\n valid: true,\n isInCart: this.cartVersion ? true : null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.documentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url.replace('download=true', 'download=false');\n },\n errorMsg: function() {\n return window.enterValidQuantityLabel;\n },\n newTabLink: function() {\n return this.content.url ? this.content.url.replace('download=true', 'download=false') : null;\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"cartVersion\": function() {\n if (this.cartVersion) {\n this.isInCart = true;\n }\n },\n \"data.emailDocs\": function() {\n let match = this.data.emailDocs.filter((item) => {\n return item.id == this.id;\n });\n this.isInCart = match.length > 0 ? true : false;\n if (match.length > 0) {\n this.qty = match[0].qty;\n this.prePunched = match[0].prePunched;\n } \n // else {\n // this.qty = \"\";\n // this.prePunched = null;\n // }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"qty\": function() {\n if (!this.cartVersion) {\n // allow empty qty value if not in cart\n this.valid = this.qty.match(/^\\d+$/) && parseInt(this.qty) >= 5 ? true : this.qty == \"\" ? true : false;\n } else {\n // if is in cart, empty values are invalid\n this.valid = this.qty.match(/^\\d+$/) && parseInt(this.qty) >= 5 ? true : false;\n }\n\n // if qty is valid, update the value\n this.$nextTick(() => {\n if (this.valid && this.qty !== \"\" && this.isInCart) {\n EventBus.$emit('update-email-doc-data', {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n });\n }\n })\n\n // validate values if qty is updated in cart\n if (this.isInCart && this.cartVersion) {\n EventBus.$emit('check-errors');\n }\n },\n \"prePunched\": function() {\n if (this.valid && this.qty !== \"\" && this.isInCart) {\n EventBus.$emit('update-email-doc-data', {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n });\n }\n },\n \"qtyData\": function() {\n // clear qty and prepunched data if null\n if (!this.qtyData) {\n this.qty = \"\";\n this.prePunched = null;\n }\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n \n {{content.details}} \\{{moreContent}} \\{{seeAllLabel}} | {{content.language}}\n \n
    \n
    \n
    \n \n Add\n \n
    \n
    \n

    {{errorMsg}}

    \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n `,\n methods: {\n // emailDoc() {\n // EventBus.$emit('email-docs', {\n // \"name\": this.content.name, \n // \"url\": this.content.url, \n // \"id\": this.content.id, \n // \"qty\": this.qty,\n // \"prePunched\": this.prePunched,\n // \"eyebrow\": this.content.eyebrow,\n // \"details\": this.content.details\n // });\n // },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"documentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n },\n addToCart() {\n if (!this.qty) {\n this.valid = false;\n } else if (parseInt(this.qty) < 5) {\n this.valid = false;\n } else {\n let data = {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n }\n EventBus.$emit('update-email-doc-data', data);\n }\n },\n removeFromCart() {\n EventBus.$emit('remove-cart-item', this.id);\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n\n // if item is explicitly removed from cart, clear its input values\n EventBus.$on('remove-cart-item', (id) => {\n if (id == this.id) {\n this.qty = \"\";\n this.prePunched = null;\n }\n });\n }\n });\n\n // cart\n Vue.component('cart', {\n props: ['modalTarget'],\n data: function() {\n return {\n hasErrors: null,\n cartHash: null,\n isSubmitted: false\n }\n },\n computed: {\n cartContent: function() {\n return store.state.litOrderCart;\n },\n errorMsg: function() {\n return window.enterValidQuantityLabel;\n }\n },\n watch: {\n hasErrors: function() {\n if (this.hasErrors) {\n this.$el.parentNode.classList.add('hasErrors');\n } else {\n this.$el.parentNode.classList.remove('hasErrors');\n }\n },\n cartContent: function() {\n if (this.cartContent.length == 0) {\n instance.closeModal(this.cartHash);\n }\n },\n // for showing/hiding cart module. hide if submitted.\n isSubmitted: function() {\n this.$el.style.display = this.isSubmitted ? 'none' : 'block';\n }\n },\n template: `\n
    \n
    \n \n
    \n

    {{errorMsg}}

    \n

    `,\n methods: {\n qtyData(result) {\n let saved = this.cartContent.find(i => i.id == result.id);\n if (saved) {\n return ({\n qty: saved.qty,\n prePunched: saved.prePunched \n });\n } else {\n return null;\n }\n },\n checkErrors() {\n // console.log(\"checking\");\n this.$nextTick(() => {\n let invalidEntry = this.$el.querySelector('.lit-card__qty-input.invalid');\n this.hasErrors = invalidEntry ? true : false;\n //console.log(invalidEntry);\n })\n },\n getHash() {\n this.cartHash = this.$el.closest('.bmi-modal__wrapper') ? this.$el.closest('.bmi-modal__wrapper').getAttribute('name') : null;\n },\n handleSubmit(data) {\n if (data.modalName == this.modalTarget) {\n this.isSubmitted = true;\n }\n },\n handleClose(data) {\n if ((data.modalName == this.modalTarget) && this.isSubmitted) {\n this.isSubmitted = false; //set is submitted back to false\n }\n },\n init() {\n EventBus.$on('form-submitted', (data) => {\n this.handleSubmit(data);\n });\n EventBus.$on('form-closed', (data) => {\n this.handleClose(data);\n });\n }\n },\n mounted() {\n EventBus.$on('check-errors', () => {\n this.checkErrors();\n });\n this.getHash(); \n this.init();\n }\n });\n\n new Vue({\n el: `.lit-order-${id}`,\n store: store\n }).$mount(`.lit-order-${id}`, true);\n }\n\n if (litOrder.length > 0) {\n litOrder.forEach((item, index) => {\n item.classList.add(`lit-order-${index}`);\n litOrderConstructor(index);\n })\n }\n\n // window.enterValidQuantityLabel = \"error test\";\n\n}\n\nexport default LitOrder;\n","import Vue from 'vue/dist/vue.min.js';\nimport { lory } from 'lory.js';\nimport EventBus from './event-bus';\n\n// **NOTE**\n// 1 index\n\nconst MarketApps = () => {\n\n const apps = document.querySelectorAll('.market-apps');\n\n const marketAppsConstructor = (id) => {\n\n Vue.component('market-apps-template', {\n data: function() {\n return {\n sliderEl: null,\n options: {\n classNameFrame: 'market-apps__frame',\n enableMouseEvents: true\n },\n lory: null,\n length: null,\n currentSlide: 1,\n }\n },\n methods: {\n initLory() {\n this.lory = lory(this.sliderEl, this.options);\n },\n initListener() {\n this.sliderEl.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex() + 1;\n });\n\n EventBus.$on('select-slide', (target) => {\n this.currentSlide = target;\n this.lory.slideTo(target - 1);\n });\n },\n initTags() {\n let tags = {\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": null,\n \"no\": null\n }\n this.sliderEl.querySelectorAll('li').forEach((slide, i) => {\n slide.dataset.tagMeta = JSON.stringify({\n ...tags,\n \"label\": this.$el.querySelectorAll('.market-apps__nav-item a')[i].innerText,\n \"no\": (i + 1) < 10 ? `0${i + 1}` : `${i + 1}`\n })\n });\n }\n },\n mounted() {\n this.sliderEl = this.$el.querySelector('.market-apps__slider');\n this.length = this.$el.querySelectorAll('.market-apps__slide').length;\n this.initLory();\n this.initListener();\n this.initTags();\n }\n });\n\n Vue.component('market-apps-nav-item', {\n props: ['currentSlide'],\n data: function() {\n return {\n target: null,\n isActive: null,\n label: null\n } \n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.target < 10 ? `0${this.target}` : this.target.toString()\n })\n }\n \n },\n watch: {\n currentSlide: function() {\n this.isActive = this.target == this.currentSlide ? true : false;\n }\n },\n methods: {\n init() {\n // set target id based on node position\n this.target = [].indexOf.call(this.$el.parentNode.children, this.$el) + 1; \n\n this.isActive = this.target == this.currentSlide ? true : false;\n this.label = this.$el.querySelector('a').innerText;\n },\n selectSlide() {\n EventBus.$emit('select-slide', this.target);\n }\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.market-apps-${id}`,\n }).$mount(`.market-apps-${id}`, true);\n\n }\n\n if (apps.length > 0) {\n apps.forEach((item, index) => {\n item.classList.add(`market-apps-${index}`);\n marketAppsConstructor(index);\n })\n }\n\n}\n\nexport default MarketApps;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport { debounce } from 'lib/misc';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\n\n// NOTES:\n// menu is broken down into primary, 2nd level, and 3rd level \"panels\" \n// primary: top level menu category (e.g. municipal water solutions, industrial measurement solutions)\n// 2nd lvl: categories under the primary category (e.g. products, product lines)\n// 3rd lvl: content inside the 2nd level category (e.g. meters, meter components, endpoints)\n\n// \"primary\" and \"secondary\" menu panels/items are based on the \n// megamenu DOM order in megamenu.hbs. \n\n// on mobile, primary-menu-item ID is determined by DOM order. (e.g. the first item in the dom is primary-1, the second is primary-2, etc.)\n// selectedSecondaryId is constructed from the secondary level ID and its parent, the selected primary Id (e.g. secondary-1-primary-2 refers to the 1st secondary category in the 2nd primary category)\n\n\nconst Megamenu = () => {\n\n const menu = document.querySelector('.megamenu');\n let historyArr = []\n let highestTierOpen = 0;\n\n const clearMobileMenu = function()\n {\n historyArr.length = 0;\n highestTierOpen = 0;\n const megaTiers = document.querySelector('.mega__content .mega__tiers');\n const triggersWrap = document.querySelector('.mega__triggers');\n const openTiers = document.querySelectorAll('.mobileActiveTier') \n const openCols = document.querySelectorAll('.mobileActiveCol') \n \n for(let i=0; i< openTiers.length; i++) // close all open mobile tiers (more than one might have been opened by desktop menu)\n {openTiers[i].classList.remove('mobileActiveTier')}\n \n for(let i=0; i< openCols.length; i++) // close all open mobile Cols (more than one might have been opened by desktop menu)\n {openCols[i].classList.remove('mobileActiveTier')}\n\n megaTiers.classList.add('mobileHide') // restore menu to default setting\n triggersWrap.classList.add('mobileActiveTier')\n }\n\n\n const megamenuConstructor = () => { \n Vue.component('megamenu-template', {\n data: function() {\n return {\n data: {\n isMobile: store.state.isMobile,\n selectedPrimaryId: null,\n selectedSecondaryId: null,\n selectedTopbarId: null,\n mobileMenuOpen: false,\n topbarMenuOpen: false, //topbar menu INSIDE the megamenu, not the one outside\n primaryMenuOpen: false,\n secondaryMenuOpen: false,\n menuData: store.state.menuKeys,\n searchOpen: false,\n store: store,\n scrollDir: null,\n }\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n computedMenuData: function() {\n return store.state.menuKeys;\n },\n },\n watch: {\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n if (!this.data.isMobile) {\n // close mobile menu if desktop\n this.data.mobileMenuOpen = false;\n } \n this.positionMenu();\n },\n computedMenuData: function() {\n this.data.menuData = this.computedMenuData;\n },\n // handle closing megamenu on outside click\n \"data.selectedPrimaryId\": function() {\n if (!this.data.isMobile) {\n if (this.data.selectedPrimaryId !== null) {\n document.addEventListener('click', this.outsideClick);\n } else {\n document.removeEventListener('click', this.outsideClick);\n }\n } else {\n document.removeEventListener('click', this.outsideClick);\n }\n },\n \"data.scrollDir\": function() {\n let menuContainer = this.$el.parentNode;\n // console.log(menuContainer);\n switch (this.data.scrollDir) {\n case \"top\":\n menuContainer.classList.remove(\"hidden\");\n break;\n case \"up\":\n menuContainer.classList.remove(\"hidden\");\n break;\n case \"down\":\n menuContainer.classList.add(\"hidden\");\n break;\n default:\n return;\n }\n }\n },\n methods: {\n toggleMobileMenu() {\n this.data.mobileMenuOpen = !this.data.mobileMenuOpen; ///////////////////////////////////////////////////////////////////////////////\n const isOpen = this.data.mobileMenuOpen \n if(isOpen == true)\n {document.body.classList.add('mobile-open');}\n else\n {document.body.classList.remove('mobile-open');}\n clearMobileMenu();\n },\n outsideClick(e) {\n let target = e.target;\n let megamenu = this.$el;\n if (!megamenu.contains(target)) {\n this.data.selectedPrimaryId = null;\n }\n },\n positionMenu() {\n let scrollPos = 0;\n const handleScroll = () => {\n if ((document.body.getBoundingClientRect()).top == 0) {\n this.data.scrollDir = \"top\";\n } else if ((document.body.getBoundingClientRect()).top > scrollPos) {\n this.data.scrollDir = \"up\";\n } else {\n this.data.scrollDir = \"down\";\n }\n scrollPos = (document.body.getBoundingClientRect()).top;\n }\n // if (this.data.isMobile) {\n window.addEventListener(\"scroll\", handleScroll);\n // } else {\n // window.removeEventListener('scroll', handleScroll);\n // }\n },\n init() {\n EventBus.$on('setTopbarSelection', (id) => {\n this.data.selectedTopbarId = id;\n this.data.topbarMenuOpen = true;\n this.data.primaryMenuOpen = false;\n });\n\n /*\n EventBus.$on('back', (obj) => {\n let keys = Object.keys(obj);\n keys.forEach((item, i) => {\n this.data[item] = obj[item];\n });\n });\n\n EventBus.$on('setPrimarySelection', (id) => {\n this.data.selectedPrimaryId = id;\n this.data.primaryMenuOpen = true;\n this.data.topbarMenuOpen = false;\n });\n\n EventBus.$on('setSecondarySelection', (id) => {\n this.data.selectedSecondaryId = id;\n });\n */\n }\n },\n mounted() {\n this.init();\n this.positionMenu();\n }\n });\n \n\n // wrapper for top level submenus\n // e.g. Municipal water solutions, Industrial measurement solutions\n /*\n Vue.component('megamenu-submenu', {\n props: ['data'],\n data: function() {\n return {\n id: null,\n isOpen: false,\n }\n },\n watch: {\n 'data.selectedPrimaryId': function() {\n this.isOpen = this.id == this.data.selectedPrimaryId ? true : false;\n }\n },\n methods: {\n\n },\n mounted() { \n // set current submenu ID based on 1 index\n this.id = \"submenu-\" + ([].indexOf.call(this.$el.parentNode.children, this.$el)); \n }\n });\n */\n /*\n Vue.component('mobile-panel', {\n props: ['data'],\n data: function() {\n return {\n \n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('primary-menu-item', {\n props: ['isMobile'],\n data: function() {\n return {\n id: null,\n title: '',\n suffix: null\n }\n },\n methods: {\n init() {\n // set =id\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-item--main'));\n this.id = \"primary-\" + (menuItems.indexOf(this.$el) + 1);\n this.suffix = menuItems.indexOf(this.$el) + 1;\n // set title\n this.title = this.$el.innerText;\n store.commit('updateMenu', {'id': this.id, 'title': this.title});\n\n this.initEvents();\n },\n\n initEvents() {\n this.$el.addEventListener('click', (e) => {\n e.preventDefault();\n if (this.isMobile) {\n this.handleMobileEvents(e)\n } else {\n // this.handleDesktopEvents(e);\n }\n }); \n },\n // handleDesktopEvents(e) {\n // EventBus.$emit('setSecondarySelection', `secondary-1-primary-${this.suffix}`);\n // },\n handleMobileEvents(e) {\n // console.log(\"clicked\");\n EventBus.$emit('setPrimarySelection',this.id);\n },\n },\n mounted() {\n this.init();\n }\n });\n */\n /*\n Vue.component('primary-menu-item-desktop', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n id: null,\n isActive: false,\n }\n },\n watch: {\n parentId: function() {\n this.id = \"primary-\" + this.parentId.slice(8);\n this.initSubmenu();\n },\n 'data.selectedPrimaryId': function() {\n this.isActive = this.parentId == this.data.selectedPrimaryId ? true : false;\n }\n },\n methods: {\n initSubmenu(e) {\n if(e) {e.preventDefault();}\n if(!this.data.isMobile) {\n EventBus.$emit('setSecondarySelection', `secondary-1-${this.id}`);\n }\n },\n selectMenu() {\n if (this.parentId == this.data.selectedPrimaryId) {\n EventBus.$emit('setPrimarySelection', null);\n } else {\n EventBus.$emit('setPrimarySelection', `${this.parentId}`);\n if(!this.data.isMobile) {\n EventBus.$emit('setSecondarySelection', `secondary-1-${this.id}`);\n }\n }\n\n }\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('primary-panel', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n id: null,\n title: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedPrimaryId;\n }\n },\n watch: {\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n }\n },\n methods: {\n init() {\n let primaryPanels = Array.from(document.querySelectorAll('.megamenu__submenu-area-left'));\n this.id = \"primary-\" + (primaryPanels.indexOf(this.$el) + 1);\n\n this.getTitle();\n },\n back(e) {\n // console.log('back');\n e.preventDefault();\n EventBus.$emit('back', {\"primaryMenuOpen\": false});\n },\n getTitle() {\n let match = this.data.menuData.find(item => {\n // console.log(\"item\", item.id);\n // console.log(\"id\", this.id);\n return item.id === this.id;\n })\n\n if (match) {\n this.title = match.title;\n }\n }\n },\n mounted() {\n this.init();\n }\n });\n */\n /*\n Vue.component('secondary-panel', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n \n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('secondary-content', {\n props: ['parentId', 'data'],\n data: function() {\n return {\n id: null,\n suffix: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedSecondaryId;\n },\n },\n watch: {\n parentId: function() {\n this.suffix = this.parentId.substring(8);\n this.init();\n },\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n },\n // 'data.menuData': function() {\n // this.getElements();\n // }\n },\n methods: {\n init() {\n // set id\n let items = Array.from(this.$el.parentNode.querySelectorAll('.megamenu__submenu-content'));\n this.id = \"secondary-\" + (items.indexOf(this.$el) + 1) + \"-primary-\" + this.suffix;\n this.$el.dataset.id = this.id;\n },\n // getElements() {\n // let innerContent = this.$el.querySelector('.megamenu__inner-area');\n // }\n },\n mounted() {\n }\n });\n */\n /*\n Vue.component('secondary-menu-item', {\n props: ['parentId', 'data'],\n data: function() {\n return {\n id: null,\n title: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedSecondaryId;\n }\n },\n // wait until parent has and ID to assign child id\n watch: {\n parentId: function() {\n this.init();\n },\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n }\n },\n methods: {\n init() {\n // set id\n let items = Array.from(this.$el.parentNode.querySelectorAll('.megamenu__submenu-item'));\n this.id = \"secondary-\" + (items.indexOf(this.$el) + 1) + \"-\" + this.parentId;\n \n this.$nextTick(() => {\n let innerContent = document.querySelector(`div[data-id=\"${this.id}\"]`).cloneNode(true);\n\n this.title = this.$el.innerText;\n store.commit('updateMenu', {\"id\": this.id,\"title\":this.title, \"el\":innerContent});\n });\n\n // set title\n },\n handleDesktop(e) {\n e.preventDefault();\n // console.log(\"clicked desktop\");\n EventBus.$emit('setSecondarySelection', this.id);\n },\n\n handleMobile(e) {\n e.preventDefault();\n // console.log(\"clicked mobile\");\n this.isActive = !this.isActive;\n EventBus.$emit('setSecondarySelection', this.id);\n },\n initEvents() {\n this.$el.querySelector('.megamenu__submenu-item-link').addEventListener('click', (e) => {\n if (this.data.isMobile) {\n this.handleMobile(e);\n } else {\n this.handleDesktop(e);\n }\n });\n }\n },\n mounted() {\n this.initEvents();\n }\n });\n */\n /*\n Vue.component('secondary-inner-content', {\n props: ['data', 'id'],\n data: function() {\n return {\n }\n },\n watch: {\n 'data.menuData': function() {\n this.initContent();\n }\n },\n methods: {\n initContent() {\n let obj = this.data.menuData.find((item) => {\n return item.id == this.id;\n });\n if (obj) {\n let el = obj.el;\n this.$refs.inner.appendChild(el);\n }\n }\n },\n mounted() {\n // this.initContent();\n }\n });\n */\n Vue.component('topbar-panel', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n methods: {\n },\n mounted() {\n\n }\n });\n\n Vue.component('topbar-content', {\n props: ['data'],\n data: function() {\n return {\n menuData: store.state.menuKeys,\n id: null,\n isActive: false,\n title: '',\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedTopbarId;\n },\n updatedMenuData: function() {\n return store.state.menuKeys;\n }\n },\n watch: {\n // only watch the selected topbar content id\n selectedId: function() {\n this.isActive = this.id == this.selectedId ? true : false;\n },\n updatedMenuData: function() {\n this.menuData = store.state.menuKeys;\n this.init();\n }\n },\n methods: {\n back(e) {\n // console.log('back');\n e.preventDefault();\n EventBus.$emit('back', {\"topbarMenuOpen\": false})\n },\n init() {\n let match = this.menuData.find(item => {\n // console.log(\"item\", item.id);\n // console.log(\"id\", this.id);\n return item.id === this.id;\n })\n\n if (match) {\n this.title = match.title;\n }\n }\n },\n mounted() {\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-topbar'));\n this.id = \"topbar-\" + (menuItems.indexOf(this.$el) + 1);\n\n // console.log(this.menuData);\n // console.log(\"test\",test);\n }\n });\n\n Vue.component('topbar-menu-item', {\n data: function() {\n return {\n isMobile: store.state.isMobile,\n id: null,\n title: '',\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n computedIsMobile: function() {\n this.isMobile = this.computedIsMobile;\n this.init();\n }\n },\n methods: {\n init() {\n if (this.isMobile) {\n // add event listeners\n this.$el.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleEvents(e)\n });\n this.setTitle();\n\n } else {\n // remove event listeners\n this.$el.removeEventListener('click', (e) => {\n this.handleEvents(e);\n });\n }\n },\n handleEvents(e) {\n //console.log(\"clicked\");\n EventBus.$emit('setTopbarSelection',this.id);\n },\n // set section title to pass to section menu\n setTitle() {\n this.title = this.$el.innerText;\n store.commit('updateMenu', {\"id\": this.id,\"title\":this.title});\n }\n },\n mounted() {\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-item--topbar'));\n this.id = \"topbar-\" + (menuItems.indexOf(this.$el) + 1);\n this.init();\n }\n });\n\n Vue.component('lang-selector', {\n data: function() {\n return {\n activeLang: null,\n allLangs: [],\n store: store\n }\n },\n methods: {\n \n },\n mounted() {\n \n }\n });\n\n Vue.component('lang-selector-item', {\n props: ['allLangs','activeLang'],\n data: function() {\n return {\n lang: null,\n isActive: false\n }\n },\n watch: {\n activeLang: function() {\n this.isActive = this.activeLang === this.lang ? true : false;\n }\n },\n methods: {\n // changeLang(e) {\n // // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n // },\n selectLang(e) {\n // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n let lang = e.currentTarget.dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n },\n \n \n },\n mounted() {\n this.lang = this.$el.getAttribute('href').slice(1).toLowerCase();\n this.isActive = this.activeLang == this.lang ? true : false;\n }\n });\n\n Vue.component('search', {\n props: ['data'],\n data: function() {\n return {\n isOpen: false,\n predictiveSearchOpen: false,\n searchTerm: null, //from input for v-model\n searchTermVis: null, //displayed search term\n isLoading: null,\n results: null,\n }\n },\n watch: {\n searchTerm: function() {\n // init search if search term is longer than 1 character and not spaces\n let self = this;\n if (this.searchTerm && this.searchTerm.replace(/\\s+/g, '') !== \"\" && this.searchTerm.length > 1) {\n this.predictiveSearchOpen = true;\n this.isLoading = true;\n this.getResults();\n // console.log(debounce);\n } else {\n this.predictiveSearchOpen = false;\n }\n },\n isOpen: function() {\n if (this.isOpen) {\n this.$nextTick(() => {\n this.$refs.globalSearch.focus();\n });\n }\n }\n },\n computed: {\n // includes url params for auto filtering on search results page\n // filters params are by filter ID\n searchUrl: function() {\n return `${window.baseSearchUrl}?q=${this.searchTermVis}`;\n },\n productUrl: function() {\n return `${window.baseProductUrl}&q=${this.searchTermVis}`;\n },\n documentationUrl: function() {\n return `${window.baseDocumentationUrl}&q=${this.searchTermVis}`;\n },\n TechnologyUrl: function() {\n return `${window.baseTechnologyUrl}&q=${this.searchTermVis}`;\n },\n language: function() {\n return store.state.currentLang\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"search\",\n \"category\": \"Search\",\n \"action\": \"Keywords\",\n \"label\": this.searchTermVis ? this.searchTermVis : \"\",\n \"filterName\": \"filtername\"\n })\n }\n },\n methods: {\n addLoading() {\n document.querySelector('.megamenu__search-input').classList.add('loading');\n },\n removeLoading() {\n document.querySelector('.megamenu__search-input').classList.remove('loading');\n },\n toggleSearch() {\n this.isOpen = !this.isOpen;\n },\n getResults: debounce(function() {\n this.addLoading();\n this.searchTermVis = this.searchTerm;\n let apiUrl = \"/api/products\";\n // let apiUrl = \"http://localhost:3003/products\";\n let self = this;\n axios.get(apiUrl, {\n params: {\n q: this.searchTerm,\n lang: this.language\n }\n })\n .then(function(res) {\n // console.log(res.data.results);\n self.isLoading = false;\n self.results = res.data.results.slice(0, 3);\n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n });\n }, 1000) \n },\n mounted() {\n }\n });\n\n Vue.component('predictive-results', {\n props: ['results', 'isLoading'],\n data: function() {\n return {\n \n }\n },\n template: `\n
    \n \n
    \n `,\n watch: {\n \n },\n methods: {\n \n },\n mounted() {\n\n }\n });\n\n Vue.component('result-item', {\n props: ['content', 'isLoading'],\n data: function() {\n return {\n \n }\n },\n template: `\n
    \n
    \n \n
    \n \n
    \n `,\n watch: {\n \n },\n methods: {\n \n },\n mounted() {\n\n }\n });\n\n\n new Vue({\n el: `.megamenu`,\n store: store\n }).$mount(`.megamenu`, true);\n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n if (menu) \n {\n megamenuConstructor();\n let hoverTimer = null;\n const triggersWrap = document.querySelector('.mega__triggers');\n const triggers = document.querySelectorAll('.mega__triggers .is-trigger');\n const megaContent = document.querySelector('.mega__content');\n const megaTiers = document.querySelector('.mega__content .mega__tiers');\n const colTriggers = document.querySelectorAll('.mega__content .trigger');\n const mobileBack = document.querySelector('#mega__mobile__tier__back');\n const mobileHeading = document.querySelector('#mega__mobile__tier__heading');\n\n/////////////////////////////////////////////////////////////////////// click off menu \ndocument.addEventListener('click', e => \n {\n // const clickedArea = \n if (!megaContent.contains(e.target) && !triggersWrap.contains(e.target) && megaContent.classList.contains('active'))\n {\n megaContent.classList.remove('active')\n triggersWrap.classList.remove('megamenuTriggered')\n document.querySelector('.mega__triggers .is-trigger.active').classList.remove('active')\n }\n })\n/////////////////////////////////////////////////////////////////////// back button for mobile \n mobileBack.addEventListener('click',function(e)\n {\n e.preventDefault();\n const historySize = historyArr.length; // this can also be the heighest tier open. \n const curIndex = historySize -1;\n\n // should only work if there is at least one item in history\n if( historySize > 1 )\n {\n const prevPlace = historyArr[curIndex -1]\n // close current open tier, and open UL\n document.querySelector(`.tier-${historySize}`).classList.remove('mobileActiveTier') \n document.querySelector(`.tier-${historySize} .mobileActiveCol`).classList.remove('mobileActiveCol')\n // open previous (in history)\n document.querySelector(`.tier-${curIndex}`).classList.add('mobileActiveTier')\n document.querySelector(`.tier-${curIndex} .mobileActiveCol`).classList.add('mobileActiveCol')\n mobileHeading.innerText = prevPlace.txt\n historyArr.length = historySize -1;\n }\n else if(historySize == 1) // history is back to default position\n {\n megaTiers.classList.add('mobileHide')\n triggersWrap.classList.add('mobileActiveTier')\n }\n }) \n\n\n\n\n\n\n\n \n\n/////////////////////////////////////////////////////////////////////// open active tier for mobile\n const setMobileTier = function(tier, pos, historyText)\n { \n const currentActive = document.querySelector('.mobileActiveTier')\n const highestTierEl = document.querySelector(`.tier-${tier}`)\n const activeColInTier = document.querySelectorAll(`.tier-${tier} .mobileActiveCol`)\n \n // no tier lower than 0\n if(tier >=0 )\n {\n highestTierOpen= tier;\n currentActive.classList.remove('mobileActiveTier')\n }\n // close any active cols\n if(activeColInTier != undefined && activeColInTier.length>0)\n {\n for(let i=0;i0 )\n {\n highestTierOpen= tier;\n triggersWrap.classList.remove('mobileActiveTier')\n megaTiers.classList.remove('mobileHide');\n historyArr[tier-1] = {txt: historyText, colPos:pos};\n\n if(pos != \"fromBackButton\")\n {\n document.querySelector(`.tier-${tier} .pos-${pos}`).classList.add('mobileActiveCol')\n mobileHeading.innerText = historyText\n }\n }\n else if (tier == 0)\n {\n highestTierOpen=0\n triggersWrap.classList.add('mobileActiveTier');\n megaTiers.classList.add('mobileHide'); \n }\n highestTierEl.classList.add('mobileActiveTier')\n }\n\n ////////////////////////////////////////////////////////////////////// open tiers/column logic\n const openTier=(triggerTier, posInTier, elClicked)=>\n {\n const maxDepth = 4\n const thisTier = parseInt(triggerTier)\n highestTierOpen = thisTier + 1\n const nextTier = \".tier-\" + highestTierOpen\n const pos = \".pos-\" + posInTier;\n const currentPos = document.querySelector(`${nextTier} .active`)\n const linkOpenSameTier = document.querySelector(`.tier-${thisTier} .isOpen`)\n const linkOpenNextTier = document.querySelector(`.tier-${thisTier+1} .isOpen`)\n const txt = elClicked.innerText;\n \n // hide any opened items - in Same tier\n if(currentPos != undefined) \n {\n currentPos.classList.remove('active');\n // same tier link needs to be cleared\n if(linkOpenSameTier != undefined)\n {linkOpenSameTier.classList.remove('isOpen');}\n // next tier link needs to be cleared\n if(linkOpenNextTier != undefined)\n {linkOpenNextTier.classList.remove('isOpen')}\n \n // hide any deeper columns (tiers)\n for (let i = (thisTier+1) ; i<= maxDepth; i++)\n {\n document.querySelector(`.tier-${i}`).classList.remove('active')\n }\n }\n \n // open/re-open selection\n document.querySelector(nextTier).classList.add('active')\n document.querySelector(`${nextTier} ${pos}`).classList.add('active')\n elClicked.classList.add('isOpen')\n setMobileTier(highestTierOpen, posInTier, txt); \n }\n\n/* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// EVENTS */ \n/////////////////////////////////////////////////////////////////////// opening megamenu logic\n for(let i=0;i 1200) \n {\n if(e.target.classList.contains(\"active\") )\n {\n megaContent.classList.remove('active')\n triggersWrap.classList.remove('megamenuTriggered')\n e.target.classList.remove('active');\n }\n else\n {\n highestTierOpen = 1\n const allActives = document.querySelectorAll('.mega__content .active') // select all open columns\n const allopenArrows = document.querySelectorAll('.mega__content .isOpen') // my links that point to open columns \n const currentSelected = document.querySelector('.mega__triggers > li a.active') // select open main tab\n const target = e.target.dataset.target;\n \n // start by hiding all tiers 0 - 4\n for(let i=0;i< allActives.length; i++)\n {allActives[i].classList.remove('active')}\n\n // clear the main menu too\n if(currentSelected != null)\n {\n currentSelected.classList.remove('active');\n }\n\n // clear links to point to opened columns\n for(let i=0;i< allopenArrows.length; i++)\n {allopenArrows[i].classList.remove('isOpen')}\n\n e.target.classList.add('active') // highlight clicked tier 0\n megaContent.classList.add('active') // open mega menu\n triggersWrap.classList.add('megamenuTriggered')\n document.querySelector(`.mega__content .tier-1 .pos-${target}`).classList.add('active') // open tier-1\n }\n }\n // mobile logic\n else\n {\n //mobileHeading.innerText = e.target.innerText;\n const el = e.target\n const targetPos = el.dataset.target\n setMobileTier(1, targetPos , el.innerText); // on mobile there is no toggle, this button always opens the next tier\n }\n }) \n }\n /////////////////////////////////////////////////////////////////////// submenu columns logic\n for(let i=0;i 1200)\n {\n hoverTimer = setTimeout(function() \n {openTier( thisTier, posInTargetTier, elClicked) }, 500);\n }\n }) \n\n // cancel timer needed \n colTriggers[i].addEventListener('mouseout',function(e)\n { clearTimeout(hoverTimer); }) \n\n // click is ok for mobile\n colTriggers[i].addEventListener('click',function(e)\n {\n e.preventDefault();\n const thisTier = e.target.parentNode.parentNode.parentNode.dataset.tier; // backwards: starting from link clicked to < li < ul < tier-#\n const posInTargetTier = e.target.dataset.target;\n const elClicked = e.target;\n openTier( thisTier, posInTargetTier, elClicked)\n }) \n }\n \n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // window.baseDocumentationUrl = '/search-results?filters=111';\n // window.baseProductUrl = '/search-results?filters=222';\n // window.baseTechnologyUrl = '/search-results?filters=333';\n // window.baseSearchUrl = '/search-results'; \n\n}\n\nexport default Megamenu;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus'\nimport store from './store';\n\nconst MenuTopBar = () => {\n let topBar = document.querySelector('.top-bar');\n\n let MenuTopBarConstructor = () => {\n Vue.component('top-bar', {\n data: function() {\n return {\n activeNav: null,\n isOpen: null\n }\n },\n watch: {\n isOpen: function() {\n // handle closing subnav on outside click\n if (this.isOpen) {\n document.addEventListener(\"click\", this.outsideClick);\n } else {\n document.removeEventListener(\"click\", this.outsideClick);\n }\n }\n },\n methods: {\n setNav(id) {\n this.activeNav = id;\n },\n outsideClick(e) {\n let target = e.target;\n let topnav = document.querySelector('.top-bar');\n if (!topnav.contains(target)) {\n this.isOpen = false;\n this.activeNav = null;\n }\n }\n },\n mounted() {\n //give each nav item an id if it has a subnav\n this.$el.querySelectorAll('.top-bar__item').forEach((item, index) => {\n if (item.querySelector('.top-bar__subnav')) {\n item.dataset.id = index;\n }\n });\n // listen for click events from nav items\n EventBus.$on('setNav', (id) => {\n this.setNav(id);\n });\n // recieve open state from children to handle closing on outside click\n EventBus.$on('openState', (state) => {\n this.isOpen = state;\n });\n }\n });\n Vue.component('top-bar-item', {\n props: ['activeNav'],\n data: function() {\n return {\n navId: null,\n isActive: false,\n hasSubNav: false\n }\n },\n watch: {\n activeNav: function() {\n this.isActive = ((this.activeNav == this.navId) && this.navId !== null) ? true : false;\n },\n isActive: function() {\n // send open state to parent to handle closing on outside click\n EventBus.$emit('openState', this.isActive ? true : false);\n }\n },\n methods: {\n // emit click event to parent\n handleClick(e) {\n //set active state only if item has subnav\n this.isActive = this.hasSubNav ? !this.isActive : false;\n EventBus.$emit('setNav', this.navId);\n },\n },\n mounted() {\n // wait till next render to get id that's added by parent\n this.$nextTick(() => {\n this.navId = this.$el.dataset.id || null;\n this.hasSubNav = this.$el.dataset.id ? true : false;\n });\n }\n });\n\n Vue.component('lang-selector', {\n data: function() {\n return {\n activeLang: null,\n allLangs: [],\n store: store\n }\n },\n methods: {\n },\n mounted() {\n \n }\n });\n\n Vue.component('lang-selector-item', {\n props: ['allLangs','activeLang'],\n data: function() {\n return {\n lang: null,\n isActive: false\n }\n },\n // watch: {\n // activeLang: function() {\n // this.isActive = this.activeLang === this.lang ? true : false;\n // }\n // },\n methods: {\n selectLang(e) {\n // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n let lang = e.currentTarget.dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n },\n \n },\n mounted() {\n // this.lang = this.$el.getAttribute('href').slice(1).toLowerCase();\n // this.isActive = this.activeLang == this.lang ? true : false;\n }\n });\n\n new Vue({\n el: `.top-bar`,\n store: store\n }).$mount(`.top-bar`, true);\n }\n\n if (topBar) {\n MenuTopBarConstructor();\n }\n}\n\nexport default MenuTopBar;","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-button-set.hbs';\n\nVue.component(\n \"ms-button-set\",\n {\n props: {\n buttons: Array,\n multiple: { type: Boolean, default: false }, \n ovalButton: { type: Boolean, default: false }, \n onChange: Function,\n disabledMessage: String,\n defaultValue: { type: Array, default: [] },\n onTriggerEvent: Function\n },\n data(){\n return {\n values: this.buttons && this.buttons.map(v => !v.disabled && v.value ).map(v => this.defaultValue.indexOf(v) >= 0),\n };\n },\n watch: {\n values: {\n immediate: true,\n handler(v){\n const ctx = this;\n const value = v.reduce((o, e, i) => { if (!e) { return o; } return [...o, ctx.buttons[i]]; } , []);\n this.onChange && this.onChange(value);\n }\n }\n },\n computed: {\n },\n mounted() {\n },\n beforeUnmount() {\n },\n methods: {\n change(i) {\n if (!this.multiple) {\n const values = [];\n values[i] = this.values[i];\n this.values = values;\n }\n\n this.onTriggerEvent({ value: this.buttons[i] });\n }\n }, \n template\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-frame.hbs';\nimport separatorTemplate from 'shared/meter-selector-frame-separator.hbs';\nimport questionTemplate from 'shared/meter-selector-frame-question.hbs';\n\nVue.component(\n \"ms-frame\",\n {\n props: {\n isLateralBar: { type: Boolean, default: false },\n transparent: { type: Boolean, default: true },\n closeButtonLabel: String,\n buttonLabel: String,\n cancelButtonLabel: String,\n disableButton: { type: Boolean, default: false },\n title: String,\n onCancel: Function,\n onClickButton: Function,\n hasParametersButton: { type: Boolean, default: false },\n contactButton: Object,\n message: String,\n notice: String,\n },\n data(){\n return {\n isOpen: false\n };\n },\n watch: {\n isOpen(v) {\n const nameClass = 'ms-frame_opened-lateral-bar';\n const layerNameClass = 'ms-frame_mobile-layer';\n const body = document.querySelector('body');\n\n if(v) {\n body.classList.add(nameClass);\n const layer = document.createElement('div');\n layer.classList.add(layerNameClass);\n body.appendChild(layer);\n } else {\n const layer = document.querySelector(`.${layerNameClass}`);\n\n layer && body.removeChild(layer);\n body.classList.remove(nameClass);\n }\n }\n },\n computed: {\n hasButton(){\n return Boolean(this.buttonLabel) && !Boolean(this.notice)\n },\n mobileButtonLabel() {\n return this.closeButtonLabel;\n },\n hasContactButton(){\n return Boolean(this.contactButton);\n },\n hasButtons(){\n return this.hasButton || this.hasContactButton;\n },\n },\n mounted() {\n },\n beforeUnmount() {\n },\n methods: {\n clickButton(){\n this.onClickButton && this.onClickButton();\n },\n open(){\n this.isOpen = !this.isOpen;\n },\n cancel(){\n this.onCancel && this.onCancel();\n }\n }, \n template\n }\n);\n\nVue.component(\n \"ms-frame-separator\",\n {\n props: {\n title: String,\n },\n template: separatorTemplate\n }\n);\n\nVue.component(\n \"ms-frame-question\",\n {\n props: {\n index: Number,\n options: { type: Object, default: {} },\n value: Object,\n selectedUnit: String,\n onTriggerEvent: Function\n },\n data() {\n return {\n defaultValue: this.value,\n }\n },\n computed: {\n showTitle(){\n return this.options.button && this.index > 0 && this.options.question;\n },\n dropdownOptions(){\n return this.options.dropdown;\n },\n input(){\n const inputs = this.options.input;\n if (!inputs) {\n return null;\n }\n\n const input = inputs[0];\n\n return { title: input.label, placeholder: input.placeholder };\n },\n defaultValues(){\n if (this.options.button) {\n if (!this.defaultValue || !this.defaultValue.value) {\n return [];\n }\n\n return typeof this.defaultValue.value === 'object' ? this.defaultValue.value : [this.defaultValue.value];\n }else{\n if (!this.defaultValue || !this.defaultValue.inputValue) {\n const def = {};\n\n if (this.selectedUnit && this.options.options) {\n def.switcher = { value: this.selectedUnit };\n }\n\n return def;\n }\n\n return this.defaultValue.inputValue;\n }\n },\n key(){\n return this.options.apiQuery.join();\n }\n },\n methods: {\n onChange(v){\n const { index, stepId: id, apiQuery, filterName:label = '' } = this.options;\n let input = null;\n\n if (this.options.button) {\n const value = v.map(o => o.value);\n const notice = (v.find(o => Boolean(o.selectedLabel)) || {}).selectedLabel || '';\n const queryName = apiQuery && apiQuery[0];\n const query = { [queryName]: value.length === 1 ? value[0] : value };\n input = value.length === 0 ? null : { index, id, value, query, notice, label };\n } else {\n const { input: inputValue, dropdown, switcher } = v;\n const hasInput = Boolean(this.options.input);\n\n input = {\n value: inputValue,\n inputValue: v,\n option: switcher,\n label\n }; \n\n const queryName = apiQuery && apiQuery[0];\n const query = { [queryName]: input.value };\n\n if (apiQuery && apiQuery.length > 1 && (switcher || dropdown)) {\n const unitName = apiQuery[apiQuery.length - 1];\n query[unitName] = dropdown ? dropdown.value : switcher.value;\n }\n\n const isEmpty = input.value === '' || input.value === undefined || input.value === null;\n input = !isEmpty ? { ...input, index, id, query } : null;\n }\n\n this.$emit('input', input);\n },\n onTriggerAnswerEvent(data) {\n this.onTriggerEvent({ ...data, questionIndex: this.index });\n }\n },\n template: questionTemplate\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-input-box.hbs';\n\nVue.component(\n \"ms-input-box\",\n {\n props: {\n title: String,\n description: String,\n switcher: Object,\n input: Object,\n dropdown: Object,\n dropdownOptions: Array,\n onChange: Function,\n defaultValue: { type: Object, default: {} },\n onTriggerEvent: Function\n },\n data(){\n const data = {\n switcherValue: false,\n dropdownValue: '',\n inputValue: '',\n switcherField: this.switcher,\n inputField: this.input,\n changingMemo: this.defaultValue,\n inputErrorMessage: null, \n taggingInputValue: '',\n };\n\n if (this.defaultValue.switcher) {\n data.switcherValue = this.switcher.right.value === this.defaultValue.switcher.value;\n }\n\n if (this.defaultValue.dropdown) {\n data.dropdownValue = this.defaultValue.dropdown.value;\n }\n\n if (this.defaultValue.input) {\n data.inputValue = this.defaultValue.input.toString();\n }\n\n data.taggingInputValue = data.inputValue;\n\n return data;\n },\n watch: {\n switcherValue: {\n handler(v, a) {\n if (!this.switcherField) {\n return;\n }\n const option = v ? this.switcher.right : this.switcher.left;\n\n this.changingMemo = {\n ...this.changingMemo,\n switcher: option,\n };\n\n if ((a !== undefined || this.dropdownValue === '') && option && this.dropdownOptions) {\n if (this.dropdownOptions[option.value]) {\n const dropdownOption = this.dropdownOptions[option.value][0] || {};\n this.dropdownValue = dropdownOption.value || '';\n }\n }\n },\n immediate: true\n },\n dropdownValue: {\n handler(v) {\n if (!this.dropdownField) {\n return;\n }\n\n this.changingMemo = {\n ...this.changingMemo,\n dropdown: this.dropdownField.options.find(o => o.value === v),\n }\n },\n immediate: true\n },\n inputValue: {\n handler(v) {\n if (!this.inputField) {\n return;\n }\n\n const { noNegative, decimals = 2 } = this.input;\n let dashes = 0;\n let points = 0;\n\n let value = v.replace(/[^0-9.]|\\./g, function($0){\n if ( (!noNegative && $0 === '-' && v.indexOf('-') === 0 && !(dashes++)) || (decimals > 0 && $0 === '.' && !(points++)) ) {\n return $0;\n }\n\n return '';\n });\n \n const dp = value.indexOf('.');\n if (dp > -1) {\n const diff = value.length - dp - 1 - decimals;\n\n if (diff > 0) {\n value = value.substring(0, value.length - diff);\n }\n }\n\n const numericValue = parseFloat(value);\n this.inputErrorMessage = null;\n\n if (this.input.validation) {\n const {error, min = null, max} = this.input.validation;\n\n if ((min !== null && min > value) || (max && max < value)) {\n this.inputErrorMessage = error;\n }\n }\n\n this.inputValue = value;\n\n this.changingMemo = {\n ...this.changingMemo,\n input: value === '' ? '' : parseFloat(value),\n };\n },\n immediate: true\n },\n changingMemo(v) {\n this.hasChange();\n },\n taggingValue(){\n this.onTriggerEvent({ value: this.taggingValue });\n }\n },\n computed: {\n taggingValue(){\n return this.taggingInputValue + (this.option ? ' ' + (this.option.label || this.option.value) : '');\n },\n dropdownField(){\n if(!this.dropdownOptions){\n return null;\n }\n\n const option = (this.switcherValue ? this.switcher.right : this.switcher.left) || {};\n\n return { options: this.dropdownOptions[option.value] || [] };\n },\n inputTitle(){\n const ctx = this;\n return {\n props: {\n option: Object\n }, \n template: `${ctx.inputField.title}`\n }\n },\n option(){\n return this.dropdownField ? this.changingMemo.dropdown : this.changingMemo.switcher;\n } \n },\n mounted() {\n this.hasChange();\n },\n beforeUnmount() {\n },\n methods: {\n \n hasChange(){\n this.onChange && this.onChange(this.changingMemo);\n },\n onBlurInput(){\n this.taggingInputValue = this.inputValue;\n }\n }, \n template\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-step-bar.hbs';\n\nVue.component(\n \"ms-step-bar\",\n {\n props: {\n steps: Array, \n onChange: Function,\n current: Number,\n selectedValues: { type: Array, default: [] },\n offset: { type: Number, default: 50 },\n },\n data(){\n return {\n rootClasses: {\n 'noCenterAlign' : true\n },\n onResizeFlag: false,\n isMouseDown: false,\n };\n },\n watch: {\n current: {\n handler() {\n this.onResize();\n },\n immediate: true\n },\n steps: {\n handler() {\n this.onResizeFlag = true;\n },\n immediate: true\n }\n },\n computed: {\n getSteps() {\n const ctx = this;\n return this.steps.map((s, i) => {\n const classes = {\n 'ms-step-bar_item' : true,\n 'ms-step-bar_item--selected' : i === ctx.current,\n 'ms-step-bar_item--checked' : i <= ctx.maxStep\n };\n\n return {...s, selectedValue: ctx.selectedValues[i], classes };\n })\n },\n maxStep() {\n return (this.selectedValues && this.selectedValues.length) || 0;\n }\n },\n mounted() {\n window.addEventListener('resize', this.onResize);\n\n this.$refs.list.addEventListener('touchstart', this.startDrag);\n this.$refs.list.addEventListener('mousedown', this.startDrag);\n\n document.addEventListener('mouseup', this.endDrag);\n document.addEventListener('touchend', this.endDrag);\n\n document.addEventListener('mousemove', this.moveDrag);\n document.addEventListener('touchmove', this.moveDrag);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.onResize);\n\n this.$refs.list.removeEventListener('touchstart', this.startDrag);\n this.$refs.list.removeEventListener('mousedown', this.startDrag);\n\n document.removeEventListener('mouseup', this.endDrag);\n document.removeEventListener('touchend', this.endDrag);\n\n document.removeEventListener('mousemove', this.moveDrag);\n document.removeEventListener('touchmove', this.moveDrag);\n },\n updated(){\n if (this.onResizeFlag) {\n this.onResize();\n this.onResizeFlag = false;\n }\n },\n methods: {\n onResize(){\n let diff = 0;\n\n const w = window.innerWidth;\n const list = this.$refs.list;\n const children = (list && list.childNodes) || [];\n const last = children[children.length - 1];\n const end = last ? (last.offsetWidth + last.offsetLeft + this.offset) : 0;\n\n if (w < end) {\n const ldiff = (end - w) * - 1;\n\n const mw = w / 2;\n const selected = children[this.current];\n const selectedEnd = selected && selected.offsetWidth + selected.offsetLeft;\n\n if (selected && mw < selectedEnd) {\n diff = (selectedEnd - mw) * -1;\n }\n\n if (ldiff > diff) {\n diff = ldiff \n }\n }\n\n if (list) {\n list.style.transform = `translateX(${diff}px)`;\n }\n\n this.rootClasses = {\n ...this.rootClasses,\n 'noCenterAlign': end === 0 ? true : w < end,\n };\n },\n hasSelectedValue(i){\n return this.selectedValues && this.selectedValues[i];\n },\n reset(defaultCurrent = 0){\n this.onChange && this.onChange(defaultCurrent);\n },\n onClickStep(i){\n if (i > this.maxStep){\n return;\n }\n\n this.onChange && this.onChange(i);\n },\n startDrag(){\n this.isMouseDown = true;\n },\n endDrag(){\n this.isMouseDown = false;\n },\n moveDrag(e){\n const elm = this.$refs.list;\n if (!elm || !this.isMouseDown) {\n return;\n }\n\n const clientX = e.clientX || (e.touches[0] || e.changedTouches[0] || {}).pageX;\n\n if (elm.previousClientX !== undefined) {\n const diff = clientX - elm.previousClientX;\n const styleFound = elm.style.transform.match(/translateX\\((.*)px\\)/i) || [];\n const x = styleFound[1] ? parseInt(styleFound[1]) : 0;\n\n const children = elm.childNodes || [];\n const last = children[children.length - 1];\n const w = window.innerWidth;\n const end = last ? (last.offsetWidth + last.offsetLeft + this.offset) : 0;\n const maxX = (end - w) * -1;\n\n const add = 10;\n let nx = x;\n\n if (diff > 0) {\n nx = x+add;\n\n if (nx > 0) {\n nx = 0;\n }\n } else if (diff < 0 && maxX < 0) {\n nx = x-add;\n\n if (nx < maxX) {\n nx = maxX;\n }\n }\n\n const transformStyle = `translateX(${nx}px)`;\n\n if (styleFound[0]) {\n elm.style.transform = elm.style.transform.replace(styleFound[0], transformStyle);\n } else {\n elm.style.transform += \ttransformStyle + ';' ;\n }\n }\n\n elm.previousClientX = clientX;\n }\n }, \n template\n }\n);\n","\n/*\n Debounce is a decorator function that returns a function, that,\n as long as it continues be invoked, will not be triggered.\n The function will be called after it stops being called for N milliseconds (set in the 'wait' parameter). \n*/\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function() {\n\t\tconst context = this;\n const args = arguments;\n\t\tconst later = function() {\n\t\t\ttimeout = null;\n\t\t\tfunc.apply(context, args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n};\n\n// get value of url param by name\nexport const getUrlParameter = (sParam) => {\n var sPageURL = window.location.search.substring(1),\n sURLVariables = sPageURL.split('&'),\n sParameterName,\n i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n};\n\n// get cookie value by name\nexport function getCookieValue(a) {\n\tvar b = document.cookie.match('(^|;)\\\\s*' + a + '\\\\s*=\\\\s*([^;]+)');\n\treturn b ? b.pop() : '';\n}","/* \nAllows for inline text links to trigger specified Vue modals\n\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {formModal, exitModal} from './modals';\nimport EventBus from './event-bus';\nimport store from './store';\n\nVue.use(VModal);\n\nconst instance = new Vue({\n methods: {\n triggerContactTooltip() {\n EventBus.$emit('toggle-contact');\n },\n\n triggerForm(data) {\n this.$modal.show(\n formModal.template(data.content),\n formModal.name(data.name), \n formModal.options(data.options),\n formModal.events(data.data)\n )\n },\n\n triggerExit(data) {\n this.$modal.show(\n exitModal.template(data),\n exitModal.name, \n exitModal.options,\n exitModal.events\n )\n },\n closeModal(name) {\n // this.$modal.hide(name);\n this.$modal.hideAll();\n }\n }\n});\n\nconst trigger = () => { \n document.addEventListener('click', (e) => { \n if (e.target.getAttribute('href')) {\n var hrefHash = e.target.getAttribute('href').split(\"#\")[1]; \n if (!e.target.classList.contains(\"leavingSiteClickEventAdded\") && hrefHash) {\n\n if (hrefHash === \"contactustip\") {\n e.preventDefault();\n instance.triggerContactTooltip();\n } \n if (window.modalHashtags) {\n window.modalHashtags.forEach((item) => {\n if (hrefHash === item.hashtagname) {\n e.preventDefault();\n let downloadUrl = e.target.dataset.downloadUrl || null;\n let downloadName = e.target.dataset.downloadName || null;\n let selectedProducts = e.target.dataset.quoteProducts || null;\n let productCategory = e.target.dataset.productCategory || null;\n let literatureOrdered = e.target.dataset.literatureOrdered || null;\n let content = e.target.dataset.content || null;\n let comments = e.target.dataset.comments || null;\n let existingQueryParams = location.search;\n \n if (existingQueryParams != \"\") {\n if (downloadUrl && downloadUrl != \"\") {\n existingQueryParams = \"&\" + existingQueryParams;\n existingQueryParams = existingQueryParams.replace(\"&&\",\"&\");\n if (existingQueryParams.startsWith(\"?\")) \n existingQueryParams = existingQueryParams.slice(1); // remove the question mark\n } else {\n if (item.url.indexOf(\"?\") > -1) {\n existingQueryParams = \"&\" + existingQueryParams;\n existingQueryParams = existingQueryParams.replace(\"&&\",\"&\");\n }\n }\n }\n if (window.getFirstTouchCookies) { \n //***********************************************************************************************/\n // NOTE:\n // the function `window.getFirstTouchCookies` will only be available if the user accepted cookies. This script is in the BACKEND CODE ONLY.\n // This code is in the backend project only because it's cookie code and has to be disabled by an optanon-category from OneTrust if the user \n // does not accept cookies.\n //***********************************************************************************************/\n let FTCookies = window.getFirstTouchCookies();\n let LTCookies = window.getLastTouchCookies();\n function renameProperty(object, oldName, newName) { // .length of function is 2\n 'use strict';\n if (oldName === newName) {\n return object;\n }\n if (object.hasOwnProperty(oldName)) {\n object[newName] = object[oldName];\n delete object[oldName];\n }\n return object;\n }\n renameProperty(FTCookies, 'utm_campaign_FT', 'UTM_Campaign_FT');\n renameProperty(FTCookies, 'utm_content_FT', 'UTM_Content_FT');\n renameProperty(FTCookies, 'utm_medium_FT', 'UTM_Medium_FT');\n renameProperty(FTCookies, 'utm_source_FT', 'UTM_Source_FT');\n renameProperty(FTCookies, 'utm_campaign_ID_FT', 'UTM_Campaign_ID_FT');\n \n renameProperty(LTCookies, 'utm_campaign_LT', 'UTM_Campaign_LT');\n renameProperty(LTCookies, 'utm_content_LT', 'UTM_Content_LT');\n renameProperty(LTCookies, 'utm_medium_LT', 'UTM_Medium_LT');\n renameProperty(LTCookies, 'utm_source_LT', 'UTM_Source_LT');\n renameProperty(LTCookies, 'utm_campaign_ID_LT', 'UTM_Campaign_ID_LT');\n\n let cookieQueryString = \"\";\n let ftKeys = Object.keys(FTCookies);\n let ltKeys = Object.keys(LTCookies);\n\n cookieQueryString = ftKeys.filter(x => x != \"HasValues\").map(key => `${key}=${FTCookies[key]}`).join(\"&\");\n cookieQueryString += \"&\" + ltKeys.filter(x => x != \"HasValues\").map(key => `${key}=${LTCookies[key]}`).join(\"&\");\n if (existingQueryParams != \"\") {\n existingQueryParams += \"&\" + cookieQueryString;\n } else {\n existingQueryParams = \"?\" + cookieQueryString;\n }\n console.log(\"cookieQueryString\", cookieQueryString);\n }\n\n if (existingQueryParams != \"\") {\n existingQueryParams += \"&product_category_selections=\" + productCategory;\n } else {\n existingQueryParams += \"?product_category_selections=\" + productCategory;\n }\n\n if (comments || selectedProducts || literatureOrdered || downloadUrl || downloadName) {\n instance.triggerForm({\n content: {\n url: downloadUrl && downloadUrl !== \"\" ? (`${item.url}?redirect_url=${downloadUrl}` + existingQueryParams) : (item.url + existingQueryParams),\n copy: `${content ? content : ``}`\n },\n name: item.hashtagname,\n options: {\"classes\": `bmi-modal bmi-modal--form bmi-modal--${item.hashtagname}`},\n data: {\n product_selections: selectedProducts,\n product_category_selections: productCategory,\n modalName: item.hashtagname,\n downloadName: downloadName,\n literatureOrdered,\n comments: comments,\n }\n })\n } else {\n instance.triggerForm({\n content: {\n url: item.url + existingQueryParams,\n copy: `${content ? content : ``}`\n },\n name: item.hashtagname,\n options: {\"classes\": `bmi-modal bmi-modal--form bmi-modal--${item.hashtagname}`}\n });\n } \n } \n });\n } \n }\n } else {\n console.log('e.target', e.target);\n return;\n }\n });\n\n\n let leavingSiteClick = (e) => { \n if (window.leavingSite) {\n var data = {\n \"copy\": window.leavingSite.modalContent,\n \"ok\": window.leavingSite.okLabel,\n \"close\": window.leavingSite.closeLabel,\n } \n var link = e.target.getAttribute('href');\n var target = e.target;\n var modal = document.querySelector('.bmi-modal--exit');\n \n for (let i=0; i < window.leavingSite.sites.length; i++) {\n let site = window.leavingSite.sites[i];\n if (modal && modal.contains(target)) {\n continue;\n } else if (link.includes(`${site}`)) {\n e.preventDefault();\n \n data = {\n ...data,\n \"link\": link\n }\n instance.triggerExit(data);\n return false;\n }\n }\n }\n };\n\n document.addEventListener(\"click\", function() {\n setTimeout(function() {\n document.querySelectorAll('a[href]').forEach(l => { \n if (l.href.toLowerCase().indexOf(\"http\") == -1) {\n //check if 'eventAdded' class to the element\n if (!l.classList.contains(\"leavingSiteClickEventAdded\")) {\n l.classList.add(\"leavingSiteClickEventAdded\");\n l.addEventListener('click', leavingSiteClick);\n }\n }\n });\n }, 500);\n });\n\n // in order for the return false/e.preventDefault() to actually work, you must attach this to the anchor tag itself, not document.addEventListener\n // like it was previously. The problem is that this only works for anything that already exists on the DOM.\n // The above document.addEventListener() will add it for anything that's injected into the DOM, querying the dom 500ms after the click.\n // this is not ideal, but there's not really a better way to handle this.\n \n document.querySelectorAll('a[href]').forEach(l => {\n //add a 'eventAdded' class to the element\n if (l.href.toLowerCase().indexOf(\"http\") == -1) {\n //check if 'eventAdded' class to the element\n if (!l.classList.contains(\"leavingSiteClickEventAdded\")) {\n l.classList.add(\"leavingSiteClickEventAdded\");\n l.addEventListener('click', leavingSiteClick);\n }\n }\n });\n}\n\n// export default trigger;\nexport { instance, trigger};\n","import store from './store';\nimport EventBus from './event-bus';\n\nlet defaultOptions = {\n height: \"auto\",\n scrollable: false,\n adaptive: true,\n focusTrap: true,\n classes: \"bmi-modal\",\n width: \"900px\",\n};\n\nlet defaultTemplate = (content, tagName) => {\n return {template: `\n
    \n \n\n
    \n
    \n ${content}\n
    \n
    \n
    \n `}\n};\n\nlet videoTemplate = (id, title) => {\n return {template: `\n
    \n \n
    \n ${title ? `

    ${title}

    ` : ``}\n
    \n \n
    \n
    \n
    \n `}\n};\n\nconst modalConstructor = (Template, Name, Options, Events) => (\n {\n template: Template,\n name: {name: Name},\n options: {\n name: Name,\n ...defaultOptions,\n ...Options\n },\n events: Events\n }\n)\n\nconst videoModal = modalConstructor(\n (id, title) => videoTemplate(id, title),\n \"video\",\n {classes: 'bmi-modal bmi-modal--video'},\n)\n\nconst releaseNotesModal = modalConstructor(\n (content) => defaultTemplate(`${content}`, 'Release Notes Overlay'),\n \"releaseNotes\",\n {classes: 'bmi-modal bmi-modal--release-notes'}\n)\n\nconst applicationsModal = modalConstructor(\n defaultTemplate('', 'Market Applications Overlay'),\n \"applications\",\n {classes: 'bmi-modal bmi-modal--applications'},\n (apps) => ({\n 'opened': () => {\n // console.log(\"before open\");\n let container = document.querySelector('.bmi-modal--applications .bmi-modal__area-body');\n container.appendChild(apps);\n }\n }),\n)\n\nconst quickLinksModal = modalConstructor(\n defaultTemplate('', 'Quick Links Overlay'),\n \"quickLinks\",\n {classes: 'bmi-modal bmi-modal--quick-links'},\n (links) => ({\n 'opened': () => {\n // console.log(\"before open\");\n let container = document.querySelector('.bmi-modal--quick-links .bmi-modal__area-body');\n container.appendChild(links);\n }\n }),\n)\n\nconst patentsModal = modalConstructor(\n defaultTemplate('', 'Patents Overlay'),\n \"patents\",\n {classes: 'bmi-modal bmi-modal--patents'},\n (content) => ({\n 'opened': () => {\n // console.log(\"before open\");\n // console.log(content);\n let container = document.querySelector('.bmi-modal--patents .bmi-modal__area-body');\n container.appendChild(content);\n }\n }),\n)\n\nconst tooltipModal = modalConstructor(\n (content) => defaultTemplate(`${content}`, 'Tooltip Overlay'),\n \"tooltip\",\n {classes: 'bmi-modal bmi-modal--tooltip'}\n);\n\nconst formModal = {\n template: (content) => defaultTemplate(\n `${content.copy ? `\n
    \n ${content.copy}\n
    \n ` : ``}\n
    \n \n
    `, 'Form Overlay'\n ),\n name: (value) => ({\"name\": value}),\n options: (data) => ({\n ...defaultOptions,\n classes: 'bmi-modal bmi-modal--form',\n ...data\n }),\n events: (data) => ({\n 'opened': () => {\n let id = store.state.GAID;\n\n var iframe = document.querySelector(\".bmi-modal__form iframe\");\n let src = document.querySelector(\".bmi-modal__form iframe\").getAttribute('src');\n let paramData = {\n ...data,\n GAID: id\n };\n\n window.addEventListener(\"message\", (event) => {\n // console.log(event);\n if (event.origin == \"https://info.badgermeter.com\") {\n sizeIframe(event);\n postData(event);\n receiveData(event);\n }\n });\n\n const postData = (event) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage(JSON.stringify(paramData), '*');\n } else {\n iframe.onload = function() {\n iframe.contentWindow.postMessage(JSON.stringify(paramData), '*');\n }\n }\n }\n \n const sizeIframe = (event) => {\n try {\n let data = typeof event.data === 'object' ? event.data : JSON.parse(event.data);\n // console.log(data);\n if (data.form) {\n if ( src.includes(data.form) ) {\n iframe.style.height = `${data.content + 20}px`;\n }\n }\n } catch (e) { console.log(\"Unexpected message\", e); }\n };\n\n const receiveData = (event) => {\n try {\n let eventData = typeof event.data === 'object' ? event.data : JSON.parse(event.data);\n eventData = {\n eventData, //pass data from postmessage event\n ...data //also pass data from modal trigger event\n }\n if (eventData.eventData.submit) {\n // emit submitted event whenever a form is submitted\n EventBus.$emit('form-submitted', eventData);\n }\n } catch (e) { console.log(\"Unexpected message\", e); }\n }\n },\n 'closed' : () => {\n // emit form closed event whenever form is closed\n EventBus.$emit('form-closed', data);\n }\n })\n}\n\nconst infoModal = modalConstructor(\n (title, content) => defaultTemplate(`\n

    \n ${title}\n

    \n
    \n ${content}\n
    \n `, 'Info Overlay'),\n \"contact\",\n { width:'none', height: 'none', shiftY: 0, classes: 'bmi-modal bmi-modal--info'},\n {\n opened: () => {\n const body = document.querySelector(\"body\");\n body.classList.add('bmi-modal__body');\n },\n closed: () => {\n const body = document.querySelector(\"body\");\n body.classList.remove('bmi-modal__body');\n }\n }\n);\n\nconst genericModal = modalConstructor(\n (content) => defaultTemplate(content, \"Content Overlay\"),\n \"generic\",\n {classes: 'bmi-modal bmi-modal--generic'},\n)\n\nconst exitModal = modalConstructor(\n (content) => {return {template: `\n
    \n
    \n
    \n ${content.copy}\n
    \n
    \n \n
    \n `}},\n \"exit\",\n {classes: 'bmi-modal bmi-modal--exit'},\n)\n\n\nexport { videoModal, releaseNotesModal, applicationsModal, quickLinksModal, infoModal, patentsModal, tooltipModal, formModal, genericModal, exitModal };\n","import ComponentModule from 'lib/component-module';\nimport { lory } from 'lory.js';\nimport { debounce } from '../misc';\n\nComponentModule.AddModule('.affiliates', {\n prefix: 'affiliates-',\n components: [\n {\n name: 'template',\n data(){\n return {\n lory: null,\n div: [],\n isMobile: null,\n totalSlides: null,\n currentSlide: 0,\n desc: null,\n isLast: false\n };\n },\n watch: {\n isMobile(){\n this.reset();\n }\n },\n methods: {\n initLory() {\n this.lory = lory(this.$el, { \n classNameFrame: 'affiliates__content',\n classNameSlideContainer: 'affiliates__list', \n classNamePrevCtrl: 'affiliates__prev',\n classNameNextCtrl: 'affiliates__next', \n slidesToScroll: 1,\n enableMouseEvents: true });\n\n this.$el.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex();\n });\n\n // manually check for last slide because lory js\n // index doesn't work with variable width slides\n this.$el.querySelector('.affiliates__list').addEventListener('transitionend', () => {\n this.checkLastSlide();\n });\n\n this.checkLastSlide();\n },\n resize: debounce(function() {\n this.checkLastSlide();\n }, 500),\n checkLastSlide() {\n let containerOffset = parseInt(window.innerWidth - this.$el.querySelector('.affiliates__list-container').getBoundingClientRect().right);\n\n let lastSlideOffset = parseInt(window.innerWidth - this.$el.querySelector('.affiliates__list li:last-child').getBoundingClientRect().right);\n // \n this.isLast = containerOffset == lastSlideOffset || (lastSlideOffset >= containerOffset - 1 && lastSlideOffset <= containerOffset + 1) ? true : false;\n },\n setIsMobile() {\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n },\n reset() {\n if (this.isMobile) {\n this.$refs.desc.remove();\n } else {\n if (this.$refs.desc) {\n return;\n } else {\n this.$refs.list.prepend(this.desc);\n }\n }\n this.lory.setup();\n \n }\n },\n mounted() {\n this.desc = this.$refs.desc;\n this.initLory();\n this.setIsMobile();\n this.reset();\n \n window.addEventListener(\"resize\", this.resize);\n },\n unmounted() {\n window.removeEventListener(\"resize\", this.resize);\n }\n }\n ]\n});\n","import ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\nimport store from 'lib/store';\nimport {\n template as hiwTemplate,\n tabLabel as hiwTabLabel,\n contentTemplate as hiwContentTemplate\n} from 'lib/how-it-works';\n\nComponentModule.AddModule('.find-distributor', {\n prefix: 'find-distributor-',\n components: [\n fetcher({\n name: 'template',\n data(){\n return {\n list: { template: '
    ' },\n listVisible: false\n };\n },\n methods: {\n getDistributors() {\n var self = this;\n\n if (this.params.country) {\n this.listVisible = true;\n\n this.fetch(function(res) {\n // const template = self.data;\n const template = res.data;\n // console.log(\"RES\", res);\n self.list = {\n template,\n components: {\n 'hiw-template': {\n ...hiwTemplate,\n components: {\n 'hiw-tab-label': hiwTabLabel,\n 'hiw-content-template': hiwContentTemplate\n }\n }\n }\n };\n \n }, {\n params: {\n ...this.params\n }\n }); \n } else {\n this.listVisible = false;\n }\n\n }\n }\n }, {\n fetchOnUpdateParams: false\n })\n ],\n store: store\n});\n","import ComponentModule from '../component-module';\nimport StorageManager, { LocalStorageManager } from '../storage-manager';\nimport { getCookieValue } from '../misc';\n\nconst storageManager = StorageManager(LocalStorageManager);\n\nconst GLOBAL_MESSAGE_SESSION = 'global-messsage';\n\nconst getNameSession = id => {\n return GLOBAL_MESSAGE_SESSION+'#'+id;\n}\n\nconst getTimesShowed = id => {\n return parseInt(storageManager.get(getNameSession(id)) || 0);\n}\n\nconst addTimeShowed = (id) => {\n storageManager.addTimes(getNameSession(id));\n}\n\nComponentModule.AddModule('.global-message', {\n prefix: 'global-message-',\n components: [\n {\n props: {\n showTimes: Number\n },\n name: 'template',\n data: () => ({\n isShow: false,\n }),\n mounted: function() {\n const el = this.$parent.$el;\n\n if (sessionStorage && el.className.includes(\"__show-times\") && el.id) {\n const times = getTimesShowed(el.id);\n const showTimes = this.showTimes || 1;\n if (times >= showTimes) {\n return;\n } else {\n this.isShow = true;\n this.$nextTick(() => {\n this.checkOneTrust();\n })\n }\n } else {\n this.isShow = true;\n this.$nextTick(() => {\n this.checkOneTrust();\n })\n }\n },\n methods: {\n close() {\n const el = this.$parent.$el;\n\n this.isShow = false;\n\n if (sessionStorage && el.className.includes(\"__show-times\") && el.id) {\n addTimeShowed(el.id);\n }\n\n const event = new Event('closeGlobalAlert');\n el.dispatchEvent(event);\n },\n checkOneTrust() {\n let oneTrustCookie = getCookieValue('OptanonAlertBoxClosed');\n console.log(this.$el);\n if (oneTrustCookie == '') {\n this.$el.style.display = 'none';\n this.$nextTick(() => {\n setTimeout(() => {\n this.init();\n }, 1000);\n })\n } else {\n this.$el.style.display = 'block';\n }\n },\n init() {\n let close = document.querySelector('#onetrust-close-btn-container');\n const el = this.$parent.$el;\n const openEvent = new Event('openGlobalAlert');\n if (close) {\n close.addEventListener('click', () => {\n el.dispatchEvent(openEvent);\n this.$el.style.display = 'block';\n });\n }\n }\n }\n }\n ]\n});\n\n","import './recent-posts';\nimport './my-saved-page';\nimport './solution-area';\nimport './meter-selector';\nimport './global-message';\nimport './find-distributor';\nimport './affiliates';\nimport './locations-map';\n","import ComponentModule from 'lib/component-module';\nimport tippy from 'tippy.js';\nimport store from '../store';\n\nComponentModule.AddModule('.locations-map', {\n prefix: 'locations-map-',\n components: [\n {\n name: 'template',\n data(){\n return {\n region: 0,\n resizeTimeout: null,\n openedId: null,\n locations: [],\n regions: window.locationsMapData.regions,\n data: window.locationsMapData.locations,\n fullscreenTooltipContainer: null,\n store: store\n };\n },\n computed: {\n isMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n locations() {\n const elms = this.$el.getElementsByClassName('locations-map__location-pin');\n for (var i = 0; i < elms.length; i++) {\n const e = elms[i];\n const l = this.locations[i];\n\n }\n },\n region(){\n this.moveToRegion();\n this.calculatePosition();\n },\n openedId(){\n if(this.openedId === null){\n this.setContentTooltipReference(null);\n }\n },\n isMobile: function() {\n if (this.isMobile) {\n let map = this.$el.parentNode;\n map.style.removeProperty('height');\n }\n }\n },\n mounted() {\n this.calculatePosition();\n window.addEventListener(\"resize\", this.resize);\n },\n destroyed() {\n window.removeEventListener(\"resize\", this.resize);\n },\n methods: {\n setContentTooltipReference(content) {\n const body = document.querySelector('body');\n if (this.openedId === null && this.fullscreenTooltipContainer){\n body.removeChild(this.fullscreenTooltipContainer);\n this.fullscreenTooltipContainer = null;\n }\n\n if (content === null){\n return null;\n }\n\n const div = this.fullscreenTooltipContainer || document.createElement('div');\n body.appendChild(div);\n div.classList.add('locations-map__tooltip-fullscreen');\n div.appendChild(content);\n\n this.fullscreenTooltipContainer = div;\n },\n getPrefixCss() {\n var styles = window.getComputedStyle(document.documentElement, ''),\n pre = (Array.prototype.slice\n .call(styles)\n .join('')\n .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\n )[1],\n dom = ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1];\n return {\n dom: dom,\n lowercase: pre,\n css: '-' + pre + '-',\n js: pre[0].toUpperCase() + pre.substr(1)\n };\n },\n setStyleWithPrefix(el, style, value){\n const { css } = this.getPrefixCss();\n el.style[css+style] = value;\n },\n calculateDiff(){\n\n if(!this.isMobile) {\n this.calculateHeight();\n } \n\n let realWidth = 0;\n let realHeight = 0;\n\n const fullWidth = 1610;\n const fullHeight = 770;\n const fullRatio = fullWidth/fullHeight;\n const containerWidth = this.$el.parentElement.offsetWidth;\n const containerHeight = this.$el.parentElement.offsetHeight;\n const containerRation = containerWidth/containerHeight;\n\n\n if(containerRation > fullRatio){\n realWidth = containerWidth;\n realHeight = containerWidth/fullRatio;\n } else {\n realWidth = containerHeight*fullRatio;\n realHeight = containerHeight;\n }\n\n return {\n w: realWidth,\n h: realHeight,\n x: realWidth/fullWidth,\n y: realHeight/fullHeight\n };\n },\n moveToRegion(){\n let l = 0;\n let t = 0;\n\n if (this.region !== null && window.innerWidth < 835){\n const { x:xDiff, y:yDiff, w } = this.calculateDiff();\n const region = this.regions[this.region];\n l = region.coordinates[0] * xDiff * -1;\n t = region.coordinates[1] * yDiff * -1;\n\n const offsetWidth = this.$el.parentElement.offsetWidth;\n const offsetHeight = this.$el.parentElement.offsetHeight;\n\n const minLeft = (w - offsetWidth) * -1;\n const minTop = (w - offsetHeight) * -1;\n\n if (l < minLeft) {\n l = minLeft;\n }\n\n if (t < minTop) {\n t = minTop;\n }\n }\n\n this.$el.parentElement.style['background-position'] = `${l}px ${t}px`;\n this.$refs.locationsContainer.style.left = `${l}px`;\n this.$refs.locationsContainer.style.top = `${t}px`;\n },\n open(id){\n this.openedId = id;\n },\n resize(){\n const context = this;\n\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = setTimeout(function(){\n context.resizeTimeout = null;\n context.calculatePosition();\n }, 500);\n\n this.moveToRegion();\n },\n calculatePosition(){\n const { x:xDiff, y:yDiff } = this.calculateDiff();\n\n const locations = [];\n this.data.forEach(i => {\n const [l, t] = i.coordinates;\n const _top = Math.round(t * yDiff);\n const _left = Math.round(l * xDiff);\n\n locations.push({\n ...i,\n coordinates: [`${_left}px`, `${_top}px`],\n })\n });\n\n this.locations = locations;\n },\n calculateHeight() {\n let fullWidth = 1610;\n let fullHeight = 770;\n let fullRatio = fullWidth/fullHeight;\n let windowWidth = window.innerWidth;\n let calcHeight = Math.round(windowWidth / fullRatio);\n let map = this.$el.parentNode;\n map.style.height = `${calcHeight}px`;\n }\n },\n components: {\n 'content-tooltip': {\n name: 'content-tooltip',\n props: ['id', 'data', 'open', 'isOpen', 'setContentTooltipReference'],\n data(){\n return {\n tippyInstance: null,\n contentChild: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": this.data.name\n })\n }\n },\n watch: {\n data(){\n this.mobileMode();\n this.tippyInstance.setContent('');\n },\n isOpen(){\n this.mobileMode();\n this.tippyInstance.setContent('');\n if (this.isOpen) {\n // increase z-index of currently open tooltip\n let tippyTarget = document.querySelector(`#tippy-${this.id + 1}`);\n tippyTarget.style.zIndex = 100;\n }\n }\n },\n methods: {\n onOpen(){\n this.open(this.id);\n },\n onClose(){\n this.open(null);\n },\n mobileMode(){\n if (this.isOpen && window.innerWidth < 650){\n this.setContentTooltipReference(this.contentChild);\n } else {\n this.setTooltipContent();\n }\n },\n setTooltipContent(){\n this.tippyInstance.popper.querySelector('.tippy-content').appendChild(this.contentChild);\n }\n },\n mounted() {\n const context = this;\n this.contentChild = this.$el.children[0];\n const instance = tippy(this.$el, {\n content: '',\n maxWidth: 'none',\n allowHTML: true,\n interactive: true,\n placement: this.data.placement,\n trigger: 'manual',\n zIndex: 99,\n onCreate(instance) {\n context.tippyInstance = instance;\n context.setTooltipContent();\n instance.show();\n },\n onHide(instance) {\n return false;\n }\n });\n }\n }\n }\n }\n ]\n});\n","import qs from 'qs';\n\nimport ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\n\nimport store from '../store';\nimport { infoModal as modal } from '../modals';\n\n// Meter selector components\nimport 'lib/meter-selector/step-bar';\nimport 'lib/meter-selector/input-box';\nimport 'lib/meter-selector/button-set';\nimport 'lib/meter-selector/frame';\n\n// Meter selector templates\nimport meterSelectorContentTemplate from 'shared/meter-selector-content.hbs';\nimport meterSelectorPaginatorTemplate from 'shared/meter-selector-paginator.hbs';\nimport productItemVTemplate from 'shared/meter-selector-product-item-v.hbs';\nimport productItemHTemplate from 'shared/meter-selector-product-item-h.hbs';\n\nComponentModule.AddModule('.meter-selector', {\n prefix: 'meter-selector-',\n components: [\n fetcher({\n props: {\n defaultCount: { type: Number, default: 0 },\n pageSize: { type: Number, default: 12 },\n requestQuoteButton: { type: String, default: '[href=\"#meterselector\"]' },\n },\n data: function(){\n return {\n // global\n data: {},\n \n // results\n count: this.defaultCount,\n\n // questions\n steps: [], \n stepNumber: 0,\n answerMemo: [],\n \n questions: [],\n answerModel: [],\n disabledContinue: true,\n notice: '',\n debounce: null,\n stepValues: [],\n isResultsPage: false,\n tagStepFlag: false,\n };\n },\n computed: {\n selectedUnit() {\n return store.state.units;\n },\n filters(){\n const filters = this.answerMemo.filter((_, i) => i < this.stepNumber ).reduce((a, aw) => {\n if (!aw) {\n return a;\n }\n\n const query = aw.reduce((ae, e) => ({...ae, ...e.query }), {});\n\n return {...a, ...query };\n } ,{});\n\n return filters;\n },\n hasButtons(){\n if (this.isResultsPage) {\n return false;\n }\n\n const questions = this.getQuestions(this.stepNumber);\n return Boolean(questions.find(q => q.button ));\n },\n isTransparent(){\n return this.isResultsPage || this.questions.length === 0 || this.hasButtons;\n },\n title(){\n if (this.isResultsPage) {\n const { title } = (this.data) || {};\n return title;\n }\n\n const tab = this.getTab(this.stepNumber);\n return (tab && tab.tabTitle) || null;\n },\n message(){\n if (!this.isResultsPage) {\n return null;\n }\n\n const { content } = (this.data) || {};\n return content;\n },\n closeLabel(){\n const results = this.data.searchResults || {};\n return results.CloseLabel;\n },\n nextLabel(){\n const results = this.data.searchResults || {};\n if (this.isResultsPage) {\n return results.AdjustParamsLabel;\n }\n\n return results.NextLabel;\n },\n skipLabel(){\n if (this.isResultsPage) {\n return null;\n }\n\n return this.data.searchResults && this.data.searchResults.SkipForNowLabel;\n },\n loadingMessage(){\n const results = this.data.searchResults || {};\n return results.LoadingLabel;\n },\n contactButton(){\n if (!this.isResultsPage) {\n return null;\n }\n\n return this.data.searchResults && { label: this.data.searchResults.ContactProductExpertLabel };\n }\n },\n watch: {\n isResultsPage(){\n if (!this.isResultsPage) {\n return;\n }\n\n const { tabs = [] } = this.data;\n const answerMemo = this.answerMemo;\n\n const questions = tabs.reduce((a, t, it) => {\n if (!t.questions){\n return a;\n }\n\n const questions = t.questions.map((q,i) => {\n return {...q, questionIndex: i, tabIndex: it };\n }).filter(q => !q.button);\n\n return [...a, ...questions];\n }, []); \n\n this.answerModel = questions.map((q, i) => {\n const { tabIndex, questionIndex, ...rest} = q;\n return answerMemo[q.tabIndex] && answerMemo[q.tabIndex][q.questionIndex]; \n });\n\n this.questions = questions;\n },\n answerModel(v){\n if (this.isResultsPage) {\n this.changedAnswerMemoOnResultPage();\n this.disabledContinue = false;\n this.notice = '';\n return;\n }\n\n const { enableNextWhen } = this.getTab(this.stepNumber);\n let questions = this.getQuestions(this.stepNumber);\n\n if (!questions) {\n return [];\n }\n\n questions = questions.map((q, i) => ({ ...q, index: i }));\n\n const answers = this.answerModel.filter(a => a);\n const answersValues = answers.reduce((o, a) => ({ ...o, [a.id]: a.value }), {});\n\n this.questions = questions.filter(q => {\n if (!q.showIfQuestion){\n return true;\n }\n\n const a = answersValues[q.showIfQuestion];\n\n return a && (typeof a === 'string' ? a === q.showIfValue : a.indexOf(q.showIfValue) >= 0);\n });\n\n const indexes = this.questions.map(q => q.index);\n const filteredAnswers = answers.filter(a => indexes.indexOf(a.index) >= 0);\n\n const { comparisonType = 'DEFAULT', stepIds = [] } = enableNextWhen || {};\n\n if (comparisonType === 'ANY') {\n this.disabledContinue = !((filteredAnswers.find(a => stepIds.indexOf(a.id) >= 0) || false) && true);\n } else if (comparisonType === 'ALL') {\n this.disabledContinue = filteredAnswers.filter(a => stepIds.indexOf(a.id) >= 0).length !== stepIds.length;\n } else {\n this.disabledContinue = this.questions.length !== filteredAnswers.length;\n }\n\n this.notice = (filteredAnswers.find(a => a.notice) || {}).notice || '';\n },\n filters: {\n handler: function(){\n this.data = {\n loadingMessage: this.isResultsPage && this.loadingMessage,\n };\n\n\n if (this.debounce){\n clearTimeout(this.debounce);\n }\n\n if (!this.isResultsPage) {\n this.loadData();\n }else{\n this.debounce = setTimeout(this.loadData, 600);\n }\n\n },\n deep: true\n },\n data: {\n handler: function(d){\n if (!d || !d.searchResults) {\n return;\n }\n\n const { TotalResults, remaining, ShowLastPage } = d.searchResults || {};\n const tabs = d.tabs || [];\n\n // set the total number of found results\n if (TotalResults !== undefined) {\n this.count = TotalResults\n }\n\n // for pagination\n !remaining && this.setData(d);\n\n this.steps = tabs.map(t => ({ label: t.tabTitleShort }));\n\n if (ShowLastPage) {\n this.stepNumber = this.steps.length;\n }\n\n this.isResultsPage = this.steps.length <= this.stepNumber;\n\n this.loadView();\n },\n deep: true\n },\n stepNumber(i) {\n this.tagStepFlag = true;\n this.loadView();\n },\n stepAnswers(v){\n }\n },\n created: function() {\n const bars = document.querySelectorAll('.persistent-cta');\n for (var i = 0; i < bars.length; i++){ const e = bars[i]; e.classList.add('persistent-cta--ms'); }\n },\n updated(){\n if (this.isResultsPage) {\n this.triggerForm();\n }\n },\n methods: {\n // Fetchs the remote data\n loadData: function(){\n const _this = this;\n let filters = {...this.filters};\n\n this.fetch(function(response){\n _this.setData(response.data || {});\n }, {\n params: {\n ...this.params,\n page: this.page,\n ...filters,\n },\n paramsSerializer: function (params) {\n return qs.stringify(params, {arrayFormat: 'repeat'})\n },\n });\n },\n\n // Pagination methods\n loadMore: function(e){\n this.setData(this.data);\n },\n setData: function(data){\n const { searchResults: { Results = [], remaining, ..._searchResults }, ...res } = data;\n let searchResults = {};\n\n if (!remaining) {\n searchResults = {\n Results: [\n ...Results.filter((_, i) => i < this.pageSize )\n ],\n remaining: Results.filter((_, i) => i >= this.pageSize ),\n ..._searchResults\n };\n\n this.onTriggerStepEvent(data);\n } else {\n searchResults = {\n Results: [\n ...Results,\n ...remaining.filter((_, i) => i < this.pageSize )\n ],\n remaining: remaining.filter((_, i) => i >= this.pageSize ),\n ..._searchResults\n };\n }\n\n this.data = {\n ...res,\n searchResults,\n nextPage: searchResults.remaining.length > 0\n };\n },\n\n // Step methods\n getTab(stepNumber, data) {\n const tabs = (data && data.tabs) || this.data.tabs || [];\n return tabs[stepNumber] || {};\n },\n getQuestions(stepNumber, data) {\n const tab = this.getTab(stepNumber, data);\n return tab.questions || [];\n },\n loadView() {\n this.setStepValues();\n\n if (this.isResultsPage){\n return;\n }\n\n this.answerModel = this.answerMemo[this.stepNumber] ? [...this.answerMemo[this.stepNumber]] : [];\n },\n setStepValues() {\n const tabs = this.data.tabs || [];\n if (tabs.length === 0) {\n return;\n }\n\n const answerMemo = this.answerMemo;\n\n this.stepValues = answerMemo.map((a, i) => {\n const tab = tabs[i] || {};\n\n if (tab.tabValue) {\n return tab.tabValue;\n }\n\n if (i >= this.stepNumber) {\n return '';\n }\n\n if (!a) {\n return '';\n }\n\n const label = a.map(e => {\n if (typeof e.value === 'object'){\n const { MoreLabel = '' } = this.data.searchResults || {};\n if (e.value.length <= 1) {\n return e.value.join();\n }\n const count = e.value.length-1;\n return e.value[0] + ` + ${count} ` + MoreLabel;\n }\n\n return e.value;\n }).join(' ');\n return label;\n });\n },\n onClickNextButton(skip=false) {\n if (this.isResultsPage) {\n this.$refs.slideBar.open(); \n return;\n }\n\n this.answerMemo = [...this.answerMemo];\n\n const indexes = this.questions.map(q => q.index);\n\n if(skip){\n this.answerMemo[this.stepNumber] = this.questions.map(q => this.questionSkipResult(q));\n } else {\n const anws = this.answerModel.reduce((a, e) => (!e ? a : {...a, [e.index]: e}), {});\n this.answerMemo[this.stepNumber] = indexes.map(i => anws[i] || {});\n }\n\n this.answerModel = [];\n this.stepNumber += 1;\n },\n onClickSkipButton() {\n this.onClickNextButton(true);\n },\n changeStepNumber(stepNumber) {\n this.stepNumber = stepNumber;\n },\n changedAnswerMemoOnResultPage(){\n const answerMemo = [...this.answerMemo];\n this.questions.forEach((q, i) => {\n const { tabIndex, questionIndex, ...rest} = q;\n if (!answerMemo[tabIndex]) {\n answerMemo[tabIndex] = [];\n }\n\n if (!this.answerModel[i]) {\n answerMemo[tabIndex][questionIndex] = this.questionSkipResult(q);\n return;\n }\n\n answerMemo[tabIndex][questionIndex] = this.answerModel[i];\n });\n\n this.answerMemo = answerMemo;\n },\n questionSkipResult(q){\n return { query: q.apiQuery.reduce((a, e) => ({ ...a, [e]: 'skip' }), {}) };\n },\n triggerTaggingEvent(data, type){\n if (!data){\n return;\n }\n\n const dataObject = {\n event: 'TF-Meter-Selection',\n type: 'tool',\n category: 'Meter Selector',\n ...data\n };\n\n try {\n if (type === 'immutable') {\n window.immutableDataLayerPush(dataObject);\n } else {\n window.customMutableDataLayerPush(dataObject);\n }\n } catch(err) {\n console.log('Analytics framework error: ', err)\n }\n },\n onTriggerQuestionEvent(data = {}){\n if (!Number.isInteger(data.questionIndex)){\n return;\n }\n\n if (!data || data.value === undefined) {\n return;\n }\n\n // tagging event\n const tab = this.getTab(this.stepNumber);\n const question = this.questions[data.questionIndex];\n const questionTitle = question.question || tab.tabTitle;\n const isButton = Boolean(question.button);\n\n this.triggerTaggingEvent({\n action: isButton ? questionTitle : question.filterName,\n label: isButton ? data.value.label : data.value,\n elementType: isButton ? 'button' : 'input',\n });\n },\n onTriggerStepEvent(data = {}){\n if (!this.tagStepFlag) {\n return;\n }\n\n this.tagStepFlag = false;\n\n // tagging event\n const i = this.stepNumber;\n const stepNo = this.padStart(String(i + 1), 2);\n const matchCount = data.searchResults && this.padStart(String(data.searchResults.TotalResults), 3);\n\n if (i < this.steps.length) {\n this.triggerTaggingEvent({\n stepNo,\n matchCount,\n stepName: this.steps[i].label\n }, 'immutable');\n } else if (i >= this.steps.length) {\n this.triggerTaggingEvent({\n stepNo,\n matchCount,\n stepName: 'COMPLETE'\n }, 'immutable');\n\n }\n },\n padStart(value, padSize = 2){\n let n = String(value);\n while (n.length < padSize) {n = \"0\" + n;}\n return n;\n },\n triggerForm() {\n const buttons = document.querySelectorAll(this.requestQuoteButton);\n const comments = this.answerMemo.reduce((a, o, i) => {\n if (!o) {\n return a;\n }\n\n const qa = o.filter(e => Boolean(e.label)).map(e => ({ label: e.label + (e.option && e.option.label ? ' in ' + e.option.label : ''), value: e.value }));\n\n return qa.length > 0 ? [...a, ...qa] : a;\n } , []);\n\n const commentsText = comments.filter(o => Boolean(o.value)).map(o => o.label.toUpperCase() + ': ' + (Array.isArray(o.value) ? o.value.join(', ') : o.value.toString())).join(' | ');\n\n for (var i = 0; i < buttons.length; i++){\n const button = buttons[i];\n button.dataset.comments = commentsText;\n }\n },\n },\n components: {\n 'meter-selector-paginator' : {\n props: ['data', 'isShow'],\n template: meterSelectorPaginatorTemplate,\n },\n 'meter-selector-content' : {\n props: ['data', 'count', 'isMatch', 'selectedUnit'],\n data: function() {\n return {\n };\n },\n computed: {\n viewProductLabel: function() {\n return this.data.searchResults.ViewProductLabel;\n },\n component(){\n return this.isMatch && this.count === 1 ? 'product-item-h' : 'product-item-v';\n }\n },\n components: {\n \"product-item-v\": {\n props: ['item', 'selectedUnit', 'viewProductLabel'],\n template: productItemVTemplate,\n components: {\n \"bookmark\": {\n props: ['item'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n }\n }\n },\n \"product-item-h\": {\n props: ['item', 'selectedUnit', 'viewProductLabel'],\n template: productItemHTemplate,\n components: {\n \"bookmark\": {\n props: ['item'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n \n }\n }\n },\n },\n watch: {\n },\n template: meterSelectorContentTemplate,\n },\n 'meter-selector-total': {\n props: ['count'],\n },\n }\n })\n ] \n});\n","import ComponentModule from 'lib/component-module';\nimport tabs from 'lib/tabs';\nimport {\n tabSelectMobile as tabSelectMobileTemplate,\n productItem as productItemTemplate,\n documentItem as documentItemTemplate,\n softwareItem as softwareItemTemplate,\n articleItem as articleItemTemplate\n} from 'lib/template-strings/my-saved-page';\nimport store from \"../store\";\n// import axios from \"axios\"\n// import fpodb from '../../../../db.json';\nimport EventBus from '../event-bus';\nimport VModal from 'vue-js-modal';\nimport {releaseNotesModal} from './../modals';\nimport Vue from 'vue/dist/vue.min.js';\n\nVue.use(VModal);\n\nComponentModule.AddModule('.my-saved-page', {\n prefix: 'my-saved-page-',\n components: [\n tabs({\n data: function() {\n return {\n savedIds: {\n products: [],\n documents: [],\n software: [],\n articles: [],\n legalDocuments: []\n }\n }\n },\n computed: {\n savedProducts: function() {\n return store.state.favorites.productId;\n },\n savedDocuments: function() {\n return store.state.favorites.documentId;\n },\n savedSoftware: function() {\n return store.state.favorites.softwareId;\n },\n savedArticles: function() {\n return store.state.favorites.articleId;\n },\n savedLegalDocuments: function() {\n return store.state.favorites.legalDocumentId;\n },\n },\n watch: {\n savedProducts: function() {\n this.savedIds.products = this.savedProducts[0] == \"\" ? this.savedProducts.shift() : this.savedProducts;\n },\n savedDocuments: function() {\n this.savedIds.documents = this.savedDocuments[0] == \"\" ? this.savedDocuments.shift() : this.savedDocuments;\n },\n savedSoftware: function() {\n this.savedIds.software = this.savedSoftware[0] == \"\" ? this.savedSoftware.shift() : this.savedSoftware;\n },\n savedArticles: function() {\n this.savedIds.articles = this.savedArticles[0] == \"\" ? this.savedArticles.shift() : this.savedArticles;\n },\n savedLegalDocuments: function() {\n this.savedIds.legalDocuments = this.savedLegalDocuments[0] == \"\" ? this.savedLegalDocuments.shift() : this.savedLegalDocuments;\n }\n },\n methods: {\n initSavedIds() {\n this.savedIds.products = this.savedProducts[0] == \"\" ? this.savedProducts.shift() : this.savedProducts;\n this.savedIds.documents = this.savedDocuments[0] == \"\" ? this.savedDocuments.shift() : this.savedDocuments;\n this.savedIds.software = this.savedSoftware[0] == \"\" ? this.savedSoftware.shift() : this.savedSoftware;\n this.savedIds.articles = this.savedArticles[0] == \"\" ? this.savedArticles.shift() : this.savedArticles;\n this.savedIds.legalDocuments = this.savedLegalDocuments[0] == \"\" ? this.savedLegalDocuments.shift() : this.savedLegalDocuments;\n }\n },\n created() {\n this.initSavedIds();\n },\n mounted() {\n },\n components: {\n tabSelectMobile: {\n name: 'tab-select-mobile',\n template: tabSelectMobileTemplate,\n props: {\n currentTab: [String, Number],\n selectClass: { type: String, default: 'my-saved-page__tab-select' },\n changeTab: Function,\n savedData: Object\n },\n data: function() {\n const data = {\n options: [],\n };\n\n return data;\n },\n mounted() {\n const defaultSlots = this.$slots.default;\n const childSlot = defaultSlots && defaultSlots[0]\n const children = childSlot && childSlot.children;\n if (children) {\n \n children.forEach(c => {\n const options = c.componentOptions;\n if (!options || options.tag !== 'tab'){\n return;\n }\n\n const props = options.propsData;\n const span = options.children[0];\n const text = span && span.children[0] && span.children[0].text;\n const id = props.idTab;\n\n this.options.push({id, text});\n });\n }\n },\n methods: {\n change: function(e) {\n this.changeTab(e.target.value);\n }\n }\n },\n savedProducts: {\n name: 'saved-products',\n props: ['savedIds'],\n data: function() {\n return {\n checked: [],\n checkedStr: null\n }\n },\n watch: {\n \"checked\": function() {\n this.checkedStr = this.checked.map((item) => {\n return `${item.name}`\n }).join(`\\n`);\n }\n },\n components: {\n productItem: {\n name: 'product-item',\n // template: productItemTemplate,\n props: ['checked', 'savedIds'],\n data: function() {\n const data = {\n id: null,\n isChecked: null,\n isBookmarked: false,\n type: 'productId'\n };\n \n return data;\n },\n watch: {\n isChecked: function() {\n let param = this.isChecked ? \"add\" : \"remove\";\n let url = this.$refs.url.getAttribute('href');\n let name = this.$refs.url.innerText;\n\n let obj = {\n 'id': this.id,\n 'url': url,\n 'name': name\n }\n\n EventBus.$emit('update-checked', param, obj);\n },\n \"savedIds.products\": function() {\n this.isBookmarked = this.savedIds.products.includes(this.id) ? true : false;\n }\n },\n mounted() {\n this.id = this.$refs.checkbox.dataset.productId;\n this.isBookmarked = this.savedIds.products.includes(`${this.id}`) ? true : false;\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n },\n },\n methods: {\n requestaquote() {\n console.log(\"REQUEST A QUOTE\");\n }\n },\n mounted() {\n EventBus.$on('update-checked', (param, value) => {\n if ( param == \"add\") {\n this.checked.push(value);\n } else {\n let match = this.checked.find((item) => {\n return item.id == value.id\n });\n\n let index = this.checked.map((item) => {\n return item.id;\n }).indexOf(value.id);\n if (match) {\n this.checked.splice(this.checked.indexOf(index), 1);\n }\n\n }\n });\n }\n }, \n docItem: {\n name: 'doc-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'documentId',\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.documents\": function() {\n this.isBookmarked = this.savedIds.documents.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.savedIds.documents.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n }\n },\n legalDocItem: {\n name: 'legal-doc-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'legalDocumentId',\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.legalDocuments\": function() {\n this.isBookmarked = this.savedIds.legalDocuments.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails},`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.savedIds.legalDocuments.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n }\n },\n softwareItem: {\n name: 'software-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'softwareId',\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.software\": function() {\n this.isBookmarked = this.savedIds.software.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleModal() {\n let releaseNotes = this.$refs.releaseNotes.innerHTML;\n this.$modal.show(\n releaseNotesModal.template(releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId;\n this.isBookmarked = this.savedIds.software.includes(`${this.id}`) ? true : false;\n }\n },\n articleItem: {\n name: 'article-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'articleId',\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.articles\": function() {\n this.isBookmarked = this.savedIds.articles.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.articleId;\n this.isBookmarked = this.savedIds.articles.includes(`${this.id}`) ? true : false;\n }\n }\n \n },\n tabProps: {\n savedIds: Object\n },\n tabOptions: {\n computed: {\n taggingMeta: function() {\n return null\n }\n }\n }, \n tabContentOptions: {\n computed: {\n taggingMeta: function() {\n return null\n }\n }\n }, \n contentProps: {\n savedIds: Object\n }\n }),\n \n ]\n});\n\n// window.seeLessLabel = \"see less\";\n// window.seeAllLabel = \"see more\";","import ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\nimport store from '../store';\n\nimport {\n content as recentPostsContentTemplate,\n paginator as recentPostsPaginatorTemplate,\n} from 'lib/template-strings/recent-posts';\n\nComponentModule.AddModule('.recent-posts', {\n prefix: 'recent-posts-',\n components: [\n fetcher({\n data: function(){\n const data = {\n data: {\n firstLoad: true,\n keepContent: true,\n results: [],\n store: store,\n }\n };\n\n return data;\n },\n computed: {\n language: function() {\n return store.state.currentLang;\n },\n taggingMetaMarket: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.market,\n \"label\": \"Market\",\n }); \n },\n taggingMetaTechnology: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.technology,\n \"label\": \"Technology\",\n }); \n },\n taggingMetaProductLine: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.productLine,\n \"label\": \"Post Type\",\n }); \n }\n\n },\n watch: {\n \"language\": function() {\n this.params.lang = this.language;\n }\n },\n methods: {\n loadMore: function(e){\n const _this = this;\n\n this.fetch(function(response){\n let _results = [];\n let keepContent = false;\n const { results, ...data } = response.data || {};\n\n if (!results) {\n return false;\n }\n\n if (_this.data && _this.data.results) {\n _results = _this.data.results;\n keepContent = _this.data.keepContent;\n }\n\n _this.data = {\n ...data,\n results: [\n ..._results,\n ...results,\n ],\n keepContent,\n showPaginator: data.currentPage < data.totalPages,\n };\n }, {\n params: {\n ...this.params,\n page: (this.data && this.data.nextPage) || 2,\n pageSize: 8,\n }\n });\n },\n },\n components: {\n 'recent-posts-paginator' : {\n props: ['data', 'isShow'],\n template: recentPostsPaginatorTemplate,\n },\n 'recent-posts-content' : {\n props: ['data'],\n template: recentPostsContentTemplate,\n }\n }\n })\n ]\n});\n","import ComponentModule from 'lib/component-module';\nimport tabs from 'lib/tabs';\nimport {\n contentApplications as contentApplicationsTemplate,\n} from 'lib/template-strings/solution-area';\nimport { applicationsModal } from \"../modals\";\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport store from \"../store\";\n\nVue.use(VModal);\n\nComponentModule.AddModule('.solution-area', {\n prefix: 'solution-area-',\n components: [\n tabs({\n data: function() {\n return {\n isMobile: null,\n store: store\n }\n },\n watch: {\n isMobile: function() {\n if (!this.isMobile) {\n this.$modal.hide('applications');\n }\n }\n },\n methods: {\n changeTab: function(id){\n if (this.currentTab != id) {\n this.currentTab = id;\n this.$nextTick(() => {\n this.scrollToTop();\n })\n } else {\n // close tab if clicked again\n if(this.isMobile) {\n this.currentTab = null;\n }\n }\n },\n showModal() {\n const apps = document.querySelector('.solution-area__applications-item.active').cloneNode(true);\n console.log(applicationsModal.name);\n this.$modal.show(\n applicationsModal.template,\n applicationsModal.name,\n applicationsModal.options,\n applicationsModal.events(apps)\n )\n },\n hideApplications : function () {\n this.$modal.hide('applications');\n },\n checkIsMobile() {\n // this is checking for a breakpoint *smaller* than\n // var isMobile in store.js\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n \n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n },\n scrollToTop() {\n let el = this.$el.querySelector('.solution-area__content-item.active');\n let elmOffset = el.offsetTop;\n let scrollOffset = window.scrollY;\n // console.log(\"el\",elmOffset);\n // console.log(\"window\",scrollOffset);\n if (elmOffset < scrollOffset) {\n let elmPos = el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n },\n components: {\n 'applications-content': {\n name: 'applications-content',\n template: contentApplicationsTemplate,\n props: {\n idTab: [String, Number],\n currentTab: [String, Number],\n activeClass: {type: String, default: 'active'},\n close: Function\n },\n data: function() {\n return {\n label: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = Array.prototype.slice.call(document.querySelectorAll('.solution-area__tabs li'))[(this.idTab - 1)].innerText;\n }\n },\n },\n tabData: {\n label: null\n },\n tabOptions: {\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = this.$el.innerText;\n }\n },\n tabContentData: {\n label: null\n },\n tabContentOptions: {\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = Array.prototype.slice.call(document.querySelectorAll('.solution-area__tabs li'))[(this.idTab - 1)].innerText;\n }\n },\n mounted() {\n this.checkIsMobile();\n }\n })\n ]\n});\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst pardotFormInstance = Vue.component('pardot-form', {\n data: function() {\n return {\n }\n },\n computed: {\n paramData: function() {\n return ({\n GAID: store.state.GAID\n })\n }\n },\n methods: {\n handleIframe() {\n let iframe = this.$el;\n let src = this.$el.getAttribute('src');\n\n window.addEventListener(\"message\", (event) => {\n if (event.origin == \"https://info.badgermeter.com\") {\n this.$nextTick(() => {\n sizeIframe(event);\n postData(event);\n });\n }\n });\n\n const postData = (event) => {\n // console.log(this.paramData);\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage(JSON.stringify(this.paramData), '*');\n } else {\n iframe.onload = function() {\n iframe.contentWindow.postMessage(JSON.stringify(this.paramData), '*');\n }\n }\n }\n \n const sizeIframe = (event) => {\n let data = JSON.parse(event.data);\n // console.log(data);\n if (data.form) {\n if ( src.includes(data.form) ) {\n iframe.style.height = `${data.content + 20}px`;\n if (data.submit) {\n this.checkScroll();\n }\n }\n }\n };\n \n },\n checkScroll() {\n let iframe = this.$el;\n let iframePos = iframe.offsetTop;\n let scrollOffset = window.scrollY;\n\n if (iframePos < scrollOffset) {\n let elmPos = iframe.getBoundingClientRect().top + window.scrollY - 100;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n }\n },\n mounted() {\n this.handleIframe();\n }\n});\n\nconst pardotForm = () => {\n\n let forms = document.querySelectorAll('.pardot-form');\n\n let formConstructor = (id) => {\n pardotFormInstance;\n\n new Vue({\n el: `.pardot-form-${id}`,\n }).$mount(`.pardot-form-${id}`, true);\n }\n\n if (forms.length > 0) {\n forms.forEach((item, index) => {\n item.classList.add(`pardot-form-${index}`);\n formConstructor(index);\n })\n }\n\n}\n\nexport {pardotForm, pardotFormInstance};","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {patentsModal} from './modals';\n\nVue.use(VModal);\n\nconst patents = () => {\n\n let patentItems = document.querySelectorAll('.patents');\n\n let patentsConstructor = (id) => {\n Vue.component('patents', {\n data: function() {\n return {\n allPatents: null\n }\n },\n methods: {\n triggerModal() {\n this.$modal.show(\n patentsModal.template,\n patentsModal.name, \n patentsModal.options,\n patentsModal.events(this.allPatents)\n )\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.allPatents = this.$refs.allPatents;\n });\n }\n });\n\n new Vue({\n el: `.patents-${id}`,\n }).$mount(`.patents-${id}`, true);\n }\n\n if (patentItems.length > 0) {\n patentItems.forEach((item, index) => {\n item.classList.add(`patents-${index}`);\n patentsConstructor(index);\n })\n }\n\n}\n\nexport default patents;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { debounce } from './misc';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst ProductCatalog = () => {\n\n let catalog = document.querySelectorAll('.product-catalog');\n\n const productCatalogConstructor = (id) => {\n Vue.component('product-catalog-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true, //is filter area (including unit toggler and btns) visible\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n savedDocsOnly: null,\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n selectedUnit: null,\n usLabel: '',\n metricLabel: '',\n store: store,\n viewProductLabel: null,\n class: 'product-catalog',\n\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.productId[0] == \"\" ? store.state.favorites.productId.slice(1) : store.state.favorites.productId;\n },\n computedUnit: function() {\n return store.state.units;\n },\n pageRange: function() {\n if (this.data.totalResults > 9) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n },\n watch: {\n computedUnit: function() {\n this.data.selectedUnit = this.computedUnit;\n // console.log(\"unit changed\");\n this.getUrl();\n // this.updateHistory();\n },\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDownloads');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n });\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n },\n \"data.currentPage\": function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n var type = type;\n var value = encodeURIComponent(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1; //reset page to 1\n\n if (checked) {\n switch(type) {\n case \"measuringMedium\":\n let measureFilter = this.data.filters.map((e) => {\n return e.type\n });\n // console.log(measureFilter);\n if (measureFilter.indexOf('measuringMedium') > -1) {\n let index = measureFilter.indexOf('measuringMedium');\n this.data.filters.splice(index,1);\n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label\n }];\n } else {\n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label}];\n }\n break;\n case \"savedProducts\":\n this.data.filters = [...this.data.filters, \n {\"value\": checked, \n \"type\": type, \n \"name\": label}];\n break;\n default: \n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label}];\n }\n\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n console.log(\"updateFilters - this.data.filters=\", this.data.filters);\n\n },\n updateRangeFilter(entry) {\n this.data.currentPage = 1; //reset page to 1 when filters changed\n // console.log(entry);\n // allow only once instance of filter type at once for ranges\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (types.indexOf(entry.type) > -1) {\n let index = types.indexOf(entry.type);\n\n if (this.data.filters[index].value == entry.value && this.data.filters[index].type == entry.type) {\n // if old and new entries are the same, do nothing\n return;\n } else {\n // only update filters if new entry values differ\n this.data.filters.splice(index,1);\n this.data.filters = [...this.data.filters, entry];\n }\n\n } else {\n this.data.filters = [...this.data.filters, entry];\n }\n // this.data.filters = [...this.data.filters, entry];\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) { return; }\n if (value) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.type\n }).indexOf(type);\n // console.log(\"remove\", index);\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n \n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n let unitParams = this.computedUnit;\n\n let marketParams = this.data.filters.filter(item => {\n return item.type == \"market\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productCatParams = this.data.filters.filter(item => {\n return item.type == \"productCategory\"\n }).map(item => {\n return item.value;\n }).toString();\n let subparams = this.data.filters.filter(item => {\n return item.type == \"subparam\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productTypeParams = this.data.filters.filter(item => {\n return item.type == \"productType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productLineParams = this.data.filters.filter(item => {\n return item.type == \"productLine\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let measuringParams = this.data.filters.filter(item => {\n return item.type == \"measuringMedium\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n \n let pageParams = this.data.currentPage;\n\n let sizeMinParams = this.data.filters.filter(item => {\n return item.type == \"sizeMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let sizeMaxParams = this.data.filters.filter(item => {\n return item.type == \"sizeMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let tempMinParams = this.data.filters.filter(item => {\n return item.type == \"temperatureMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let tempMaxParams = this.data.filters.filter(item => {\n return item.type == \"temperatureMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let pressureMinParams = this.data.filters.filter(item => {\n return item.type == \"pressureMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let pressureMaxParams = this.data.filters.filter(item => {\n return item.type == \"pressureMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let flowRangeMinParams = this.data.filters.filter(item => {\n return item.type == \"flowRangeMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let flowRangeMaxParams = this.data.filters.filter(item => {\n return item.type == \"flowRangeMax\"\n }).map(item => {\n return item.value;\n }).toString();\n let flowRangeType = this.data.filters.filter(item => {\n return item.type == \"flowRangeMax\" || item.type == \"flowRangeMin\"\n }).map(item => {\n return item.flowRangeType;\n }).toString();\n\n this.data.urlParams = `${unitParams !== \"\" ? \"&units=\" + unitParams : \"\"}${marketParams !== \"\" ? \"&market=\" + marketParams : \"\"}${productCatParams !== \"\" ? \"&productCategory=\" + productCatParams : \"\"}${productTypeParams !== \"\" ? \"&productType=\" + productTypeParams : \"\"}${productLineParams !== \"\" ? \"&productLine=\" + productLineParams : \"\"}${measuringParams !== \"\" ? \"&measuringMedium=\" + measuringParams : \"\"}&savedProducts=${savedDocumentsTrueParams()}${subparams !== \"\" ? \"&subparam=\" + subparams : \"\"}&page=${pageParams}`;\n\n // console.log(apiUrl);\n // this.data.apiUrl = apiUrl;\n },\n getResults() {\n // let apiUrl = \"api/documents?\";\n this.getUrl();\n let baseUrl = window.productCatalogAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/products\"; //from json-server\n // let apiUrl = \"http://localhost:3003/productsTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var market = [];\n var productCategory = [];\n var productType = [];\n var productLine = [];\n var subparam = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"market\":\n market.push(item.value);\n break;\n case \"productCategory\":\n productCategory.push(item.value);\n break;\n case \"productLine\":\n productLine.push(item.value);\n break;\n case \"productType\":\n productType.push(item.value);\n break;\n case \"subparam\":\n subparam.push(item.value);\n default:\n return;\n }\n });\n\n const getValue = (param) => {\n let filter = this.data.filters.find((item) => {\n return item.type === param;\n });\n return filter ? filter.value : null;\n }\n\n const getFlowRangeType = () => {\n let filter = this.data.filters.find((item) => {\n return item.type === \"flowRangeMin\" || item.type === \"flowRangeMax\";\n });\n return filter ? filter.flowRangeType : null;\n }\n\n let axiosParams = {\n // language: null,\n units: this.computedUnit,\n market: market.join('|') == \"\" ? null : decodeURIComponent(market.join('|')),\n productCategory: productCategory.join('|') == \"\" ? null : decodeURIComponent(productCategory.join('|')),\n productType: productType.join('|') == \"\" ? null : decodeURIComponent(productType.join('|')),\n productLine: productLine.join('|') == \"\" ? null : decodeURIComponent(productLine.join('|')),\n sizeMin: getValue('sizeMin'),\n sizeMax: getValue('sizeMax'),\n flowRangeType: getFlowRangeType(),\n flowRangeMin: getValue('flowRangeMin'),\n flowRangeMax: getValue('flowRangeMax'),\n measuringMedium: getValue('measuringMedium') == null ? null : decodeURIComponent(getValue('measuringMedium')),\n temperatureMin: getValue('temperatureMin'),\n temperatureMax: getValue('temperatureMax'),\n pressureMin: getValue('pressureMin'),\n pressureMax: getValue('pressureMax'),\n savedProducts: savedDocumentsTrueParams(),\n subparam: subparam.join('|') == \"\" ? null : decodeURIComponent(subparam.join('|')),\n saved: this.data.savedDocs.join('|') == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'),\n page: this.data.currentPage,\n pageSize: 9,\n }\n\n console.log(axiosParams);\n\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults ? response.data.totalResults : 0;\n self.data.shownResults = response.data.results ? response.data.results.length : 0;\n self.data.viewProductLabel = response.data.viewProductLabel;\n //console.log(response.data);\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n let url = `${window.location.pathname}?${this.data.urlParams}`;\n if (history.state == null || history.state !== url) {\n history.pushState(url,\"\",url);\n }\n },\n // handle deep linking on history change\n deeplink() {\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n // console.log(params);\n // this.data.filters = []; //clear filters array first\n\n var initFilters = [];\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n // console.log(\"TYPE\",type);\n // console.log(\"CONTENT\", content);\n\n let entry = {}\n if (type == \"page\") {\n this.data.currentPage = parseInt(content);\n } else if (type == \"units\") {\n this.data.selectedUnit = content;\n } else if (type == \"savedProducts\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n \n // console.log(this.initFilters);\n\n });\n },\n toggleUnits() {\n store.commit('setUnits');\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.product-catalog__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n // 9 = page size\n this.data.totalPages = Math.ceil(this.data.totalResults / 9);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n // init data variables\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.productId[0] == \"\" ? store.state.favorites.productId.slice(1) : store.state.favorites.productId;\n this.data.selectedUnit = store.state.units;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true; // hide filters if less then 10 initial results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false; // enable \"share all\" if 5 of less results\n this.data.usLabel = this.$refs.unitToggler.dataset.usLabel;\n this.data.metricLabel = this.$refs.unitToggler.dataset.metricLabel;\n\n // init eventbus listeners\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('updateRangeFilter', (entry) => {\n this.updateRangeFilter(entry);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n\n // init initial results\n if (window.defaultFilter) {\n this.data.filters.push(window.defaultFilter);\n }\n this.data.results = window.initialProductApiResults.results;\n this.data.totalResults = window.initialProductApiResults ? window.initialProductApiResults.totalResults : 0;\n this.data.shownResults = window.initialProductApiResults.results ? window.initialProductApiResults.results.length : 0;\n this.data.viewProductLabel = window.initialProductApiResults ? window.initialProductApiResults.viewProductLabel : null;\n\n // this.data.results = fpodb.products.results;\n // this.data.totalResults = fpodb.products.totalResults;\n // this.data.shownResults = fpodb.products.results ? fpodb.products.results.length : 0;\n // this.data.viewProductLabel = fpodb.products.viewProductLabel;\n \n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n \n // results list\n Vue.component('product-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('product-results-item', {\n props: ['data', 'content', 'index'],\n data: function() {\n return {\n isChecked: false,\n isBookmarked: false,\n id: this.content.id || null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.productId;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"productLine\": this.content.brand,\n \"label\": this.content.productName ? this.content.productName.replace('

    ', '').replace('

    ','') : null,\n \"no\": this.index < 10 ? `0${this.index + 1}` : (this.index + 1).toString()\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"content\": function() {\n this.id = this.content.id || null;\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n \n
    \n \n \n
    \n\n
    \n\n
    \n
    {{spec.label}}
    \n
    \n
    {{spec.valueMetric}}
    \n
    {{spec.valueImperial}}
    \n
    \n
    \n \n
    \n\n \n
    \n
    \n `,\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"productId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n // this.id = this.$refs.bookmark.dataset.productId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n shareAll() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.results.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailtoAll = mailto;\n }\n },\n mounted() {\n if (parseInt(this.data.totalResults) <= 5) {\n this.shareAll();\n }\n }\n });\n\n Vue.component('min-max', {\n props: ['data'],\n data: function() {\n return {\n minValue: null, //final values to send to api\n minValueRange: null, // model for range slider\n minValueInput: null, // model for input field\n maxValue: null, //final values to send to api\n maxValueRange: null, // model for range slider\n maxValueInput: null, // model for input field\n\n usMin: null,\n usMax: null,\n usStep: null,\n metricMin: null,\n metricMax: null,\n metricStep: null,\n\n currentMin: null,\n currentMax: null,\n currentStep: null,\n styles: null,\n\n type: null,\n currentUnit: null,\n label: null\n }\n },\n watch: {\n \"data.filters\": function() {\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (!(types.indexOf(`${this.type}Min`) > -1)) {\n this.minValue = null;\n }\n if (!(types.indexOf(`${this.type}Max`) > -1)) {\n this.maxValue = null;\n }\n },\n \"data.selectedUnit\": function() {\n this.initCurrentUnits();\n this.initUnitLabel();\n // reset selectors when units change\n this.maxValue = null;\n this.minValue = null;\n this.minValueRange = this.currentMin;\n this.maxValueRange = this.currentMax;\n\n // clear inputs and input filters when changing units\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n },\n \"minValue\": function() {\n // if at max value, set to null for 'no min' and remove filter\n // if value exceeds min or max range, set to one step under max value\n if (this.minValue == this.currentMin || this.minValue == \"\") {\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n } else if (parseFloat(this.minValue) < parseFloat(this.currentMin) || parseFloat(this.minValue) > parseFloat(this.currentMax)) {\n // this.minValue = parseFloat(this.currentMin) === 0 ? 0 : (parseFloat(this.currentMin) - parseFloat(this.currentStep)).toString();\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n }\n\n this.updateFilters(\"Min\");\n this.minValueRange = this.minValue == null ? this.currentMin : this.minValue;\n this.minValueInput = this.minValue;\n\n },\n \"maxValue\": function() {\n // if at max value, set to null for 'no max' and remove filter\n // if value exceeds min or max range, set to one step under max value\n if (this.maxValue == this.currentMax || this.maxValue == \"\") {\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n } else if (parseFloat(this.maxValue) > parseFloat(this.currentMax) || parseFloat(this.maxValue) < parseFloat(this.currentMin)) {\n // this.maxValue = (parseFloat(this.currentMax) - parseFloat(this.currentStep)).toString();\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n }\n\n this.updateFilters(\"Max\");\n this.maxValueRange = this.maxValue == null ? this.currentMax : this.maxValue;\n this.maxValueInput = this.maxValue;\n },\n \"maxValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.maxValueRange) <= parseFloat(this.minValueRange)) {\n this.maxValueRange = (parseFloat(this.minValueRange) + parseFloat(this.currentStep)).toString();\n }\n\n this.maxValueInput = this.maxValueRange == this.currentMax ? null : this.maxValueRange;\n this.initStyles();\n\n },\n \"minValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.minValueRange) >= parseFloat(this.maxValueRange)) {\n this.minValueRange = (parseFloat(this.maxValueRange) - parseFloat(this.currentStep)).toString();\n }\n\n this.minValueInput = this.minValueRange == this.currentMin ? null : this.minValueRange;\n this.initStyles();\n }\n },\n methods: {\n updateFilters: debounce(function(type) {\n // console.log(\"type:\", type);\n let entry = {\n name: `${type} ${this.label}: ${type == \"Min\" ? this.minValue : this.maxValue} ${this.currentUnit}`,\n value: type == \"Min\" ? this.minValue : this.maxValue,\n type: `${this.type}${type}`\n }\n // console.log(entry);\n if (entry.value !== null) {\n EventBus.$emit('updateRangeFilter', entry);\n }\n\n }, 500),\n handleRange: debounce(function(e, type) {\n let _t = e.target;\n var min = type == \"min\" ? _t.value : this.minValue;\n var max = type == \"max\" ? _t.value : this.maxValue; \n // console.log(\"MAX\", max);\n if (type == \"min\") {\n if (parseFloat(min) >= parseFloat(max)) {\n min = (parseFloat(max) - parseFloat(this.currentStep)).toString();\n }\n } else if (type == \"max\") {\n if (parseFloat(max) <= parseFloat(min)) {\n max = (parseFloat(min) + parseFloat(this.currentStep)).toString();\n }\n }\n\n this.minValue = min;\n this.maxValue = max;\n\n this.minValueInput = this.minValueInput !== this.minValue && this.minValue !== null ? this.minValue : this.minValueInput;\n this.maxValueInput = this.maxValueInput !== this.maxValue && this.maxValue !== null ? this.maxValue : this.maxValueInput;\n\n }, 500),\n initEvents() {\n this.$refs.rangeMin.addEventListener('input', e => {\n this.handleRange(e, 'min');\n }, false);\n this.$refs.rangeMax.addEventListener('input', e => {\n this.handleRange(e, 'max');\n }, false);\n },\n initMinMax() {\n // US\n this.usMin = this.$refs.rangeMin.dataset.usMin;\n this.usMax = this.$refs.rangeMin.dataset.usMax;\n this.usStep = this.$refs.rangeMin.dataset.usStep;\n\n // METRIC\n this.metricMin = this.$refs.rangeMin.dataset.metricMin;\n this.metricMax = this.$refs.rangeMin.dataset.metricMax;\n this.metricStep = this.$refs.rangeMin.dataset.metricStep;\n\n this.initCurrentUnits();\n },\n initCurrentUnits() {\n // CURRENT UNITS\n this.currentMin = this.data.selectedUnit == 'us' ? this.usMin : this.metricMin;\n this.currentMax = this.data.selectedUnit == 'us' ? this.usMax : this.metricMax;\n this.currentStep = this.data.selectedUnit == 'us' ? this.usStep : this.metricStep;\n this.initStyles();\n },\n initUnitLabel() {\n let unitLabels = this.$refs.rangeMin.dataset.units ? JSON.parse(this.$refs.rangeMin.dataset.units) : null;\n this.currentUnit = unitLabels[this.data.selectedUnit];\n },\n initStyles() {\n this.styles = `--a: ${this.minValueRange === null ? this.currentMin : this.minValueRange}; --b: ${this.maxValueRange === null ? this.currentMax : this.maxValueRange}; --min: ${this.currentMin}; --max: ${this.currentMax}`;\n },\n },\n mounted() {\n this.initMinMax();\n this.initEvents();\n // this.initUnitLabel();\n this.$nextTick(() => { \n // init slider positions\n this.minValueRange = this.data.selectedUnit == \"us\" ? this.$refs.rangeMin.dataset.usMin : this.$refs.rangeMin.dataset.metricMin;\n this.maxValueRange = this.data.selectedUnit == \"us\" ? this.$refs.rangeMin.dataset.usMax : this.$refs.rangeMin.dataset.metricMax;\n\n this.type = this.$refs.rangeMin.dataset.type;\n this.label = this.$refs.rangeMin.dataset.label;\n });\n\n \n\n }\n\n });\n\n Vue.component('min-max-flowrange', {\n props: ['data'],\n data: function() {\n return {\n minValue: null, //final values\n minValueRange: null, // model for range slider\n minValueInput: null, // model for input field\n maxValue: null, //final values\n maxValueRange: null,\n maxValueInput: null,\n\n min: null,\n // gpmMax: null,\n // gpmStep: null,\n // mhMax: null,\n // mhStep: null,\n // lpmMax: null,\n // lpmStep: null,\n\n currentMin: 0,\n currentMax: null,\n currentStep: null,\n styles: null,\n\n type: null,\n currentUnit: null,\n\n medium: null, //selected measuring medium\n label: null // display name for filter\n }\n },\n watch: {\n \"data.filters\": function() {\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (!(types.indexOf(`${this.type}Min`) > -1)) {\n this.minValue = null;\n }\n if (!(types.indexOf(`${this.type}Max`) > -1)) {\n this.maxValue = null;\n }\n if (types.indexOf('measuringMedium') > -1) {\n this.medium = this.data.filters.find((item) => {\n return item.type == 'measuringMedium';\n }).name.toLowerCase();\n } else {\n this.medium = null;\n }\n }, \n \"medium\": function() {\n this.currentUnit = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n this.initOptions();\n },\n \"currentUnit\": function() {\n if (this.currentUnit !== \"null\" && this.currentUnit !== null) {\n this.$nextTick(() => {\n // this.initMinMax();\n this.initStyles();\n this.initEvents();\n this.type = this.$refs.rangeMin.dataset.type;\n\n // clear final values\n this.minValue = null;\n this.maxValue = null;\n\n // set default slide range positions\n this.minValueRange = this.min;\n this.maxValueRange = this.currentMax;\n\n // console.log('init',this.label);\n this.label = this.label !== null ? this.label : this.$refs.rangeMin ? this.$refs.rangeMin.dataset.label : null;\n // console.log('final',this.label);\n });\n\n } else {\n // if no unit selected, remove flow range filters\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n }\n },\n \"minValue\": function() {\n if (this.minValue == this.currentMin || this.minValue == \"\") {\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n } else if (parseFloat(this.minValue) < parseFloat(this.currentMin) || parseFloat(this.minValue) > parseFloat(this.currentMax)) {\n // this.minValue = (parseFloat(this.currentMin) - parseFloat(this.currentStep)).toString();\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n }\n\n // this.initStyles();\n this.minValueRange = this.minValue == null ? this.min : this.minValue;\n this.minValueInput = this.minValue;\n if (this.minValue !== null) {\n this.updateFilters(\"Min\");\n }\n },\n \"maxValue\": function() {\n if (this.maxValue == this.currentMax || this.maxValue == \"\") {\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n } else if (parseFloat(this.maxValue) > parseFloat(this.currentMax) || parseFloat(this.maxValue) < parseFloat(this.currentMin)) {\n // this.maxValue = (parseFloat(this.currentMax) - parseFloat(this.currentStep)).toString();\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n }\n\n // this.initStyles();\n this.maxValueRange = this.maxValue == null ? this.currentMax : this.maxValue;\n this.maxValueInput = this.maxValue;\n if (this.maxValue !== null) {\n this.updateFilters(\"Max\");\n }\n },\n // globally selected us/metric unit\n \"data.selectedUnit\": function() {\n // clear current flow range selection\n this.currentUnit = \"null\";\n\n // show/hide options for relevant units\n // this.initUnits();\n this.initOptions();\n },\n\n \"maxValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.maxValueRange) <= parseFloat(this.minValueRange)) {\n this.maxValueRange = (parseFloat(this.minValueRange) + parseFloat(this.currentStep)).toString();\n }\n\n this.maxValueInput = this.maxValueRange == this.currentMax ? null : this.maxValueRange;\n this.initStyles();\n\n },\n \"minValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.minValueRange) >= parseFloat(this.maxValueRange)) {\n this.minValueRange = (parseFloat(this.maxValueRange) - parseFloat(this.currentStep)).toString();\n }\n\n this.minValueInput = this.minValueRange == this.currentMin ? null : this.minValueRange;\n this.initStyles();\n }\n },\n methods: {\n updateFilters: debounce(function(type) {\n //console.log(\"type:\", type);\n let entry = {\n name: `${type} ${this.label}: ${type == \"Min\" ? this.minValue : this.maxValue} ${this.currentUnit}`,\n value: type == \"Min\" ? this.minValue : this.maxValue,\n type: `${this.type}${type}`,\n flowRangeType: this.currentUnit\n }\n // console.log(entry);\n if (entry.value !== null) {\n EventBus.$emit('updateRangeFilter', entry);\n }\n\n }, 500),\n handleRange: debounce(function(e, type) {\n let _t = e.target;\n var min = type == \"min\" ? _t.value : this.minValue;\n var max = type == \"max\" ? _t.value : this.maxValue; \n if (type == \"min\") {\n if (parseFloat(min) >= parseFloat(max)) {\n min = (parseFloat(max) - parseFloat(this.currentStep)).toString();\n }\n } else if (type == \"max\") {\n if (parseFloat(max) <= parseFloat(min)) {\n max = (parseFloat(min) + parseFloat(this.currentStep)).toString();\n }\n }\n\n this.minValue = min;\n this.maxValue = max;\n\n this.minValueInput = this.minValueInput !== this.minValue && this.minValue !== null ? this.minValue : this.minValueInput;\n this.maxValueInput = this.maxValueInput !== this.maxValue && this.maxValue !== null ? this.maxValue : this.maxValueInput;\n },500),\n initEvents() {\n this.$refs.rangeMin.addEventListener('input', e => {\n this.handleRange(e, 'min');\n }, false);\n this.$refs.rangeMax.addEventListener('input', e => {\n this.handleRange(e, 'max');\n }, false);\n },\n initOptions() {\n this.$el.querySelectorAll('option').forEach((item) => {\n let unit = item.dataset.unitType;\n let flow = item.dataset.flowType ? item.dataset.flowType.toLowerCase() : null;\n\n if (this.medium == null) {\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (unit == this.data.selectedUnit) {\n item.style.display = \"block\";\n } else {\n item.style.display = \"none\";\n }\n } else {\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (flow.includes(this.medium) && unit == this.data.selectedUnit) {\n item.style.display = \"block\";\n } else {\n item.style.display = \"none\";\n }\n }\n });\n },\n initStyles() {\n this.styles = `--a: ${this.minValueRange === null ? this.currentMin : this.minValueRange}; --b: ${this.maxValueRange === null ? this.currentMax : this.maxValueRange}; --min: ${this.currentMin}; --max: ${this.currentMax}`;\n },\n selectUnit(e) {\n this.currentUnit = e.target.value == \"null\" ? null : e.target.value; //set selected unit\n if (e.target.value !== \"null\" && e.target.value !== null) {\n let data = JSON.parse(this.$el.querySelector(`option[value=\"${e.target.value}\"]`).dataset.flowData); //get min/max data for selected unit\n \n // set min/max data for current unit\n this.min = data.min;\n this.currentMax = data.max;\n this.currentMin = data.min;\n this.currentStep = data.step;\n }\n\n },\n initUnits() {\n let unit = this.data.selectedUnit;\n // console.log(unit);\n this.$el.querySelectorAll(`option`).forEach((item) => {\n // console.log(item);\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (item.dataset.unitType !== unit) {\n item.style.display = \"none\";\n } else {\n item.style.display = \"block\";\n }\n });\n }\n },\n mounted() {\n this.$nextTick(() => {\n // this.initUnits();\n this.initOptions();\n // this.label = this.$refs.rangeMin ? this.$refs.rangeMin.dataset.label : null;\n });\n }\n });\n\n Vue.component('radio-item', {\n props: ['data'],\n data: function() {\n return {\n type: \"measuringMedium\",\n id: null,\n isChecked: null,\n selectedRadio: null\n }\n },\n watch: {\n \"data.filters\": function() {\n this.checkState();\n }\n },\n methods: {\n updateFilters(el, e, type) {\n // console.log(\"e\", e);\n // console.log(\"type\", type);\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n let item = this.data.filters.find(el => {\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n this.selectedRadio = item ? decodeURIComponent(item.value) : null;\n },\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n }\n });\n\n new Vue({\n el: `.product-catalog-${id}`,\n store: store\n }).$mount(`.product-catalog-${id}`, true);\n }\n\n // multiHandleRange();\n if (catalog.length > 0) {\n catalog.forEach((item, index) => {\n item.classList.add(`product-catalog-${index}`);\n productCatalogConstructor(index);\n })\n }\n\n}\n\nexport default ProductCatalog;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst ProductsAccessories = () => {\n const products = document.querySelectorAll('.products-acc__wrapper');\n\n let productsConstructor = (id) => {\n Vue.component('products-accessories-template', {\n data: function() {\n return {\n paginated: null,\n openText: '',\n collapseText: '',\n isExpanded: false,\n totalItems: null,\n initialItems: null,\n buttonText: ''\n }\n },\n watch: {\n isExpanded: function() {\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n },\n paginated: function() {\n if (this.paginated) {\n this.$nextTick(() => {\n this.openText = this.$refs.openButton.dataset.openText;\n this.collapseText = this.$refs.openButton.dataset.collapseText;\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n })\n }\n }\n },\n methods: {\n handleClick() {\n let contentArea = this.$refs.contentContainer;\n let contentHeight = this.$refs.contentInner.getBoundingClientRect().height;\n\n if (this.isExpanded == true) {\n this.isExpanded = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isExpanded = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n init() {\n // init counts\n this.initialItems = this.$refs.initialContent.querySelectorAll('.product-card').length;\n this.moreItems = this.$refs.contentInner.querySelectorAll('.product-card').length;\n this.totalItems = this.initialItems + this.moreItems;\n\n this.paginated = this.moreItems > 0 ? true : false;\n\n // init button only if paginated\n if (this.paginated) {\n this.$nextTick(() => {\n this.openText = this.$refs.openButton.dataset.openText;\n this.collapseText = this.$refs.openButton.dataset.collapseText;\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n })\n }\n }\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.products-accessories-${id}`,\n store: store,\n }).$mount(`.products-accessories-${id}`, true);\n\n }\n\n if (products.length > 0 ) {\n products.forEach((item, index) => {\n item.classList.add(`products-accessories-${index}`);\n productsConstructor(index);\n })\n }\n\n}\n\nexport default ProductsAccessories;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport { quickLinksModal } from \"./modals\";\nimport store from \"./store\";\n\nconst quickLinks = () => {\n\n const links = document.querySelectorAll('.quick-links');\n\n Vue.use(VModal);\n\n let quickLinksConstructor = (id) => {\n Vue.component('quick-links', {\n computed: {\n isMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n isMobile: function() {\n if (!this.isMobile) {\n this.$modal.hide('quickLinks');\n }\n }\n },\n methods: {\n triggerModal() { \n let links = this.$refs.links.cloneNode(true);\n this.$modal.show(\n quickLinksModal.template,\n quickLinksModal.name,\n quickLinksModal.options,\n quickLinksModal.events(links)\n )\n }\n },\n });\n\n new Vue({\n el: `.quick-links-${id}`,\n }).$mount(`.quick-links-${id}`, true);\n }\n\n if (links.length > 0) {\n links.forEach((item, index) => {\n item.classList.add(`quick-links-${index}`);\n quickLinksConstructor(index);\n })\n }\n\n}\n\nexport default quickLinks;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { getUrlParameter } from './misc';\nimport showdown from 'showdown';\n\nconst searchResults = () => {\n\n let search = document.querySelectorAll('.search-results');\n \n const searchResultsConstructor = (id) => {\n Vue.component('search-results-template', {\n data: function() {\n return {\n data: {\n inputQuery: null,\n oldInputQuery: null,\n query: null,\n currentPage: 1, //current page #\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n results: [],\n totalResults: null,\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n isMobile: null,\n urlParams: null, //for deeplinking in-browser\n counts: {},\n store: store,\n didYouMean: null,\n resultsReturned: null,\n class: 'search-results',\n ai_related_questions: [],\n ai_sources: [],\n ai_sources_desktop: [],\n ai_sources_all: [],\n ai_chat_doc_id: \"\",\n ai_response: \"\",\n ai_disclaimer: \"\",\n ai_status_ai_stop: true,\n ai_status_first_call_fail: false,\n ai_status_second_call_fail: false,\n ai_status_show_more: false,\n ai_status_show_docs: false,\n ai_status_clicked_unlike: false,\n ai_status_clicked_like: false,\n ai_status_prefinal_result: false,\n ai_status_final_result: false,\n aiSearchDescHeight: -1,\n rerenderShowMore: 0,\n manageNoResultsOnFirstLoad: false,\n aiSearchEnabled: window.aiSearchEnabled,\n },\n isLoading: null\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites;\n },\n taggingMetaL1: function() {\n return JSON.stringify({\n \"type\": \"search-results\",\n \"category\": \"Search\",\n \"action\": this.data.query,\n \"label\": this.data.totalResults || 0,\n \"content\": \"Hero\",\n \"title\": \"Search Results\",\n \"name\": \"Hero - Search Results\",\n \"no\": \"01\"\n })\n },\n taggingMetaL2: function() {\n return JSON.stringify({\n \"type\": \"search-results\",\n \"category\": \"Search\",\n \"action\": this.data.query,\n \"label\": this.data.totalResults || 0,\n })\n },\n taggingTrigger: function() {\n return this.data.resultsReturned ? \"trigger\" : null\n },\n },\n watch: {\n saved: function() {\n let allSaved = [];\n let saved = store.state.favorites;\n\n for (let prop in saved) {\n allSaved = [...allSaved, ...saved[prop]];\n }\n\n this.data.savedDocs = allSaved.filter((item) => {\n return item !== \"\"\n });\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n\n this.initSubmit();\n },\n \"data.filters\": function() {\n //console.log(this.data.filters);\n this.data.currentPage = 1; //reset page to 1\n this.addLoading();\n this.getResults(); // handle api call\n },\n \"data.query\": function() {\n this.data.currentPage = 1; //reset page to 1 when query changes\n // this.getResults(this.data.query);\n }\n },\n methods: {\n toggleFilters() {\n if (this.data.isMobile) {\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== 'search') {\n return;\n }\n\n var type = type;\n var value = encodeURIComponent(e.currentTarget.value);\n var checked = e.currentTarget.checked;\n // console.log(\"type\", type)\n // console.log(e.currentTarget.name);\n // console.log(\"value\", encodeURIComponent(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": e.currentTarget.name}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": e.currentTarget.name}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {return;};\n //console.log(\"remove\", value);\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n }, \n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelectorAll('.search-results__input-container');\n inputField.forEach(element => element.classList.add('loading'));\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelectorAll('.search-results__input-container');\n inputField.forEach(element => element.classList.remove('loading'));\n },\n // AI SEARCH\n aiShowMore() {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"accordion\",\n \"category\": \"Show More\",\n \"action\": \"AI Search Box\",\n \"label\": \"Expand\",\n \"responseType\": \"AI Response\"\n });\n }\n this.data.ai_status_show_more = true;\n },\n aiViewAll() {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"accordion\",\n \"category\": \"View All\",\n \"action\": \"AI Search Box\",\n \"label\": \"Expand\",\n \"responseType\": \"AI Response\"\n });\n }\n this.data.ai_sources = this.data.ai_sources_all;\n this.data.ai_sources_desktop = this.data.ai_sources_all;\n this.data.ai_status_show_docs = true;\n },\n aiFeedbackUnlike() {\n this.aiFeedbackCall(1, 1);\n },\n aiFeedbackLike() {\n this.aiFeedbackCall(5, 2);\n },\n aiFeedbackCall(rating, type) {\n var beaconFeedback = \"/api/beaconfeedback\";\n // var beaconFeedback = \"http://localhost:3003/beaconfeedback\";\n\n if (type == 1) {\n this.data.ai_status_clicked_unlike = true;\n this.data.ai_status_clicked_like = false;\n }\n else if (type == 2) {\n this.data.ai_status_clicked_like = true;\n this.data.ai_status_clicked_unlike = false;\n }\n\n axios.patch(beaconFeedback, {\n docId: this.data.ai_chat_doc_id,\n rating: rating,\n feedback: \"\"\n }).then(function (response) {\n if (response.data.success) {\n console.log(response.data.success);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"feedback\",\n \"category\": \"Feedback\",\n \"action\": rating,\n \"label\": rating,\n \"responseType\": \"AI Response\"\n });\n }\n }\n else {\n console.log(\"Beacon feedback request error message: \" + response.data.message);\n }\n }).catch(function (error) {\n console.log(\"Unable to submit user feedback: \" + error);\n });\n },\n getResults() {\n // AI Search - avoid showing tip and generating at loading without a previous search\n this.data.ai_status_ai_stop = false;\n\n // this.data.query = query ? query : null;\n this.data.resultsReturned = true; //set this once after initial results returned\n let baseUrl = window.searchAPIUrl;\n \n if (this.data.inputQuery == 'test no results') { // FOR TESTING ONLY\n baseUrl = 'http://localhost:3003/searchResultsNone';\n }\n\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/searchResults\"; //from json-server\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var filters = [];\n\n this.data.filters.map((item) => {\n if (item.value !== true && item.value !== false) {\n filters.push(item.value);\n }\n });\n\n let filtersStr = decodeURIComponent(filters.join('|'));\n // console.log(filtersStr);\n\n let axiosParams = {\n q: this.data.inputQuery ? this.data.inputQuery : this.data.query ? this.data.query : null,\n filters: filtersStr == \"\" ? null : filtersStr,\n savedDocuments: savedDocumentsTrueParams() ? savedDocumentsTrueParams() : null,\n saved: savedDocumentsTrueParams() ? this.data.savedDocs.join('|') : null,\n page: this.data.currentPage\n }\n\n this.data.axiosParams = axiosParams;\n\n var searchTerm = axiosParams.q;\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n ///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n \n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n\n self.data.filterAreaVisible = false;\n }\n else {\n didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n\n self.data.filterAreaVisible = true;\n }\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n \n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=`?q=${dym}`;\n anchorElement.innerText = dym;\n //anchorElement.addEventListener(\"click\", function (e) {\n // self.didYouMean(e);\n // didyoumeanContainer.forEach(element => element.classList.remove('show'));\n //});\n allElements.push(anchorElement);\n })\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n for (let i = 0; i < allElements.length; i++) {\n didyoumeanEl.forEach(el => { \n let anchorElement = allElements[i].cloneNode(true);\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(e);\n //didyoumeanContainer.forEach(element => element.classList.remove('show'));\n });\n\n el.append(anchorElement); \n });\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n //commaEl.innerText = ' ';\n commaEl.style.paddingLeft = \"7px\";\n didyoumeanEl.forEach(el => { \n el.append(commaEl.cloneNode(true)); \n });\n }\n }\n \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n if (response.data.results) {\n // construct site section label into the title\n self.data.results = response.data.results.map((item) => {\n if (item.title && item.filterText) {\n if (item.title.indexOf(\"

    \") > -1) {\n return {\n ...item, \n \"title\": `

    ${item.title.replace(\"

    \", \"\")}`,\n \"rawTitle\": item.title\n }\n } else {\n return {\n ...item, \n \"title\": `${item.title}`,\n \"rawTitle\": item.title\n }\n }\n } else {\n return {...item}\n }\n });\n //if (!(response.data.results.length > 0)) {\n //self.data.didYouMean = response.data.didYouMean;\n //} else {\n self.data.didYouMean = null;\n //}\n self.data.manageNoResultsOnFirstLoad = true;\n } else {\n self.data.results = null;\n self.data.manageNoResultsOnFirstLoad = true;\n }\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && window.dataLayer &&\n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"global\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n // self.data.results = response.data.results ? response.data.results : null; \n self.data.totalResults = response.data.totalResults;\n \n // get counts of search result types\n self.data.counts = response.data.filterCountResults;\n self.data.trackId = response.data.trackId;\n // console.log(response.data);\n\n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n });\n\n if (this.data.aiSearchEnabled) {\n if (this.data.oldInputQuery != this.data.inputQuery) {\n // AI SEARCH\n var prompt = this.data.inputQuery;\n var aiRefs = [];\n var aiDocs = [];\n var beaconrefs = \"/api/beacon\";\n var beacondocs = \"/api/beacon\";\n // var beaconrefs = \"http://localhost:3003/beaconrefs\";\n // var beacondocs = \"http://localhost:3003/beacondocs\";\n \n // reset\n this.data.ai_status_first_call_fail = false;\n this.data.ai_status_second_call_fail = false;\n this.data.ai_status_show_more = false;\n this.data.ai_status_show_docs = false;\n this.data.ai_status_clicked_unlike = false;\n this.data.ai_status_clicked_like = false;\n this.data.ai_status_prefinal_result = false;\n this.data.ai_status_final_result = false;\n this.data.aiSearchDescHeight = -1;\n // refs call (1 equals to refs)\n axios.get(beaconrefs, {\n params: {\n prompt: prompt,\n type: 1\n }\n }).then(function (response) {\n if (response.data.success) {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"AI Result\",\n \"responseType\": \"AI Response\"\n });\n }\n self.data.ai_status_prefinal_result = true;\n aiRefs = response.data.content;\n self.setAIRefsValues(aiRefs);\n }\n else {\n console.log(\"Beacon refs request error message: \" + response.data.message);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_first_call_fail = true;\n }\n }).catch(function (error) {\n console.log(\"Beacon refs axios error message: \" + error);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_first_call_fail = true;\n });\n \n // docs call (2 equals to docs)\n axios.get(beacondocs, {\n params: {\n prompt: prompt,\n type: 2\n }\n }).then(function (response) {\n if (response.data.success) {\n self.data.ai_status_show_more = false;\n self.data.ai_status_show_docs = false;\n self.data.ai_status_final_result = true;\n aiDocs = response.data.content;\n self.setAIDocsValues(aiDocs);\n } else {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_second_call_fail = true;\n }\n }).catch(function (error) {\n console.log(\"Beacon docs axios error message: \" + error);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_second_call_fail = true;\n });\n }\n \n this.data.oldInputQuery = this.data.inputQuery;\n }\n },\n \n setAIRefsValues(ai) {\n // only save documents and docId\n this.data.ai_chat_doc_id = ai.chat_doc_id.toString();\n for (let i = 0; i < ai.sources.length; i++) {\n ai.sources[i].source_title = ai.sources[i].source_title.replace(/\\\\/g, '');\n }\n let sources = ai.sources.length;\n this.data.ai_sources = ai.sources.slice(0, (sources > 2 ? 2 : sources));\n this.data.ai_sources_desktop = ai.sources.slice(0, (sources > 4 ? 4 : sources));\n this.data.ai_sources_all = ai.sources;\n },\n\n setAIDocsValues(ai) {\n const converter = new showdown.Converter({disableForced4SpacesIndentedSublists: true, openLinksInNewWindow: true});\n this.data.ai_response = converter.makeHtml(ai.response);\n this.data.ai_disclaimer = ai.disclaimer;\n this.data.ai_related_questions = ai.related_questions;\n },\n\n loadMore() {\n // console.log(\"load more\");\n this.data.currentPage = this.data.currentPage + 1;\n\n this.data.axiosParams = {\n ...this.data.axiosParams,\n page: this.data.currentPage\n }\n //console.log(this.data.axiosParams);\n let self = this;\n\n let baseUrl = window.searchAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/searchResults2\"; //from json-server\n\n axios.get(apiUrl, {\n params: {\n ...this.data.axiosParams,\n }\n })\n .then(function(response) {\n // self.data.results.push(...response.data.results);\n let results = response.data.results.map((item) => {\n if (item.title && item.filterText) {\n if (item.title.indexOf(\"

    \") > -1) {\n return {...item, \"title\": `

    ${item.title.replace(\"

    \", \"\")}`}\n } else {\n return {...item, \"title\": `${item.title}`}\n }\n } else {\n return {...item}\n }\n });\n // console.log(\"LOAD MORE\", results);\n\n if (results) {self.data.results.push(...results)}\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n submit() {\n let didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n let didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n this.updateHistory(this.data.inputQuery);\n this.data.query = this.data.inputQuery;\n // Set loading icon states\n\n this.addLoading();\n this.getResults();\n },\n prefilter() {\n let params = getUrlParameter('filters');\n if (params) {\n let paramsArray = params.split(',');\n let filters = [];\n\n this.$nextTick(() => {\n // if has filter params, dump them into filters array\n paramsArray.forEach((item) => {\n let name = document.querySelector(`[value=\"${item}\"]`) ? document.querySelector(`[value=\"${item}\"]`).getAttribute('name') : null;\n \n filters.push({\n value: `${item}`,\n name: name\n });\n });\n this.data.filters = filters;\n });\n \n }\n },\n didYouMean(e) {\n //console.log('didYouMean(',e,')');\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n //console.log('query = ', query, 'e = ', e, e.target);\n this.data.inputQuery = query;\n this.submit();\n },\n updateHistory(q) {\n let currentParam = \"?q=\" + getUrlParameter('q');\n let newUrl = window.location.href.replace(currentParam, \"?q=\"+encodeURIComponent(q));\n history.pushState(null, '', newUrl);\n },\n navHistory() {\n let query = getUrlParameter('q');\n let filters = getUrlParameter('filters');\n let didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n if (query) {\n this.data.inputQuery = query.replace(/\\+/g, \" \");\n this.data.query = query.replace(/\\+/g, \" \");\n }\n\n if (filters) {\n this.prefilter();\n } else {\n this.getResults();\n }\n\n\n },\n init() {\n // init is mobile\n this.data.isMobile = store.state.isMobile;\n // init saved docs\n let allSaved = [];\n let saved = store.state.favorites;\n\n for (let prop in saved) {\n allSaved = [...allSaved, ...saved[prop]];\n }\n\n this.data.savedDocs = allSaved.filter((item) => {\n return item !== \"\"\n });\n\n // init filters state\n this.data.filtersVisible = this.data.isMobile ? false : true; //init \n if (window.location.search) {\n let query = getUrlParameter('q');\n let filters = getUrlParameter('filters');\n this.data.inputQuery = query.replace(/\\+/g, \" \");\n this.data.query = query.replace(/\\+/g, \" \");\n // make api call for results if no filters\n // otherwise data.filters[] will update and the watcher will trigger \n // another api call\n if (query && !filters) {\n this.getResults();\n }\n }\n\n window.onpopstate = () => {\n this.navHistory();\n }\n \n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n\n this.initSubmit();\n\n\n },\n initSubmit() {\n let self = this;\n if (this.data.isMobile) {\n this.$refs.searchBarMobile.addEventListener(\"keyup\", function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n self.submit();\n }\n });\n } else {\n this.$refs.searchBarDesktop.addEventListener(\"keyup\", function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n self.submit();\n }\n });\n }\n }\n },\n mounted() {\n this.init();\n if (window.location.search) {\n this.prefilter();\n }\n if (this.$refs && this.$refs.aiSearchDesc) {\n this.data.aiSearchDescHeight = this.$refs.aiSearchDesc.offsetHeight;\n }\n },\n updated() {\n var self = this;\n setTimeout(function() {\n if (self.$refs && self.$refs.aiSearchDesc) {\n let oldheight = self.data.aiSearchDescHeight;\n self.data.aiSearchDescHeight = self.$refs.aiSearchDesc.offsetHeight;\n \n if (oldheight != self.data.aiSearchDescHeight)\n self.data.rerenderShowMore++;\n }\n }, 1000);\n }\n });\n\n Vue.component('checkbox-item', {\n props: ['data', 'name', 'type'],\n data: function() {\n return {\n id: null,\n isChecked: false,\n isActive: null,\n count: 0,\n label: null\n }\n },\n watch: {\n \"data.filters\": function() {\n this.checkState();\n },\n \"data.counts\": function() {\n this.setCount();\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"search\",\n \"category\": \"Search\",\n \"action\": \"Filters\",\n \"label\": this.label,\n \"resultCount\": this.count ? this.count : \"\"\n })\n }\n },\n methods: {\n updateFilters(el, e, type) {\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n if (this.id == \"Saved%20documents%20only\") {\n let item = this.data.filters.find(el => {\n return encodeURIComponent(el.name) == this.id;\n });\n this.isChecked = item ? true : false;\n } else {\n let item = this.data.filters.find(el => {\n return encodeURIComponent(el.value) == this.id;\n });\n this.isChecked = item ? true : false;\n }\n },\n setCount() {\n //console.log(\"set count\")\n let paramName = this.$refs.input.value;\n let countObj = this.data.counts.filter((item) => {\n return item.filterValue.toString() === paramName;\n })[0];\n this.count = countObj ? countObj.count : 0;\n },\n init() {\n this.label = this.$refs.label.innerText;\n }\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n this.checkState();\n this.init();\n // this.setCount();\n }\n });\n \n // AI Search\n // Vue.component('ai-desc', {\n // props: ['data'],\n // data: function() {\n // return {\n // }\n // },\n // template: `\n //

    \n // `,\n \n // updated() {\n // this.data.aiSearchDescHeight = this.$refs.aiSearchDesc.offsetHeight;\n // console.log(\"this.data = \",this.data);\n // console.log('-------------> offsetHeight = ', this.data.aiSearchDescHeight);\n // }\n // });\n \n Vue.component('ai-disclaimer', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    {{data.ai_disclaimer}}
    \n `\n });\n Vue.component('ai-related-questions', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    {{item}}
    \n
    \n
    \n `,\n methods: {\n searchRelatedQuestion(e) {\n this.data.inputQuery = e.currentTarget.innerText;\n this.$parent.submit();\n }\n }\n });\n Vue.component('ai-sources', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n
    \n

    \n {{item.source_title}} [{{index + 1}}]\n

    \n
    \n
    \n \n
    \n
    \n `,\n methods: {\n imageRedirect(e) {\n window.open(e);\n }\n }\n });\n Vue.component('ai-sources-desktop', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n
    \n

    \n {{item.source_title}} [{{index + 1}}]\n

    \n
    \n
    \n \n
    \n
    \n `,\n methods: {\n imageRedirect(e) {\n window.open(e);\n }\n }\n });\n \n // results list\n Vue.component('results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('results-item', {\n props: ['data', 'content', 'isLoading'],\n data: function() {\n return {\n resultType: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null\n }\n },\n watch: {\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n } \n },\n computed: {\n \"highlightedCopy\": function() {\n let regex = new RegExp(this.data.query, \"gi\")\n if (this.content.description) {\n let replaceText = this.data.query;\n const patternMatch = this.content.description.match(regex);\n if (patternMatch !== null && patternMatch.length > 0) { replaceText = patternMatch[0]}\n\n return this.content.description.replace(regex,`${replaceText}`);\n }\n },\n \"highlightedTitle\": function() {\n let regex = new RegExp(this.data.query, \"gi\")\n if (this.content.title) {\n //console.log(\"TEST TEST\", this.content.title);\n let replaceText = this.data.query;\n const patternMatch = this.content.title.match(regex);\n if (patternMatch !== null && patternMatch.length > 0) { replaceText = patternMatch[0]}\n\n return this.content.title.replace(regex,`${replaceText}`);\n }\n\n return this.content.title; // fallback, default to just title\n }, \n \"newTabLink\": function() {\n return this.content.linkUrl ? this.content.linkUrl.replace('download=true', 'download=false') : null;\n },\n \"hrefTarget\": function() {\n if (this.newTabLink) {\n return this.newTabLink.includes('download=false') ? '_blank' : '_self';\n }\n },\n \"trigger\": function() {\n let trackable;\n // for (let prop in window.searchFilterValues) {\n // if (window.searchFilterValues[prop] == this.content.filterValue) {\n // trackable = true;\n // }\n // }\n return trackable ? \"click\" : null;\n },\n \"taggingMeta\": function() {\n let meta; \n // if (this.resultType) {\n // switch (this.resultType) {\n // case 'documentation':\n // meta = {\n // \"type\": \"document\",\n // \"category\": \"\",\n // \"label\": \"\",\n // \"productLine\": \"\",\n // \"language\": \"\"\n // }\n // break;\n // case 'software':\n // meta = {\n // \"type\": \"app\",\n // \"category\": \"\",\n // \"label\": \"\",\n // \"productLine\": \"\",\n // \"language\": \"\"\n // }\n // break;\n // case 'products':\n // meta = { \n // \"type\": \"layer\",\n // \"category\": \"Preview Card\",\n // \"productLine\": \"\",\n // \"label\": this.content.rawTitle\n // }\n // break;\n // default:\n // return;\n // }\n // }\n \n return meta ? JSON.stringify(meta) : null;\n }\n },\n template: `\n
    \n \n \n \n
    \n `,\n methods: {\n init() {\n for (let prop in window.searchFilterValues) {\n if (window.searchFilterValues[prop] == this.content.filterValue) {\n this.resultType = prop;\n }\n }\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n // this.init();\n this.initSeeAll();\n\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n //console.log(\"--> Tracking response: \", response);\n })\n ));\n }\n });\n\n }\n });\n\n Vue.component('selectedFilters', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n {{filter.name}}\n
    \n
    \n
    \n `,\n methods: {\n removeFilter(e) {\n let type = e.currentTarget.dataset.type;\n let value = e.currentTarget.dataset.value;\n // console.log(e.currentTarget);\n EventBus.$emit('remove-filter', this.data.class, value, type);\n }\n },\n mounted() {\n \n }\n });\n\n Vue.component('filter-accordion-template', {\n props: ['data', 'defaultopen'],\n data: function() {\n return {\n isOpen: (this.defaultopen ? true : false), //is the accordion open\n seeAllTypesText: false\n }\n },\n computed: {\n productFilters: function() {\n return this.data.products;\n }\n },\n watch: {\n },\n methods: {\n handleClick() {\n this.toggleAccordion();\n },\n\n toggleAccordion() {\n let contentArea = this.$refs.outerContainer;\n let contentHeight = this.$refs.innerContainer.getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n toggleSeeAll() {\n this.seeAllTypesText = !this.seeAllTypesText\n },\n },\n mounted() {\n \n }\n });\n\n new Vue({\n el: `.search-results-${id}`,\n store: store\n }).$mount(`.search-results-${id}`, true);\n }\n\n if (search.length > 0) {\n search.forEach((item, index) => {\n item.classList.add(`search-results-${index}`);\n searchResultsConstructor(index);\n })\n }\n\n // window.searchFilterValues = {\n // documentation: 157,\n // software: 59,\n // products: 158\n // }\n\n}\n\nexport default searchResults;\n","import Vue from 'vue/dist/vue.min.js';\r\nimport VModal from 'vue-js-modal';\r\nimport { videoModal } from './modals';\r\n\r\n\r\n\r\nconst Slideshow = () => {\r\n const slideshowEl = document.getElementById('slideshow-slider')\r\n if (!slideshowEl) return;\r\n const slidesEl = slideshowEl.querySelectorAll('.slider-slides .slide');\r\n\r\n const SlideshowConstructor = () => {\r\n let activeSlide = 1;\r\n const arrowL = slideshowEl.querySelector('.slider-controls .arrow.L');\r\n const arrowR = slideshowEl.querySelector('.slider-controls .arrow.R');\r\n const pausePlay = slideshowEl.querySelector('.slider-controls .circular-progress');\r\n const totalSlides = slidesEl.length;\r\n const slidesVideos = slideshowEl.querySelectorAll('video');\r\n const modalTriggers = document.querySelectorAll('.video-player-link button')\r\n\r\n const circle = slideshowEl.querySelector('.slider-controls circle.fg');\r\n const circleSize = 30; // this is the width and height of svg (should be a square that fits the circle)\r\n const strokeW = 2\r\n const radius = (circleSize - strokeW) / 2\r\n const circumference = radius * Math.PI * 2;\r\n\r\n const maxTime = 10000; // in miliseconds\r\n const timesPerSec = 100\r\n \r\n let sliderInterval = null\r\n let timeElapsed = 0\r\n let isAutoPlaying = true;\r\n let playingBeforModal = true;\r\n let resizeTimeout = null;\r\n let lastScreenW = 0;\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// update mobile/desktop video background if any\r\n const responsiveVideoUpdate = function () {\r\n if (slidesVideos.length > 0 && window.innerWidth != lastScreenW) \r\n {\r\n lastScreenW = window.innerWidth // used to make sure only width is changing. mobile devices ad a menu that makes the window smaller vertically\r\n if (window.innerWidth <= 900) \r\n {\r\n for (let i = 0; i < slidesVideos.length; i++) \r\n {\r\n const vid = slidesVideos[i];\r\n const url = vid.dataset.mob;\r\n if (url != \"none\") { vid.src = url }\r\n }\r\n }\r\n else \r\n {\r\n for (let i = 0; i < slidesVideos.length; i++) \r\n {\r\n const vid = slidesVideos[i];\r\n const url = vid.dataset.desk;\r\n vid.src = url;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// stop videos\r\n const playAllVids = function (willPlay) {\r\n let vids = document.querySelectorAll('video')\r\n\r\n if (willPlay) {\r\n for (let i = 0; i < vids.length; i++) { vids[i].play(); }\r\n }\r\n else {\r\n for (let i = 0; i < vids.length; i++) { vids[i].pause(); }\r\n }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// video controls for when popup opens/closes\r\n if (slidesVideos.length > 0 && modalTriggers.length > 0) {\r\n // modal trigger buttons in slideshow stop all videos\r\n for (let i = 0; i < modalTriggers.length; i++) {\r\n modalTriggers[i].addEventListener(\"click\", function (e) {\r\n playAllVids(false);\r\n isAutoPlaying = false\r\n toggleInterval(isAutoPlaying)\r\n });\r\n }\r\n /* not needed because the observer sees when modal disapears instead of when close button is pressed */\r\n // the modal buttons should start the videos again. but modal is created dynamically so we need this:\r\n // document.addEventListener(\"click\", function(e){\r\n // const closeButton = e.target.closest(\".bmi-modal__close\"); \r\n // const modalWindow = e.target.closest(\".vm--overlay\"); \r\n // if(modalWindow || closeButton)\r\n // {playAllVids(true);}\r\n // });\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// modal observer\r\n const observerConfig = { subtree: true, attributes: true, childList: true }\r\n const observer = new MutationObserver(function (mutationList) {\r\n const watchedTarget = document.querySelector('#modals-container .vm--container')\r\n for (const mutation of mutationList) {\r\n if (mutation.type === 'childList') {\r\n if (watchedTarget == null) {\r\n playAllVids(true);\r\n if (playingBeforModal == true) {\r\n isAutoPlaying = true;\r\n clearInterval(sliderInterval); // must be cleared before toggle... or multiple intervals will be added.\r\n toggleInterval(true)\r\n }\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(document.body, observerConfig);\r\n\r\n }\r\n\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// show percent progress\r\n const updateProgress = () => {\r\n timeElapsed += timesPerSec;\r\n const progress = timeElapsed / maxTime;\r\n const dash = progress * circumference\r\n circle.setAttribute(\"stroke-dasharray\", `${dash} ${circumference - dash}`);\r\n\r\n if (progress >= 1) { showSlide(1) }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// toggle interval\r\n const toggleInterval = function (isOn) {\r\n if (isOn === true) {\r\n sliderInterval = window.setInterval(function () { updateProgress() }, timesPerSec);\r\n }\r\n else { clearInterval(sliderInterval) }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// called on arrow click and with auto play\r\n const showSlide = function (direction) {\r\n timeElapsed = 0\r\n activeSlide += direction\r\n\r\n if (activeSlide > totalSlides) { activeSlide = 1 }\r\n if (activeSlide < 1) { activeSlide = totalSlides }\r\n\r\n slideshowEl.querySelector('.slide.active-slide').classList.remove('active-slide')\r\n slideshowEl.querySelector(`.slide:nth-child(${activeSlide})`).classList.add('active-slide')\r\n }\r\n //////////////////////////////////////////////////////////////////////////////////////////////// arrows\r\n arrowL.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n showSlide(-1);\r\n });\r\n arrowR.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n showSlide(1)\r\n });\r\n pausePlay.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n pausePlay.classList.toggle('playing')\r\n isAutoPlaying = !isAutoPlaying\r\n toggleInterval(isAutoPlaying);\r\n\r\n playingBeforModal = isAutoPlaying; // used when closing modal\r\n });\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// start interval as soon as script loads\r\n toggleInterval(true)\r\n //////////////////////////////////////////////////////////////////////////////////////////////// update mobile videos if there are any\r\n responsiveVideoUpdate();\r\n window.onresize = function () \r\n {\r\n clearTimeout(resizeTimeout);\r\n resizeTimeout = setTimeout(responsiveVideoUpdate, 1000); // add short delay so that video is only updated when user stops resizing; \r\n };\r\n }\r\n\r\n\r\n if (slideshowEl) {\r\n // if there is more than one slide start slideshow auto play and its timer\r\n if (slidesEl.length > 1) { SlideshowConstructor(); }\r\n // if there is only one dont start the timer and hide the controls for moving/p\r\n else { slideshowEl.querySelector('.slider-controls').classList.add('hide'); }\r\n }\r\n}\r\n\r\nexport default Slideshow;\r\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport VModal from 'vue-js-modal';\nimport { releaseNotesModal } from \"./modals\";\n\nconst softwareCard = () => {\n Vue.use(VModal);\n let software = document.querySelectorAll('.softward-card--nofilter');\n\n let softwareCardConstructor = (id) => {\n Vue.component('software-card-single', {\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleModal() { \n let releaseNotes = this.$refs.releaseNotes.innerHTML;\n this.$modal.show(\n releaseNotesModal.template(releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n },\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = \"softwareId\";\n \n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n new Vue({\n el: `.software-card--nofilter-${id}`,\n }).$mount(`.software-card--nofilter-${id}`, true);\n }\n\n if (software.length > 0) {\n software.forEach((item, index) => {\n item.classList.add(`software-card--nofilter-${index}`);\n softwareCardConstructor(index);\n })\n }\n\n}\n\nexport default softwareCard;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport VModal from 'vue-js-modal';\nimport {releaseNotesModal} from './modals';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Software = () => {\n\n let software = document.querySelectorAll('.software');\n Vue.use(VModal);\n\n const softwareConstructor = (id) => {\n Vue.component('software-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n savedDocsOnly: null, //is saved docs only checked\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n // store: store\n query: null,\n releaseNotesLabel: null,\n class: 'software',\n trackingType: 'app'\n },\n isLoading: null\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.softwareId[0] == \"\" ? store.state.favorites.softwareId.slice(1) : store.state.favorites.softwareId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n siteLang: function() {\n return store.state.currentLang;\n }\n\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDownloads');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.addLoading();\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n\n // check for if productline is selected\n let productLines = this.data.filters.filter(el => {\n return el.type == \"productline\";\n }).map(el => {\n return el.value;\n });\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedSoftware\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n\n if (productLines.length > 0) {\n this.populateProducts(productLines); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n },\n \"data.currentPage\": function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;//reset page to 1 when new filters added/removed\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedSoftware\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {\n return;\n }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(productLines) {\n let productLineStr = decodeURIComponent(productLines.join('|'));\n // console.log(brandStr);\n let baseUrl = window.softwareAPIUrl;\n let apiUrl = `/api/GetSoftwareProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: productLineStr,\n lang: this.siteLang \n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n \n didYouMean(e) {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n //console.log('didYouMean',e);\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n //console.log('query = ',query, 'e = ', e, e.target);\n this.data.query = query;\n //this.updateHistory();\n document.querySelector('.hero-center__search-input').value = query;\n this.addLoading();\n this.getResults();\n },\n\n getResults(query) {\n\n // let apiUrl = \"api/documents?\";\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n // this.getUrl();\n let baseUrl = window.softwareAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/software\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedSoftware\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var productLine = [];\n var downloadType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"productline\":\n productLine.push(item.value);\n break;\n case \"downloadType\":\n downloadType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let productLineStr = decodeURIComponent(productLine.join('|'));\n let downloadTypeStr = decodeURIComponent(downloadType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: this.data.savedDocs.join('|') == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n productLine: productLineStr == \"\" ? null : productLineStr,\n downloadType: downloadTypeStr == \"\" ? null : downloadTypeStr,\n savedSoftware: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n lang: this.siteLang ? this.siteLang : window.currentCulture\n }\n\n // console.log(axiosParams);\n var searchTerm = this.data.query;\n\n axios.get(apiUrl,{\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n }\n else {\n\n didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n }\n\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=\"#\";\n anchorElement.innerText = dym;\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(anchorElement.innerText);\n });\n allElements.push(anchorElement);\n });\n\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n //console.log(' --> Appending to ', didyoumeanEl);\n \n for (let i = 0; i el.append(allElements[i]));\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n commaEl.style.paddingLeft = \"7px\";\n \n didyoumeanEl.forEach(el => el.append(commaEl));\n }\n } \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && \n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"software\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n self.data.trackId = response.data.trackId;\n \n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.addLoading();\n this.getResults();\n },\n \n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.software__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n inputField.classList.add('loading');\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n inputField.classList.remove('loading');\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.softwareId[0] == \"\" ? store.state.favorites.softwareId.slice(1) : store.state.favorites.softwareId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.addLoading();\n this.getResults();\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"software\") {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n this.addLoading();\n\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n // init results\n this.data.results = window.initialSoftwareApiResults.results;\n this.data.totalResults = window.initialSoftwareApiResults.totalResults;\n this.data.shownResults = window.initialSoftwareApiResults.results.length;\n this.data.releaseNotesLabel = window.initialSoftwareApiResults.releaseNotesLabel;\n\n // this.data.results = fpodb.software.results;\n // this.data.totalResults = fpodb.software.totalResults;\n // this.data.shownResults = fpodb.software.results.length;\n // this.data.releaseNotesLabel = fpodb.software.releaseNotesLabel;\n\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n\n Vue.component('software-products', {\n props: ['data', 'category'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('software-results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n type: \"software\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('software-results-item', {\n props: ['data', 'content', 'isLoading'],\n data: function() {\n return {\n // isChecked: false,\n isBookmarked: false,\n id: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.softwareId;\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"app\", \n \"category\": this.content.downloadType, \n \"label\": this.content.name, \n \"productLine\": this.content.eyebrow, \n \"language\": this.content.languages.toString()\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"content\": function() {\n this.$nextTick(() => {\n // console.log(this.$refs.bookmark.dataset.softwareId);\n this.id = this.$refs.bookmark.dataset.softwareId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n console.log('software-results-item - watch() content -> this', this);\n })\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n
    \n {{content.name}}\n
    \n \n {{content.details}} | {{data.releaseNotesLabel}} {{content.releaseNotes}}\n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n `,\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"softwareId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n // initReleaseNotes() {\n // this.$refs.details.addEventListener('click', (e) => {\n // e.preventDefault();\n // this.triggerModal();\n // });\n // },\n triggerModal() {\n this.$modal.show(\n releaseNotesModal.template(this.content.releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n // this.initReleaseNotes();\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n //console.log(\"--> Tracking response: \", response);\n })\n ));\n }\n });\n\n }\n });\n\n new Vue({\n el: `.software-${id}`,\n store: store\n }).$mount(`.software-${id}`, true);\n }\n\n if (software.length > 0) {\n software.forEach((item, index) => {\n item.classList.add(`software-${index}`);\n softwareConstructor(index);\n })\n }\n\n}\n\nexport default Software;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\n\n// const SpecTable = () => {\n\n // const tables = document.querySelectorAll('.spec-table');\n\n // const specTableConstructor = (id) => {\n const specsTableTemplate = () => {\n Vue.component('spec-table-template', {\n props: ['selectedItem'],\n data: function() {\n return {\n selectedUnit: store.state.units,\n usLabel: '',\n metricLabel: '',\n labelText: '',\n store: store,\n switchToText: '',\n loadMore: true,\n isOpen: null\n }\n },\n computed: {\n computedUnit: function() {\n return store.state.units;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"View all\",\n \"action\": \"Specifications\",\n \"label\": this.selectedItem ? this.selectedItem : \"\"\n })\n }\n },\n watch: {\n computedUnit: function() {\n this.selectedUnit = this.computedUnit;\n this.setLabels();\n }\n },\n methods: {\n toggleUnits() {\n store.commit('setUnits');\n },\n \n setLabels() {\n this.labelText = this.selectedUnit == 'us' ? this.usLabel : this.metricLabel;\n this.switchToText = this.selectedUnit == 'us' ? this.metricLabel : this.usLabel;\n },\n \n handleViewAll() {\n this.$refs.loadMore.viewAll();\n },\n },\n mounted() {\n // get labels from mark up to accomodate multi lang\n this.usLabel = this.$refs.unitToggler.dataset.usLabel;\n this.metricLabel = this.$refs.unitToggler.dataset.metricLabel;\n this.setLabels();\n EventBus.$on('toggleOpen', (state) => {\n this.isOpen = state;\n });\n\n }\n });\n }\n\n const specTableLoadMore = () => {\n Vue.component('specifications-load-more', {\n props: ['labelText', 'switchToText', 'selectedUnit', 'isOpen'],\n data: function() {\n return {\n innerHeight: null,\n // isOpen: false\n }\n },\n methods: {\n viewAll() {\n let contentArea = this.$refs.allContainer;\n let contentHeight = this.innerHeight;\n \n if (this.isOpen == true) {\n // this.isOpen = false;\n EventBus.$emit('toggleOpen', false);\n \n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n \n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n \n } else {\n // this.isOpen = true;\n EventBus.$emit('toggleOpen', true);\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n }\n },\n mounted() {\n this.innerHeight = this.$refs.allInner.getBoundingClientRect().height;\n }\n });\n }\n \n\n // new Vue({\n // el: `.spec-table-${id}`,\n // store: store,\n // }).$mount(`.spec-table-${id}`, true);\n // }\n \n // if (tables.length > 0) {\n // tables.forEach((item, index) => {\n // item.classList.add(`spec-table-${index}`);\n // specTableConstructor(index);\n // })\n // }\n\n// }\n\n// export default SpecTable;\n\nexport {specsTableTemplate, specTableLoadMore}; ","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport {specsTableTemplate, specTableLoadMore} from './spec-table';\n\nconst Specifications = () => {\n\n const specs = document.querySelectorAll('.specs .page-section__wrapper');\n\n let specsConstructor = (id) => {\n Vue.component('specifications-template', {\n data: function() {\n return {\n selectedItem: null,\n selectedId: null,\n selectedUrl: null\n }\n },\n computed: {\n tagMetaSelect: function() {\n return JSON.stringify({\n \"type\": \"document\",\n \"category\": \"Product Data Sheets\",\n \"action\": \"Download\",\n \"label\": this.selectedItem,\n \"documentId\": this.selectedId\n })\n } \n },\n methods: {\n selectItem(e) {\n let select = this.$refs.dropdown;\n let text = select.options[select.selectedIndex].text;\n let Id = select.options[select.selectedIndex].dataset.id;\n this.selectedItem = text;\n this.selectedId = Id;\n if (e) {\n this.selectedUrl = e.target.value;\n } else {\n this.selectedUrl = select.options[select.selectedIndex].value;\n }\n \n },\n submit(e) {\n // console.log(e.target);\n window.open(this.selectedUrl, '_blank');\n }\n },\n mounted() {\n this.selectItem();\n }\n });\n\n\n new Vue({\n el: `.specs-${id}`,\n store: store,\n }).$mount(`.specs-${id}`, true);\n }\n\n specsTableTemplate();\n specTableLoadMore();\n\n if (specs.length > 0) {\n specs.forEach((item, index) => {\n item.classList.add(`specs-${index}`);\n specsConstructor(index);\n })\n }\n\n}\n\nexport default Specifications;","/*\n #StorageManager\n This component provides an interface to control and store the information with different kinds of storage. By default use SessionStorageManager (SessionStorage).\n\n # get:\n This method is for reading a value stored\n\n # set:\n This method is to store a value\n\n # remove:\n This method is to remove a value stored\n\n # addTimes:\n This method is to add a number to a integer value stored\n\n # subTimes:\n This method is to subtract a number to a integer value stored\n*/\n\nconst StorageManager = manager => {\n const instance = {\n get: function(key) {\n return instance._manager._get(key);\n },\n\n set: function(key, value) {\n return instance._manager._set(key, value);\n },\n\n remove: function(key) {\n return instance._manager._remove(key);\n },\n\n addTimes: function(key, num) {\n const add = parseInt(num || 1);\n return instance._manager._add(key, add);\n },\n\n subTimes: function(key, num) {\n const sub = parseInt(num || 1);\n return instance._manager._sub(key, sub);\n }\n };\n\n instance._manager = manager || SessionStorageManager;\n\n return instance;\n};\n\nexport const SessionStorageManager = {\n _get: function(key) {\n return sessionStorage.getItem(key);\n },\n\n _set: function(key, value) {\n return sessionStorage.setItem(key, value);\n },\n\n _remove: function(key) {\n return sessionStorage.removeItem(key);\n },\n\n _add: function(key, num) {\n const current = parseInt(SessionStorageManager._get(key) || 0);\n SessionStorageManager._set(key, current + num);\n },\n\n _sub: function(key, num) {\n SessionStorageManager._add(key, num * -1);\n }\n};\n\nexport const LocalStorageManager = {\n _get: function(key) {\n return localStorage.getItem(key);\n },\n\n _set: function(key, value) {\n return localStorage.setItem(key, value);\n },\n\n _remove: function(key) {\n return localStorage.removeItem(key);\n },\n\n _add: function(key, num) {\n const current = parseInt(LocalStorageManager._get(key) || 0);\n LocalStorageManager._set(key, current + num);\n },\n\n _sub: function(key, num) {\n LocalStorageManager._add(key, num * -1);\n }\n};\n\nexport default StorageManager;\n","import Vue from 'vue/dist/vue.min.js';\nimport Vuex from 'vuex';\nimport axios from 'axios';\nimport {getCookieValue} from './misc.js';\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n state: {\n pageTitle: '',\n isMobile: null, //is viewport < 835px\n isSmallMobile: null, //is viewport < 650px\n isMdDesktop: null, //is viewport < 1024px\n pageAnchors: [],\n showInlineAnchors: false,\n units: null,\n menuKeys: [],\n favorites: { //NOTE: all ids stored as strings\n documentId: [],\n softwareId: [],\n articleId: [],\n productId: [],\n legalDocumentId: []\n },\n currentLang: null,\n litOrderCart: [],\n GAID: null \n },\n\n mutations: {\n updateTitle(state, title) {\n state.pageTitle = title;\n },\n setMobileState(state, mobileState) {\n state.isMobile = mobileState;\n },\n setSmallMobileState(state, mobileState) {\n state.isSmallMobile = mobileState;\n },\n setMdDesktopState(state, mobileState) {\n state.isMdDesktop = mobileState;\n },\n setPageAnchors(state, anchors) {\n state.pageAnchors = anchors;\n },\n setAnchorDropdownVis(state, anchorState) {\n state.showInlineAnchors = anchorState;\n },\n setUnits(state, units) {\n if (units) {\n state.units = units;\n } else {\n state.units = \n state.units == 'us' ? 'metric'\n : state.units == 'metric' ? 'us'\n : null;\n }\n },\n updateMenu(state, obj) {\n state.menuKeys.push(obj);\n },\n updateFavorites(state, data) {\n // add/remove items from stores favorites\n if (data.action == \"add\") {\n // console.log(\"add\");\n state.favorites[data.type].push(data.id);\n } else if (data.action == \"remove\") {\n // console.log(\"remove\");\n\n if (state.favorites[data.type].includes(data.id)) {\n state.favorites[data.type].splice(state.favorites[data.type].indexOf(data.id), 1);\n }\n } else {\n return;\n }\n },\n initFavorites(state, data) {\n state.favorites[data.type] = data.arr;\n },\n sanitizeFavorites(state, results) {\n // sanitisze favorites based on valid favs returned from api\n state.favorites.documentId = results.documentIds.map(i => `${i}`);\n state.favorites.softwareId = results.softwareIds.map(i => `${i}`);\n state.favorites.articleId = results.articleIds.map(i => `${i}`);\n state.favorites.productId = results.productIds.map(i => `${i}`);\n state.favorites.legalDocumentId = results.legalDocumentIds.map(i => `${i}`);\n },\n setCurrentLang(state, lang) {\n state.currentLang = lang;\n },\n updateLitOrderCart(state, data) {\n state.litOrderCart = data;\n },\n setGAID(state, id) {\n state.GAID = id;\n }\n },\n actions: {\n checkMobile(context) {\n var mqlMd = window.matchMedia('(max-width: 835px)');\n var mqlSm = window.matchMedia('(max-width: 650px)');\n var mqlMdDesktop = window.matchMedia('(max-width: 1024px)');\n\n // console.log(mqlMd.matches);\n var isMobile = mqlMd.matches ? true : false;\n context.commit('setMobileState', isMobile);\n\n mqlMd.addEventListener('change',() => {\n isMobile = mqlMd.matches ? true : false;\n context.commit('setMobileState', isMobile);\n });\n\n var isSmallMobile = mqlSm.matches ? true : false;\n context.commit('setSmallMobileState', isSmallMobile);\n\n mqlSm.addEventListener('change',() => {\n isSmallMobile = mqlSm.matches ? true : false;\n context.commit('setSmallMobileState', isSmallMobile);\n });\n\n var isMdDesktop = mqlMdDesktop.matches ? true : false;\n context.commit('setMdDesktopState', isMdDesktop);\n\n mqlMdDesktop.addEventListener('change',() => {\n isMdDesktop = mqlMdDesktop.matches ? true : false;\n context.commit('setMdDesktopState', isMdDesktop);\n });\n },\n initCookies(context) {\n // check for current cookies\n context.commit('initFavorites', {\"type\":'documentId', arr: getCookieValue('documentIds').split(',')} );\n context.commit('initFavorites', {\"type\":'softwareId', arr: getCookieValue('softwareIds').split(',')} );\n context.commit('initFavorites', {\"type\":'articleId', arr: getCookieValue('articleIds').split(',')} );\n context.commit('initFavorites', {\"type\":'productId', arr: getCookieValue('productIds').split(',')} );\n context.commit('initFavorites', {\"type\":'legalDocumentId', arr: getCookieValue('legalDocumentIds').split(',')} );\n\n // console.log(context.state.favorites);\n\n context.dispatch('checkFavorites');\n },\n cookieFavorites(context) {\n // cookie current saved items in store\n let docStr = context.state.favorites.documentId.toString();\n let softwareStr = context.state.favorites.softwareId.toString();\n let articleStr = context.state.favorites.articleId.toString();\n let productStr = context.state.favorites.productId.toString();\n let legalDocStr = context.state.favorites.legalDocumentId.toString();\n document.cookie = `documentIds=${docStr}; max-age=1209600; path=/`;\n document.cookie = `softwareIds=${softwareStr}; max-age=1209600; path=/`;\n document.cookie = `articleIds=${articleStr}; max-age=1209600; path=/`;\n document.cookie = `productIds=${productStr}; max-age=1209600; path=/`;\n document.cookie = `legalDocumentIds=${legalDocStr}; max-age=1209600; path=/`;\n },\n checkFavorites(context) {\n // validate cookies with api\n let docStr = context.state.favorites.documentId.toString();\n let softwareStr = context.state.favorites.softwareId.toString();\n let articleStr = context.state.favorites.articleId.toString();\n let productStr = context.state.favorites.productId.toString();\n let legalDocStr = context.state.favorites.legalDocumentId.toString();\n\n let axiosParams = {\n documentId: docStr == \"\" ? null : docStr.charAt(0) == \",\" ? docStr.slice(1) : docStr,\n softwareId: softwareStr == \"\" ? null : softwareStr.charAt(0) == \",\" ? softwareStr.slice(1) : softwareStr,\n articleId: articleStr == \"\" ? null : articleStr.charAt(0) == \",\" ? articleStr.slice(1) : articleStr,\n productId: productStr == \"\" ? null : productStr.charAt(0) == \",\" ? productStr.slice(1) : productStr,\n legalDocumentId: legalDocStr == \"\" ? null : legalDocStr.charAt(0) == \",\" ? legalDocStr.slice(1) : legalDocStr\n }\n // console.log(axiosParams);\n\n // const apiUrl = getApiUrl();\n const apiUrl = `/api/validateids?`;\n // console.log(apiUrl);\n // let TESTURL = \"http://localhost:3003/validateIds\";\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n store.commit('sanitizeFavorites', response.data.results);\n store.dispatch('cookieFavorites');\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n initUnits(context) {\n let lang = document.querySelector('.top-bar__subnav-link.active') ? document.querySelector('.top-bar__subnav-link.active').dataset.lang : null;\n // console.log(\"LANG\", lang)\n store.commit('setCurrentLang', lang);\n if (lang !== \"en-us\") {\n store.commit('setUnits', 'metric');\n } else {\n store.commit('setUnits', 'us');\n }\n },\n initGAID(context) {\n let id = getCookieValue('_ga') == '' ? null : getCookieValue('_ga') ;\n store.commit('setGAID', id);\n // console.log(id);\n }\n }\n});\n\nexport default store;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus'\n\nconst Subnav = () => {\n const subnavDom = document.querySelectorAll('.sub-nav'); \n \n let subnavConstructor = (id) => {\n Vue.component('subnav-template', {\n data: function() {\n return {\n isMobile: store.state.isMobile,\n anchors: store.state.pageAnchors,\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n // computedShowAnchors: function() {\n // return store.state.showInlineAnchors;\n // }\n },\n watch: {\n computedIsMobile() {\n this.isMobile = this.computedIsMobile;\n },\n // computedShowAnchors() {\n // this.showAnchors = this.computedShowAnchors;\n // }\n },\n methods: {\n \n },\n mounted() {\n \n }\n });\n\n Vue.component('subnav-desktop', {\n props: ['isMobile'],\n data: function() {\n return {\n\n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n\n Vue.component('subnavDropdown', {\n props: ['anchors'],\n data: function() {\n return {\n\n }\n },\n template: `\n \n `,\n methods: {\n jump(e) {\n window.location.hash = `#${e.target.value}`;\n //console.log(e.target.value);\n }\n },\n mounted() {\n \n }\n });\n\n Vue.component('anchor-dropdown-item', {\n props: ['data'],\n data: function() {\n return {\n\n }\n },\n template: `\n \n `,\n methods: {\n\n },\n mounted() {\n \n }\n });\n\n new Vue({\n el: `.subnav-${id}`,\n }).$mount(`.subnav-${id}`, true);\n }\n\n if (subnavDom.length > 0 ) {\n subnavDom.forEach((item, index) => {\n item.classList.add(`subnav-${index}`);\n subnavConstructor(index);\n })\n }\n\n}\n\nexport default Subnav;","/*\n Tabs is a decorator function to add the Vue Tabs component.\n * Arguments:\n - {Object} options\n * Usage:\n The 'options' argument is the same configuration for a Vue Component. in addition, the next options:\n\n - name [string]: name used for Tabs component in Vue. (by default is 'tabs'. Remember considering the prefix option.)\n\n * Props:\n\n - current-id-tab: sets the first the currently active tab (by default is '1').\n - active-class: is a CSS class, uses when the tab is active. this uses for passing the same value to the tab components.\n\n # The Sub-components:\n\n * tab: the tab component is the tab button, this has the next props:\n - id-tab: is the tab id that links with its content.\n - current-tab: identifies the currently active tab (is required for the tabs functionality).\n - change-tab: is the function that triggers the tab changing (is required for the tabs functionality).\n - active-class: is a CSS class, uses when the tab is active. (by default 'active')\n\n * tab-content: the tab-content component is the tab content, this has the next props:\n - id-tab: is the tab id that links with its tab button.\n - current-tab: identifies the currently active tab (is required for the tabs functionality).\n - change-tab: is the function that triggers the tab changing (is required for the tabs functionality in cascade mode).\n - tab-class: is a CSS class, uses when the tab button styles. (by default 'tab', only in cascade mode)\n - active-class: is a CSS class, uses when the tab is active. (by default is active)\n*/\nimport {\n content as contentTemplate,\n tab as tabTemplate,\n} from './template-strings/tabs-component';\n\nconst tabs = ({ name = 'tabs', props, data: dataProp, mounted, methods, components, tabProps, contentProps, tabData, tabContentData, tabOptions, tabContentOptions, ...options} = {}) => {\n return {\n name,\n props: {\n currentIdTab: [String, Number],\n activeClass: String,\n ...props\n },\n data: function() {\n const _dataProp = dataProp && dataProp();\n const data = {\n currentTab: this.currentIdTab || 1,\n ..._dataProp\n };\n\n return data;\n },\n mounted: function() {\n mounted && mounted.call(this);\n\n const tabChildren = {};\n this.$children.forEach(c => {\n const tag = c.$vnode.componentOptions.tag;\n if(!['tab', 'tab-content'].includes(tag)){\n return;\n }\n\n const id = c.idTab;\n const e = tabChildren[id];\n\n if(!e){\n tabChildren[id] = c;\n return;\n }\n\n c.setTabInstance(e);\n });\n },\n methods: {\n changeTab: function(id){\n this.currentTab = id;\n },\n ...methods\n },\n components: {\n 'tab' : {\n name: 'tab',\n template: tabTemplate,\n props: {\n idTab: [String, Number],\n activeClass: {type: String, default: 'active'},\n currentTab: [String, Number],\n changeTab: Function,\n ...tabProps\n },\n data: function() {\n return {\n ...tabData,\n }\n },\n ...tabOptions,\n methods: {\n onClick: function(){\n this.changeTab(this.idTab);\n },\n setTabInstance: function(e){\n return e.setTabDefaultSlot(this.getDefaultSlot())\n },\n getDefaultSlot: function(){\n return this.$slots.default;\n }\n },\n },\n 'tab-content' : {\n name: 'tab-content',\n template: contentTemplate,\n props: {\n idTab: [String, Number],\n currentTab: [String, Number],\n tabClass: { type: String, default: 'tab'},\n activeClass: {type: String, default: 'active'},\n changeTab: Function,\n ...contentProps\n },\n data: function() {\n let data = {\n tabSlot: undefined,\n ...tabContentData\n };\n\n return data;\n },\n ...tabContentOptions,\n beforeUpdate: function() {\n this.$slots.tab = this.tabSlot;\n },\n methods: {\n onClick: function(){\n this.changeTab(this.idTab);\n },\n setTabInstance: function(e){\n this.setTabDefaultSlot(e.getDefaultSlot())\n },\n setTabDefaultSlot: function(slot){\n this.tabSlot = slot;\n }\n },\n },\n ...components\n },\n ...options\n }\n};\n\nexport default tabs;\n","export const tabSelectMobile = `\n
    \n \n \n
    \n`;\n\nexport const productItem = `\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n

    \n \\{{data.productName}}\n

    \n
    \n \\{{data.description}}\n
    \n
    \n View product\n \n
    \n
    \n\n
    \n
    \n
    \n
    \n`;\n\nexport const documentItem = `\n
    \n
    \n
    \n
    \n \n \\{{data.eyebrow}}\n \n \n \\{{data.name}}\n \n \n \\{{data.details}}\n \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n`;\n\nexport const softwareItem = `\n
    \n
    \n
    \n
    \n \n \\{{data.eyebrow}}\n \n \n \\{{data.name}}\n \n \n \n \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n`;\n\nexport const articleItem = `\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n \\{{data.articleTitle}}\n

    \n
    \n

    \\{{data.articleDetails}}

    \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n`;","export const content = `\n\n`;\n\nexport const paginator = `\n
    \n \n
    \n`;\n","export const contentApplications = `\n
    \n \n
    \n`;\n","export const content = `\n
    \n
    \n \n
    \n \n
    \n`;\n\nexport const tab = `\n
  • \n \n
  • \n`;\n","import Vue from 'vue/dist/vue.min.js';\nimport { lory } from 'lory.js';\n\nconst testimonial = () => {\n\n let testimonialItem = document.querySelectorAll('.testimonial');\n\n let testimonialConstructor = (id) => {\n Vue.component('testimonial', {\n data: function() {\n return {\n sliderEl: null,\n options: {\n classNameFrame: 'testimonial__frame',\n enableMouseEvents: true\n },\n lory: null,\n currentSlide: 1,\n length: null\n }\n },\n computed: {\n \n },\n watch: {\n \n },\n methods: {\n initLory() {\n this.lory = lory(this.sliderEl, this.options);\n },\n initListener() {\n this.sliderEl.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex() + 1;\n });\n },\n nextSlide() {\n this.lory.next();\n },\n prevSlide() {\n this.lory.prev();\n }\n },\n mounted() {\n this.sliderEl = this.$el.querySelector('.testimonial__slider');\n this.length = this.$el.querySelectorAll('.testimonial__slide').length;\n this.initLory();\n this.initListener();\n }\n });\n\n new Vue({\n el: `.testimonial-${id}`,\n }).$mount(`.testimonial-${id}`, true);\n }\n\n if (testimonialItem.length > 0) {\n testimonialItem.forEach((item, index) => {\n item.classList.add(`testimonial-${index}`);\n testimonialConstructor(index);\n })\n }\n\n}\n\nexport default testimonial;","import Vue from 'vue/dist/vue.min.js';\nimport tippy from 'tippy.js';\nimport VModal from 'vue-js-modal';\nimport { tooltipModal } from \"./modals\";\nVue.use(VModal);\n\nconst Timeline = () => {\n\n let timelineItems = document.querySelectorAll('.timeline');\n\n let timelineConstructor = (id) => {\n Vue.component('timeline', {\n data: function() {\n return {\n isMobile: null,\n instance: null\n }\n },\n methods: {\n initIsMobile() {\n // console.log(\"calc this\", window.innerWidth);\n // note this is checking for a smaller screen size than the isMobile value in the vuex store\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n }\n },\n mounted() {\n this.initIsMobile();\n }\n });\n\n Vue.component('timeline-item', {\n props: ['isMobile'],\n data: function() {\n return {\n message: {},\n isOpen: null\n }\n },\n watch: {\n isMobile: function() {\n if (this.isMobile) {\n this.disableTooltips;\n }\n }\n },\n methods: {\n initTippy() {\n let self = this;\n\n tippy(this.$refs.tooltip, {\n allowHTML: true,\n arrow: true,\n hideOnClick: true,\n trigger: 'click',\n interactive: true,\n zIndex: 99,\n onShow(instance) {\n // console.log(\"OPENED\");\n self.isOpen = true;\n },\n onHide(instance) {\n self.isOpen = false;\n }\n })\n },\n mobileTooltip() {\n if (this.isMobile) {\n let content = `\n
    ${this.message.date}
    \n
    ${this.message.title}
    \n
    ${this.message.copy}
    \n `;\n\n this.$modal.show(\n tooltipModal.template(content),\n tooltipModal.name,\n tooltipModal.options\n )\n }\n },\n disableTooltips() {\n let target = this.$refs.tooltip;\n let instance = target._tippy;\n instance.disable(); //@TODO: figure out why disable method isn't working\n },\n initMessageData() {\n this.message.copy = this.$refs.tooltip.getAttribute('data-tippy-content');\n this.message.title = this.$refs.desc.innerText;\n this.message.date = this.$refs.date.innerText;\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.initTippy();\n if (this.isMobile) {\n this.disableTooltips();\n } \n });\n this.initMessageData();\n }\n })\n\n new Vue({\n el: `.timeline-${id}`,\n }).$mount(`.timeline-${id}`, true);\n }\n\n if (timelineItems.length > 0) {\n timelineItems.forEach((item, index) => {\n item.classList.add(`timeline-${index}`);\n timelineConstructor(index);\n })\n }\n\n}\n\nexport default Timeline;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst VideoPlayerLink = () => {\n\n let videos = document.querySelectorAll('.video-player-link');\n Vue.use(VModal);\n\n let VideoConstructor = (id) => {\n Vue.component('video-player-template-link', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n } ,\n mounted() {\n this.videoUrl = this.$refs.overlay.dataset.videoId;\n this.videoName = null;\n }\n });\n \n new Vue({\n el: `.video-player-link-${id}`,\n }).$mount(`.video-player-link-${id}`, true);\n }\n\n if (videos.length > 0) {\n videos.forEach((item, index) => {\n item.classList.add(`video-player-link-${index}`);\n VideoConstructor(index);\n })\n }\n}\n\nexport default VideoPlayerLink;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst VideoPlayer = () => {\n\n let videos = document.querySelectorAll('.video-player');\n Vue.use(VModal);\n\n let VideoConstructor = (id) => {\n Vue.component('video-player-template', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n },\n mounted() {\n this.videoUrl = this.$refs.overlay.dataset.videoId;\n this.videoName = this.$refs.name ? this.$refs.name.innerHTML : null;\n }\n });\n \n new Vue({\n el: `.video-player-${id}`,\n }).$mount(`.video-player-${id}`, true);\n }\n\n if (videos.length > 0) {\n videos.forEach((item, index) => {\n item.classList.add(`video-player-${index}`);\n VideoConstructor(index);\n })\n }\n}\n\nexport default VideoPlayer;","// Polyfills for IE\nimport './polyfills/element.closest';\nimport './polyfills/matchMedia';\nimport 'nodelist-foreach-polyfill';\nimport 'core-js/features/promise';\nimport 'core-js/es/symbol/iterator';\nimport 'core-js/es/object/assign';\nimport 'core-js/es/array/find';\nimport 'core-js/es/array/from';\nimport 'core-js/es/array/includes';\nimport 'core-js/es/string/includes';\nimport 'intersection-observer';\n\n// import sample from './lib/sample.js';\nimport drawer from './lib/drawer.js';\nimport productsAccessories from './lib/products-accessories.js';\nimport ctaBarTop from './lib/cta-bar-top.js';\nimport ctaBarBottom from './lib/cta-bar-bottom.js';\nimport subNav from './lib/sub-nav.js';\nimport topBar from './lib/menu-top-bar.js';\nimport fwMedia from './lib/fw-media.js';\nimport howItWorks from './lib/how-it-works.js';\nimport videoPlayer from './lib/video-player.js';\nimport videoPlayerLink from './lib/video-player-link.js';\n\nimport specifications from './lib/specifications.js';\nimport heroProducts from './lib/hero-products.js';\nimport marketApps from './lib/market-applications.js';\nimport megamenu from './lib/megamenu.js';\n\n\n\n\n\n\n\n\nimport footerUnitToggler from './lib/footer-units.js';\nimport documentation from './lib/documentation.js';\nimport software from './lib/software-firmware.js';\nimport productCatalog from './lib/product-catalog.js';\nimport internalSearch from './lib/internal-search.js';\nimport {pardotForm} from './lib/pardot-form.js';\nimport bookmarks from './lib/bookmarks.js';\nimport { instance, trigger} from './lib/modal-trigger.js';\n\nimport documentationContextual from './lib/documentation-contextual.js';\nimport softwareCard from './lib/software-card.js'; //for software/firmware no filtering version\nimport quickLinks from './lib/quick-links.js';\nimport homeHero from './lib/home-hero.js';\nimport searchResults from \"./lib/search-results\";\nimport testimonial from \"./lib/testimonial\";\nimport patents from \"./lib/patents\";\nimport legalCompliance from \"./lib/legal-compliance\";\nimport timeline from \"./lib/timeline\";\nimport literatureOrder from \"./lib/lit-order\";\nimport genericModal from \"./lib/generic-modal\";\nimport slideshow from './lib/slideshow.js';\n\nimport store from './lib/store';\n\n// importing libraries for modules\nimport ComponentModule from './lib/component-module';\nimport './lib/modules';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n genericModal();\n drawer();\n productsAccessories();\n ctaBarTop();\n ctaBarBottom();\n subNav();\n topBar();\n fwMedia();\n howItWorks();\n videoPlayer();\n videoPlayerLink();\n \n specifications();\n heroProducts();\n marketApps();\n megamenu();\n footerUnitToggler();\n documentation();\n software();\n productCatalog();\n internalSearch();\n pardotForm();\n bookmarks();\n // Initialization modules\n ComponentModule.Init();\n instance;\n trigger();\n documentationContextual();\n softwareCard();\n quickLinks();\n homeHero();\n searchResults();\n testimonial();\n patents();\n legalCompliance();\n timeline();\n literatureOrder();\n slideshow();\n\n // always scroll lock body when modal or mobile megamenu is open\n let observerTarget = document.querySelector('body');\n let scrollLock = () => {\n if (document.querySelector('.bmi-modal') || document.querySelector('.megamenu__mobile-submenu.active')) {\n observerTarget.classList.add('scroll-lock');\n } else {\n observerTarget.classList.remove('scroll-lock');\n }\n }\n let options = {\n subtree: true,\n childList: true\n }\n let observer = new MutationObserver(scrollLock);\n observer.observe(observerTarget, options);\n\n // init units to us or metric\n store.dispatch('initUnits');\n // init getting GA client ID\n store.dispatch('initGAID');\n});\n\nstore.dispatch('initCookies'); //init cookies for bookmark feature\nstore.dispatch('checkMobile'); \n","if (!Element.prototype.matches) {\n\tElement.prototype.matches = Element.prototype.msMatchesSelector ||\n\t\tElement.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n\tElement.prototype.closest = function closest(s) {\n\t\tconst el = this;\n\t\tlet ancestor = this;\n\t\tif (!document.documentElement.contains(el)) return null;\n\t\tdo {\n\t\t\tif (ancestor.matches(s)) return ancestor;\n\t\t\tancestor = ancestor.parentElement;\n\t\t} while (ancestor !== null);\n\t\treturn null;\n\t};\n}\n","// Modernizr style test\nif (!(window.webkitMatchMedia || window.mozMatchMedia || window.oMatchMedia || window.msMatchMedia || window.matchMedia)) {\n\tvar root = document.getElementsByTagName( 'html' )[0];\n\troot.className += ' no-matchmedia';\n}\n\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */\nwindow.matchMedia || (window.matchMedia = function() {\n \"use strict\";\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n var styleMedia = (window.styleMedia || window.media);\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function(media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function(media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n}());\n\n/*! matchMedia() polyfill addEventListener/removeEventListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */\n(function(){\n // Bail out for browsers that have addEventListener support\n if (window.matchMedia && window.matchMedia('all').addEventListener) {\n return false;\n }\n\n var localMatchMedia = window.matchMedia,\n hasMediaQueries = localMatchMedia('only all').matches,\n isListening = false,\n timeoutID = 0, // setTimeout for debouncing 'handleChange'\n queries = [], // Contains each 'mql' and associated 'listeners' if 'addEventListener' is used\n handleChange = function(evt) {\n // Debounce\n clearTimeout(timeoutID);\n\n timeoutID = setTimeout(function() {\n for (var i = 0, il = queries.length; i < il; i++) {\n var mql = queries[i].mql,\n listeners = queries[i].listeners || [],\n matches = localMatchMedia(mql.media).matches;\n\n // Update mql.matches value and call listeners\n // Fire listeners only if transitioning to or from matched state\n if (matches !== mql.matches) {\n mql.matches = matches;\n\n for (var j = 0, jl = listeners.length; j < jl; j++) {\n listeners[j].call(window, mql);\n }\n }\n }\n }, 30);\n };\n\n window.matchMedia = function(media) {\n var mql = localMatchMedia(media),\n listeners = [],\n index = 0;\n\n mql.addEventListener = function(listener) {\n // Changes would not occur to css media type so return now (Affects IE <= 8)\n if (!hasMediaQueries) {\n return;\n }\n\n // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)\n // There should only ever be 1 resize listener running for performance\n if (!isListening) {\n isListening = true;\n window.addEventListener('resize', handleChange, true);\n }\n\n // Push object only if it has not been pushed already\n if (index === 0) {\n index = queries.push({\n mql : mql,\n listeners : listeners\n });\n }\n\n listeners.push(listener);\n };\n\n mql.removeEventListener = function(listener) {\n for (var i = 0, il = listeners.length; i < il; i++){\n if (listeners[i] === listener){\n listeners.splice(i, 1);\n }\n }\n };\n\n return mql;\n };\n}());\n","module.exports={\n \"meterSelector\": {\n \"apiQuery\": [\n \"flowType\"\n ],\n \"question\": \"What are you measuring?\",\n \"totalSteps\": 9,\n \"filterName\": \"Flow type\",\n \"stepId\": \"01.0\",\n \"button\": [\n {\n \"label\": \"Water\",\n \"value\": \"Water\",\n \"icon\": \"water\",\n \"totalPages\": 10\n },\n {\n \"label\": \"Oil\",\n \"value\": \"Oil\",\n \"icon\": \"oil\"\n },\n {\n \"label\": \"Steam\",\n \"value\": \"Steam\",\n \"icon\": \"steam\",\n \"totalPages\": 10\n },\n {\n \"label\": \"Air / Gas\",\n \"value\": \"Air / Gas\",\n \"icon\": \"air-gas\"\n },\n {\n \"label\": \"Other liquid\",\n \"value\": \"Other liquid\",\n \"icon\": \"other\",\n \"selectedLabel\": \"Based on your selection, we recommend you connect with a product expert for assistance finding the appropriate meter options for your application.\",\n \"totalPages\": 10\n }\n ],\n \"searchResults\": {\n \"Results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/9ffrt62foa/jpeg/Air%20and%20Compressed%20Gas%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/yhf0kktfsd/png/Hedland-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Air and Compressed Gas Meter\",\n \"url\": \"/products/meters/variable-area-flow-meters/air-and-compressed-gas-meter/\",\n \"id\": \"94\",\n \"stats\": [\n {\n \"label\": \"

    Size

    \",\n \"valueImperial\": \"1/4...3 in.\",\n \"valueMetric\": \"6...80 mm\"\n },\n {\n \"label\": \"

    Temperature Range

    \",\n \"valueImperial\": \"-20...240 °F\",\n \"valueMetric\": \"-29...116 °C\"\n },\n {\n \"label\": \"

    Flow Range

    \",\n \"valueImperial\": \"0.5...2200 scfm\",\n \"valueMetric\": \"0.2...1130 l/sec\"\n },\n {\n \"label\": \"

    Pressure Range

    \",\n \"valueImperial\": \"Up to 1500 PSI\",\n \"valueMetric\": \"Up to 103 bar\"\n }\n ],\n \"markets\": [\n \"Automotive Fluid Dispensing\",\n \"Aviation & Aerospace\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Variable Area Flow Meters\",\n \"brand\": \"Hedland\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"ca331136-ff6e-43c1-b513-d209a455e138\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/ly4uvs42he/jpeg/Air-Caustic%20and%20Corrosive%20Gas%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/yhf0kktfsd/png/Hedland-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Caustic and Corrosive Air/Gas Meter\",\n \"url\": \"/products/meters/variable-area-flow-meters/caustic-and-corrosive-airgas-meter/\",\n \"id\": \"96\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"1/4…1 1/2 in.\",\n \"valueMetric\": \"6...40 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \" -20...240 °F\",\n \"valueMetric\": \"-29…116 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"2...800 scfm\",\n \"valueMetric\": \"1…350 lpm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"±2% (1/4 in. is +7%)\",\n \"valueMetric\": \"±2% (1/4 in. is +7%)\"\n }\n ],\n \"markets\": [\n \"Automotive Fluid Dispensing\",\n \"Aviation & Aerospace\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Variable Area Flow Meters\",\n \"brand\": \"Hedland\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"34907486-2783-4301-bbe8-d254e02e197b\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/5lrawuyqnd/jpeg/COIN-FF%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN FF\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-wedge-flange-process-by-flange-instrumentation-model-ff-flow-meter/\",\n \"id\": \"139\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...48 in.\",\n \"valueMetric\": \"12...1219 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 1500 °F\",\n \"valueMetric\": \"Up to 815 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"57869087-8c87-46e4-b962-c0a43247632d\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/s8iymbnqc3/jpeg/COIN-NB-%28with-weld%29%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NB\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-butt-weld-wedge-model-nb-flow-meter/\",\n \"id\": \"137\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...4 in.\",\n \"valueMetric\": \"12...101 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"31fdfe6b-d040-401a-ad0b-4e64e0016016\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/m8verp5tni/jpeg/COIN-NF%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NF\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-flanged-with-npt-pressure-taps-model-nf-flow-meter/\",\n \"id\": \"138\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...48 in.\",\n \"valueMetric\": \"12...1,219 mm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Process & General Industry\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"dcb7bd65-a1fa-4309-bb4d-697274a1623a\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/3niwaz7vpr/jpeg/NN%20Back-to-Back-Wedge-Meter%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NN\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-back-to-back-wedge-model-nn-flow-meter/\",\n \"id\": \"136\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...6 in.\",\n \"valueMetric\": \"12...152 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"2acc193c-dad7-45e2-b2da-d66715c99b6d\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/qi7m5tqc94/jpeg/COIN-NW%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Coin NW\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-wedge-wafer-model-nw-flow-meter/\",\n \"id\": \"135\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...4 in.\",\n \"valueMetric\": \"13...101 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Rating\",\n \"valueImperial\": \"Dependent on flange rating \",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"d7a7121d-391a-4f4c-80f8-d682bf7669d8\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/pyfbogfk4l/jpeg/2019_Cone%20Meter%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Cone DP Meters\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/cone-differential-pressure-flow-meter/\",\n \"id\": \"140\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...24 in.\",\n \"valueMetric\": \"12...609 mm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"±0.5%\",\n \"valueMetric\": \"±0.5%\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Building Design, HVAC, & Plumbing\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"d3bcb2a8-dab3-459d-8be6-b7c7489d6298\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/sabwvp2yss/jpeg/Cox%20Gas%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/i3c0moz15i/png/Cox-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"CPG - Precision Meter for Gases\",\n \"url\": \"/products/meters/turbine-flow-meters/precision-gas-flow-meter/\",\n \"id\": \"148\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"0.25...2 in. \",\n \"valueMetric\": \"6...50 mm\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0.4...250 scfm\",\n \"valueMetric\": \"1.89...118 lps\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 5000 PSI\",\n \"valueMetric\": \"Up to 344 bar\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 500 °F\",\n \"valueMetric\": \"Up to 260 °C\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Turbine Flow Meters\",\n \"brand\": \"Cox\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"ce0c3b13-f870-4112-baba-a86e1fc064c0\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/ylw0ld9kol/jpeg/Cox%20Precision%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/i3c0moz15i/png/Cox-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"CPT - Precision Single Rotor\",\n \"url\": \"/products/meters/turbine-flow-meters/precision-turbine-meter/\",\n \"id\": \"146\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"0.25...2 in.\",\n \"valueMetric\": \"6...50 mm\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0.05...310 gpm\",\n \"valueMetric\": \"0.19...1173 l/min\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 6000 PSI\",\n \"valueMetric\": \"Up to 408 bar\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 450 °F \",\n \"valueMetric\": \"Up to 232 °C\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Turbine Flow Meters\",\n \"brand\": \"Cox\",\n \"flowTypes\": [\n \"Oil\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"f9efd9cf-2b00-4661-97ac-2c6eba04a994\"\n }\n ],\n \"SavedItemsCount\": 0,\n \"TotalResults\": 7,\n \"ViewProductLabel\": \"view product label\"\n }\n },\n \"searchResults\": {\n \"results\": [\n {\n \"title\": \"M2000 Electromagnetic Flow Meter\",\n \"description\": \"

    Combining a general-purpose detector with an amplifier, the ModMAG® M2000 Electromagnetic flow meter features an advanced, user-friendly design that is built for field verification testing with the use of a simple, handheld device.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/97vunv3vsv/jpeg/ModMAG-M2000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m2000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1666a162-2dfd-44d7-9f34-9b39f090b223_en\"\n },\n {\n \"title\": \"M5000 Electromagnetic Flow Meter\",\n \"description\": \"

    The ModMAG® M5000 Electromagnetic flow meter is an ideal solution for remote potable water applications, providing consistently reliable and accurate measurements.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/9yihjbuepv/jpeg/ModMAG-M5000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m5000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_bfb42605-a11a-4c92-a58e-812d05527d28_en\"\n },\n {\n \"title\": \"

    U500w Ultrasonic Flow Meter

    \",\n \"description\": \"

    The Dynasonics® U500w Ultrasonic flow meter uses solid-state technology in a compact, completely encapsulated housing, suitable for residential and commercial applications.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/nthehsoabl/jpeg/U500w%20Ultrasonic%20Flow%20Meters%20%28low%20res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/ultrasonic-flow-meters/u500w-ultrasonic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_2eaf6ba9-9340-4f02-a5bf-27e0dab4bcf2_en\"\n },\n {\n \"title\": \"DXN Portable Hybrid Ultrasonic Flow Meter\",\n \"description\": \"

    The Dynasonics® DXN Portable Hybrid Ultrasonic flow meter is a powerful tool used for troubleshooting flow issues, whether you want to quickly verify the flow reading of another meter or to data log flow system values over an extended period of time.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/1uye50izbz/jpeg/Hybrid%20Ultrasonic%20Flow%20Meters%20-%20DXN%20%28low%20res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/ultrasonic-flow-meters/dxn-portable-hybrid-ultrasonic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_54b3483b-33c5-4106-a12b-a530af8f53c6_en\"\n },\n {\n \"title\": \"380 Series BTU System Meter\",\n \"description\": \"

    The Series 380 BTU meter is an all-in-one energy usage package for monitoring hydronic heating or cooling systems. This meter accurately measures flow and temperature differential to compute energy and can interface with many existing control systems.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/sbtdpgcxvd/jpeg/380%20Series%20Btu%20System%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/impeller-flow-products/380-series-btu-system-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_9d08a29f-c6a7-4783-9a85-774b369dc89d_en\"\n },\n {\n \"title\": \"

    Precision Turbine Meter

    \",\n \"description\": \"

    The Cox® Precision Turbine Meter has unprecedented mechanical linearity, resulting in minimizing or negating temperature induced viscosity influence.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/ylw0ld9kol/jpeg/Cox%20Precision%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/precision-turbine-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_f9efd9cf-2b00-4661-97ac-2c6eba04a994_en\"\n },\n {\n \"title\": \"B1750 Positive Displacement Meter\",\n \"description\": \"

    The Blancett® B1750 Positive Displacement meter provides high measurement accuracy for fluids over a wide viscosity range.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/idv3exmbrj/jpeg/Positive%20Displacement%20-%20B1750%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/b1750-positive-displacement-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_398b68a9-53aa-4f60-8dad-889c47644324_en\"\n },\n {\n \"title\": \"B1500 Turbine Flow Meter\",\n \"description\": \"

    The Blancett® B1500 Turbine flow meter has exceptional mechanical linearity, resulting in minimizing or negating temperature induced viscosity influence.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/vevizb2zpc/jpeg/B1500%20with%20Monitor%20%28low%20res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/b1500-turbine-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1392645a-e6db-4afe-a83a-7e2ab8d95658_en\"\n },\n {\n \"title\": \"900 Series Flow Meter\",\n \"description\": \"

    The Blancett® 900 Series flow meter is rugged, low-priced and specifically designed to measure floodwater line flow in secondary oil recovery operations.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/wbnbckchqu/jpeg/900%20Series%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/900-series-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_3d399e3a-2e98-484e-8e71-3bdff24bb65d_en\"\n },\n {\n \"title\": \"Phosphate Ester Fluid Meter\",\n \"description\": \"

    The Hedland® phosphate ester fluid meter provides a measurement solution for fire-resistant fluids, aviation hydraulic fluid and industrial lubricant, which have high ignition temperatures and low vapor pressures.

    \\n

    Download a Hedland Price List

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/7keut3aify/jpeg/Phosphate%20Ester%20Fluid%20Meter%20%28low%20res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"linkUrl\": \"/products/meters/variable-area-flow-meters/phosphate-ester-fluid-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_82285c14-14b7-4e65-9848-3c67c6a1c1e8_en\"\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 1542,\n \"trackId\": \"JXkJYrdtqhkFNyCtCrBnPw==\",\n \"filterCountResults\": [\n {\n \"filterValue\": 59,\n \"count\": 196\n },\n {\n \"filterValue\": 56,\n \"count\": 24\n },\n {\n \"filterValue\": 159,\n \"count\": 9\n },\n {\n \"filterValue\": 60,\n \"count\": 10\n },\n {\n \"filterValue\": 36,\n \"count\": 7\n },\n {\n \"filterValue\": 222,\n \"count\": 10\n },\n {\n \"filterValue\": 205,\n \"count\": 9\n },\n {\n \"filterValue\": 65,\n \"count\": 23\n },\n {\n \"filterValue\": 64,\n \"count\": 19\n },\n {\n \"filterValue\": 35,\n \"count\": 1078\n },\n {\n \"filterValue\": 161,\n \"count\": 11\n },\n {\n \"filterValue\": 157,\n \"count\": 57\n },\n {\n \"filterValue\": 158,\n \"count\": 21\n },\n {\n \"filterValue\": 201,\n \"count\": 47\n },\n {\n \"filterValue\": 58,\n \"count\": 14\n },\n {\n \"filterValue\": 160,\n \"count\": 7\n }\n ],\n \"didYouMean\": [\n \"meter specification\",\n \"strainer\",\n \"pulse meter\",\n \"meters\",\n \"meter \"\n ]\n },\n \"searchResults2\": {\n \"results\": [\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M3000\",\n \"imageUrl\": \"/static/images/doc-icon.svg\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/0ytwh51ram/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_c635b182-867d-46ab-bba6-cfa4e82b3e49_en\"\n },\n {\n \"title\": \"M2000 Electromagnetic Flow Meter\",\n \"description\": \"

    Combining a general-purpose detector with an amplifier, the ModMAG® M2000 Electromagnetic flow meter features an advanced, user-friendly design that is built for field verification testing with the use of a simple, handheld device.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/97vunv3vsv/jpeg/ModMAG-M2000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m2000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"isProduct\": true,\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1666a162-2dfd-44d7-9f34-9b39f090b223_en\"\n },\n {\n \"title\": \"Product Data Sheets / ModMAG\",\n \"description\": \"M-Series® M4000\",\n \"imageUrl\": \"/static/images/pdf-icon.svg\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/iiiwrqlyde/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"isProduct\": false,\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_947c8940-b704-431a-9cb1-abe18f873fe4_en\"\n },\n {\n \"title\": \"Brochures / AquaCUE, Dynasonics, Impeller, Industrial Oval Gear (IOG), ModMAG, Recordall, Vortex\",\n \"description\": \"ModMAG® M4000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/pnuoqyhk3f/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_f7d86f38-8c5d-436f-bcf4-1fe5ca5d2a23_en\"\n },\n {\n \"title\": \"

    How Modern Technology and Data Analytics Are Enabling Total Visibility of Water Use

    \",\n \"description\": \"ModMAG® M1000, M2000 and M5000 Field Verification Device Manual\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/gv55za7hzw/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_b47c6583-b31d-44e4-bbfb-e59c90642806_en\"\n },\n {\n \"title\": \"

    Badger Meter Improves Operating Reliability in Hydronic Heating and Cooling Applications

    \",\n \"description\": \"ModMAG® M5000 OIML Certificate of Conformity\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/1y8oj0khwe/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_17a270e2-433d-4490-b492-ca7af876c6f6_en\"\n },\n {\n \"title\": \"M5000 Electromagnetic Flow Meter\",\n \"description\": \"

    The ModMAG® M5000 Electromagnetic flow meter is an ideal solution for remote potable water applications, providing consistently reliable and accurate measurements.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/9yihjbuepv/jpeg/ModMAG-M5000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m5000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"isProduct\": true,\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_bfb42605-a11a-4c92-a58e-812d05527d28_en\"\n },\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M7600 Electromagnetic Flow Meter\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/1fdwgy8ecr/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_adc43f32-036f-43bc-aa46-3a57116ef114_en\"\n },\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M1000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/rayfx51aak/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_9e73d507-e7cd-42c1-a5f3-d417f2d72739_en\"\n },\n {\n \"title\": \"Application Data Sheets / ModMAG\",\n \"description\": \"ModMAG® M2000 Connecting a Badger Meter Endpoint to the M2000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/tmwpmjrqkx/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_eaf19cc3-1275-41c2-a42c-d0d9434a8298_en\"\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 122,\n \"trackId\": \"JXkJYrdtqhkFNyCtCrBnPw==\",\n \"filterCountResults\": [\n {\n \"filterValue\": 56,\n \"count\": 1\n },\n {\n \"filterValue\": 35,\n \"count\": 97\n },\n {\n \"filterValue\": 59,\n \"count\": 7\n },\n {\n \"filterValue\": 36,\n \"count\": 3\n },\n {\n \"filterValue\": 64,\n \"count\": 2\n },\n {\n \"filterValue\": 161,\n \"count\": 1\n },\n {\n \"filterValue\": 157,\n \"count\": 9\n },\n {\n \"filterValue\": 158,\n \"count\": 2\n }\n ],\n \"didYouMean\": [\n \"modmag m2000 manual\",\n \"modmag m2000\",\n \"modmag \",\n \"modmag m\"\n ]\n },\n \"searchResultsNone\": {\n \"results\": [],\n \"savedItemsCount\": 0,\n \"totalResults\": 0,\n \"trackId\": \"1v7sJX0O1notEuJ3MpFl5w==\",\n \"filterCountResults\": [],\n \"didYouMean\": [\n \"meters\"\n ]\n },\n \"documentsById\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET2\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET3\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n }\n ]\n },\n \"softwareById\": {\n \"results\": [\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"

    Dynasonics TFX Ultra - English Firmware®

    \",\n \"details\": \"Firmware | Version D007-1045-018_RevT | Updated July 23, 2020 | 190 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/v4yty5lduv/original/Dynasonics%20TFX%20Ultra%20-%20English%20Firmware-D007-1045-018_RevT.zip?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=aY-cU4AjThtvO94DKpSRRQrSh9ZCgOLNPxZF_zKFoPQ%3D\",\n \"viewDetailsUrl\": \"/en/test-software-page-1/\",\n \"id\": \"73\"\n },\n {\n \"eyebrow\": \"eyebrow\",\n \"name\": \"Dynasonics TFX Ultra - French Firmware2\",\n \"details\": \"Firmware | Version D007-1045-020_RevU | Updated July 23, 2020 | 190 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/rrutsxzq68/original/Dynasonics%20TFX%20Ultra%20-%20French%20Firmware-D007-1045-020_RevU.zip?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=f74dbR2mLkoPvrwCrBmbJm-s899ZfXukzr3hLRJr_Lw%3D\",\n \"viewDetailsUrl\": null,\n \"id\": \"74\"\n },\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"Dynasonics TFX Ultra EtherNet-IP eds file\",\n \"details\": \"Software | Version N/A | Updated July 23, 2020 | 25 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/w98jtufybu/original/Dynasonics%20TFX%20Ultra%20EtherNet-IP%20eds%20file.eds?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=gapKEGxWK38f6VfA55eWyYZRZxueLPQMR-iuzfijZsY%3D\",\n \"viewDetailsUrl\": null,\n \"id\": \"75\"\n }\n ]\n },\n \"recentPosts\": {\n \"success\": \"true\",\n \"page\": 1,\n \"count\": 50,\n \"prevPage\": null,\n \"nextPage\": 3,\n \"pageCount\": 3,\n \"totalPages\": 6,\n \"limit\": 24,\n \"results\": [\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"

    10 ways flow meters aid in water & wastewater treatment

    \",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"Blancett meters help hydraulic fracturing companies\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"High temperature© gas control for automotive test cell\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"High temperature gas control for automotive test cell\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n }\n ]\n },\n \"productsByBrand\": {\n \"success\": \"true\",\n \"results\": [\n {\n \"key\": \"B1500 Turbine Flow Meter\",\n \"value\": \"B1500 Turbine Flow Meter\"\n },\n {\n \"key\": \"B1750 Positive Displacement Meter\",\n \"value\": \"B1750 Positive Displacement Meter\"\n },\n {\n \"key\": \"B2900 Series Flow Monitor\",\n \"value\": \"B2900 Series Flow Monitor\"\n },\n {\n \"key\": \"B3000 Series Flow Monitor\",\n \"value\": \"B3000 Series Flow Monitor\"\n },\n {\n \"key\": \"B3100 Series Flow Monitor\",\n \"value\": \"B3100 Series Flow Monitor\"\n },\n {\n \"key\": \"FloClean Sanitary Turbine Flow Meter\",\n \"value\": \"FloClean Sanitary Turbine Flow Meter\"\n },\n {\n \"key\": \"Intelligent Frequency Converter\",\n \"value\": \"

    Intelligent Frequency Converter

    \"\n },\n {\n \"key\": \"K-Factor Scaler (Blancett)\",\n \"value\": \"

    K-Factor Scaler (Blancett)

    \"\n },\n {\n \"key\": \"Model 1100 Turbine Flow Meter\",\n \"value\": \"Model 1100 Turbine Flow Meter\"\n },\n {\n \"key\": \"Model 1200 In-Line Turbine Flow Meter\",\n \"value\": \"Model 1200 In-Line Turbine Flow Meter\"\n },\n {\n \"key\": \"Model 900 Series Flow Meter\",\n \"value\": \"900 Series Flow Meter\"\n },\n {\n \"key\": \"QuikSert Gas B142\",\n \"value\": \"

    B142 Gas QuikSert® Turbine Flow Meter

    \"\n },\n {\n \"key\": \"QuikSert In-Line Turbine Flow Meter\",\n \"value\": \"

    QuikSert® In-Line Turbine Flow Meter

    \"\n }\n ]\n },\n \"products\": {\n \"success\": \"true\",\n \"viewProductLabel\": \"View product label\",\n \"totalResults\": 10,\n \"results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/odvvjf5xo7/jpeg/10%2C000%20psi%20-%20HP-10%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/9pdcioduim/png/RCV-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"

    10,000 PSI Type HP-10 High Pressure Control Valve

    \",\n \"url\": \"/products/valves/10000-psi-type-hp-10-high-pressure-control-valve/\",\n \"id\": \"70\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/4...1/2 in.\",\n \"valueMetric\": \"6...12 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"75…1000 °F\",\n \"valueMetric\": \"24…538 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0…2.5 cv\",\n \"valueMetric\": \"0...35.75 kv\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 10,000 PSI\",\n \"valueMetric\": \"Up to 689 bar\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Valves\",\n \"productType\": null,\n \"brand\": \"Research Control Valves\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"b51983af-7c6e-44d2-850d-477bf9968dc5\"\n },\n {\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series sample\",\n \"url\": \"/url/to/product\",\n \"id\": \"7\",\n \"brand\": \"brand2\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"54 cm.\",\n \"valueImperial\": \"5634 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 123C\",\n \"valueImperial\": \"up tp 123F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 123 metric\",\n \"valueImperial\": \"up tp 123 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"8\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000\",\n \"url\": \"/url/to/product\",\n \"id\": \"12\",\n \"brand\": \"brand4\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"1-7 cm.\",\n \"valueImperial\": \"1/4-2 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 000C\",\n \"valueImperial\": \"up tp 000F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 000 metric\",\n \"valueImperial\": \"up tp 000 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"9\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"10\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"11\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"17\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"18\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n }\n ]\n },\n \"productsTest\": {\n \"success\": \"true\",\n \"viewProductLabel\": \"View product label\",\n \"totalResults\": 10,\n \"results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/odvvjf5xo7/jpeg/10%2C000%20psi%20-%20HP-10%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/9pdcioduim/png/RCV-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"

    Test

    \",\n \"url\": \"/products/valves/10000-psi-type-hp-10-high-pressure-control-valve/\",\n \"id\": \"4561\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/4...1/2 in.\",\n \"valueMetric\": \"6...12 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"75…1000 °F\",\n \"valueMetric\": \"24…538 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0…2.5 cv\",\n \"valueMetric\": \"0...35.75 kv\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 10,000 PSI\",\n \"valueMetric\": \"Up to 689 bar\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Valves\",\n \"productType\": null,\n \"brand\": \"Research Control Valves\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"b51983af-7c6e-44d2-850d-477bf9968dc5\"\n },\n {\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series sample\",\n \"url\": \"/url/to/product\",\n \"id\": \"700\",\n \"brand\": \"brand2\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"54 cm.\",\n \"valueImperial\": \"5634 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 123C\",\n \"valueImperial\": \"up tp 123F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 123 metric\",\n \"valueImperial\": \"up tp 123 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"test testModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"800\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000\",\n \"url\": \"/url/to/product\",\n \"id\": \"1200\",\n \"brand\": \"brand4\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"1-7 cm.\",\n \"valueImperial\": \"1/4-2 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 000C\",\n \"valueImperial\": \"up tp 000F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 000 metric\",\n \"valueImperial\": \"up tp 000 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"900\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"500\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"400\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"100\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"150\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n }\n ]\n },\n \"software\": {\n \"results\": [\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"LM_LM-OGA-OGTAER_ZUL_MID_01_2012\",\n \"details\": \"Firmware | Version D007-1045-018_RevT | Updated July 23, 2020 | 190 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/v4yty5lduv/original/Dynasonics%20TFX%20Ultra%20Firmware%20%5BEnglish%5D%20-%20D007-1045-018_RevT.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": null,\n \"id\": \"295\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Dynasonics\",\n \"brands\": [\n \"Dynasonics\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"Dynasonics TFX Ultra Firmware [English]\",\n \"releaseNotes\": \"test test test test test\"\n },\n {\n \"eyebrow\": \"Impeller/Data Industrial\",\n \"name\": \"Impeller 340LW Series LonWorks Configuration Software\",\n \"details\": \"Software | Updated August 19, 2020 | 1 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/hlnzlwdv0t/original/Impeller%20340LW%20Series%20LonWorks%20Configuration%20Software.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/Impeller-340lw-series-lonworks-configuration-software/\",\n \"id\": \"438\",\n \"productName\": \"Type 340 LW-LonWorks BTU Transmitter\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Impeller/Data Industrial\",\n \"brands\": [\n \"Impeller/Data Industrial\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Impeller 340LW Series LonWorks Configuration Software\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"ModMAG\",\n \"name\": \"ModMag Field Verification Device PC Software\",\n \"details\": \"Software | Version v1.0.17 | Updated August 19, 2020 | 7.02 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/zjvppiew3o/original/ModMAG%20Field%20Verification%20Device%20PC%20Software%20-%20v1.0.17.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/modmag-field-verification-device-pc-software/\",\n \"id\": \"446\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"ModMAG\",\n \"brands\": [\n \"ModMAG\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"ModMag Field Verification Device PC Software\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Blancett\",\n \"name\": \"Blancett B3100 Monitor Configuration Software\",\n \"details\": \"Software | Updated August 19, 2020 | 1.51 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/5y34yrqpp6/original/Blancett%20B3100%20Monitor%20Configuration%20Software.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/blancett-b3100-monitor-configuration-software/\",\n \"id\": \"452\",\n \"productName\": \"B3100 Series Flow Monitor\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Blancett\",\n \"brands\": [\n \"Blancett\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Blancett B3100 Monitor Configuration Software\",\n \"releaseNotes\": \"test\"\n },\n {\n \"eyebrow\": \"Cox ; Impeller/Data Industrial\",\n \"name\": \"FC-5000 Firmware [Legacy]\",\n \"details\": \"Firmware | Version v1.2.4 | Updated August 19, 2020 | 374 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/ka4jpbkvo0/original/FC-5000%20Firmware%20-%20Legacy%201.2.4.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/fc-5000-firmware-legacy/\",\n \"id\": \"436\",\n \"productName\": \"FC-5000 BTU Monitor ; FC-5000 Flow Computer ; FC-5000 Flow Display\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Cox, Impeller/Data Industrial\",\n \"brands\": [\n \"Cox\",\n \"Impeller/Data Industrial\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"FC-5000 Firmware [Legacy]\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Coriolis\",\n \"name\": \"Coriolls RCTX Transmitter EtherNet/IP EDS\",\n \"details\": \"Software | Updated August 19, 2020 | 3 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/b3csju1yft/original/Coriolls%20EtherNetIP%20eds%20file%20for%20RCTX%20transmitter.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/coriolis-ethernet-ip-eds-file-for-rctx-transmitter/\",\n \"id\": \"450\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Coriolis\",\n \"brands\": [\n \"Coriolis\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Coriolls RCTX Transmitter EtherNet/IP EDS\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"Dynaconics Flow Meter Tool\",\n \"details\": \"Software | Version v1.6.10 | Updated August 19, 2020 | 2.24 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/p2nz5p5ylj/original/Dynaconics%20Flow%20Meter%20Tool%20-%20v1.6.10.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/dynasonics-isonic-4000-flow-meter-software/\",\n \"id\": \"455\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Dynasonics\",\n \"brands\": [\n \"Dynasonics\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Dynaconics Flow Meter Tool\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Research Control Valve (RCV)\",\n \"name\": \"RCV SEVA 100 EtherNet/IP Driver\",\n \"details\": \"Software | Updated August 19, 2020 | 3 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/riwznioshg/original/RCV%20SEVA%20100%20EtherNetIP%20Driver.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/rcv-seva-100-ethernet-ip-driver/\",\n \"id\": \"444\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Research Control Valve (RCV)\",\n \"brands\": [\n \"Research Control Valve (RCV)\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"RCV SEVA 100 EtherNet/IP Driver\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Coriolis\",\n \"name\": \"Coriolis RCT Calc Selection Tool\",\n \"details\": \"Software | Updated August 19, 2020 | 21.73 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/ryl0fcae6v/original/Coriolis%20RCT%20Calc%20Selection%20Tool.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/sizing-and-selection-tools/coriolis-rctcalc-selection-tool/\",\n \"id\": \"460\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Coriolis\",\n \"brands\": [\n \"Coriolis\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Coriolis RCT Calc Selection Tool\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"ModMAG\",\n \"name\": \"ModMAG M5000 Firmware\",\n \"details\": \"Firmware | Version v2.0.25 | Updated August 19, 2020 | 53 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/767ksclvco/original/ModMAG%20M5000%20Firmware-v2.0.25.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/modmag-m5000-firmware/\",\n \"id\": \"442\",\n \"productName\": \"M5000\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"ModMAG\",\n \"brands\": [\n \"ModMAG\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"ModMAG M5000 Firmware\",\n \"releaseNotes\": null\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 60,\n \"releaseNotesLabel\": \"release notes label\"\n },\n \"documentation\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"LM_LM-OGA-OGTAER_ZUL_MID_01_2012\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://badgermeter.widen.net/content/fjcdopcl3n/original/IOG-PS-00137-EN_Industrial%20Oval%20Gear%20Inline%20and%20Flanged%20Meters%20and%20Register%20Parts.pdf?download=true&x.app=api\",\n \"id\": \"35\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000, test1, test2,test3, test4, test5\",\n \"language\": \"French\",\n \"url\": \"https://badgermeter.widen.net/content/hiv7vd69uo/original/TTM-SS-03125-EN_Dynasonics TFX-5000 Flow Meter Specifications.docx?download=true\",\n \"id\": \"36\",\n \"documentId\": \"def-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"37\",\n \"documentId\": \"ghi-000-0000-000\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000, test, test, test, test, test\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"38\",\n \"documentId\": \"jkl-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"39\",\n \"documentId\": \"mno-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"40\",\n \"documentId\": \"prq-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"41\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"42\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"43\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"44\",\n \"documentId\": \"abc-000-0000-000\"\n }\n ],\n \"totalResults\": 88\n },\n \"documentationTest\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET test\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"350\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES test\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"360\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"370\"\n }\n ],\n \"totalResults\": 11\n },\n \"legal\": {\n \"results\": [\n {\n \"eyebrow\": \"Purchase terms\",\n \"name\": \"Purchase order - general terms and conditions\",\n \"details\": \"North America, test2, test3, test4, test5\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"40\"\n },\n {\n \"eyebrow\": \"Sales terms\",\n \"name\": \"Badger Meter sales terms and onditions\",\n \"details\": \"North America, test1, test2\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"70\"\n }\n ],\n \"totalResults\": 67\n },\n \"validateIds\": {\n \"success\": \"true\",\n \"results\": {\n \"invalidIds\": [\n 10,\n 5,\n 110,\n 2\n ],\n \"documentIds\": [\n 35,\n 41\n ],\n \"softwareIds\": [\n 74\n ],\n \"productIds\": [\n 11,\n 20,\n 35,\n 8\n ],\n \"articleIds\": []\n }\n },\n \"beaconrefs\": {\n \"success\": true,\n \"content\": {\n \"chat_doc_id\": \"25cf117fef15421e813739ff6204cedb\",\n \"prompt_intent\": \"GENERAL_QUESTION\",\n \"response\": \"The following references were identified in the search:\",\n \"sources\": [\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:42+00:00\",\n \"date_published\": \"2024-06-27T15:21:42+00:00\",\n \"date_updated\": \"2024-06-27T15:21:42+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/9ac7d962d4e588bd71b39fd5a43125a7e3530d3d6e8fad493371da3598d55c67.png\",\n \"source_title\": \"RTS-DS-00320-EN\\\\_Recordall Turbo Series Meters Models 160, 200, 450, 1000, 2000, 3500, 5500, 6200\",\n \"source_url\": \"https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:22:07+00:00\",\n \"date_published\": \"2024-06-27T15:22:07+00:00\",\n \"date_updated\": \"2024-06-27T15:22:07+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/24a270a2597726f4dca7107a3c0b53c218ff0fc75084dc6e15133198de631fa4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:23:35+00:00\",\n \"date_published\": \"2024-06-27T15:23:35+00:00\",\n \"date_updated\": \"2024-06-27T15:23:35+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/a236ceeceb97862294623e29a7498a669837e7d16a85b9209edfa2b00b46deb4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n }\n ],\n \"status\": \"GENERATE_ANSWER_END\",\n \"took_secs\": 0.53,\n \"anonymous_id\": \"986f7fb25ef94d43a36321068d2e01b4\"\n }\n },\n \"beacondocs\": {\n \"success\": true,\n \"content\": {\n \"chat_doc_id\": \"0868bee1b1e24fcfbe4575b81a2e9dfe\",\n \"confidence_level\": null,\n \"disclaimer\": \"This information was generated by an AI system and should not be solely relied upon for decision-making. Always verify information with credible sources and consult with relevant experts before taking any action based on AI-generated content.\",\n \"preferred_language\": \"en\",\n \"prompt_intent\": \"GENERAL_QUESTION\",\n \"related_questions\": [\n \"What are the steps to clear a tamper condition on an endpoint?\",\n \"How can i troubleshoot common issues related to endpoint tampering?\"\n ],\n \"response\": \"The ModMAG documentation provides detailed information on the installation, operation, and maintenance of Badger Meter's ModMAG flow meters. Here are some key points extracted from the documentation:\\n\\n1. **Installation Requirements**:\\n - Temperature sensors must be connected to specific clamps: the inlet flow temperature sensor to clamps 5 and 6, and the outlet flow temperature sensor to clamps 7 and 8. The color of the wires does not matter, but connections must be tight [**2**].\\n - The pulse output of the flow meter must match the calculator input pulse value. For flow meters with open collector connections, ensure the polarity is correct [**2**].\\n\\n2. **Flow Meter Specifications**:\\n - Flow meters should comply with Class OA (reed contact) and Class OC (open collector) standards according to EN 1434-2: 2015. The maximum input frequency is 10 Hz, with a pulse length of at least 25 ms and a pulse pause of at least 50 ms [**2**].\\n\\n3. **Operation Guidelines**:\\n - Before starting operation, ensure that the flow meter is the correct size, the directional arrow matches the flow direction, and there are no leaks. Additionally, check that the heating/cooling system is clear of clogs [**2**].\\n\\n4. **Maintenance Procedures**:\\n - Regular cleaning of the flow tube and electrodes may be necessary, depending on the properties of the process fluid. Use isopropyl alcohol or clean water for cleaning, ensuring compatibility with the measured fluid [**4**].\\n - Fuse replacement should only be performed by authorized personnel, and the same type and rating of fuses must be used [**4**].\\n\\n5. **Technical Support**:\\n - If issues arise with the meter, it is recommended to contact Badger Meter's technical support for assistance, especially if a problem appears to originate from the printed circuit board (PCB) [**4**].\\n\\nFor more detailed information, including specific installation diagrams and technical specifications, you can refer to the official Badger Meter documentation available on their website [**1**].\\n\\nIf you have specific aspects of the ModMAG documentation you would like to explore further, please let me know!\\n\\n\",\n \"sources\": [\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:42+00:00\",\n \"date_published\": \"2024-06-27T15:21:42+00:00\",\n \"date_updated\": \"2024-06-27T15:21:42+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/9ac7d962d4e588bd71b39fd5a43125a7e3530d3d6e8fad493371da3598d55c67.png\",\n \"source_title\": \"ORION Field Application 4.3.0 for Trimble Ranger 3 with ReadCenter Manual (ORI-UM-00185-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:22:07+00:00\",\n \"date_published\": \"2024-06-27T15:22:07+00:00\",\n \"date_updated\": \"2024-06-27T15:22:07+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/24a270a2597726f4dca7107a3c0b53c218ff0fc75084dc6e15133198de631fa4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:23:35+00:00\",\n \"date_published\": \"2024-06-27T15:23:35+00:00\",\n \"date_updated\": \"2024-06-27T15:23:35+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/a236ceeceb97862294623e29a7498a669837e7d16a85b9209edfa2b00b46deb4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n }\n ],\n \"status\": \"GENERATE_ANSWER_END\",\n \"took_secs\": 6.13,\n \"anonymous_id\": \"c24dbe56476a4bdc9277f3cf04f11357\"\n }\n },\n \"beaconfeedback\": {\n \"success\": true\n }\n}","/**\n * @popperjs/core v2.4.4 - MIT License\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction getBoundingClientRect(element) {\n var rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n y: rect.top\n };\n}\n\n/*:: import type { Window } from '../types'; */\n\n/*:: declare function getWindow(node: Node | Window): Window; */\nfunction getWindow(node) {\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n }\n\n return node;\n}\n\nfunction getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}\n\n/*:: declare function isElement(node: mixed): boolean %checks(node instanceof\n Element); */\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n/*:: declare function isHTMLElement(node: mixed): boolean %checks(node instanceof\n HTMLElement); */\n\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}\n\nfunction getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}\n\nfunction getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}\n\nfunction getDocumentElement(element) {\n // $FlowFixMe: assume body is always available\n return (isElement(element) ? element.ownerDocument : element.document).documentElement;\n}\n\nfunction getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}\n\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\n\n// Composite means it takes into account transforms as well as layout.\n\nfunction getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement);\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\n// Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\nfunction getLayoutRect(element) {\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n}\n\nfunction getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// $FlowFixMe: this is a quicker (but less type safe) way to save quite some bytes from the bundle\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || // DOM Element detected\n // $FlowFixMe: need a better way to handle this...\n element.host || // ShadowRoot detected\n // $FlowFixMe: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}\n\nfunction getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}\n\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the \nreference element's position.\n*/\n\nfunction listScrollParents(element, list) {\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = getNodeName(scrollParent) === 'body';\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}\n\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n var offsetParent = element.offsetParent;\n\n if (offsetParent) {\n var html = getDocumentElement(offsetParent);\n\n if (getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && getComputedStyle(html).position !== 'static') {\n return html;\n }\n }\n\n return offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.willChange && css.willChange !== 'auto') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static') {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nvar top = 'top';\nvar bottom = 'bottom';\nvar right = 'right';\nvar left = 'left';\nvar auto = 'auto';\nvar basePlacements = [top, bottom, right, left];\nvar start = 'start';\nvar end = 'end';\nvar clippingParents = 'clippingParents';\nvar viewport = 'viewport';\nvar popper = 'popper';\nvar reference = 'reference';\nvar variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nvar placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nvar beforeRead = 'beforeRead';\nvar read = 'read';\nvar afterRead = 'afterRead'; // pure-logic modifiers\n\nvar beforeMain = 'beforeMain';\nvar main = 'main';\nvar afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nvar beforeWrite = 'beforeWrite';\nvar write = 'write';\nvar afterWrite = 'afterWrite';\nvar modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nfunction orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}\n\nfunction debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}\n\nfunction format(str) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return [].concat(args).reduce(function (p, c) {\n return p.replace(/%s/, c);\n }, str);\n}\n\nvar INVALID_MODIFIER_ERROR = 'Popper: modifier \"%s\" provided an invalid %s property, expected %s but got %s';\nvar MISSING_DEPENDENCY_ERROR = 'Popper: modifier \"%s\" requires \"%s\", but \"%s\" modifier is not available';\nvar VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];\nfunction validateModifiers(modifiers) {\n modifiers.forEach(function (modifier) {\n Object.keys(modifier).forEach(function (key) {\n switch (key) {\n case 'name':\n if (typeof modifier.name !== 'string') {\n console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '\"name\"', '\"string\"', \"\\\"\" + String(modifier.name) + \"\\\"\"));\n }\n\n break;\n\n case 'enabled':\n if (typeof modifier.enabled !== 'boolean') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"enabled\"', '\"boolean\"', \"\\\"\" + String(modifier.enabled) + \"\\\"\"));\n }\n\n case 'phase':\n if (modifierPhases.indexOf(modifier.phase) < 0) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"phase\"', \"either \" + modifierPhases.join(', '), \"\\\"\" + String(modifier.phase) + \"\\\"\"));\n }\n\n break;\n\n case 'fn':\n if (typeof modifier.fn !== 'function') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"fn\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n }\n\n break;\n\n case 'effect':\n if (typeof modifier.effect !== 'function') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"effect\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n }\n\n break;\n\n case 'requires':\n if (!Array.isArray(modifier.requires)) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requires\"', '\"array\"', \"\\\"\" + String(modifier.requires) + \"\\\"\"));\n }\n\n break;\n\n case 'requiresIfExists':\n if (!Array.isArray(modifier.requiresIfExists)) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requiresIfExists\"', '\"array\"', \"\\\"\" + String(modifier.requiresIfExists) + \"\\\"\"));\n }\n\n break;\n\n case 'options':\n case 'data':\n break;\n\n default:\n console.error(\"PopperJS: an invalid property has been provided to the \\\"\" + modifier.name + \"\\\" modifier, valid properties are \" + VALID_PROPERTIES.map(function (s) {\n return \"\\\"\" + s + \"\\\"\";\n }).join(', ') + \"; but \\\"\" + key + \"\\\" was provided.\");\n }\n\n modifier.requires && modifier.requires.forEach(function (requirement) {\n if (modifiers.find(function (mod) {\n return mod.name === requirement;\n }) == null) {\n console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));\n }\n });\n });\n });\n}\n\nfunction uniqueBy(arr, fn) {\n var identifiers = new Set();\n return arr.filter(function (item) {\n var identifier = fn(item);\n\n if (!identifiers.has(identifier)) {\n identifiers.add(identifier);\n return true;\n }\n });\n}\n\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\n\nfunction mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign(Object.assign(Object.assign({}, existing), current), {}, {\n options: Object.assign(Object.assign({}, existing.options), current.options),\n data: Object.assign(Object.assign({}, existing.data), current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}\n\nfunction getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}\n\n// of the `` and `` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = element.ownerDocument.body;\n var width = Math.max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = Math.max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += Math.max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}\n\nfunction contains(parent, child) {\n // $FlowFixMe: hasOwnProperty doesn't seem to work in tests\n var isShadow = Boolean(child.getRootNode && child.getRootNode().host); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (isShadow) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}\n\nfunction rectToClientRect(rect) {\n return Object.assign(Object.assign({}, rect), {}, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nfunction getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = Math.max(rect.top, accRect.top);\n accRect.right = Math.min(rect.right, accRect.right);\n accRect.bottom = Math.min(rect.bottom, accRect.bottom);\n accRect.left = Math.max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}\n\nfunction getVariation(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}\n\nfunction computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = Math.floor(offsets[mainAxis]) - Math.floor(reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = Math.floor(offsets[mainAxis]) + Math.ceil(reference[len] / 2 - element[len] / 2);\n break;\n }\n }\n\n return offsets;\n}\n\nfunction getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}\n\nfunction mergePaddingObject(paddingObject) {\n return Object.assign(Object.assign({}, getFreshSideObject()), paddingObject);\n}\n\nfunction expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}\n\nfunction detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var referenceElement = state.elements.reference;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(referenceElement);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign(Object.assign({}, popperRect), popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}\n\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nfunction popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign(Object.assign({}, DEFAULT_OPTIONS), defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(options) {\n cleanupModifierEffects();\n state.options = Object.assign(Object.assign(Object.assign({}, defaultOptions), state.options), options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (\"development\" !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (\"development\" !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (\"development\" !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (\"development\" !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar eventListeners = {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar popperOffsets$1 = {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsets(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: Math.round(x * dpr) / dpr || 0,\n y: Math.round(y * dpr) / dpr || 0\n };\n}\n\nfunction mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive;\n\n var _roundOffsets = roundOffsets(offsets),\n x = _roundOffsets.x,\n y = _roundOffsets.y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n } // $FlowFixMe: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n /*:: offsetParent = (offsetParent: Element); */\n\n\n if (placement === top) {\n sideY = bottom;\n y -= offsetParent.clientHeight - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left) {\n sideX = right;\n x -= offsetParent.clientWidth - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref3) {\n var state = _ref3.state,\n options = _ref3.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive;\n\n if (\"development\" !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign(Object.assign({}, state.styles.popper), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign(Object.assign({}, state.styles.arrow), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false\n })));\n }\n\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar computeStyles$1 = {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};\n\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect$1(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar applyStyles$1 = {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect$1,\n requires: ['computeStyles']\n};\n\nfunction distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign(Object.assign({}, rects), {}, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar offset$1 = {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};\n\nvar hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\nvar hash$1 = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash$1[matched];\n });\n}\n\n/*:: type OverflowsMap = { [ComputedPlacement]: number }; */\n\n/*;; type OverflowsMap = { [key in ComputedPlacement]: number }; */\nfunction computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements; // $FlowFixMe\n\n var allowedPlacements = placements$1.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements$1;\n\n if (\"development\" !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar flip$1 = {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};\n\nfunction getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\nfunction within(min, value, max) {\n return Math.max(min, Math.min(value, max));\n}\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign(Object.assign({}, state.rects), {}, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? Math.min(min, tetherMin) : min, offset, tether ? Math.max(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(_min, _offset, _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar preventOverflow$1 = {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = state.modifiersData[name + \"#persistent\"].padding;\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect$2(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element,\n _options$padding = options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (\"development\" !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (\"development\" !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n state.modifiersData[name + \"#persistent\"] = {\n padding: mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements))\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar arrow$1 = {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect$2,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar hide$1 = {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};\n\nvar defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexports.createPopper = createPopper;\nexports.defaultModifiers = defaultModifiers;\nexports.detectOverflow = detectOverflow;\nexports.popperGenerator = popperGenerator;\n//# sourceMappingURL=popper.js.map\n","module.exports = require('./lib/axios');","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n var valueFromConfig2Keys = ['url', 'method', 'params', 'data'];\n var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy'];\n var defaultToConfig2Keys = [\n 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer',\n 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress',\n 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent',\n 'httpsAgent', 'cancelToken', 'socketPath'\n ];\n\n utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n }\n });\n\n utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) {\n if (utils.isObject(config2[prop])) {\n config[prop] = utils.deepMerge(config1[prop], config2[prop]);\n } else if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (utils.isObject(config1[prop])) {\n config[prop] = utils.deepMerge(config1[prop]);\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n var axiosKeys = valueFromConfig2Keys\n .concat(mergeDeepPropertiesKeys)\n .concat(defaultToConfig2Keys);\n\n var otherKeys = Object\n .keys(config2)\n .filter(function filterAxiosKeys(key) {\n return axiosKeys.indexOf(key) === -1;\n });\n\n utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n return config;\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Function equal to merge with the difference being that no reference\n * to original objects is kept.\n *\n * @see merge\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction deepMerge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = deepMerge(result[key], val);\n } else if (typeof val === 'object') {\n result[key] = deepMerge({}, val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n deepMerge: deepMerge,\n extend: extend,\n trim: trim\n};\n","require('../../modules/es.array.find');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'find');\n","require('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Array.from;\n","require('../../modules/es.array.includes');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'includes');\n","require('../../modules/es.object.assign');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.assign;\n","require('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\nrequire('../../modules/es.promise');\nrequire('../../modules/es.promise.finally');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Promise;\n","require('../../modules/es.string.includes');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('String', 'includes');\n","require('../../modules/es.symbol.iterator');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\nvar WrappedWellKnownSymbolModule = require('../../internals/wrapped-well-known-symbol');\n\nmodule.exports = WrappedWellKnownSymbolModule.f('iterator');\n","module.exports = require('../../es/promise');\n\nrequire('../../modules/esnext.aggregate-error');\nrequire('../../modules/esnext.promise.all-settled');\nrequire('../../modules/esnext.promise.try');\nrequire('../../modules/esnext.promise.any');\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar hide = require('../internals/hide');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","'use strict';\nvar bind = require('../internals/bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iteratorMethod = getIteratorMethod(O);\n var length, result, step, iterator;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n result = new C();\n for (;!(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping\n ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true)\n : step.value\n );\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\n// false -> Array#indexOf\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n// true -> Array#includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var bind = require('../internals/bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n// 0 -> Array#forEach\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n// 1 -> Array#map\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// 2 -> Array#filter\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// 3 -> Array#some\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n// 4 -> Array#every\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n// 5 -> Array#find\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n// 6 -> Array#findIndex\n// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\nmodule.exports = function (TYPE, specificCreate) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = specificCreate || arraySpeciesCreate;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: target.push(value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n hide(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/wrapped-well-known-symbol');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar exist = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return exist ? document.createElement(it) : {};\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/bind-context');\n\nvar call = Function.call;\n\nmodule.exports = function (CONSTRUCTOR, METHOD, length) {\n return bind(call, global[CONSTRUCTOR].prototype[METHOD], length);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n hide(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var shared = require('../internals/shared');\n\nmodule.exports = shared('native-function-to-string', Function.toString);\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var O = 'object';\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == O && globalThis) ||\n check(typeof window == O && window) ||\n check(typeof self == O && self) ||\n check(typeof global == O && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","module.exports = {};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","var global = require('../internals/global');\n\nvar document = global.document;\n\nmodule.exports = document && document.documentElement;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar hide = require('../internals/hide');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n hide(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = false;\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar BREAK = {};\n\nvar exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) {\n var boundFunction = bind(fn, that, ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, step;\n\n if (ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n if (result === BREAK) return BREAK;\n } return;\n }\n iterator = iterFn.call(iterable);\n }\n\n while (!(step = iterator.next()).done) {\n if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK;\n }\n};\n\nexports.BREAK = BREAK;\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar userAgent = require('../internals/user-agent');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var global = require('../internals/global');\nvar nativeFunctionToString = require('../internals/function-to-string');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\n\n// 19.1.2.1 Object.assign(target, source, ...)\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !nativeAssign || fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var length = enumBugKeys.length;\n var lt = '<';\n var script = 'script';\n var gt = '>';\n var js = 'java' + script + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(js);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n return createDict();\n};\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nhiddenKeys[IE_PROTO] = true;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var key;\n while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]);\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayIncludes = require('../internals/array-includes');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar arrayIndexOf = arrayIncludes(false);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","var validateSetPrototypeOfArguments = require('../internals/validate-set-prototype-of-arguments');\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var correctSetter = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n correctSetter = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n validateSetPrototypeOfArguments(O, proto);\n if (correctSetter) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar classof = require('../internals/classof');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = String(test) !== '[object z]' ? function toString() {\n return '[object ' + classof(this) + ']';\n} : test.toString;\n","var global = require('../internals/global');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar Reflect = global.Reflect;\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","module.exports = require('../internals/global');\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar nativeFunctionToString = require('../internals/function-to-string');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(nativeFunctionToString).split('toString');\n\nshared('inspectSource', function (it) {\n return nativeFunctionToString.call(it);\n});\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else hide(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);\n});\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\nvar hide = require('../internals/hide');\n\nmodule.exports = function (key, value) {\n try {\n hide(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var C = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\nvar IS_PURE = require('../internals/is-pure');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.1.3',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// CONVERT_TO_STRING: true -> String#at\n// CONVERT_TO_STRING: false -> String#codePointAt\nmodule.exports = function (that, pos, CONVERT_TO_STRING) {\n var S = String(requireObjectCoercible(that));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var isObject = require('../internals/is-object');\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));\n};\n","var global = require('../internals/global');\n\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\n\nmodule.exports = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) {\n throw TypeError(\"Can't set \" + String(proto) + ' as a prototype');\n }\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('../internals/is-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) {\n throw TypeError('String.prototype.' + NAME + \" doesn't accept regex\");\n } return String(requireObjectCoercible(that));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nvar Symbol = global.Symbol;\nvar store = shared('wks');\n\nmodule.exports = function (name) {\n return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name]\n || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n","exports.f = require('../internals/well-known-symbol');\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayMethods = require('../internals/array-methods');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar internalFind = arrayMethods(5);\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n find: function find(callbackfn /* , that = undefined */) {\n return internalFind(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayIncludes = require('../internals/array-includes');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar internalIncludes = arrayIncludes(true);\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return internalIncludes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\nvar ObjectPrototype = Object.prototype;\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (toString !== ObjectPrototype.toString) {\n redefine(ObjectPrototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar path = require('../internals/path');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar classof = require('../internals/classof-raw');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar userAgent = require('../internals/user-agent');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = global[PROMISE];\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = global.fetch;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper;\n\nvar FORCED = isForced(PROMISE, function () {\n // correct subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var empty = function () { /* empty */ };\n var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !((IS_NODE || typeof PromiseRejectionEvent == 'function')\n && (!IS_PURE || promise['finally'])\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n // wrap fetch result\n if (!IS_PURE && typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = path[PROMISE];\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar validateArguments = require('../internals/validate-string-method-arguments');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~validateArguments(this, searchString, 'includes')\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar codePointAt = require('../internals/string-at');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = codePointAt(string, index, true);\n state.index += point.length;\n return { value: point, done: false };\n});\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","var $ = require('../internals/export');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar iterate = require('../internals/iterate');\nvar hide = require('../internals/hide');\n\nvar $AggregateError = function AggregateError(errors, message) {\n var that = this;\n if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message);\n if (setPrototypeOf) {\n that = setPrototypeOf(new Error(message), getPrototypeOf(that));\n }\n var errorsArray = [];\n iterate(errors, errorsArray.push, errorsArray);\n that.errors = errorsArray;\n if (message !== undefined) hide(that, 'message', String(message));\n return that;\n};\n\n$AggregateError.prototype = create(Error.prototype, {\n constructor: createPropertyDescriptor(5, $AggregateError),\n name: createPropertyDescriptor(5, 'AggregateError')\n});\n\n$({ global: true }, {\n AggregateError: $AggregateError\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\n// `Promise.allSettled` method\n// https://github.com/tc39/proposal-promise-allSettled\n$({ target: 'Promise', stat: true }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (e) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: e };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar getBuiltIn = require('../internals/get-built-in');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://github.com/tc39/proposal-promise-any\n$({ target: 'Promise', stat: true }, {\n any: function any(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aFunction(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n errors.push(undefined);\n remaining++;\n promiseResolve.call(C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (e) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = e;\n --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\n\n// `Promise.try` method\n// https://github.com/tc39/proposal-promise-try\n$({ target: 'Promise', stat: true }, {\n 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapabilityModule.f(this);\n var result = perform(callbackfn);\n (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n return promiseCapability.promise;\n }\n});\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar hide = require('../internals/hide');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n hide(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n(function() {\n'use strict';\n\n// Exit early if we're not running in a browser.\nif (typeof window !== 'object') {\n return;\n}\n\n// Exit early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\n // See: https://github.com/w3c/IntersectionObserver/issues/211\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n Object.defineProperty(window.IntersectionObserverEntry.prototype,\n 'isIntersecting', {\n get: function () {\n return this.intersectionRatio > 0;\n }\n });\n }\n return;\n}\n\n/**\n * Returns the embedding frame element, if any.\n * @param {!Document} doc\n * @return {!Element}\n */\nfunction getFrameElement(doc) {\n try {\n return doc.defaultView && doc.defaultView.frameElement || null;\n } catch (e) {\n // Ignore the error.\n return null;\n }\n}\n\n/**\n * A local reference to the root document.\n */\nvar document = (function(startDoc) {\n var doc = startDoc;\n var frame = getFrameElement(doc);\n while (frame) {\n doc = frame.ownerDocument;\n frame = getFrameElement(doc);\n }\n return doc;\n})(window.document);\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n/**\n * The signal updater for cross-origin intersection. When not null, it means\n * that the polyfill is configured to work in a cross-origin mode.\n * @type {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nvar crossOriginUpdater = null;\n\n/**\n * The current cross-origin intersection. Only used in the cross-origin mode.\n * @type {DOMRect|ClientRect}\n */\nvar crossOriginRect = null;\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n this.time = entry.time;\n this.target = entry.target;\n this.rootBounds = ensureDOMRect(entry.rootBounds);\n this.boundingClientRect = ensureDOMRect(entry.boundingClientRect);\n this.intersectionRect = ensureDOMRect(entry.intersectionRect || getEmptyRect());\n this.isIntersecting = !!entry.intersectionRect;\n\n // Calculates the intersection ratio.\n var targetRect = this.boundingClientRect;\n var targetArea = targetRect.width * targetRect.height;\n var intersectionRect = this.intersectionRect;\n var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n // Sets intersection ratio.\n if (targetArea) {\n // Round the intersection ratio to avoid floating point math issues:\n // https://github.com/w3c/IntersectionObserver/issues/324\n this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n } else {\n // If area is zero and is intersecting, sets to 1, otherwise to 0\n this.intersectionRatio = this.isIntersecting ? 1 : 0;\n }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n * changes have queued. The function is not invoked if the queue has\n * been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n var options = opt_options || {};\n\n if (typeof callback != 'function') {\n throw new Error('callback must be a function');\n }\n\n if (options.root && options.root.nodeType != 1) {\n throw new Error('root must be an Element');\n }\n\n // Binds and throttles `this._checkForIntersections`.\n this._checkForIntersections = throttle(\n this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n // Private properties.\n this._callback = callback;\n this._observationTargets = [];\n this._queuedEntries = [];\n this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n // Public properties.\n this.thresholds = this._initThresholds(options.threshold);\n this.root = options.root || null;\n this.rootMargin = this._rootMarginValues.map(function(margin) {\n return margin.value + margin.unit;\n }).join(' ');\n\n /** @private @const {!Array} */\n this._monitoringDocuments = [];\n /** @private @const {!Array} */\n this._monitoringUnsubscribes = [];\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Sets up the polyfill in the cross-origin mode. The result is the\n * updater function that accepts two arguments: `boundingClientRect` and\n * `intersectionRect` - just as these fields would be available to the\n * parent via `IntersectionObserverEntry`. This function should be called\n * each time the iframe receives intersection information from the parent\n * window, e.g. via messaging.\n * @return {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nIntersectionObserver._setupCrossOriginUpdater = function() {\n if (!crossOriginUpdater) {\n /**\n * @param {DOMRect|ClientRect} boundingClientRect\n * @param {DOMRect|ClientRect} intersectionRect\n */\n crossOriginUpdater = function(boundingClientRect, intersectionRect) {\n if (!boundingClientRect || !intersectionRect) {\n crossOriginRect = getEmptyRect();\n } else {\n crossOriginRect = convertFromParentRect(boundingClientRect, intersectionRect);\n }\n registry.forEach(function(observer) {\n observer._checkForIntersections();\n });\n };\n }\n return crossOriginUpdater;\n};\n\n\n/**\n * Resets the cross-origin mode.\n */\nIntersectionObserver._resetCrossOriginUpdater = function() {\n crossOriginUpdater = null;\n crossOriginRect = null;\n};\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n return item.element == target;\n });\n\n if (isTargetAlreadyObserved) {\n return;\n }\n\n if (!(target && target.nodeType == 1)) {\n throw new Error('target must be an Element');\n }\n\n this._registerInstance();\n this._observationTargets.push({element: target, entry: null});\n this._monitorIntersections(target.ownerDocument);\n this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n this._observationTargets =\n this._observationTargets.filter(function(item) {\n return item.element != target;\n });\n this._unmonitorIntersections(target.ownerDocument);\n if (this._observationTargets.length == 0) {\n this._unregisterInstance();\n }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n this._observationTargets = [];\n this._unmonitorAllIntersections();\n this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n var records = this._queuedEntries.slice();\n this._queuedEntries = [];\n return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n * a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n var threshold = opt_threshold || [0];\n if (!Array.isArray(threshold)) threshold = [threshold];\n\n return threshold.sort().filter(function(t, i, a) {\n if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n throw new Error('threshold must be a number between 0 and 1 inclusively');\n }\n return t !== a[i - 1];\n });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n * defaulting to '0px'.\n * @return {Array} An array of margin objects with the keys\n * value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n var marginString = opt_rootMargin || '0px';\n var margins = marginString.split(/\\s+/).map(function(margin) {\n var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n if (!parts) {\n throw new Error('rootMargin must be specified in pixels or percent');\n }\n return {value: parseFloat(parts[1]), unit: parts[2]};\n });\n\n // Handles shorthand.\n margins[1] = margins[1] || margins[0];\n margins[2] = margins[2] || margins[0];\n margins[3] = margins[3] || margins[1];\n\n return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function(doc) {\n var win = doc.defaultView;\n if (!win) {\n // Already destroyed.\n return;\n }\n if (this._monitoringDocuments.indexOf(doc) != -1) {\n // Already monitoring.\n return;\n }\n\n // Private state for monitoring.\n var callback = this._checkForIntersections;\n var monitoringInterval = null;\n var domObserver = null;\n\n // If a poll interval is set, use polling instead of listening to\n // resize and scroll events or DOM mutations.\n if (this.POLL_INTERVAL) {\n monitoringInterval = win.setInterval(callback, this.POLL_INTERVAL);\n } else {\n addEvent(win, 'resize', callback, true);\n addEvent(doc, 'scroll', callback, true);\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in win) {\n domObserver = new win.MutationObserver(callback);\n domObserver.observe(doc, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n\n this._monitoringDocuments.push(doc);\n this._monitoringUnsubscribes.push(function() {\n // Get the window object again. When a friendly iframe is destroyed, it\n // will be null.\n var win = doc.defaultView;\n\n if (win) {\n if (monitoringInterval) {\n win.clearInterval(monitoringInterval);\n }\n removeEvent(win, 'resize', callback, true);\n }\n\n removeEvent(doc, 'scroll', callback, true);\n if (domObserver) {\n domObserver.disconnect();\n }\n });\n\n // Also monitor the parent.\n if (doc != (this.root && this.root.ownerDocument || document)) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._monitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function(doc) {\n var index = this._monitoringDocuments.indexOf(doc);\n if (index == -1) {\n return;\n }\n\n var rootDoc = (this.root && this.root.ownerDocument || document);\n\n // Check if any dependent targets are still remaining.\n var hasDependentTargets =\n this._observationTargets.some(function(item) {\n var itemDoc = item.element.ownerDocument;\n // Target is in this context.\n if (itemDoc == doc) {\n return true;\n }\n // Target is nested in this context.\n while (itemDoc && itemDoc != rootDoc) {\n var frame = getFrameElement(itemDoc);\n itemDoc = frame && frame.ownerDocument;\n if (itemDoc == doc) {\n return true;\n }\n }\n return false;\n });\n if (hasDependentTargets) {\n return;\n }\n\n // Unsubscribe.\n var unsubscribe = this._monitoringUnsubscribes[index];\n this._monitoringDocuments.splice(index, 1);\n this._monitoringUnsubscribes.splice(index, 1);\n unsubscribe();\n\n // Also unmonitor the parent.\n if (doc != rootDoc) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._unmonitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorAllIntersections = function() {\n var unsubscribes = this._monitoringUnsubscribes.slice(0);\n this._monitoringDocuments.length = 0;\n this._monitoringUnsubscribes.length = 0;\n for (var i = 0; i < unsubscribes.length; i++) {\n unsubscribes[i]();\n }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n if (!this.root && crossOriginUpdater && !crossOriginRect) {\n // Cross origin monitoring, but no initial data available yet.\n return;\n }\n\n var rootIsInDom = this._rootIsInDom();\n var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n this._observationTargets.forEach(function(item) {\n var target = item.element;\n var targetRect = getBoundingClientRect(target);\n var rootContainsTarget = this._rootContainsTarget(target);\n var oldEntry = item.entry;\n var intersectionRect = rootIsInDom && rootContainsTarget &&\n this._computeTargetAndRootIntersection(target, targetRect, rootRect);\n\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: crossOriginUpdater && !this.root ? null : rootRect,\n intersectionRect: intersectionRect\n });\n\n if (!oldEntry) {\n this._queuedEntries.push(newEntry);\n } else if (rootIsInDom && rootContainsTarget) {\n // If the new entry intersection ratio has crossed any of the\n // thresholds, add a new entry.\n if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n this._queuedEntries.push(newEntry);\n }\n } else {\n // If the root is not in the DOM or target is not contained within\n // root but the previous entry for this target had an intersection,\n // add a new record indicating removal.\n if (oldEntry && oldEntry.isIntersecting) {\n this._queuedEntries.push(newEntry);\n }\n }\n }, this);\n\n if (this._queuedEntries.length) {\n this._callback(this.takeRecords(), this);\n }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} targetRect The bounding rect of the target.\n * @param {Object} rootRect The bounding rect of the root after being\n * expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n * intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n function(target, targetRect, rootRect) {\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n\n while (!atRoot && parent) {\n var parentRect = null;\n var parentComputedStyle = parent.nodeType == 1 ?\n window.getComputedStyle(parent) : {};\n\n // If the parent isn't displayed, an intersection can't happen.\n if (parentComputedStyle.display == 'none') return null;\n\n if (parent == this.root || parent.nodeType == /* DOCUMENT */ 9) {\n atRoot = true;\n if (parent == this.root || parent == document) {\n if (crossOriginUpdater && !this.root) {\n if (!crossOriginRect ||\n crossOriginRect.width == 0 && crossOriginRect.height == 0) {\n // A 0-size cross-origin intersection means no-intersection.\n parent = null;\n parentRect = null;\n intersectionRect = null;\n } else {\n parentRect = crossOriginRect;\n }\n } else {\n parentRect = rootRect;\n }\n } else {\n // Check if there's a frame that can be navigated to.\n var frame = getParentNode(parent);\n var frameRect = frame && getBoundingClientRect(frame);\n var frameIntersect =\n frame &&\n this._computeTargetAndRootIntersection(frame, frameRect, rootRect);\n if (frameRect && frameIntersect) {\n parent = frame;\n parentRect = convertFromParentRect(frameRect, frameIntersect);\n } else {\n parent = null;\n intersectionRect = null;\n }\n }\n } else {\n // If the element has a non-visible overflow, and it's not the \n // or element, update the intersection rect.\n // Note: and cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n var doc = parent.ownerDocument;\n if (parent != doc.body &&\n parent != doc.documentElement &&\n parentComputedStyle.overflow != 'visible') {\n parentRect = getBoundingClientRect(parent);\n }\n }\n\n // If either of the above conditionals set a new parentRect,\n // calculate new intersection data.\n if (parentRect) {\n intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n }\n if (!intersectionRect) break;\n parent = parent && getParentNode(parent);\n }\n return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {ClientRect} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n var rootRect;\n if (this.root) {\n rootRect = getBoundingClientRect(this.root);\n } else {\n // Use / instead of window since scroll bars affect size.\n var html = document.documentElement;\n var body = document.body;\n rootRect = {\n top: 0,\n left: 0,\n right: html.clientWidth || body.clientWidth,\n width: html.clientWidth || body.clientWidth,\n bottom: html.clientHeight || body.clientHeight,\n height: html.clientHeight || body.clientHeight\n };\n }\n return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {DOMRect|ClientRect} rect The rect object to expand.\n * @return {ClientRect} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n var margins = this._rootMarginValues.map(function(margin, i) {\n return margin.unit == 'px' ? margin.value :\n margin.value * (i % 2 ? rect.width : rect.height) / 100;\n });\n var newRect = {\n top: rect.top - margins[0],\n right: rect.right + margins[1],\n bottom: rect.bottom + margins[2],\n left: rect.left - margins[3]\n };\n newRect.width = newRect.right - newRect.left;\n newRect.height = newRect.bottom - newRect.top;\n\n return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n * particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n * particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n function(oldEntry, newEntry) {\n\n // To make comparing easier, an entry that has a ratio of 0\n // but does not actually intersect is given a value of -1\n var oldRatio = oldEntry && oldEntry.isIntersecting ?\n oldEntry.intersectionRatio || 0 : -1;\n var newRatio = newEntry.isIntersecting ?\n newEntry.intersectionRatio || 0 : -1;\n\n // Ignore unchanged ratios\n if (oldRatio === newRatio) return;\n\n for (var i = 0; i < this.thresholds.length; i++) {\n var threshold = this.thresholds[i];\n\n // Return true if an entry matches a threshold or if the new ratio\n // and the old ratio are on the opposite sides of a threshold.\n if (threshold == oldRatio || threshold == newRatio ||\n threshold < oldRatio !== threshold < newRatio) {\n return true;\n }\n }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n return containsDeep(this.root || document, target) &&\n (!this.root || this.root.ownerDocument == target.ownerDocument);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n if (registry.indexOf(this) < 0) {\n registry.push(this);\n }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n var index = registry.indexOf(this);\n if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n * function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n var timer = null;\n return function () {\n if (!timer) {\n timer = setTimeout(function() {\n fn();\n timer = null;\n }, timeout);\n }\n };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n * phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n if (typeof node.addEventListener == 'function') {\n node.addEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.attachEvent == 'function') {\n node.attachEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n * flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n if (typeof node.removeEventListener == 'function') {\n node.removeEventListener(event, fn, opt_useCapture || false);\n }\n else if (typeof node.detatchEvent == 'function') {\n node.detatchEvent('on' + event, fn);\n }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object|?ClientRect} The intersection rect or undefined if no\n * intersection is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n var top = Math.max(rect1.top, rect2.top);\n var bottom = Math.min(rect1.bottom, rect2.bottom);\n var left = Math.max(rect1.left, rect2.left);\n var right = Math.min(rect1.right, rect2.right);\n var width = right - left;\n var height = bottom - top;\n\n return (width >= 0 && height >= 0) && {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n } || null;\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {DOMRect|ClientRect} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n var rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (err) {\n // Ignore Windows 7 IE11 \"Unspecified error\"\n // https://github.com/w3c/IntersectionObserver/pull/205\n }\n\n if (!rect) return getEmptyRect();\n\n // Older IE\n if (!(rect.width && rect.height)) {\n rect = {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n }\n return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {ClientRect} The empty rect.\n */\nfunction getEmptyRect() {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n width: 0,\n height: 0\n };\n}\n\n\n/**\n * Ensure that the result has all of the necessary fields of the DOMRect.\n * Specifically this ensures that `x` and `y` fields are set.\n *\n * @param {?DOMRect|?ClientRect} rect\n * @return {?DOMRect}\n */\nfunction ensureDOMRect(rect) {\n // A `DOMRect` object has `x` and `y` fields.\n if (!rect || 'x' in rect) {\n return rect;\n }\n // A IE's `ClientRect` type does not have `x` and `y`. The same is the case\n // for internally calculated Rect objects. For the purposes of\n // `IntersectionObserver`, it's sufficient to simply mirror `left` and `top`\n // for these fields.\n return {\n top: rect.top,\n y: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height\n };\n}\n\n\n/**\n * Inverts the intersection and bounding rect from the parent (frame) BCR to\n * the local BCR space.\n * @param {DOMRect|ClientRect} parentBoundingRect The parent's bound client rect.\n * @param {DOMRect|ClientRect} parentIntersectionRect The parent's own intersection rect.\n * @return {ClientRect} The local root bounding rect for the parent's children.\n */\nfunction convertFromParentRect(parentBoundingRect, parentIntersectionRect) {\n var top = parentIntersectionRect.top - parentBoundingRect.top;\n var left = parentIntersectionRect.left - parentBoundingRect.left;\n return {\n top: top,\n left: left,\n height: parentIntersectionRect.height,\n width: parentIntersectionRect.width,\n bottom: top + parentIntersectionRect.height,\n right: left + parentIntersectionRect.width\n };\n}\n\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n var node = child;\n while (node) {\n if (node == parent) return true;\n\n node = getParentNode(node);\n }\n return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n var parent = node.parentNode;\n\n if (node.nodeType == /* DOCUMENT */ 9 && node != document) {\n // If this node is a document node, look for the embedding frame.\n return getFrameElement(node);\n }\n\n if (parent && parent.nodeType == 11 && parent.host) {\n // If the parent is a shadow root, return the host element.\n return parent.host;\n }\n\n if (parent && parent.assignedSlot) {\n // If the parent is distributed in a , return the parent of a slot.\n return parent.assignedSlot.parentNode;\n }\n\n return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}());\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* globals jQuery */\n\nexports.lory = lory;\n\nvar _detectPrefixes = __webpack_require__(1);\n\nvar _detectPrefixes2 = _interopRequireDefault(_detectPrefixes);\n\nvar _detectSupportsPassive = __webpack_require__(2);\n\nvar _detectSupportsPassive2 = _interopRequireDefault(_detectSupportsPassive);\n\nvar _dispatchEvent = __webpack_require__(3);\n\nvar _dispatchEvent2 = _interopRequireDefault(_dispatchEvent);\n\nvar _defaults = __webpack_require__(6);\n\nvar _defaults2 = _interopRequireDefault(_defaults);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar slice = Array.prototype.slice;\n\nfunction lory(slider, opts) {\n var position = void 0;\n var slidesWidth = void 0;\n var frameWidth = void 0;\n var slides = void 0;\n\n /**\n * slider DOM elements\n */\n var frame = void 0;\n var slideContainer = void 0;\n var prevCtrl = void 0;\n var nextCtrl = void 0;\n var prefixes = void 0;\n var transitionEndCallback = void 0;\n\n var index = 0;\n var options = {};\n var touchEventParams = (0, _detectSupportsPassive2.default)() ? { passive: true } : false;\n\n /**\n * if object is jQuery convert to native DOM element\n */\n if (typeof jQuery !== 'undefined' && slider instanceof jQuery) {\n slider = slider[0];\n }\n\n /**\n * private\n * set active class to element which is the current slide\n */\n function setActiveElement(slides, currentIndex) {\n var _options = options,\n classNameActiveSlide = _options.classNameActiveSlide;\n\n\n slides.forEach(function (element, index) {\n if (element.classList.contains(classNameActiveSlide)) {\n element.classList.remove(classNameActiveSlide);\n }\n });\n\n slides[currentIndex].classList.add(classNameActiveSlide);\n }\n\n /**\n * private\n * setupInfinite: function to setup if infinite is set\n *\n * @param {array} slideArray\n * @return {array} array of updated slideContainer elements\n */\n function setupInfinite(slideArray) {\n var _options2 = options,\n infinite = _options2.infinite;\n\n\n var front = slideArray.slice(0, infinite);\n var back = slideArray.slice(slideArray.length - infinite, slideArray.length);\n\n front.forEach(function (element) {\n var cloned = element.cloneNode(true);\n\n slideContainer.appendChild(cloned);\n });\n\n back.reverse().forEach(function (element) {\n var cloned = element.cloneNode(true);\n\n slideContainer.insertBefore(cloned, slideContainer.firstChild);\n });\n\n slideContainer.addEventListener(prefixes.transitionEnd, onTransitionEnd);\n\n return slice.call(slideContainer.children);\n }\n\n /**\n * [dispatchSliderEvent description]\n * @return {[type]} [description]\n */\n function dispatchSliderEvent(phase, type, detail) {\n (0, _dispatchEvent2.default)(slider, phase + '.lory.' + type, detail);\n }\n\n /**\n * translates to a given position in a given time in milliseconds\n *\n * @to {number} number in pixels where to translate to\n * @duration {number} time in milliseconds for the transistion\n * @ease {string} easing css property\n */\n function translate(to, duration, ease) {\n var style = slideContainer && slideContainer.style;\n\n if (style) {\n style[prefixes.transition + 'TimingFunction'] = ease;\n style[prefixes.transition + 'Duration'] = duration + 'ms';\n style[prefixes.transform] = 'translateX(' + to + 'px)';\n }\n }\n\n /**\n * returns an element's width\n */\n function elementWidth(element) {\n return element.getBoundingClientRect().width || element.offsetWidth;\n }\n\n /**\n * slidefunction called by prev, next & touchend\n *\n * determine nextIndex and slide to next postion\n * under restrictions of the defined options\n *\n * @direction {boolean}\n */\n function slide(nextIndex, direction) {\n var _options3 = options,\n slideSpeed = _options3.slideSpeed,\n slidesToScroll = _options3.slidesToScroll,\n infinite = _options3.infinite,\n rewind = _options3.rewind,\n rewindPrev = _options3.rewindPrev,\n rewindSpeed = _options3.rewindSpeed,\n ease = _options3.ease,\n classNameActiveSlide = _options3.classNameActiveSlide,\n _options3$classNameDi = _options3.classNameDisabledNextCtrl,\n classNameDisabledNextCtrl = _options3$classNameDi === undefined ? 'disabled' : _options3$classNameDi,\n _options3$classNameDi2 = _options3.classNameDisabledPrevCtrl,\n classNameDisabledPrevCtrl = _options3$classNameDi2 === undefined ? 'disabled' : _options3$classNameDi2;\n\n\n var duration = slideSpeed;\n\n var nextSlide = direction ? index + 1 : index - 1;\n var maxOffset = Math.round(slidesWidth - frameWidth);\n\n dispatchSliderEvent('before', 'slide', {\n index: index,\n nextSlide: nextSlide\n });\n\n /**\n * Reset control classes\n */\n if (prevCtrl) {\n prevCtrl.classList.remove(classNameDisabledPrevCtrl);\n }\n if (nextCtrl) {\n nextCtrl.classList.remove(classNameDisabledNextCtrl);\n }\n\n if (typeof nextIndex !== 'number') {\n if (direction) {\n if (infinite && index + infinite * 2 !== slides.length) {\n nextIndex = index + (infinite - index % infinite);\n } else {\n nextIndex = index + slidesToScroll;\n }\n } else {\n if (infinite && index % infinite !== 0) {\n nextIndex = index - index % infinite;\n } else {\n nextIndex = index - slidesToScroll;\n }\n }\n }\n\n nextIndex = Math.min(Math.max(nextIndex, 0), slides.length - 1);\n\n if (infinite && direction === undefined) {\n nextIndex += infinite;\n }\n\n if (rewindPrev && Math.abs(position.x) === 0 && direction === false) {\n nextIndex = slides.length - 1;\n duration = rewindSpeed;\n }\n\n var nextOffset = Math.min(Math.max(slides[nextIndex].offsetLeft * -1, maxOffset * -1), 0);\n\n if (rewind && Math.abs(position.x) === maxOffset && direction) {\n nextOffset = 0;\n nextIndex = 0;\n duration = rewindSpeed;\n }\n\n /**\n * translate to the nextOffset by a defined duration and ease function\n */\n translate(nextOffset, duration, ease);\n\n /**\n * update the position with the next position\n */\n position.x = nextOffset;\n\n /**\n * update the index with the nextIndex only if\n * the offset of the nextIndex is in the range of the maxOffset\n */\n if (slides[nextIndex].offsetLeft <= maxOffset) {\n index = nextIndex;\n }\n\n if (infinite && (nextIndex === slides.length - infinite || nextIndex === slides.length - slides.length % infinite || nextIndex === 0)) {\n if (direction) {\n index = infinite;\n }\n\n if (!direction) {\n index = slides.length - infinite * 2;\n }\n\n position.x = slides[index].offsetLeft * -1;\n\n transitionEndCallback = function transitionEndCallback() {\n translate(slides[index].offsetLeft * -1, 0, undefined);\n };\n }\n\n if (classNameActiveSlide) {\n setActiveElement(slice.call(slides), index);\n }\n\n /**\n * update classes for next and prev arrows\n * based on user settings\n */\n if (prevCtrl && !infinite && !rewindPrev && nextIndex === 0) {\n prevCtrl.classList.add(classNameDisabledPrevCtrl);\n }\n\n if (nextCtrl && !infinite && !rewind && nextIndex + 1 === slides.length) {\n nextCtrl.classList.add(classNameDisabledNextCtrl);\n }\n\n dispatchSliderEvent('after', 'slide', {\n currentSlide: index\n });\n }\n\n /**\n * public\n * setup function\n */\n function setup() {\n dispatchSliderEvent('before', 'init');\n\n prefixes = (0, _detectPrefixes2.default)();\n options = _extends({}, _defaults2.default, opts);\n\n var _options4 = options,\n classNameFrame = _options4.classNameFrame,\n classNameSlideContainer = _options4.classNameSlideContainer,\n classNamePrevCtrl = _options4.classNamePrevCtrl,\n classNameNextCtrl = _options4.classNameNextCtrl,\n _options4$classNameDi = _options4.classNameDisabledNextCtrl,\n classNameDisabledNextCtrl = _options4$classNameDi === undefined ? 'disabled' : _options4$classNameDi,\n _options4$classNameDi2 = _options4.classNameDisabledPrevCtrl,\n classNameDisabledPrevCtrl = _options4$classNameDi2 === undefined ? 'disabled' : _options4$classNameDi2,\n enableMouseEvents = _options4.enableMouseEvents,\n classNameActiveSlide = _options4.classNameActiveSlide,\n initialIndex = _options4.initialIndex;\n\n\n index = initialIndex;\n frame = slider.getElementsByClassName(classNameFrame)[0];\n slideContainer = frame.getElementsByClassName(classNameSlideContainer)[0];\n prevCtrl = slider.getElementsByClassName(classNamePrevCtrl)[0];\n nextCtrl = slider.getElementsByClassName(classNameNextCtrl)[0];\n\n position = {\n x: slideContainer.offsetLeft,\n y: slideContainer.offsetTop\n };\n\n if (options.infinite) {\n slides = setupInfinite(slice.call(slideContainer.children));\n } else {\n slides = slice.call(slideContainer.children);\n\n if (prevCtrl && !options.rewindPrev) {\n prevCtrl.classList.add(classNameDisabledPrevCtrl);\n }\n\n if (nextCtrl && slides.length === 1 && !options.rewind) {\n nextCtrl.classList.add(classNameDisabledNextCtrl);\n }\n }\n\n reset();\n\n if (classNameActiveSlide) {\n setActiveElement(slides, index);\n }\n\n if (prevCtrl && nextCtrl) {\n prevCtrl.addEventListener('click', prev);\n nextCtrl.addEventListener('click', next);\n }\n\n frame.addEventListener('touchstart', onTouchstart, touchEventParams);\n\n if (enableMouseEvents) {\n frame.addEventListener('mousedown', onTouchstart);\n frame.addEventListener('click', onClick);\n }\n\n options.window.addEventListener('resize', onResize);\n\n dispatchSliderEvent('after', 'init');\n }\n\n /**\n * public\n * reset function: called on resize\n */\n function reset() {\n var _options5 = options,\n infinite = _options5.infinite,\n ease = _options5.ease,\n rewindSpeed = _options5.rewindSpeed,\n rewindOnResize = _options5.rewindOnResize,\n classNameActiveSlide = _options5.classNameActiveSlide,\n initialIndex = _options5.initialIndex;\n\n\n slidesWidth = elementWidth(slideContainer);\n frameWidth = elementWidth(frame);\n\n if (frameWidth === slidesWidth) {\n slidesWidth = slides.reduce(function (previousValue, slide) {\n return previousValue + elementWidth(slide);\n }, 0);\n }\n\n if (rewindOnResize) {\n index = initialIndex;\n } else {\n ease = null;\n rewindSpeed = 0;\n }\n\n if (infinite) {\n translate(slides[index + infinite].offsetLeft * -1, 0, null);\n\n index = index + infinite;\n position.x = slides[index].offsetLeft * -1;\n } else {\n translate(slides[index].offsetLeft * -1, rewindSpeed, ease);\n position.x = slides[index].offsetLeft * -1;\n }\n\n if (classNameActiveSlide) {\n setActiveElement(slice.call(slides), index);\n }\n }\n\n /**\n * public\n * slideTo: called on clickhandler\n */\n function slideTo(index) {\n slide(index);\n }\n\n /**\n * public\n * returnIndex function: called on clickhandler\n */\n function returnIndex() {\n return index - options.infinite || 0;\n }\n\n /**\n * public\n * prev function: called on clickhandler\n */\n function prev() {\n slide(false, false);\n }\n\n /**\n * public\n * next function: called on clickhandler\n */\n function next() {\n slide(false, true);\n }\n\n /**\n * public\n * destroy function: called to gracefully destroy the lory instance\n */\n function destroy() {\n dispatchSliderEvent('before', 'destroy');\n\n // remove event listeners\n frame.removeEventListener(prefixes.transitionEnd, onTransitionEnd);\n frame.removeEventListener('touchstart', onTouchstart, touchEventParams);\n frame.removeEventListener('touchmove', onTouchmove, touchEventParams);\n frame.removeEventListener('touchend', onTouchend);\n frame.removeEventListener('mousemove', onTouchmove);\n frame.removeEventListener('mousedown', onTouchstart);\n frame.removeEventListener('mouseup', onTouchend);\n frame.removeEventListener('mouseleave', onTouchend);\n frame.removeEventListener('click', onClick);\n\n options.window.removeEventListener('resize', onResize);\n\n if (prevCtrl) {\n prevCtrl.removeEventListener('click', prev);\n }\n\n if (nextCtrl) {\n nextCtrl.removeEventListener('click', next);\n }\n\n // remove cloned slides if infinite is set\n if (options.infinite) {\n Array.apply(null, Array(options.infinite)).forEach(function () {\n slideContainer.removeChild(slideContainer.firstChild);\n slideContainer.removeChild(slideContainer.lastChild);\n });\n }\n\n dispatchSliderEvent('after', 'destroy');\n }\n\n // event handling\n\n var touchOffset = void 0;\n var delta = void 0;\n var isScrolling = void 0;\n\n function onTransitionEnd() {\n if (transitionEndCallback) {\n transitionEndCallback();\n\n transitionEndCallback = undefined;\n }\n }\n\n function onTouchstart(event) {\n var _options6 = options,\n enableMouseEvents = _options6.enableMouseEvents;\n\n var touches = event.touches ? event.touches[0] : event;\n\n if (enableMouseEvents) {\n frame.addEventListener('mousemove', onTouchmove);\n frame.addEventListener('mouseup', onTouchend);\n frame.addEventListener('mouseleave', onTouchend);\n }\n\n frame.addEventListener('touchmove', onTouchmove, touchEventParams);\n frame.addEventListener('touchend', onTouchend);\n\n var pageX = touches.pageX,\n pageY = touches.pageY;\n\n\n touchOffset = {\n x: pageX,\n y: pageY,\n time: Date.now()\n };\n\n isScrolling = undefined;\n\n delta = {};\n\n dispatchSliderEvent('on', 'touchstart', {\n event: event\n });\n }\n\n function onTouchmove(event) {\n var touches = event.touches ? event.touches[0] : event;\n var pageX = touches.pageX,\n pageY = touches.pageY;\n\n\n delta = {\n x: pageX - touchOffset.x,\n y: pageY - touchOffset.y\n };\n\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(delta.x) < Math.abs(delta.y));\n }\n\n if (!isScrolling && touchOffset) {\n translate(position.x + delta.x, 0, null);\n }\n\n // may be\n dispatchSliderEvent('on', 'touchmove', {\n event: event\n });\n }\n\n function onTouchend(event) {\n /**\n * time between touchstart and touchend in milliseconds\n * @duration {number}\n */\n var duration = touchOffset ? Date.now() - touchOffset.time : undefined;\n\n /**\n * is valid if:\n *\n * -> swipe attempt time is over 300 ms\n * and\n * -> swipe distance is greater than 25px\n * or\n * -> swipe distance is more then a third of the swipe area\n *\n * @isValidSlide {Boolean}\n */\n var isValid = Number(duration) < 300 && Math.abs(delta.x) > 25 || Math.abs(delta.x) > frameWidth / 3;\n\n /**\n * is out of bounds if:\n *\n * -> index is 0 and delta x is greater than 0\n * or\n * -> index is the last slide and delta is smaller than 0\n *\n * @isOutOfBounds {Boolean}\n */\n var isOutOfBounds = !index && delta.x > 0 || index === slides.length - 1 && delta.x < 0;\n\n var direction = delta.x < 0;\n\n if (!isScrolling) {\n if (isValid && !isOutOfBounds) {\n slide(false, direction);\n } else {\n translate(position.x, options.snapBackSpeed);\n }\n }\n\n touchOffset = undefined;\n\n /**\n * remove eventlisteners after swipe attempt\n */\n frame.removeEventListener('touchmove', onTouchmove);\n frame.removeEventListener('touchend', onTouchend);\n frame.removeEventListener('mousemove', onTouchmove);\n frame.removeEventListener('mouseup', onTouchend);\n frame.removeEventListener('mouseleave', onTouchend);\n\n dispatchSliderEvent('on', 'touchend', {\n event: event\n });\n }\n\n function onClick(event) {\n if (delta.x) {\n event.preventDefault();\n }\n }\n\n function onResize(event) {\n if (frameWidth !== elementWidth(frame)) {\n reset();\n\n dispatchSliderEvent('on', 'resize', {\n event: event\n });\n }\n }\n\n // trigger initial setup\n setup();\n\n // expose public api\n return {\n setup: setup,\n reset: reset,\n slideTo: slideTo,\n returnIndex: returnIndex,\n prev: prev,\n next: next,\n destroy: destroy\n };\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = detectPrefixes;\n/**\n * Detecting prefixes for saving time and bytes\n */\nfunction detectPrefixes() {\n var transform = void 0;\n var transition = void 0;\n var transitionEnd = void 0;\n\n (function () {\n var el = document.createElement('_');\n var style = el.style;\n\n var prop = void 0;\n\n if (style[prop = 'webkitTransition'] === '') {\n transitionEnd = 'webkitTransitionEnd';\n transition = prop;\n }\n\n if (style[prop = 'transition'] === '') {\n transitionEnd = 'transitionend';\n transition = prop;\n }\n\n if (style[prop = 'webkitTransform'] === '') {\n transform = prop;\n }\n\n if (style[prop = 'msTransform'] === '') {\n transform = prop;\n }\n\n if (style[prop = 'transform'] === '') {\n transform = prop;\n }\n\n document.body.insertBefore(el, null);\n style[transform] = 'translateX(0)';\n document.body.removeChild(el);\n })();\n\n return {\n transform: transform,\n transition: transition,\n transitionEnd: transitionEnd\n };\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = detectSupportsPassive;\nfunction detectSupportsPassive() {\n var supportsPassive = false;\n\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n } catch (e) {}\n\n return supportsPassive;\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = dispatchEvent;\n\nvar _customEvent = __webpack_require__(4);\n\nvar _customEvent2 = _interopRequireDefault(_customEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * dispatch custom events\n *\n * @param {element} el slideshow element\n * @param {string} type custom event name\n * @param {object} detail custom detail information\n */\nfunction dispatchEvent(target, type, detail) {\n var event = new _customEvent2.default(type, {\n bubbles: true,\n cancelable: true,\n detail: detail\n });\n\n target.dispatchEvent(event);\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {\nvar NativeCustomEvent = global.CustomEvent;\n\nfunction useNative () {\n try {\n var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });\n return 'cat' === p.type && 'bar' === p.detail.foo;\n } catch (e) {\n }\n return false;\n}\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n *\n * @public\n */\n\nmodule.exports = useNative() ? NativeCustomEvent :\n\n// IE >= 9\n'undefined' !== typeof document && 'function' === typeof document.createEvent ? function CustomEvent (type, params) {\n var e = document.createEvent('CustomEvent');\n if (params) {\n e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n } else {\n e.initCustomEvent(type, false, false, void 0);\n }\n return e;\n} :\n\n// IE <= 8\nfunction CustomEvent (type, params) {\n var e = document.createEventObject();\n e.type = type;\n if (params) {\n e.bubbles = Boolean(params.bubbles);\n e.cancelable = Boolean(params.cancelable);\n e.detail = params.detail;\n } else {\n e.bubbles = false;\n e.cancelable = false;\n e.detail = void 0;\n }\n return e;\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5)))\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = {\n /**\n * slides scrolled at once\n * @slidesToScroll {Number}\n */\n slidesToScroll: 1,\n\n /**\n * time in milliseconds for the animation of a valid slide attempt\n * @slideSpeed {Number}\n */\n slideSpeed: 300,\n\n /**\n * time in milliseconds for the animation of the rewind after the last slide\n * @rewindSpeed {Number}\n */\n rewindSpeed: 600,\n\n /**\n * time for the snapBack of the slider if the slide attempt was not valid\n * @snapBackSpeed {Number}\n */\n snapBackSpeed: 200,\n\n /**\n * Basic easing functions: https://developer.mozilla.org/de/docs/Web/CSS/transition-timing-function\n * cubic bezier easing functions: http://easings.net/de\n * @ease {String}\n */\n ease: 'ease',\n\n /**\n * if slider reached the last slide, with next click the slider goes back to the startindex.\n * use infinite or rewind, not both\n * @rewind {Boolean}\n */\n rewind: false,\n\n /**\n * number of visible slides or false\n * use infinite or rewind, not both\n * @infinite {number}\n */\n infinite: false,\n\n /**\n * the slide index to show when the slider is initialized.\n * @initialIndex {number}\n */\n initialIndex: 0,\n\n /**\n * class name for slider frame\n * @classNameFrame {string}\n */\n classNameFrame: 'js_frame',\n\n /**\n * class name for slides container\n * @classNameSlideContainer {string}\n */\n classNameSlideContainer: 'js_slides',\n\n /**\n * class name for slider prev control\n * @classNamePrevCtrl {string}\n */\n classNamePrevCtrl: 'js_prev',\n\n /**\n * class name for slider next control\n * @classNameNextCtrl {string}\n */\n classNameNextCtrl: 'js_next',\n\n /**\n * class name for current active slide\n * if emptyString then no class is set\n * @classNameActiveSlide {string}\n */\n classNameActiveSlide: 'active',\n\n /**\n * enables mouse events for swiping on desktop devices\n * @enableMouseEvents {boolean}\n */\n enableMouseEvents: false,\n\n /**\n * window instance\n * @window {object}\n */\n window: typeof window !== 'undefined' ? window : null,\n\n /**\n * If false, slides lory to the first slide on window resize.\n * @rewindOnResize {boolean}\n */\n rewindOnResize: true\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(0);\n\n\n/***/ })\n/******/ ]);\n});","if (window.NodeList && !NodeList.prototype.forEach) {\r\n NodeList.prototype.forEach = function (callback, thisArg) {\r\n thisArg = thisArg || window;\r\n for (var i = 0; i < this.length; i++) {\r\n callback.call(thisArg, this[i], i, this);\r\n }\r\n };\r\n}\r\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n 'default': 'RFC3986',\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return value;\n }\n },\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n allowDots: false,\n allowPrototypes: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictNullHandling: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = {};\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n var parts = cleanStr.split(options.delimiter, limit);\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key, val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset);\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset);\n val = options.decoder(part.slice(pos + 1), defaults.decoder, charset);\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(val);\n }\n\n if (val && options.comma && val.indexOf(',') > -1) {\n val = val.split(',');\n }\n\n if (has.call(obj, key)) {\n obj[key] = utils.combine(obj[key], val);\n } else {\n obj[key] = val;\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n var leaf = val;\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n obj = [].concat(leaf);\n } else {\n obj = options.plainObjects ? Object.create(null) : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var index = parseInt(cleanRoot, 10);\n if (!options.parseArrays && cleanRoot === '') {\n obj = { 0: leaf };\n } else if (\n !isNaN(index)\n && root !== cleanRoot\n && String(index) === cleanRoot\n && index >= 0\n && (options.parseArrays && index <= options.arrayLimit)\n ) {\n obj = [];\n obj[index] = leaf;\n } else {\n obj[cleanRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n if (!givenKey) {\n return;\n }\n\n // Transform dot notation to bracket notation\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n // The regex chunks\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n // Get the parent\n\n var segment = brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n // Stash the parent if it exists\n\n var keys = [];\n if (parent) {\n // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys.push(parent);\n }\n\n // Loop through children appending to the array until we hit depth\n\n var i = 0;\n while ((segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n keys.push(segment[1]);\n }\n\n // If there's a remainder, just add whatever is left\n\n if (segment) {\n keys.push('[' + key.slice(segment.index) + ']');\n }\n\n return parseObject(keys, val, options);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n return {\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? Object.create(null) : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? Object.create(null) : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options);\n obj = utils.merge(obj, newObj, options);\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encoder: utils.encode,\n encodeValuesOnly: false,\n formatter: formats.formatters[formats['default']],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n object,\n prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n) {\n var obj = object;\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = obj.join(',');\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix;\n }\n\n obj = '';\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n if (isArray(obj)) {\n pushToArray(values, stringify(\n obj[key],\n typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n ));\n } else {\n pushToArray(values, stringify(\n obj[key],\n prefix + (allowDots ? '.' + key : '[' + key + ']'),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n ));\n }\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var arrayFormat;\n if (opts && opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if (opts && 'indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = 'indices';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n pushToArray(keys, stringify(\n obj[key],\n key,\n generateArrayPrefix,\n options.strictNullHandling,\n options.skipNulls,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.formatter,\n options.encodeValuesOnly,\n options.charset\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? Object.create(null) : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object') {\n if (isArray(target)) {\n target.push(source);\n } else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target.push(item);\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, decoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar encode = function encode(str, defaultEncoder, charset) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = typeof str === 'string' ? str : String(str);\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n ) {\n out += string.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n out = out + hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n out += hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b) {\n return [].concat(a, b);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isRegExp: isRegExp,\n merge: merge\n};\n",";/*! showdown v 2.1.0 - 21-04-2022 */\r\n(function(){\r\n/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts (simple) {\n 'use strict';\n\n var defaultOptions = {\n omitExtraWLInCodeBlocks: {\n defaultValue: false,\n describe: 'Omit the default extra whiteline added to code blocks',\n type: 'boolean'\n },\n noHeaderId: {\n defaultValue: false,\n describe: 'Turn on/off generated header id',\n type: 'boolean'\n },\n prefixHeaderId: {\n defaultValue: false,\n describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \\'section-\\' prefix',\n type: 'string'\n },\n rawPrefixHeaderId: {\n defaultValue: false,\n describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the \" char is used in the prefix)',\n type: 'boolean'\n },\n ghCompatibleHeaderId: {\n defaultValue: false,\n describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',\n type: 'boolean'\n },\n rawHeaderId: {\n defaultValue: false,\n describe: 'Remove only spaces, \\' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',\n type: 'boolean'\n },\n headerLevelStart: {\n defaultValue: false,\n describe: 'The header blocks level start',\n type: 'integer'\n },\n parseImgDimensions: {\n defaultValue: false,\n describe: 'Turn on/off image dimension parsing',\n type: 'boolean'\n },\n simplifiedAutoLink: {\n defaultValue: false,\n describe: 'Turn on/off GFM autolink style',\n type: 'boolean'\n },\n excludeTrailingPunctuationFromURLs: {\n defaultValue: false,\n describe: 'Excludes trailing punctuation from links generated with autoLinking',\n type: 'boolean'\n },\n literalMidWordUnderscores: {\n defaultValue: false,\n describe: 'Parse midword underscores as literal underscores',\n type: 'boolean'\n },\n literalMidWordAsterisks: {\n defaultValue: false,\n describe: 'Parse midword asterisks as literal asterisks',\n type: 'boolean'\n },\n strikethrough: {\n defaultValue: false,\n describe: 'Turn on/off strikethrough support',\n type: 'boolean'\n },\n tables: {\n defaultValue: false,\n describe: 'Turn on/off tables support',\n type: 'boolean'\n },\n tablesHeaderId: {\n defaultValue: false,\n describe: 'Add an id to table headers',\n type: 'boolean'\n },\n ghCodeBlocks: {\n defaultValue: true,\n describe: 'Turn on/off GFM fenced code blocks support',\n type: 'boolean'\n },\n tasklists: {\n defaultValue: false,\n describe: 'Turn on/off GFM tasklist support',\n type: 'boolean'\n },\n smoothLivePreview: {\n defaultValue: false,\n describe: 'Prevents weird effects in live previews due to incomplete input',\n type: 'boolean'\n },\n smartIndentationFix: {\n defaultValue: false,\n describe: 'Tries to smartly fix indentation in es6 strings',\n type: 'boolean'\n },\n disableForced4SpacesIndentedSublists: {\n defaultValue: false,\n describe: 'Disables the requirement of indenting nested sublists by 4 spaces',\n type: 'boolean'\n },\n simpleLineBreaks: {\n defaultValue: false,\n describe: 'Parses simple line breaks as
    (GFM Style)',\n type: 'boolean'\n },\n requireSpaceBeforeHeadingText: {\n defaultValue: false,\n describe: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n type: 'boolean'\n },\n ghMentions: {\n defaultValue: false,\n describe: 'Enables github @mentions',\n type: 'boolean'\n },\n ghMentionsLink: {\n defaultValue: 'https://github.com/{u}',\n describe: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',\n type: 'string'\n },\n encodeEmails: {\n defaultValue: true,\n describe: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',\n type: 'boolean'\n },\n openLinksInNewWindow: {\n defaultValue: false,\n describe: 'Open all links in new windows',\n type: 'boolean'\n },\n backslashEscapesHTMLTags: {\n defaultValue: false,\n describe: 'Support for HTML Tag escaping. ex: \\
    foo\\
    ',\n type: 'boolean'\n },\n emoji: {\n defaultValue: false,\n describe: 'Enable emoji support. Ex: `this is a :smile: emoji`',\n type: 'boolean'\n },\n underline: {\n defaultValue: false,\n describe: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``',\n type: 'boolean'\n },\n ellipsis: {\n defaultValue: true,\n describe: 'Replaces three dots with the ellipsis unicode character',\n type: 'boolean'\n },\n completeHTMLDocument: {\n defaultValue: false,\n describe: 'Outputs a complete html document, including ``, `` and `` tags',\n type: 'boolean'\n },\n metadata: {\n defaultValue: false,\n describe: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',\n type: 'boolean'\n },\n splitAdjacentBlockquotes: {\n defaultValue: false,\n describe: 'Split adjacent blockquote blocks',\n type: 'boolean'\n }\n };\n if (simple === false) {\n return JSON.parse(JSON.stringify(defaultOptions));\n }\n var ret = {};\n for (var opt in defaultOptions) {\n if (defaultOptions.hasOwnProperty(opt)) {\n ret[opt] = defaultOptions[opt].defaultValue;\n }\n }\n return ret;\n}\n\nfunction allOptionsOn () {\n 'use strict';\n var options = getDefaultOpts(true),\n ret = {};\n for (var opt in options) {\n if (options.hasOwnProperty(opt)) {\n ret[opt] = true;\n }\n }\n return ret;\n}\n\r\n/**\n * Created by Tivie on 06-01-2015.\n */\n\n// Private properties\nvar showdown = {},\n parsers = {},\n extensions = {},\n globalOptions = getDefaultOpts(true),\n setFlavor = 'vanilla',\n flavor = {\n github: {\n omitExtraWLInCodeBlocks: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n disableForced4SpacesIndentedSublists: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghCompatibleHeaderId: true,\n ghMentions: true,\n backslashEscapesHTMLTags: true,\n emoji: true,\n splitAdjacentBlockquotes: true\n },\n original: {\n noHeaderId: true,\n ghCodeBlocks: false\n },\n ghost: {\n omitExtraWLInCodeBlocks: true,\n parseImgDimensions: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n smoothLivePreview: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghMentions: false,\n encodeEmails: true\n },\n vanilla: getDefaultOpts(true),\n allOn: allOptionsOn()\n };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n 'use strict';\n globalOptions[key] = value;\n return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n 'use strict';\n return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n 'use strict';\n return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n 'use strict';\n globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n 'use strict';\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n showdown.resetOptions();\n var preset = flavor[name];\n setFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n globalOptions[option] = preset[option];\n }\n }\n};\n\n/**\n * Get the currently set flavor\n * @returns {string}\n */\nshowdown.getFlavor = function () {\n 'use strict';\n return setFlavor;\n};\n\n/**\n * Get the options of a specified flavor. Returns undefined if the flavor was not found\n * @param {string} name Name of the flavor\n * @returns {{}|undefined}\n */\nshowdown.getFlavorOptions = function (name) {\n 'use strict';\n if (flavor.hasOwnProperty(name)) {\n return flavor[name];\n }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n 'use strict';\n return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name) - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n 'use strict';\n if (showdown.helper.isString(name)) {\n if (typeof func !== 'undefined') {\n parsers[name] = func;\n } else {\n if (parsers.hasOwnProperty(name)) {\n return parsers[name];\n } else {\n throw Error('SubParser named ' + name + ' not registered!');\n }\n }\n }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|object[]|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n 'use strict';\n\n if (!showdown.helper.isString(name)) {\n throw Error('Extension \\'name\\' must be a string');\n }\n\n name = showdown.helper.stdExtName(name);\n\n // Getter\n if (showdown.helper.isUndefined(ext)) {\n if (!extensions.hasOwnProperty(name)) {\n throw Error('Extension named ' + name + ' is not registered!');\n }\n return extensions[name];\n\n // Setter\n } else {\n // Expand extension if it's wrapped in a function\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n // Ensure extension is an array\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExtension = validate(ext, name);\n\n if (validExtension.valid) {\n extensions[name] = ext;\n } else {\n throw Error(validExtension.error);\n }\n }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n 'use strict';\n return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n 'use strict';\n delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n 'use strict';\n extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate (extension, name) {\n 'use strict';\n\n var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n ret = {\n valid: true,\n error: ''\n };\n\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n\n for (var i = 0; i < extension.length; ++i) {\n var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n ext = extension[i];\n if (typeof ext !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n return ret;\n }\n\n if (!showdown.helper.isString(ext.type)) {\n ret.valid = false;\n ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n return ret;\n }\n\n var type = ext.type = ext.type.toLowerCase();\n\n // normalize extension type\n if (type === 'language') {\n type = ext.type = 'lang';\n }\n\n if (type === 'html') {\n type = ext.type = 'output';\n }\n\n if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n ret.valid = false;\n ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n return ret;\n }\n\n if (type === 'listener') {\n if (showdown.helper.isUndefined(ext.listeners)) {\n ret.valid = false;\n ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n return ret;\n }\n } else {\n if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n ret.valid = false;\n ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n return ret;\n }\n }\n\n if (ext.listeners) {\n if (typeof ext.listeners !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n return ret;\n }\n for (var ln in ext.listeners) {\n if (ext.listeners.hasOwnProperty(ln)) {\n if (typeof ext.listeners[ln] !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n return ret;\n }\n }\n }\n }\n\n if (ext.filter) {\n if (typeof ext.filter !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n return ret;\n }\n } else if (ext.regex) {\n if (showdown.helper.isString(ext.regex)) {\n ext.regex = new RegExp(ext.regex, 'g');\n }\n if (!(ext.regex instanceof RegExp)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n return ret;\n }\n if (showdown.helper.isUndefined(ext.replace)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n return ret;\n }\n }\n }\n return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n 'use strict';\n\n var validateExtension = validate(ext, null);\n if (!validateExtension.valid) {\n console.warn(validateExtension.error);\n return false;\n }\n return true;\n};\n\r\n/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n showdown.helper = {};\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function (a) {\n 'use strict';\n return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function (a) {\n 'use strict';\n var getType = {};\n return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function (a) {\n 'use strict';\n return Array.isArray(a);\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function (value) {\n 'use strict';\n return typeof value === 'undefined';\n};\n\n/**\n * ForEach helper function\n * Iterates over Arrays and Objects (own properties only)\n * @static\n * @param {*} obj\n * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object\n */\nshowdown.helper.forEach = function (obj, callback) {\n 'use strict';\n // check if obj is defined\n if (showdown.helper.isUndefined(obj)) {\n throw new Error('obj param is required');\n }\n\n if (showdown.helper.isUndefined(callback)) {\n throw new Error('callback param is required');\n }\n\n if (!showdown.helper.isFunction(callback)) {\n throw new Error('callback param must be a function/closure');\n }\n\n if (typeof obj.forEach === 'function') {\n obj.forEach(callback);\n } else if (showdown.helper.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n callback(obj[i], i, obj);\n }\n } else if (typeof (obj) === 'object') {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n callback(obj[prop], prop, obj);\n }\n }\n } else {\n throw new Error('obj does not seem to be an array or an iterable object');\n }\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n 'use strict';\n return s.replace(/[_?*+\\/\\\\.^-]/g, '').replace(/\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback (wholeMatch, m1) {\n 'use strict';\n var charCodeToEscape = m1.charCodeAt(0);\n return '¨E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {XML|string|void|*}\n */\nshowdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {\n 'use strict';\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n if (afterBackslash) {\n regexString = '\\\\\\\\' + regexString;\n }\n\n var regex = new RegExp(regexString, 'g');\n text = text.replace(regex, escapeCharactersCallback);\n\n return text;\n};\n\n/**\n * Unescape HTML entities\n * @param txt\n * @returns {string}\n */\nshowdown.helper.unescapeHTMLEntities = function (txt) {\n 'use strict';\n\n return txt\n .replace(/"/g, '\"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&');\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n 'use strict';\n var f = flags || '',\n g = f.indexOf('g') > -1,\n x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n l = new RegExp(left, f.replace(/g/g, '')),\n pos = [],\n t, s, m, start, end;\n\n do {\n t = 0;\n while ((m = x.exec(str))) {\n if (l.test(m[0])) {\n if (!(t++)) {\n s = x.lastIndex;\n start = s - m[0].length;\n }\n } else if (t) {\n if (!--t) {\n end = m.index + m[0].length;\n var obj = {\n left: {start: start, end: s},\n match: {start: s, end: m.index},\n right: {start: m.index, end: end},\n wholeMatch: {start: start, end: end}\n };\n pos.push(obj);\n if (!g) {\n return pos;\n }\n }\n }\n }\n } while (t && (x.lastIndex = s));\n\n return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan \n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<\" and \">\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\">>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<>\", \"\"]\n * matchRecursiveRegExp(\"
    test
    \", \"]*>\", \"\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n 'use strict';\n\n var matchPos = rgxFindMatchPos (str, left, right, flags),\n results = [];\n\n for (var i = 0; i < matchPos.length; ++i) {\n results.push([\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n ]);\n }\n return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n 'use strict';\n\n if (!showdown.helper.isFunction(replacement)) {\n var repStr = replacement;\n replacement = function () {\n return repStr;\n };\n }\n\n var matchPos = rgxFindMatchPos(str, left, right, flags),\n finalStr = str,\n lng = matchPos.length;\n\n if (lng > 0) {\n var bits = [];\n if (matchPos[0].wholeMatch.start !== 0) {\n bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n }\n for (var i = 0; i < lng; ++i) {\n bits.push(\n replacement(\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n )\n );\n if (i < lng - 1) {\n bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n }\n }\n if (matchPos[lng - 1].wholeMatch.end < str.length) {\n bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n }\n finalStr = bits.join('');\n }\n return finalStr;\n};\n\n/**\n * Returns the index within the passed String object of the first occurrence of the specified regex,\n * starting the search at fromIndex. Returns -1 if the value is not found.\n *\n * @param {string} str string to search\n * @param {RegExp} regex Regular expression to search\n * @param {int} [fromIndex = 0] Index to start the search\n * @returns {Number}\n * @throws InvalidArgumentError\n */\nshowdown.helper.regexIndexOf = function (str, regex, fromIndex) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n if (regex instanceof RegExp === false) {\n throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';\n }\n var indexOf = str.substring(fromIndex || 0).search(regex);\n return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;\n};\n\n/**\n * Splits the passed string object at the defined index, and returns an array composed of the two substrings\n * @param {string} str string to split\n * @param {int} index index to split string at\n * @returns {[string,string]}\n * @throws InvalidArgumentError\n */\nshowdown.helper.splitAtIndex = function (str, index) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n return [str.substring(0, index), str.substring(index)];\n};\n\n/**\n * Obfuscate an e-mail address through the use of Character Entities,\n * transforming ASCII characters into their equivalent decimal or hex entities.\n *\n * Since it has a random component, subsequent calls to this function produce different results\n *\n * @param {string} mail\n * @returns {string}\n */\nshowdown.helper.encodeEmailAddress = function (mail) {\n 'use strict';\n var encode = [\n function (ch) {\n return '&#' + ch.charCodeAt(0) + ';';\n },\n function (ch) {\n return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n },\n function (ch) {\n return ch;\n }\n ];\n\n mail = mail.replace(/./g, function (ch) {\n if (ch === '@') {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else {\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = (\n r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n );\n }\n return ch;\n });\n\n return mail;\n};\n\n/**\n *\n * @param str\n * @param targetLength\n * @param padString\n * @returns {string}\n */\nshowdown.helper.padEnd = function padEnd (str, targetLength, padString) {\n 'use strict';\n /*jshint bitwise: false*/\n // eslint-disable-next-line space-infix-ops\n targetLength = targetLength>>0; //floor if number or convert non-number to 0;\n /*jshint bitwise: true*/\n padString = String(padString || ' ');\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed\n }\n return String(str) + padString.slice(0,targetLength);\n }\n};\n\n/**\n * POLYFILLS\n */\n// use this instead of builtin is undefined for IE8 compatibility\nif (typeof (console) === 'undefined') {\n console = {\n warn: function (msg) {\n 'use strict';\n alert(msg);\n },\n log: function (msg) {\n 'use strict';\n alert(msg);\n },\n error: function (msg) {\n 'use strict';\n throw msg;\n }\n };\n}\n\n/**\n * Common regexes.\n * We declare some common regexes to improve performance\n */\nshowdown.helper.regexes = {\n asteriskDashAndColon: /([*_:~])/g\n};\n\n/**\n * EMOJIS LIST\n */\nshowdown.helper.emojis = {\n '+1':'\\ud83d\\udc4d',\n '-1':'\\ud83d\\udc4e',\n '100':'\\ud83d\\udcaf',\n '1234':'\\ud83d\\udd22',\n '1st_place_medal':'\\ud83e\\udd47',\n '2nd_place_medal':'\\ud83e\\udd48',\n '3rd_place_medal':'\\ud83e\\udd49',\n '8ball':'\\ud83c\\udfb1',\n 'a':'\\ud83c\\udd70\\ufe0f',\n 'ab':'\\ud83c\\udd8e',\n 'abc':'\\ud83d\\udd24',\n 'abcd':'\\ud83d\\udd21',\n 'accept':'\\ud83c\\ude51',\n 'aerial_tramway':'\\ud83d\\udea1',\n 'airplane':'\\u2708\\ufe0f',\n 'alarm_clock':'\\u23f0',\n 'alembic':'\\u2697\\ufe0f',\n 'alien':'\\ud83d\\udc7d',\n 'ambulance':'\\ud83d\\ude91',\n 'amphora':'\\ud83c\\udffa',\n 'anchor':'\\u2693\\ufe0f',\n 'angel':'\\ud83d\\udc7c',\n 'anger':'\\ud83d\\udca2',\n 'angry':'\\ud83d\\ude20',\n 'anguished':'\\ud83d\\ude27',\n 'ant':'\\ud83d\\udc1c',\n 'apple':'\\ud83c\\udf4e',\n 'aquarius':'\\u2652\\ufe0f',\n 'aries':'\\u2648\\ufe0f',\n 'arrow_backward':'\\u25c0\\ufe0f',\n 'arrow_double_down':'\\u23ec',\n 'arrow_double_up':'\\u23eb',\n 'arrow_down':'\\u2b07\\ufe0f',\n 'arrow_down_small':'\\ud83d\\udd3d',\n 'arrow_forward':'\\u25b6\\ufe0f',\n 'arrow_heading_down':'\\u2935\\ufe0f',\n 'arrow_heading_up':'\\u2934\\ufe0f',\n 'arrow_left':'\\u2b05\\ufe0f',\n 'arrow_lower_left':'\\u2199\\ufe0f',\n 'arrow_lower_right':'\\u2198\\ufe0f',\n 'arrow_right':'\\u27a1\\ufe0f',\n 'arrow_right_hook':'\\u21aa\\ufe0f',\n 'arrow_up':'\\u2b06\\ufe0f',\n 'arrow_up_down':'\\u2195\\ufe0f',\n 'arrow_up_small':'\\ud83d\\udd3c',\n 'arrow_upper_left':'\\u2196\\ufe0f',\n 'arrow_upper_right':'\\u2197\\ufe0f',\n 'arrows_clockwise':'\\ud83d\\udd03',\n 'arrows_counterclockwise':'\\ud83d\\udd04',\n 'art':'\\ud83c\\udfa8',\n 'articulated_lorry':'\\ud83d\\ude9b',\n 'artificial_satellite':'\\ud83d\\udef0',\n 'astonished':'\\ud83d\\ude32',\n 'athletic_shoe':'\\ud83d\\udc5f',\n 'atm':'\\ud83c\\udfe7',\n 'atom_symbol':'\\u269b\\ufe0f',\n 'avocado':'\\ud83e\\udd51',\n 'b':'\\ud83c\\udd71\\ufe0f',\n 'baby':'\\ud83d\\udc76',\n 'baby_bottle':'\\ud83c\\udf7c',\n 'baby_chick':'\\ud83d\\udc24',\n 'baby_symbol':'\\ud83d\\udebc',\n 'back':'\\ud83d\\udd19',\n 'bacon':'\\ud83e\\udd53',\n 'badminton':'\\ud83c\\udff8',\n 'baggage_claim':'\\ud83d\\udec4',\n 'baguette_bread':'\\ud83e\\udd56',\n 'balance_scale':'\\u2696\\ufe0f',\n 'balloon':'\\ud83c\\udf88',\n 'ballot_box':'\\ud83d\\uddf3',\n 'ballot_box_with_check':'\\u2611\\ufe0f',\n 'bamboo':'\\ud83c\\udf8d',\n 'banana':'\\ud83c\\udf4c',\n 'bangbang':'\\u203c\\ufe0f',\n 'bank':'\\ud83c\\udfe6',\n 'bar_chart':'\\ud83d\\udcca',\n 'barber':'\\ud83d\\udc88',\n 'baseball':'\\u26be\\ufe0f',\n 'basketball':'\\ud83c\\udfc0',\n 'basketball_man':'\\u26f9\\ufe0f',\n 'basketball_woman':'\\u26f9\\ufe0f‍\\u2640\\ufe0f',\n 'bat':'\\ud83e\\udd87',\n 'bath':'\\ud83d\\udec0',\n 'bathtub':'\\ud83d\\udec1',\n 'battery':'\\ud83d\\udd0b',\n 'beach_umbrella':'\\ud83c\\udfd6',\n 'bear':'\\ud83d\\udc3b',\n 'bed':'\\ud83d\\udecf',\n 'bee':'\\ud83d\\udc1d',\n 'beer':'\\ud83c\\udf7a',\n 'beers':'\\ud83c\\udf7b',\n 'beetle':'\\ud83d\\udc1e',\n 'beginner':'\\ud83d\\udd30',\n 'bell':'\\ud83d\\udd14',\n 'bellhop_bell':'\\ud83d\\udece',\n 'bento':'\\ud83c\\udf71',\n 'biking_man':'\\ud83d\\udeb4',\n 'bike':'\\ud83d\\udeb2',\n 'biking_woman':'\\ud83d\\udeb4‍\\u2640\\ufe0f',\n 'bikini':'\\ud83d\\udc59',\n 'biohazard':'\\u2623\\ufe0f',\n 'bird':'\\ud83d\\udc26',\n 'birthday':'\\ud83c\\udf82',\n 'black_circle':'\\u26ab\\ufe0f',\n 'black_flag':'\\ud83c\\udff4',\n 'black_heart':'\\ud83d\\udda4',\n 'black_joker':'\\ud83c\\udccf',\n 'black_large_square':'\\u2b1b\\ufe0f',\n 'black_medium_small_square':'\\u25fe\\ufe0f',\n 'black_medium_square':'\\u25fc\\ufe0f',\n 'black_nib':'\\u2712\\ufe0f',\n 'black_small_square':'\\u25aa\\ufe0f',\n 'black_square_button':'\\ud83d\\udd32',\n 'blonde_man':'\\ud83d\\udc71',\n 'blonde_woman':'\\ud83d\\udc71‍\\u2640\\ufe0f',\n 'blossom':'\\ud83c\\udf3c',\n 'blowfish':'\\ud83d\\udc21',\n 'blue_book':'\\ud83d\\udcd8',\n 'blue_car':'\\ud83d\\ude99',\n 'blue_heart':'\\ud83d\\udc99',\n 'blush':'\\ud83d\\ude0a',\n 'boar':'\\ud83d\\udc17',\n 'boat':'\\u26f5\\ufe0f',\n 'bomb':'\\ud83d\\udca3',\n 'book':'\\ud83d\\udcd6',\n 'bookmark':'\\ud83d\\udd16',\n 'bookmark_tabs':'\\ud83d\\udcd1',\n 'books':'\\ud83d\\udcda',\n 'boom':'\\ud83d\\udca5',\n 'boot':'\\ud83d\\udc62',\n 'bouquet':'\\ud83d\\udc90',\n 'bowing_man':'\\ud83d\\ude47',\n 'bow_and_arrow':'\\ud83c\\udff9',\n 'bowing_woman':'\\ud83d\\ude47‍\\u2640\\ufe0f',\n 'bowling':'\\ud83c\\udfb3',\n 'boxing_glove':'\\ud83e\\udd4a',\n 'boy':'\\ud83d\\udc66',\n 'bread':'\\ud83c\\udf5e',\n 'bride_with_veil':'\\ud83d\\udc70',\n 'bridge_at_night':'\\ud83c\\udf09',\n 'briefcase':'\\ud83d\\udcbc',\n 'broken_heart':'\\ud83d\\udc94',\n 'bug':'\\ud83d\\udc1b',\n 'building_construction':'\\ud83c\\udfd7',\n 'bulb':'\\ud83d\\udca1',\n 'bullettrain_front':'\\ud83d\\ude85',\n 'bullettrain_side':'\\ud83d\\ude84',\n 'burrito':'\\ud83c\\udf2f',\n 'bus':'\\ud83d\\ude8c',\n 'business_suit_levitating':'\\ud83d\\udd74',\n 'busstop':'\\ud83d\\ude8f',\n 'bust_in_silhouette':'\\ud83d\\udc64',\n 'busts_in_silhouette':'\\ud83d\\udc65',\n 'butterfly':'\\ud83e\\udd8b',\n 'cactus':'\\ud83c\\udf35',\n 'cake':'\\ud83c\\udf70',\n 'calendar':'\\ud83d\\udcc6',\n 'call_me_hand':'\\ud83e\\udd19',\n 'calling':'\\ud83d\\udcf2',\n 'camel':'\\ud83d\\udc2b',\n 'camera':'\\ud83d\\udcf7',\n 'camera_flash':'\\ud83d\\udcf8',\n 'camping':'\\ud83c\\udfd5',\n 'cancer':'\\u264b\\ufe0f',\n 'candle':'\\ud83d\\udd6f',\n 'candy':'\\ud83c\\udf6c',\n 'canoe':'\\ud83d\\udef6',\n 'capital_abcd':'\\ud83d\\udd20',\n 'capricorn':'\\u2651\\ufe0f',\n 'car':'\\ud83d\\ude97',\n 'card_file_box':'\\ud83d\\uddc3',\n 'card_index':'\\ud83d\\udcc7',\n 'card_index_dividers':'\\ud83d\\uddc2',\n 'carousel_horse':'\\ud83c\\udfa0',\n 'carrot':'\\ud83e\\udd55',\n 'cat':'\\ud83d\\udc31',\n 'cat2':'\\ud83d\\udc08',\n 'cd':'\\ud83d\\udcbf',\n 'chains':'\\u26d3',\n 'champagne':'\\ud83c\\udf7e',\n 'chart':'\\ud83d\\udcb9',\n 'chart_with_downwards_trend':'\\ud83d\\udcc9',\n 'chart_with_upwards_trend':'\\ud83d\\udcc8',\n 'checkered_flag':'\\ud83c\\udfc1',\n 'cheese':'\\ud83e\\uddc0',\n 'cherries':'\\ud83c\\udf52',\n 'cherry_blossom':'\\ud83c\\udf38',\n 'chestnut':'\\ud83c\\udf30',\n 'chicken':'\\ud83d\\udc14',\n 'children_crossing':'\\ud83d\\udeb8',\n 'chipmunk':'\\ud83d\\udc3f',\n 'chocolate_bar':'\\ud83c\\udf6b',\n 'christmas_tree':'\\ud83c\\udf84',\n 'church':'\\u26ea\\ufe0f',\n 'cinema':'\\ud83c\\udfa6',\n 'circus_tent':'\\ud83c\\udfaa',\n 'city_sunrise':'\\ud83c\\udf07',\n 'city_sunset':'\\ud83c\\udf06',\n 'cityscape':'\\ud83c\\udfd9',\n 'cl':'\\ud83c\\udd91',\n 'clamp':'\\ud83d\\udddc',\n 'clap':'\\ud83d\\udc4f',\n 'clapper':'\\ud83c\\udfac',\n 'classical_building':'\\ud83c\\udfdb',\n 'clinking_glasses':'\\ud83e\\udd42',\n 'clipboard':'\\ud83d\\udccb',\n 'clock1':'\\ud83d\\udd50',\n 'clock10':'\\ud83d\\udd59',\n 'clock1030':'\\ud83d\\udd65',\n 'clock11':'\\ud83d\\udd5a',\n 'clock1130':'\\ud83d\\udd66',\n 'clock12':'\\ud83d\\udd5b',\n 'clock1230':'\\ud83d\\udd67',\n 'clock130':'\\ud83d\\udd5c',\n 'clock2':'\\ud83d\\udd51',\n 'clock230':'\\ud83d\\udd5d',\n 'clock3':'\\ud83d\\udd52',\n 'clock330':'\\ud83d\\udd5e',\n 'clock4':'\\ud83d\\udd53',\n 'clock430':'\\ud83d\\udd5f',\n 'clock5':'\\ud83d\\udd54',\n 'clock530':'\\ud83d\\udd60',\n 'clock6':'\\ud83d\\udd55',\n 'clock630':'\\ud83d\\udd61',\n 'clock7':'\\ud83d\\udd56',\n 'clock730':'\\ud83d\\udd62',\n 'clock8':'\\ud83d\\udd57',\n 'clock830':'\\ud83d\\udd63',\n 'clock9':'\\ud83d\\udd58',\n 'clock930':'\\ud83d\\udd64',\n 'closed_book':'\\ud83d\\udcd5',\n 'closed_lock_with_key':'\\ud83d\\udd10',\n 'closed_umbrella':'\\ud83c\\udf02',\n 'cloud':'\\u2601\\ufe0f',\n 'cloud_with_lightning':'\\ud83c\\udf29',\n 'cloud_with_lightning_and_rain':'\\u26c8',\n 'cloud_with_rain':'\\ud83c\\udf27',\n 'cloud_with_snow':'\\ud83c\\udf28',\n 'clown_face':'\\ud83e\\udd21',\n 'clubs':'\\u2663\\ufe0f',\n 'cocktail':'\\ud83c\\udf78',\n 'coffee':'\\u2615\\ufe0f',\n 'coffin':'\\u26b0\\ufe0f',\n 'cold_sweat':'\\ud83d\\ude30',\n 'comet':'\\u2604\\ufe0f',\n 'computer':'\\ud83d\\udcbb',\n 'computer_mouse':'\\ud83d\\uddb1',\n 'confetti_ball':'\\ud83c\\udf8a',\n 'confounded':'\\ud83d\\ude16',\n 'confused':'\\ud83d\\ude15',\n 'congratulations':'\\u3297\\ufe0f',\n 'construction':'\\ud83d\\udea7',\n 'construction_worker_man':'\\ud83d\\udc77',\n 'construction_worker_woman':'\\ud83d\\udc77‍\\u2640\\ufe0f',\n 'control_knobs':'\\ud83c\\udf9b',\n 'convenience_store':'\\ud83c\\udfea',\n 'cookie':'\\ud83c\\udf6a',\n 'cool':'\\ud83c\\udd92',\n 'policeman':'\\ud83d\\udc6e',\n 'copyright':'\\u00a9\\ufe0f',\n 'corn':'\\ud83c\\udf3d',\n 'couch_and_lamp':'\\ud83d\\udecb',\n 'couple':'\\ud83d\\udc6b',\n 'couple_with_heart_woman_man':'\\ud83d\\udc91',\n 'couple_with_heart_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc68',\n 'couple_with_heart_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc69',\n 'couplekiss_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc68',\n 'couplekiss_man_woman':'\\ud83d\\udc8f',\n 'couplekiss_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc69',\n 'cow':'\\ud83d\\udc2e',\n 'cow2':'\\ud83d\\udc04',\n 'cowboy_hat_face':'\\ud83e\\udd20',\n 'crab':'\\ud83e\\udd80',\n 'crayon':'\\ud83d\\udd8d',\n 'credit_card':'\\ud83d\\udcb3',\n 'crescent_moon':'\\ud83c\\udf19',\n 'cricket':'\\ud83c\\udfcf',\n 'crocodile':'\\ud83d\\udc0a',\n 'croissant':'\\ud83e\\udd50',\n 'crossed_fingers':'\\ud83e\\udd1e',\n 'crossed_flags':'\\ud83c\\udf8c',\n 'crossed_swords':'\\u2694\\ufe0f',\n 'crown':'\\ud83d\\udc51',\n 'cry':'\\ud83d\\ude22',\n 'crying_cat_face':'\\ud83d\\ude3f',\n 'crystal_ball':'\\ud83d\\udd2e',\n 'cucumber':'\\ud83e\\udd52',\n 'cupid':'\\ud83d\\udc98',\n 'curly_loop':'\\u27b0',\n 'currency_exchange':'\\ud83d\\udcb1',\n 'curry':'\\ud83c\\udf5b',\n 'custard':'\\ud83c\\udf6e',\n 'customs':'\\ud83d\\udec3',\n 'cyclone':'\\ud83c\\udf00',\n 'dagger':'\\ud83d\\udde1',\n 'dancer':'\\ud83d\\udc83',\n 'dancing_women':'\\ud83d\\udc6f',\n 'dancing_men':'\\ud83d\\udc6f‍\\u2642\\ufe0f',\n 'dango':'\\ud83c\\udf61',\n 'dark_sunglasses':'\\ud83d\\udd76',\n 'dart':'\\ud83c\\udfaf',\n 'dash':'\\ud83d\\udca8',\n 'date':'\\ud83d\\udcc5',\n 'deciduous_tree':'\\ud83c\\udf33',\n 'deer':'\\ud83e\\udd8c',\n 'department_store':'\\ud83c\\udfec',\n 'derelict_house':'\\ud83c\\udfda',\n 'desert':'\\ud83c\\udfdc',\n 'desert_island':'\\ud83c\\udfdd',\n 'desktop_computer':'\\ud83d\\udda5',\n 'male_detective':'\\ud83d\\udd75\\ufe0f',\n 'diamond_shape_with_a_dot_inside':'\\ud83d\\udca0',\n 'diamonds':'\\u2666\\ufe0f',\n 'disappointed':'\\ud83d\\ude1e',\n 'disappointed_relieved':'\\ud83d\\ude25',\n 'dizzy':'\\ud83d\\udcab',\n 'dizzy_face':'\\ud83d\\ude35',\n 'do_not_litter':'\\ud83d\\udeaf',\n 'dog':'\\ud83d\\udc36',\n 'dog2':'\\ud83d\\udc15',\n 'dollar':'\\ud83d\\udcb5',\n 'dolls':'\\ud83c\\udf8e',\n 'dolphin':'\\ud83d\\udc2c',\n 'door':'\\ud83d\\udeaa',\n 'doughnut':'\\ud83c\\udf69',\n 'dove':'\\ud83d\\udd4a',\n 'dragon':'\\ud83d\\udc09',\n 'dragon_face':'\\ud83d\\udc32',\n 'dress':'\\ud83d\\udc57',\n 'dromedary_camel':'\\ud83d\\udc2a',\n 'drooling_face':'\\ud83e\\udd24',\n 'droplet':'\\ud83d\\udca7',\n 'drum':'\\ud83e\\udd41',\n 'duck':'\\ud83e\\udd86',\n 'dvd':'\\ud83d\\udcc0',\n 'e-mail':'\\ud83d\\udce7',\n 'eagle':'\\ud83e\\udd85',\n 'ear':'\\ud83d\\udc42',\n 'ear_of_rice':'\\ud83c\\udf3e',\n 'earth_africa':'\\ud83c\\udf0d',\n 'earth_americas':'\\ud83c\\udf0e',\n 'earth_asia':'\\ud83c\\udf0f',\n 'egg':'\\ud83e\\udd5a',\n 'eggplant':'\\ud83c\\udf46',\n 'eight_pointed_black_star':'\\u2734\\ufe0f',\n 'eight_spoked_asterisk':'\\u2733\\ufe0f',\n 'electric_plug':'\\ud83d\\udd0c',\n 'elephant':'\\ud83d\\udc18',\n 'email':'\\u2709\\ufe0f',\n 'end':'\\ud83d\\udd1a',\n 'envelope_with_arrow':'\\ud83d\\udce9',\n 'euro':'\\ud83d\\udcb6',\n 'european_castle':'\\ud83c\\udff0',\n 'european_post_office':'\\ud83c\\udfe4',\n 'evergreen_tree':'\\ud83c\\udf32',\n 'exclamation':'\\u2757\\ufe0f',\n 'expressionless':'\\ud83d\\ude11',\n 'eye':'\\ud83d\\udc41',\n 'eye_speech_bubble':'\\ud83d\\udc41‍\\ud83d\\udde8',\n 'eyeglasses':'\\ud83d\\udc53',\n 'eyes':'\\ud83d\\udc40',\n 'face_with_head_bandage':'\\ud83e\\udd15',\n 'face_with_thermometer':'\\ud83e\\udd12',\n 'fist_oncoming':'\\ud83d\\udc4a',\n 'factory':'\\ud83c\\udfed',\n 'fallen_leaf':'\\ud83c\\udf42',\n 'family_man_woman_boy':'\\ud83d\\udc6a',\n 'family_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_woman_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_woman_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_man_woman_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_woman_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'fast_forward':'\\u23e9',\n 'fax':'\\ud83d\\udce0',\n 'fearful':'\\ud83d\\ude28',\n 'feet':'\\ud83d\\udc3e',\n 'female_detective':'\\ud83d\\udd75\\ufe0f‍\\u2640\\ufe0f',\n 'ferris_wheel':'\\ud83c\\udfa1',\n 'ferry':'\\u26f4',\n 'field_hockey':'\\ud83c\\udfd1',\n 'file_cabinet':'\\ud83d\\uddc4',\n 'file_folder':'\\ud83d\\udcc1',\n 'film_projector':'\\ud83d\\udcfd',\n 'film_strip':'\\ud83c\\udf9e',\n 'fire':'\\ud83d\\udd25',\n 'fire_engine':'\\ud83d\\ude92',\n 'fireworks':'\\ud83c\\udf86',\n 'first_quarter_moon':'\\ud83c\\udf13',\n 'first_quarter_moon_with_face':'\\ud83c\\udf1b',\n 'fish':'\\ud83d\\udc1f',\n 'fish_cake':'\\ud83c\\udf65',\n 'fishing_pole_and_fish':'\\ud83c\\udfa3',\n 'fist_raised':'\\u270a',\n 'fist_left':'\\ud83e\\udd1b',\n 'fist_right':'\\ud83e\\udd1c',\n 'flags':'\\ud83c\\udf8f',\n 'flashlight':'\\ud83d\\udd26',\n 'fleur_de_lis':'\\u269c\\ufe0f',\n 'flight_arrival':'\\ud83d\\udeec',\n 'flight_departure':'\\ud83d\\udeeb',\n 'floppy_disk':'\\ud83d\\udcbe',\n 'flower_playing_cards':'\\ud83c\\udfb4',\n 'flushed':'\\ud83d\\ude33',\n 'fog':'\\ud83c\\udf2b',\n 'foggy':'\\ud83c\\udf01',\n 'football':'\\ud83c\\udfc8',\n 'footprints':'\\ud83d\\udc63',\n 'fork_and_knife':'\\ud83c\\udf74',\n 'fountain':'\\u26f2\\ufe0f',\n 'fountain_pen':'\\ud83d\\udd8b',\n 'four_leaf_clover':'\\ud83c\\udf40',\n 'fox_face':'\\ud83e\\udd8a',\n 'framed_picture':'\\ud83d\\uddbc',\n 'free':'\\ud83c\\udd93',\n 'fried_egg':'\\ud83c\\udf73',\n 'fried_shrimp':'\\ud83c\\udf64',\n 'fries':'\\ud83c\\udf5f',\n 'frog':'\\ud83d\\udc38',\n 'frowning':'\\ud83d\\ude26',\n 'frowning_face':'\\u2639\\ufe0f',\n 'frowning_man':'\\ud83d\\ude4d‍\\u2642\\ufe0f',\n 'frowning_woman':'\\ud83d\\ude4d',\n 'middle_finger':'\\ud83d\\udd95',\n 'fuelpump':'\\u26fd\\ufe0f',\n 'full_moon':'\\ud83c\\udf15',\n 'full_moon_with_face':'\\ud83c\\udf1d',\n 'funeral_urn':'\\u26b1\\ufe0f',\n 'game_die':'\\ud83c\\udfb2',\n 'gear':'\\u2699\\ufe0f',\n 'gem':'\\ud83d\\udc8e',\n 'gemini':'\\u264a\\ufe0f',\n 'ghost':'\\ud83d\\udc7b',\n 'gift':'\\ud83c\\udf81',\n 'gift_heart':'\\ud83d\\udc9d',\n 'girl':'\\ud83d\\udc67',\n 'globe_with_meridians':'\\ud83c\\udf10',\n 'goal_net':'\\ud83e\\udd45',\n 'goat':'\\ud83d\\udc10',\n 'golf':'\\u26f3\\ufe0f',\n 'golfing_man':'\\ud83c\\udfcc\\ufe0f',\n 'golfing_woman':'\\ud83c\\udfcc\\ufe0f‍\\u2640\\ufe0f',\n 'gorilla':'\\ud83e\\udd8d',\n 'grapes':'\\ud83c\\udf47',\n 'green_apple':'\\ud83c\\udf4f',\n 'green_book':'\\ud83d\\udcd7',\n 'green_heart':'\\ud83d\\udc9a',\n 'green_salad':'\\ud83e\\udd57',\n 'grey_exclamation':'\\u2755',\n 'grey_question':'\\u2754',\n 'grimacing':'\\ud83d\\ude2c',\n 'grin':'\\ud83d\\ude01',\n 'grinning':'\\ud83d\\ude00',\n 'guardsman':'\\ud83d\\udc82',\n 'guardswoman':'\\ud83d\\udc82‍\\u2640\\ufe0f',\n 'guitar':'\\ud83c\\udfb8',\n 'gun':'\\ud83d\\udd2b',\n 'haircut_woman':'\\ud83d\\udc87',\n 'haircut_man':'\\ud83d\\udc87‍\\u2642\\ufe0f',\n 'hamburger':'\\ud83c\\udf54',\n 'hammer':'\\ud83d\\udd28',\n 'hammer_and_pick':'\\u2692',\n 'hammer_and_wrench':'\\ud83d\\udee0',\n 'hamster':'\\ud83d\\udc39',\n 'hand':'\\u270b',\n 'handbag':'\\ud83d\\udc5c',\n 'handshake':'\\ud83e\\udd1d',\n 'hankey':'\\ud83d\\udca9',\n 'hatched_chick':'\\ud83d\\udc25',\n 'hatching_chick':'\\ud83d\\udc23',\n 'headphones':'\\ud83c\\udfa7',\n 'hear_no_evil':'\\ud83d\\ude49',\n 'heart':'\\u2764\\ufe0f',\n 'heart_decoration':'\\ud83d\\udc9f',\n 'heart_eyes':'\\ud83d\\ude0d',\n 'heart_eyes_cat':'\\ud83d\\ude3b',\n 'heartbeat':'\\ud83d\\udc93',\n 'heartpulse':'\\ud83d\\udc97',\n 'hearts':'\\u2665\\ufe0f',\n 'heavy_check_mark':'\\u2714\\ufe0f',\n 'heavy_division_sign':'\\u2797',\n 'heavy_dollar_sign':'\\ud83d\\udcb2',\n 'heavy_heart_exclamation':'\\u2763\\ufe0f',\n 'heavy_minus_sign':'\\u2796',\n 'heavy_multiplication_x':'\\u2716\\ufe0f',\n 'heavy_plus_sign':'\\u2795',\n 'helicopter':'\\ud83d\\ude81',\n 'herb':'\\ud83c\\udf3f',\n 'hibiscus':'\\ud83c\\udf3a',\n 'high_brightness':'\\ud83d\\udd06',\n 'high_heel':'\\ud83d\\udc60',\n 'hocho':'\\ud83d\\udd2a',\n 'hole':'\\ud83d\\udd73',\n 'honey_pot':'\\ud83c\\udf6f',\n 'horse':'\\ud83d\\udc34',\n 'horse_racing':'\\ud83c\\udfc7',\n 'hospital':'\\ud83c\\udfe5',\n 'hot_pepper':'\\ud83c\\udf36',\n 'hotdog':'\\ud83c\\udf2d',\n 'hotel':'\\ud83c\\udfe8',\n 'hotsprings':'\\u2668\\ufe0f',\n 'hourglass':'\\u231b\\ufe0f',\n 'hourglass_flowing_sand':'\\u23f3',\n 'house':'\\ud83c\\udfe0',\n 'house_with_garden':'\\ud83c\\udfe1',\n 'houses':'\\ud83c\\udfd8',\n 'hugs':'\\ud83e\\udd17',\n 'hushed':'\\ud83d\\ude2f',\n 'ice_cream':'\\ud83c\\udf68',\n 'ice_hockey':'\\ud83c\\udfd2',\n 'ice_skate':'\\u26f8',\n 'icecream':'\\ud83c\\udf66',\n 'id':'\\ud83c\\udd94',\n 'ideograph_advantage':'\\ud83c\\ude50',\n 'imp':'\\ud83d\\udc7f',\n 'inbox_tray':'\\ud83d\\udce5',\n 'incoming_envelope':'\\ud83d\\udce8',\n 'tipping_hand_woman':'\\ud83d\\udc81',\n 'information_source':'\\u2139\\ufe0f',\n 'innocent':'\\ud83d\\ude07',\n 'interrobang':'\\u2049\\ufe0f',\n 'iphone':'\\ud83d\\udcf1',\n 'izakaya_lantern':'\\ud83c\\udfee',\n 'jack_o_lantern':'\\ud83c\\udf83',\n 'japan':'\\ud83d\\uddfe',\n 'japanese_castle':'\\ud83c\\udfef',\n 'japanese_goblin':'\\ud83d\\udc7a',\n 'japanese_ogre':'\\ud83d\\udc79',\n 'jeans':'\\ud83d\\udc56',\n 'joy':'\\ud83d\\ude02',\n 'joy_cat':'\\ud83d\\ude39',\n 'joystick':'\\ud83d\\udd79',\n 'kaaba':'\\ud83d\\udd4b',\n 'key':'\\ud83d\\udd11',\n 'keyboard':'\\u2328\\ufe0f',\n 'keycap_ten':'\\ud83d\\udd1f',\n 'kick_scooter':'\\ud83d\\udef4',\n 'kimono':'\\ud83d\\udc58',\n 'kiss':'\\ud83d\\udc8b',\n 'kissing':'\\ud83d\\ude17',\n 'kissing_cat':'\\ud83d\\ude3d',\n 'kissing_closed_eyes':'\\ud83d\\ude1a',\n 'kissing_heart':'\\ud83d\\ude18',\n 'kissing_smiling_eyes':'\\ud83d\\ude19',\n 'kiwi_fruit':'\\ud83e\\udd5d',\n 'koala':'\\ud83d\\udc28',\n 'koko':'\\ud83c\\ude01',\n 'label':'\\ud83c\\udff7',\n 'large_blue_circle':'\\ud83d\\udd35',\n 'large_blue_diamond':'\\ud83d\\udd37',\n 'large_orange_diamond':'\\ud83d\\udd36',\n 'last_quarter_moon':'\\ud83c\\udf17',\n 'last_quarter_moon_with_face':'\\ud83c\\udf1c',\n 'latin_cross':'\\u271d\\ufe0f',\n 'laughing':'\\ud83d\\ude06',\n 'leaves':'\\ud83c\\udf43',\n 'ledger':'\\ud83d\\udcd2',\n 'left_luggage':'\\ud83d\\udec5',\n 'left_right_arrow':'\\u2194\\ufe0f',\n 'leftwards_arrow_with_hook':'\\u21a9\\ufe0f',\n 'lemon':'\\ud83c\\udf4b',\n 'leo':'\\u264c\\ufe0f',\n 'leopard':'\\ud83d\\udc06',\n 'level_slider':'\\ud83c\\udf9a',\n 'libra':'\\u264e\\ufe0f',\n 'light_rail':'\\ud83d\\ude88',\n 'link':'\\ud83d\\udd17',\n 'lion':'\\ud83e\\udd81',\n 'lips':'\\ud83d\\udc44',\n 'lipstick':'\\ud83d\\udc84',\n 'lizard':'\\ud83e\\udd8e',\n 'lock':'\\ud83d\\udd12',\n 'lock_with_ink_pen':'\\ud83d\\udd0f',\n 'lollipop':'\\ud83c\\udf6d',\n 'loop':'\\u27bf',\n 'loud_sound':'\\ud83d\\udd0a',\n 'loudspeaker':'\\ud83d\\udce2',\n 'love_hotel':'\\ud83c\\udfe9',\n 'love_letter':'\\ud83d\\udc8c',\n 'low_brightness':'\\ud83d\\udd05',\n 'lying_face':'\\ud83e\\udd25',\n 'm':'\\u24c2\\ufe0f',\n 'mag':'\\ud83d\\udd0d',\n 'mag_right':'\\ud83d\\udd0e',\n 'mahjong':'\\ud83c\\udc04\\ufe0f',\n 'mailbox':'\\ud83d\\udceb',\n 'mailbox_closed':'\\ud83d\\udcea',\n 'mailbox_with_mail':'\\ud83d\\udcec',\n 'mailbox_with_no_mail':'\\ud83d\\udced',\n 'man':'\\ud83d\\udc68',\n 'man_artist':'\\ud83d\\udc68‍\\ud83c\\udfa8',\n 'man_astronaut':'\\ud83d\\udc68‍\\ud83d\\ude80',\n 'man_cartwheeling':'\\ud83e\\udd38‍\\u2642\\ufe0f',\n 'man_cook':'\\ud83d\\udc68‍\\ud83c\\udf73',\n 'man_dancing':'\\ud83d\\udd7a',\n 'man_facepalming':'\\ud83e\\udd26‍\\u2642\\ufe0f',\n 'man_factory_worker':'\\ud83d\\udc68‍\\ud83c\\udfed',\n 'man_farmer':'\\ud83d\\udc68‍\\ud83c\\udf3e',\n 'man_firefighter':'\\ud83d\\udc68‍\\ud83d\\ude92',\n 'man_health_worker':'\\ud83d\\udc68‍\\u2695\\ufe0f',\n 'man_in_tuxedo':'\\ud83e\\udd35',\n 'man_judge':'\\ud83d\\udc68‍\\u2696\\ufe0f',\n 'man_juggling':'\\ud83e\\udd39‍\\u2642\\ufe0f',\n 'man_mechanic':'\\ud83d\\udc68‍\\ud83d\\udd27',\n 'man_office_worker':'\\ud83d\\udc68‍\\ud83d\\udcbc',\n 'man_pilot':'\\ud83d\\udc68‍\\u2708\\ufe0f',\n 'man_playing_handball':'\\ud83e\\udd3e‍\\u2642\\ufe0f',\n 'man_playing_water_polo':'\\ud83e\\udd3d‍\\u2642\\ufe0f',\n 'man_scientist':'\\ud83d\\udc68‍\\ud83d\\udd2c',\n 'man_shrugging':'\\ud83e\\udd37‍\\u2642\\ufe0f',\n 'man_singer':'\\ud83d\\udc68‍\\ud83c\\udfa4',\n 'man_student':'\\ud83d\\udc68‍\\ud83c\\udf93',\n 'man_teacher':'\\ud83d\\udc68‍\\ud83c\\udfeb',\n 'man_technologist':'\\ud83d\\udc68‍\\ud83d\\udcbb',\n 'man_with_gua_pi_mao':'\\ud83d\\udc72',\n 'man_with_turban':'\\ud83d\\udc73',\n 'tangerine':'\\ud83c\\udf4a',\n 'mans_shoe':'\\ud83d\\udc5e',\n 'mantelpiece_clock':'\\ud83d\\udd70',\n 'maple_leaf':'\\ud83c\\udf41',\n 'martial_arts_uniform':'\\ud83e\\udd4b',\n 'mask':'\\ud83d\\ude37',\n 'massage_woman':'\\ud83d\\udc86',\n 'massage_man':'\\ud83d\\udc86‍\\u2642\\ufe0f',\n 'meat_on_bone':'\\ud83c\\udf56',\n 'medal_military':'\\ud83c\\udf96',\n 'medal_sports':'\\ud83c\\udfc5',\n 'mega':'\\ud83d\\udce3',\n 'melon':'\\ud83c\\udf48',\n 'memo':'\\ud83d\\udcdd',\n 'men_wrestling':'\\ud83e\\udd3c‍\\u2642\\ufe0f',\n 'menorah':'\\ud83d\\udd4e',\n 'mens':'\\ud83d\\udeb9',\n 'metal':'\\ud83e\\udd18',\n 'metro':'\\ud83d\\ude87',\n 'microphone':'\\ud83c\\udfa4',\n 'microscope':'\\ud83d\\udd2c',\n 'milk_glass':'\\ud83e\\udd5b',\n 'milky_way':'\\ud83c\\udf0c',\n 'minibus':'\\ud83d\\ude90',\n 'minidisc':'\\ud83d\\udcbd',\n 'mobile_phone_off':'\\ud83d\\udcf4',\n 'money_mouth_face':'\\ud83e\\udd11',\n 'money_with_wings':'\\ud83d\\udcb8',\n 'moneybag':'\\ud83d\\udcb0',\n 'monkey':'\\ud83d\\udc12',\n 'monkey_face':'\\ud83d\\udc35',\n 'monorail':'\\ud83d\\ude9d',\n 'moon':'\\ud83c\\udf14',\n 'mortar_board':'\\ud83c\\udf93',\n 'mosque':'\\ud83d\\udd4c',\n 'motor_boat':'\\ud83d\\udee5',\n 'motor_scooter':'\\ud83d\\udef5',\n 'motorcycle':'\\ud83c\\udfcd',\n 'motorway':'\\ud83d\\udee3',\n 'mount_fuji':'\\ud83d\\uddfb',\n 'mountain':'\\u26f0',\n 'mountain_biking_man':'\\ud83d\\udeb5',\n 'mountain_biking_woman':'\\ud83d\\udeb5‍\\u2640\\ufe0f',\n 'mountain_cableway':'\\ud83d\\udea0',\n 'mountain_railway':'\\ud83d\\ude9e',\n 'mountain_snow':'\\ud83c\\udfd4',\n 'mouse':'\\ud83d\\udc2d',\n 'mouse2':'\\ud83d\\udc01',\n 'movie_camera':'\\ud83c\\udfa5',\n 'moyai':'\\ud83d\\uddff',\n 'mrs_claus':'\\ud83e\\udd36',\n 'muscle':'\\ud83d\\udcaa',\n 'mushroom':'\\ud83c\\udf44',\n 'musical_keyboard':'\\ud83c\\udfb9',\n 'musical_note':'\\ud83c\\udfb5',\n 'musical_score':'\\ud83c\\udfbc',\n 'mute':'\\ud83d\\udd07',\n 'nail_care':'\\ud83d\\udc85',\n 'name_badge':'\\ud83d\\udcdb',\n 'national_park':'\\ud83c\\udfde',\n 'nauseated_face':'\\ud83e\\udd22',\n 'necktie':'\\ud83d\\udc54',\n 'negative_squared_cross_mark':'\\u274e',\n 'nerd_face':'\\ud83e\\udd13',\n 'neutral_face':'\\ud83d\\ude10',\n 'new':'\\ud83c\\udd95',\n 'new_moon':'\\ud83c\\udf11',\n 'new_moon_with_face':'\\ud83c\\udf1a',\n 'newspaper':'\\ud83d\\udcf0',\n 'newspaper_roll':'\\ud83d\\uddde',\n 'next_track_button':'\\u23ed',\n 'ng':'\\ud83c\\udd96',\n 'no_good_man':'\\ud83d\\ude45‍\\u2642\\ufe0f',\n 'no_good_woman':'\\ud83d\\ude45',\n 'night_with_stars':'\\ud83c\\udf03',\n 'no_bell':'\\ud83d\\udd15',\n 'no_bicycles':'\\ud83d\\udeb3',\n 'no_entry':'\\u26d4\\ufe0f',\n 'no_entry_sign':'\\ud83d\\udeab',\n 'no_mobile_phones':'\\ud83d\\udcf5',\n 'no_mouth':'\\ud83d\\ude36',\n 'no_pedestrians':'\\ud83d\\udeb7',\n 'no_smoking':'\\ud83d\\udead',\n 'non-potable_water':'\\ud83d\\udeb1',\n 'nose':'\\ud83d\\udc43',\n 'notebook':'\\ud83d\\udcd3',\n 'notebook_with_decorative_cover':'\\ud83d\\udcd4',\n 'notes':'\\ud83c\\udfb6',\n 'nut_and_bolt':'\\ud83d\\udd29',\n 'o':'\\u2b55\\ufe0f',\n 'o2':'\\ud83c\\udd7e\\ufe0f',\n 'ocean':'\\ud83c\\udf0a',\n 'octopus':'\\ud83d\\udc19',\n 'oden':'\\ud83c\\udf62',\n 'office':'\\ud83c\\udfe2',\n 'oil_drum':'\\ud83d\\udee2',\n 'ok':'\\ud83c\\udd97',\n 'ok_hand':'\\ud83d\\udc4c',\n 'ok_man':'\\ud83d\\ude46‍\\u2642\\ufe0f',\n 'ok_woman':'\\ud83d\\ude46',\n 'old_key':'\\ud83d\\udddd',\n 'older_man':'\\ud83d\\udc74',\n 'older_woman':'\\ud83d\\udc75',\n 'om':'\\ud83d\\udd49',\n 'on':'\\ud83d\\udd1b',\n 'oncoming_automobile':'\\ud83d\\ude98',\n 'oncoming_bus':'\\ud83d\\ude8d',\n 'oncoming_police_car':'\\ud83d\\ude94',\n 'oncoming_taxi':'\\ud83d\\ude96',\n 'open_file_folder':'\\ud83d\\udcc2',\n 'open_hands':'\\ud83d\\udc50',\n 'open_mouth':'\\ud83d\\ude2e',\n 'open_umbrella':'\\u2602\\ufe0f',\n 'ophiuchus':'\\u26ce',\n 'orange_book':'\\ud83d\\udcd9',\n 'orthodox_cross':'\\u2626\\ufe0f',\n 'outbox_tray':'\\ud83d\\udce4',\n 'owl':'\\ud83e\\udd89',\n 'ox':'\\ud83d\\udc02',\n 'package':'\\ud83d\\udce6',\n 'page_facing_up':'\\ud83d\\udcc4',\n 'page_with_curl':'\\ud83d\\udcc3',\n 'pager':'\\ud83d\\udcdf',\n 'paintbrush':'\\ud83d\\udd8c',\n 'palm_tree':'\\ud83c\\udf34',\n 'pancakes':'\\ud83e\\udd5e',\n 'panda_face':'\\ud83d\\udc3c',\n 'paperclip':'\\ud83d\\udcce',\n 'paperclips':'\\ud83d\\udd87',\n 'parasol_on_ground':'\\u26f1',\n 'parking':'\\ud83c\\udd7f\\ufe0f',\n 'part_alternation_mark':'\\u303d\\ufe0f',\n 'partly_sunny':'\\u26c5\\ufe0f',\n 'passenger_ship':'\\ud83d\\udef3',\n 'passport_control':'\\ud83d\\udec2',\n 'pause_button':'\\u23f8',\n 'peace_symbol':'\\u262e\\ufe0f',\n 'peach':'\\ud83c\\udf51',\n 'peanuts':'\\ud83e\\udd5c',\n 'pear':'\\ud83c\\udf50',\n 'pen':'\\ud83d\\udd8a',\n 'pencil2':'\\u270f\\ufe0f',\n 'penguin':'\\ud83d\\udc27',\n 'pensive':'\\ud83d\\ude14',\n 'performing_arts':'\\ud83c\\udfad',\n 'persevere':'\\ud83d\\ude23',\n 'person_fencing':'\\ud83e\\udd3a',\n 'pouting_woman':'\\ud83d\\ude4e',\n 'phone':'\\u260e\\ufe0f',\n 'pick':'\\u26cf',\n 'pig':'\\ud83d\\udc37',\n 'pig2':'\\ud83d\\udc16',\n 'pig_nose':'\\ud83d\\udc3d',\n 'pill':'\\ud83d\\udc8a',\n 'pineapple':'\\ud83c\\udf4d',\n 'ping_pong':'\\ud83c\\udfd3',\n 'pisces':'\\u2653\\ufe0f',\n 'pizza':'\\ud83c\\udf55',\n 'place_of_worship':'\\ud83d\\uded0',\n 'plate_with_cutlery':'\\ud83c\\udf7d',\n 'play_or_pause_button':'\\u23ef',\n 'point_down':'\\ud83d\\udc47',\n 'point_left':'\\ud83d\\udc48',\n 'point_right':'\\ud83d\\udc49',\n 'point_up':'\\u261d\\ufe0f',\n 'point_up_2':'\\ud83d\\udc46',\n 'police_car':'\\ud83d\\ude93',\n 'policewoman':'\\ud83d\\udc6e‍\\u2640\\ufe0f',\n 'poodle':'\\ud83d\\udc29',\n 'popcorn':'\\ud83c\\udf7f',\n 'post_office':'\\ud83c\\udfe3',\n 'postal_horn':'\\ud83d\\udcef',\n 'postbox':'\\ud83d\\udcee',\n 'potable_water':'\\ud83d\\udeb0',\n 'potato':'\\ud83e\\udd54',\n 'pouch':'\\ud83d\\udc5d',\n 'poultry_leg':'\\ud83c\\udf57',\n 'pound':'\\ud83d\\udcb7',\n 'rage':'\\ud83d\\ude21',\n 'pouting_cat':'\\ud83d\\ude3e',\n 'pouting_man':'\\ud83d\\ude4e‍\\u2642\\ufe0f',\n 'pray':'\\ud83d\\ude4f',\n 'prayer_beads':'\\ud83d\\udcff',\n 'pregnant_woman':'\\ud83e\\udd30',\n 'previous_track_button':'\\u23ee',\n 'prince':'\\ud83e\\udd34',\n 'princess':'\\ud83d\\udc78',\n 'printer':'\\ud83d\\udda8',\n 'purple_heart':'\\ud83d\\udc9c',\n 'purse':'\\ud83d\\udc5b',\n 'pushpin':'\\ud83d\\udccc',\n 'put_litter_in_its_place':'\\ud83d\\udeae',\n 'question':'\\u2753',\n 'rabbit':'\\ud83d\\udc30',\n 'rabbit2':'\\ud83d\\udc07',\n 'racehorse':'\\ud83d\\udc0e',\n 'racing_car':'\\ud83c\\udfce',\n 'radio':'\\ud83d\\udcfb',\n 'radio_button':'\\ud83d\\udd18',\n 'radioactive':'\\u2622\\ufe0f',\n 'railway_car':'\\ud83d\\ude83',\n 'railway_track':'\\ud83d\\udee4',\n 'rainbow':'\\ud83c\\udf08',\n 'rainbow_flag':'\\ud83c\\udff3\\ufe0f‍\\ud83c\\udf08',\n 'raised_back_of_hand':'\\ud83e\\udd1a',\n 'raised_hand_with_fingers_splayed':'\\ud83d\\udd90',\n 'raised_hands':'\\ud83d\\ude4c',\n 'raising_hand_woman':'\\ud83d\\ude4b',\n 'raising_hand_man':'\\ud83d\\ude4b‍\\u2642\\ufe0f',\n 'ram':'\\ud83d\\udc0f',\n 'ramen':'\\ud83c\\udf5c',\n 'rat':'\\ud83d\\udc00',\n 'record_button':'\\u23fa',\n 'recycle':'\\u267b\\ufe0f',\n 'red_circle':'\\ud83d\\udd34',\n 'registered':'\\u00ae\\ufe0f',\n 'relaxed':'\\u263a\\ufe0f',\n 'relieved':'\\ud83d\\ude0c',\n 'reminder_ribbon':'\\ud83c\\udf97',\n 'repeat':'\\ud83d\\udd01',\n 'repeat_one':'\\ud83d\\udd02',\n 'rescue_worker_helmet':'\\u26d1',\n 'restroom':'\\ud83d\\udebb',\n 'revolving_hearts':'\\ud83d\\udc9e',\n 'rewind':'\\u23ea',\n 'rhinoceros':'\\ud83e\\udd8f',\n 'ribbon':'\\ud83c\\udf80',\n 'rice':'\\ud83c\\udf5a',\n 'rice_ball':'\\ud83c\\udf59',\n 'rice_cracker':'\\ud83c\\udf58',\n 'rice_scene':'\\ud83c\\udf91',\n 'right_anger_bubble':'\\ud83d\\uddef',\n 'ring':'\\ud83d\\udc8d',\n 'robot':'\\ud83e\\udd16',\n 'rocket':'\\ud83d\\ude80',\n 'rofl':'\\ud83e\\udd23',\n 'roll_eyes':'\\ud83d\\ude44',\n 'roller_coaster':'\\ud83c\\udfa2',\n 'rooster':'\\ud83d\\udc13',\n 'rose':'\\ud83c\\udf39',\n 'rosette':'\\ud83c\\udff5',\n 'rotating_light':'\\ud83d\\udea8',\n 'round_pushpin':'\\ud83d\\udccd',\n 'rowing_man':'\\ud83d\\udea3',\n 'rowing_woman':'\\ud83d\\udea3‍\\u2640\\ufe0f',\n 'rugby_football':'\\ud83c\\udfc9',\n 'running_man':'\\ud83c\\udfc3',\n 'running_shirt_with_sash':'\\ud83c\\udfbd',\n 'running_woman':'\\ud83c\\udfc3‍\\u2640\\ufe0f',\n 'sa':'\\ud83c\\ude02\\ufe0f',\n 'sagittarius':'\\u2650\\ufe0f',\n 'sake':'\\ud83c\\udf76',\n 'sandal':'\\ud83d\\udc61',\n 'santa':'\\ud83c\\udf85',\n 'satellite':'\\ud83d\\udce1',\n 'saxophone':'\\ud83c\\udfb7',\n 'school':'\\ud83c\\udfeb',\n 'school_satchel':'\\ud83c\\udf92',\n 'scissors':'\\u2702\\ufe0f',\n 'scorpion':'\\ud83e\\udd82',\n 'scorpius':'\\u264f\\ufe0f',\n 'scream':'\\ud83d\\ude31',\n 'scream_cat':'\\ud83d\\ude40',\n 'scroll':'\\ud83d\\udcdc',\n 'seat':'\\ud83d\\udcba',\n 'secret':'\\u3299\\ufe0f',\n 'see_no_evil':'\\ud83d\\ude48',\n 'seedling':'\\ud83c\\udf31',\n 'selfie':'\\ud83e\\udd33',\n 'shallow_pan_of_food':'\\ud83e\\udd58',\n 'shamrock':'\\u2618\\ufe0f',\n 'shark':'\\ud83e\\udd88',\n 'shaved_ice':'\\ud83c\\udf67',\n 'sheep':'\\ud83d\\udc11',\n 'shell':'\\ud83d\\udc1a',\n 'shield':'\\ud83d\\udee1',\n 'shinto_shrine':'\\u26e9',\n 'ship':'\\ud83d\\udea2',\n 'shirt':'\\ud83d\\udc55',\n 'shopping':'\\ud83d\\udecd',\n 'shopping_cart':'\\ud83d\\uded2',\n 'shower':'\\ud83d\\udebf',\n 'shrimp':'\\ud83e\\udd90',\n 'signal_strength':'\\ud83d\\udcf6',\n 'six_pointed_star':'\\ud83d\\udd2f',\n 'ski':'\\ud83c\\udfbf',\n 'skier':'\\u26f7',\n 'skull':'\\ud83d\\udc80',\n 'skull_and_crossbones':'\\u2620\\ufe0f',\n 'sleeping':'\\ud83d\\ude34',\n 'sleeping_bed':'\\ud83d\\udecc',\n 'sleepy':'\\ud83d\\ude2a',\n 'slightly_frowning_face':'\\ud83d\\ude41',\n 'slightly_smiling_face':'\\ud83d\\ude42',\n 'slot_machine':'\\ud83c\\udfb0',\n 'small_airplane':'\\ud83d\\udee9',\n 'small_blue_diamond':'\\ud83d\\udd39',\n 'small_orange_diamond':'\\ud83d\\udd38',\n 'small_red_triangle':'\\ud83d\\udd3a',\n 'small_red_triangle_down':'\\ud83d\\udd3b',\n 'smile':'\\ud83d\\ude04',\n 'smile_cat':'\\ud83d\\ude38',\n 'smiley':'\\ud83d\\ude03',\n 'smiley_cat':'\\ud83d\\ude3a',\n 'smiling_imp':'\\ud83d\\ude08',\n 'smirk':'\\ud83d\\ude0f',\n 'smirk_cat':'\\ud83d\\ude3c',\n 'smoking':'\\ud83d\\udeac',\n 'snail':'\\ud83d\\udc0c',\n 'snake':'\\ud83d\\udc0d',\n 'sneezing_face':'\\ud83e\\udd27',\n 'snowboarder':'\\ud83c\\udfc2',\n 'snowflake':'\\u2744\\ufe0f',\n 'snowman':'\\u26c4\\ufe0f',\n 'snowman_with_snow':'\\u2603\\ufe0f',\n 'sob':'\\ud83d\\ude2d',\n 'soccer':'\\u26bd\\ufe0f',\n 'soon':'\\ud83d\\udd1c',\n 'sos':'\\ud83c\\udd98',\n 'sound':'\\ud83d\\udd09',\n 'space_invader':'\\ud83d\\udc7e',\n 'spades':'\\u2660\\ufe0f',\n 'spaghetti':'\\ud83c\\udf5d',\n 'sparkle':'\\u2747\\ufe0f',\n 'sparkler':'\\ud83c\\udf87',\n 'sparkles':'\\u2728',\n 'sparkling_heart':'\\ud83d\\udc96',\n 'speak_no_evil':'\\ud83d\\ude4a',\n 'speaker':'\\ud83d\\udd08',\n 'speaking_head':'\\ud83d\\udde3',\n 'speech_balloon':'\\ud83d\\udcac',\n 'speedboat':'\\ud83d\\udea4',\n 'spider':'\\ud83d\\udd77',\n 'spider_web':'\\ud83d\\udd78',\n 'spiral_calendar':'\\ud83d\\uddd3',\n 'spiral_notepad':'\\ud83d\\uddd2',\n 'spoon':'\\ud83e\\udd44',\n 'squid':'\\ud83e\\udd91',\n 'stadium':'\\ud83c\\udfdf',\n 'star':'\\u2b50\\ufe0f',\n 'star2':'\\ud83c\\udf1f',\n 'star_and_crescent':'\\u262a\\ufe0f',\n 'star_of_david':'\\u2721\\ufe0f',\n 'stars':'\\ud83c\\udf20',\n 'station':'\\ud83d\\ude89',\n 'statue_of_liberty':'\\ud83d\\uddfd',\n 'steam_locomotive':'\\ud83d\\ude82',\n 'stew':'\\ud83c\\udf72',\n 'stop_button':'\\u23f9',\n 'stop_sign':'\\ud83d\\uded1',\n 'stopwatch':'\\u23f1',\n 'straight_ruler':'\\ud83d\\udccf',\n 'strawberry':'\\ud83c\\udf53',\n 'stuck_out_tongue':'\\ud83d\\ude1b',\n 'stuck_out_tongue_closed_eyes':'\\ud83d\\ude1d',\n 'stuck_out_tongue_winking_eye':'\\ud83d\\ude1c',\n 'studio_microphone':'\\ud83c\\udf99',\n 'stuffed_flatbread':'\\ud83e\\udd59',\n 'sun_behind_large_cloud':'\\ud83c\\udf25',\n 'sun_behind_rain_cloud':'\\ud83c\\udf26',\n 'sun_behind_small_cloud':'\\ud83c\\udf24',\n 'sun_with_face':'\\ud83c\\udf1e',\n 'sunflower':'\\ud83c\\udf3b',\n 'sunglasses':'\\ud83d\\ude0e',\n 'sunny':'\\u2600\\ufe0f',\n 'sunrise':'\\ud83c\\udf05',\n 'sunrise_over_mountains':'\\ud83c\\udf04',\n 'surfing_man':'\\ud83c\\udfc4',\n 'surfing_woman':'\\ud83c\\udfc4‍\\u2640\\ufe0f',\n 'sushi':'\\ud83c\\udf63',\n 'suspension_railway':'\\ud83d\\ude9f',\n 'sweat':'\\ud83d\\ude13',\n 'sweat_drops':'\\ud83d\\udca6',\n 'sweat_smile':'\\ud83d\\ude05',\n 'sweet_potato':'\\ud83c\\udf60',\n 'swimming_man':'\\ud83c\\udfca',\n 'swimming_woman':'\\ud83c\\udfca‍\\u2640\\ufe0f',\n 'symbols':'\\ud83d\\udd23',\n 'synagogue':'\\ud83d\\udd4d',\n 'syringe':'\\ud83d\\udc89',\n 'taco':'\\ud83c\\udf2e',\n 'tada':'\\ud83c\\udf89',\n 'tanabata_tree':'\\ud83c\\udf8b',\n 'taurus':'\\u2649\\ufe0f',\n 'taxi':'\\ud83d\\ude95',\n 'tea':'\\ud83c\\udf75',\n 'telephone_receiver':'\\ud83d\\udcde',\n 'telescope':'\\ud83d\\udd2d',\n 'tennis':'\\ud83c\\udfbe',\n 'tent':'\\u26fa\\ufe0f',\n 'thermometer':'\\ud83c\\udf21',\n 'thinking':'\\ud83e\\udd14',\n 'thought_balloon':'\\ud83d\\udcad',\n 'ticket':'\\ud83c\\udfab',\n 'tickets':'\\ud83c\\udf9f',\n 'tiger':'\\ud83d\\udc2f',\n 'tiger2':'\\ud83d\\udc05',\n 'timer_clock':'\\u23f2',\n 'tipping_hand_man':'\\ud83d\\udc81‍\\u2642\\ufe0f',\n 'tired_face':'\\ud83d\\ude2b',\n 'tm':'\\u2122\\ufe0f',\n 'toilet':'\\ud83d\\udebd',\n 'tokyo_tower':'\\ud83d\\uddfc',\n 'tomato':'\\ud83c\\udf45',\n 'tongue':'\\ud83d\\udc45',\n 'top':'\\ud83d\\udd1d',\n 'tophat':'\\ud83c\\udfa9',\n 'tornado':'\\ud83c\\udf2a',\n 'trackball':'\\ud83d\\uddb2',\n 'tractor':'\\ud83d\\ude9c',\n 'traffic_light':'\\ud83d\\udea5',\n 'train':'\\ud83d\\ude8b',\n 'train2':'\\ud83d\\ude86',\n 'tram':'\\ud83d\\ude8a',\n 'triangular_flag_on_post':'\\ud83d\\udea9',\n 'triangular_ruler':'\\ud83d\\udcd0',\n 'trident':'\\ud83d\\udd31',\n 'triumph':'\\ud83d\\ude24',\n 'trolleybus':'\\ud83d\\ude8e',\n 'trophy':'\\ud83c\\udfc6',\n 'tropical_drink':'\\ud83c\\udf79',\n 'tropical_fish':'\\ud83d\\udc20',\n 'truck':'\\ud83d\\ude9a',\n 'trumpet':'\\ud83c\\udfba',\n 'tulip':'\\ud83c\\udf37',\n 'tumbler_glass':'\\ud83e\\udd43',\n 'turkey':'\\ud83e\\udd83',\n 'turtle':'\\ud83d\\udc22',\n 'tv':'\\ud83d\\udcfa',\n 'twisted_rightwards_arrows':'\\ud83d\\udd00',\n 'two_hearts':'\\ud83d\\udc95',\n 'two_men_holding_hands':'\\ud83d\\udc6c',\n 'two_women_holding_hands':'\\ud83d\\udc6d',\n 'u5272':'\\ud83c\\ude39',\n 'u5408':'\\ud83c\\ude34',\n 'u55b6':'\\ud83c\\ude3a',\n 'u6307':'\\ud83c\\ude2f\\ufe0f',\n 'u6708':'\\ud83c\\ude37\\ufe0f',\n 'u6709':'\\ud83c\\ude36',\n 'u6e80':'\\ud83c\\ude35',\n 'u7121':'\\ud83c\\ude1a\\ufe0f',\n 'u7533':'\\ud83c\\ude38',\n 'u7981':'\\ud83c\\ude32',\n 'u7a7a':'\\ud83c\\ude33',\n 'umbrella':'\\u2614\\ufe0f',\n 'unamused':'\\ud83d\\ude12',\n 'underage':'\\ud83d\\udd1e',\n 'unicorn':'\\ud83e\\udd84',\n 'unlock':'\\ud83d\\udd13',\n 'up':'\\ud83c\\udd99',\n 'upside_down_face':'\\ud83d\\ude43',\n 'v':'\\u270c\\ufe0f',\n 'vertical_traffic_light':'\\ud83d\\udea6',\n 'vhs':'\\ud83d\\udcfc',\n 'vibration_mode':'\\ud83d\\udcf3',\n 'video_camera':'\\ud83d\\udcf9',\n 'video_game':'\\ud83c\\udfae',\n 'violin':'\\ud83c\\udfbb',\n 'virgo':'\\u264d\\ufe0f',\n 'volcano':'\\ud83c\\udf0b',\n 'volleyball':'\\ud83c\\udfd0',\n 'vs':'\\ud83c\\udd9a',\n 'vulcan_salute':'\\ud83d\\udd96',\n 'walking_man':'\\ud83d\\udeb6',\n 'walking_woman':'\\ud83d\\udeb6‍\\u2640\\ufe0f',\n 'waning_crescent_moon':'\\ud83c\\udf18',\n 'waning_gibbous_moon':'\\ud83c\\udf16',\n 'warning':'\\u26a0\\ufe0f',\n 'wastebasket':'\\ud83d\\uddd1',\n 'watch':'\\u231a\\ufe0f',\n 'water_buffalo':'\\ud83d\\udc03',\n 'watermelon':'\\ud83c\\udf49',\n 'wave':'\\ud83d\\udc4b',\n 'wavy_dash':'\\u3030\\ufe0f',\n 'waxing_crescent_moon':'\\ud83c\\udf12',\n 'wc':'\\ud83d\\udebe',\n 'weary':'\\ud83d\\ude29',\n 'wedding':'\\ud83d\\udc92',\n 'weight_lifting_man':'\\ud83c\\udfcb\\ufe0f',\n 'weight_lifting_woman':'\\ud83c\\udfcb\\ufe0f‍\\u2640\\ufe0f',\n 'whale':'\\ud83d\\udc33',\n 'whale2':'\\ud83d\\udc0b',\n 'wheel_of_dharma':'\\u2638\\ufe0f',\n 'wheelchair':'\\u267f\\ufe0f',\n 'white_check_mark':'\\u2705',\n 'white_circle':'\\u26aa\\ufe0f',\n 'white_flag':'\\ud83c\\udff3\\ufe0f',\n 'white_flower':'\\ud83d\\udcae',\n 'white_large_square':'\\u2b1c\\ufe0f',\n 'white_medium_small_square':'\\u25fd\\ufe0f',\n 'white_medium_square':'\\u25fb\\ufe0f',\n 'white_small_square':'\\u25ab\\ufe0f',\n 'white_square_button':'\\ud83d\\udd33',\n 'wilted_flower':'\\ud83e\\udd40',\n 'wind_chime':'\\ud83c\\udf90',\n 'wind_face':'\\ud83c\\udf2c',\n 'wine_glass':'\\ud83c\\udf77',\n 'wink':'\\ud83d\\ude09',\n 'wolf':'\\ud83d\\udc3a',\n 'woman':'\\ud83d\\udc69',\n 'woman_artist':'\\ud83d\\udc69‍\\ud83c\\udfa8',\n 'woman_astronaut':'\\ud83d\\udc69‍\\ud83d\\ude80',\n 'woman_cartwheeling':'\\ud83e\\udd38‍\\u2640\\ufe0f',\n 'woman_cook':'\\ud83d\\udc69‍\\ud83c\\udf73',\n 'woman_facepalming':'\\ud83e\\udd26‍\\u2640\\ufe0f',\n 'woman_factory_worker':'\\ud83d\\udc69‍\\ud83c\\udfed',\n 'woman_farmer':'\\ud83d\\udc69‍\\ud83c\\udf3e',\n 'woman_firefighter':'\\ud83d\\udc69‍\\ud83d\\ude92',\n 'woman_health_worker':'\\ud83d\\udc69‍\\u2695\\ufe0f',\n 'woman_judge':'\\ud83d\\udc69‍\\u2696\\ufe0f',\n 'woman_juggling':'\\ud83e\\udd39‍\\u2640\\ufe0f',\n 'woman_mechanic':'\\ud83d\\udc69‍\\ud83d\\udd27',\n 'woman_office_worker':'\\ud83d\\udc69‍\\ud83d\\udcbc',\n 'woman_pilot':'\\ud83d\\udc69‍\\u2708\\ufe0f',\n 'woman_playing_handball':'\\ud83e\\udd3e‍\\u2640\\ufe0f',\n 'woman_playing_water_polo':'\\ud83e\\udd3d‍\\u2640\\ufe0f',\n 'woman_scientist':'\\ud83d\\udc69‍\\ud83d\\udd2c',\n 'woman_shrugging':'\\ud83e\\udd37‍\\u2640\\ufe0f',\n 'woman_singer':'\\ud83d\\udc69‍\\ud83c\\udfa4',\n 'woman_student':'\\ud83d\\udc69‍\\ud83c\\udf93',\n 'woman_teacher':'\\ud83d\\udc69‍\\ud83c\\udfeb',\n 'woman_technologist':'\\ud83d\\udc69‍\\ud83d\\udcbb',\n 'woman_with_turban':'\\ud83d\\udc73‍\\u2640\\ufe0f',\n 'womans_clothes':'\\ud83d\\udc5a',\n 'womans_hat':'\\ud83d\\udc52',\n 'women_wrestling':'\\ud83e\\udd3c‍\\u2640\\ufe0f',\n 'womens':'\\ud83d\\udeba',\n 'world_map':'\\ud83d\\uddfa',\n 'worried':'\\ud83d\\ude1f',\n 'wrench':'\\ud83d\\udd27',\n 'writing_hand':'\\u270d\\ufe0f',\n 'x':'\\u274c',\n 'yellow_heart':'\\ud83d\\udc9b',\n 'yen':'\\ud83d\\udcb4',\n 'yin_yang':'\\u262f\\ufe0f',\n 'yum':'\\ud83d\\ude0b',\n 'zap':'\\u26a1\\ufe0f',\n 'zipper_mouth_face':'\\ud83e\\udd10',\n 'zzz':'\\ud83d\\udca4',\n\n /* special emojis :P */\n 'octocat': '\":octocat:\"',\n 'showdown': 'S'\n};\n\r\n/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n 'use strict';\n\n var\n /**\n * Options used by this converter\n * @private\n * @type {{}}\n */\n options = {},\n\n /**\n * Language extensions used by this converter\n * @private\n * @type {Array}\n */\n langExtensions = [],\n\n /**\n * Output modifiers extensions used by this converter\n * @private\n * @type {Array}\n */\n outputModifiers = [],\n\n /**\n * Event listeners\n * @private\n * @type {{}}\n */\n listeners = {},\n\n /**\n * The flavor set in this converter\n */\n setConvFlavor = setFlavor,\n\n /**\n * Metadata of the document\n * @type {{parsed: {}, raw: string, format: string}}\n */\n metadata = {\n parsed: {},\n raw: '',\n format: ''\n };\n\n _constructor();\n\n /**\n * Converter constructor\n * @private\n */\n function _constructor () {\n converterOptions = converterOptions || {};\n\n for (var gOpt in globalOptions) {\n if (globalOptions.hasOwnProperty(gOpt)) {\n options[gOpt] = globalOptions[gOpt];\n }\n }\n\n // Merge options\n if (typeof converterOptions === 'object') {\n for (var opt in converterOptions) {\n if (converterOptions.hasOwnProperty(opt)) {\n options[opt] = converterOptions[opt];\n }\n }\n } else {\n throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n ' was passed instead.');\n }\n\n if (options.extensions) {\n showdown.helper.forEach(options.extensions, _parseExtension);\n }\n }\n\n /**\n * Parse extension\n * @param {*} ext\n * @param {string} [name='']\n * @private\n */\n function _parseExtension (ext, name) {\n\n name = name || null;\n // If it's a string, the extension was previously loaded\n if (showdown.helper.isString(ext)) {\n ext = showdown.helper.stdExtName(ext);\n name = ext;\n\n // LEGACY_SUPPORT CODE\n if (showdown.extensions[ext]) {\n console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n 'Please inform the developer that the extension should be updated!');\n legacyExtensionLoading(showdown.extensions[ext], ext);\n return;\n // END LEGACY SUPPORT CODE\n\n } else if (!showdown.helper.isUndefined(extensions[ext])) {\n ext = extensions[ext];\n\n } else {\n throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n }\n }\n\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExt = validate(ext, name);\n if (!validExt.valid) {\n throw Error(validExt.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n }\n if (ext[i].hasOwnProperty('listeners')) {\n for (var ln in ext[i].listeners) {\n if (ext[i].listeners.hasOwnProperty(ln)) {\n listen(ln, ext[i].listeners[ln]);\n }\n }\n }\n }\n\n }\n\n /**\n * LEGACY_SUPPORT\n * @param {*} ext\n * @param {string} name\n */\n function legacyExtensionLoading (ext, name) {\n if (typeof ext === 'function') {\n ext = ext(new showdown.Converter());\n }\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n var valid = validate(ext, name);\n\n if (!valid.valid) {\n throw Error(valid.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n default:// should never reach here\n throw Error('Extension loader error: Type unrecognized!!!');\n }\n }\n }\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n */\n function listen (name, callback) {\n if (!showdown.helper.isString(name)) {\n throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n }\n\n if (typeof callback !== 'function') {\n throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n }\n\n if (!listeners.hasOwnProperty(name)) {\n listeners[name] = [];\n }\n listeners[name].push(callback);\n }\n\n function rTrimInputText (text) {\n var rsp = text.match(/^\\s*/)[0].length,\n rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n return text.replace(rgx, '');\n }\n\n /**\n * Dispatch an event\n * @private\n * @param {string} evtName Event name\n * @param {string} text Text\n * @param {{}} options Converter Options\n * @param {{}} globals\n * @returns {string}\n */\n this._dispatch = function dispatch (evtName, text, options, globals) {\n if (listeners.hasOwnProperty(evtName)) {\n for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n var nText = listeners[evtName][ei](evtName, text, this, options, globals);\n if (nText && typeof nText !== 'undefined') {\n text = nText;\n }\n }\n }\n return text;\n };\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n * @returns {showdown.Converter}\n */\n this.listen = function (name, callback) {\n listen(name, callback);\n return this;\n };\n\n /**\n * Converts a markdown string into HTML\n * @param {string} text\n * @returns {*}\n */\n this.makeHtml = function (text) {\n //check if text is not falsy\n if (!text) {\n return text;\n }\n\n var globals = {\n gHtmlBlocks: [],\n gHtmlMdBlocks: [],\n gHtmlSpans: [],\n gUrls: {},\n gTitles: {},\n gDimensions: {},\n gListLevel: 0,\n hashLinkCounts: {},\n langExtensions: langExtensions,\n outputModifiers: outputModifiers,\n converter: this,\n ghCodeBlocks: [],\n metadata: {\n parsed: {},\n raw: '',\n format: ''\n }\n };\n\n // This lets us use ¨ trema as an escape char to avoid md5 hashes\n // The choice of character is arbitrary; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/¨/g, '¨T');\n\n // Replace $ with ¨D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, '¨D');\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n // Stardardize line spaces\n text = text.replace(/\\u00A0/g, ' ');\n\n if (options.smartIndentationFix) {\n text = rTrimInputText(text);\n }\n\n // Make sure text begins and ends with a couple of newlines:\n text = '\\n\\n' + text + '\\n\\n';\n\n // detab\n text = showdown.subParser('detab')(text, options, globals);\n\n /**\n * Strip any lines consisting only of spaces and tabs.\n * This makes subsequent regexs easier to write, because we can\n * match consecutive blank lines with /\\n+/ instead of something\n * contorted like /[ \\t]*\\n+/\n */\n text = text.replace(/^[ \\t]+$/mg, '');\n\n //run languageExtensions\n showdown.helper.forEach(langExtensions, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // run the sub parsers\n text = showdown.subParser('metadata')(text, options, globals);\n text = showdown.subParser('hashPreCodeTags')(text, options, globals);\n text = showdown.subParser('githubCodeBlocks')(text, options, globals);\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('hashCodeTags')(text, options, globals);\n text = showdown.subParser('stripLinkDefinitions')(text, options, globals);\n text = showdown.subParser('blockGamut')(text, options, globals);\n text = showdown.subParser('unhashHTMLSpans')(text, options, globals);\n text = showdown.subParser('unescapeSpecialChars')(text, options, globals);\n\n // attacklab: Restore dollar signs\n text = text.replace(/¨D/g, '$$');\n\n // attacklab: Restore tremas\n text = text.replace(/¨T/g, '¨');\n\n // render a complete html document instead of a partial if the option is enabled\n text = showdown.subParser('completeHTMLDocument')(text, options, globals);\n\n // Run output modifiers\n showdown.helper.forEach(outputModifiers, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // update metadata\n metadata = globals.metadata;\n return text;\n };\n\n /**\n * Converts an HTML string into a markdown string\n * @param src\n * @param [HTMLParser] A WHATWG DOM and HTML parser, such as JSDOM. If none is supplied, window.document will be used.\n * @returns {string}\n */\n this.makeMarkdown = this.makeMd = function (src, HTMLParser) {\n\n // replace \\r\\n with \\n\n src = src.replace(/\\r\\n/g, '\\n');\n src = src.replace(/\\r/g, '\\n'); // old macs\n\n // due to an edge case, we need to find this: > <\n // to prevent removing of non silent white spaces\n // ex: this is sparta\n src = src.replace(/>[ \\t]+¨NBSP;<');\n\n if (!HTMLParser) {\n if (window && window.document) {\n HTMLParser = window.document;\n } else {\n throw new Error('HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM');\n }\n }\n\n var doc = HTMLParser.createElement('div');\n doc.innerHTML = src;\n\n var globals = {\n preList: substitutePreCodeTags(doc)\n };\n\n // remove all newlines and collapse spaces\n clean(doc);\n\n // some stuff, like accidental reference links must now be escaped\n // TODO\n // doc.innerHTML = doc.innerHTML.replace(/\\[[\\S\\t ]]/);\n\n var nodes = doc.childNodes,\n mdDoc = '';\n\n for (var i = 0; i < nodes.length; i++) {\n mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals);\n }\n\n function clean (node) {\n for (var n = 0; n < node.childNodes.length; ++n) {\n var child = node.childNodes[n];\n if (child.nodeType === 3) {\n if (!/\\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) {\n node.removeChild(child);\n --n;\n } else {\n child.nodeValue = child.nodeValue.split('\\n').join(' ');\n child.nodeValue = child.nodeValue.replace(/(\\s)+/g, '$1');\n }\n } else if (child.nodeType === 1) {\n clean(child);\n }\n }\n }\n\n // find all pre tags and replace contents with placeholder\n // we need this so that we can remove all indentation from html\n // to ease up parsing\n function substitutePreCodeTags (doc) {\n\n var pres = doc.querySelectorAll('pre'),\n presPH = [];\n\n for (var i = 0; i < pres.length; ++i) {\n\n if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {\n var content = pres[i].firstChild.innerHTML.trim(),\n language = pres[i].firstChild.getAttribute('data-language') || '';\n\n // if data-language attribute is not defined, then we look for class language-*\n if (language === '') {\n var classes = pres[i].firstChild.className.split(' ');\n for (var c = 0; c < classes.length; ++c) {\n var matches = classes[c].match(/^language-(.+)$/);\n if (matches !== null) {\n language = matches[1];\n break;\n }\n }\n }\n\n // unescape html entities in content\n content = showdown.helper.unescapeHTMLEntities(content);\n\n presPH.push(content);\n pres[i].outerHTML = '';\n } else {\n presPH.push(pres[i].innerHTML);\n pres[i].innerHTML = '';\n pres[i].setAttribute('prenum', i.toString());\n }\n }\n return presPH;\n }\n\n return mdDoc;\n };\n\n /**\n * Set an option of this Converter instance\n * @param {string} key\n * @param {*} value\n */\n this.setOption = function (key, value) {\n options[key] = value;\n };\n\n /**\n * Get the option of this Converter instance\n * @param {string} key\n * @returns {*}\n */\n this.getOption = function (key) {\n return options[key];\n };\n\n /**\n * Get the options of this Converter instance\n * @returns {{}}\n */\n this.getOptions = function () {\n return options;\n };\n\n /**\n * Add extension to THIS converter\n * @param {{}} extension\n * @param {string} [name=null]\n */\n this.addExtension = function (extension, name) {\n name = name || null;\n _parseExtension(extension, name);\n };\n\n /**\n * Use a global registered extension with THIS converter\n * @param {string} extensionName Name of the previously registered extension\n */\n this.useExtension = function (extensionName) {\n _parseExtension(extensionName);\n };\n\n /**\n * Set the flavor THIS converter should use\n * @param {string} name\n */\n this.setFlavor = function (name) {\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n var preset = flavor[name];\n setConvFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n options[option] = preset[option];\n }\n }\n };\n\n /**\n * Get the currently set flavor of this converter\n * @returns {string}\n */\n this.getFlavor = function () {\n return setConvFlavor;\n };\n\n /**\n * Remove an extension from THIS converter.\n * Note: This is a costly operation. It's better to initialize a new converter\n * and specify the extensions you wish to use\n * @param {Array} extension\n */\n this.removeExtension = function (extension) {\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n for (var a = 0; a < extension.length; ++a) {\n var ext = extension[a];\n for (var i = 0; i < langExtensions.length; ++i) {\n if (langExtensions[i] === ext) {\n langExtensions.splice(i, 1);\n }\n }\n for (var ii = 0; ii < outputModifiers.length; ++ii) {\n if (outputModifiers[ii] === ext) {\n outputModifiers.splice(ii, 1);\n }\n }\n }\n };\n\n /**\n * Get all extension of THIS converter\n * @returns {{language: Array, output: Array}}\n */\n this.getAllExtensions = function () {\n return {\n language: langExtensions,\n output: outputModifiers\n };\n };\n\n /**\n * Get the metadata of the previously parsed document\n * @param raw\n * @returns {string|{}}\n */\n this.getMetadata = function (raw) {\n if (raw) {\n return metadata.raw;\n } else {\n return metadata.parsed;\n }\n };\n\n /**\n * Get the metadata format of the previously parsed document\n * @returns {string}\n */\n this.getMetadataFormat = function () {\n return metadata.format;\n };\n\n /**\n * Private: set a single key, value metadata pair\n * @param {string} key\n * @param {string} value\n */\n this._setMetadataPair = function (key, value) {\n metadata.parsed[key] = value;\n };\n\n /**\n * Private: set metadata format\n * @param {string} format\n */\n this._setMetadataFormat = function (format) {\n metadata.format = format;\n };\n\n /**\n * Private: set metadata raw text\n * @param {string} raw\n */\n this._setMetadataRaw = function (raw) {\n metadata.raw = raw;\n };\n};\n\r\n/**\n * Turn Markdown link shortcuts into XHTML tags.\n */\nshowdown.subParser('anchors', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('anchors.before', text, options, globals);\n\n var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) {\n if (showdown.helper.isUndefined(title)) {\n title = '';\n }\n linkId = linkId.toLowerCase();\n\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n } else if (!url) {\n if (!linkId) {\n // lower-case and turn embedded newlines into spaces\n linkId = linkText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {\n url = globals.gUrls[linkId];\n if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {\n title = globals.gTitles[linkId];\n }\n } else {\n return wholeMatch;\n }\n }\n\n //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n\n var result = '';\n\n return result;\n };\n\n // First, handle reference-style links: [link text] [id]\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)] ?(?:\\n *)?\\[(.*?)]()()()()/g, writeAnchorTag);\n\n // Next, inline-style links: [link text](url \"optional title\")\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]?<([^>]*)>(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // normal cases\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]??(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n text = text.replace(/\\[([^\\[\\]]+)]()()()()()/g, writeAnchorTag);\n\n // Lastly handle GithubMentions if option is enabled\n if (options.ghMentions) {\n text = text.replace(/(^|\\s)(\\\\)?(@([a-z\\d]+(?:[a-z\\d.-]+?[a-z\\d]+)*))/gmi, function (wm, st, escape, mentions, username) {\n if (escape === '\\\\') {\n return st + mentions;\n }\n\n //check if options.ghMentionsLink is a string\n if (!showdown.helper.isString(options.ghMentionsLink)) {\n throw new Error('ghMentionsLink option must be a string');\n }\n var lnk = options.ghMentionsLink.replace(/\\{u}/g, username),\n target = '';\n if (options.openLinksInNewWindow) {\n target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n }\n return st + '' + mentions + '';\n });\n }\n\n text = globals.converter._dispatch('anchors.after', text, options, globals);\n return text;\n});\n\r\n// url allowed chars [a-z\\d_.~:/?#[]@!$&'()*+,;=-]\n\nvar simpleURLRegex = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+?\\.[^'\">\\s]+?)()(\\1)?(?=\\s|$)(?![\"<>])/gi,\n simpleURLRegex2 = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+\\.[^'\">\\s]+?)([.!?,()\\[\\]])?(\\1)?(?=\\s|$)(?![\"<>])/gi,\n delimUrlRegex = /()<(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+)()>()/gi,\n simpleMailRegex = /(^|\\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?=$|\\s)/gmi,\n delimMailRegex = /<()(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n\n replaceLink = function (options) {\n 'use strict';\n return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) {\n link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var lnkTxt = link,\n append = '',\n target = '',\n lmc = leadingMagicChars || '',\n tmc = trailingMagicChars || '';\n if (/^www\\./i.test(link)) {\n link = link.replace(/^www\\./i, 'http://www.');\n }\n if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {\n append = trailingPunctuation;\n }\n if (options.openLinksInNewWindow) {\n target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n }\n return lmc + '' + lnkTxt + '' + append + tmc;\n };\n },\n\n replaceMail = function (options, globals) {\n 'use strict';\n return function (wholeMatch, b, mail) {\n var href = 'mailto:';\n b = b || '';\n mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals);\n if (options.encodeEmails) {\n href = showdown.helper.encodeEmailAddress(href + mail);\n mail = showdown.helper.encodeEmailAddress(mail);\n } else {\n href = href + mail;\n }\n return b + '' + mail + '';\n };\n };\n\nshowdown.subParser('autoLinks', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('autoLinks.before', text, options, globals);\n\n text = text.replace(delimUrlRegex, replaceLink(options));\n text = text.replace(delimMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('autoLinks.after', text, options, globals);\n\n return text;\n});\n\nshowdown.subParser('simplifiedAutoLinks', function (text, options, globals) {\n 'use strict';\n\n if (!options.simplifiedAutoLink) {\n return text;\n }\n\n text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals);\n\n if (options.excludeTrailingPunctuationFromURLs) {\n text = text.replace(simpleURLRegex2, replaceLink(options));\n } else {\n text = text.replace(simpleURLRegex, replaceLink(options));\n }\n text = text.replace(simpleMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('blockGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockGamut.before', text, options, globals);\n\n // we parse blockquotes first so that we can have headings and hrs\n // inside blockquotes\n text = showdown.subParser('blockQuotes')(text, options, globals);\n text = showdown.subParser('headers')(text, options, globals);\n\n // Do Horizontal Rules:\n text = showdown.subParser('horizontalRule')(text, options, globals);\n\n text = showdown.subParser('lists')(text, options, globals);\n text = showdown.subParser('codeBlocks')(text, options, globals);\n text = showdown.subParser('tables')(text, options, globals);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

    tags around block-level tags.\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('paragraphs')(text, options, globals);\n\n text = globals.converter._dispatch('blockGamut.after', text, options, globals);\n\n return text;\n});\n\r\nshowdown.subParser('blockQuotes', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockQuotes.before', text, options, globals);\n\n // add a couple extra lines after the text and endtext mark\n text = text + '\\n\\n';\n\n var rgx = /(^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+/gm;\n\n if (options.splitAdjacentBlockquotes) {\n rgx = /^ {0,3}>[\\s\\S]*?(?:\\n\\n)/gm;\n }\n\n text = text.replace(rgx, function (bq) {\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, ''); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/¨0/g, '');\n\n bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n bq = showdown.subParser('githubCodeBlocks')(bq, options, globals);\n bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse\n\n bq = bq.replace(/(^|\\n)/g, '$1 ');\n // These leading spaces screw with

     content, so we need to fix that:\n    bq = bq.replace(/(\\s*
    [^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '¨0');\n      pre = pre.replace(/¨0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('hashBlock')('
    \\n' + bq + '\\n
    ', options, globals);\n });\n\n text = globals.converter._dispatch('blockQuotes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Process Markdown `
    ` blocks.\n */\nshowdown.subParser('codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=¨0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('outdent')(codeblock, options, globals);\n    codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '
    ' + codeblock + end + '
    ';\n\n return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;\n });\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n\n text = globals.converter._dispatch('codeBlocks.after', text, options, globals);\n return text;\n});\n\r\n/**\n *\n * * Backtick quotes are used for spans.\n *\n * * You can use multiple backticks as the delimiters if you want to\n * include literal backticks in the code span. So, this input:\n *\n * Just type ``foo `bar` baz`` at the prompt.\n *\n * Will translate to:\n *\n *

    Just type foo `bar` baz at the prompt.

    \n *\n * There's no arbitrary limit to the number of backticks you\n * can use as delimters. If you need three consecutive backticks\n * in your code, use four for delimiters, etc.\n *\n * * You can use spaces to get literal backticks at the edges:\n *\n * ... type `` `bar` `` ...\n *\n * Turns to:\n *\n * ... type `bar` ...\n */\nshowdown.subParser('codeSpans', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('codeSpans.before', text, options, globals);\n\n if (typeof (text) === 'undefined') {\n text = '';\n }\n text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n c = showdown.subParser('encodeCode')(c, options, globals);\n c = m1 + '' + c + '';\n c = showdown.subParser('hashHTMLSpans')(c, options, globals);\n return c;\n }\n );\n\n text = globals.converter._dispatch('codeSpans.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Create a full HTML document from the processed markdown\n */\nshowdown.subParser('completeHTMLDocument', function (text, options, globals) {\n 'use strict';\n\n if (!options.completeHTMLDocument) {\n return text;\n }\n\n text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals);\n\n var doctype = 'html',\n doctypeParsed = '\\n',\n title = '',\n charset = '\\n',\n lang = '',\n metadata = '';\n\n if (typeof globals.metadata.parsed.doctype !== 'undefined') {\n doctypeParsed = '\\n';\n doctype = globals.metadata.parsed.doctype.toString().toLowerCase();\n if (doctype === 'html' || doctype === 'html5') {\n charset = '';\n }\n }\n\n for (var meta in globals.metadata.parsed) {\n if (globals.metadata.parsed.hasOwnProperty(meta)) {\n switch (meta.toLowerCase()) {\n case 'doctype':\n break;\n\n case 'title':\n title = '' + globals.metadata.parsed.title + '\\n';\n break;\n\n case 'charset':\n if (doctype === 'html' || doctype === 'html5') {\n charset = '\\n';\n } else {\n charset = '\\n';\n }\n break;\n\n case 'language':\n case 'lang':\n lang = ' lang=\"' + globals.metadata.parsed[meta] + '\"';\n metadata += '\\n';\n break;\n\n default:\n metadata += '\\n';\n }\n }\n }\n\n text = doctypeParsed + '\\n\\n' + title + charset + metadata + '\\n\\n' + text.trim() + '\\n\\n';\n\n text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('detab', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('detab.before', text, options, globals);\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, ' '); // g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, '¨A¨B');\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {\n var leadingText = m1,\n numSpaces = 4 - leadingText.length % 4; // g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) {\n leadingText += ' ';\n }\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/¨A/g, ' '); // g_tab_width\n text = text.replace(/¨B/g, '');\n\n text = globals.converter._dispatch('detab.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('ellipsis', function (text, options, globals) {\n 'use strict';\n\n if (!options.ellipsis) {\n return text;\n }\n\n text = globals.converter._dispatch('ellipsis.before', text, options, globals);\n\n text = text.replace(/\\.\\.\\./g, '…');\n\n text = globals.converter._dispatch('ellipsis.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Turn emoji codes into emojis\n *\n * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis\n */\nshowdown.subParser('emoji', function (text, options, globals) {\n 'use strict';\n\n if (!options.emoji) {\n return text;\n }\n\n text = globals.converter._dispatch('emoji.before', text, options, globals);\n\n var emojiRgx = /:([\\S]+?):/g;\n\n text = text.replace(emojiRgx, function (wm, emojiCode) {\n if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {\n return showdown.helper.emojis[emojiCode];\n }\n return wm;\n });\n\n text = globals.converter._dispatch('emoji.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('encodeAmpsAndAngles', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals);\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&');\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?$!])/gi, '<');\n\n // Encode <\n text = text.replace(/\n text = text.replace(/>/g, '>');\n\n text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n * text = escapeCharacters(text,\"\\\\\",true);\n * text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox. This function gets called a LOT.\n */\nshowdown.subParser('encodeBackslashEscapes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals);\n\n text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('encodeCode', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('encodeCode.before', text, options, globals);\n\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text\n .replace(/&/g, '&')\n // Do the angle bracket song and dance:\n .replace(//g, '>')\n // Now, escape characters that are magic in Markdown:\n .replace(/([*_{}\\[\\]\\\\=~-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeCode.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _ ~ =] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals);\n\n // Build a regex to find HTML tags.\n var tags = /<\\/?[a-z\\d_:-]+(?:[\\s]+[\\s\\S]+?)?>/gi,\n comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;\n\n text = text.replace(tags, function (wholeMatch) {\n return wholeMatch\n .replace(/(.)<\\/?code>(?=.)/g, '$1`')\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = text.replace(comments, function (wholeMatch) {\n return wholeMatch\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n * def hello_world(x)\n * puts \"Hello, #{x}\"\n * end\n * ```\n */\nshowdown.subParser('githubCodeBlocks', function (text, options, globals) {\n 'use strict';\n\n // early exit if option is not enabled\n if (!options.ghCodeBlocks) {\n return text;\n }\n\n text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);\n\n text += '¨0';\n\n text = text.replace(/(?:^|\\n)(?: {0,3})(```+|~~~+)(?: *)([^\\s`~]*)\\n([\\s\\S]*?)\\n(?: {0,3})\\1/g, function (wholeMatch, delim, language, codeblock) {\n var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n // First parse the github code block\n codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n codeblock = showdown.subParser('detab')(codeblock, options, globals);\n codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n codeblock = '
    ' + codeblock + end + '
    ';\n\n codeblock = showdown.subParser('hashBlock')(codeblock, options, globals);\n\n // Since GHCodeblocks can be false positives, we need to\n // store the primitive text and the parsed text in a global var,\n // and then return a token\n return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n });\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);\n});\n\r\nshowdown.subParser('hashBlock', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashBlock.before', text, options, globals);\n text = text.replace(/(^\\n+|\\n+$)/g, '');\n text = '\\n\\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n text = globals.converter._dispatch('hashBlock.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash and escape elements that should not be parsed as markdown\n */\nshowdown.subParser('hashCodeTags', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashCodeTags.before', text, options, globals);\n\n var repFunc = function (wholeMatch, match, left, right) {\n var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';\n };\n\n // Hash naked \n text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim');\n\n text = globals.converter._dispatch('hashCodeTags.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('hashElement', function (text, options, globals) {\n 'use strict';\n\n return function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, '\\n');\n blockText = blockText.replace(/^\\n/, '');\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, '');\n\n // Replace the element text with a marker (\"¨KxK\" where x is its key)\n blockText = '\\n\\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n return blockText;\n };\n});\n\r\nshowdown.subParser('hashHTMLBlocks', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals);\n\n var blockTags = [\n 'pre',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'blockquote',\n 'table',\n 'dl',\n 'ol',\n 'ul',\n 'script',\n 'noscript',\n 'form',\n 'fieldset',\n 'iframe',\n 'math',\n 'style',\n 'section',\n 'header',\n 'footer',\n 'nav',\n 'article',\n 'aside',\n 'address',\n 'audio',\n 'canvas',\n 'figure',\n 'hgroup',\n 'output',\n 'video',\n 'p'\n ],\n repFunc = function (wholeMatch, match, left, right) {\n var txt = wholeMatch;\n // check if this html element is marked as markdown\n // if so, it's contents should be parsed as markdown\n if (left.search(/\\bmarkdown\\b/) !== -1) {\n txt = left + globals.converter.makeHtml(match) + right;\n }\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n };\n\n if (options.backslashEscapesHTMLTags) {\n // encode backslash escaped HTML tags\n text = text.replace(/\\\\<(\\/?[^>]+?)>/g, function (wm, inside) {\n return '<' + inside + '>';\n });\n }\n\n // hash HTML Blocks\n for (var i = 0; i < blockTags.length; ++i) {\n\n var opTagPos,\n rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\\\b[^>]*>)', 'im'),\n patLeft = '<' + blockTags[i] + '\\\\b[^>]*>',\n patRight = '';\n // 1. Look for the first position of the first opening HTML tag in the text\n while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {\n\n // if the HTML tag is \\ escaped, we need to escape it and break\n\n\n //2. Split the text in that position\n var subTexts = showdown.helper.splitAtIndex(text, opTagPos),\n //3. Match recursively\n newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');\n\n // prevent an infinite loop\n if (newSubText1 === subTexts[1]) {\n break;\n }\n text = subTexts[0].concat(newSubText1);\n }\n }\n // HR SPECIAL CASE\n text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n // Special case for standalone HTML comments\n text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n }, '^ {0,3}', 'gm');\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n text = text.replace(/(?:\\n\\n)( {0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('hashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals);\n\n function hashHTMLSpan (html) {\n return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';\n }\n\n // Hash Self Closing tags\n text = text.replace(/<[^>]+?\\/>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags without properties\n text = text.replace(/<([^>]+?)>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags with properties\n text = text.replace(/<([^>]+?)\\s[^>]+?>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash self closing tags without />\n text = text.replace(/<[^>]+?>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n /*showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');*/\n\n text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals);\n return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('unhashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals);\n\n for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n var repText = globals.gHtmlSpans[i],\n // limiter to prevent infinite loop (assume 10 as limit for recurse)\n limit = 0;\n\n while (/¨C(\\d+)C/.test(repText)) {\n var num = RegExp.$1;\n repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);\n if (limit === 10) {\n console.error('maximum nesting of 10 spans reached!!!');\n break;\n }\n ++limit;\n }\n text = text.replace('¨C' + i + 'C', repText);\n }\n\n text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash and escape
     elements that should not be parsed as markdown\n */\nshowdown.subParser('hashPreCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  // Hash 
    \n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\\\s*]*>', '^ {0,3}\\\\s*
    ', 'gim');\n\n text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('headers', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('headers.before', text, options, globals);\n\n var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n // Set text-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n text = text.replace(setextRegexH2, function (matchFound, m1) {\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart + 1,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n var hText = m2;\n if (options.customizedHeaderId) {\n hText = m2.replace(/\\s?\\{([^{]+?)}\\s*$/, '');\n }\n\n var span = showdown.subParser('spanGamut')(hText, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n hLevel = headerLevelStart - 1 + m1.length,\n header = '' + span + '';\n\n return showdown.subParser('hashBlock')(header, options, globals);\n });\n\n function headerId (m) {\n var title,\n prefix;\n\n // It is separate from other options to allow combining prefix and customized\n if (options.customizedHeaderId) {\n var match = m.match(/\\{([^{]+?)}\\s*$/);\n if (match && match[1]) {\n m = match[1];\n }\n }\n\n title = m;\n\n // Prefix id to prevent causing inadvertent pre-existing style matches.\n if (showdown.helper.isString(options.prefixHeaderId)) {\n prefix = options.prefixHeaderId;\n } else if (options.prefixHeaderId === true) {\n prefix = 'section-';\n } else {\n prefix = '';\n }\n\n if (!options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (options.ghCompatibleHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '')\n .replace(/¨T/g, '')\n .replace(/¨D/g, '')\n // replace rest of the chars (&~$ are repeated as they might have been escaped)\n // borrowed from github's redcarpet (some they should produce similar results)\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, '')\n .toLowerCase();\n } else if (options.rawHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '&')\n .replace(/¨T/g, '¨')\n .replace(/¨D/g, '$')\n // replace \" and '\n .replace(/[\"']/g, '-')\n .toLowerCase();\n } else {\n title = title\n .replace(/[^\\w]/g, '')\n .toLowerCase();\n }\n\n if (options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (globals.hashLinkCounts[title]) {\n title = title + '-' + (globals.hashLinkCounts[title]++);\n } else {\n globals.hashLinkCounts[title] = 1;\n }\n return title;\n }\n\n text = globals.converter._dispatch('headers.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Turn Markdown link shortcuts into XHTML tags.\n */\nshowdown.subParser('horizontalRule', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('horizontalRule.before', text, options, globals);\n\n var key = showdown.subParser('hashBlock')('
    ', options, globals);\n text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n text = globals.converter._dispatch('horizontalRule.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Turn Markdown image shortcuts into tags.\n */\nshowdown.subParser('images', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('images.before', text, options, globals);\n\n var inlineRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n crazyRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<([^>]*)>(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(?:([\"'])([^\"]*?)\\6))?[ \\t]?\\)/g,\n base64RegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n referenceRegExp = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[([\\s\\S]*?)]()()()()()/g,\n refShortcutRegExp = /!\\[([^\\[\\]]+)]()()()()()/g;\n\n function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {\n url = url.replace(/\\s/g, '');\n return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n }\n\n function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n var gUrls = globals.gUrls,\n gTitles = globals.gTitles,\n gDims = globals.gDimensions;\n\n linkId = linkId.toLowerCase();\n\n if (!title) {\n title = '';\n }\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n\n } else if (url === '' || url === null) {\n if (linkId === '' || linkId === null) {\n // lower-case and turn embedded newlines into spaces\n linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(gUrls[linkId])) {\n url = gUrls[linkId];\n if (!showdown.helper.isUndefined(gTitles[linkId])) {\n title = gTitles[linkId];\n }\n if (!showdown.helper.isUndefined(gDims[linkId])) {\n width = gDims[linkId].width;\n height = gDims[linkId].height;\n }\n } else {\n return wholeMatch;\n }\n }\n\n altText = altText\n .replace(/\"/g, '"')\n //altText = showdown.helper.escapeCharacters(altText, '*_', false);\n .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n //url = showdown.helper.escapeCharacters(url, '*_', false);\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var result = '\"'x \"optional title\")\n\n // base64 encoded images\n text = text.replace(base64RegExp, writeImageTagBase64);\n\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(crazyRegExp, writeImageTag);\n\n // normal cases\n text = text.replace(inlineRegExp, writeImageTag);\n\n // handle reference-style shortcuts: ![img text]\n text = text.replace(refShortcutRegExp, writeImageTag);\n\n text = globals.converter._dispatch('images.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('italicsAndBold', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);\n\n // it's faster to have 3 separate regexes for each case than have just one\n // because of backtracing, in some cases, it could lead to an exponential effect\n // called \"catastrophic backtrace\". Ominous!\n\n function parseInside (txt, left, right) {\n /*\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n */\n return left + txt + right;\n }\n\n // Parse underscores\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b_(\\S[\\s\\S]*?)_\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/_([^\\s_][\\s\\S]*?)_/g, function (wm, m) {\n // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n // Now parse asterisks\n if (options.literalMidWordAsterisks) {\n text = text.replace(/([^*]|^)\\B\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*\\*(\\S[\\s\\S]*?)\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*(\\S[\\s\\S]*?)\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n } else {\n text = text.replace(/\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*\\*(\\S[\\s\\S]*?)\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*([^\\s*][\\s\\S]*?)\\*/g, function (wm, m) {\n // !/^\\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n\n text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('lists', function (text, options, globals) {\n 'use strict';\n\n /**\n * Process the contents of a single ordered or unordered list, splitting it\n * into individual list items.\n * @param {string} listStr\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function processListItems (listStr, trimTrailing) {\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n globals.gListLevel++;\n\n // trim trailing blank lines:\n listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n // attacklab: add sentinel to emulate \\z\n listStr += '¨0';\n\n var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n isParagraphed = (/\\n[ \\t]*\\n(?!¨0)/.test(listStr));\n\n // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n // which is a syntax breaking change\n // activating this option reverts to old behavior\n if (options.disableForced4SpacesIndentedSublists) {\n rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n }\n\n listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n checked = (checked && checked.trim() !== '');\n\n var item = showdown.subParser('outdent')(m4, options, globals),\n bulletStyle = '';\n\n // Support for github tasklists\n if (taskbtn && options.tasklists) {\n bulletStyle = ' class=\"task-list-item\" style=\"list-style-type: none;\"';\n item = item.replace(/^[ \\t]*\\[(x|X| )?]/m, function () {\n var otp = '
  • a
  • \n // instead of:\n //
    • - - a
    \n // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n return '¨A' + wm2;\n });\n\n // m1 - Leading line or\n // Has a double return (multi paragraph) or\n // Has sublist\n if (m1 || (item.search(/\\n{2,}/) > -1)) {\n item = showdown.subParser('githubCodeBlocks')(item, options, globals);\n item = showdown.subParser('blockGamut')(item, options, globals);\n } else {\n // Recursion for sub-lists:\n item = showdown.subParser('lists')(item, options, globals);\n item = item.replace(/\\n$/, ''); // chomp(item)\n item = showdown.subParser('hashHTMLBlocks')(item, options, globals);\n\n // Colapse double linebreaks\n item = item.replace(/\\n\\n+/g, '\\n\\n');\n if (isParagraphed) {\n item = showdown.subParser('paragraphs')(item, options, globals);\n } else {\n item = showdown.subParser('spanGamut')(item, options, globals);\n }\n }\n\n // now we need to remove the marker (¨A)\n item = item.replace('¨A', '');\n // we can finally wrap the line in list item tags\n item = '' + item + '\\n';\n\n return item;\n });\n\n // attacklab: strip sentinel\n listStr = listStr.replace(/¨0/g, '');\n\n globals.gListLevel--;\n\n if (trimTrailing) {\n listStr = listStr.replace(/\\s+$/, '');\n }\n\n return listStr;\n }\n\n function styleStartNumber (list, listType) {\n // check if ol and starts by a number different than 1\n if (listType === 'ol') {\n var res = list.match(/^ *(\\d+)\\./);\n if (res && res[1] !== '1') {\n return ' start=\"' + res[1] + '\"';\n }\n }\n return '';\n }\n\n /**\n * Check and parse consecutive lists (better fix for issue #142)\n * @param {string} list\n * @param {string} listType\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function parseConsecutiveLists (list, listType, trimTrailing) {\n // check if we caught 2 or more consecutive lists by mistake\n // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n result = '';\n\n if (list.search(counterRxg) !== -1) {\n (function parseCL (txt) {\n var pos = txt.search(counterRxg),\n style = styleStartNumber(list, listType);\n if (pos !== -1) {\n // slice\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\\n';\n\n // invert counterType and listType\n listType = (listType === 'ul') ? 'ol' : 'ul';\n counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n //recurse\n parseCL(txt.slice(pos));\n } else {\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '\\n';\n }\n })(list);\n } else {\n var style = styleStartNumber(list, listType);\n result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '\\n';\n }\n\n return result;\n }\n\n /** Start of list parsing **/\n text = globals.converter._dispatch('lists.before', text, options, globals);\n // add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += '¨0';\n\n if (globals.gListLevel) {\n text = text.replace(/^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, list, m2) {\n var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, true);\n }\n );\n } else {\n text = text.replace(/(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, m1, list, m3) {\n var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, false);\n }\n );\n }\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n text = globals.converter._dispatch('lists.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('metadata', function (text, options, globals) {\n 'use strict';\n\n if (!options.metadata) {\n return text;\n }\n\n text = globals.converter._dispatch('metadata.before', text, options, globals);\n\n function parseMetadataContents (content) {\n // raw is raw so it's not changed in any way\n globals.metadata.raw = content;\n\n // escape chars forbidden in html attributes\n // double quotes\n content = content\n // ampersand first\n .replace(/&/g, '&')\n // double quotes\n .replace(/\"/g, '"');\n\n content = content.replace(/\\n {4}/g, ' ');\n content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n globals.metadata.parsed[key] = value;\n return '';\n });\n }\n\n text = text.replace(/^\\s*«««+(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\n/, function (wholematch, format, content) {\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/^\\s*---+(\\S*?)\\n([\\s\\S]+?)\\n---+\\n/, function (wholematch, format, content) {\n if (format) {\n globals.metadata.format = format;\n }\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/¨M/g, '');\n\n text = globals.converter._dispatch('metadata.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('outdent', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('outdent.before', text, options, globals);\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/¨0/g, '');\n\n text = globals.converter._dispatch('outdent.after', text, options, globals);\n return text;\n});\n\r\n/**\n *\n */\nshowdown.subParser('paragraphs', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('paragraphs.before', text, options, globals);\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n\n var grafs = text.split(/\\n{2,}/g),\n grafsOut = [],\n end = grafs.length; // Wrap

    tags\n\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n // if this is an HTML marker, copy it\n if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n grafsOut.push(str);\n\n // test for presence of characters to prevent empty lines being parsed\n // as paragraphs (resulting in undesired extra empty paragraphs)\n } else if (str.search(/\\S/) >= 0) {\n str = showdown.subParser('spanGamut')(str, options, globals);\n str = str.replace(/^([ \\t]*)/g, '

    ');\n str += '

    ';\n grafsOut.push(str);\n }\n }\n\n /** Unhashify HTML blocks */\n end = grafsOut.length;\n for (i = 0; i < end; i++) {\n var blockText = '',\n grafsOutIt = grafsOut[i],\n codeFlag = false;\n // if this is a marker for an html block...\n // use RegExp.test instead of string.search because of QML bug\n while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n var delim = RegExp.$1,\n num = RegExp.$2;\n\n if (delim === 'K') {\n blockText = globals.gHtmlBlocks[num];\n } else {\n // we need to check if ghBlock is a false positive\n if (codeFlag) {\n // use encoded version of all text\n blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n } else {\n blockText = globals.ghCodeBlocks[num].codeblock;\n }\n }\n blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n // Check if grafsOutIt is a pre->code\n if (/^]*>\\s*]*>/.test(grafsOutIt)) {\n codeFlag = true;\n }\n }\n grafsOut[i] = grafsOutIt;\n }\n text = grafsOut.join('\\n');\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n return globals.converter._dispatch('paragraphs.after', text, options, globals);\n});\n\r\n/**\n * Run extension\n */\nshowdown.subParser('runExtension', function (ext, text, options, globals) {\n 'use strict';\n\n if (ext.filter) {\n text = ext.filter(text, globals.converter, options);\n\n } else if (ext.regex) {\n // TODO remove this when old extension loading mechanism is deprecated\n var re = ext.regex;\n if (!(re instanceof RegExp)) {\n re = new RegExp(re, 'g');\n }\n text = text.replace(re, ext.replace);\n }\n\n return text;\n});\n\r\n/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('spanGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('spanGamut.before', text, options, globals);\n text = showdown.subParser('codeSpans')(text, options, globals);\n text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = showdown.subParser('images')(text, options, globals);\n text = showdown.subParser('anchors')(text, options, globals);\n\n // Make links out of things like ``\n // Must come after anchors, because you can use < and >\n // delimiters in inline links like [this]().\n text = showdown.subParser('autoLinks')(text, options, globals);\n text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);\n text = showdown.subParser('emoji')(text, options, globals);\n text = showdown.subParser('underline')(text, options, globals);\n text = showdown.subParser('italicsAndBold')(text, options, globals);\n text = showdown.subParser('strikethrough')(text, options, globals);\n text = showdown.subParser('ellipsis')(text, options, globals);\n\n // we need to hash HTML tags inside spans\n text = showdown.subParser('hashHTMLSpans')(text, options, globals);\n\n // now we encode amps and angles\n text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);\n\n // Do hard breaks\n if (options.simpleLineBreaks) {\n // GFM style hard breaks\n // only add line breaks if the text does not contain a block (special case for lists)\n if (!/\\n\\n¨K/.test(text)) {\n text = text.replace(/\\n+/g, '
    \\n');\n }\n } else {\n // Vanilla hard breaks\n text = text.replace(/ +\\n/g, '
    \\n');\n }\n\n text = globals.converter._dispatch('spanGamut.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('strikethrough', function (text, options, globals) {\n 'use strict';\n\n function parseInside (txt) {\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n return '' + txt + '';\n }\n\n if (options.strikethrough) {\n text = globals.converter._dispatch('strikethrough.before', text, options, globals);\n text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); });\n text = globals.converter._dispatch('strikethrough.after', text, options, globals);\n }\n\n return text;\n});\n\r\n/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('stripLinkDefinitions', function (text, options, globals) {\n 'use strict';\n\n var regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n base64Regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n text += '¨0';\n\n var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n\n // if there aren't two instances of linkId it must not be a reference link so back out\n linkId = linkId.toLowerCase();\n if (text.toLowerCase().split(linkId).length - 1 < 2) {\n return wholeMatch;\n }\n if (url.match(/^data:.+?\\/.+?;base64,/)) {\n // remove newlines\n globals.gUrls[linkId] = url.replace(/\\s/g, '');\n } else {\n globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive\n }\n\n if (blankLines) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return blankLines + title;\n\n } else {\n if (title) {\n globals.gTitles[linkId] = title.replace(/\"|'/g, '"');\n }\n if (options.parseImgDimensions && width && height) {\n globals.gDimensions[linkId] = {\n width: width,\n height: height\n };\n }\n }\n // Completely remove the definition from the text\n return '';\n };\n\n // first we try to find base64 link references\n text = text.replace(base64Regex, replaceFunc);\n\n text = text.replace(regex, replaceFunc);\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return text;\n});\n\r\nshowdown.subParser('tables', function (text, options, globals) {\n 'use strict';\n\n if (!options.tables) {\n return text;\n }\n\n var tableRgx = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n function parseStyles (sLine) {\n if (/^:[ \\t]*--*$/.test(sLine)) {\n return ' style=\"text-align:left;\"';\n } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n return ' style=\"text-align:right;\"';\n } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n return ' style=\"text-align:center;\"';\n } else {\n return '';\n }\n }\n\n function parseHeaders (header, style) {\n var id = '';\n header = header.trim();\n // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n if (options.tablesHeaderId || options.tableHeaderId) {\n id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n }\n header = showdown.subParser('spanGamut')(header, options, globals);\n\n return '' + header + '\\n';\n }\n\n function parseCells (cell, style) {\n var subText = showdown.subParser('spanGamut')(cell, options, globals);\n return '' + subText + '\\n';\n }\n\n function buildTable (headers, cells) {\n var tb = '\\n\\n\\n',\n tblLgn = headers.length;\n\n for (var i = 0; i < tblLgn; ++i) {\n tb += headers[i];\n }\n tb += '\\n\\n\\n';\n\n for (i = 0; i < cells.length; ++i) {\n tb += '\\n';\n for (var ii = 0; ii < tblLgn; ++ii) {\n tb += cells[i][ii];\n }\n tb += '\\n';\n }\n tb += '\\n
    \\n';\n return tb;\n }\n\n function parseTable (rawTable) {\n var i, tableLines = rawTable.split('\\n');\n\n for (i = 0; i < tableLines.length; ++i) {\n // strip wrong first and last column if wrapped tables are used\n if (/^ {0,3}\\|/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n }\n if (/\\|[ \\t]*$/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n }\n // parse code spans first, but we only support one line code spans\n tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals);\n }\n\n var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n rawCells = [],\n headers = [],\n styles = [],\n cells = [];\n\n tableLines.shift();\n tableLines.shift();\n\n for (i = 0; i < tableLines.length; ++i) {\n if (tableLines[i].trim() === '') {\n continue;\n }\n rawCells.push(\n tableLines[i]\n .split('|')\n .map(function (s) {\n return s.trim();\n })\n );\n }\n\n if (rawHeaders.length < rawStyles.length) {\n return rawTable;\n }\n\n for (i = 0; i < rawStyles.length; ++i) {\n styles.push(parseStyles(rawStyles[i]));\n }\n\n for (i = 0; i < rawHeaders.length; ++i) {\n if (showdown.helper.isUndefined(styles[i])) {\n styles[i] = '';\n }\n headers.push(parseHeaders(rawHeaders[i], styles[i]));\n }\n\n for (i = 0; i < rawCells.length; ++i) {\n var row = [];\n for (var ii = 0; ii < headers.length; ++ii) {\n if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n }\n row.push(parseCells(rawCells[i][ii], styles[ii]));\n }\n cells.push(row);\n }\n\n return buildTable(headers, cells);\n }\n\n text = globals.converter._dispatch('tables.before', text, options, globals);\n\n // find escaped pipe characters\n text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n // parse multi column tables\n text = text.replace(tableRgx, parseTable);\n\n // parse one column tables\n text = text.replace(singeColTblRgx, parseTable);\n\n text = globals.converter._dispatch('tables.after', text, options, globals);\n\n return text;\n});\n\r\nshowdown.subParser('underline', function (text, options, globals) {\n 'use strict';\n\n if (!options.underline) {\n return text;\n }\n\n text = globals.converter._dispatch('underline.before', text, options, globals);\n\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n }\n\n // escape remaining underscores to prevent them being parsed by italic and bold\n text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('underline.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('unescapeSpecialChars', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals);\n\n text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n\n text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('makeMarkdown.blockquote', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);\n\n if (innerTxt === '') {\n continue;\n }\n txt += innerTxt;\n }\n }\n // cleanup\n txt = txt.trim();\n txt = '> ' + txt.split('\\n').join('\\n> ');\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.codeBlock', function (node, globals) {\n 'use strict';\n\n var lang = node.getAttribute('language'),\n num = node.getAttribute('precodenum');\n return '```' + lang + '\\n' + globals.preList[num] + '\\n```';\n});\n\r\nshowdown.subParser('makeMarkdown.codeSpan', function (node) {\n 'use strict';\n\n return '`' + node.innerHTML + '`';\n});\n\r\nshowdown.subParser('makeMarkdown.emphasis', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '*';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '*';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {\n 'use strict';\n\n var headerMark = new Array(headerLevel + 1).join('#'),\n txt = '';\n\n if (node.hasChildNodes()) {\n txt = headerMark + ' ';\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.hr', function () {\n 'use strict';\n\n return '---';\n});\n\r\nshowdown.subParser('makeMarkdown.image', function (node) {\n 'use strict';\n\n var txt = '';\n if (node.hasAttribute('src')) {\n txt += '![' + node.getAttribute('alt') + '](';\n txt += '<' + node.getAttribute('src') + '>';\n if (node.hasAttribute('width') && node.hasAttribute('height')) {\n txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');\n }\n\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.links', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes() && node.hasAttribute('href')) {\n var children = node.childNodes,\n childrenLength = children.length;\n txt = '[';\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '](';\n txt += '<' + node.getAttribute('href') + '>';\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.list', function (node, globals, type) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var listItems = node.childNodes,\n listItemsLenght = listItems.length,\n listNum = node.getAttribute('start') || 1;\n\n for (var i = 0; i < listItemsLenght; ++i) {\n if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {\n continue;\n }\n\n // define the bullet to use in list\n var bullet = '';\n if (type === 'ol') {\n bullet = listNum.toString() + '. ';\n } else {\n bullet = '- ';\n }\n\n // parse list item\n txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);\n ++listNum;\n }\n\n // add comment at the end to prevent consecutive lists to be parsed as one\n txt += '\\n\\n';\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.listItem', function (node, globals) {\n 'use strict';\n\n var listItemTxt = '';\n\n var children = node.childNodes,\n childrenLenght = children.length;\n\n for (var i = 0; i < childrenLenght; ++i) {\n listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n // if it's only one liner, we need to add a newline at the end\n if (!/\\n$/.test(listItemTxt)) {\n listItemTxt += '\\n';\n } else {\n // it's multiparagraph, so we need to indent\n listItemTxt = listItemTxt\n .split('\\n')\n .join('\\n ')\n .replace(/^ {4}$/gm, '')\n .replace(/\\n\\n+/g, '\\n\\n');\n }\n\n return listItemTxt;\n});\n\r\n\n\nshowdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {\n 'use strict';\n\n spansOnly = spansOnly || false;\n\n var txt = '';\n\n // edge case of text without wrapper paragraph\n if (node.nodeType === 3) {\n return showdown.subParser('makeMarkdown.txt')(node, globals);\n }\n\n // HTML comment\n if (node.nodeType === 8) {\n return '\\n\\n';\n }\n\n // process only node elements\n if (node.nodeType !== 1) {\n return '';\n }\n\n var tagName = node.tagName.toLowerCase();\n\n switch (tagName) {\n\n //\n // BLOCKS\n //\n case 'h1':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\\n\\n'; }\n break;\n case 'h2':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\\n\\n'; }\n break;\n case 'h3':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\\n\\n'; }\n break;\n case 'h4':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\\n\\n'; }\n break;\n case 'h5':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\\n\\n'; }\n break;\n case 'h6':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\\n\\n'; }\n break;\n\n case 'p':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\\n\\n'; }\n break;\n\n case 'blockquote':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\\n\\n'; }\n break;\n\n case 'hr':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\\n\\n'; }\n break;\n\n case 'ol':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\\n\\n'; }\n break;\n\n case 'ul':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\\n\\n'; }\n break;\n\n case 'precode':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\\n\\n'; }\n break;\n\n case 'pre':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\\n\\n'; }\n break;\n\n case 'table':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\\n\\n'; }\n break;\n\n //\n // SPANS\n //\n case 'code':\n txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);\n break;\n\n case 'em':\n case 'i':\n txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);\n break;\n\n case 'strong':\n case 'b':\n txt = showdown.subParser('makeMarkdown.strong')(node, globals);\n break;\n\n case 'del':\n txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);\n break;\n\n case 'a':\n txt = showdown.subParser('makeMarkdown.links')(node, globals);\n break;\n\n case 'img':\n txt = showdown.subParser('makeMarkdown.image')(node, globals);\n break;\n\n default:\n txt = node.outerHTML + '\\n\\n';\n }\n\n // common normalization\n // TODO eventually\n\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.paragraph', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n\n // some text normalization\n txt = txt.trim();\n\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.pre', function (node, globals) {\n 'use strict';\n\n var num = node.getAttribute('prenum');\n return '
    ' + globals.preList[num] + '
    ';\n});\n\r\nshowdown.subParser('makeMarkdown.strikethrough', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '~~';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '~~';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.strong', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '**';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '**';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.table', function (node, globals) {\n 'use strict';\n\n var txt = '',\n tableArray = [[], []],\n headings = node.querySelectorAll('thead>tr>th'),\n rows = node.querySelectorAll('tbody>tr'),\n i, ii;\n for (i = 0; i < headings.length; ++i) {\n var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),\n allign = '---';\n\n if (headings[i].hasAttribute('style')) {\n var style = headings[i].getAttribute('style').toLowerCase().replace(/\\s/g, '');\n switch (style) {\n case 'text-align:left;':\n allign = ':---';\n break;\n case 'text-align:right;':\n allign = '---:';\n break;\n case 'text-align:center;':\n allign = ':---:';\n break;\n }\n }\n tableArray[0][i] = headContent.trim();\n tableArray[1][i] = allign;\n }\n\n for (i = 0; i < rows.length; ++i) {\n var r = tableArray.push([]) - 1,\n cols = rows[i].getElementsByTagName('td');\n\n for (ii = 0; ii < headings.length; ++ii) {\n var cellContent = ' ';\n if (typeof cols[ii] !== 'undefined') {\n cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);\n }\n tableArray[r].push(cellContent);\n }\n }\n\n var cellSpacesCount = 3;\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n var strLen = tableArray[i][ii].length;\n if (strLen > cellSpacesCount) {\n cellSpacesCount = strLen;\n }\n }\n }\n\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n if (i === 1) {\n if (tableArray[i][ii].slice(-1) === ':') {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':';\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');\n }\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);\n }\n }\n txt += '| ' + tableArray[i].join(' | ') + ' |\\n';\n }\n\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.tableCell', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);\n }\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.txt', function (node) {\n 'use strict';\n\n var txt = node.nodeValue;\n\n // multiple spaces are collapsed\n txt = txt.replace(/ +/g, ' ');\n\n // replace the custom ¨NBSP; with a space\n txt = txt.replace(/¨NBSP;/g, ' ');\n\n // \", <, > and & should replace escaped html entities\n txt = showdown.helper.unescapeHTMLEntities(txt);\n\n // escape markdown magic characters\n // emphasis, strong and strikethrough - can appear everywhere\n // we also escape pipe (|) because of tables\n // and escape ` because of code blocks and spans\n txt = txt.replace(/([*_~|`])/g, '\\\\$1');\n\n // escape > because of blockquotes\n txt = txt.replace(/^(\\s*)>/g, '\\\\$1>');\n\n // hash character, only troublesome at the beginning of a line because of headers\n txt = txt.replace(/^#/gm, '\\\\#');\n\n // horizontal rules\n txt = txt.replace(/^(\\s*)([-=]{3,})(\\s*)$/, '$1\\\\$2$3');\n\n // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer\n txt = txt.replace(/^( {0,3}\\d+)\\./gm, '$1\\\\.');\n\n // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)\n txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\\\$2');\n\n // images and links, ] followed by ( is problematic, so we escape it\n txt = txt.replace(/]([\\s]*)\\(/g, '\\\\]$1\\\\(');\n\n // reference URIs must also be escaped\n txt = txt.replace(/^ {0,3}\\[([\\S \\t]*?)]:/gm, '\\\\[$1]:');\n\n return txt;\n});\n\r\nvar root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n define(function () {\n 'use strict';\n return showdown;\n });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n module.exports = showdown;\n\n// Regular Browser loader\n} else {\n root.showdown = showdown;\n}\n}).call(this);\r\n\n//# sourceMappingURL=showdown.js.map\r\n","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};","/**!\n* tippy.js v6.2.6\n* (c) 2017-2020 atomiks\n* MIT License\n*/\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar core = require('@popperjs/core');\n\nvar ROUND_ARROW = '';\nvar BOX_CLASS = \"tippy-box\";\nvar CONTENT_CLASS = \"tippy-content\";\nvar BACKDROP_CLASS = \"tippy-backdrop\";\nvar ARROW_CLASS = \"tippy-arrow\";\nvar SVG_ARROW_CLASS = \"tippy-svg-arrow\";\nvar TOUCH_OPTIONS = {\n passive: true,\n capture: true\n};\n\nfunction hasOwnProperty(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\nfunction getValueAtIndexOrReturn(value, index, defaultValue) {\n if (Array.isArray(value)) {\n var v = value[index];\n return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;\n }\n\n return value;\n}\nfunction isType(value, type) {\n var str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(type + \"]\") > -1;\n}\nfunction invokeWithArgsOrReturn(value, args) {\n return typeof value === 'function' ? value.apply(void 0, args) : value;\n}\nfunction debounce(fn, ms) {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n var timeout;\n return function (arg) {\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n fn(arg);\n }, ms);\n };\n}\nfunction removeProperties(obj, keys) {\n var clone = Object.assign({}, obj);\n keys.forEach(function (key) {\n delete clone[key];\n });\n return clone;\n}\nfunction splitBySpaces(value) {\n return value.split(/\\s+/).filter(Boolean);\n}\nfunction normalizeToArray(value) {\n return [].concat(value);\n}\nfunction pushIfUnique(arr, value) {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\nfunction unique(arr) {\n return arr.filter(function (item, index) {\n return arr.indexOf(item) === index;\n });\n}\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\nfunction arrayFrom(value) {\n return [].slice.call(value);\n}\nfunction removeUndefinedProps(obj) {\n return Object.keys(obj).reduce(function (acc, key) {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\nfunction div() {\n return document.createElement('div');\n}\nfunction isElement(value) {\n return ['Element', 'Fragment'].some(function (type) {\n return isType(value, type);\n });\n}\nfunction isNodeList(value) {\n return isType(value, 'NodeList');\n}\nfunction isMouseEvent(value) {\n return isType(value, 'MouseEvent');\n}\nfunction isReferenceElement(value) {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\nfunction getArrayOfElements(value) {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\nfunction setTransitionDuration(els, value) {\n els.forEach(function (el) {\n if (el) {\n el.style.transitionDuration = value + \"ms\";\n }\n });\n}\nfunction setVisibilityState(els, state) {\n els.forEach(function (el) {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\nfunction getOwnerDocument(elementOrElements) {\n var _normalizeToArray = normalizeToArray(elementOrElements),\n element = _normalizeToArray[0];\n\n return element ? element.ownerDocument || document : document;\n}\nfunction isCursorOutsideInteractiveBorder(popperTreeData, event) {\n var clientX = event.clientX,\n clientY = event.clientY;\n return popperTreeData.every(function (_ref) {\n var popperRect = _ref.popperRect,\n popperState = _ref.popperState,\n props = _ref.props;\n var interactiveBorder = props.interactiveBorder;\n var basePlacement = getBasePlacement(popperState.placement);\n var offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n var topDistance = basePlacement === 'bottom' ? offsetData.top.y : 0;\n var bottomDistance = basePlacement === 'top' ? offsetData.bottom.y : 0;\n var leftDistance = basePlacement === 'right' ? offsetData.left.x : 0;\n var rightDistance = basePlacement === 'left' ? offsetData.right.x : 0;\n var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder;\n var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder;\n var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\nfunction updateTransitionEndListener(box, action, listener) {\n var method = action + \"EventListener\"; // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n\n ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {\n box[method](event, listener);\n });\n}\n\nvar currentInput = {\n isTouch: false\n};\nvar lastMouseMoveTime = 0;\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\n\nfunction onDocumentTouchStart() {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\n\nfunction onDocumentMouseMove() {\n var now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\n\nfunction onWindowBlur() {\n var activeElement = document.activeElement;\n\n if (isReferenceElement(activeElement)) {\n var instance = activeElement._tippy;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\nfunction bindGlobalEventListeners() {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar ua = isBrowser ? navigator.userAgent : '';\nvar isIE = /MSIE |Trident\\//.test(ua);\n\nfunction createMemoryLeakWarning(method) {\n var txt = method === 'destroy' ? 'n already-' : ' ';\n return [method + \"() was called on a\" + txt + \"destroyed instance. This is a no-op but\", 'indicates a potential memory leak.'].join(' ');\n}\nfunction clean(value) {\n var spacesAndTabs = /[ \\t]{2,}/g;\n var lineStartWithSpaces = /^[ \\t]*/gm;\n return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n}\n\nfunction getDevMessage(message) {\n return clean(\"\\n %ctippy.js\\n\\n %c\" + clean(message) + \"\\n\\n %c\\uD83D\\uDC77\\u200D This is a development-only message. It will be removed in production.\\n \");\n}\n\nfunction getFormattedMessage(message) {\n return [getDevMessage(message), // title\n 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message\n 'line-height: 1.5', // footer\n 'color: #a6a095;'];\n} // Assume warnings and errors never have the same message\n\nvar visitedMessages;\n\nif (\"development\" !== \"production\") {\n resetVisitedMessages();\n}\n\nfunction resetVisitedMessages() {\n visitedMessages = new Set();\n}\nfunction warnWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console;\n\n visitedMessages.add(message);\n\n (_console = console).warn.apply(_console, getFormattedMessage(message));\n }\n}\nfunction errorWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console2;\n\n visitedMessages.add(message);\n\n (_console2 = console).error.apply(_console2, getFormattedMessage(message));\n }\n}\nfunction validateTargets(targets) {\n var didPassFalsyValue = !targets;\n var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener;\n errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element,', 'Element[], or NodeList.'].join(' '));\n errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is not supported as an argument', 'for virtual positioning. Use props.getReferenceClientRect instead.'].join(' '));\n}\n\nvar pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false\n};\nvar renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999\n};\nvar defaultProps = Object.assign({\n appendTo: function appendTo() {\n return document.body;\n },\n aria: {\n content: 'auto',\n expanded: 'auto'\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate: function onAfterUpdate() {},\n onBeforeUpdate: function onBeforeUpdate() {},\n onCreate: function onCreate() {},\n onDestroy: function onDestroy() {},\n onHidden: function onHidden() {},\n onHide: function onHide() {},\n onMount: function onMount() {},\n onShow: function onShow() {},\n onShown: function onShown() {},\n onTrigger: function onTrigger() {},\n onUntrigger: function onUntrigger() {},\n onClickOutside: function onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null\n}, pluginProps, {}, renderProps);\nvar defaultKeys = Object.keys(defaultProps);\nvar setDefaultProps = function setDefaultProps(partialProps) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n validateProps(partialProps, []);\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (key) {\n defaultProps[key] = partialProps[key];\n });\n};\nfunction getExtendedPassedProps(passedProps) {\n var plugins = passedProps.plugins || [];\n var pluginProps = plugins.reduce(function (acc, plugin) {\n var name = plugin.name,\n defaultValue = plugin.defaultValue;\n\n if (name) {\n acc[name] = passedProps[name] !== undefined ? passedProps[name] : defaultValue;\n }\n\n return acc;\n }, {});\n return Object.assign({}, passedProps, {}, pluginProps);\n}\nfunction getDataAttributeProps(reference, plugins) {\n var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {\n plugins: plugins\n }))) : defaultKeys;\n var props = propKeys.reduce(function (acc, key) {\n var valueAsString = (reference.getAttribute(\"data-tippy-\" + key) || '').trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n }, {});\n return props;\n}\nfunction evaluateProps(reference, props) {\n var out = Object.assign({}, props, {\n content: invokeWithArgsOrReturn(props.content, [reference])\n }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));\n out.aria = Object.assign({}, defaultProps.aria, {}, out.aria);\n out.aria = {\n expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content\n };\n return out;\n}\nfunction validateProps(partialProps, plugins) {\n if (partialProps === void 0) {\n partialProps = {};\n }\n\n if (plugins === void 0) {\n plugins = [];\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (prop) {\n var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps));\n var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); // Check if the prop exists in `plugins`\n\n if (didPassUnknownProp) {\n didPassUnknownProp = plugins.filter(function (plugin) {\n return plugin.name === prop;\n }).length === 0;\n }\n\n warnWhen(didPassUnknownProp, [\"`\" + prop + \"`\", \"is not a valid prop. You may have spelled it incorrectly, or if it's\", 'a plugin, forgot to pass it in an array as props.plugins.', '\\n\\n', 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n', 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/'].join(' '));\n });\n}\n\nvar innerHTML = function innerHTML() {\n return 'innerHTML';\n};\n\nfunction dangerouslySetInnerHTML(element, html) {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value) {\n var arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value);\n }\n }\n\n return arrow;\n}\n\nfunction setContent(content, props) {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\nfunction getChildren(popper) {\n var box = popper.firstElementChild;\n var boxChildren = arrayFrom(box.children);\n return {\n box: box,\n content: boxChildren.find(function (node) {\n return node.classList.contains(CONTENT_CLASS);\n }),\n arrow: boxChildren.find(function (node) {\n return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS);\n }),\n backdrop: boxChildren.find(function (node) {\n return node.classList.contains(BACKDROP_CLASS);\n })\n };\n}\nfunction render(instance) {\n var popper = div();\n var box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n var content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n setContent(content, instance.props);\n popper.appendChild(box);\n box.appendChild(content);\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps, nextProps) {\n var _getChildren = getChildren(popper),\n box = _getChildren.box,\n content = _getChildren.content,\n arrow = _getChildren.arrow;\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth = typeof nextProps.maxWidth === 'number' ? nextProps.maxWidth + \"px\" : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow);\n }\n }\n\n return {\n popper: popper,\n onUpdate: onUpdate\n };\n} // Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\n\nrender.$$tippy = true;\n\nvar idCounter = 1;\nvar mouseMoveListeners = []; // Used by `hideAll()`\n\nvar mountedInstances = [];\nfunction createTippy(reference, passedProps) {\n var props = evaluateProps(reference, Object.assign({}, defaultProps, {}, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n\n var showTimeout;\n var hideTimeout;\n var scheduleHideAnimationFrame;\n var isVisibleFromClick = false;\n var didHideDueToDocumentMouseDown = false;\n var didTouchMove = false;\n var ignoreOnFirstUpdate = false;\n var lastTriggerEvent;\n var currentTransitionEndListener;\n var onFirstUpdate;\n var listeners = [];\n var debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n var currentTarget;\n var doc = getOwnerDocument(props.triggerTarget || reference); // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n\n var id = idCounter++;\n var popperInstance = null;\n var plugins = unique(props.plugins);\n var state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false\n };\n var instance = {\n // properties\n id: id,\n reference: reference,\n popper: div(),\n popperInstance: popperInstance,\n props: props,\n state: state,\n plugins: plugins,\n // methods\n clearDelayTimeouts: clearDelayTimeouts,\n setProps: setProps,\n setContent: setContent,\n show: show,\n hide: hide,\n hideWithInteractivity: hideWithInteractivity,\n enable: enable,\n disable: disable,\n unmount: unmount,\n destroy: destroy\n }; // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n\n /* istanbul ignore if */\n\n if (!props.render) {\n if (\"development\" !== \"production\") {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n } // ===========================================================================\n // Initial mutations\n // ===========================================================================\n\n\n var _props$render = props.render(instance),\n popper = _props$render.popper,\n onUpdate = _props$render.onUpdate;\n\n popper.setAttribute('data-tippy-root', '');\n popper.id = \"tippy-\" + instance.id;\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n var pluginsHooks = plugins.map(function (plugin) {\n return plugin.fn(instance);\n });\n var hasAriaExpanded = reference.hasAttribute('aria-expanded');\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n } // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n\n\n popper.addEventListener('mouseenter', function () {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n popper.addEventListener('mouseleave', function (event) {\n if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {\n doc.addEventListener('mousemove', debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n });\n return instance; // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n\n function getNormalizedTouchSettings() {\n var touch = instance.props.touch;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior() {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn() {\n var _instance$props$rende;\n\n // @ts-ignore\n return !!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy);\n }\n\n function getCurrentTarget() {\n return currentTarget || reference;\n }\n\n function getDefaultTemplateChildren() {\n return getChildren(popper);\n }\n\n function getDelay(isShow) {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === 'focus') {\n return 0;\n }\n\n return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);\n }\n\n function handleStyles() {\n popper.style.pointerEvents = instance.props.interactive && instance.state.isVisible ? '' : 'none';\n popper.style.zIndex = \"\" + instance.props.zIndex;\n }\n\n function invokeHook(hook, args, shouldInvokePropsHook) {\n if (shouldInvokePropsHook === void 0) {\n shouldInvokePropsHook = true;\n }\n\n pluginsHooks.forEach(function (pluginHooks) {\n if (pluginHooks[hook]) {\n pluginHooks[hook].apply(void 0, args);\n }\n });\n\n if (shouldInvokePropsHook) {\n var _instance$props;\n\n (_instance$props = instance.props)[hook].apply(_instance$props, args);\n }\n }\n\n function handleAriaContentAttribute() {\n var aria = instance.props.aria;\n\n if (!aria.content) {\n return;\n }\n\n var attr = \"aria-\" + aria.content;\n var id = popper.id;\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n var currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? currentValue + \" \" + id : id);\n } else {\n var nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute() {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n if (instance.props.interactive) {\n node.setAttribute('aria-expanded', instance.state.isVisible && node === getCurrentTarget() ? 'true' : 'false');\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners() {\n doc.removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(function (listener) {\n return listener !== debouncedOnMouseMove;\n });\n }\n\n function onDocumentPress(event) {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n } // Clicked on interactive popper\n\n\n if (instance.props.interactive && popper.contains(event.target)) {\n return;\n } // Clicked on the event listeners target\n\n\n if (getCurrentTarget().contains(event.target)) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (instance.state.isVisible && instance.props.trigger.indexOf('click') >= 0) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide(); // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n\n didHideDueToDocumentMouseDown = true;\n setTimeout(function () {\n didHideDueToDocumentMouseDown = false;\n }); // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove() {\n didTouchMove = true;\n }\n\n function onTouchStart() {\n didTouchMove = false;\n }\n\n function addDocumentPress() {\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress() {\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration, callback) {\n onTransitionEnd(duration, function () {\n if (!instance.state.isVisible && popper.parentNode && popper.parentNode.contains(popper)) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration, callback) {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration, callback) {\n var box = getDefaultTemplateChildren().box;\n\n function listener(event) {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n } // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n\n\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n currentTransitionEndListener = listener;\n }\n\n function on(eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n });\n }\n\n function addListeners() {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {\n passive: true\n });\n on('touchend', onMouseLeave, {\n passive: true\n });\n }\n\n splitBySpaces(instance.props.trigger).forEach(function (eventType) {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave);\n break;\n\n case 'focus':\n on(isIE ? 'focusout' : 'blur', onBlurOrFocusOut);\n break;\n\n case 'focusin':\n on('focusout', onBlurOrFocusOut);\n break;\n }\n });\n }\n\n function removeListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event) {\n var _lastTriggerEvent;\n\n var shouldScheduleClickHide = false;\n\n if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) {\n return;\n }\n\n var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === 'focus';\n lastTriggerEvent = event;\n currentTarget = event.currentTarget;\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach(function (listener) {\n return listener(event);\n });\n } // Toggle show/hide when clicking click-triggered tooltips\n\n\n if (event.type === 'click' && (instance.props.trigger.indexOf('mouseenter') < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event) {\n var target = event.target;\n var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n var popperTreeData = getNestedPopperTree().concat(popper).map(function (popper) {\n var _instance$popperInsta;\n\n var instance = popper._tippy;\n var state = (_instance$popperInsta = instance.popperInstance) == null ? void 0 : _instance$popperInsta.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props: props\n };\n }\n\n return null;\n }).filter(Boolean);\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event) {\n var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick;\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event) {\n if (instance.props.trigger.indexOf('focusin') < 0 && event.target !== getCurrentTarget()) {\n return;\n } // If focus was moved to within the popper\n\n\n if (instance.props.interactive && event.relatedTarget && popper.contains(event.relatedTarget)) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event) {\n return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0 : false;\n }\n\n function createPopperInstance() {\n destroyPopperInstance();\n var _instance$props2 = instance.props,\n popperOptions = _instance$props2.popperOptions,\n placement = _instance$props2.placement,\n offset = _instance$props2.offset,\n getReferenceClientRect = _instance$props2.getReferenceClientRect,\n moveTransition = _instance$props2.moveTransition;\n var arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n var computedReference = getReferenceClientRect ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement: getReferenceClientRect.contextElement || getCurrentTarget()\n } : reference;\n var tippyModifier = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh.box;\n\n ['placement', 'reference-hidden', 'escaped'].forEach(function (attr) {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[\"data-popper-\" + attr]) {\n box.setAttribute(\"data-\" + attr, '');\n } else {\n box.removeAttribute(\"data-\" + attr);\n }\n }\n });\n state.attributes.popper = {};\n }\n }\n };\n var modifiers = [{\n name: 'offset',\n options: {\n offset: offset\n }\n }, {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5\n }\n }\n }, {\n name: 'flip',\n options: {\n padding: 5\n }\n }, {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition\n }\n }, tippyModifier];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3\n }\n });\n }\n\n modifiers.push.apply(modifiers, (popperOptions == null ? void 0 : popperOptions.modifiers) || []);\n instance.popperInstance = core.createPopper(computedReference, popper, Object.assign({}, popperOptions, {\n placement: placement,\n onFirstUpdate: onFirstUpdate,\n modifiers: modifiers\n }));\n }\n\n function destroyPopperInstance() {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount() {\n var appendTo = instance.props.appendTo;\n var parentNode; // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n\n var node = getCurrentTarget();\n\n if (instance.props.interactive && appendTo === defaultProps.appendTo || appendTo === 'parent') {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n } // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n\n\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n createPopperInstance();\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n // Accessibility check\n warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper, ['Interactive tippy element may not be accessible via keyboard', 'navigation because it is not directly after the reference element', 'in the DOM source order.', '\\n\\n', 'Using a wrapper
    or tag around the reference element', 'solves this by creating a new parentNode context.', '\\n\\n', 'Specifying `appendTo: document.body` silences this warning, but it', 'assumes you are using a focus management solution to handle', 'keyboard navigation.', '\\n\\n', 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity'].join(' '));\n }\n }\n\n function getNestedPopperTree() {\n return arrayFrom(popper.querySelectorAll('[data-tippy-root]'));\n }\n\n function scheduleShow(event) {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n var delay = getDelay(true);\n\n var _getNormalizedTouchSe = getNormalizedTouchSettings(),\n touchValue = _getNormalizedTouchSe[0],\n touchDelay = _getNormalizedTouchSe[1];\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(function () {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event) {\n instance.clearDelayTimeouts();\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n return;\n } // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n\n\n if (instance.props.trigger.indexOf('mouseenter') >= 0 && instance.props.trigger.indexOf('click') >= 0 && ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 && isVisibleFromClick) {\n return;\n }\n\n var delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(function () {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(function () {\n instance.hide();\n });\n }\n } // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n\n\n function enable() {\n instance.state.isEnabled = true;\n }\n\n function disable() {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts() {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n removeListeners();\n var prevProps = instance.props;\n var nextProps = evaluateProps(reference, Object.assign({}, instance.props, {}, partialProps, {\n ignoreAttributes: true\n }));\n instance.props = nextProps;\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce);\n } // Ensure stale aria-expanded attributes are removed\n\n\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach(function (node) {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance(); // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content) {\n instance.setProps({\n content: content\n });\n }\n\n function show() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n } // Early bail-out\n\n\n var isAlreadyVisible = instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration);\n\n if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) {\n return;\n } // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. ) is recommended.\n\n\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n } // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh2 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh2.box,\n content = _getDefaultTemplateCh2.content;\n\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = function onFirstUpdate() {\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true; // reflow\n\n void popper.offsetHeight;\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n var _getDefaultTemplateCh3 = getDefaultTemplateChildren(),\n _box = _getDefaultTemplateCh3.box,\n _content = _getDefaultTemplateCh3.content;\n\n setTransitionDuration([_box, _content], duration);\n setVisibilityState([_box, _content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n pushIfUnique(mountedInstances, instance);\n instance.state.isMounted = true;\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, function () {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n } // Early bail-out\n\n\n var isAlreadyHidden = !instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration);\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles();\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh4.box,\n content = _getDefaultTemplateCh4.content;\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hideWithInteractivity'));\n }\n\n doc.addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance(); // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n nestedPopper._tippy.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter(function (i) {\n return i !== instance;\n });\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n removeListeners();\n delete reference._tippy;\n instance.state.isDestroyed = true;\n invokeHook('onDestroy', [instance]);\n }\n}\n\nfunction tippy(targets, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n var passedProps = Object.assign({}, optionalProps, {\n plugins: plugins\n });\n var elements = getArrayOfElements(targets);\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n var isSingleContentElement = isElement(passedProps.content);\n var isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ['tippy() was passed an Element as the `content` prop, but more than', 'one tippy instance was created by this invocation. This means the', 'content element will only be appended to the last tippy instance.', '\\n\\n', 'Instead, pass the .innerHTML of the element, or use a function that', 'returns a cloned version of the element instead.', '\\n\\n', '1) content: element.innerHTML\\n', '2) content: () => element.cloneNode(true)'].join(' '));\n }\n\n var instances = elements.reduce(function (acc, reference) {\n var instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n }, []);\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\nvar hideAll = function hideAll(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n excludedReferenceOrInstance = _ref.exclude,\n duration = _ref.duration;\n\n mountedInstances.forEach(function (instance) {\n var isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper;\n }\n\n if (!isExcluded) {\n var originalDuration = instance.props.duration;\n instance.setProps({\n duration: duration\n });\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({\n duration: originalDuration\n });\n }\n }\n });\n};\n\nvar createSingleton = function createSingleton(tippyInstances, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n errorWhen(!Array.isArray(tippyInstances), ['The first argument passed to createSingleton() must be an array of', 'tippy instances. The passed value was', String(tippyInstances)].join(' '));\n }\n\n var mutTippyInstances = tippyInstances;\n var references = [];\n var currentTarget;\n var overrides = optionalProps.overrides;\n\n function setReferences() {\n references = mutTippyInstances.map(function (instance) {\n return instance.reference;\n });\n }\n\n function enableInstances(isEnabled) {\n mutTippyInstances.forEach(function (instance) {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n enableInstances(false);\n setReferences();\n var singleton = {\n fn: function fn() {\n return {\n onDestroy: function onDestroy() {\n enableInstances(true);\n },\n onTrigger: function onTrigger(instance, event) {\n var target = event.currentTarget;\n var index = references.indexOf(target); // bail-out\n\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n var overrideProps = (overrides || []).concat('content').reduce(function (acc, prop) {\n acc[prop] = mutTippyInstances[index].props[prop];\n return acc;\n }, {});\n instance.setProps(Object.assign({}, overrideProps, {\n getReferenceClientRect: function getReferenceClientRect() {\n return target.getBoundingClientRect();\n }\n }));\n }\n };\n }\n };\n var instance = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {\n plugins: [singleton].concat(optionalProps.plugins || []),\n triggerTarget: references\n }));\n var originalSetProps = instance.setProps;\n\n instance.setProps = function (props) {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n instance.setInstances = function (nextInstances) {\n enableInstances(true);\n mutTippyInstances = nextInstances;\n enableInstances(false);\n setReferences();\n instance.setProps({\n triggerTarget: references\n });\n };\n\n return instance;\n};\n\nvar BUBBLING_EVENTS_MAP = {\n mouseover: 'mouseenter',\n focusin: 'focus',\n click: 'click'\n};\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\n\nfunction delegate(targets, props) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n errorWhen(!(props && props.target), ['You must specity a `target` prop indicating a CSS selector string matching', 'the target elements that should receive a tippy.'].join(' '));\n }\n\n var listeners = [];\n var childTippyInstances = [];\n var target = props.target;\n var nativeProps = removeProperties(props, ['target']);\n var parentProps = Object.assign({}, nativeProps, {\n trigger: 'manual',\n touch: false\n });\n var childProps = Object.assign({}, nativeProps, {\n showOnCreate: true\n });\n var returnValue = tippy(targets, parentProps);\n var normalizedReturnValue = normalizeToArray(returnValue);\n\n function onTrigger(event) {\n if (!event.target) {\n return;\n }\n\n var targetNode = event.target.closest(target);\n\n if (!targetNode) {\n return;\n } // Get relevant trigger with fallbacks:\n // 1. Check `data-tippy-trigger` attribute on target node\n // 2. Fallback to `trigger` passed to `delegate()`\n // 3. Fallback to `defaultProps.trigger`\n\n\n var trigger = targetNode.getAttribute('data-tippy-trigger') || props.trigger || defaultProps.trigger; // @ts-ignore\n\n if (targetNode._tippy) {\n return;\n }\n\n if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n return;\n }\n\n if (event.type !== 'touchstart' && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0) {\n return;\n }\n\n var instance = tippy(targetNode, childProps);\n\n if (instance) {\n childTippyInstances = childTippyInstances.concat(instance);\n }\n }\n\n function on(node, eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n }\n\n function addEventListeners(instance) {\n var reference = instance.reference;\n on(reference, 'touchstart', onTrigger);\n on(reference, 'mouseover', onTrigger);\n on(reference, 'focusin', onTrigger);\n on(reference, 'click', onTrigger);\n }\n\n function removeEventListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function applyMutations(instance) {\n var originalDestroy = instance.destroy;\n\n instance.destroy = function (shouldDestroyChildInstances) {\n if (shouldDestroyChildInstances === void 0) {\n shouldDestroyChildInstances = true;\n }\n\n if (shouldDestroyChildInstances) {\n childTippyInstances.forEach(function (instance) {\n instance.destroy();\n });\n }\n\n childTippyInstances = [];\n removeEventListeners();\n originalDestroy();\n };\n\n addEventListeners(instance);\n }\n\n normalizedReturnValue.forEach(applyMutations);\n return returnValue;\n}\n\nvar animateFill = {\n name: 'animateFill',\n defaultValue: false,\n fn: function fn(instance) {\n var _instance$props$rende;\n\n // @ts-ignore\n if (!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy)) {\n if (\"development\" !== \"production\") {\n errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');\n }\n\n return {};\n }\n\n var _getChildren = getChildren(instance.popper),\n box = _getChildren.box,\n content = _getChildren.content;\n\n var backdrop = instance.props.animateFill ? createBackdropElement() : null;\n return {\n onCreate: function onCreate() {\n if (backdrop) {\n box.insertBefore(backdrop, box.firstElementChild);\n box.setAttribute('data-animatefill', '');\n box.style.overflow = 'hidden';\n instance.setProps({\n arrow: false,\n animation: 'shift-away'\n });\n }\n },\n onMount: function onMount() {\n if (backdrop) {\n var transitionDuration = box.style.transitionDuration;\n var duration = Number(transitionDuration.replace('ms', '')); // The content should fade in after the backdrop has mostly filled the\n // tooltip element. `clip-path` is the other alternative but is not\n // well-supported and is buggy on some devices.\n\n content.style.transitionDelay = Math.round(duration / 10) + \"ms\";\n backdrop.style.transitionDuration = transitionDuration;\n setVisibilityState([backdrop], 'visible');\n }\n },\n onShow: function onShow() {\n if (backdrop) {\n backdrop.style.transitionDuration = '0ms';\n }\n },\n onHide: function onHide() {\n if (backdrop) {\n setVisibilityState([backdrop], 'hidden');\n }\n }\n };\n }\n};\n\nfunction createBackdropElement() {\n var backdrop = div();\n backdrop.className = BACKDROP_CLASS;\n setVisibilityState([backdrop], 'hidden');\n return backdrop;\n}\n\nvar mouseCoords = {\n clientX: 0,\n clientY: 0\n};\nvar activeInstances = [];\n\nfunction storeMouseCoords(_ref) {\n var clientX = _ref.clientX,\n clientY = _ref.clientY;\n mouseCoords = {\n clientX: clientX,\n clientY: clientY\n };\n}\n\nfunction addMouseCoordsListener(doc) {\n doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc) {\n doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nvar followCursor = {\n name: 'followCursor',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n var doc = getOwnerDocument(instance.props.triggerTarget || reference);\n var isInternalUpdate = false;\n var wasFocusEvent = false;\n var isUnmounted = true;\n var prevProps = instance.props;\n\n function getIsInitialBehavior() {\n return instance.props.followCursor === 'initial' && instance.state.isVisible;\n }\n\n function addListener() {\n doc.addEventListener('mousemove', onMouseMove);\n }\n\n function removeListener() {\n doc.removeEventListener('mousemove', onMouseMove);\n }\n\n function unsetGetReferenceClientRect() {\n isInternalUpdate = true;\n instance.setProps({\n getReferenceClientRect: null\n });\n isInternalUpdate = false;\n }\n\n function onMouseMove(event) {\n // If the instance is interactive, avoid updating the position unless it's\n // over the reference element\n var isCursorOverReference = event.target ? reference.contains(event.target) : true;\n var followCursor = instance.props.followCursor;\n var clientX = event.clientX,\n clientY = event.clientY;\n var rect = reference.getBoundingClientRect();\n var relativeX = clientX - rect.left;\n var relativeY = clientY - rect.top;\n\n if (isCursorOverReference || !instance.props.interactive) {\n instance.setProps({\n getReferenceClientRect: function getReferenceClientRect() {\n var rect = reference.getBoundingClientRect();\n var x = clientX;\n var y = clientY;\n\n if (followCursor === 'initial') {\n x = rect.left + relativeX;\n y = rect.top + relativeY;\n }\n\n var top = followCursor === 'horizontal' ? rect.top : y;\n var right = followCursor === 'vertical' ? rect.right : x;\n var bottom = followCursor === 'horizontal' ? rect.bottom : y;\n var left = followCursor === 'vertical' ? rect.left : x;\n return {\n width: right - left,\n height: bottom - top,\n top: top,\n right: right,\n bottom: bottom,\n left: left\n };\n }\n });\n }\n }\n\n function create() {\n if (instance.props.followCursor) {\n activeInstances.push({\n instance: instance,\n doc: doc\n });\n addMouseCoordsListener(doc);\n }\n }\n\n function destroy() {\n activeInstances = activeInstances.filter(function (data) {\n return data.instance !== instance;\n });\n\n if (activeInstances.filter(function (data) {\n return data.doc === doc;\n }).length === 0) {\n removeMouseCoordsListener(doc);\n }\n }\n\n return {\n onCreate: create,\n onDestroy: destroy,\n onBeforeUpdate: function onBeforeUpdate() {\n prevProps = instance.props;\n },\n onAfterUpdate: function onAfterUpdate(_, _ref2) {\n var followCursor = _ref2.followCursor;\n\n if (isInternalUpdate) {\n return;\n }\n\n if (followCursor !== undefined && prevProps.followCursor !== followCursor) {\n destroy();\n\n if (followCursor) {\n create();\n\n if (instance.state.isMounted && !wasFocusEvent && !getIsInitialBehavior()) {\n addListener();\n }\n } else {\n removeListener();\n unsetGetReferenceClientRect();\n }\n }\n },\n onMount: function onMount() {\n if (instance.props.followCursor && !wasFocusEvent) {\n if (isUnmounted) {\n onMouseMove(mouseCoords);\n isUnmounted = false;\n }\n\n if (!getIsInitialBehavior()) {\n addListener();\n }\n }\n },\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n mouseCoords = {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n\n wasFocusEvent = event.type === 'focus';\n },\n onHidden: function onHidden() {\n if (instance.props.followCursor) {\n unsetGetReferenceClientRect();\n removeListener();\n isUnmounted = true;\n }\n }\n };\n }\n};\n\nfunction getProps(props, modifier) {\n var _props$popperOptions;\n\n return {\n popperOptions: Object.assign({}, props.popperOptions, {\n modifiers: [].concat((((_props$popperOptions = props.popperOptions) == null ? void 0 : _props$popperOptions.modifiers) || []).filter(function (_ref) {\n var name = _ref.name;\n return name !== modifier.name;\n }), [modifier])\n })\n };\n}\n\nvar inlinePositioning = {\n name: 'inlinePositioning',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n\n function isEnabled() {\n return !!instance.props.inlinePositioning;\n }\n\n var placement;\n var cursorRectIndex = -1;\n var isInternalUpdate = false;\n var modifier = {\n name: 'tippyInlinePositioning',\n enabled: true,\n phase: 'afterWrite',\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (isEnabled()) {\n if (placement !== state.placement) {\n instance.setProps({\n getReferenceClientRect: function getReferenceClientRect() {\n return _getReferenceClientRect(state.placement);\n }\n });\n }\n\n placement = state.placement;\n }\n }\n };\n\n function _getReferenceClientRect(placement) {\n return getInlineBoundingClientRect(getBasePlacement(placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);\n }\n\n function setInternalProps(partialProps) {\n isInternalUpdate = true;\n instance.setProps(partialProps);\n isInternalUpdate = false;\n }\n\n function addModifier() {\n if (!isInternalUpdate) {\n setInternalProps(getProps(instance.props, modifier));\n }\n }\n\n return {\n onCreate: addModifier,\n onAfterUpdate: addModifier,\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n var rects = arrayFrom(instance.reference.getClientRects());\n var cursorRect = rects.find(function (rect) {\n return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;\n });\n cursorRectIndex = rects.indexOf(cursorRect);\n }\n },\n onUntrigger: function onUntrigger() {\n cursorRectIndex = -1;\n }\n };\n }\n};\nfunction getInlineBoundingClientRect(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {\n // Not an inline element, or placement is not yet known\n if (clientRects.length < 2 || currentBasePlacement === null) {\n return boundingRect;\n } // There are two rects and they are disjoined\n\n\n if (clientRects.length === 2 && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) {\n return clientRects[cursorRectIndex] || boundingRect;\n }\n\n switch (currentBasePlacement) {\n case 'top':\n case 'bottom':\n {\n var firstRect = clientRects[0];\n var lastRect = clientRects[clientRects.length - 1];\n var isTop = currentBasePlacement === 'top';\n var top = firstRect.top;\n var bottom = lastRect.bottom;\n var left = isTop ? firstRect.left : lastRect.left;\n var right = isTop ? firstRect.right : lastRect.right;\n var width = right - left;\n var height = bottom - top;\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n }\n\n case 'left':\n case 'right':\n {\n var minLeft = Math.min.apply(Math, clientRects.map(function (rects) {\n return rects.left;\n }));\n var maxRight = Math.max.apply(Math, clientRects.map(function (rects) {\n return rects.right;\n }));\n var measureRects = clientRects.filter(function (rect) {\n return currentBasePlacement === 'left' ? rect.left === minLeft : rect.right === maxRight;\n });\n var _top = measureRects[0].top;\n var _bottom = measureRects[measureRects.length - 1].bottom;\n var _left = minLeft;\n var _right = maxRight;\n\n var _width = _right - _left;\n\n var _height = _bottom - _top;\n\n return {\n top: _top,\n bottom: _bottom,\n left: _left,\n right: _right,\n width: _width,\n height: _height\n };\n }\n\n default:\n {\n return boundingRect;\n }\n }\n}\n\nvar sticky = {\n name: 'sticky',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference,\n popper = instance.popper;\n\n function getReference() {\n return instance.popperInstance ? instance.popperInstance.state.elements.reference : reference;\n }\n\n function shouldCheck(value) {\n return instance.props.sticky === true || instance.props.sticky === value;\n }\n\n var prevRefRect = null;\n var prevPopRect = null;\n\n function updatePosition() {\n var currentRefRect = shouldCheck('reference') ? getReference().getBoundingClientRect() : null;\n var currentPopRect = shouldCheck('popper') ? popper.getBoundingClientRect() : null;\n\n if (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) {\n if (instance.popperInstance) {\n instance.popperInstance.update();\n }\n }\n\n prevRefRect = currentRefRect;\n prevPopRect = currentPopRect;\n\n if (instance.state.isMounted) {\n requestAnimationFrame(updatePosition);\n }\n }\n\n return {\n onMount: function onMount() {\n if (instance.props.sticky) {\n updatePosition();\n }\n }\n };\n }\n};\n\nfunction areRectsDifferent(rectA, rectB) {\n if (rectA && rectB) {\n return rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left;\n }\n\n return true;\n}\n\ntippy.setDefaultProps({\n render: render\n});\n\nexports.animateFill = animateFill;\nexports.createSingleton = createSingleton;\nexports.default = tippy;\nexports.delegate = delegate;\nexports.followCursor = followCursor;\nexports.hideAll = hideAll;\nexports.inlinePositioning = inlinePositioning;\nexports.roundArrow = ROUND_ARROW;\nexports.sticky = sticky;\n//# sourceMappingURL=tippy.cjs.js.map\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports[\"vue-js-modal\"]=e():t[\"vue-js-modal\"]=e()}(window,function(){return i={},o.m=n=[function(t,e,n){var i=n(7);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"d763679c\",i,!1,{})},function(t,e,n){var i=n(10);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"6b9cc0e0\",i,!1,{})},function(t,e,n){var i=n(12);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"663c004e\",i,!1,{})},function(t,e){t.exports=function(n){var a=[];return a.toString=function(){return this.map(function(t){var e=function(t,e){var n=t[1]||\"\",i=t[3];if(!i)return n;if(e&&\"function\"==typeof btoa){var o=function(t){return\"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+\" */\"}(i),r=i.sources.map(function(t){return\"/*# sourceURL=\"+i.sourceRoot+t+\" */\"});return[n].concat(r).concat([o]).join(\"\\n\")}return[n].join(\"\\n\")}(t,n);return t[2]?\"@media \"+t[2]+\"{\"+e+\"}\":e}).join(\"\")},a.i=function(t,e){\"string\"==typeof t&&(t=[[null,t,\"\"]]);for(var n={},i=0;in.parts.length&&(i.parts.length=n.parts.length)}else{var r=[];for(o=0;o=this.viewportHeight?Math.max(this.minHeight,this.viewportHeight)+\"px\":\"auto\"},containerClass:function(){return[\"vm--container\",this.scrollable&&this.isAutoHeight&&\"scrollable\"]},modalClass:function(){return[\"vm--modal\",this.classes]},stylesProp:function(){return\"string\"==typeof this.styles?l(this.styles):this.styles},modalStyle:function(){return[this.stylesProp,{top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.trueModalWidth+\"px\",height:this.isAutoHeight?this.autoHeight:this.trueModalHeight+\"px\"}]},isComponentReadyToBeDestroyed:function(){return this.overlayTransitionState===j&&this.modalTransitionState===j}},watch:{isComponentReadyToBeDestroyed:function(t){t&&(this.visible=!1)}},methods:{startTransitionEnter:function(){this.visibility.overlay=!0,this.visibility.modal=!0},startTransitionLeave:function(){this.visibility.overlay=!1,this.visibility.modal=!1},beforeOverlayTransitionEnter:function(){this.overlayTransitionState=C},afterOverlayTransitionEnter:function(){this.overlayTransitionState=A},beforeOverlayTransitionLeave:function(){this.overlayTransitionState=R},afterOverlayTransitionLeave:function(){this.overlayTransitionState=j},beforeModalTransitionEnter:function(){var t=this;this.modalTransitionState=C,this.$nextTick(function(){t.resizeObserver.observe(t.$refs.modal)})},afterModalTransitionEnter:function(){this.modalTransitionState=A,this.draggable&&this.addDraggableListeners(),this.focusTrap&&this.$focusTrap.enable(this.$refs.modal);var t=this.createModalEvent({state:\"opened\"});this.$emit(\"opened\",t)},beforeModalTransitionLeave:function(){this.modalTransitionState=R,this.resizeObserver.unobserve(this.$refs.modal),this.$focusTrap.enabled()&&this.$focusTrap.disable()},afterModalTransitionLeave:function(){this.modalTransitionState=j;var t=this.createModalEvent({state:\"closed\"});this.$emit(\"closed\",t)},onToggle:function(t,e,n){if(this.name===t){var i=void 0===e?!this.visible:e;this.toggle(i,n)}},setInitialSize:function(){var t=y(this.width),e=y(this.height);this.modal.width=t.value,this.modal.widthType=t.type,this.modal.height=e.value,this.modal.heightType=e.type},onEscapeKeyUp:function(t){27===t.which&&this.visible&&this.$modal.hide(this.name)},onWindowResize:function(){this.viewportWidth=s(),this.viewportHeight=window.innerHeight,this.ensureShiftInWindowBounds()},createModalEvent:function(t){var e=0=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&\"function\"==typeof e.then&&\"function\"==typeof e.catch}function l(e){return null==e?\"\":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(\",\"),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():\"\"})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\\B([A-Z])/g,C=g(function(e){return e.replace(w,\"-$1\").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf(\"edge/\")>0,G=(J&&J.indexOf(\"android\"),J&&/iphone|ipad|ipod|ios/.test(J)||\"ios\"===K),X=(J&&/chrome\\/\\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\\/(\\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,\"passive\",{get:function(){Q=!0}}),window.addEventListener(\"test-passive\",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&\"undefined\"!=typeof global&&(global.process&&\"server\"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return\"function\"==typeof e&&/native code/.test(e.toString())}var ie,oe=\"undefined\"!=typeof Symbol&&re(Symbol)&&\"undefined\"!=typeof Reflect&&re(Reflect.ownKeys);ie=\"undefined\"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,\"default\"))a=!1;else if(\"\"===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||\"\")+\"_\"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):\"\"!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key=\"__vlist\"+a+\"_\"+c+\"__\"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&\"$\"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,\"$stable\",a),R(i,\"$key\",s),R(i,\"$hasNormal\",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&\"object\"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||\"string\"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent(\"Event\").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher \"'+this.expression+'\"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,\"_props\",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=\"function\"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data=\"function\"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,\"data()\"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+\"\").charCodeAt(0))&&95!==a&&dn(e,\"_data\",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a=\"function\"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:\"string\"==typeof e?e.split(\",\").indexOf(t)>-1:(n=e,\"[object RegExp]\"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,\"$attrs\",o&&o.attrs||e,null,!0),xe(t,\"$listeners\",n._parentListeners||e,null,!0)}(n),Yt(n,\"beforeCreate\"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided=\"function\"==typeof t?t.call(e):t)}(n),Yt(n,\"created\"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,\"$data\",t),Object.defineProperty(e.prototype,\"$props\",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher \"'+r.expression+'\"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for \"'+e+'\"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,\"config\",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+\"s\"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),\"function\"==typeof e.install?e.install.apply(e,n):\"function\"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?(\"component\"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),\"directive\"===t&&\"function\"==typeof n&&(n={bind:n,update:n}),this.options[t+\"s\"][e]=n,n):this.options[t+\"s\"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,\"$isServer\",{get:te}),Object.defineProperty(wn.prototype,\"$ssrContext\",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,\"FunctionalRenderContext\",{value:Tt}),wn.version=\"2.6.11\";var En=p(\"style,class\"),Nn=p(\"input,textarea,option,select,progress\"),jn=function(e,t,n){return\"value\"===n&&Nn(e)&&\"button\"!==t||\"selected\"===n&&\"option\"===e||\"checked\"===n&&\"input\"===e||\"muted\"===n&&\"video\"===e},Dn=p(\"contenteditable,draggable,spellcheck\"),Ln=p(\"events,caret,typing,plaintext-only\"),Mn=function(e,t){return Hn(t)||\"false\"===t?\"false\":\"contenteditable\"===e&&Ln(t)?t:\"true\"},In=p(\"allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible\"),Fn=\"http://www.w3.org/1999/xlink\",Pn=function(e){return\":\"===e.charAt(5)&&\"xlink\"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):\"\"},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return\"\"}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+\" \"+t:e:t||\"\"}function Vn(e){return Array.isArray(e)?function(e){for(var t,r=\"\",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n=\"allowfullscreen\"===t&&\"EMBED\"===e.tagName?\"true\":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&\"TEXTAREA\"===e.tagName&&\"placeholder\"===t&&\"\"!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener(\"input\",r)};e.addEventListener(\"input\",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute(\"class\",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\\w).+\\-_$\\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&\" \"===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'\"'+e.slice($r+1)+'\"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+\"=\"+t:\"$set(\"+n.exp+\", \"+n.key+\", \"+t+\")\"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr=\"__r\",Zr=\"__c\";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?\"change\":\"input\";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]=\"\");for(i in c){if(o=c[i],\"textContent\"===i||\"innerHTML\"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if(\"value\"===i&&\"PROGRESS\"!==a.tagName){a._value=o;var u=t(o)?\"\":String(o);ii(a,u)&&(a.value=u)}else if(\"innerHTML\"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement(\"div\")).innerHTML=\"\"+o+\"\";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&(\"OPTION\"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):\"string\"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,\"\"),\"important\");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=\" \"+(e.getAttribute(\"class\")||\"\")+\" \";n.indexOf(\" \"+t+\" \")<0&&e.setAttribute(\"class\",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(\" \")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute(\"class\");else{for(var n=\" \"+(e.getAttribute(\"class\")||\"\")+\" \",r=\" \"+t+\" \";n.indexOf(r)>=0;)n=n.replace(r,\" \");(n=n.trim())?e.setAttribute(\"class\",n):e.removeAttribute(\"class\")}}function bi(e){if(e){if(\"object\"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||\"v\")),A(t,e),t}return\"string\"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+\"-enter\",enterToClass:e+\"-enter-to\",enterActiveClass:e+\"-enter-active\",leaveClass:e+\"-leave\",leaveToClass:e+\"-leave-to\",leaveActiveClass:e+\"-leave-active\"}}),wi=z&&!W,Ci=\"transition\",xi=\"animation\",ki=\"transition\",Ai=\"transitionend\",Oi=\"animation\",Si=\"animationend\";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki=\"WebkitTransition\",Ai=\"webkitTransitionEnd\"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi=\"WebkitAnimation\",Si=\"webkitAnimationEnd\"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+\"Property\"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,\"\"),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,\"\"):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return\"_value\"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,\"input\"))}function Xi(e,t){var n=document.createEvent(\"HTMLEvents\");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay=\"none\"===e.style.display?\"\":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:\"none\"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display=\"none\"})):e.style.display=r?e.__vOriginalDisplay:\"none\")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\\d-keep-alive$/.test(t.tag))return e(\"keep-alive\",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return\"show\"===e.name},ao={name:\"transition\",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s=\"__transition-\"+this._uid+\"-\";a.key=null==a.key?a.isComment?s+\"comment\":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if(\"out-in\"===r)return this._leaving=!0,it(f,\"afterLeave\",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if(\"in-out\"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,\"afterEnter\",d),it(c,\"enterCancelled\",d),it(f,\"delayLeave\",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform=\"translate(\"+r+\"px,\"+i+\"px)\",o.transitionDuration=\"0s\"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||\"span\",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,\"beforeMount\"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,\"beforeUpdate\")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,\"mounted\")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit(\"init\",wn)},0);var po=/\\{\\{((?:.|\\r?\\n)+?)\\}\\}/g,vo=/[-.*+?^${}()|[\\]\\/\\\\]/g,ho=g(function(e){var t=e[0].replace(vo,\"\\\\$&\"),n=e[1].replace(vo,\"\\\\$&\");return new RegExp(t+\"((?:.|\\\\n)+?)\"+n,\"g\")});var mo={staticKeys:[\"staticClass\"],transformNode:function(e,t){t.warn;var n=Fr(e,\"class\");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,\"class\",!1);r&&(e.classBinding=r)},genData:function(e){var t=\"\";return e.staticClass&&(t+=\"staticClass:\"+e.staticClass+\",\"),e.classBinding&&(t+=\"class:\"+e.classBinding+\",\"),t}};var yo,go={staticKeys:[\"staticStyle\"],transformNode:function(e,t){t.warn;var n=Fr(e,\"style\");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,\"style\",!1);r&&(e.styleBinding=r)},genData:function(e){var t=\"\";return e.staticStyle&&(t+=\"staticStyle:\"+e.staticStyle+\",\"),e.styleBinding&&(t+=\"style:(\"+e.styleBinding+\"),\"),t}},_o=function(e){return(yo=yo||document.createElement(\"div\")).innerHTML=e,yo.textContent},bo=p(\"area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr\"),$o=p(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source\"),wo=p(\"address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track\"),Co=/^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,xo=/^\\s*((?:v-[\\w-]+:|@|:|#)\\[[^=]+\\][^\\s\"'<>\\/=]*)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,ko=\"[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z\"+P.source+\"]*\",Ao=\"((?:\"+ko+\"\\\\:)?\"+ko+\")\",Oo=new RegExp(\"^<\"+Ao),So=/^\\s*(\\/?)>/,To=new RegExp(\"^<\\\\/\"+Ao+\"[^>]*>\"),Eo=/^]+>/i,No=/^\",\""\":'\"',\"&\":\"&\",\" \":\"\\n\",\" \":\"\\t\",\"'\":\"'\"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p(\"pre,textarea\",!0),Ro=function(e,t){return e&&Po(e)&&\"\\n\"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:|^#/,Xo=/([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/,Yo=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,Qo=/^\\(|\\)$/g,ea=/^\\[.*\\]$/,ta=/:(.*)$/,na=/^:|^\\.|^v-bind:/,ra=/\\.[^.\\]]+(?=[^\\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\\r\\n]/,aa=/\\s+/g,sa=g(_o),ca=\"_empty_\";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,\"transformNode\"),Vo=Tr(t.modules,\"preTransformNode\"),Ko=Tr(t.modules,\"postTransformNode\"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'\"default\"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)\",\"i\")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||\"noscript\"===l||(n=n.replace(//g,\"$1\").replace(//g,\"$1\")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),\"\"});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf(\"<\");if(0===d){if(No.test(e)){var v=e.indexOf(\"--\\x3e\");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf(\"]>\");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf(\"<\",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&(\"p\"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else\"br\"===s?t.start&&t.start(e,[],!0,n,o):\"p\"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&\"svg\"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push(\"_s(\"+u+\")\"),s.push({\"@binding\":u}),c=i+r[0].length}return c-1\"+(\"true\"===o?\":(\"+t+\")\":\":_q(\"+t+\",\"+o+\")\")),Mr(e,\"change\",\"var $$a=\"+t+\",$$el=$event.target,$$c=$$el.checked?(\"+o+\"):(\"+a+\");if(Array.isArray($$a)){var $$v=\"+(r?\"_n(\"+i+\")\":i)+\",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&(\"+Br(t,\"$$a.concat([$$v])\")+\")}else{$$i>-1&&(\"+Br(t,\"$$a.slice(0,$$i).concat($$a.slice($$i+1))\")+\")}}else{\"+Br(t,\"$$c\")+\"}\",null,!0)}(e,r,i);else if(\"input\"===o&&\"radio\"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,\"value\")||\"null\";Er(e,\"checked\",\"_q(\"+t+\",\"+(i=r?\"_n(\"+i+\")\":i)+\")\"),Mr(e,\"change\",Br(t,i),null,!0)}(e,r,i);else if(\"input\"===o||\"textarea\"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&\"range\"!==r,u=o?\"change\":\"range\"===r?Wr:\"input\",l=\"$event.target.value\";s&&(l=\"$event.target.value.trim()\"),a&&(l=\"_n(\"+l+\")\");var f=Br(t,l);c&&(f=\"if($event.target.composing)return;\"+f),Er(e,\"value\",\"(\"+t+\")\"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,\"blur\",\"$forceUpdate()\")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,\"textContent\",\"_s(\"+t.value+\")\",t)},html:function(e,t){t.value&&Er(e,\"innerHTML\",\"_s(\"+t.value+\")\",t)}},isPreTag:function(e){return\"pre\"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(\",\")}(ba)},xa=g(function(e){return p(\"type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap\"+(e?\",\"+e:\"\"))});function ka(e,t){e&&($a=xa(t.staticKeys||\"\"),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if(\"template\"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&\"slot\"!==t.tag&&null==t.attrsMap[\"inline-template\"])return;for(var n=0,r=t.children.length;n|^function(?:\\s+[\\w$]+)?\\s*\\(/,Oa=/\\([^)]*?\\);*$/,Sa=/^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:[\"Esc\",\"Escape\"],tab:\"Tab\",enter:\"Enter\",space:[\" \",\"Spacebar\"],up:[\"Up\",\"ArrowUp\"],left:[\"Left\",\"ArrowLeft\"],right:[\"Right\",\"ArrowRight\"],down:[\"Down\",\"ArrowDown\"],delete:[\"Backspace\",\"Delete\",\"Del\"]},Na=function(e){return\"if(\"+e+\")return null;\"},ja={stop:\"$event.stopPropagation();\",prevent:\"$event.preventDefault();\",self:Na(\"$event.target !== $event.currentTarget\"),ctrl:Na(\"!$event.ctrlKey\"),shift:Na(\"!$event.shiftKey\"),alt:Na(\"!$event.altKey\"),meta:Na(\"!$event.metaKey\"),left:Na(\"'button' in $event && $event.button !== 0\"),middle:Na(\"'button' in $event && $event.button !== 1\"),right:Na(\"'button' in $event && $event.button !== 2\")};function Da(e,t){var n=t?\"nativeOn:\":\"on:\",r=\"\",i=\"\";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+\",\"+a+\",\":r+='\"'+o+'\":'+a+\",\"}return r=\"{\"+r.slice(0,-1)+\"}\",i?n+\"_d(\"+r+\",[\"+i.slice(0,-1)+\"])\":n+r}function La(e){if(!e)return\"function(){}\";if(Array.isArray(e))return\"[\"+e.map(function(e){return La(e)}).join(\",\")+\"]\";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,\"\"));if(e.modifiers){var i=\"\",o=\"\",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if(\"exact\"===s){var c=e.modifiers;o+=Na([\"ctrl\",\"shift\",\"alt\",\"meta\"].filter(function(e){return!c[e]}).map(function(e){return\"$event.\"+e+\"Key\"}).join(\"||\"))}else a.push(s);return a.length&&(i+=function(e){return\"if(!$event.type.indexOf('key')&&\"+e.map(Ma).join(\"&&\")+\")return null;\"}(a)),o&&(i+=o),\"function($event){\"+i+(t?\"return \"+e.value+\"($event)\":n?\"return (\"+e.value+\")($event)\":r?\"return \"+e.value:e.value)+\"}\"}return t||n?e.value:\"function($event){\"+(r?\"return \"+e.value:e.value)+\"}\"}function Ma(e){var t=parseInt(e,10);if(t)return\"$event.keyCode!==\"+t;var n=Ta[e],r=Ea[e];return\"_k($event.keyCode,\"+JSON.stringify(e)+\",\"+JSON.stringify(n)+\",$event.key,\"+JSON.stringify(r)+\")\"}var Ia={on:function(e,t){e.wrapListeners=function(e){return\"_g(\"+e+\",\"+t.value+\")\"}},bind:function(e,t){e.wrapData=function(n){return\"_b(\"+n+\",'\"+e.tag+\"',\"+t.value+\",\"+(t.modifiers&&t.modifiers.prop?\"true\":\"false\")+(t.modifiers&&t.modifiers.sync?\",true\":\"\")+\")\"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,\"transformCode\"),this.dataGenFns=Tr(e.modules,\"genData\"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:\"with(this){return \"+(e?Ra(e,n):'_c(\"div\")')+\"}\",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if(\"template\"!==e.tag||e.slotTarget||t.pre){if(\"slot\"===e.tag)return function(e,t){var n=e.slotName||'\"default\"',r=qa(e,t),i=\"_t(\"+n+(r?\",\"+r:\"\"),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap[\"v-bind\"];!o&&!a||r||(i+=\",null\");o&&(i+=\",\"+o);a&&(i+=(o?\"\":\",null\")+\",\"+a);return i+\")\"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return\"_c(\"+e+\",\"+Va(t,n)+(r?\",\"+r:\"\")+\")\"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n=\"_c('\"+e.tag+\"'\"+(r?\",\"+r:\"\")+(i?\",\"+i:\"\")+\")\"}for(var o=0;o>>0}(a):\"\")+\")\"}(e,e.scopedSlots,t)+\",\"),e.model&&(n+=\"model:{value:\"+e.model.value+\",callback:\"+e.model.callback+\",expression:\"+e.model.expression+\"},\"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return\"inlineTemplate:{render:function(){\"+r.render+\"},staticRenderFns:[\"+r.staticRenderFns.map(function(e){return\"function(){\"+e+\"}\"}).join(\",\")+\"]}\"}}(e,t);o&&(n+=o+\",\")}return n=n.replace(/,$/,\"\")+\"}\",e.dynamicAttrs&&(n=\"_b(\"+n+',\"'+e.tag+'\",'+Ga(e.dynamicAttrs)+\")\"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&(\"slot\"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap[\"slot-scope\"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,\"null\");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?\"\":String(e.slotScope),i=\"function(\"+r+\"){return \"+(\"template\"===e.tag?e.if&&n?\"(\"+e.if+\")?\"+(qa(e,t)||\"undefined\")+\":undefined\":qa(e,t)||\"undefined\":Ra(e,t))+\"}\",o=r?\"\":\",proxy:true\";return\"{key:\"+(e.slotTarget||'\"default\"')+\",fn:\"+i+o+\"}\"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&\"template\"!==a.tag&&\"slot\"!==a.tag){var s=n?t.maybeComponent(a)?\",1\":\",0\":\"\";return\"\"+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
    ',ts.innerHTML.indexOf(\" \")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if(\"string\"==typeof r)\"#\"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement(\"div\");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn});","/*!\n * vuex v3.4.0\n * (c) 2020 Evan You\n * @license MIT\n */\n'use strict';\n\nfunction applyMixin (Vue) {\n var version = Number(Vue.version.split('.')[0]);\n\n if (version >= 2) {\n Vue.mixin({ beforeCreate: vuexInit });\n } else {\n // override init and inject vuex init procedure\n // for 1.x backwards compatibility.\n var _init = Vue.prototype._init;\n Vue.prototype._init = function (options) {\n if ( options === void 0 ) options = {};\n\n options.init = options.init\n ? [vuexInit].concat(options.init)\n : vuexInit;\n _init.call(this, options);\n };\n }\n\n /**\n * Vuex init hook, injected into each instances init hooks list.\n */\n\n function vuexInit () {\n var options = this.$options;\n // store injection\n if (options.store) {\n this.$store = typeof options.store === 'function'\n ? options.store()\n : options.store;\n } else if (options.parent && options.parent.$store) {\n this.$store = options.parent.$store;\n }\n }\n}\n\nvar target = typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n if (!devtoolHook) { return }\n\n store._devtoolHook = devtoolHook;\n\n devtoolHook.emit('vuex:init', store);\n\n devtoolHook.on('vuex:travel-to-state', function (targetState) {\n store.replaceState(targetState);\n });\n\n store.subscribe(function (mutation, state) {\n devtoolHook.emit('vuex:mutation', mutation, state);\n }, { prepend: true });\n\n store.subscribeAction(function (action, state) {\n devtoolHook.emit('vuex:action', action, state);\n }, { prepend: true });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n return function () {\n return fn(arg)\n }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n this.runtime = runtime;\n // Store some children item\n this._children = Object.create(null);\n // Store the origin module object which passed by programmer\n this._rawModule = rawModule;\n var rawState = rawModule.state;\n\n // Store the origin module's state\n this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors = { namespaced: { configurable: true } };\n\nprototypeAccessors.namespaced.get = function () {\n return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n return this._children[key]\n};\n\nModule.prototype.hasChild = function hasChild (key) {\n return key in this._children\n};\n\nModule.prototype.update = function update (rawModule) {\n this._rawModule.namespaced = rawModule.namespaced;\n if (rawModule.actions) {\n this._rawModule.actions = rawModule.actions;\n }\n if (rawModule.mutations) {\n this._rawModule.mutations = rawModule.mutations;\n }\n if (rawModule.getters) {\n this._rawModule.getters = rawModule.getters;\n }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n if (this._rawModule.getters) {\n forEachValue(this._rawModule.getters, fn);\n }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n if (this._rawModule.actions) {\n forEachValue(this._rawModule.actions, fn);\n }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n if (this._rawModule.mutations) {\n forEachValue(this._rawModule.mutations, fn);\n }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n // register root module (Vuex.Store options)\n this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n return path.reduce(function (module, key) {\n return module.getChild(key)\n }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n var module = this.root;\n return path.reduce(function (namespace, key) {\n module = module.getChild(key);\n return namespace + (module.namespaced ? key + '/' : '')\n }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n var this$1 = this;\n if ( runtime === void 0 ) runtime = true;\n\n if ((\"development\" !== 'production')) {\n assertRawModule(path, rawModule);\n }\n\n var newModule = new Module(rawModule, runtime);\n if (path.length === 0) {\n this.root = newModule;\n } else {\n var parent = this.get(path.slice(0, -1));\n parent.addChild(path[path.length - 1], newModule);\n }\n\n // register nested modules\n if (rawModule.modules) {\n forEachValue(rawModule.modules, function (rawChildModule, key) {\n this$1.register(path.concat(key), rawChildModule, runtime);\n });\n }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n if (!parent.getChild(key).runtime) { return }\n\n parent.removeChild(key);\n};\n\nModuleCollection.prototype.isRegistered = function isRegistered (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n\n return parent.hasChild(key)\n};\n\nfunction update (path, targetModule, newModule) {\n if ((\"development\" !== 'production')) {\n assertRawModule(path, newModule);\n }\n\n // update target module\n targetModule.update(newModule);\n\n // update nested modules\n if (newModule.modules) {\n for (var key in newModule.modules) {\n if (!targetModule.getChild(key)) {\n if ((\"development\" !== 'production')) {\n console.warn(\n \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n 'manual reload is needed'\n );\n }\n return\n }\n update(\n path.concat(key),\n targetModule.getChild(key),\n newModule.modules[key]\n );\n }\n }\n}\n\nvar functionAssert = {\n assert: function (value) { return typeof value === 'function'; },\n expected: 'function'\n};\n\nvar objectAssert = {\n assert: function (value) { return typeof value === 'function' ||\n (typeof value === 'object' && typeof value.handler === 'function'); },\n expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n getters: functionAssert,\n mutations: functionAssert,\n actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n Object.keys(assertTypes).forEach(function (key) {\n if (!rawModule[key]) { return }\n\n var assertOptions = assertTypes[key];\n\n forEachValue(rawModule[key], function (value, type) {\n assert(\n assertOptions.assert(value),\n makeAssertionMessage(path, key, type, value, assertOptions.expected)\n );\n });\n });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n if (path.length > 0) {\n buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n }\n buf += \" is \" + (JSON.stringify(value)) + \".\";\n return buf\n}\n\nvar Vue; // bind on install\n\nvar Store = function Store (options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n // Auto install if it is not done yet and `window` has `Vue`.\n // To allow users to avoid auto-installation in some cases,\n // this code should be placed here. See #731\n if (!Vue && typeof window !== 'undefined' && window.Vue) {\n install(window.Vue);\n }\n\n if ((\"development\" !== 'production')) {\n assert(Vue, \"must call Vue.use(Vuex) before creating a store instance.\");\n assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n assert(this instanceof Store, \"store must be called with the new operator.\");\n }\n\n var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n var strict = options.strict; if ( strict === void 0 ) strict = false;\n\n // store internal state\n this._committing = false;\n this._actions = Object.create(null);\n this._actionSubscribers = [];\n this._mutations = Object.create(null);\n this._wrappedGetters = Object.create(null);\n this._modules = new ModuleCollection(options);\n this._modulesNamespaceMap = Object.create(null);\n this._subscribers = [];\n this._watcherVM = new Vue();\n this._makeLocalGettersCache = Object.create(null);\n\n // bind commit and dispatch to self\n var store = this;\n var ref = this;\n var dispatch = ref.dispatch;\n var commit = ref.commit;\n this.dispatch = function boundDispatch (type, payload) {\n return dispatch.call(store, type, payload)\n };\n this.commit = function boundCommit (type, payload, options) {\n return commit.call(store, type, payload, options)\n };\n\n // strict mode\n this.strict = strict;\n\n var state = this._modules.root.state;\n\n // init root module.\n // this also recursively registers all sub-modules\n // and collects all module getters inside this._wrappedGetters\n installModule(this, state, [], this._modules.root);\n\n // initialize the store vm, which is responsible for the reactivity\n // (also registers _wrappedGetters as computed properties)\n resetStoreVM(this, state);\n\n // apply plugins\n plugins.forEach(function (plugin) { return plugin(this$1); });\n\n var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;\n if (useDevtools) {\n devtoolPlugin(this);\n }\n};\n\nvar prototypeAccessors$1 = { state: { configurable: true } };\n\nprototypeAccessors$1.state.get = function () {\n return this._vm._data.$$state\n};\n\nprototypeAccessors$1.state.set = function (v) {\n if ((\"development\" !== 'production')) {\n assert(false, \"use store.replaceState() to explicit replace store state.\");\n }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n var this$1 = this;\n\n // check object-style commit\n var ref = unifyObjectStyle(_type, _payload, _options);\n var type = ref.type;\n var payload = ref.payload;\n var options = ref.options;\n\n var mutation = { type: type, payload: payload };\n var entry = this._mutations[type];\n if (!entry) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] unknown mutation type: \" + type));\n }\n return\n }\n this._withCommit(function () {\n entry.forEach(function commitIterator (handler) {\n handler(payload);\n });\n });\n\n this._subscribers\n .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n .forEach(function (sub) { return sub(mutation, this$1.state); });\n\n if (\n (\"development\" !== 'production') &&\n options && options.silent\n ) {\n console.warn(\n \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n 'Use the filter functionality in the vue-devtools'\n );\n }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n var this$1 = this;\n\n // check object-style dispatch\n var ref = unifyObjectStyle(_type, _payload);\n var type = ref.type;\n var payload = ref.payload;\n\n var action = { type: type, payload: payload };\n var entry = this._actions[type];\n if (!entry) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] unknown action type: \" + type));\n }\n return\n }\n\n try {\n this._actionSubscribers\n .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n .filter(function (sub) { return sub.before; })\n .forEach(function (sub) { return sub.before(action, this$1.state); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in before action subscribers: \");\n console.error(e);\n }\n }\n\n var result = entry.length > 1\n ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n : entry[0](payload);\n\n return new Promise(function (resolve, reject) {\n result.then(function (res) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.after; })\n .forEach(function (sub) { return sub.after(action, this$1.state); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in after action subscribers: \");\n console.error(e);\n }\n }\n resolve(res);\n }, function (error) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.error; })\n .forEach(function (sub) { return sub.error(action, this$1.state, error); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in error action subscribers: \");\n console.error(e);\n }\n }\n reject(error);\n });\n })\n};\n\nStore.prototype.subscribe = function subscribe (fn, options) {\n return genericSubscribe(fn, this._subscribers, options)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn, options) {\n var subs = typeof fn === 'function' ? { before: fn } : fn;\n return genericSubscribe(subs, this._actionSubscribers, options)\n};\n\nStore.prototype.watch = function watch (getter, cb, options) {\n var this$1 = this;\n\n if ((\"development\" !== 'production')) {\n assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n }\n return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n var this$1 = this;\n\n this._withCommit(function () {\n this$1._vm._data.$$state = state;\n });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n if ( options === void 0 ) options = {};\n\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n assert(path.length > 0, 'cannot register the root module by using registerModule.');\n }\n\n this._modules.register(path, rawModule);\n installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n // reset store to update getters...\n resetStoreVM(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n var this$1 = this;\n\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n this._modules.unregister(path);\n this._withCommit(function () {\n var parentState = getNestedState(this$1.state, path.slice(0, -1));\n Vue.delete(parentState, path[path.length - 1]);\n });\n resetStore(this);\n};\n\nStore.prototype.hasModule = function hasModule (path) {\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n return this._modules.isRegistered(path)\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n this._modules.update(newOptions);\n resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n var committing = this._committing;\n this._committing = true;\n fn();\n this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors$1 );\n\nfunction genericSubscribe (fn, subs, options) {\n if (subs.indexOf(fn) < 0) {\n options && options.prepend\n ? subs.unshift(fn)\n : subs.push(fn);\n }\n return function () {\n var i = subs.indexOf(fn);\n if (i > -1) {\n subs.splice(i, 1);\n }\n }\n}\n\nfunction resetStore (store, hot) {\n store._actions = Object.create(null);\n store._mutations = Object.create(null);\n store._wrappedGetters = Object.create(null);\n store._modulesNamespaceMap = Object.create(null);\n var state = store.state;\n // init all modules\n installModule(store, state, [], store._modules.root, true);\n // reset vm\n resetStoreVM(store, state, hot);\n}\n\nfunction resetStoreVM (store, state, hot) {\n var oldVm = store._vm;\n\n // bind store public getters\n store.getters = {};\n // reset local getters cache\n store._makeLocalGettersCache = Object.create(null);\n var wrappedGetters = store._wrappedGetters;\n var computed = {};\n forEachValue(wrappedGetters, function (fn, key) {\n // use computed to leverage its lazy-caching mechanism\n // direct inline function use will lead to closure preserving oldVm.\n // using partial to return function with only arguments preserved in closure environment.\n computed[key] = partial(fn, store);\n Object.defineProperty(store.getters, key, {\n get: function () { return store._vm[key]; },\n enumerable: true // for local getters\n });\n });\n\n // use a Vue instance to store the state tree\n // suppress warnings just in case the user has added\n // some funky global mixins\n var silent = Vue.config.silent;\n Vue.config.silent = true;\n store._vm = new Vue({\n data: {\n $$state: state\n },\n computed: computed\n });\n Vue.config.silent = silent;\n\n // enable strict mode for new vm\n if (store.strict) {\n enableStrictMode(store);\n }\n\n if (oldVm) {\n if (hot) {\n // dispatch changes in all subscribed watchers\n // to force getter re-evaluation for hot reloading.\n store._withCommit(function () {\n oldVm._data.$$state = null;\n });\n }\n Vue.nextTick(function () { return oldVm.$destroy(); });\n }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n var isRoot = !path.length;\n var namespace = store._modules.getNamespace(path);\n\n // register in namespace map\n if (module.namespaced) {\n if (store._modulesNamespaceMap[namespace] && (\"development\" !== 'production')) {\n console.error((\"[vuex] duplicate namespace \" + namespace + \" for the namespaced module \" + (path.join('/'))));\n }\n store._modulesNamespaceMap[namespace] = module;\n }\n\n // set state\n if (!isRoot && !hot) {\n var parentState = getNestedState(rootState, path.slice(0, -1));\n var moduleName = path[path.length - 1];\n store._withCommit(function () {\n if ((\"development\" !== 'production')) {\n if (moduleName in parentState) {\n console.warn(\n (\"[vuex] state field \\\"\" + moduleName + \"\\\" was overridden by a module with the same name at \\\"\" + (path.join('.')) + \"\\\"\")\n );\n }\n }\n Vue.set(parentState, moduleName, module.state);\n });\n }\n\n var local = module.context = makeLocalContext(store, namespace, path);\n\n module.forEachMutation(function (mutation, key) {\n var namespacedType = namespace + key;\n registerMutation(store, namespacedType, mutation, local);\n });\n\n module.forEachAction(function (action, key) {\n var type = action.root ? key : namespace + key;\n var handler = action.handler || action;\n registerAction(store, type, handler, local);\n });\n\n module.forEachGetter(function (getter, key) {\n var namespacedType = namespace + key;\n registerGetter(store, namespacedType, getter, local);\n });\n\n module.forEachChild(function (child, key) {\n installModule(store, rootState, path.concat(key), child, hot);\n });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n var noNamespace = namespace === '';\n\n var local = {\n dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ((\"development\" !== 'production') && !store._actions[type]) {\n console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n return store.dispatch(type, payload)\n },\n\n commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ((\"development\" !== 'production') && !store._mutations[type]) {\n console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n store.commit(type, payload, options);\n }\n };\n\n // getters and state object must be gotten lazily\n // because they will be changed by vm update\n Object.defineProperties(local, {\n getters: {\n get: noNamespace\n ? function () { return store.getters; }\n : function () { return makeLocalGetters(store, namespace); }\n },\n state: {\n get: function () { return getNestedState(store.state, path); }\n }\n });\n\n return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n if (!store._makeLocalGettersCache[namespace]) {\n var gettersProxy = {};\n var splitPos = namespace.length;\n Object.keys(store.getters).forEach(function (type) {\n // skip if the target getter is not match this namespace\n if (type.slice(0, splitPos) !== namespace) { return }\n\n // extract local getter type\n var localType = type.slice(splitPos);\n\n // Add a port to the getters proxy.\n // Define as getter property because\n // we do not want to evaluate the getters in this time.\n Object.defineProperty(gettersProxy, localType, {\n get: function () { return store.getters[type]; },\n enumerable: true\n });\n });\n store._makeLocalGettersCache[namespace] = gettersProxy;\n }\n\n return store._makeLocalGettersCache[namespace]\n}\n\nfunction registerMutation (store, type, handler, local) {\n var entry = store._mutations[type] || (store._mutations[type] = []);\n entry.push(function wrappedMutationHandler (payload) {\n handler.call(store, local.state, payload);\n });\n}\n\nfunction registerAction (store, type, handler, local) {\n var entry = store._actions[type] || (store._actions[type] = []);\n entry.push(function wrappedActionHandler (payload) {\n var res = handler.call(store, {\n dispatch: local.dispatch,\n commit: local.commit,\n getters: local.getters,\n state: local.state,\n rootGetters: store.getters,\n rootState: store.state\n }, payload);\n if (!isPromise(res)) {\n res = Promise.resolve(res);\n }\n if (store._devtoolHook) {\n return res.catch(function (err) {\n store._devtoolHook.emit('vuex:error', err);\n throw err\n })\n } else {\n return res\n }\n });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n if (store._wrappedGetters[type]) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] duplicate getter key: \" + type));\n }\n return\n }\n store._wrappedGetters[type] = function wrappedGetter (store) {\n return rawGetter(\n local.state, // local state\n local.getters, // local getters\n store.state, // root state\n store.getters // root getters\n )\n };\n}\n\nfunction enableStrictMode (store) {\n store._vm.$watch(function () { return this._data.$$state }, function () {\n if ((\"development\" !== 'production')) {\n assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n }\n }, { deep: true, sync: true });\n}\n\nfunction getNestedState (state, path) {\n return path.reduce(function (state, key) { return state[key]; }, state)\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n if (isObject(type) && type.type) {\n options = payload;\n payload = type;\n type = type.type;\n }\n\n if ((\"development\" !== 'production')) {\n assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n }\n\n return { type: type, payload: payload, options: options }\n}\n\nfunction install (_Vue) {\n if (Vue && _Vue === Vue) {\n if ((\"development\" !== 'production')) {\n console.error(\n '[vuex] already installed. Vue.use(Vuex) should be called only once.'\n );\n }\n return\n }\n Vue = _Vue;\n applyMixin(Vue);\n}\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(states)) {\n console.error('[vuex] mapState: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(states).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedState () {\n var state = this.$store.state;\n var getters = this.$store.getters;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n if (!module) {\n return\n }\n state = module.context.state;\n getters = module.context.getters;\n }\n return typeof val === 'function'\n ? val.call(this, state, getters)\n : state[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(mutations)) {\n console.error('[vuex] mapMutations: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(mutations).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedMutation () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Get the commit method from store\n var commit = this.$store.commit;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n if (!module) {\n return\n }\n commit = module.context.commit;\n }\n return typeof val === 'function'\n ? val.apply(this, [commit].concat(args))\n : commit.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(getters)) {\n console.error('[vuex] mapGetters: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(getters).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n // The namespace has been mutated by normalizeNamespace\n val = namespace + val;\n res[key] = function mappedGetter () {\n if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n return\n }\n if ((\"development\" !== 'production') && !(val in this.$store.getters)) {\n console.error((\"[vuex] unknown getter: \" + val));\n return\n }\n return this.$store.getters[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(actions)) {\n console.error('[vuex] mapActions: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(actions).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedAction () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // get dispatch function from store\n var dispatch = this.$store.dispatch;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n if (!module) {\n return\n }\n dispatch = module.context.dispatch;\n }\n return typeof val === 'function'\n ? val.apply(this, [dispatch].concat(args))\n : dispatch.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n mapState: mapState.bind(null, namespace),\n mapGetters: mapGetters.bind(null, namespace),\n mapMutations: mapMutations.bind(null, namespace),\n mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n if (!isValidMap(map)) {\n return []\n }\n return Array.isArray(map)\n ? map.map(function (key) { return ({ key: key, val: key }); })\n : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Validate whether given map is valid or not\n * @param {*} map\n * @return {Boolean}\n */\nfunction isValidMap (map) {\n return Array.isArray(map) || isObject(map)\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n return function (namespace, map) {\n if (typeof namespace !== 'string') {\n map = namespace;\n namespace = '';\n } else if (namespace.charAt(namespace.length - 1) !== '/') {\n namespace += '/';\n }\n return fn(namespace, map)\n }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n var module = store._modulesNamespaceMap[namespace];\n if ((\"development\" !== 'production') && !module) {\n console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n }\n return module\n}\n\nvar index_cjs = {\n Store: Store,\n install: install,\n version: '3.4.0',\n mapState: mapState,\n mapMutations: mapMutations,\n mapGetters: mapGetters,\n mapActions: mapActions,\n createNamespacedHelpers: createNamespacedHelpers\n};\n\nmodule.exports = index_cjs;\n","module.exports = \"
    {{b.label}} {{b.mobileLabel}}
    {{disabledMessage}}
    \";\n","module.exports = \"
    {{data.loadingMessage}}
    \";\n","module.exports = \"
    \";\n","module.exports = \"

    {{title}}

    \";\n","module.exports = \"
    \";\n","module.exports = \"

    {{title}}

    {{switcherField.left.label}} {{switcherField.right.label}}
    {{description}}
    {{inputErrorMessage}}
    \";\n","module.exports = \"
    \";\n","module.exports = \"\";\n","module.exports = \"\";\n","module.exports = \"
    • {{s.label}}{{s.selectedValue}}
    \";\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvYm9va21hcmtzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2NvbXBvbmVudC1tb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvY29udGFjdC11cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9jdGEtYmFyLWJvdHRvbS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9jdGEtYmFyLXRvcC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9kb2N1bWVudGF0aW9uLWNvbnRleHR1YWwuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZG9jdW1lbnRhdGlvbi5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9kcmF3ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZXZlbnQtYnVzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2ZldGNoZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZmlsdGVyLWNvbXBvbmVudHMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZm9vdGVyLXVuaXRzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2Z3LW1lZGlhLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2dlbmVyaWMtbW9kYWwuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvaGVyby1wcm9kdWN0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9ob21lLWhlcm8uanMiLCJhc3NldHMvc2NyaXB0cy9saWIvaG93LWl0LXdvcmtzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2ludGVybmFsLXNlYXJjaC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9sZWdhbC1jb21wbGlhbmNlLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2xpdC1vcmRlci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tYXJrZXQtYXBwbGljYXRpb25zLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21lZ2FtZW51LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21lbnUtdG9wLWJhci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tZXRlci1zZWxlY3Rvci9idXR0b24tc2V0LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21ldGVyLXNlbGVjdG9yL2ZyYW1lLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21ldGVyLXNlbGVjdG9yL2lucHV0LWJveC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tZXRlci1zZWxlY3Rvci9zdGVwLWJhci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9taXNjLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZGFsLXRyaWdnZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvbW9kYWxzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvYWZmaWxpYXRlcy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL2ZpbmQtZGlzdHJpYnV0b3IuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvbW9kdWxlcy9nbG9iYWwtbWVzc2FnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL2luZGV4LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvbG9jYXRpb25zLW1hcC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL21ldGVyLXNlbGVjdG9yLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvbXktc2F2ZWQtcGFnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL3JlY2VudC1wb3N0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL3NvbHV0aW9uLWFyZWEuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcGFyZG90LWZvcm0uanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcGF0ZW50cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9wcm9kdWN0LWNhdGFsb2cuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcHJvZHVjdHMtYWNjZXNzb3JpZXMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcXVpY2stbGlua3MuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc2VhcmNoLXJlc3VsdHMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc2xpZGVzaG93LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL3NvZnR3YXJlLWNhcmQuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc29mdHdhcmUtZmlybXdhcmUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3BlYy10YWJsZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9zcGVjaWZpY2F0aW9ucy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9zdG9yYWdlLW1hbmFnZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3RvcmUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3ViLW5hdi5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90YWJzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL3RlbXBsYXRlLXN0cmluZ3MvbXktc2F2ZWQtcGFnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3JlY2VudC1wb3N0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3NvbHV0aW9uLWFyZWEuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvdGVtcGxhdGUtc3RyaW5ncy90YWJzLWNvbXBvbmVudC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZXN0aW1vbmlhbC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90aW1lbGluZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi92aWRlby1wbGF5ZXItbGluay5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi92aWRlby1wbGF5ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9tYWluLmpzIiwiYXNzZXRzL3NjcmlwdHMvcG9seWZpbGxzL2VsZW1lbnQuY2xvc2VzdC5qcyIsImFzc2V0cy9zY3JpcHRzL3BvbHlmaWxscy9tYXRjaE1lZGlhLmpzIiwiZGIuanNvbiIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9kaXN0L2Nqcy9wb3BwZXIuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2JpbmQuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZmVhdHVyZXMvcHJvbWlzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2RzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlci1hZ2VudC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYWxsLXNldHRsZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2ludGVyc2VjdGlvbi1vYnNlcnZlci9pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIuanMiLCJub2RlX21vZHVsZXMvbG9yeS5qcy9kaXN0L2xvcnkuanMiLCJub2RlX21vZHVsZXMvbm9kZWxpc3QtZm9yZWFjaC1wb2x5ZmlsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9zaG93ZG93bi9kaXN0L3Nob3dkb3duLmpzIiwibm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJub2RlX21vZHVsZXMvdGlwcHkuanMvZGlzdC90aXBweS5janMuanMiLCJub2RlX21vZHVsZXMvdnVlLWpzLW1vZGFsL2Rpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy92dWV4L2Rpc3QvdnVleC5jb21tb24uanMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItYnV0dG9uLXNldC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItY29udGVudC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUtcXVlc3Rpb24uaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLWZyYW1lLXNlcGFyYXRvci5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUuaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLWlucHV0LWJveC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItcGFnaW5hdG9yLmhicyIsInZpZXdzL3BhcnRpYWxzL3NoYXJlZC9tZXRlci1zZWxlY3Rvci1wcm9kdWN0LWl0ZW0taC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLXYuaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLXN0ZXAtYmFyLmhicyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUNBQTs7QUFDQTs7OztBQUVBLElBQU0sU0FBUyxHQUFHLFNBQVosU0FBWSxHQUFNO0FBRXBCLE1BQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxnQkFBVCxDQUEwQixxQkFBMUIsQ0FBcEI7O0FBRUEsTUFBSSxtQkFBbUIsR0FBRyxTQUF0QixtQkFBc0IsQ0FBQyxFQUFELEVBQVE7QUFDOUIsdUJBQUksU0FBSixDQUFjLFVBQWQsRUFBMEI7QUFDdEIsTUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFELENBRGU7QUFFdEIsTUFBQSxJQUFJLEVBQUUsZ0JBQVc7QUFDYixlQUFPO0FBQ0gsVUFBQSxZQUFZLEVBQUUsS0FEWDtBQUVILFVBQUEsRUFBRSxFQUFFLElBRkQ7QUFHSCxVQUFBLElBQUksRUFBRTtBQUhILFNBQVA7QUFLSCxPQVJxQjtBQVN0QixNQUFBLFFBQVEsRUFBRTtBQUNOLFFBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2QsaUJBQU8sa0JBQU0sS0FBTixDQUFZLFNBQVosV0FBeUIsS0FBSyxJQUE5QixFQUFQO0FBQ0g7QUFISyxPQVRZO0FBY3RCLE1BQUEsS0FBSyxFQUFFO0FBQ0gsUUFBQSxLQUFLLEVBQUUsaUJBQVc7QUFDZCxlQUFLLFlBQUwsR0FBb0IsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixLQUFLLEVBQXpCLElBQStCLElBQS9CLEdBQXNDLEtBQTFEO0FBQ0g7QUFIRSxPQWRlO0FBbUJ0QixNQUFBLE9BQU8sRUFBRTtBQUNMLFFBQUEsY0FESyw0QkFDWTtBQUNiLDRCQUFNLE1BQU4sQ0FBYSxpQkFBYixFQUFnQztB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O0FBQy9DLFlBQUksU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQixRQUFyQixFQUE4QjtBQUMxQixVQUFBLFNBQVMsQ0FBQyxNQUFWLENBQWlCLENBQWpCLEVBQW9CLENBQXBCO0FBQ0g7QUFDSjtBQUNKLEtBTkQ7O0FBUUEsV0FBTyxHQUFQO0FBQ0gsR0F0Q0Q7QUF1Q0gsQ0F6RUEsR0FBRDs7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3B6REE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzE5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyaUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwdUVBO0FBQ0E7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcmtDQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuY29uc3QgYm9va21hcmtzID0gKCkgPT4ge1xuXG4gICAgbGV0IGJvb2ttYXJrSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYm9va21hcmstY29udGFpbmVyJyk7XG5cbiAgICBsZXQgYm9va21hcmtDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdib29rbWFyaycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzW2Ake3RoaXMudHlwZX1gXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnByb2R1Y3RJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuYXJ0aWNsZUlkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyBcInByb2R1Y3RJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IFwiYXJ0aWNsZUlkXCIgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IFwiZG9jdW1lbnRJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyBcInNvZnR3YXJlSWRcIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuYm9va21hcmstY29udGFpbmVyLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuYm9va21hcmstY29udGFpbmVyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGJvb2ttYXJrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBib29rbWFya0l0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGJvb2ttYXJrLWNvbnRhaW5lci0ke2luZGV4fWApO1xuICAgICAgICAgICAgYm9va21hcmtDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJvb2ttYXJrczsiLCIvKlxuICAgIE1FVEhPRFM6XG5cbiAgICAjIENvbXBvbmVudE1vZHVsZS5BZGRNb2R1bGUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAqIEFyZ3VtZW50czpcbiAgICAgICAgICAgIC0ge3N0cmluZ30gdGFyZ2V0XG4gICAgICAgICAgICAtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAgKiBVc2FnZTpcbiAgICAgICAgICAgUmVnaXN0ZXIgYSBNb2R1bGUuIFJlZ2lzdHJhdGlvbiBhbGxvd3Mgc3RhcnRpbmcgYSBuZXcgVnVlIGluc3RhbmNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3UgcHJvdmlkZSBpbiAnb3B0aW9ucycgb2JqZWN0LiAndGFyZ2V0JyBhcmd1bWVudCBpcyB1c2VkIHRvIGZpbmQgdGhlIGVsZW1lbnRzIGluIHRoZSBET00gYW5kIHByb3ZpZGVzIHRoZSBWdWUgaW5zdGFuY2UgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgdG8gbW91bnQgb24uIEl0IGNhbiBiZSBhIENTUyBzZWxlY3RvciBzdHJpbmcuXG5cbiAgICAjIENvbXBvbmVudE1vZHVsZS5Jbml0OlxuICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBldmVyeSBNb2R1bGUgYWRkZWQuXG5cbiAgICBPQkpFQ1RTOlxuXG4gICAgIyBPcHRpb25zXG4gICAgICAgIFdpdGggdGhlICdvcHRpb25zJyBhcmd1bWVudCBjYW4gcGFzcyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBWdWUgKGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jT3B0aW9ucy1EYXRhKSBleGNlcHQgJ2VsJyBhbmQgJ2NvbXBvbmVudHMnIG9wdGlvbnMsIGFuZCBhZGRpdGlvbmFsbHkgdGhlIG5leHQgb3B0aW9uczpcblxuICAgICAgICAtIHthcnJheVtvYmplY3RdfSBjb21wb25lbnRzOlxuICAgICAgICAgIHRoaXMgd29ya3MgbGlrZSBMb2NhbCBSZWdpc3RyYXRpb24gQ29tcG9uZW50IGluIFZldSAoaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy1yZWdpc3RyYXRpb24uaHRtbCksIGp1c3QgaXMgYW4gYXJyYXkgaW4gcGxhY2Ugb2YgYW4gb2JqZWN0IGFuZCB0aGUgaWQgY29tcG9uZW50IG11c3QgYmUgaW4gdGhlICduYW1lJyBwYXJhbWV0ZXIuIGkuZTpcblxuICAgICAgICAgIFtEaXJlY3RseSBpbiBWVUVdOlxuXG4gICAgICAgICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgICAgIGVsOiAnI2FwcCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50LWEnOiBDb21wb25lbnRBLFxuICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50LWInOiBDb21wb25lbnRCXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIFtIRVJFXTpcblxuICAgICAgICAgICAgICAuLi5cbiAgICAgICAgICAgICAgY29tcG9uZW50czogWyB7IG5hbWU6ICdjb21wb25lbnQtYScsIC4uLkNvbXBvbmVudEEgfSwgeyBuYW1lOiAnY29tcG9uZW50LWInLCAuLi5Db21wb25lbnRCIH0gXSxcbiAgICAgICAgICAgICAgLi4uXG5cbiAgICAgICAgLSB7c3RyaW5nfSBwcmVmaXg6XG4gICAgICAgICAgICB0aGlzIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgaWQgY29tcG9uZW50IGFzIHByZWZpeCwgaS5lOlxuICAgICAgICAgICAgcHJlZml4ID0gXCJjb21wX1wiIGFuZCBjb21wb25lbnQubmFtZSA9IFwiZm9ybVwiLiBTbyB0aGUgZmluYWwgcmVzdWx0IHdpbGwgYmUgJ2NvbXBfZm9ybScgYXMgaWQgY29tcG9uZW50LlxuXG4gICAgICAgIC0ge3N0cmluZ30gaW5pdEZ1bmM6XG4gICAgICAgICAgICB0aGlzIGlzIGp1c3QgYSBzaW1wbGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYmVmb3JlIHRvIGNyZWF0ZSB0aGUgVnVlIGluc3RhbmNlLCBmb3IgdGhlIHByZWNvbmRpdGlvbnNcblxuICAgICAgICAtIHtib29sZWFufSBtb3VudDpcbiAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgdHJ1ZSBieSBkZWZhdWx0LiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgaHlkcmF0aW9uIG9mIHRoZSBtb2R1bGUuXG5cbiovXG5cbmltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IENvbXBvbmVudE1vZHVsZSA9IHtcbiAgICBBZGRNb2R1bGU6ICh0YXJnZXQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgQ29tcG9uZW50TW9kdWxlLl9tb2R1bGVzLnB1c2goe3RhcmdldCwgLi4ub3B0aW9uc30pO1xuICAgIH0sXG5cbiAgICBJbml0OiAoKSA9PiB7XG4gICAgICAgIENvbXBvbmVudE1vZHVsZS5fbW9kdWxlcy5mb3JFYWNoKCh7IHByZWZpeCwgY29tcG9uZW50cywgaW5pdEZ1bmMsIHRhcmdldCwgdGVtcGxhdGUsIG1vdW50ID0gdHJ1ZSwgLi4udnVlT3B0aW9ucyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfcHJmeCA9IHByZWZpeCB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YXJnZXQpO1xuICAgICAgICAgICAgZm91bmQuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgaW5pdEZ1bmMgJiYgaW5pdEZ1bmMoVnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWdWUoe1xuICAgICAgICAgICAgICAgICAgICBlbDogIXRlbXBsYXRlICYmIGVsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHM/LnJlZHVjZSgob2JqLCB7bmFtZSwgLi4ub3B0aW9uc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtfcHJmeCtuYW1lXSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi52dWVPcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtb3VudCAmJiBpbnN0YW5jZS4kbW91bnQoZWwsIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuXG5Db21wb25lbnRNb2R1bGUuX21vZHVsZXMgPSBbXTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50TW9kdWxlO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG4vLyBpbXBvcnQgeyBjb250YWN0TW9kYWwgfSBmcm9tIFwiLi9tb2RhbHNcIjtcblxuY29uc3QgQ29udGFjdFVzID0gKCkgPT4ge1xuICAgIFZ1ZS51c2UoVk1vZGFsKTtcblxuICAgIFZ1ZS5jb21wb25lbnQoJ2NvbnRhY3QtdXMnLCB7XG4gICAgICAgIHByb3BzOiBbJ2NvbnRhY3RPcGVuJ10sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIHRvZ2dsZU1vZGFsKCkge1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdjbG9zZS1jb250YWN0Jyk7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgIC8vICAgICBjb250YWN0TW9kYWwudGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhY3RNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgIC8vICAgICBjb250YWN0TW9kYWwub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udGFjdE1vZGFsLmV2ZW50c1xuICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250YWN0VXM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cydcbmltcG9ydCBDb250YWN0VXMgZnJvbSAnLi9jb250YWN0LXVzJztcblxuY29uc3QgY3RhQmFyQm90dG9tID0gKCkgPT4ge1xuICAgIGNvbnN0IGN0YUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJyk7XG5cbiAgICBsZXQgY3RhQmFyQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnY3RhLWJhci1ib3R0b20tdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc1N0aWNreTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBzdG9yZS5zdGF0ZS5pc01vYmlsZSxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpbmFsUG9zaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXB1dGVkSXNNb2JpbGUgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RGb290ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0cnVlO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzdGljay1uYXYnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1bnN0aWNrLW5hdicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9mZignc3RpY2stbmF2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb2ZmKCd1bnN0aWNrLW5hdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS1ib3R0b20tZmluYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJykuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZvb3RlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBpc1N0aWNreTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGFjdE9wZW4gPSB0aGlzLmlzU3RpY2t5ID8gdGhpcy5jb250YWN0T3BlbiA6IGZhbHNlOyBcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUNvbnRhY3QoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW4gPSAhdGhpcy5jb250YWN0T3BlbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykgJiYgIXRoaXMuaXNTdGlja3kgJiYgdGhpcy5jb21wdXRlZElzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1bnN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGlja3kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNob3coKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYm90dG9tIGFmdGVyIDMgc2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGV0ZWN0Rm9vdGVyKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucz0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlU3RpY2t5ID0gKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGaW5hbFBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ZpbmFsUG9zaXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGVyc2lzdGVudC1jdGEtLWJvdHRvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlU3RpY2t5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZvb3RlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3N0aWNrLW5hdicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndW5zdGljay1uYXYnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3kgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2Nsb3NlLWNvbnRhY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0Rm9vdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBDb250YWN0VXMoKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnBlcnNpc3RlbnQtY3RhLS1ib3R0b20tJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoYC5wZXJzaXN0ZW50LWN0YS0tYm90dG9tLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0YUJhci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGN0YUJhci5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBwZXJzaXN0ZW50LWN0YS0tYm90dG9tLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBjdGFCYXJDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGN0YUJhckJvdHRvbTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCBDb250YWN0VXMgZnJvbSAnLi9jb250YWN0LXVzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbi8vIGltcG9ydCB7cXVvdGVNb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuXG5jb25zdCBjdGFCYXJUb3AgPSAoKSA9PiB7XG4gICAgY29uc3QgY3RhQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS10b3AnKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgY3RhQmFyQ29uc3RydWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2N0YS1iYXItdG9wLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0b3JlLnN0YXRlLnBhZ2VUaXRsZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yTGlua3M6IHt0ZXN0OiAndGVzdCd9LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5jaG9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZTogc3RvcmUsIC8vZm9yIHRlc3Rpbmcgb25seVxuICAgICAgICAgICAgICAgICAgICBoYXNBbmNob3JzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wZW5UZXh0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3llZDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsRGlyZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXIgPT0gXCJ1cFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nyb2xsRGlyID09IFwiZG93blwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3RpY2t5TmF2KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxEaXIgPT0gXCJ0b3BcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb250YWN0T3BlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW5UZXh0ID0gdGhpcy5jb250YWN0T3BlbiA/ICcnIDogdGhpcy4kcmVmcy5jb250YWN0QnRuLnF1ZXJ5U2VsZWN0b3IoJy5idXR0b24tdGV4dCcpLmRhdGFzZXQub3BlblRleHQ7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlU2Nyb2xsKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gdGhpcy5wYXJlbnRUb3AgfHwgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFRvcCA9PT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFRvcCA9IGVUb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1RvcCA+IGVUb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJwZXJzaXN0ZW50LWN0YS0tdG9wLWZpeGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcInBlcnNpc3RlbnQtY3RhLS10b3AtZml4ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZUNvbnRhY3QoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RPcGVuID0gIXRoaXMuY29udGFjdE9wZW47XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIHRvZ2dsZU1vZGFsKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcXVvdGVNb2RhbC50ZW1wbGF0ZSgpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcXVvdGVNb2RhbC5uYW1lLCBcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHF1b3RlTW9kYWwub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHF1b3RlTW9kYWwuZXZlbnRzXG4gICAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgICAvLyB9LFxuXG4gICAgICAgICAgICAgICAgc2V0VGl0bGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxJykuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVUaXRsZScsIHBhZ2VUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gc3RvcmUuc3RhdGUucGFnZVRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXRlY3RIZXJvKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucz0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9nZ2xlVGl0bGUgPSAoY2hhbmdlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlLmludGVyc2VjdGlvblJhdGlvID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2hlcm8gTk9UIHZpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGl0bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdoZXJvIHZpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGl0bGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0b2dnbGVUaXRsZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxJykucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtyZXR1cm47fVxuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRBbmNob3JzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN1Yi1uYXZfX2xpc3QtY29udGFpbmVyIGxpIGEnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNBbmNob3JzID0gYW5jaG9yQ29udGFpbmVyLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW5jaG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRlc3QgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yQ29udGFpbmVyLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5pbm5lclRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaXRlbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zdWJzdHIoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCJDTElDS0VEXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFuY2hvcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JMaW5rcyA9IGFuY2hvcnM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2V0UGFnZUFuY2hvcnMnLCBhbmNob3JzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVBbmNob3JzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxQb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVNjcm9sbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXB1dGVkSXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLnRvcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsRGlyID0gXCJ0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS50b3AgPiBzY3JvbGxQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3Vuc3RpY2stbmF2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsRGlyID0gXCJ1cFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzdGljay1uYXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zY3JvbGxEaXIgPSBcImRvd25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51bnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3MgPSAoZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVuc3RpY2t5TmF2KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvYnNlcnZlQW5jaG9ycygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE1hcmdpbjogJzBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGQ6IC4yNVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiBbMCwgLjEsIC4yLCAuMywgLjQsIC41LCAuNiwgLjcsIC44LCAuOSwgMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhyZXNob2xkcyA9IG1vcmUgYWNjdXJhY3lcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldEN1cnJlbnRBbmNob3IgPSAoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5faW50ZXJzZWN0aW9uSGVpZ2h0ID0gZW50cnkuaW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdmlzaWJpbGl0eSBvZiBzZWN0aW9ucyhhbGwpIGFmdGVyIGV2ZXJ5IGludGVyc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9zdFZpc2libGVTZWN0aW9uID0gdGFyZ2V0cy5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Ll9pbnRlcnNlY3Rpb25IZWlnaHQgPiAocHJldiA/IHByZXYuX2ludGVyc2VjdGlvbkhlaWdodCA6IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9zdFZpc2libGVTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QW5jaG9yID0gbW9zdFZpc2libGVTZWN0aW9uLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoc2V0Q3VycmVudEFuY2hvciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JMaW5rcy5mb3JFYWNoKChhbmNob3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7YW5jaG9yLmtleX1cIl1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQpIHsgdGFyZ2V0cy5wdXNoKHRhcmdldCk7IH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuJGVsKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGl0bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVjdEhlcm8oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFuY2hvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRNb2JpbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpcmVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlblRleHQgPSB0aGlzLiRyZWZzLmNvbnRhY3RCdG4ucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykuZGF0YXNldC5vcGVuVGV4dDsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIG9wZW5pbmcgdGhlIGNvbnRhY3QgdG9vbHRpcCBmcm9tIG90aGVyIG1vZHVsZXNcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oYG9wZW4tY29udGFjdGAsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIHRvZ2dsaW5nIHRoZSBjb250YWN0IHRvb2x0aXAgaW4gdGhlIGN0YSB0b3AgYmFyIG9ubHlcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3RvZ2dsZS1jb250YWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbnRhY3QoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignY2xvc2UtY29udGFjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2FuY2hvci1kcm9wZG93bicsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2FuY2hvckxpbmtzJywgJ3Nob3dUaXRsZScsICdoYXNBbmNob3JzJywgJ2lzTW9iaWxlJywgJ2N1cnJlbnRBbmNob3InXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dBbmNob3JzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25BbmNob3I6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvd1RvcEJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZEN1cnJlbnRBbmNob3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50QW5jaG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiY3VycmVudEFuY2hvclwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkFuY2hvciA9IHRoaXMuY3VycmVudEFuY2hvcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHNob3dUb3BCYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgdG9wQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS10b3AnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLnNob3dUb3BCYXIgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRvcEJhci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWJhcicpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dUb3BCYXIgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB0b3BCYXIuY2xhc3NMaXN0LmFkZCgnaGlkZS1iYXInKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgaGFzQW5jaG9yczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0QW5jaG9ycygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwicGFnZVNlY3Rpb25cIiBjbGFzcz1cInBlcnNpc3RlbnQtY3RhX19kcm9wZG93blwiIDphbmNob3ItbGlua3M9YW5jaG9yTGlua3Mgdi1vbjpjaGFuZ2U9XCJqdW1wXCIgdi1pZj1cInNob3dBbmNob3JzXCIgdi1tb2RlbD1cImRyb3Bkb3duQW5jaG9yXCI+XG4gICAgICAgICAgICAgICAgPGFuY2hvci1kcm9wZG93bi1pdGVtIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBhbmNob3JMaW5rc1wiIDprZXk9XCJpbmRleFwiIDpkYXRhPVwiaXRlbVwiLz5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBqdW1wKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJqdW1wXCIpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGAjJHtlLnRhcmdldC52YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXRlY3RBbmNob3JzKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViTmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdWItbmF2XCIpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LnNjcm9sbFkgPiBzdWJOYXYub2Zmc2V0VG9wICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QW5jaG9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FuY2hvcnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaGFzQW5jaG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RBbmNob3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYW5jaG9yLWRyb3Bkb3duLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwiZGF0YS5rZXlcIj57e2RhdGEubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICBgLFxuICAgICAgICB9KTtcblxuICAgICAgICBDb250YWN0VXMoKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiAnLnBlcnNpc3RlbnQtY3RhLS10b3AnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoJy5wZXJzaXN0ZW50LWN0YS0tdG9wJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYoY3RhQmFyKSB7XG4gICAgICAgIGN0YUJhckNvbnN0cnVjdG9yKCk7XG4gICAgfSBcblxufVxuXG5leHBvcnQgZGVmYXVsdCBjdGFCYXJUb3A7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuY29uc3QgZG9jdW1lbnRhdGlvbkNvbnRleHR1YWwgPSAoKSA9PiB7XG5cbiAgICBsZXQgZG9jcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb2MtY29uJyk7XG5cbiAgICBsZXQgZG9jdW1lbnRhdGlvbkNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvY3VtZW50YXRpb24tY29udGV4dHVhbC10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVtYWlsRG9jczogW10sIC8vZm9yIGVtYWlsaW5nLFxuICAgICAgICAgICAgICAgICAgICBtYWlsdG86IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1haWx0b0FsbDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1haWxEb2NzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5uYW1lKX06JTIwJHtpdGVtLnVybH0lMEQlMEFgO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWlsdG8gPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIml0ZW1zXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmVtYWlsRG9jcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsRG9jcyA9IFsuLi50aGlzLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsRG9jcy5zcGxpY2UodGhpcy5lbWFpbERvY3MuaW5kZXhPZihpdGVtKSwxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbXMoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFyZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5uYW1lKX06ICR7aXRlbS51cmx9JTBEJTBBYDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbHRvQWxsID0gbWFpbHRvO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2VtYWlsLWRvY3MnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZS1pdGVtcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZUFsbCgpOyAvL2luaXQgc2hhcmUgYWxsXG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb2MtY2FyZCcpKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvYy1jb24taXRlbScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRvY3VtZW50SWRcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGw6IG51bGwsIC8vaXMgXCJzZWUgYWxsXCIgZmVhdHVyZSBlbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxPcGVuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgIG1vcmVDb250ZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlc1tgJHt0aGlzLnR5cGV9YF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxPcGVuXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBlbWFpbERvYygpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2VtYWlsLWRvY3MnLCB7XCJuYW1lXCI6IHRoaXMubmFtZSwgXCJ1cmxcIjogdGhpcy51cmwsIFwiaWRcIjogdGhpcy5pZH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlRmF2b3JpdGVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSxgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuJHJlZnMubmFtZS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSB0aGlzLiRyZWZzLm5hbWUuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlLWl0ZW1zJywge1wibmFtZVwiOiB0aGlzLm5hbWUsIFwidXJsXCI6IHRoaXMudXJsLCBcImlkXCI6IHRoaXMuaWR9KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlZUFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRvYy1jb24tJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC5kb2MtY29uLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MubGVuZ3RoID4gMCkge1xuICAgICAgICBkb2NzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGRvYy1jb24tJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGRvY3VtZW50YXRpb25Db25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRvY3VtZW50YXRpb25Db250ZXh0dWFsOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCB7IEFjY29yZGlvbiwgU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LCBDaGVja2JveCwgUGFnaW5hdGlvbiB9IGZyb20gJy4vZmlsdGVyLWNvbXBvbmVudHMnO1xuXG5jb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKTtcbn1cblxuY29uc3QgRG9jdW1lbnRhdGlvbiA9ICgpID0+IHtcblxuICAgIGxldCBkb2N1bWVudGF0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50YXRpb24nKTtcblxuICAgIGNvbnN0IGRvY3VtZW50YXRpb25Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdkb2N1bWVudGF0aW9uLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NPbmx5OiBudWxsLCAvL2lzIHNhdmVkIGRvY3Mgb25seSBjaGVja2VkP1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVBbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG51bGwsIC8vc2VhcmNoIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdkb2N1bWVudCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnZmlsdGVyLWFjY29yZGlvbi10ZW1wbGF0ZSc6IEFjY29yZGlvbixcbiAgICAgICAgICAgICAgICAnc2VsZWN0ZWRGaWx0ZXJzJzogU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgJ3BhZ2luYXRpb24nOiBQYWdpbmF0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYWdlUmFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGFuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSB0aGlzLnNhdmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzYXZlZCBvbmx5IGZpbHRlciBpZiBubyBzYXZlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zYXZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJ3NhdmVkRG9jdW1lbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpOyAvLyBoYW5kbGUgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7IC8vIGhhbmRsZSBoaXN0b3J5IHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgYnJhbmQgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcImJyYW5kXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChicmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVByb2R1Y3RzKGJyYW5kcyk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBub3QgYnJhbmQgc2VsZWN0ZWQsIGVtcHR5IHRoZSBwcm9kdWN0cyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByb2R1Y3RzID0gW107IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHByb2R1Y3QgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcih0aGlzLmRhdGEuY2xhc3MsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzT25seSA9IHNhdmVkT25seSA/IHNhdmVkT25seS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9hYm9ydCBpZiBub3QgZG9jdW1lbnRhdGlvbiBtb2R1bGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNhZmVTdHJpbmcoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IHZhbHVlLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiBjaGVja2VkLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5kYXRhLmZpbHRlcnMpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHNwZWNpZmljIGZpbHRlclxuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVQcm9kdWN0cyhicmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5kcy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYC9hcGkvR2V0RG9jdW1lbnRQcm9kdWN0c0J5QnJhbmRgO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvcHJvZHVjdHNCeUJyYW5kXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZDogYnJhbmRTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wcm9kdWN0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0VXJsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRQYXJhbXMgPSB0aGlzLmRhdGEuc2F2ZWREb2NzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeT0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwibGFuZ1wiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuZFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJicmFuZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUeXBlUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImRvY1R5cGVcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZE9ubHkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlUGFyYW1zID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXJsUGFyYW1zID0gXCI/XCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXJsUGFyYW1zICs9XCJxPVwiK2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnVybFBhcmFtcyArPSBgJHtwcm9kdWN0UGFyYW1zICE9PSBcIlwiID8gXCImcHJvZHVjdD1cIiArIHByb2R1Y3RQYXJhbXMgOiBcIlwifSR7bGFuZ1BhcmFtcyAhPT0gXCJcIiA/IFwiJmxhbmc9XCIgKyBsYW5nUGFyYW1zIDogXCJcIn0ke2JyYW5kUGFyYW1zICE9PSBcIlwiID8gXCImYnJhbmQ9XCIgKyBicmFuZFBhcmFtcyA6IFwiXCJ9JHtkb2NUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImZG9jVHlwZT1cIiArIGRvY1R5cGVQYXJhbXMgOiBcIlwifSZzYXZlZERvY3VtZW50cz0ke3NhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpfSZwYWdlPSR7cGFnZVBhcmFtc31gO1xuXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGRpZFlvdU1lYW4oZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeTtcblxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dCcpLnZhbHVlID0gcXVlcnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZGRMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeSA9PT0gbnVsbCA/IG51bGwgOiBxdWVyeSA/IHF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBxdWVyeSA/IDEgOiB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVcmwoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cuZG9jdW1lbnRBUElVcmw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgJHtiYXNlVXJsfSR7YmFzZVVybC5pbmRleE9mKCc/JykgPiAtMSA/ICcnIDogJz8nfWA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9kb2N1bWVudGF0aW9uXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsVGVzdCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL2RvY3VtZW50YXRpb25UZXN0XCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZHVjdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnJhbmQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY1R5cGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmcucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJyYW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb2NUeXBlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdFN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0LmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYW5nU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGxhbmcuam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5kLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUeXBlU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvY1R5cGUuam9pbignfCcpKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXhpb3NQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxOiB0aGlzLmRhdGEucXVlcnkgPyB0aGlzLmRhdGEucXVlcnkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6ICh0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSkgPT0gXCJcIiA/IG51bGwgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5jaGFyQXQoMCkgPT0gXCIsXCIgPyB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5zbGljZSgxKSA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLCAvL0BUT0RPIG1ha2UgdGhpcyBsZXNzIGluc2FuZS4gU2VuZCBOVUxMIGlmIGVtcHR5IHN0cmluZy4gUmVtb3ZlIGxlYWRpbmcgY29tbWEgaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IHByb2R1Y3RTdHIgPT0gXCJcIiA/IG51bGwgOiBwcm9kdWN0U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmdTdHIgPT0gXCJcIiA/IG51bGwgOiBsYW5nU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQ6IGJyYW5kU3RyID09IFwiXCIgPyBudWxsIDogYnJhbmRTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlOiBkb2NUeXBlU3RyID09IFwiXCIgPyBudWxsIDogZG9jVHlwZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jdW1lbnRzOiBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hUZXJtID0gdGhpcy5kYXRhLnF1ZXJ5O1xuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXhpb3NQYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gRGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljIGZyb20gZXBpc2VydmVyIGZpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCwgZGlkeW91bWVhbkNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbiAmJiByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4ubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuLmZvckVhY2goZHltID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5ocmVmPVwiI1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5pbm5lclRleHQgPSBkeW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWRZb3VNZWFuKGFuY2hvckVsZW1lbnQuaW5uZXJUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRWxlbWVudHMucHVzaChhbmNob3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGVhciBvdXQgYWxsIHByZXZpb3VzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGk8YWxsRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IGVsLmFwcGVuZChhbGxFbGVtZW50c1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgYWxsRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFFbC5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiN3B4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsLmZvckVhY2goZWwgPT4gZWwuYXBwZW5kKGNvbW1hRWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBFbmQgb2YgZGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVE0gVEFHR0lOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hUZXJtICYmIHNlYXJjaFRlcm0ubGVuZ3RoID4gMCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllclt3aW5kb3cuZGF0YUxheWVyLmxlbmd0aC0xXS5ldmVudCAhPSBcInNlYXJjaC1yZXN1bHRzXCIgLy8gaGFjayB0byBhdm9pZCBkb3VibGUgZW50cnkuICB0aGlzIHJ1bnMgdHdpY2UgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyAvLyBvbmx5IHB1c2ggaWYgdGhpcyBpcyBhIHF1ZXJ5LCBub3QgYSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkb2N1bWVudGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogc2VhcmNoVGVybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0VUIFJFU1VMVFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50b3RhbFJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuc2hvd25SZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudHJhY2tJZCA9IHJlc3BvbnNlLmRhdGEudHJhY2tJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hhbmdlUGFnZShkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcInByZXZcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZS0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBcIm5leHRcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbLi4udGhpcy5kYXRhLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLnNwbGljZSh0aGlzLmRhdGEuZW1haWxEb2NzLmluZGV4T2YoaXRlbSksMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vdXBkYXRlIGhpc3RvcnkgcmVjb3JkIHdoZW4gZmlsdGVycyBjaGFuZ2VcbiAgICAgICAgICAgICAgICB1cGRhdGVIaXN0b3J5KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7dGhpcy5kYXRhLnVybFBhcmFtc31gO1xuICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShcIlwiLFwiXCIsdXJsKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBkZWVwIGxpbmtpbmcgb24gaGlzdG9yeSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBkZWVwbGluaygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0RmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBhcmFtLnNsaWNlKDAsIHBhcmFtLmluZGV4T2YoJz0nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHBhcmFtLnNsaWNlKHBhcmFtLmluZGV4T2YoJz0nKSArIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT0gXCJmYWxzZVwiIHx8IGNvbnRlbnQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogdGhpcy5kYXRhLnNhdmVkRG9jc0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmluaXRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50QXJyYXkgPSBjb250ZW50LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFycmF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmluaXRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJtYW51YWxzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jVHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IFwiTWFudWFscyUyMCUyNiUyMEd1aWRlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJNYW51YWxzICYgR3VpZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpICE9IFwibWFudWFsc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGluaXRGaWx0ZXJzO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHBhZ2U7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO31cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5kb2N1bWVudGF0aW9uX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAvIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSB0aGlzLmRhdGEudG90YWxQYWdlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkLnNsaWNlKDEpIDogc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IHNob3cvaGlkZSBmaWx0ZXJzIGlmL2lzIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWx0ZXIgdXBkYXRlcyBpbiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZUZpbHRlcnMnLCAoZWwsIGUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZW1haWwtZG9jcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaW50ZXJuYWwtc2VhcmNoJywgKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImRvY3VtZW50YXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy51cGRhdGVIaXN0b3J5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3Njcm9sbC10by10b3AnLCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbERvY3VtZW50YXRpb25BcGlSZXN1bHRzLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbERvY3VtZW50YXRpb25BcGlSZXN1bHRzLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsRG9jdW1lbnRhdGlvbkFwaVJlc3VsdHMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5yZXN1bHRzID0gZnBvZGIuZG9jdW1lbnRhdGlvbi5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEudG90YWxSZXN1bHRzID0gZnBvZGIuZG9jdW1lbnRhdGlvbi50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5kb2N1bWVudGF0aW9uLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWx0ZXJzIGlmIGxlc3MgdGhlbiAxMCBpbml0aWFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlckFyZWFWaXNpYmxlID0gcGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gMTAgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIFwic2hhcmUgYWxsXCIgaWYgNSBvZiBsZXNzIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNoYXJlQWxsID0gcGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tYW51YWxzQW5kR3VpZGVzRmlsdGVyICYmIHdpbmRvdy5oYXNNYW51YWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogd2luZG93Lm1hbnVhbHNBbmRHdWlkZXNGaWx0ZXJWYWx1ZSwgXCJ0eXBlXCI6IFwiZG9jVHlwZVwiLCBcIm5hbWVcIjogd2luZG93Lm1hbnVhbHNBbmRHdWlkZXNGaWx0ZXJOYW1lfV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgICAgICAgICAgICAgIC8vIGZvciBkZWVwbGlua2luZ1xuICAgICAgICAgICAgICAgIC8vIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZG9jLXByb2R1Y3RzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjYXRlZ29yeSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3hcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvY3VtZW50YXRpb25fX3Byb2R1Y3RzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8Y2hlY2tib3gtaXRlbSB2LWZvcj1cIihwcm9kdWN0SXRlbSwgaSkgaW4gZGF0YS5wcm9kdWN0c1wiIDprZXk9aSA6dHlwZT1cInR5cGVcIiA6bGFiZWw9XCJwcm9kdWN0SXRlbS52YWx1ZVwiIDp2YWx1ZT1cInByb2R1Y3RJdGVtLmtleVwiIDpkYXRhPVwiZGF0YVwiIDpjYXRlZ29yeT1cImNhdGVnb3J5XCIvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHJlc3VsdHMgbGlzdFxuICAgICAgICBWdWUuY29tcG9uZW50KCdkb2MtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpc0xvYWRpbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnRhdGlvbl9fY2FyZHMtY29udGVudFwiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgIDxkb2MtcmVzdWx0cy1pdGVtIHYtZm9yPVwiKHJlc3VsdCwgaW5kZXgpIGluIGRhdGEucmVzdWx0c1wiIDpjb250ZW50PVwicmVzdWx0XCIgOmlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkKHJlc3VsdClcIiA6a2V5PVwicmVzdWx0LmlkXCIgOmRhdGE9XCJkYXRhXCIgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZChyZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGkgPT4gaS5pZCA9PSByZXN1bHQuaWQpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzaW5nbGUgcmVzdWx0cyBpdGVtXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvYy1yZXN1bHRzLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2NvbnRlbnQnLCAnaXNTZWxlY3RlZCcsICdpc0xvYWRpbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogdGhpcy5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsOiBudWxsLCAvL2lzIFwic2VlIGFsbFwiIGZlYXR1cmUgZW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsTGFiZWw6IG51bGwsLy9sYWJlbFxuICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVuY29kZWRVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY29udGVudC51cmwpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3VGFiTGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudXJsID8gdGhpcy5jb250ZW50LnVybC5yZXBsYWNlKCdkb3dubG9hZD10cnVlJywgJ2Rvd25sb2FkPWZhbHNlJykgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnTWV0YUJvZHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jdW1lbnRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IHRoaXMuY29udGVudC5leWVicm93LnNwbGl0KFwifFwiKVswXS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuY29udGVudC5uYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZHVjdExpbmVcIjogdGhpcy5jb250ZW50LmRldGFpbHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiOiB0aGlzLmNvbnRlbnQubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRvY3VtZW50SWRcIjogdGhpcy5jb250ZW50LmRvY3VtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5lbWFpbERvY3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5lbWFpbERvY3MubGVuZ3RoID09PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGlkIHdoZW4gY29udGVudCBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsT3BlblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkIGRvYy1jYXJkLS1jaGVja2JveFwiIDpjbGFzcz1cInsnaGlkZS1ib29rbWFyayc6IChkYXRhLnNhdmVkRG9jc09ubHkgPT09IHRydWUpICYmIChpc0Jvb2ttYXJrZWQgPT09IGZhbHNlKX1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiA6ZGF0YS10YWctbWV0YT0ndGFnTWV0YUJvZHknPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3hfX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVja2JveF9faW5wdXRcIiA6dmFsdWU9XCJjb250ZW50LmlkXCIgdi1vbjpjaGFuZ2U9XCJlbWFpbERvY1wiIHYtbW9kZWw9XCJpc0NoZWNrZWRcIiA6Y2hlY2tlZD1cImlzQ2hlY2tlZFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIlNlbGVjdFwifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19jaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2V5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX2V5ZWJyb3dfX2RldGFpbHNcIiByZWY9XCJzZWVBbGxDb250ZW50XCI+e3tjb250ZW50LmV5ZWJyb3d9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX3N1YnRpdGxlLW1vcmVcIiB2LWlmPVwic2VlQWxsICYmIHNlZUFsbE9wZW5cIj5cXHt7bW9yZUNvbnRlbnR9fTwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHYtb246Y2xpY2sucHJldmVudD1cInRvZ2dsZVNlZUFsbFwiIHYtaWY9XCJzZWVBbGxcIj5cXHt7c2VlQWxsTGFiZWx9fTwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibmV3VGFiTGlua1wiIGNsYXNzPVwiZG9jLWNhcmRfX3RpdGxlXCIgdGFyZ2V0PVwiX2JsYW5rXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImRvY3VtZW50XCIsIFwiYWN0aW9uXCI6IFwiUHJldmlld1wifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fc3VidGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5kZXRhaWxzfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZS1tb3JlXCIgdi1pZj1cInNlZUFsbCAmJiBzZWVBbGxPcGVuXCI+XFx7e21vcmVDb250ZW50fX08L3NwYW4+IDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwidG9nZ2xlU2VlQWxsXCIgdi1pZj1cInNlZUFsbFwiPlxce3tzZWVBbGxMYWJlbH19PC9hPiB8IHt7Y29udGVudC5sYW5ndWFnZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWRvd25sb2FkXCIgOmhyZWY9XCJjb250ZW50LnVybFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkRvd25sb2FkXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZW1haWxcIiA6aHJlZj1cIidtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9JyArIGVuY29kZVVSSUNvbXBvbmVudChjb250ZW50Lm5hbWUpICsgJzogJyArIHRoaXMuZW5jb2RlZFVybFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkVtYWlsXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tYm9va21hcmtcIiA6ZGF0YS1kb2N1bWVudC1pZD1cImNvbnRlbnQuaWRcIiByZWY9XCJib29rbWFya1wiIHYtb246Y2xpY2s9XCJoYW5kbGVCb29rbWFya1wiIDpjbGFzcz1cInthY3RpdmU6IGlzQm9va21hcmtlZH1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiZG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgZW1haWxEb2MoKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdlbWFpbC1kb2NzJywge1wibmFtZVwiOiB0aGlzLmNvbnRlbnQubmFtZSwgXCJ1cmxcIjogdGhpcy5jb250ZW50LnVybCwgXCJpZFwiOiB0aGlzLmNvbnRlbnQuaWR9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkb2N1bWVudElkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwuc3BsaXQoL1ssO10rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwucmVwbGFjZShcIiA7IFwiLCBcIiwgXCIpLnNwbGl0KC9bLF0rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpLnJlcGxhY2UoLyAsL2csICcsJyk7O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCkucmVwbGFjZSgvICwvZywgJywnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JlQ29udGVudCA9IG1vcmVEZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTCA9IGAke3RydW5jYXRlZERldGFpbHN9JHttb3JlRGV0YWlscyA9PSBcIlwiID8gJycgOiAnLCd9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja0lkID0gc2VsZi5kYXRhLnRyYWNrSWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRJZCA9IHNlbGYuY29udGVudC5oaXRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9IHNlbGYuZGF0YS5xdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwaS9TZWFyY2hIaXQ/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9Jmg9JHtlbmNvZGVVUklDb21wb25lbnQoaGl0SWQpfSZ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNrSWQpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxBbmNob3JzID0gc2VsZi4kZWwucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsQW5jaG9ycy5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdlbWFpbC1kb2NzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbHRvOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBtYWlsdG9BbGw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWx0byA9IGAke21haWx0b30ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLm5hbWUpfTogJHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS51cmwpfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haWx0byA9IG1haWx0bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlQWxsKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGF0YS5yZXN1bHRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtpdGVtLm5hbWV9OiAke2l0ZW0udXJsfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm1haWx0b0FsbCA9IG1haWx0bztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAocGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRvY3VtZW50YXRpb24tJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLmRvY3VtZW50YXRpb24tJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnRhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRvY3VtZW50YXRpb24uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgZG9jdW1lbnRhdGlvbi0ke2luZGV4fWApO1xuICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkNvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyB3aW5kb3cuc2VlTGVzc0xhYmVsID0gXCJzZWUgbGVzc1wiO1xuICAgIC8vIHdpbmRvdy5zZWVBbGxMYWJlbCA9IFwic2VlIG1vcmVcIjtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBEb2N1bWVudGF0aW9uO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQge3BhcmRvdEZvcm1JbnN0YW5jZX0gZnJvbSBcIi4vcGFyZG90LWZvcm1cIjtcblxuY29uc3QgRHJhd2VyID0gKCkgPT4ge1xuICAgIGNvbnN0IGRyYXdlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhd2VyX193cmFwcGVyJyk7XG4gICAgXG4gICAgbGV0IGRyYXdlckNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIC8vIG1haW4gY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZHJhd2VyLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHN0b3JlLnN0YXRlLmlzTW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBtb2JpbGVTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBtb2JpbGVTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLm1vYmlsZVN0YXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgc2V0QWN0aXZlVGFiKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlVGFiKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhYlRhcmdldCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJUYXJnZXQgIT09IHRoaXMuYWN0aXZlVGFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlcnBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYih0YWJUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmRyYXdlcl9fdGFiLWl0ZW0uYWN0aXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS10YXJnZXQ9JHt0YWJUYXJnZXR9XWApLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zaXZlKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbmxpbmUgc3R5bGVzIGZyb20gYWNjb3JkaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjY29yZGlvbkNvbnRhaW5lcnMgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGlvbkNvbnRhaW5lcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZmlyc3QgdGFiIHRvIGFjdGl2ZVxuICAgICAgICAgICAgICAgIGluaXREZXNrdG9wKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7IC8vdW5kZXIgNzY4cHhcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy9vdmVyIDc2OHB4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZXNrdG9wLCBjaGVjayBmb3IgZGVza3RvcCBidXR0b25zIGFuZCBzZXQgaW5pdGlhbCB0YWJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coc3RvcmUuc3RhdGUuaXNNb2JpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlc2t0b3AoKTsgLy9zZXQgdGhlIGZpcnN0IHRhYiB0byBhY3RpdmUgb24gaW5pdFxuICAgICAgICAgICAgICAgIC8vbGlzdGVuIGZvciBjaGlsZCBjbGljayBldmVudHMgb24gdGhlIGxhYmVscyBhbmQgcGFzcyB0YXJnZXRzIHRvIHBhcmVudFxuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaGFuZGxlLW1vYmlsZScsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdoYW5kbGUtZGVza3RvcCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRlc2t0b3AgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RyYXdlci10YWItbGFiZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhYlRhcmdldDogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRhYjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmFjdGl2ZVRhYiA9PSB0aGlzLnRhYlRhcmdldCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZVRhYihlKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdoYW5kbGUtZGVza3RvcCcsIHRoaXMudGFiVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRoaXMuJGVsLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBtb2JpbGUgYWNjb3JkaW9uIGNvbnRhaW5lcnMgJiBsYWJlbHNcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZHJhd2VyLWNvbnRlbnQtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSwgLy9hY3RpdmUgdGFiIFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiTmFtZTogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSwgLy9pcyBjdXJyZW50IHRhYiB0aGUgc2VsZWN0ZWQgdGFiICdhY3RpdmVUYWInXG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogZmFsc2UsIC8vaXMgdGFiIG9wZW5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKHRhYikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy50YWJOYW1lID09IHRhYiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOyAvL3NldCBhY2NvZGlvbiB0byBjbG9zZSB3aGVuIG5vdCB0aGUgYWN0aXZlIGl0ZW1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmRyYXdlcl9fZHJhd2VyLWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5kcmF3ZXJfX2RyYXdlci1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29udGVudCBhcmVhIGhlaWdodCB0byBjb250ZW50IGhlaWdodCB0byBwcmV2ZW50IHRyYW5zaXRpb25pbmcgZnJvbSBhdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgYWN0aXZlIHRhYiwgc2V0IGlzT3BlbiB0byB0cnVlIHdoZW4gaXNBY3RpdmUgaXMgdHJ1ZSB0byBwcmUgb3BlbiB0aGUgdGFiIG9uIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW9iaWxlVGFyZ2V0ID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuZGF0YXNldC50YWJJZDtcblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaGFuZGxlLW1vYmlsZScsIG1vYmlsZVRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZ2dsZSB0aGUgYWNjb3JkaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY29yZGlvbihlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gdG9nZ2xlIGFjY29yZGlvbnNcbiAgICAgICAgICAgICAgICBoYW5kbGVBY2NvcmRpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1pbm5lcicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsbU9mZnNldCA9IHRoaXMuJGVsLm9mZnNldFRvcDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsZWxtT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ3aW5kb3dcIixzY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxtUG9zID0gdGhpcy4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogKGVsbVBvcyAtIDcwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaW5pdE1vYmlsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJub3QgbW9iaWxlXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGlubGluZSBzdHlsZXMgZm9yIGFjY29yZGlvbnMgb24gZGVza3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRDb250YWluZXJzID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmRyYXdlcl9fZHJhd2VyLWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsVGFiID0gdGhpcy4kZWwuZGF0YXNldC50YWJJZDtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYk5hbWUgPSBpbml0aWFsVGFiO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1vYmlsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpbXBvcnQgcGFyZG90IGZvcm0gY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIHBhcmRvdEZvcm1JbnN0YW5jZTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRyYXdlci0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuZHJhd2VyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRyYXdlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBkcmF3ZXJzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGRyYXdlci0ke2luZGV4fWApO1xuICAgICAgICAgICAgZHJhd2VyQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRHJhd2VyOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5cbmNvbnN0IEV2ZW50QnVzID0gbmV3IFZ1ZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudEJ1czsiLCIvKlxuICAgIEZldGNoZXIgaXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYWRkIHRoZSBWdWUgRmV0Y2hlciBjb21wb25lbnQuXG4gICAgICAgICogQXJndW1lbnRzOlxuICAgICAgICAgICAgLSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgICAgICAtIHtPYmplY3R9IGNvbmZcbiAgICAgICAgKiBVc2FnZTpcbiAgICAgICAgICAgVGhlICdvcHRpb25zJyBhcmd1bWVudCBpcyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGZvciBhIFZ1ZSBDb21wb25lbnQuIGluIGFkZGl0aW9uLCB0aGUgbmV4dCBvcHRpb25zOlxuXG4gICAgICAgICAgIC0gbmFtZSBbc3RyaW5nXTogbmFtZSB1c2VkIGZvciBGZXRjaGVyIGNvbXBvbmVudCBpbiBWdWUuIChieSBkZWZhdWx0IGlzICdmZXRjaCcuIFJlbWVtYmVyIGNvbnNpZGVyaW5nIHRoZSBwcmVmaXggb3B0aW9uLilcblxuICAgICAgICAgICBpbiB0aGUgJ2NvbmYnIGFyZ3VtZW50IHlvdSBjYW4gcHJvdmlkZSB0aGUgbmV4dCBvcHRpb25zOlxuXG4gICAgICAgICAgIC0gZmV0Y2hPbkNyZWF0ZWQgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyBmcm9tIHRoZSBzdGFydFxuICAgICAgICAgICAtIGZldGNoT25VcGRhdGVQYXJhbXMgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyB3aGVuIHRoZSBwYXJhbXMgYXJlIHVwZGF0ZWRcbiAgICAgICAgICAgLSBmZXRjaE9uVXBkYXRlUG9zdERhdGEgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyB3aGVuIHRoZSAncG9zdCBkYXRhJyBvYmplY3QgaXMgdXBkYXRlZFxuICAgICAgICAgICAtIHVybCBbc3RyaW5nXTogaXMgdGhlIHNlcnZlciBVUkwgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAgICAgICAgIC0gbWV0aG9kIFtzdHJpbmddOiBieSBkZWZhdWx0IGlzICdHRVQnLCBpcyB0aGUgcmVxdWVzdCBtZXRob2QgdG8gYmUgdXNlZCB3aGVuIG1ha2luZyB0aGUgcmVxdWVzdFxuICAgICAgICAgICAtIGZldGNoT3B0aW9ucyBbb2JqZWN0XTogaXMgdGhlIEF4aW9zIGNvbmZpZyAoaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zKVxuICAgICAgICAgICAtIGRlYm91bmNlV2FpdCBbaW50ZWdlcl06IHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGV2ZXJ5IGNhbGwgdG8gdGhlIGZldGNoIGZ1bmN0aW9uLCBpdCB1c2VzIGZvciBjaGFuZ2VzIGluIGZpZWxkcyBmb3Igdm9pZGluZyBtdWx0aXBsZSBjYWxscyB0byB0aGUgQVBJIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nICggdGltZSBpbiBtaWxsaXNlY29uZHMuIGJ5IGRlZmF1bHQ6IDUwMCBtaWxsaXNlY29uZHMpXG5cbiAgICAgICAgICAgSnVzdCBQcm9wczpcblxuICAgICAgICAgICAtIHVybC1wcm9wIFtzdHJpbmddOiByZXBsYWNlIHRoZSB1cmwgb3B0aW9uXG4gICAgICAgICAgIC0gbWV0aG9kLXByb3AgW3N0cmluZ106IHJlcGxhY2UgdGhlIG1ldGhvZCBvcHRpb25cbiAgICAgICAgICAgLSBmZXRjaC1vbi1jcmVhdGVkLXByb3AgW2Jvb2xlYW5dOiByZXBsYWNlIHRoZSBmZXRjaE9uQ3JlYXRlZCBvcHRpb25cbiAgICAgICAgICAgLSBmZXRjaC1vbi11cGRhdGUtcG9zdC1kYXRhLXByb3AgW2Jvb2xlYW5dOiByZXBsYWNlIHRoZSBmZXRjaE9uVXBkYXRlUG9zdERhdGEgb3B0aW9uXG4gICAgICAgICAgIC0gZmV0Y2gtb24tdXBkYXRlLXBhcmFtcy1wcm9wIFtib29sZWFuXTogcmVwbGFjZSB0aGUgZmV0Y2hPblVwZGF0ZVBhcmFtc0RhdGEgb3B0aW9uXG5cbiAgICAgICAgICAgTWV0aG9kczpcblxuICAgICAgICAgICBmZXRjaChzdWNjZXNzRnVuYyBbZnVuY3Rpb25dLCBvcHRpb25zIFtPYmplY3RdKTogeW91IGNhbiBjYWxsIHRoZSBmZXRjaCBmdW5jdGlvbiBmb3IgZG9pbmcgYSBjYWxsIHRvIHRoZSBzZXJ2aWNlIG9yIEFQSS4gYWxzbyB5b3UgY2FuIHBhc3MgdGhlIHN1Y2Nlc3NGdW5jIGZ1bmN0aW9uIGZvciBhbHRlcmluZyBwcm9jZXNzIGJ5IGRlZmF1bHQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZvciBjaGFuZ2luZyBvciBtb2RpZnlpbmcgdGhlIEF4aW9zIGNvbmZpZyAoaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zKVxuXG4gICAgICAgICAgIE90aGVyczpcblxuICAgICAgICAgICBQYXJhbXMgKCdwYXJhbXMnKTogaXMgYW4gb2JqZWN0IHdpdGggR0VUIHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0LCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBvYmplY3QgaW4gdGhlIFZ1ZSBEYXRhICh3aXRoIHYtbW9kZWwgb3IgYXMgVnVlIHZhcmlhYmxlKS5cblxuICAgICAgICAgICBQb3N0IERhdGEgKCdwb3N0RGF0YScpOiBpcyBhbiBvYmplY3Qgd2l0aCBQT1NUIGRhdGEgcGFyYW1ldGVycyBmb3IgdGhlIHJlcXVlc3QsIHlvdSBjYW4gdXNlIGl0IGFzIGFuIG9iamVjdCBpbiB0aGUgVnVlIERhdGEgKHdpdGggdi1tb2RlbCBvciBhcyBWdWUgdmFyaWFibGUpLlxuXG4qL1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbGliL21pc2MnO1xuXG5jb25zdCBmZXRjaGVyID0gKHtuYW1lID0gJ2ZldGNoJywgcHJvcHMsIGRhdGE6IGRhdGFQcm9wLCBjcmVhdGVkLCB3YXRjaCwgbWV0aG9kcywgLi4ub3B0aW9uc30sIGNvbmYgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZmV0Y2hPbkNyZWF0ZWQgPSB0cnVlLFxuICAgICAgICBmZXRjaE9uVXBkYXRlUG9zdERhdGEgPSB0cnVlLFxuICAgICAgICBmZXRjaE9uVXBkYXRlUGFyYW1zID0gdHJ1ZSxcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXRob2QgPSAnR0VUJyxcbiAgICAgICAgZmV0Y2hPcHRpb25zOiBfZmV0Y2hPcHRpb25zID0ge30sXG4gICAgICAgIGZldGNoVHJpZ2dlcixcbiAgICAgICAgZGVib3VuY2VXYWl0ID0gNTAwXG4gICAgfSA9IGNvbmY7XG5cbiAgICBjb25zdCB7IGRhdGE6IHBvc3REYXRhID0ge30sIHBhcmFtcyA9IHt9LCBmZXRjaE9wdGlvbnMgfSA9IF9mZXRjaE9wdGlvbnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdXJsUHJvcDogU3RyaW5nLFxuICAgICAgICAgICAgbWV0aG9kUHJvcDogU3RyaW5nLFxuICAgICAgICAgICAgZmV0Y2hPbkNyZWF0ZWRQcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgZmV0Y2hPblVwZGF0ZVBvc3REYXRhUHJvcDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIGZldGNoT25VcGRhdGVQYXJhbXNQcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgLi4ucHJvcHNcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCBfZGF0YVByb3AgPSBkYXRhUHJvcCAmJiBkYXRhUHJvcC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLnVybFByb3AgfHwgdXJsLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2RQcm9wIHx8IG1ldGhvZCxcbiAgICAgICAgICAgICAgICBmZXRjaE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZmV0Y2hPbkNyZWF0ZWQsXG4gICAgICAgICAgICAgICAgZmV0Y2hPblVwZGF0ZVBhcmFtcyxcbiAgICAgICAgICAgICAgICBmZXRjaE9uVXBkYXRlUG9zdERhdGEsXG4gICAgICAgICAgICAgICAgZmV0Y2hUcmlnZ2VyOiB0aGlzLmZldGNoVHJpZ2dlclByb3AgfHwgZmV0Y2hUcmlnZ2VyLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHBvc3REYXRhLFxuICAgICAgICAgICAgICAgIC4uLl9kYXRhUHJvcCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZldGNoT25DcmVhdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uQ3JlYXRlZCA9IHRoaXMuZmV0Y2hPbkNyZWF0ZWRQcm9wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5mZXRjaE9uVXBkYXRlUGFyYW1zUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uVXBkYXRlUGFyYW1zID0gdGhpcy5mZXRjaE9uVXBkYXRlUGFyYW1zUHJvcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPblVwZGF0ZVBvc3REYXRhUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uVXBkYXRlUG9zdERhdGEgPSB0aGlzLmZldGNoT25VcGRhdGVQb3N0RGF0YVByb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNyZWF0ZWQgJiYgY3JlYXRlZC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPbkNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICBwYXJhbXM6e1xuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCnCoHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPblVwZGF0ZVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZUZldGNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3N0RGF0YTrCoHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpwqB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoT25VcGRhdGVQb3N0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZUZldGNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi53YXRjaFxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBkZWJvdW5jZUZldGNoOiBkZWJvdW5jZShmdW5jdGlvbigpeyB0aGlzLmZldGNoKCkgfSwgZGVib3VuY2VXYWl0KSxcbiAgICAgICAgICAgIGZldGNoOiBmdW5jdGlvbihzdWNjZXNzRnVuYywgb3B0aW9ucynCoHtcbiAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cmwgfHwgdGhpcy5mZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aW9zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMucG9zdERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZldGNoT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2Vzc0Z1bmMgfHwgc3VjY2Vzc0Z1bmMocmVzcG9uc2UpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoZXI7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuZXhwb3J0IGNvbnN0IENoZWNrYm94ID0ge1xuICAgIHByb3BzOiBbJ2RhdGEnLCAnbGFiZWwnLCAndmFsdWUnLCAndHlwZScsICdjYXRlZ29yeSddLFxuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICBpc0NoZWNrZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyB0ZW1wbGF0ZSBmb3IgcHJvZHVjdCBjaGVja2JveGVzIG9ubHlcbiAgICAvLyBzdGF0aWMgY2hlY2tib3hlcyBhcmUgaW5saW5lIHRlbXBsYXRlcyBcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94X19sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrYm94X19pbnB1dFwiIHJlZj1cImlucHV0XCIgdi1vbjpjaGFuZ2U9XCJ1cGRhdGVGaWx0ZXJzKGRhdGEuY2xhc3MsICRldmVudCwgdHlwZSlcIiBcbiAgICAgICAgICAgICAgICA6dmFsdWU9XCJ2YWx1ZVwiIFxuICAgICAgICAgICAgICAgIDpjaGVja2VkPVwiaXNDaGVja2VkXCIgXG4gICAgICAgICAgICAgICAgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgXG4gICAgICAgICAgICAgICAgOmRhdGEtdGFnLW1ldGE9XCJ0YWdnaW5nTWV0YVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2tib3hfX2NoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19sYWJlbC10ZXh0XCIgdi1odG1sPVwibGFiZWxcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIHdhdGNoOiB7XG4gICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1N0YXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS5wcm9kdWN0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tQcm9kdWN0U3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogdGhpcy5kYXRhLnRyYWNraW5nVHlwZSwgXG4gICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5jYXRlZ29yeSB8fCBudWxsLCBcbiAgICAgICAgICAgICAgICBcImxhYmVsXCI6IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLmlkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlRmlsdGVycycsIGVsLCBlLCB0eXBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tTdGF0ZSgpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChlbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlID09IHRoaXMuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gaXRlbSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tQcm9kdWN0U3RhdGUoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBcInByb2R1Y3RcIikge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgcHJvZHVjdFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsIGVsLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlID09IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNDaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5pZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLiRyZWZzLmlucHV0LnZhbHVlKTtcbiAgICAgICAgLy8gdGhpcy5jYXRlZ29yeSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2hlY2tTdGF0ZSgpO1xuICAgICAgICAvLyBpZiBoYXMgc2F2ZWQgZG9jcyBmaWx0ZXIsIGdldCB0aGUgbGFiZWxcbiAgICAgICAgaWYgKHRoaXMuJHJlZnMuaW5wdXQuZGF0YXNldC5zYXZlZExhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzTGFiZWwgPSB0aGlzLiRyZWZzLmlucHV0LmRhdGFzZXQuc2F2ZWRMYWJlbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBBY2NvcmRpb24gPSB7XG4gICAgcHJvcHM6IFsnZGF0YScsICdkZWZhdWx0b3BlbiddLFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgJ2NoZWNrYm94LWl0ZW0nOiBDaGVja2JveFxuICAgIH0sICAgICAgXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc09wZW46ICh0aGlzLmRlZmF1bHRvcGVuID8gdHJ1ZSA6IGZhbHNlKSwgLy9pcyB0aGUgYWNjb3JkaW9uIG9wZW5cbiAgICAgICAgICAgIGlzVHJ1bmNhdGVkOiBudWxsLCAvL2lzIGFjY29yZGlvbiBjb250ZW50IHRydW5jYXRlZCBcbiAgICAgICAgICAgIG9wZW5UZXh0OiBudWxsLFxuICAgICAgICAgICAgY2xvc2VUZXh0OiBudWxsLFxuICAgICAgICAgICAgc2VlQWxsVHlwZXNUZXh0OiBmYWxzZVxuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBpc1RydW5jYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1RydW5jYXRlZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuVGV4dCA9IHRoaXMuJHJlZnMuZXhwYW5kVGV4dC5kYXRhc2V0LmV4cGFuZFRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVRleHQgPSB0aGlzLiRyZWZzLmV4cGFuZFRleHQuZGF0YXNldC5jb2xsYXBzZVRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS5wcm9kdWN0c1wiOiB7XG4gICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVuY2F0ZWQgPSB0aGlzLmRhdGEucHJvZHVjdHMubGVuZ3RoID4gMCA/IHRoaXMuaXNUcnVuY2F0ZWQgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmNoZWNrYm94Om50aC1vZi10eXBlKDYpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlVHJ1bmNhdGlvbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVuY2F0ZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGhhbmRsZUNsaWNrKCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBY2NvcmRpb24oKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b2dnbGVBY2NvcmRpb24oKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRyZWZzLm91dGVyQ29udGFpbmVyO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRyZWZzLmlubmVyQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb250ZW50IGFyZWEgaGVpZ2h0IHRvIGNvbnRlbnQgaGVpZ2h0IHRvIHByZXZlbnQgdHJhbnNpdGlvbmluZyBmcm9tIGF1dG9cbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgdGhpcy5zZWVBbGxUeXBlc1RleHQgPSAhdGhpcy5zZWVBbGxUeXBlc1RleHRcbiAgICAgICAgfSxcbiAgICAgICAgdG9nZ2xlVHJ1bmNhdGlvbihzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0cnVuY2F0ZSB0aGlzXCIpO1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RydW5jYXRlZCA9IHN0YXRlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVHJ1bmNhdGVkID0gdGhpcy5pc1RydW5jYXRlZCA9PSBudWxsID8gdHJ1ZSA6ICF0aGlzLmlzVHJ1bmNhdGVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdHJ1bmNIZWlnaHQgPSAwO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuJHJlZnMuaW5uZXJDb250YWluZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYC5jaGVja2JveDpudGgtb2YtdHlwZSgke2l9KWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUhlaWdodCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbU1hcmdpbiA9IHBhcnNlRmxvYXQoZWxTdHlsZXMubWFyZ2luQm90dG9tKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnVuY0hlaWdodCA9IHRydW5jSGVpZ2h0ICsgaXRlbUhlaWdodCArIGl0ZW1NYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRydW5jSGVpZ2h0ID0gdHJ1bmNIZWlnaHQgKyA1OyAvL2xpdHRsZSBiaXQgb2Ygd2lnZ2xlcm9vbVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnVuY2F0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RydW5jYXRlZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IHRydW5jSGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgIFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQgPSB7XG4gICAgcHJvcHM6IFsnZGF0YSddLFxuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZGF0YS5jbGFzc31fX3NlbGVjdGVkLWZpbHRlcnNgO1xuICAgICAgICB9IFxuICAgIH0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJjbGFzc05hbWVcIiA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIiB2LWZvcj1cImZpbHRlciBpbiBkYXRhLmZpbHRlcnNcIiA6a2V5PVwiZmlsdGVyLnZhbHVlXCIgOmRhdGEtdmFsdWU9XCJmaWx0ZXIudmFsdWVcIiA6ZGF0YS10eXBlPVwiZmlsdGVyLnR5cGVcIiB2LW9uOmNsaWNrPVwicmVtb3ZlRmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsdGVyLWxhYmVsX19pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbHRlci1sYWJlbF9fdGV4dFwiPnt7ZmlsdGVyLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgcmVtb3ZlRmlsdGVyKGUpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnZhbHVlO1xuICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIHZhbHVlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgXG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFBhZ2VOdW0gPSB7XG4gICAgcHJvcHM6IFsnZGF0YScsICdudW0nXSxcbiAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IG51bGwsXG4gICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBpc1NwYWNlcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgXCJkYXRhLmN1cnJlbnRQYWdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLm51bSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHNwYW4gOmNsYXNzPVwie2FjdGl2ZTogaXNBY3RpdmV9XCIgdi1vbjpjbGljaz1cImNoYW5nZVBhZ2VUbyhudW0pXCI+e3tudW19fTwvc3Bhbj5cbiAgICBgLFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgY2hhbmdlUGFnZVRvKG51bSkge1xuICAgICAgICAgICAgaWYobnVtICE9PSBcIi4uLlwiKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2NoYW5nZS1wYWdlLXRvJywgdGhpcy5kYXRhLmNsYXNzLCBudW0pO1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLm51bSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgUGFnaW5hdGlvbiA9IHtcbiAgICBwcm9wczogWydkYXRhJ10sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlTnVtczogW10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICAgIGNsYXNzTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLmNsYXNzfV9fcGFnaW5hdGlvbi1udW1zYDtcbiAgICAgICAgfVxuICAgIH0sICBcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICdwYWdlLW51bSc6IFBhZ2VOdW1cbiAgICB9LFxuICAgIHdhdGNoOiB7XG4gICAgICAgIFwiZGF0YS5jdXJyZW50UGFnZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID4gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnY2hhbmdlLXBhZ2UtdG8nLCB0aGlzLmRhdGEuY2xhc3MsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGEudG90YWxQYWdlc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnY2hhbmdlLXBhZ2UtdG8nLCB0aGlzLmRhdGEuY2xhc3MsIDEpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgOmNsYXNzPVwiY2xhc3NOYW1lXCI+XG4gICAgICAgIDxwYWdlLW51bSB2LWZvcj1cIihudW0sIGluZGV4KSBpbiBwYWdlTnVtc1wiIDpudW09XCJudW1cIiA6ZGF0YT1cImRhdGFcIiA6a2V5PVwiaW5kZXhcIi8+XG4gICAgPC9kaXY+XG4gICAgYCxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGluaXRQYWdlcygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEudG90YWxQYWdlcyA8PSA2KSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbGVzcyB0aGFuIDYgcGFnZXMsIGxpc3QgYWxsIHBhZ2VzXG4gICAgICAgICAgICAgICAgZm9yKGxldCBwYWdlID0gMTsgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzICsgMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZU51bXMucHVzaChwYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA+IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gNikge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgbGFzdCA2IHBhZ2VzLCBkbyBub3QgYWRkIGVsbGlwc2lzXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gNTsgcGFnZSA8IHRoaXMuZGF0YS5jdXJyZW50UGFnZSArIDYgJiYgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzICsgMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VOdW1zLnB1c2gocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgb24gdGhlIGxhc3QgNiBwYWdlcywgYWRkIGVsbHBpc2lzXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZTsgcGFnZSA8IHRoaXMuZGF0YS5jdXJyZW50UGFnZSArIDMgJiYgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VOdW1zLnB1c2gocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTnVtcy5wdXNoKFwiLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHBhZ2UgPSB0aGlzLmRhdGEudG90YWxQYWdlcyAtIDE7IHBhZ2UgPCB0aGlzLmRhdGEudG90YWxQYWdlcyArIDE7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTnVtcy5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuXG5jb25zdCBGb290ZXJVbml0cyA9ICgpID0+IHtcblxuICAgIGxldCBmb290ZXJVbml0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb290ZXJfX3VuaXRzLWNvbnRhaW5lcicpO1xuXG4gICAgbGV0IEZvb3RlclVuaXRzQ29uc3RydWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2Zvb3Rlci11bml0LXRvZ2dsZXInLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQ6IHN0b3JlLnN0YXRlLnVuaXRzLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXRUZXh0OiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgdW5pdHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUudW5pdHM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJjdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmVmZXJlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIlVuaXQgb2YgbWVhc3VyZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLnNlbGVjdGVkVW5pdFRleHRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICB1bml0czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0ID0gdGhpcy51bml0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUYWdzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2UoZSkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJywgZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZHRoKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gdGhpcy4kcmVmcy5zZWxlY3Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHNlbGVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFRleHQgPSBzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0gPyBzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0VGV4dCA9IHNlbGVjdGVkVGV4dDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7c3RvcmUuc3RhdGUudW5pdHN9XCJdYCkgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke3N0b3JlLnN0YXRlLnVuaXRzfVwiXWApLmlubmVyVGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0VGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuJHJlZnMuc2VsZWN0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGAkeyhzZWxlY3RlZFRleHQubGVuZ3RoIC8gMikgKyAyfWVtYDsgLy9hc3N1bWVzIGVhY2ggY2hhcmEgaXMgfi41ZW0gd2lkdGgsICsyZW0gYnVmZmVyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zdHlsZS5tYXhXaWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0VGFncygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZHRoKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZm9vdGVyLWxhbmctdG9nZ2xlcicsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFuZzogc3RvcmUuc3RhdGUuY3VycmVudExhbmcsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFuZ1RleHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImN0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5zZWxlY3RlZExhbmdUZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSB0aGlzLiRyZWZzLnNlbGVjdDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmcgPSBlbC5vcHRpb25zW2VsLnNlbGVjdGVkSW5kZXhdLmRhdGFzZXQubGFuZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBzZWxlY3RlZExhbmd1YWdlPSR7bGFuZ307IHBhdGg9LzsgbWF4LWFnZT0zMTUzNjAwMDtgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7c3RvcmUuc3RhdGUuY3VycmVudExhbmd9XCJdYCkgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke3N0b3JlLnN0YXRlLmN1cnJlbnRMYW5nfVwiXWApLmlubmVyVGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYW5nVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuJHJlZnMuc2VsZWN0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGAkeyhzZWxlY3RlZFRleHQubGVuZ3RoIC8gMikgKyAyfWVtYDsvL2Fzc3VtZXMgZWFjaCBjaGFyYSBpcyB+LjVlbSB3aWR0aCwgKzJlbSBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnN0eWxlLm1heFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhZ3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5mb290ZXJfX3VuaXRzLWNvbnRhaW5lcmAsXG4gICAgICAgIH0pLiRtb3VudChgLmZvb3Rlcl9fdW5pdHMtY29udGFpbmVyYCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZvb3RlclVuaXRzKSB7XG4gICAgICAgIEZvb3RlclVuaXRzQ29uc3RydWN0b3IoKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9vdGVyVW5pdHM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7dmlkZW9Nb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuXG5jb25zdCBGV01lZGlhID0gKCkgPT4ge1xuXG4gICAgbGV0IG1lZGlhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZ3LW1lZGlhLS12aWRlbycpO1xuICAgIFZ1ZS51c2UoVk1vZGFsKTtcblxuICAgIGxldCBtZWRpYUNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2Z3LW1lZGlhLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9Vcmw6ICcnLFxuICAgICAgICAgICAgICAgICAgICB2aWRlb05hbWU6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGxhdW5jaFZpZGVvKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb01vZGFsLnRlbXBsYXRlKHRoaXMudmlkZW9VcmwsIHRoaXMudmlkZW9OYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5mdy1tZWRpYV9fcGxheS1idXR0b24nKS5kYXRhc2V0LnZpZGVvVXJsO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9OYW1lID0gdGhpcy4kcmVmcy5uYW1lID8gdGhpcy4kcmVmcy5uYW1lLmlubmVySFRNTCA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIFxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmZ3LW1lZGlhLXZpZGVvLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuZnctbWVkaWEtdmlkZW8tJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWEubGVuZ3RoID4gMCkge1xuICAgICAgICBtZWRpYS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBmdy1tZWRpYS12aWRlby0ke2luZGV4fWApO1xuICAgICAgICAgICAgbWVkaWFDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGV01lZGlhOyIsIi8qIFxuQWxsb3dzIGZvciBpbmxpbmUgdGV4dCBsaW5rcyB0byB0cmlnZ2VyIHZ1ZSBtb2RhbHMgd2l0aCBhbnkgY29udGVudFxuKi9cblxuaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7Z2VuZXJpY01vZGFsfSBmcm9tICcuL21vZGFscyc7XG5cblZ1ZS51c2UoVk1vZGFsKTtcblxuY29uc3QgZ2VuZXJpY01vZGFscyA9ICgpID0+IHtcbiAgICBsZXQgaW5zdGFuY2UgPSBuZXcgVnVlKHtcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgdHJpZ2dlck1vZGFsKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmljTW9kYWwudGVtcGxhdGUoY29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNNb2RhbC5uYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNNb2RhbC5ldmVudHNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBsZXQgbW9kYWxEYXRhID0gW107XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2VuLW1vZGFsJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIFwiaGFzaHRhZ1wiOiBpdGVtLmRhdGFzZXQuaGFzaHRhZyxcbiAgICAgICAgICAgIFwiY29udGVudFwiOiBpdGVtLmlubmVySFRNTFxuICAgICAgICB9XG4gICAgICAgIG1vZGFsRGF0YS5wdXNoKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKG1vZGFsRGF0YSkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kYWxEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoYCMke21vZGFsRGF0YVtpXS5oYXNodGFnfWApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS50cmlnZ2VyTW9kYWwobW9kYWxEYXRhW2ldLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBnZW5lcmljTW9kYWxzOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQge3NwZWNzVGFibGVUZW1wbGF0ZX0gZnJvbSAnLi9zcGVjLXRhYmxlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IEhlcm9Qcm9kdWN0ID0gKCkgPT4ge1xuXG4gICAgY29uc3QgaGVyb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1wcm9kdWN0cycpO1xuXG4gICAgY29uc3QgaGVyb1Byb2R1Y3RDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdoZXJvLXByb2R1Y3QtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzaXplU2VsZWN0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB2aWV3Q29uZmlnOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5SXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiAxLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW06IG51bGwgLy9wcm9kdWN0IG5hbWUgZm9yIHBhc3NpbmcgdG8gY2hpbGQgc3BlYyB0YWJsZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbiB1bmlxdWUgSUQgdG8gZWFjaCBnYWxsZXJ5IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbXVsdGlwbGUgaW1hZ2VzLCBzZXQgZ2FsbGVyeSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tcHJvZHVjdHNfX2dhbGxlcnktaW1hZ2UnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdhbGxlcnkgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoIGltYWdlcyBhbmQgdGhlaXIgaGVpZ2h0cyB0byBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tcHJvZHVjdHNfX2dhbGxlcnktaW1hZ2UnKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0YXNldC5pZCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLmNsaWVudEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nYWxsZXJ5SXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogaXRlbS5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG9ubHkgb25lIGltYWdlLCBzZXQgaWQgdG8gMSAodGhlIGRlZmF1bHQgc2VsZWN0ZWQgaW1hZ2UgaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGVyby1wcm9kdWN0c19fZ2FsbGVyeS1pbWFnZScpLmRhdGFzZXQuaWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLiRyZWZzLnRpdGxlID8gdGhpcy4kcmVmcy50aXRsZS5pbm5lclRleHQgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlSW1hZ2VTZWxlY3QoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIC8vIHJlY2lldmUgc2VsZWN0ZWQgZ2FsbGVyeSBpdGVtIGZyb20gY2hpbGRcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3NlbGVjdGVkSW1hZ2UnLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbWFnZVNlbGVjdChpZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hlcm8tcHJvZHVjdHMtaW1hZ2UnLCB7XG4gICAgICAgICAgICBwcm9wczogWydzZWxlY3RlZEltYWdlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbWFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSW1hZ2UgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRlbC5kYXRhc2V0LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5zZWxlY3RlZEltYWdlID09IHRoaXMuaWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hlcm8tcHJvZHVjdHMtdGh1bWJuYWlscycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2dhbGxlcnlJdGVtcycsICdzZWxlY3RlZEltYWdlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiaGVyby1wcm9kdWN0c19fdGh1bWJuYWlsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxoZXJvLXByb2R1Y3RzLXRodW1ibmFpbC1pdGVtIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBnYWxsZXJ5SXRlbXNcIiA6aW1hZ2U9XCJpdGVtLnNyY1wiIDppZD1cImluZGV4ICsgMVwiIDpzZWxlY3RlZC1pbWFnZT1cInNlbGVjdGVkSW1hZ2VcIiA6a2V5PVwiaW5kZXhcIi8+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaGVyby1wcm9kdWN0cy10aHVtYm5haWwtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2ltYWdlJywgJ2lkJywgJ3NlbGVjdGVkSW1hZ2UnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGltYWdlVXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoJyR7dGhpcy5pbWFnZX0nKWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWRJbWFnZSA9PSB0aGlzLmlkID8gdHJ1ZSA6IGZhbHNlIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImhlcm8tcHJvZHVjdHNfX3RodW1ibmFpbC1pdGVtXCIgdi1iaW5kOnN0eWxlPVwie2JhY2tncm91bmRJbWFnZTogaW1hZ2VVcmx9XCIgdi1vbjpjbGljaz1cInNlbGVjdEltYWdlXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNBY3RpdmV9XCI+PC9saT5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0SW1hZ2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgaWQgb2YgY2xpY2tlZCBlbGVtZW50IHRvIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2VsZWN0ZWRJbWFnZScsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSW1hZ2UgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZSA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuaGVyby1wcm9kdWN0cy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuaGVyby1wcm9kdWN0cy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIHNwZWNzVGFibGVUZW1wbGF0ZSgpO1xuXG4gICAgaWYgKGhlcm9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGVyb3MuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgaGVyby1wcm9kdWN0cy0ke2luZGV4fWApO1xuICAgICAgICAgICAgaGVyb1Byb2R1Y3RDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlcm9Qcm9kdWN0OyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IGhvbWVIZXJvID0gKCkgPT4ge1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhvbWUtaGVybycpO1xuXG4gICAgbGV0IGhlcm9Db25zdHJ1Y3RvciA9ICgpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaG9tZS1oZXJvJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kb24oJ3NlbGVjdC1zZWN0aW9uJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IGlkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdoZXJvLXNlY3Rpb24nLCB7XG4gICAgICAgICAgICBwcm9wczogWydzZWxlY3RlZElkJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICBpc0hvdmVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSWQgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzSG92ZXJlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSG92ZXJlZCB8fCB0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZUV4cGFuZCgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kZW1pdCgnc2VsZWN0LXNlY3Rpb24nLCB0aGlzLmlzQWN0aXZlID8gbnVsbCA6IHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNBY3RpdmUgPSAhdGhpcy5pc0FjdGl2ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VvdmVyKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW91c2VkIG92ZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW91c2UgbGVhdmVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGxheVZpZGVvKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXVzZVZpZGVvKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudmlkZW8ucGF1c2UoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ob21lLWhlcm9fX2FyZWEnKSkuaW5kZXhPZih0aGlzLiRlbCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5ob21lLWhlcm9gLFxuICAgICAgICB9KS4kbW91bnQoYC5ob21lLWhlcm9gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgIGhlcm9Db25zdHJ1Y3RvcigpO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBob21lSGVybztcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuXG5leHBvcnQgY29uc3QgdGVtcGxhdGUgPSB7XG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3RpdmVUYWI6ICcnLFxuICAgICAgICAgICAgaXNNb2JpbGU6IG51bGxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBzZXRBY3RpdmVUYWIoZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBlO1xuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVUYWIoZSkge1xuICAgICAgICAgICAgbGV0IHRhYlRhcmdldCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnRhcmdldDtcblxuICAgICAgICAgICAgaWYgKHRhYlRhcmdldCAhPT0gdGhpcy5hY3RpdmVUYWIpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlcnBcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIodGFiVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGl3X190YWItaXRlbS5hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXRhcmdldD0ke3RhYlRhcmdldH1dYCkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNldFJlc3BvbnNpdmUobXFsKSB7XG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaW5saW5lIHN0eWxlcyBmcm9tIGFjY29yZGlvbnNcbiAgICAgICAgICAgICAgICBsZXQgYWNjb3JkaW9uQ29udGFpbmVycyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX2hpdy1jb250ZW50LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIGFjY29yZGlvbkNvbnRhaW5lcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2V0IHRoZSBmaXJzdCB0YWIgdG8gYWN0aXZlXG4gICAgICAgIGluaXREZXNrdG9wKCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBjaGVja2luZyBmb3IgYSBicmVha3BvaW50ICpzbWFsbGVyKiB0aGFuXG4gICAgICAgICAgICAvLyB2YXIgaXNNb2JpbGUgaW4gc3RvcmUuanNcbiAgICAgICAgICAgIHZhciBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjUwcHgpJyk7XG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlc3BvbnNpdmUobXFsKTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkgeyAvL3VuZGVyIDY1MHB4XG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWwgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykuZGF0YXNldC50YXJnZXQgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiID0gaW5pdGlhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vb3ZlciA2NTBweFxuICAgICAgICAgICAgICAgIC8vIGlmIGRlc2t0b3AsIGNoZWNrIGZvciBkZXNrdG9wIGJ1dHRvbnMgYW5kIHNldCBpbml0aWFsIHRhYlxuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpID8gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmRhdGFzZXQudGFyZ2V0IDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRhcmdldF0nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB0aGlzLmluaXREZXNrdG9wKCk7IC8vc2V0IHRoZSBmaXJzdCB0YWIgdG8gYWN0aXZlIG9uIGluaXRcbiAgICAgICAgLy9saXN0ZW4gZm9yIGNoaWxkIGNsaWNrIGV2ZW50cyBvbiB0aGUgbGFiZWxzIGFuZCBwYXNzIHRhcmdldHMgdG8gcGFyZW50XG4gICAgICAgIEV2ZW50QnVzLiRvbignaGFuZGxlLW1vYmlsZScsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYihlKTtcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRCdXMuJG9uKCdoYW5kbGUtZGVza3RvcCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYihlKTtcbiAgICAgICAgfSlcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgdGFiTGFiZWwgPSB7XG4gICAgcHJvcHM6IFsnYWN0aXZlVGFiJywgJ2lzTW9iaWxlJ10sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJUYXJnZXQ6ICcnLFxuICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyYXdlclwiLFxuICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCxcbiAgICAgICAgICAgICAgICBcIm5vXCI6IHRoaXMuaW5kZXggPCAxMCA/IGAwJHt0aGlzLmluZGV4fWAgOiBgJHt0aGlzLmluZGV4fWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlVGFiID09IHRoaXMudGFiVGFyZ2V0ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGhhbmRsZVRhYihlKSB7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaGFuZGxlLWRlc2t0b3AnLCB0aGlzLnRhYlRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy4kZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coKVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX3RhYi1sYWJlbHMgbGknKSkuaW5kZXhPZih0aGlzLiRlbCkgKyAxO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy50YWJUYXJnZXQgPSB0aGlzLiRlbC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbnRlbnRUZW1wbGF0ZSA9IHtcbiAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSwgLy9hY3RpdmUgdGFiXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJOYW1lOiAnJyxcbiAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSwgLy9pcyBjdXJyZW50IHRhYiB0aGUgc2VsZWN0ZWQgdGFiICdhY3RpdmVUYWInXG4gICAgICAgICAgICBpc09wZW46IGZhbHNlLCAvL2lzIHRhYiBvcGVubVxuICAgICAgICAgICAgbGFiZWw6IG51bGwsXG4gICAgICAgICAgICBpbmRleDogbnVsbFxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyYXdlclwiLFxuICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCxcbiAgICAgICAgICAgICAgICBcIm5vXCI6IHRoaXMuaW5kZXggPCAxMCA/IGAwJHt0aGlzLmluZGV4fWAgOiBgJHt0aGlzLmluZGV4fWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKHRhYikge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMudGFiTmFtZSA9PSB0YWIgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7IC8vc2V0IGFjY29kaW9uIHRvIGNsb3NlIHdoZW4gbm90IHRoZSBhY3RpdmUgaXRlbVxuXG4gICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGl3X19oaXctY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5oaXdfX2hpdy1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb250ZW50IGFyZWEgaGVpZ2h0IHRvIGNvbnRlbnQgaGVpZ2h0IHRvIHByZXZlbnQgdHJhbnNpdGlvbmluZyBmcm9tIGF1dG9cbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgYWN0aXZlIHRhYiwgc2V0IGlzT3BlbiB0byB0cnVlIHdoZW4gaXNBY3RpdmUgaXMgdHJ1ZSB0byBwcmUgb3BlbiB0aGUgdGFiIG9uIG1vYmlsZVxuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBoYW5kbGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgbGV0IG1vYmlsZVRhcmdldCA9IGUuY3VycmVudFRhcmdldC5wYXJlbnROb2RlLmRhdGFzZXQudGFiSWQ7XG5cbiAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdoYW5kbGUtbW9iaWxlJywgbW9iaWxlVGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0b2dnbGUgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWNjb3JkaW9uKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgIGxldCBlbG1PZmZzZXQgPSB0aGlzLiRlbC5vZmZzZXRUb3A7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsT2Zmc2V0ID0gd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsbVBvcyA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IChlbG1Qb3MgLSA3MCksXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSw1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyB0b2dnbGUgYWNjb3JkaW9uc1xuICAgICAgICBoYW5kbGVBY2NvcmRpb24oZSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmhpd19faGl3LWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5oaXdfX2hpdy1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGluaXRNb2JpbGUoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm5vdCBtb2JpbGVcIik7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGlubGluZSBzdHlsZXMgZm9yIGFjY29yZGlvbnMgb24gZGVza3RvcFxuICAgICAgICAgICAgICAgIGxldCBjb250ZW50Q29udGFpbmVycyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX2hpdy1jb250ZW50LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRDb250YWluZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpd19fYXJlYS1jb250ZW50IC5oaXdfX2hpdy1jb250YWluZXInKSkuaW5kZXhPZih0aGlzLiRlbCkgKyAxO1xuICAgICAgICAgICAgdGhpcy5sYWJlbCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX3RhYi1sYWJlbHMgbGknKSlbKHRoaXMuaW5kZXggLSAxKV0uaW5uZXJUZXh0O1xuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB2YXIgaW5pdGlhbFRhYiA9IHRoaXMuJGVsLmRhdGFzZXQudGFiSWQ7XG4gICAgICAgIHRoaXMudGFiTmFtZSA9IGluaXRpYWxUYWI7XG4gICAgICAgIHRoaXMuaW5pdE1vYmlsZSgpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG59O1xuXG5cbmNvbnN0IEhvd0l0V29ya3MgPSAoKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpd19fd3JhcHBlcicpO1xuXG4gICAgbGV0IGhpd0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIC8vIG1haW4gY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaGl3LXRlbXBsYXRlJywgdGVtcGxhdGUpO1xuXG4gICAgICAgIC8vIGRlc2t0b3AgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hpdy10YWItbGFiZWwnLCB0YWJMYWJlbCk7XG5cbiAgICAgICAgLy8gbW9iaWxlIGFjY29yZGlvbiBjb250YWluZXJzICYgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hpdy1jb250ZW50LXRlbXBsYXRlJywgY29udGVudFRlbXBsYXRlKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmhpdy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuaGl3LSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGluc3RhbmNlcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBoaXctJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGhpd0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvd0l0V29ya3M7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuY29uc3QgaW50ZXJuYWxTZWFyY2ggPSAoKSA9PiB7XG5cbiAgICBsZXQgc2VhcmNoQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gnKTtcblxuICAgIGxldCBpbnRlcm5hbFNlYXJjaENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2ludGVybmFsLXNlYXJjaCcsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB3aW5kb3cuc29mdHdhcmVIYXNRdWVyeSA/IHdpbmRvdy5zb2Z0d2FyZVF1ZXJ5IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJubyB2YWx1ZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2ludGVybmFsLXNlYXJjaCcsIG51bGwsIHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZVN1Ym1pdChlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBzZWFyY2ggcXVlcnkgdG8gZG9jdW1lbnRhdGlvbiBhbmQgc29mdHdhcmUgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaW50ZXJuYWwtc2VhcmNoJywgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMuZm9ybS5kYXRhc2V0LnR5cGU7XG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2ludGVybmFsLXNlYXJjaCcsIHRoaXMudmFsdWUsIHRoaXMudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuaW50ZXJuYWwtc2VhcmNoLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuaW50ZXJuYWwtc2VhcmNoLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGlmIChzZWFyY2hCYXIubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWFyY2hCYXIuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgaW50ZXJuYWwtc2VhcmNoLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBpbnRlcm5hbFNlYXJjaENvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgaW50ZXJuYWxTZWFyY2g7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IGZwb2RiIGZyb20gJy4uLy4uLy4uL2RiLmpzb24nO1xuaW1wb3J0IHsgQWNjb3JkaW9uLCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQsIENoZWNrYm94LCBQYWdpbmF0aW9uIH0gZnJvbSAnLi9maWx0ZXItY29tcG9uZW50cyc7XG5cbmNvbnN0IHNhZmVTdHJpbmcgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuXG5jb25zdCBMZWdhbCA9ICgpID0+IHtcblxuICAgIGxldCBsZWdhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sZWdhbCcpO1xuXG4gICAgY29uc3QgbGVnYWxDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdsZWdhbC10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiAxLCAvL2N1cnJlbnQgcGFnZSAjXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFBhZ2VzOiBudWxsLCAvL3RvdGFsIHJldHVybnMgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzdWx0czogbnVsbCwgLy90b3RhbCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93blJlc3VsdHM6IG51bGwsIC8vdG90YWwgc2hvd24gaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnNWaXNpYmxlOiBudWxsLCAvL2FyZSBmaWx0ZXJzIHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFyZWFWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsRG9jczogW10sIC8vZm9yIGVtYWlsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3M6IFtdLCAvL2Jvb2ttYXJrZWQgaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jc0xhYmVsOiBudWxsLCAvL2xhYmVsIGZvciBzYXZlZCBkb2NzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzT25seTogbnVsbCwgLy9pcyBzYXZlZCBkb2NzIG9ubHkgY2hlY2tlZD9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcGlVcmw6IG51bGwsIC8vZm9yIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXM6IG51bGwsIC8vZm9yIGRlZXBsaW5raW5nIGluLWJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlQWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnbGVnYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdUeXBlOiAnZG9jdW1lbnQnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYWdlUmFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHRoaXMuc2F2ZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNhdmVkIG9ubHkgZmlsdGVyIGlmIG5vIHNhdmVkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNhdmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZignc2F2ZWREb2N1bWVudHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzTW9iaWxlID0gdGhpcy5jb21wdXRlZElzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5jb21wdXRlZElzTW9iaWxlID8gdHJ1ZSA6IHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTsgLy8gaGFuZGxlIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpOyAvLyBoYW5kbGUgaGlzdG9yeSByZWNvcmRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGlmIGJyYW5kIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuZHMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnR5cGUgPT0gXCJicmFuZFwiO1xuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzT25seSA9IHNhdmVkT25seSA/IHNhdmVkT25seS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpcyBtb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNhZmVTdHJpbmcoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidmFsdWVcIiwgc2FmZVN0cmluZyhlLnRhcmdldC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrZWRcIixlLnRhcmdldC5jaGVja2VkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IFwic2F2ZWREb2N1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogY2hlY2tlZCwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgc3BlY2lmaWMgZmlsdGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlRmlsdGVyKGVsLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZ2V0VXJsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRQYXJhbXMgPSB0aGlzLmRhdGEuc2F2ZWREb2NzLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlcnRUeXBlUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImNlcnRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwibGFuZ1wiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUeXBlUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImRvY1R5cGVcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnaW9uUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInJlZ2lvblwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWREb2N1bWVudHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVkT25seS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VQYXJhbXMgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnVybFBhcmFtcyA9IGA/JHtjZXJ0VHlwZVBhcmFtcyAhPT0gXCJcIiA/IFwiJmNlcnRpZmljYXRpb25UeXBlPVwiICsgY2VydFR5cGVQYXJhbXMgOiBcIlwifSR7bGFuZ1BhcmFtcyAhPT0gXCJcIiA/IFwiJmxhbmc9XCIgKyBsYW5nUGFyYW1zIDogXCJcIn0ke3JlZ2lvblBhcmFtcyAhPT0gXCJcIiA/IFwiJnJlZ2lvbj1cIiArIHJlZ2lvblBhcmFtcyA6IFwiXCJ9JHtkb2NUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImZG9jVHlwZT1cIiArIGRvY1R5cGVQYXJhbXMgOiBcIlwifSZzYXZlZERvY3VtZW50cz0ke3NhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpfSZwYWdlPSR7cGFnZVBhcmFtc31gO1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImFwaS9kb2N1bWVudHM/XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHF1ZXJ5ID8gMSA6IHRoaXMuZGF0YS5jdXJyZW50UGFnZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVcmwoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cubGVnYWxBUElVcmw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgJHtiYXNlVXJsfSR7YmFzZVVybC5pbmRleE9mKCc/JykgPiAtMSA/ICcnIDogJz8nfWA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9sZWdhbFwiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnRUeXBlID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWdpb24gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY1R5cGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2VydFR5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydFR5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxhbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZG9jVHlwZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlcnRUeXBlU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGNlcnRUeXBlLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYW5nU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGxhbmcuam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2lvblN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChyZWdpb24uam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY1R5cGVTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZG9jVHlwZS5qb2luKCd8JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHE6IHF1ZXJ5ID8gcXVlcnkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6ICh0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSkgPT0gXCJcIiA/IG51bGwgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5jaGFyQXQoMCkgPT0gXCIsXCIgPyB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5zbGljZSgxKSA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLCAvL0BUT0RPIG1ha2UgdGhpcyBsZXNzIGluc2FuZS4gU2VuZCBOVUxMIGlmIGVtcHR5IHN0cmluZy4gUmVtb3ZlIGxlYWRpbmcgY29tbWEgaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRpb25UeXBlOiBjZXJ0VHlwZVN0ciA9PSBcIlwiID8gbnVsbCA6IGNlcnRUeXBlU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmdTdHIgPT0gXCJcIiA/IG51bGwgOiBsYW5nU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uOiByZWdpb25TdHIgPT0gXCJcIiA/IG51bGwgOiByZWdpb25TdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlOiBkb2NUeXBlU3RyID09IFwiXCIgPyBudWxsIDogZG9jVHlwZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jdW1lbnRzOiBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGF4aW9zUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5heGlvc1BhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50b3RhbFJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuc2hvd25SZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hhbmdlUGFnZShkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcInByZXZcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZS0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBcIm5leHRcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2Nyb2xsLXRvLXRvcCcsIHRoaXMuZGF0YS5jbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbLi4udGhpcy5kYXRhLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLnNwbGljZSh0aGlzLmRhdGEuZW1haWxEb2NzLmluZGV4T2YoaXRlbSksMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vdXBkYXRlIGhpc3RvcnkgcmVjb3JkIHdoZW4gZmlsdGVycyBjaGFuZ2VcbiAgICAgICAgICAgICAgICB1cGRhdGVIaXN0b3J5KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7dGhpcy5kYXRhLnVybFBhcmFtc31gO1xuICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShcIlwiLFwiXCIsdXJsKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBkZWVwIGxpbmtpbmcgb24gaGlzdG9yeSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBkZWVwbGluaygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuZmlsdGVycyA9IFtdOyAvL2NsZWFyIGZpbHRlcnMgYXJyYXkgZmlyc3RcblxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdEZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbS5zbGljZSgwLCBwYXJhbS5pbmRleE9mKCc9JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBwYXJhbS5zbGljZShwYXJhbS5pbmRleE9mKCc9JykgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVFlQRVwiLHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDT05URU5UXCIsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlBBR0VcIiwgcGFyc2VJbnQoY29udGVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHBhcnNlSW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCA9PSBcImZhbHNlXCIgfHwgY29udGVudCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiB0aGlzLmRhdGEuc2F2ZWREb2NzTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcnJheSA9IGNvbnRlbnQuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJyYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIjogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRGaWx0ZXJzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogZGVjb2RlVVJJQ29tcG9uZW50KGNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmluaXRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBpbml0RmlsdGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaW5pdEZpbHRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHBhZ2U7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO31cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5sZWdhbF9fYXJlYS1jYXJkcycpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gMTAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0b3ApO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFBhZ2VzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiB0b3RhbCByZXN1bHQgY291bnQsIGRpdmlkZSBieSAxMCB0byBnZXQgdG90YWwgcGFnZXMgbmVlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGggY2VpbCB0byByb3VuZCB1cFxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYWN0aXZlIGZvciBwcmV2L25leHQgYmFzZWQgb24gY3VycmVudCBwYWdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgLyAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQuc2xpY2UoMSkgOiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSB0aGlzLmRhdGEuaXNNb2JpbGUgPyBmYWxzZSA6IHRydWU7IC8vaW5pdCBzaG93L2hpZGUgZmlsdGVycyBpZi9pcyBtb2JpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWx0ZXIgdXBkYXRlcyBpbiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZUZpbHRlcnMnLCAoZWwsIGUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCAsdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2VtYWlsLWRvY3MnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFbWFpbERvY3MoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2ludGVybmFsLXNlYXJjaCcsICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJkb2N1bWVudGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzY3JvbGwtdG8tdG9wJywgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsTGVnYWxBcGlSZXN1bHRzLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbExlZ2FsQXBpUmVzdWx0cy50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbExlZ2FsQXBpUmVzdWx0cy5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnJlc3VsdHMgPSBmcG9kYi5sZWdhbC5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEudG90YWxSZXN1bHRzID0gZnBvZGIubGVnYWwudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuc2hvd25SZXN1bHRzID0gZnBvZGIubGVnYWwucmVzdWx0cy5sZW5ndGg7XG5cblxuICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGZpbHRlcnMgaWYgbGVzcyB0aGVuIDEwIGluaXRpYWwgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSAxMCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgXCJzaGFyZSBhbGxcIiBpZiA1IG9mIGxlc3MgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hhcmVBbGwgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSA1ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGRlZXBsaW5raW5nXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFxuICAgICAgICAvLyByZXN1bHRzIGxpc3RcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGVnYWwtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdhbF9fY2FyZHMtY29udGVudFwiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgIDxsZWdhbC1yZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiA6aXNTZWxlY3RlZD1cImlzU2VsZWN0ZWQocmVzdWx0KVwiIDprZXk9XCJyZXN1bHQuaWRcIiA6ZGF0YT1cImRhdGFcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZChyZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGkgPT4gaS5pZCA9PSByZXN1bHQuaWQpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzaW5nbGUgcmVzdWx0cyBpdGVtXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xlZ2FsLXJlc3VsdHMtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnY29udGVudCcsICdpc1NlbGVjdGVkJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc0NoZWNrZWQ6IHRoaXMuaXNTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlZUFsbDogbnVsbCwgLy9pcyBcInNlZSBhbGxcIiBmZWF0dXJlIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIHNlZUFsbE9wZW46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlZUFsbExhYmVsOiBudWxsLC8vbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVuY29kZWRVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY29udGVudC51cmwpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3VGFiTGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudXJsLnJlcGxhY2UoJ2Rvd25sb2FkPXRydWUnLCAnZG93bmxvYWQ9ZmFsc2UnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ01ldGFCb2R5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IHRoaXMuY29udGVudC5leWVicm93LCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5jb250ZW50Lm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiOiB0aGlzLmNvbnRlbnQubGFuZ3VhZ2VcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5lbWFpbERvY3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5lbWFpbERvY3MubGVuZ3RoID09PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGlkIHdoZW4gY29udGVudCBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxPcGVuXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmQgZG9jLWNhcmQtLWNoZWNrYm94XCIgOmRhdGE9XCJkYXRhXCIgOmNsYXNzPVwieydoaWRlLWJvb2ttYXJrJzogKGRhdGEuc2F2ZWREb2NzT25seSA9PT0gdHJ1ZSkgJiYgKGlzQm9va21hcmtlZCA9PT0gZmFsc2UpfVwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIDpkYXRhLXRhZy1tZXRhPSd0YWdNZXRhQm9keSc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveF9fbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrYm94X19pbnB1dFwiIDp2YWx1ZT1cImNvbnRlbnQuaWRcIiB2LW9uOmNoYW5nZT1cImVtYWlsRG9jXCIgdi1tb2RlbD1cImlzQ2hlY2tlZFwiIDpjaGVja2VkPVwiaXNDaGVja2VkXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJTZWxlY3RcIn0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveF9fY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50LmV5ZWJyb3d9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibmV3VGFiTGlua1wiIGNsYXNzPVwiZG9jLWNhcmRfX3RpdGxlXCIgdGFyZ2V0PVwiX2JsYW5rXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJQcmV2aWV3XCJ9Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fc3VidGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIj57e2NvbnRlbnQuZGV0YWlsc319PC9zcGFuPiA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZS1tb3JlXCIgdi1pZj1cInNlZUFsbCAmJiBzZWVBbGxPcGVuXCI+XFx7e21vcmVDb250ZW50fX08L3NwYW4+IDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwidG9nZ2xlU2VlQWxsXCIgdi1pZj1cInNlZUFsbFwiPlxce3tzZWVBbGxMYWJlbH19PC9hPiB8IHt7Y29udGVudC5sYW5ndWFnZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZG93bmxvYWRcIiA6aHJlZj1cImNvbnRlbnQudXJsXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJEb3dubG9hZFwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWVtYWlsXCIgOmhyZWY9XCInbWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PScgKyBjb250ZW50Lm5hbWUgKyAnOiAnICsgdGhpcy5lbmNvZGVkVXJsXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJFbWFpbFwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWJvb2ttYXJrXCIgOmRhdGEtbGVnYWwtZG9jdW1lbnQtaWQ9XCJjb250ZW50LmlkXCIgcmVmPVwiYm9va21hcmtcIiB2LW9uOmNsaWNrPVwiaGFuZGxlQm9va21hcmtcIiA6Y2xhc3M9XCJ7YWN0aXZlOiBpc0Jvb2ttYXJrZWR9XCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImxlZ2FsRG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgZW1haWxEb2MoKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdlbWFpbC1kb2NzJywge1wibmFtZVwiOiB0aGlzLmNvbnRlbnQubmFtZSwgXCJ1cmxcIjogdGhpcy5jb250ZW50LnVybCwgXCJpZFwiOiB0aGlzLmNvbnRlbnQuaWR9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsZWdhbERvY3VtZW50SWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2dnbGVTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsT3BlbiA9ICF0aGlzLnNlZUFsbE9wZW47XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0U2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5zZWVBbGxDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsID0gZGV0YWlscy5sZW5ndGggPiAzID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJ1bmNhdGVkRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMCwzKS5qb2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9yZURldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDMpLmpvaW4oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JlQ29udGVudCA9IG1vcmVEZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTCA9IGAke3RydW5jYXRlZERldGFpbHN9JHttb3JlRGV0YWlscyA9PSBcIlwiID8gJycgOiAnLCd9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2F2ZWRcIix0aGlzLnNhdmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZW1haWwtZG9jcycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG1haWx0bzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFpbHRvQWxsOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJkYXRhLmVtYWlsRG9jc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5uYW1lKX06ICR7ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0udXJsKX0lMEQlMEFgO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWlsdG8gPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAvLyBzaGFyZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmRhdGEucmVzdWx0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgbWFpbHRvID0gYCR7bWFpbHRvfSR7aXRlbS5uYW1lfTogJHtpdGVtLnVybH0lMEQlMEFgO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5tYWlsdG9BbGwgPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgKHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5zaGFyZUFsbCgpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5sZWdhbC0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAubGVnYWwtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAobGVnYWwubGVuZ3RoID4gMCkge1xuICAgICAgICBsZWdhbC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBsZWdhbC0ke2luZGV4fWApO1xuICAgICAgICAgICAgbGVnYWxDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgd2luZG93LnNlZUxlc3NMYWJlbCA9IFwic2VlIGxlc3NcIjtcbiAgICB3aW5kb3cuc2VlQWxsTGFiZWwgPSBcInNlZSBtb3JlXCI7XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGVnYWw7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgZnBvZGIgZnJvbSAnLi4vLi4vLi4vZGIuanNvbic7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQgeyBpbnN0YW5jZSB9IGZyb20gXCIuL21vZGFsLXRyaWdnZXJcIjtcbmltcG9ydCB7IEFjY29yZGlvbiwgU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LCBDaGVja2JveCwgUGFnaW5hdGlvbiB9IGZyb20gJy4vZmlsdGVyLWNvbXBvbmVudHMnO1xuXG5WdWUudXNlKFZNb2RhbCk7XG5cbmNvbnN0IHNhZmVTdHJpbmcgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpO1xufVxuXG5jb25zdCBMaXRPcmRlciA9ICgpID0+IHtcblxuICAgIGxldCBsaXRPcmRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5saXQtb3JkZXInKTtcblxuICAgIGNvbnN0IGxpdE9yZGVyQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGl0LW9yZGVyLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NPbmx5OiBudWxsLCAvL2lzIHNhdmVkIGRvY3Mgb25seSBjaGVja2VkP1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVBbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG51bGwsIC8vc2VhcmNoIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcnRDb250ZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsVGFyZ2V0OiBudWxsLCAvL21vZGFsIGhhc2ggZm9yIGxpdCBvcmRlciBmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogJ2xpdC1vcmRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdkb2N1bWVudCdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZVJhbmdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAxLSR7dGhpcy5kYXRhLnNob3duUmVzdWx0c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZGF0YS50b3RhbFJlc3VsdHMgLSB0aGlzLmRhdGEuc2hvd25SZXN1bHRzICsgMX0tJHt0aGlzLmRhdGEudG90YWxSZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsodGhpcy5kYXRhLnNob3duUmVzdWx0cyAqICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgLSAxKSkgKyAxfS0ke3RoaXMuZGF0YS5zaG93blJlc3VsdHMgKiB0aGlzLmRhdGEuY3VycmVudFBhZ2V9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd25SZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jdXJyZW50UGFnZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxhbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuY3VycmVudExhbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gdGhpcy5zYXZlZDtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc2F2ZWQgb25seSBmaWx0ZXIgaWYgbm8gc2F2ZWQgaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2F2ZWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKCdzYXZlZERvY3VtZW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmNvbXB1dGVkSXNNb2JpbGUgPyB0cnVlIDogdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmZpbHRlcnNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpOyAvLyBoYW5kbGUgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7IC8vIGhhbmRsZSBoaXN0b3J5IHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgYnJhbmQgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcImJyYW5kXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChicmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVByb2R1Y3RzKGJyYW5kcyk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBub3QgYnJhbmQgc2VsZWN0ZWQsIGVtcHR5IHRoZSBwcm9kdWN0cyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByb2R1Y3RzID0gW107IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHByb2R1Y3QgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcih0aGlzLmRhdGEuY2xhc3MsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzT25seSA9IHNhdmVkT25seSA/IHNhdmVkT25seS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5lbWFpbERvY3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlTGl0T3JkZXJDYXJ0JywgdGhpcy5kYXRhLmVtYWlsRG9jcyk7IC8vc3RvcmUgY2FydCBpbiBzdG9yZVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBkYXRhIHN0cmluZyBmb3IgcGFzc2luZyBzZWxlY3RlZCBkb2NzIHRvIHBhcmRvdFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbXNTdHI7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSBgRE9DVU1FTlQgSUQ6ICR7aXRlbS5wYXJ0TnVtYmVyfSB8IERPQ1VNRU5UIE5BTUU6ICR7aXRlbS5uYW1lfSB8IFFVQU5USVRZOiAke2l0ZW0ucXR5fSB8IFBSRS1QVU5DSEVEOiAke2l0ZW0ucHJlUHVuY2hlZCA9PSB0cnVlID8gXCJ5ZXNcIiA6IFwibm9cIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zU3RyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNTdHIgPSBzdHIgPyBgJHtpdGVtc1N0cn0gfHwgJHtzdHJ9YCA6IGAke2l0ZW1zU3RyfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zU3RyID0gc3RyID8gc3RyIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRJdGVtcyA9IGl0ZW1zU3RyO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBjYXJ0IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLiRyZWZzLmNhcnQuJGVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuJHJlZnMuY2FydC4kZWwub3V0ZXJIVE1MKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxldCBjYXJ0ID0gdGhpcy4kcmVmcy5jYXJ0LiRlbC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmRhdGEuY2FydENvbnRlbnRzID0gY2FydDtcbiAgICAgICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIG9wZW5DYXJ0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBvcGVuaW5nIGNhcnQgaWYgaXRzIGVtcHR5XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuZW1haWxEb2NzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2dnbGVGaWx0ZXJzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNhZmVTdHJpbmcoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidmFsdWVcIiwgc2FmZVN0cmluZyhlLnRhcmdldC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrZWRcIixlLnRhcmdldC5jaGVja2VkKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IFwic2F2ZWREb2N1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogY2hlY2tlZCwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgc3BlY2lmaWMgZmlsdGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlRmlsdGVyKGVsLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gY2xlYXJzIGZpbHRlcnNcbiAgICAgICAgICAgICAgICByZW1vdmVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG4gICAgICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgICAgIHBvcHVsYXRlUHJvZHVjdHMoYnJhbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY29uY2F0IG9wdGlvbnMgZnJvbSBhbGwgc2VsZWN0ZWQgYnJhbmRzIGFuZCByZW1vdmUgb3B0aW9ucyB3aGVuIGJyYW5kcyBhcmUgdW5zZWxlY3RlZCBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5kcy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICAvLyAvLyBjb25zb2xlLmxvZyhicmFuZFN0cik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgL2FwaS9HZXREb2N1bWVudFByb2R1Y3RzQnlCcmFuZGA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9wcm9kdWN0c0J5QnJhbmRcIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kOiBicmFuZFN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wcm9kdWN0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKHF1ZXJ5KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiYXBpL2RvY3VtZW50cz9cIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJRVUVSWVwiLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5xdWVyeSA9IHF1ZXJ5ID09PSBudWxsID8gbnVsbCA6IHF1ZXJ5ID8gcXVlcnkgOiB0aGlzLmRhdGEucXVlcnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHF1ZXJ5ID8gMSA6IHRoaXMuZGF0YS5jdXJyZW50UGFnZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVVybCA9IHdpbmRvdy5kb2N1bWVudEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL2RvY3VtZW50YXRpb25cIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmxUZXN0ID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvZG9jdW1lbnRhdGlvblRlc3RcIjsgLy9mcm9tIGpzb24tc2VydmVyXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWREb2N1bWVudHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9kdWN0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBicmFuZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZG9jVHlwZSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9kdWN0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxhbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYnJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRvY1R5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZS5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0U3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KHByb2R1Y3Quam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdTdHIgPSBkZWNvZGVVUklDb21wb25lbnQobGFuZy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmRTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoYnJhbmQuam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY1R5cGVTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZG9jVHlwZS5qb2luKCd8JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHE6IHRoaXMuZGF0YS5xdWVyeSA/IHRoaXMuZGF0YS5xdWVyeSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogKHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpKSA9PSBcIlwiID8gbnVsbCA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLmNoYXJBdCgwKSA9PSBcIixcIiA/IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLnNsaWNlKDEpIDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JyksIC8vQFRPRE8gbWFrZSB0aGlzIGxlc3MgaW5zYW5lLiBTZW5kIE5VTEwgaWYgZW1wdHkgc3RyaW5nLiBSZW1vdmUgbGVhZGluZyBjb21tYSBpZiBwcmVzZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDogcHJvZHVjdFN0ciA9PSBcIlwiID8gbnVsbCA6IHByb2R1Y3RTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ1N0ciA9PSBcIlwiID8gbnVsbCA6IGxhbmdTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBicmFuZDogYnJhbmRTdHIgPT0gXCJcIiA/IG51bGwgOiBicmFuZFN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGU6IGRvY1R5cGVTdHIgPT0gXCJcIiA/IG51bGwgOiBkb2NUeXBlU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5yZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnRvdGFsUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5zaG93blJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoYW5nZVBhZ2UoZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gXCJwcmV2XCIgJiYgdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gXCJuZXh0XCIgJiYgdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSB0aGlzLmRhdGEudG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3Njcm9sbC10by10b3AnLCB0aGlzLmRhdGEuY2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUVtYWlsRG9jcyhkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIGFkZCBvciByZW1vdmUgaXRlbXMgdG8gZW1haWxcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbLi4udGhpcy5kYXRhLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLnNwbGljZSh0aGlzLmRhdGEuZW1haWxEb2NzLmluZGV4T2YoaXRlbSksMSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUVtYWlsRG9jRGF0YShkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuZGF0YS5lbWFpbERvY3MuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWREYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERhdGEgPSB0aGlzLmRhdGEuZW1haWxEb2NzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmlkID09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERhdGEgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5kYXRhLmVtYWlsRG9jcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcyA9IHVwZGF0ZWREYXRhO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2FydEl0ZW0oaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGluZGV4ID0gdGhpcy5kYXRhLmVtYWlsRG9jcy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBlLmlkXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pLmluZGV4T2YoaWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gdGhpcy5kYXRhLmVtYWlsRG9jcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkICE9PSBpZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcChlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcubGl0LW9yZGVyX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLTEwMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codG9wKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRQYWdlcygpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gdG90YWwgcmVzdWx0IGNvdW50LCBkaXZpZGUgYnkgMTAgdG8gZ2V0IHRvdGFsIHBhZ2VzIG5lZWRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBtYXRoIGNlaWwgdG8gcm91bmQgdXBcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGFjdGl2ZSBmb3IgcHJldi9uZXh0IGJhc2VkIG9uIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEudG90YWxSZXN1bHRzIC8gMTApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlU3VibWl0KGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9kYWxOYW1lID09IHRoaXMuZGF0YS5tb2RhbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlzU3VibWl0dGVkIHRvIHRydWUgd2hlbiBmb3JtIGlzIHN1Ym1pdHRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGRhdGEubW9kYWxOYW1lID09IHRoaXMuZGF0YS5tb2RhbFRhcmdldCkgJiYgdGhpcy5kYXRhLmlzU3VibWl0dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gW107IC8vZW1wdHkgY2FydCBjb250ZW50cyBhcnJheSBvbiBtb2RhbCBjbG9zZSAob25seSBpZiBmb3JtIGlzIHN1Ym1pdHRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc1N1Ym1pdHRlZCA9IGZhbHNlOyAvL3NldCBpcyBzdWJtaXR0ZWQgYmFjayB0byBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkWzBdID09IFwiXCIgPyBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSB0aGlzLmRhdGEuaXNNb2JpbGUgPyBmYWxzZSA6IHRydWU7IC8vaW5pdCBzaG93L2hpZGUgZmlsdGVycyBpZi9pcyBtb2JpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWx0ZXIgdXBkYXRlcyBpbiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZUZpbHRlcnMnLCAoZWwsIGUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBFdmVudEJ1cy4kb24oJ2VtYWlsLWRvY3MnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy51cGRhdGVFbWFpbERvY3MoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZS1lbWFpbC1kb2MtZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaW50ZXJuYWwtc2VhcmNoJywgKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImRvY3VtZW50YXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3Njcm9sbC10by10b3AnLCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdyZW1vdmUtY2FydC1pdGVtJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNhcnRJdGVtKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZm9ybS1zdWJtaXR0ZWQnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJtaXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2Zvcm0tY2xvc2VkJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsRG9jdW1lbnRhdGlvbkFwaVJlc3VsdHMucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsRG9jdW1lbnRhdGlvbkFwaVJlc3VsdHMudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hvd25SZXN1bHRzID0gd2luZG93LmluaXRpYWxEb2N1bWVudGF0aW9uQXBpUmVzdWx0cy5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnJlc3VsdHMgPSBmcG9kYi5kb2N1bWVudGF0aW9uLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSBmcG9kYi5kb2N1bWVudGF0aW9uLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IGZwb2RiLmRvY3VtZW50YXRpb24ucmVzdWx0cy5sZW5ndGg7XG5cblxuICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGZpbHRlcnMgaWYgbGVzcyB0aGVuIDEwIGluaXRpYWwgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSAxMCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgXCJzaGFyZSBhbGxcIiBpZiA1IG9mIGxlc3MgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hhcmVBbGwgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSA1ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubW9kYWxUYXJnZXQgPSB0aGlzLiRyZWZzLmNhcnRCdXR0b24uZ2V0QXR0cmlidXRlKCdocmVmJykuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBjYXJ0IGNvbXBvbmVudCBjb250YWluZXIgZm9yIHBhc3NpbmcgdG8gZ2VuZXJpYyBmb3JtIG1vZGFsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmNhcnRDb250ZW50cyA9IGA8ZGl2IGNsYXNzPVwibGl0LW9yZGVyX19jYXJkcy1jb250ZW50IGxpdC1vcmRlcl9fY2FyZHMtY29udGVudC1jYXJ0XCIgaXM9XCJjYXJ0XCIgcmVmPVwiY2FydFwiIG1vZGFsLXRhcmdldD1cIiR7dGhpcy5kYXRhLm1vZGFsVGFyZ2V0fVwiPjwvZGl2PmA7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcblxuICAgICAgICAgICAgICAgIC8vIGZvciBkZWVwbGlua2luZ1xuICAgICAgICAgICAgICAgIC8vIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdsaXQtcHJvZHVjdHMnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2NoZWNrYm94LWl0ZW0nOiBDaGVja2JveFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LW9yZGVyX19wcm9kdWN0cy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGNoZWNrYm94LWl0ZW0gdi1mb3I9XCIocHJvZHVjdEl0ZW0sIGkpIGluIGRhdGEucHJvZHVjdHNcIiA6a2V5PWkgOnR5cGU9XCJ0eXBlXCIgOmxhYmVsPVwicHJvZHVjdEl0ZW0udmFsdWVcIiA6dmFsdWU9XCJwcm9kdWN0SXRlbS5rZXlcIiA6ZGF0YT1cImRhdGFcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gcmVzdWx0cyBsaXN0XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xpdC1yZXN1bHRzLWxpc3QnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRvY3VtZW50XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtb3JkZXJfX2NhcmRzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bGl0LXJlc3VsdHMtaXRlbSB2LWZvcj1cIihyZXN1bHQsIGluZGV4KSBpbiBkYXRhLnJlc3VsdHNcIiA6Y29udGVudD1cInJlc3VsdFwiIDppc1NlbGVjdGVkPVwiaXNTZWxlY3RlZChyZXN1bHQpXCIgOnF0eURhdGE9XCJxdHlEYXRhKHJlc3VsdClcIiA6a2V5PVwicmVzdWx0LmlkXCIgOmRhdGE9XCJkYXRhXCIgOmNhcnRWZXJzaW9uPVwiZmFsc2VcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZChyZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGkgPT4gaS5pZCA9PSByZXN1bHQuaWQpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBxdHlEYXRhKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWQgPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaSA9PiBpLmlkID09IHJlc3VsdC5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5OiBzYXZlZC5xdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlUHVuY2hlZDogc2F2ZWQucHJlUHVuY2hlZCBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNpbmdsZSByZXN1bHRzIGl0ZW1cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGl0LXJlc3VsdHMtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnY29udGVudCcsICdpc1NlbGVjdGVkJywgJ3F0eURhdGEnLCAnY2FydFZlcnNpb24nXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogdGhpcy5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsOiBudWxsLCAvL2lzIFwic2VlIGFsbFwiIGZlYXR1cmUgZW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsTGFiZWw6IG51bGwsLy9sYWJlbFxuICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGVudDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcHJlUHVuY2hlZDogdGhpcy5xdHlEYXRhID8gdGhpcy5xdHlEYXRhLnByZVB1bmNoZWQgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBxdHk6IHRoaXMucXR5RGF0YSA/IHRoaXMucXR5RGF0YS5xdHkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNJbkNhcnQ6IHRoaXMuY2FydFZlcnNpb24gPyB0cnVlIDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5jb2RlZFVybDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb250ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdUYWJMaW5rOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC51cmwucmVwbGFjZSgnZG93bmxvYWQ9dHJ1ZScsICdkb3dubG9hZD1mYWxzZScpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JNc2c6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmVudGVyVmFsaWRRdWFudGl0eUxhYmVsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3VGFiTGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudXJsID8gdGhpcy5jb250ZW50LnVybC5yZXBsYWNlKCdkb3dubG9hZD10cnVlJywgJ2Rvd25sb2FkPWZhbHNlJykgOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjYXJ0VmVyc2lvblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbkNhcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gdGhpcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbkNhcnQgPSBtYXRjaC5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdHkgPSBtYXRjaFswXS5xdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZVB1bmNoZWQgPSBtYXRjaFswXS5wcmVQdW5jaGVkO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucXR5ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucHJlUHVuY2hlZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGlkIHdoZW4gY29udGVudCBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsT3BlblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJxdHlcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jYXJ0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZW1wdHkgcXR5IHZhbHVlIGlmIG5vdCBpbiBjYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5xdHkubWF0Y2goL15cXGQrJC8pICYmIHBhcnNlSW50KHRoaXMucXR5KSA+PSA1ID8gdHJ1ZSA6IHRoaXMucXR5ID09IFwiXCIgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpcyBpbiBjYXJ0LCBlbXB0eSB2YWx1ZXMgYXJlIGludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnF0eS5tYXRjaCgvXlxcZCskLykgJiYgcGFyc2VJbnQodGhpcy5xdHkpID49IDUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBxdHkgaXMgdmFsaWQsIHVwZGF0ZSB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWQgJiYgdGhpcy5xdHkgIT09IFwiXCIgJiYgdGhpcy5pc0luQ2FydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCd1cGRhdGUtZW1haWwtZG9jLWRhdGEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmNvbnRlbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHRoaXMuY29udGVudC5kb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleWVicm93OiB0aGlzLmNvbnRlbnQuZXllYnJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5jb250ZW50LmRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29udGVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdHk6IHRoaXMucXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVQdW5jaGVkOiB0aGlzLnByZVB1bmNoZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5jb250ZW50LnVybFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRlIHZhbHVlcyBpZiBxdHkgaXMgdXBkYXRlZCBpbiBjYXJ0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5DYXJ0ICYmIHRoaXMuY2FydFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdjaGVjay1lcnJvcnMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJwcmVQdW5jaGVkXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZCAmJiB0aGlzLnF0eSAhPT0gXCJcIiAmJiB0aGlzLmlzSW5DYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlLWVtYWlsLWRvYy1kYXRhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmNvbnRlbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogdGhpcy5jb250ZW50LmRvY3VtZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXllYnJvdzogdGhpcy5jb250ZW50LmV5ZWJyb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5jb250ZW50LmRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5OiB0aGlzLnF0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVQdW5jaGVkOiB0aGlzLnByZVB1bmNoZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmNvbnRlbnQudXJsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJxdHlEYXRhXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBxdHkgYW5kIHByZXB1bmNoZWQgZGF0YSBpZiBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdHlEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF0eSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZVB1bmNoZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmQgbGl0LWNhcmQtLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmRfX2FyZWEgbGl0LWNhcmRfX2FyZWEtY2hlY2tib3hcIiA6Y2xhc3M9XCJ7aGlkZGVuOiBjYXJ0VmVyc2lvbn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpdC1jYXJkX19pY29uIGxpdC1jYXJkX19pY29uLWJvb2ttYXJrXCIgcmVmPVwiYm9va21hcmtcIiA6ZGF0YS1kb2N1bWVudC1pZD1cImNvbnRlbnQuaWRcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJoYW5kbGVCb29rbWFya1wiIDpjbGFzcz1cInthY3RpdmU6IGlzQm9va21hcmtlZH1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiYXBwXCIsIFwiYWN0aW9uXCI6IFwiRmF2b3JpdGVcIn0nPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmRfX2FyZWEgbGl0LWNhcmRfX2FyZWEtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fYXJlYSBsaXQtY2FyZF9fYXJlYS1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGl0LWNhcmRfX2V5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5leWVicm93fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cIm5ld1RhYkxpbmtcIiBjbGFzcz1cImxpdC1jYXJkX190aXRsZVwiIHJlZj1cIm5hbWVcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpdC1jYXJkX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXQtY2FyZF9fc3VidGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIj57e2NvbnRlbnQuZGV0YWlsc319PC9zcGFuPiA8c3BhbiBjbGFzcz1cImxpdC1jYXJkX19zdWJ0aXRsZS1tb3JlXCIgdi1pZj1cInNlZUFsbCAmJiBzZWVBbGxPcGVuXCI+XFx7e21vcmVDb250ZW50fX08L3NwYW4+IDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwidG9nZ2xlU2VlQWxsXCIgdi1pZj1cInNlZUFsbFwiPlxce3tzZWVBbGxMYWJlbH19PC9hPiB8IHt7Y29udGVudC5sYW5ndWFnZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX19hcmVhIGxpdC1jYXJkX19hcmVhLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fcXR5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibGl0LWNhcmRfX3F0eS1pbnB1dFwiIHYtbW9kZWw9XCJxdHlcIiA6Y2xhc3M9XCJ7aW52YWxpZDogIXZhbGlkICYmIHZhbGlkICE9PSBudWxsfVwiIHBsYWNlaG9sZGVyPVwiUVRZXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibGl0LWNhcmRfX2J1dHRvblwiIHYtb246Y2xpY2sucHJldmVudD1cImFkZFRvQ2FydFwiIHYtaWY9XCIhY2FydFZlcnNpb25cIj5BZGQ8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwibGl0LWNhcmRfX2J1dHRvbiBsaXQtY2FyZF9fYnV0dG9uLXJlbW92ZVwiIHYtb246Y2xpY2sucHJldmVudD1cInJlbW92ZUZyb21DYXJ0XCIgdi1pZj1cImNhcnRWZXJzaW9uXCI+PHNwYW4gY2xhc3M9XCJsaXQtY2FyZF9fcmVtb3ZlXCI+PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fZXJyb3JcIiB2LWlmPVwiIXZhbGlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e2Vycm9yTXNnfX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmRfX2NoZWNrYm94LWNvbnRhaW5lciBjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGl0LWNhcmRfX2NoZWNrYm94LWxhYmVsIGNoZWNrYm94X19sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImxpdC1jYXJkX19jaGVja2JveCBjaGVja2JveF9faW5wdXRcIiB2LW1vZGVsPVwicHJlUHVuY2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGl0LWNhcmRfX2NoZWNrYm94LWNoZWNrbWFyayBjaGVja2JveF9fY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGl0LWNhcmRfX2NoZWNrYm94LXRleHQgY2hlY2tib3hfX3RleHRcIj5QcmUtcHVuY2hlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAvLyBlbWFpbERvYygpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgRXZlbnRCdXMuJGVtaXQoJ2VtYWlsLWRvY3MnLCB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcIm5hbWVcIjogdGhpcy5jb250ZW50Lm5hbWUsIFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgXCJ1cmxcIjogdGhpcy5jb250ZW50LnVybCwgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcImlkXCI6IHRoaXMuY29udGVudC5pZCwgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcInF0eVwiOiB0aGlzLnF0eSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwicHJlUHVuY2hlZFwiOiB0aGlzLnByZVB1bmNoZWQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcImV5ZWJyb3dcIjogdGhpcy5jb250ZW50LmV5ZWJyb3csXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcImRldGFpbHNcIjogdGhpcy5jb250ZW50LmRldGFpbHNcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZG9jdW1lbnRJZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZVNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxPcGVuID0gIXRoaXMuc2VlQWxsT3BlbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxzID0gdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGwgPSBkZXRhaWxzLmxlbmd0aCA+IDMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cnVuY2F0ZWREZXRhaWxzID0gZGV0YWlscy5zbGljZSgwLDMpLmpvaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb3JlRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMykuam9pbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcmVDb250ZW50ID0gbW9yZURldGFpbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MID0gYCR7dHJ1bmNhdGVkRGV0YWlsc30ke21vcmVEZXRhaWxzID09IFwiXCIgPyAnJyA6ICcsJ31gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZGRUb0NhcnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5xdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh0aGlzLnF0eSkgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5jb250ZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXI6IHRoaXMuY29udGVudC5kb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV5ZWJyb3c6IHRoaXMuY29udGVudC5leWVicm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuY29udGVudC5kZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29udGVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0eTogdGhpcy5xdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlUHVuY2hlZDogdGhpcy5wcmVQdW5jaGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5jb250ZW50LnVybFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZS1lbWFpbC1kb2MtZGF0YScsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVGcm9tQ2FydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1jYXJ0LWl0ZW0nLCB0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlZUFsbCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgaXRlbSBpcyBleHBsaWNpdGx5IHJlbW92ZWQgZnJvbSBjYXJ0LCBjbGVhciBpdHMgaW5wdXQgdmFsdWVzXG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdyZW1vdmUtY2FydC1pdGVtJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSB0aGlzLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF0eSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZVB1bmNoZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNhcnRcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnY2FydCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ21vZGFsVGFyZ2V0J10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoYXNFcnJvcnM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNhcnRIYXNoOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjYXJ0Q29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5saXRPcmRlckNhcnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvck1zZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZW50ZXJWYWxpZFF1YW50aXR5TGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgaGFzRXJyb3JzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2hhc0Vycm9ycycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoYXNFcnJvcnMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2FydENvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0Q29udGVudC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2xvc2VNb2RhbCh0aGlzLmNhcnRIYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZm9yIHNob3dpbmcvaGlkaW5nIGNhcnQgbW9kdWxlLiBoaWRlIGlmIHN1Ym1pdHRlZC5cbiAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlzU3VibWl0dGVkID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxpdC1yZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gY2FydENvbnRlbnRcIiA6Y29udGVudD1cInJlc3VsdFwiIDprZXk9XCJyZXN1bHQuaWRcIiA6Y2FydFZlcnNpb249XCJ0cnVlXCIgOnF0eURhdGE9XCJxdHlEYXRhKHJlc3VsdClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibGl0LWNhcmRfX2Vycm9yXCIgdi1pZj1cImhhc0Vycm9yc1wiPnt7ZXJyb3JNc2d9fTxwLz5cbiAgICAgICAgICAgIDwvZGl2PmAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgcXR5RGF0YShyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkID0gdGhpcy5jYXJ0Q29udGVudC5maW5kKGkgPT4gaS5pZCA9PSByZXN1bHQuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0eTogc2F2ZWQucXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZVB1bmNoZWQ6IHNhdmVkLnByZVB1bmNoZWQgXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja2luZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGludmFsaWRFbnRyeSA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5saXQtY2FyZF9fcXR5LWlucHV0LmludmFsaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRXJyb3JzID0gaW52YWxpZEVudHJ5ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpbnZhbGlkRW50cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0SGFzaCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0SGFzaCA9IHRoaXMuJGVsLmNsb3Nlc3QoJy5ibWktbW9kYWxfX3dyYXBwZXInKSA/IHRoaXMuJGVsLmNsb3Nlc3QoJy5ibWktbW9kYWxfX3dyYXBwZXInKS5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVTdWJtaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RhbE5hbWUgPT0gdGhpcy5tb2RhbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChkYXRhLm1vZGFsTmFtZSA9PSB0aGlzLm1vZGFsVGFyZ2V0KSAmJiB0aGlzLmlzU3VibWl0dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTsgLy9zZXQgaXMgc3VibWl0dGVkIGJhY2sgdG8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdmb3JtLXN1Ym1pdHRlZCcsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Ym1pdChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZm9ybS1jbG9zZWQnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDbG9zZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGVjay1lcnJvcnMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tFcnJvcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEhhc2goKTsgXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAubGl0LW9yZGVyLSR7aWR9YCxcbiAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICB9KS4kbW91bnQoYC5saXQtb3JkZXItJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAobGl0T3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBsaXRPcmRlci5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBsaXQtb3JkZXItJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGxpdE9yZGVyQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIHdpbmRvdy5lbnRlclZhbGlkUXVhbnRpdHlMYWJlbCA9IFwiZXJyb3IgdGVzdFwiO1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdE9yZGVyO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCB7IGxvcnkgfSBmcm9tICdsb3J5LmpzJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5cbi8vICoqTk9URSoqXG4vLyAxIGluZGV4XG5cbmNvbnN0IE1hcmtldEFwcHMgPSAoKSA9PiB7XG5cbiAgICBjb25zdCBhcHBzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hcmtldC1hcHBzJyk7XG5cbiAgICBjb25zdCBtYXJrZXRBcHBzQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdtYXJrZXQtYXBwcy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNsaWRlckVsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVGcmFtZTogJ21hcmtldC1hcHBzX19mcmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNb3VzZUV2ZW50czogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBsb3J5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogMSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRMb3J5KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvcnkgPSBsb3J5KHRoaXMuc2xpZGVyRWwsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TGlzdGVuZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyRWwuYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXIubG9yeS5zbGlkZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGhpcy5sb3J5LnJldHVybkluZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3NlbGVjdC1zbGlkZScsICh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5LnNsaWRlVG8odGFyZ2V0IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFRhZ3MoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibGF5ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmV2aWV3IENhcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpLmZvckVhY2goKHNsaWRlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZS5kYXRhc2V0LnRhZ01ldGEgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXJrZXQtYXBwc19fbmF2LWl0ZW0gYScpW2ldLmlubmVyVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5vXCI6IChpICsgMSkgPCAxMCA/IGAwJHtpICsgMX1gIDogYCR7aSArIDF9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJFbCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5tYXJrZXQtYXBwc19fc2xpZGVyJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcubWFya2V0LWFwcHNfX3NsaWRlJykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdExvcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRhZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbWFya2V0LWFwcHMtbmF2LWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydjdXJyZW50U2xpZGUnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBudWxsXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibGF5ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmV2aWV3IENhcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiB0aGlzLnRhcmdldCA8IDEwID8gYDAke3RoaXMudGFyZ2V0fWAgOiB0aGlzLnRhcmdldC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnRhcmdldCA9PSB0aGlzLmN1cnJlbnRTbGlkZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0YXJnZXQgaWQgYmFzZWQgb24gbm9kZSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IFtdLmluZGV4T2YuY2FsbCh0aGlzLiRlbC5wYXJlbnROb2RlLmNoaWxkcmVuLCB0aGlzLiRlbCkgKyAxOyAgIFxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnRhcmdldCA9PSB0aGlzLmN1cnJlbnRTbGlkZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJ2EnKS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RTbGlkZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NlbGVjdC1zbGlkZScsIHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5tYXJrZXQtYXBwcy0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLm1hcmtldC1hcHBzLSR7aWR9YCwgdHJ1ZSk7XG5cbiAgICB9XG5cbiAgICBpZiAoYXBwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFwcHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgbWFya2V0LWFwcHMtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIG1hcmtldEFwcHNDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcmtldEFwcHM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xpYi9taXNjJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgZnBvZGIgZnJvbSAnLi4vLi4vLi4vZGIuanNvbic7XG5cbi8vIE5PVEVTOlxuLy8gbWVudSBpcyBicm9rZW4gZG93biBpbnRvIHByaW1hcnksIDJuZCBsZXZlbCwgYW5kIDNyZCBsZXZlbCBcInBhbmVsc1wiIFxuLy8gcHJpbWFyeTogdG9wIGxldmVsIG1lbnUgY2F0ZWdvcnkgKGUuZy4gbXVuaWNpcGFsIHdhdGVyIHNvbHV0aW9ucywgaW5kdXN0cmlhbCBtZWFzdXJlbWVudCBzb2x1dGlvbnMpXG4vLyAybmQgbHZsOiBjYXRlZ29yaWVzIHVuZGVyIHRoZSBwcmltYXJ5IGNhdGVnb3J5IChlLmcuIHByb2R1Y3RzLCBwcm9kdWN0IGxpbmVzKVxuLy8gM3JkIGx2bDogY29udGVudCBpbnNpZGUgdGhlIDJuZCBsZXZlbCBjYXRlZ29yeSAoZS5nLiBtZXRlcnMsIG1ldGVyIGNvbXBvbmVudHMsIGVuZHBvaW50cylcblxuLy8gXCJwcmltYXJ5XCIgYW5kIFwic2Vjb25kYXJ5XCIgbWVudSBwYW5lbHMvaXRlbXMgYXJlIGJhc2VkIG9uIHRoZSBcbi8vIG1lZ2FtZW51IERPTSBvcmRlciBpbiBtZWdhbWVudS5oYnMuIFxuXG4vLyBvbiBtb2JpbGUsIHByaW1hcnktbWVudS1pdGVtIElEIGlzIGRldGVybWluZWQgYnkgRE9NIG9yZGVyLiAoZS5nLiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgZG9tIGlzIHByaW1hcnktMSwgdGhlIHNlY29uZCBpcyBwcmltYXJ5LTIsIGV0Yy4pXG4vLyBzZWxlY3RlZFNlY29uZGFyeUlkIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNlY29uZGFyeSBsZXZlbCBJRCBhbmQgaXRzIHBhcmVudCwgdGhlIHNlbGVjdGVkIHByaW1hcnkgSWQgKGUuZy4gc2Vjb25kYXJ5LTEtcHJpbWFyeS0yIHJlZmVycyB0byB0aGUgMXN0IHNlY29uZGFyeSBjYXRlZ29yeSBpbiB0aGUgMm5kIHByaW1hcnkgY2F0ZWdvcnkpXG5cblxuY29uc3QgTWVnYW1lbnUgPSAoKSA9PiB7XG5cbiAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FtZW51Jyk7XG4gICAgbGV0IGhpc3RvcnlBcnIgPSBbXVxuICAgIGxldCBoaWdoZXN0VGllck9wZW4gICA9IDA7XG5cbiAgICBjb25zdCBjbGVhck1vYmlsZU1lbnUgPSBmdW5jdGlvbigpXG4gICAgICAgIHtcbiAgICAgICAgaGlzdG9yeUFyci5sZW5ndGggPSAwO1xuICAgICAgICBoaWdoZXN0VGllck9wZW4gICA9IDA7XG4gICAgICAgIGNvbnN0IG1lZ2FUaWVycyAgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhX19jb250ZW50IC5tZWdhX190aWVycycpO1xuICAgICAgICBjb25zdCB0cmlnZ2Vyc1dyYXAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVnYV9fdHJpZ2dlcnMnKTtcbiAgICAgICAgY29uc3Qgb3BlblRpZXJzICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1vYmlsZUFjdGl2ZVRpZXInKSBcbiAgICAgICAgY29uc3Qgb3BlbkNvbHMgICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1vYmlsZUFjdGl2ZUNvbCcpIFxuICAgICAgICBcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8IG9wZW5UaWVycy5sZW5ndGg7IGkrKykgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBhbGwgb3BlbiBtb2JpbGUgdGllcnMgKG1vcmUgdGhhbiBvbmUgbWlnaHQgaGF2ZSBiZWVuIG9wZW5lZCBieSBkZXNrdG9wIG1lbnUpXG4gICAgICAgICAgICB7b3BlblRpZXJzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZVRpZXInKX1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8IG9wZW5Db2xzLmxlbmd0aDsgaSsrKSAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBhbGwgb3BlbiBtb2JpbGUgQ29scyAobW9yZSB0aGFuIG9uZSBtaWdodCBoYXZlIGJlZW4gb3BlbmVkIGJ5IGRlc2t0b3AgbWVudSlcbiAgICAgICAgICAgIHtvcGVuQ29sc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGVBY3RpdmVUaWVyJyl9XG5cbiAgICAgICAgbWVnYVRpZXJzLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUhpZGUnKSAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIG1lbnUgdG8gZGVmYXVsdCBzZXR0aW5nXG4gICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QuYWRkKCdtb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgfVxuXG5cbiAgICBjb25zdCBtZWdhbWVudUNvbnN0cnVjdG9yID0gKCkgPT4geyAgICAgICAgIFxuICAgICAgICBWdWUuY29tcG9uZW50KCdtZWdhbWVudS10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBzdG9yZS5zdGF0ZS5pc01vYmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJpbWFyeUlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRhcnlJZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVG9wYmFySWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVNZW51T3BlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BiYXJNZW51T3BlbjogZmFsc2UsIC8vdG9wYmFyIG1lbnUgSU5TSURFIHRoZSBtZWdhbWVudSwgbm90IHRoZSBvbmUgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbnVPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU1lbnVPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVEYXRhOiBzdG9yZS5zdGF0ZS5tZW51S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGlyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkTWVudURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUubWVudUtleXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBtb2JpbGUgbWVudSBpZiBkZXNrdG9wXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubW9iaWxlTWVudU9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbk1lbnUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkTWVudURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubWVudURhdGEgPSB0aGlzLmNvbXB1dGVkTWVudURhdGE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgY2xvc2luZyBtZWdhbWVudSBvbiBvdXRzaWRlIGNsaWNrXG4gICAgICAgICAgICAgICAgXCJkYXRhLnNlbGVjdGVkUHJpbWFyeUlkXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vdXRzaWRlQ2xpY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub3V0c2lkZUNsaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vdXRzaWRlQ2xpY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuc2Nyb2xsRGlyXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUNvbnRhaW5lciA9IHRoaXMuJGVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1lbnVDb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YS5zY3JvbGxEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXBcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZG93blwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVNb2JpbGVNZW51KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubW9iaWxlTWVudU9wZW4gPSAhdGhpcy5kYXRhLm1vYmlsZU1lbnVPcGVuOyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuZGF0YS5tb2JpbGVNZW51T3BlbiBcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNPcGVuID09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2JpbGUtb3BlbicpO31cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAge2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9iaWxlLW9wZW4nKTt9XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTW9iaWxlTWVudSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0c2lkZUNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVnYW1lbnUgPSB0aGlzLiRlbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWdhbWVudS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRQcmltYXJ5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbk1lbnUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzY3JvbGxQb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLnRvcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNjcm9sbERpciA9IFwidG9wXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS50b3AgPiBzY3JvbGxQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2Nyb2xsRGlyID0gXCJ1cFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2Nyb2xsRGlyID0gXCJkb3duXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3MgPSAoZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkudG9wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzZXRUb3BiYXJTZWxlY3Rpb24nLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFRvcGJhcklkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG9wYmFyTWVudU9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByaW1hcnlNZW51T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2JhY2snLCAob2JqKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbV0gPSBvYmpbaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzZXRQcmltYXJ5U2VsZWN0aW9uJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRQcmltYXJ5SWQgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmltYXJ5TWVudU9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvcGJhck1lbnVPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignc2V0U2Vjb25kYXJ5U2VsZWN0aW9uJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRTZWNvbmRhcnlJZCA9IGlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTWVudSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgIFxuXG4gICAgICAgIC8vIHdyYXBwZXIgZm9yIHRvcCBsZXZlbCBzdWJtZW51c1xuICAgICAgICAvLyBlLmcuIE11bmljaXBhbCB3YXRlciBzb2x1dGlvbnMsIEluZHVzdHJpYWwgbWVhc3VyZW1lbnQgc29sdXRpb25zXG4gICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ21lZ2FtZW51LXN1Ym1lbnUnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAnZGF0YS5zZWxlY3RlZFByaW1hcnlJZCc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRoaXMuaWQgPT0gdGhpcy5kYXRhLnNlbGVjdGVkUHJpbWFyeUlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkgeyBcbiAgICAgICAgICAgICAgICAvLyBzZXQgY3VycmVudCBzdWJtZW51IElEIGJhc2VkIG9uIDEgaW5kZXhcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJzdWJtZW51LVwiICsgKFtdLmluZGV4T2YuY2FsbCh0aGlzLiRlbC5wYXJlbnROb2RlLmNoaWxkcmVuLCB0aGlzLiRlbCkpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAvKlxuICAgICAgICBWdWUuY29tcG9uZW50KCdtb2JpbGUtcGFuZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgncHJpbWFyeS1tZW51LWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydpc01vYmlsZSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3VmZml4OiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgc2V0ID1pZFxuICAgICAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW1zID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYW1lbnVfX21vYmlsZS1pdGVtLS1tYWluJykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJwcmltYXJ5LVwiICsgKG1lbnVJdGVtcy5pbmRleE9mKHRoaXMuJGVsKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeCA9IG1lbnVJdGVtcy5pbmRleE9mKHRoaXMuJGVsKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aXRsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy4kZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZU1lbnUnLCB7J2lkJzogdGhpcy5pZCwgJ3RpdGxlJzogdGhpcy50aXRsZX0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBpbml0RXZlbnRzKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTW9iaWxlRXZlbnRzKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaGFuZGxlRGVza3RvcEV2ZW50cyhlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZURlc2t0b3BFdmVudHMoZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0U2Vjb25kYXJ5U2VsZWN0aW9uJywgYHNlY29uZGFyeS0xLXByaW1hcnktJHt0aGlzLnN1ZmZpeH1gKTtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZU1vYmlsZUV2ZW50cyhlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFByaW1hcnlTZWxlY3Rpb24nLHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgncHJpbWFyeS1tZW51LWl0ZW0tZGVza3RvcCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ3BhcmVudC1pZCcsICdkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHBhcmVudElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IFwicHJpbWFyeS1cIiArIHRoaXMucGFyZW50SWQuc2xpY2UoOCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN1Ym1lbnUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdkYXRhLnNlbGVjdGVkUHJpbWFyeUlkJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnBhcmVudElkID09IHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRTdWJtZW51KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZSkge2UucHJldmVudERlZmF1bHQoKTt9XG4gICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzZXRTZWNvbmRhcnlTZWxlY3Rpb24nLCBgc2Vjb25kYXJ5LTEtJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RNZW51KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRJZCA9PSB0aGlzLmRhdGEuc2VsZWN0ZWRQcmltYXJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzZXRQcmltYXJ5U2VsZWN0aW9uJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0UHJpbWFyeVNlbGVjdGlvbicsIGAke3RoaXMucGFyZW50SWR9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFNlY29uZGFyeVNlbGVjdGlvbicsIGBzZWNvbmRhcnktMS0ke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAqL1xuICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3ByaW1hcnktcGFuZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydwYXJlbnQtaWQnLCAnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2VsZWN0ZWRQcmltYXJ5SWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSWQgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmltYXJ5UGFuZWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYW1lbnVfX3N1Ym1lbnUtYXJlYS1sZWZ0JykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJwcmltYXJ5LVwiICsgKHByaW1hcnlQYW5lbHMuaW5kZXhPZih0aGlzLiRlbCkgKyAxKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRpdGxlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiYWNrKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2JhY2snKTtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnYmFjaycsIHtcInByaW1hcnlNZW51T3BlblwiOiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0VGl0bGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuZGF0YS5tZW51RGF0YS5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpdGVtXCIsIGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IG1hdGNoLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAqL1xuICAgICAgICAvKlxuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWNvbmRhcnktcGFuZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydwYXJlbnQtaWQnLCAnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NlY29uZGFyeS1jb250ZW50Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsncGFyZW50SWQnLCAnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN1ZmZpeDogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNlbGVjdGVkU2Vjb25kYXJ5SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHBhcmVudElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLnBhcmVudElkLnN1YnN0cmluZyg4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWRJZCA9PSB0aGlzLmlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gJ2RhdGEubWVudURhdGEnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5nZXRFbGVtZW50cygpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IEFycmF5LmZyb20odGhpcy4kZWwucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYW1lbnVfX3N1Ym1lbnUtY29udGVudCcpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IFwic2Vjb25kYXJ5LVwiICsgKGl0ZW1zLmluZGV4T2YodGhpcy4kZWwpICsgMSkgKyBcIi1wcmltYXJ5LVwiICsgdGhpcy5zdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLmRhdGFzZXQuaWQgPSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gZ2V0RWxlbWVudHMoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBpbm5lckNvbnRlbnQgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcubWVnYW1lbnVfX2lubmVyLWFyZWEnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NlY29uZGFyeS1tZW51LWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydwYXJlbnRJZCcsICdkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWxlY3RlZFNlY29uZGFyeUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB3YWl0IHVudGlsIHBhcmVudCBoYXMgYW5kIElEIHRvIGFzc2lnbiBjaGlsZCBpZFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSWQgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuJGVsLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnLm1lZ2FtZW51X19zdWJtZW51LWl0ZW0nKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInNlY29uZGFyeS1cIiArIChpdGVtcy5pbmRleE9mKHRoaXMuJGVsKSArIDEpICsgXCItXCIgKyB0aGlzLnBhcmVudElkO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyQ29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGRpdltkYXRhLWlkPVwiJHt0aGlzLmlkfVwiXWApLmNsb25lTm9kZSh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuJGVsLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlTWVudScsIHtcImlkXCI6IHRoaXMuaWQsXCJ0aXRsZVwiOnRoaXMudGl0bGUsIFwiZWxcIjppbm5lckNvbnRlbnR9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRpdGxlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVEZXNrdG9wKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWQgZGVza3RvcFwiKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFNlY29uZGFyeVNlbGVjdGlvbicsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZCBtb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSAhdGhpcy5pc0FjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFNlY29uZGFyeVNlbGVjdGlvbicsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdEV2ZW50cygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLm1lZ2FtZW51X19zdWJtZW51LWl0ZW0tbGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1vYmlsZShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVEZXNrdG9wKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRFdmVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NlY29uZGFyeS1pbm5lci1jb250ZW50Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpZCddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAnZGF0YS5tZW51RGF0YSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0Q29udGVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHRoaXMuZGF0YS5tZW51RGF0YS5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsID0gb2JqLmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5pbm5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmluaXRDb250ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAqL1xuICAgICAgICBWdWUuY29tcG9uZW50KCd0b3BiYXItcGFuZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCd0b3BiYXItY29udGVudCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG1lbnVEYXRhOiBzdG9yZS5zdGF0ZS5tZW51S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNlbGVjdGVkVG9wYmFySWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVkTWVudURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUubWVudUtleXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgLy8gb25seSB3YXRjaCB0aGUgc2VsZWN0ZWQgdG9wYmFyIGNvbnRlbnQgaWRcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuaWQgPT0gdGhpcy5zZWxlY3RlZElkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlZE1lbnVEYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51RGF0YSA9IHN0b3JlLnN0YXRlLm1lbnVLZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGJhY2soZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYmFjaycpO1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdiYWNrJywge1widG9wYmFyTWVudU9wZW5cIjogZmFsc2V9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5tZW51RGF0YS5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpdGVtXCIsIGl0ZW0uaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IG1hdGNoLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lbnVJdGVtcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lZ2FtZW51X19tb2JpbGUtdG9wYmFyJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInRvcGJhci1cIiArIChtZW51SXRlbXMuaW5kZXhPZih0aGlzLiRlbCkgKyAxKTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubWVudURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGVzdFwiLHRlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCd0b3BiYXItbWVudS1pdGVtJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHN0b3JlLnN0YXRlLmlzTW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaXRsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlRXZlbnRzKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzZXRUb3BiYXJTZWxlY3Rpb24nLHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gc2V0IHNlY3Rpb24gdGl0bGUgdG8gcGFzcyB0byBzZWN0aW9uIG1lbnVcbiAgICAgICAgICAgICAgICBzZXRUaXRsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IHRoaXMuJGVsLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVNZW51Jywge1wiaWRcIjogdGhpcy5pZCxcInRpdGxlXCI6dGhpcy50aXRsZX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIGxldCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhbWVudV9fbW9iaWxlLWl0ZW0tLXRvcGJhcicpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJ0b3BiYXItXCIgKyAobWVudUl0ZW1zLmluZGV4T2YodGhpcy4kZWwpICsgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xhbmctc2VsZWN0b3InLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhbGxMYW5nczogW10sXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGFuZy1zZWxlY3Rvci1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnYWxsTGFuZ3MnLCdhY3RpdmVMYW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVMYW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlTGFuZyA9PT0gdGhpcy5sYW5nID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlTGFuZyhlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vIHRoaXMuYWN0aXZlTGFuZyA9IHRoaXMubGFuZztcbiAgICAgICAgICAgICAgICAvLyAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldC1sYW5nJywgdGhpcy5sYW5nKTtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdExhbmcoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmFjdGl2ZUxhbmcgPSB0aGlzLmxhbmc7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50QnVzLiRlbWl0KCdzZXQtbGFuZycsIHRoaXMubGFuZyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYW5nID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQubGFuZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBzZWxlY3RlZExhbmd1YWdlPSR7bGFuZ307IHBhdGg9LzsgbWF4LWFnZT0zMTUzNjAwMDtgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmcgPSB0aGlzLiRlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmFjdGl2ZUxhbmcgPT0gdGhpcy5sYW5nID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWFyY2gnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aXZlU2VhcmNoT3BlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFRlcm06IG51bGwsIC8vZnJvbSBpbnB1dCBmb3Igdi1tb2RlbFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hUZXJtVmlzOiBudWxsLCAvL2Rpc3BsYXllZCBzZWFyY2ggdGVybVxuICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGVybTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgc2VhcmNoIGlmIHNlYXJjaCB0ZXJtIGlzIGxvbmdlciB0aGFuIDEgY2hhcmFjdGVyIGFuZCBub3Qgc3BhY2VzXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGVybSAmJiB0aGlzLnNlYXJjaFRlcm0ucmVwbGFjZSgvXFxzKy9nLCAnJykgIT09IFwiXCIgJiYgdGhpcy5zZWFyY2hUZXJtLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZGljdGl2ZVNlYXJjaE9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkZWJvdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWRpY3RpdmVTZWFyY2hPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuZ2xvYmFsU2VhcmNoLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIC8vIGluY2x1ZGVzIHVybCBwYXJhbXMgZm9yIGF1dG8gZmlsdGVyaW5nIG9uIHNlYXJjaCByZXN1bHRzIHBhZ2VcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXJzIHBhcmFtcyBhcmUgYnkgZmlsdGVyIElEXG4gICAgICAgICAgICAgICAgc2VhcmNoVXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5iYXNlU2VhcmNoVXJsfT9xPSR7dGhpcy5zZWFyY2hUZXJtVmlzfWA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwcm9kdWN0VXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5iYXNlUHJvZHVjdFVybH0mcT0ke3RoaXMuc2VhcmNoVGVybVZpc31gO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvblVybDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt3aW5kb3cuYmFzZURvY3VtZW50YXRpb25Vcmx9JnE9JHt0aGlzLnNlYXJjaFRlcm1WaXN9YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFRlY2hub2xvZ3lVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7d2luZG93LmJhc2VUZWNobm9sb2d5VXJsfSZxPSR7dGhpcy5zZWFyY2hUZXJtVmlzfWA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIktleXdvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuc2VhcmNoVGVybVZpcyA/IHRoaXMuc2VhcmNoVGVybVZpcyA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZpbHRlck5hbWVcIjogXCJmaWx0ZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGFkZExvYWRpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhbWVudV9fc2VhcmNoLWlucHV0JykuY2xhc3NMaXN0LmFkZCgnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FtZW51X19zZWFyY2gtaW5wdXQnKS5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2dnbGVTZWFyY2goKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0czogZGVib3VuY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1WaXMgPSB0aGlzLnNlYXJjaFRlcm07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBcIi9hcGkvcHJvZHVjdHNcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3Byb2R1Y3RzXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcTogdGhpcy5zZWFyY2hUZXJtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXMuZGF0YS5yZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHMgPSByZXMuZGF0YS5yZXN1bHRzLnNsaWNlKDAsIDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdwcmVkaWN0aXZlLXJlc3VsdHMnLCB7XG4gICAgICAgICAgICBwcm9wczogWydyZXN1bHRzJywgJ2lzTG9hZGluZyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxyZXN1bHQtaXRlbSB2LWZvcj1cIihyZXN1bHQsIGluZGV4KSBpbiByZXN1bHRzXCIgOmtleT1cImluZGV4XCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiA6aXNMb2FkaW5nPVwiaXNMb2FkaW5nXCI+PC9yZXN1bHQtaXRlbT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgncmVzdWx0LWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydjb250ZW50JywgJ2lzTG9hZGluZyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVnYW1lbnVfX3ByZXNlYXJjaC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZ2FtZW51X19wcmVzZWFyY2gtaXRlbS1pbWFnZVwiIHYtaWY9XCJjb250ZW50LnByb2R1Y3RJbWFnZVVybFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCI+PGltZyA6c3JjPVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxcIiA6YWx0PVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxBbHRUZXh0XCI+PC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWdhbWVudV9fcHJlc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCIgY2xhc3M9XCJtZWdhbWVudV9fcHJlc2VhcmNoLWl0ZW0tbGlua1wiPjxzcGFuIGNsYXNzPVwibWVnYW1lbnVfX3ByZXNlYXJjaC1pdGVtLWV5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjb250ZW50LmJyYW5kfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVnYW1lbnVfX3ByZXNlYXJjaC1pdGVtLXRpdGxlXCIgdi1odG1sPVwiY29udGVudC5wcm9kdWN0TmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj48L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5tZWdhbWVudWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAubWVnYW1lbnVgLCB0cnVlKTtcbiAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgIGlmIChtZW51KSBcbiAgICAgICAge1xuICAgICAgICBtZWdhbWVudUNvbnN0cnVjdG9yKCk7XG4gICAgICAgIGxldCBob3ZlclRpbWVyICAgICAgICA9IG51bGw7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJzV3JhcCAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhX190cmlnZ2VycycpO1xuICAgICAgICBjb25zdCB0cmlnZ2VycyAgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYV9fdHJpZ2dlcnMgLmlzLXRyaWdnZXInKTtcbiAgICAgICAgY29uc3QgbWVnYUNvbnRlbnQgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX2NvbnRlbnQnKTtcbiAgICAgICAgY29uc3QgbWVnYVRpZXJzICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX2NvbnRlbnQgLm1lZ2FfX3RpZXJzJyk7XG4gICAgICAgIGNvbnN0IGNvbFRyaWdnZXJzICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhX19jb250ZW50IC50cmlnZ2VyJyk7XG4gICAgICAgIGNvbnN0IG1vYmlsZUJhY2sgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtZWdhX19tb2JpbGVfX3RpZXJfX2JhY2snKTtcbiAgICAgICAgY29uc3QgbW9iaWxlSGVhZGluZyAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21lZ2FfX21vYmlsZV9fdGllcl9faGVhZGluZycpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBjbGljayBvZmYgbWVudSBcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiBcbiAgICB7XG4gICAgLy8gY29uc3QgY2xpY2tlZEFyZWEgPSBcbiAgICBpZiAoIW1lZ2FDb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhdHJpZ2dlcnNXcmFwLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiBtZWdhQ29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKVxuICAgICAgICB7XG4gICAgICAgIG1lZ2FDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpXG4gICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QucmVtb3ZlKCdtZWdhbWVudVRyaWdnZXJlZCcpXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhX190cmlnZ2VycyAuaXMtdHJpZ2dlci5hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKVxuICAgICAgICB9XG4gICAgfSlcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGJhY2sgYnV0dG9uIGZvciBtb2JpbGUgXG4gICAgICAgIG1vYmlsZUJhY2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5U2l6ZSA9IGhpc3RvcnlBcnIubGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gYWxzbyBiZSB0aGUgaGVpZ2hlc3QgdGllciBvcGVuLiBcbiAgICAgICAgICAgIGNvbnN0IGN1ckluZGV4ICAgID0gaGlzdG9yeVNpemUgLTE7XG5cbiAgICAgICAgICAgIC8vIHNob3VsZCBvbmx5IHdvcmsgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGl0ZW0gaW4gaGlzdG9yeVxuICAgICAgICAgICAgaWYoIGhpc3RvcnlTaXplID4gMSApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZQbGFjZSA9IGhpc3RvcnlBcnJbY3VySW5kZXggLTFdXG4gICAgICAgICAgICAgICAgLy8gY2xvc2UgY3VycmVudCBvcGVuIHRpZXIsIGFuZCBvcGVuIFVMXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHtoaXN0b3J5U2l6ZX1gKS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGVBY3RpdmVUaWVyJykgXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHtoaXN0b3J5U2l6ZX0gLm1vYmlsZUFjdGl2ZUNvbGApLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZUNvbCcpXG4gICAgICAgICAgICAgICAgLy8gb3BlbiAgcHJldmlvdXMgKGluIGhpc3RvcnkpXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHtjdXJJbmRleH1gKS5jbGFzc0xpc3QuYWRkKCdtb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke2N1ckluZGV4fSAubW9iaWxlQWN0aXZlQ29sYCkuY2xhc3NMaXN0LmFkZCgnbW9iaWxlQWN0aXZlQ29sJylcbiAgICAgICAgICAgICAgICBtb2JpbGVIZWFkaW5nLmlubmVyVGV4dCA9IHByZXZQbGFjZS50eHRcbiAgICAgICAgICAgICAgICBoaXN0b3J5QXJyLmxlbmd0aCAgPSBoaXN0b3J5U2l6ZSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKGhpc3RvcnlTaXplID09IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaXN0b3J5IGlzIGJhY2sgdG8gZGVmYXVsdCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtZWdhVGllcnMuY2xhc3NMaXN0LmFkZCgnbW9iaWxlSGlkZScpXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUFjdGl2ZVRpZXInKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pIFxuXG5cblxuXG5cblxuXG4gICAgICAgICAgICBcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gb3BlbiBhY3RpdmUgdGllciBmb3IgbW9iaWxlXG4gICAgICAgIGNvbnN0IHNldE1vYmlsZVRpZXIgPSBmdW5jdGlvbih0aWVyLCBwb3MsIGhpc3RvcnlUZXh0KVxuICAgICAgICAgICAgeyAgIFxuICAgICAgICAgICAgY29uc3QgY3VycmVudEFjdGl2ZSAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubW9iaWxlQWN0aXZlVGllcicpXG4gICAgICAgICAgICBjb25zdCBoaWdoZXN0VGllckVsICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50aWVyLSR7dGllcn1gKVxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29sSW5UaWVyICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAudGllci0ke3RpZXJ9IC5tb2JpbGVBY3RpdmVDb2xgKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyB0aWVyIGxvd2VyIHRoYW4gMFxuICAgICAgICAgICAgaWYodGllciA+PTAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoaWdoZXN0VGllck9wZW49IHRpZXI7XG4gICAgICAgICAgICAgICAgY3VycmVudEFjdGl2ZS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjbG9zZSBhbnkgYWN0aXZlIGNvbHNcbiAgICAgICAgICAgIGlmKGFjdGl2ZUNvbEluVGllciAhPSB1bmRlZmluZWQgJiYgYWN0aXZlQ29sSW5UaWVyLmxlbmd0aD4wKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGFjdGl2ZUNvbEluVGllci5sZW5ndGg7aSsrKVxuICAgICAgICAgICAgICAgICAgICB7YWN0aXZlQ29sSW5UaWVyW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZUNvbCcpfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyBpZiB0aWVyIGlzIGJpZ2dlciB0aGFuIHplcm8gc2hvdyBtZWdhY29udGVudCAod2hlcmUgdGllcnMvY29sdW1ucyBhcmUpXG4gICAgICAgICAgICAvLyBhbmQgaGlkZSB0aGUgdHJpZ2dlciBidXR0b25zXG4gICAgICAgICAgICBpZih0aWVyID4wIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGlnaGVzdFRpZXJPcGVuPSB0aWVyO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgICAgICAgICBtZWdhVGllcnMuY2xhc3NMaXN0LnJlbW92ZSgnbW9iaWxlSGlkZScpO1xuICAgICAgICAgICAgICAgIGhpc3RvcnlBcnJbdGllci0xXSA9IHt0eHQ6IGhpc3RvcnlUZXh0LCBjb2xQb3M6cG9zfTtcblxuICAgICAgICAgICAgICAgIGlmKHBvcyAhPSBcImZyb21CYWNrQnV0dG9uXCIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHt0aWVyfSAucG9zLSR7cG9zfWApLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUFjdGl2ZUNvbCcpXG4gICAgICAgICAgICAgICAgICAgIG1vYmlsZUhlYWRpbmcuaW5uZXJUZXh0ID0gaGlzdG9yeVRleHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRpZXIgPT0gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGlnaGVzdFRpZXJPcGVuPTBcbiAgICAgICAgICAgICAgICB0cmlnZ2Vyc1dyYXAuY2xhc3NMaXN0LmFkZCgnbW9iaWxlQWN0aXZlVGllcicpO1xuICAgICAgICAgICAgICAgIG1lZ2FUaWVycy5jbGFzc0xpc3QuYWRkKCdtb2JpbGVIaWRlJyk7ICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhpZ2hlc3RUaWVyRWwuY2xhc3NMaXN0LmFkZCgnbW9iaWxlQWN0aXZlVGllcicpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBvcGVuIHRpZXJzL2NvbHVtbiBsb2dpY1xuICAgICAgICBjb25zdCBvcGVuVGllcj0odHJpZ2dlclRpZXIsIHBvc0luVGllciwgZWxDbGlja2VkKT0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBtYXhEZXB0aCAgICAgICAgICAgPSA0XG4gICAgICAgICAgICBjb25zdCB0aGlzVGllciAgICAgICAgICAgPSBwYXJzZUludCh0cmlnZ2VyVGllcilcbiAgICAgICAgICAgIGhpZ2hlc3RUaWVyT3BlbiAgICAgICAgICA9IHRoaXNUaWVyICsgMVxuICAgICAgICAgICAgY29uc3QgbmV4dFRpZXIgICAgICAgICAgID0gXCIudGllci1cIiArIGhpZ2hlc3RUaWVyT3BlblxuICAgICAgICAgICAgY29uc3QgcG9zICAgICAgICAgICAgICAgID0gXCIucG9zLVwiICsgcG9zSW5UaWVyO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBvcyAgICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgJHtuZXh0VGllcn0gLmFjdGl2ZWApXG4gICAgICAgICAgICBjb25zdCBsaW5rT3BlblNhbWVUaWVyICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke3RoaXNUaWVyfSAuaXNPcGVuYClcbiAgICAgICAgICAgIGNvbnN0IGxpbmtPcGVuTmV4dFRpZXIgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50aWVyLSR7dGhpc1RpZXIrMX0gLmlzT3BlbmApXG4gICAgICAgICAgICBjb25zdCB0eHQgICAgICAgICAgICAgICAgPSBlbENsaWNrZWQuaW5uZXJUZXh0O1xuICAgICAgICBcbiAgICAgICAgICAgIC8vIGhpZGUgYW55IG9wZW5lZCBpdGVtcyAtIGluIFNhbWUgdGllclxuICAgICAgICAgICAgaWYoY3VycmVudFBvcyAhPSB1bmRlZmluZWQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIC8vIHNhbWUgdGllciBsaW5rIG5lZWRzIHRvIGJlIGNsZWFyZWRcbiAgICAgICAgICAgICAgICBpZihsaW5rT3BlblNhbWVUaWVyICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge2xpbmtPcGVuU2FtZVRpZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXNPcGVuJyk7fVxuICAgICAgICAgICAgICAgIC8vIG5leHQgdGllciBsaW5rIG5lZWRzIHRvIGJlIGNsZWFyZWRcbiAgICAgICAgICAgICAgICBpZihsaW5rT3Blbk5leHRUaWVyICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge2xpbmtPcGVuTmV4dFRpZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXNPcGVuJyl9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGhpZGUgYW55IGRlZXBlciBjb2x1bW5zICh0aWVycylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gKHRoaXNUaWVyKzEpIDsgaTw9IG1heERlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHtpfWApLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgLy8gb3Blbi9yZS1vcGVuIHNlbGVjdGlvblxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuZXh0VGllcikuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7bmV4dFRpZXJ9ICR7cG9zfWApLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpXG4gICAgICAgICAgICBlbENsaWNrZWQuY2xhc3NMaXN0LmFkZCgnaXNPcGVuJylcbiAgICAgICAgICAgIHNldE1vYmlsZVRpZXIoaGlnaGVzdFRpZXJPcGVuLCBwb3NJblRpZXIsIHR4dCk7IFxuICAgICAgICAgICAgfVxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBFVkVOVFMgKi8gXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBvcGVuaW5nIG1lZ2FtZW51IGxvZ2ljXG4gICAgICAgIGZvcihsZXQgaT0wO2k8dHJpZ2dlcnMubGVuZ3RoO2krKylcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIHRyaWdnZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAvLyBkZXNrdG9wIGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDEyMDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoXCJhY3RpdmVcIikgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZ2FDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QucmVtb3ZlKCdtZWdhbWVudVRyaWdnZXJlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RUaWVyT3BlbiA9IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsQWN0aXZlcyAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lZ2FfX2NvbnRlbnQgLmFjdGl2ZScpICAgICAgICAgICAgICAvLyBzZWxlY3QgYWxsIG9wZW4gY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvcGVuQXJyb3dzICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYV9fY29udGVudCAuaXNPcGVuJykgICAgICAgICAgICAgIC8vIG15IGxpbmtzIHRoYXQgcG9pbnQgdG8gb3BlbiBjb2x1bW5zICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhX190cmlnZ2VycyA+IGxpIGEuYWN0aXZlJykgICAgICAgICAgLy8gc2VsZWN0IG9wZW4gbWFpbiB0YWJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQuZGF0YXNldC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBieSBoaWRpbmcgYWxsIHRpZXJzIDAgLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8IGFsbEFjdGl2ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FsbEFjdGl2ZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG1haW4gbWVudSB0b29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3VycmVudFNlbGVjdGVkICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgbGlua3MgdG8gcG9pbnQgdG8gb3BlbmVkIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTwgYWxsb3BlbkFycm93cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbGxvcGVuQXJyb3dzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2lzT3BlbicpfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWdobGlnaHQgY2xpY2tlZCB0aWVyIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVnYUNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gbWVnYSBtZW51XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QuYWRkKCdtZWdhbWVudVRyaWdnZXJlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC5tZWdhX19jb250ZW50IC50aWVyLTEgLnBvcy0ke3RhcmdldH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKSAvLyBvcGVuIHRpZXItMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBtb2JpbGUgbG9naWNcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tb2JpbGVIZWFkaW5nLmlubmVyVGV4dCA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGUudGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9zID0gZWwuZGF0YXNldC50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2JpbGVUaWVyKDEsIHRhcmdldFBvcyAsIGVsLmlubmVyVGV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtb2JpbGUgdGhlcmUgaXMgbm8gdG9nZ2xlLCB0aGlzIGJ1dHRvbiBhbHdheXMgb3BlbnMgdGhlIG5leHQgdGllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBzdWJtZW51IGNvbHVtbnMgbG9naWNcbiAgICAgICAgZm9yKGxldCBpPTA7aTxjb2xUcmlnZ2Vycy5sZW5ndGg7aSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgY29sVHJpZ2dlcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJyxmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGhpc1RpZXIgID0gZS50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuZGF0YXNldC50aWVyOyAgLy8gYmFja3dhcmRzOiBzdGFydGluZyBmcm9tIGxpbmsgY2xpY2tlZCB0byA8IGxpIDwgdWwgPCB0aWVyLSNcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NJblRhcmdldFRpZXIgPSBlLnRhcmdldC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbENsaWNrZWQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICBpZih3aW5kb3cuaW5uZXJXaWR0aCA+IDEyMDApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaG92ZXJUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtvcGVuVGllciggdGhpc1RpZXIsIHBvc0luVGFyZ2V0VGllciwgZWxDbGlja2VkKSB9LCA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkgXG5cbiAgICAgICAgICAgIC8vIGNhbmNlbCB0aW1lciBuZWVkZWQgXG4gICAgICAgICAgICBjb2xUcmlnZ2Vyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7ICAgY2xlYXJUaW1lb3V0KGhvdmVyVGltZXIpOyB9KSAgIFxuXG4gICAgICAgICAgICAvLyBjbGljayBpcyBvayBmb3IgbW9iaWxlXG4gICAgICAgICAgICBjb2xUcmlnZ2Vyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNUaWVyICA9IGUudGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmRhdGFzZXQudGllcjsgIC8vIGJhY2t3YXJkczogc3RhcnRpbmcgZnJvbSBsaW5rIGNsaWNrZWQgdG8gPCBsaSA8IHVsIDwgdGllci0jXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zSW5UYXJnZXRUaWVyID0gZS50YXJnZXQuZGF0YXNldC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxDbGlja2VkID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgb3BlblRpZXIoIHRoaXNUaWVyLCBwb3NJblRhcmdldFRpZXIsIGVsQ2xpY2tlZClcbiAgICAgICAgICAgICAgICB9KSAgIFxuICAgICAgICAgICAgfVxuICBcbiAgICAgICAgfVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyB3aW5kb3cuYmFzZURvY3VtZW50YXRpb25VcmwgPSAnL3NlYXJjaC1yZXN1bHRzP2ZpbHRlcnM9MTExJztcbiAgICAvLyB3aW5kb3cuYmFzZVByb2R1Y3RVcmwgPSAnL3NlYXJjaC1yZXN1bHRzP2ZpbHRlcnM9MjIyJztcbiAgICAvLyB3aW5kb3cuYmFzZVRlY2hub2xvZ3lVcmwgPSAnL3NlYXJjaC1yZXN1bHRzP2ZpbHRlcnM9MzMzJztcbiAgICAvLyB3aW5kb3cuYmFzZVNlYXJjaFVybCA9ICcvc2VhcmNoLXJlc3VsdHMnOyBcblxufVxuXG5leHBvcnQgZGVmYXVsdCBNZWdhbWVudTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnXG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IE1lbnVUb3BCYXIgPSAoKSA9PiB7XG4gICAgbGV0IHRvcEJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AtYmFyJyk7XG5cbiAgICBsZXQgTWVudVRvcEJhckNvbnN0cnVjdG9yID0gKCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCd0b3AtYmFyJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlTmF2OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc09wZW46IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc09wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgY2xvc2luZyBzdWJuYXYgb24gb3V0c2lkZSBjbGlja1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm91dHNpZGVDbGljayk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5vdXRzaWRlQ2xpY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZXROYXYoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVOYXYgPSBpZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG91dHNpZGVDbGljayhlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcG5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AtYmFyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdG9wbmF2LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5hdiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvL2dpdmUgZWFjaCBuYXYgaXRlbSBhbiBpZCBpZiBpdCBoYXMgYSBzdWJuYXZcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wLWJhcl9faXRlbScpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnF1ZXJ5U2VsZWN0b3IoJy50b3AtYmFyX19zdWJuYXYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5kYXRhc2V0LmlkID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGNsaWNrIGV2ZW50cyBmcm9tIG5hdiBpdGVtc1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignc2V0TmF2JywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TmF2KGlkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyByZWNpZXZlIG9wZW4gc3RhdGUgZnJvbSBjaGlsZHJlbiB0byBoYW5kbGUgY2xvc2luZyBvbiBvdXRzaWRlIGNsaWNrXG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdvcGVuU3RhdGUnLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RvcC1iYXItaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2FjdGl2ZU5hdiddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2SWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaGFzU3ViTmF2OiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGFjdGl2ZU5hdjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSAoKHRoaXMuYWN0aXZlTmF2ID09IHRoaXMubmF2SWQpICYmIHRoaXMubmF2SWQgIT09IG51bGwpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIG9wZW4gc3RhdGUgdG8gcGFyZW50IHRvIGhhbmRsZSBjbG9zaW5nIG9uIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ29wZW5TdGF0ZScsIHRoaXMuaXNBY3RpdmUgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgLy8gZW1pdCBjbGljayBldmVudCB0byBwYXJlbnRcbiAgICAgICAgICAgICAgICBoYW5kbGVDbGljayhlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGFjdGl2ZSBzdGF0ZSBvbmx5IGlmIGl0ZW0gaGFzIHN1Ym5hdlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5oYXNTdWJOYXYgPyAhdGhpcy5pc0FjdGl2ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0TmF2JywgdGhpcy5uYXZJZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vIHdhaXQgdGlsbCBuZXh0IHJlbmRlciB0byBnZXQgaWQgdGhhdCdzIGFkZGVkIGJ5IHBhcmVudFxuICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZJZCA9IHRoaXMuJGVsLmRhdGFzZXQuaWQgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNTdWJOYXYgPSB0aGlzLiRlbC5kYXRhc2V0LmlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdsYW5nLXNlbGVjdG9yJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGFuZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWxsTGFuZ3M6IFtdLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGFuZy1zZWxlY3Rvci1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnYWxsTGFuZ3MnLCdhY3RpdmVMYW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gd2F0Y2g6IHtcbiAgICAgICAgICAgIC8vICAgICBhY3RpdmVMYW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlTGFuZyA9PT0gdGhpcy5sYW5nID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgc2VsZWN0TGFuZyhlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYWN0aXZlTGFuZyA9IHRoaXMubGFuZztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRCdXMuJGVtaXQoJ3NldC1sYW5nJywgdGhpcy5sYW5nKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmcgPSBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5sYW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFuZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYHNlbGVjdGVkTGFuZ3VhZ2U9JHtsYW5nfTsgcGF0aD0vOyBtYXgtYWdlPTMxNTM2MDAwO2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmxhbmcgPSB0aGlzLiRlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmFjdGl2ZUxhbmcgPT0gdGhpcy5sYW5nID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnRvcC1iYXJgLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLnRvcC1iYXJgLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodG9wQmFyKSB7XG4gICAgICAgIE1lbnVUb3BCYXJDb25zdHJ1Y3RvcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVudVRvcEJhcjsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1idXR0b24tc2V0Lmhicyc7XG5cblZ1ZS5jb21wb25lbnQoXG4gICAgXCJtcy1idXR0b24tc2V0XCIsXG4gICAge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgYnV0dG9uczogQXJyYXksXG4gICAgICAgICAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LCBcbiAgICAgICAgICAgIG92YWxCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSwgXG4gICAgICAgICAgICBvbkNoYW5nZTogRnVuY3Rpb24sXG4gICAgICAgICAgICBkaXNhYmxlZE1lc3NhZ2U6IFN0cmluZyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogW10gfSxcbiAgICAgICAgICAgIG9uVHJpZ2dlckV2ZW50OiBGdW5jdGlvblxuICAgICAgICB9LFxuICAgICAgICBkYXRhKCl7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlczogdGhpcy5idXR0b25zICYmIHRoaXMuYnV0dG9ucy5tYXAodiA9PiAhdi5kaXNhYmxlZCAmJiB2LnZhbHVlICkubWFwKHYgPT4gdGhpcy5kZWZhdWx0VmFsdWUuaW5kZXhPZih2KSA+PSAwKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaGFuZGxlcih2KXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAgdi5yZWR1Y2UoKG8sIGUsIGkpID0+IHsgaWYgKCFlKSB7IHJldHVybiBvOyB9IHJldHVybiBbLi4ubywgY3R4LmJ1dHRvbnNbaV1dOyB9ICwgW10pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlICAmJiB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXB1dGVkOiAge1xuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICB9LFxuICAgICAgICBiZWZvcmVVbm1vdW50KCkge1xuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBjaGFuZ2UoaSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gIHRoaXMudmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uVHJpZ2dlckV2ZW50KHsgdmFsdWU6IHRoaXMuYnV0dG9uc1tpXSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXG4gICAgICAgIHRlbXBsYXRlXG4gICAgfVxuKTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgdGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLWZyYW1lLmhicyc7XG5pbXBvcnQgc2VwYXJhdG9yVGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLWZyYW1lLXNlcGFyYXRvci5oYnMnO1xuaW1wb3J0IHF1ZXN0aW9uVGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLWZyYW1lLXF1ZXN0aW9uLmhicyc7XG5cblZ1ZS5jb21wb25lbnQoXG4gICAgXCJtcy1mcmFtZVwiLFxuICAgIHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGlzTGF0ZXJhbEJhcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICAgICAgY2xvc2VCdXR0b25MYWJlbDogU3RyaW5nLFxuICAgICAgICAgICAgYnV0dG9uTGFiZWw6IFN0cmluZyxcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkxhYmVsOiBTdHJpbmcsXG4gICAgICAgICAgICBkaXNhYmxlQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB0aXRsZTogU3RyaW5nLFxuICAgICAgICAgICAgb25DYW5jZWw6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgb25DbGlja0J1dHRvbjogRnVuY3Rpb24sXG4gICAgICAgICAgICBoYXNQYXJhbWV0ZXJzQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgICAgICAgICBjb250YWN0QnV0dG9uOiBPYmplY3QsXG4gICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmcsXG4gICAgICAgICAgICBub3RpY2U6IFN0cmluZyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpc09wZW46IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgaXNPcGVuKHYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lQ2xhc3MgPSAnbXMtZnJhbWVfb3BlbmVkLWxhdGVyYWwtYmFyJztcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllck5hbWVDbGFzcyA9ICdtcy1mcmFtZV9tb2JpbGUtbGF5ZXInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG5cbiAgICAgICAgICAgICAgICBpZih2KSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZChuYW1lQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBsYXllci5jbGFzc0xpc3QuYWRkKGxheWVyTmFtZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChsYXllcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsYXllck5hbWVDbGFzc31gKTtcblxuICAgICAgICAgICAgICAgICAgICBsYXllciAmJiBib2R5LnJlbW92ZUNoaWxkKGxheWVyKTtcbiAgICAgICAgICAgICAgICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKG5hbWVDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb21wdXRlZDogIHtcbiAgICAgICAgICAgIGhhc0J1dHRvbigpe1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYnV0dG9uTGFiZWwpICYmICFCb29sZWFuKHRoaXMubm90aWNlKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vYmlsZUJ1dHRvbkxhYmVsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlQnV0dG9uTGFiZWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzQ29udGFjdEJ1dHRvbigpe1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29udGFjdEJ1dHRvbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzQnV0dG9ucygpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0J1dHRvbiB8fCAgdGhpcy5oYXNDb250YWN0QnV0dG9uO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgfSxcbiAgICAgICAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgY2xpY2tCdXR0b24oKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xpY2tCdXR0b24gJiYgdGhpcy5vbkNsaWNrQnV0dG9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3Blbigpe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbCgpe1xuICAgICAgICAgICAgICAgIHRoaXMub25DYW5jZWwgJiYgdGhpcy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcbiAgICAgICAgdGVtcGxhdGVcbiAgICB9XG4pO1xuXG5WdWUuY29tcG9uZW50KFxuICAgIFwibXMtZnJhbWUtc2VwYXJhdG9yXCIsXG4gICAge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdGl0bGU6IFN0cmluZyxcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGU6IHNlcGFyYXRvclRlbXBsYXRlXG4gICAgfVxuKTtcblxuVnVlLmNvbXBvbmVudChcbiAgICBcIm1zLWZyYW1lLXF1ZXN0aW9uXCIsXG4gICAge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaW5kZXg6IE51bWJlcixcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiB7fSB9LFxuICAgICAgICAgICAgdmFsdWU6IE9iamVjdCxcbiAgICAgICAgICAgIHNlbGVjdGVkVW5pdDogU3RyaW5nLFxuICAgICAgICAgICAgb25UcmlnZ2VyRXZlbnQ6IEZ1bmN0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGEoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgIHNob3dUaXRsZSgpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYnV0dG9uICYmIHRoaXMuaW5kZXggPiAwICYmIHRoaXMub3B0aW9ucy5xdWVzdGlvbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkcm9wZG93bk9wdGlvbnMoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRyb3Bkb3duO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0KCl7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5vcHRpb25zLmlucHV0O1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzWzBdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGl0bGU6IGlucHV0LmxhYmVsLCBwbGFjZWhvbGRlcjogaW5wdXQucGxhY2Vob2xkZXIgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWVzKCl7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5idXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhdGhpcy5kZWZhdWx0VmFsdWUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5kZWZhdWx0VmFsdWUudmFsdWUgPT09ICdvYmplY3QnID8gdGhpcy5kZWZhdWx0VmFsdWUudmFsdWUgOiBbdGhpcy5kZWZhdWx0VmFsdWUudmFsdWVdO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlIHx8ICF0aGlzLmRlZmF1bHRWYWx1ZS5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRVbml0ICYmIHRoaXMub3B0aW9ucy5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLnN3aXRjaGVyID0geyB2YWx1ZTogdGhpcy5zZWxlY3RlZFVuaXQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZS5pbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXkoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwaVF1ZXJ5LmpvaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgb25DaGFuZ2Uodil7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBpbmRleCwgc3RlcElkOiBpZCwgYXBpUXVlcnksIGZpbHRlck5hbWU6bGFiZWwgPSAnJyB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHYubWFwKG8gPT4gby52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdGljZSA9ICh2LmZpbmQobyA9PiBCb29sZWFuKG8uc2VsZWN0ZWRMYWJlbCkpIHx8IHt9KS5zZWxlY3RlZExhYmVsIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeU5hbWUgPSBhcGlRdWVyeSAmJiBhcGlRdWVyeVswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB7IFtxdWVyeU5hbWVdOiB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gdmFsdWUubGVuZ3RoID09PSAwID8gbnVsbCA6IHsgaW5kZXgsIGlkLCB2YWx1ZSwgcXVlcnksIG5vdGljZSwgbGFiZWwgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlucHV0OiBpbnB1dFZhbHVlLCBkcm9wZG93biwgc3dpdGNoZXIgfSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0lucHV0ID0gQm9vbGVhbih0aGlzLm9wdGlvbnMuaW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlucHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlucHV0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiB2LFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uOiBzd2l0Y2hlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIH07IFxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5TmFtZSA9IGFwaVF1ZXJ5ICYmIGFwaVF1ZXJ5WzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeSA9IHsgW3F1ZXJ5TmFtZV06IGlucHV0LnZhbHVlIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwaVF1ZXJ5ICYmIGFwaVF1ZXJ5Lmxlbmd0aCA+IDEgJiYgKHN3aXRjaGVyIHx8IGRyb3Bkb3duKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdE5hbWUgPSBhcGlRdWVyeVthcGlRdWVyeS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5W3VuaXROYW1lXSA9IGRyb3Bkb3duID8gZHJvcGRvd24udmFsdWUgOiBzd2l0Y2hlci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBpbnB1dC52YWx1ZSA9PT0gJycgfHwgaW5wdXQudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBpbnB1dC52YWx1ZSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSAhaXNFbXB0eSA/IHsgLi4uaW5wdXQsIGluZGV4LCBpZCwgcXVlcnkgfSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBpbnB1dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25UcmlnZ2VyQW5zd2VyRXZlbnQoZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25UcmlnZ2VyRXZlbnQoeyAuLi5kYXRhLCBxdWVzdGlvbkluZGV4OiB0aGlzLmluZGV4IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZTogcXVlc3Rpb25UZW1wbGF0ZVxuICAgIH1cbik7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1pbnB1dC1ib3guaGJzJztcblxuVnVlLmNvbXBvbmVudChcbiAgICBcIm1zLWlucHV0LWJveFwiLFxuICAgIHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogU3RyaW5nLFxuICAgICAgICAgICAgc3dpdGNoZXI6IE9iamVjdCxcbiAgICAgICAgICAgIGlucHV0OiBPYmplY3QsXG4gICAgICAgICAgICBkcm9wZG93bjogT2JqZWN0LFxuICAgICAgICAgICAgZHJvcGRvd25PcHRpb25zOiBBcnJheSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBGdW5jdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IHt9IH0sXG4gICAgICAgICAgICBvblRyaWdnZXJFdmVudDogRnVuY3Rpb25cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2hlclZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkcm9wZG93blZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICBzd2l0Y2hlckZpZWxkOiB0aGlzLnN3aXRjaGVyLFxuICAgICAgICAgICAgICAgIGlucHV0RmllbGQ6IHRoaXMuaW5wdXQsXG4gICAgICAgICAgICAgICAgY2hhbmdpbmdNZW1vOiB0aGlzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICBpbnB1dEVycm9yTWVzc2FnZTogbnVsbCwgXG4gICAgICAgICAgICAgICAgdGFnZ2luZ0lucHV0VmFsdWU6ICcnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlLnN3aXRjaGVyKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5zd2l0Y2hlclZhbHVlID0gdGhpcy5zd2l0Y2hlci5yaWdodC52YWx1ZSA9PT0gdGhpcy5kZWZhdWx0VmFsdWUuc3dpdGNoZXIudmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZS5kcm9wZG93bikge1xuICAgICAgICAgICAgICAgIGRhdGEuZHJvcGRvd25WYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlLmRyb3Bkb3duLnZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUuaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmlucHV0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZS5pbnB1dC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhLnRhZ2dpbmdJbnB1dFZhbHVlID0gZGF0YS5pbnB1dFZhbHVlO1xuXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgIHN3aXRjaGVyVmFsdWU6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHYsIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN3aXRjaGVyRmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB2ID8gdGhpcy5zd2l0Y2hlci5yaWdodCA6IHRoaXMuc3dpdGNoZXIubGVmdDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5naW5nTWVtbyA9ICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNoYW5naW5nTWVtbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGVyOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChhICE9PSB1bmRlZmluZWQgfHwgdGhpcy5kcm9wZG93blZhbHVlID09PSAnJykgJiYgb3B0aW9uICYmIHRoaXMuZHJvcGRvd25PcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcm9wZG93bk9wdGlvbnNbb3B0aW9uLnZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duT3B0aW9uID0gdGhpcy5kcm9wZG93bk9wdGlvbnNbb3B0aW9uLnZhbHVlXVswXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duVmFsdWUgPSBkcm9wZG93bk9wdGlvbi52YWx1ZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHJvcGRvd25WYWx1ZToge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIodikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJvcGRvd25GaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2luZ01lbW8gPSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jaGFuZ2luZ01lbW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bjogdGhpcy5kcm9wZG93bkZpZWxkLm9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IHYpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dFZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcih2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG5vTmVnYXRpdmUsIGRlY2ltYWxzID0gMiB9ID0gdGhpcy5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhc2hlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludHMgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHYucmVwbGFjZSgvW14wLTkuXXxcXC4vZywgZnVuY3Rpb24oJDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCFub05lZ2F0aXZlICYmICQwID09PSAnLScgJiYgdi5pbmRleE9mKCctJykgPT09IDAgJiYgIShkYXNoZXMrKykpIHx8IChkZWNpbWFscyA+IDAgJiYgJDAgPT09ICcuJyAmJiAhKHBvaW50cysrKSkgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHAgPSB2YWx1ZS5pbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdmFsdWUubGVuZ3RoIC0gZHAgLSAxIC0gZGVjaW1hbHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gZGlmZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEVycm9yTWVzc2FnZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXQudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2Vycm9yLCBtaW4gPSBudWxsLCBtYXh9ID0gdGhpcy5pbnB1dC52YWxpZGF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1pbiAhPT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgfHwgKG1heCAmJiBtYXggPCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEVycm9yTWVzc2FnZSA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2luZ01lbW8gPSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jaGFuZ2luZ01lbW8sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogdmFsdWUgPT09ICcnID8gJycgOiBwYXJzZUZsb2F0KHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoYW5naW5nTWVtbyh2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdnaW5nVmFsdWUoKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9uVHJpZ2dlckV2ZW50KHsgdmFsdWU6IHRoaXMudGFnZ2luZ1ZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb21wdXRlZDogIHtcbiAgICAgICAgICAgIHRhZ2dpbmdWYWx1ZSgpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhZ2dpbmdJbnB1dFZhbHVlICsgKHRoaXMub3B0aW9uID8gJyAnICsgKHRoaXMub3B0aW9uLmxhYmVsIHx8IHRoaXMub3B0aW9uLnZhbHVlKSA6ICcnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkcm9wZG93bkZpZWxkKCl7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuZHJvcGRvd25PcHRpb25zKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKHRoaXMuc3dpdGNoZXJWYWx1ZSA/IHRoaXMuc3dpdGNoZXIucmlnaHQgOiB0aGlzLnN3aXRjaGVyLmxlZnQpIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb3B0aW9uczogdGhpcy5kcm9wZG93bk9wdGlvbnNbb3B0aW9uLnZhbHVlXSB8fCBbXSB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0VGl0bGUoKXtcbiAgICAgICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb246IE9iamVjdFxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGA8c3Bhbj4ke2N0eC5pbnB1dEZpZWxkLnRpdGxlfTwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbigpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duRmllbGQgPyB0aGlzLmNoYW5naW5nTWVtby5kcm9wZG93biA6IHRoaXMuY2hhbmdpbmdNZW1vLnN3aXRjaGVyO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzQ2hhbmdlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGJlZm9yZVVubW91bnQoKSB7XG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaGFzQ2hhbmdlKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSAmJiB0aGlzLm9uQ2hhbmdlKHRoaXMuY2hhbmdpbmdNZW1vKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkJsdXJJbnB1dCgpe1xuICAgICAgICAgICAgICAgIHRoaXMudGFnZ2luZ0lucHV0VmFsdWUgPSB0aGlzLmlucHV0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFxuICAgICAgICB0ZW1wbGF0ZVxuICAgIH1cbik7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1zdGVwLWJhci5oYnMnO1xuXG5WdWUuY29tcG9uZW50KFxuICAgIFwibXMtc3RlcC1iYXJcIixcbiAgICB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBzdGVwczogQXJyYXksIFxuICAgICAgICAgICAgb25DaGFuZ2U6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgY3VycmVudDogTnVtYmVyLFxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IFtdIH0sXG4gICAgICAgICAgICBvZmZzZXQ6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiA1MCB9LFxuICAgICAgICB9LFxuICAgICAgICBkYXRhKCl7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvb3RDbGFzc2VzOiAge1xuICAgICAgICAgICAgICAgICAgICAnbm9DZW50ZXJBbGlnbicgOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblJlc2l6ZUZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzTW91c2VEb3duOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICBjdXJyZW50OiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RlcHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29tcHV0ZWQ6ICB7XG4gICAgICAgICAgICBnZXRTdGVwcygpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ21zLXN0ZXAtYmFyX2l0ZW0nIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtcy1zdGVwLWJhcl9pdGVtLS1zZWxlY3RlZCcgOiBpID09PSBjdHguY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdtcy1zdGVwLWJhcl9pdGVtLS1jaGVja2VkJyA6IGkgPD0gY3R4Lm1heFN0ZXBcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLnMsIHNlbGVjdGVkVmFsdWU6IGN0eC5zZWxlY3RlZFZhbHVlc1tpXSwgY2xhc3NlcyB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4U3RlcCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRWYWx1ZXMgJiYgdGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGgpIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuJHJlZnMubGlzdC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5zdGFydERyYWcpO1xuICAgICAgICAgICAgdGhpcy4kcmVmcy5saXN0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuc3RhcnREcmFnKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZW5kRHJhZyk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuZW5kRHJhZyk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW92ZURyYWcpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5tb3ZlRHJhZyk7XG4gICAgICAgIH0sXG4gICAgICAgIGJlZm9yZVVubW91bnQoKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuJHJlZnMubGlzdC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5zdGFydERyYWcpO1xuICAgICAgICAgICAgdGhpcy4kcmVmcy5saXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuc3RhcnREcmFnKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZW5kRHJhZyk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuZW5kRHJhZyk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW92ZURyYWcpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5tb3ZlRHJhZyk7XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZWQoKXtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uUmVzaXplRmxhZykge1xuICAgICAgICAgICAgICAgIHRoaXMub25SZXNpemUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBvblJlc2l6ZSgpe1xuICAgICAgICAgICAgICAgIGxldCBkaWZmID0gMDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gdGhpcy4kcmVmcy5saXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGxpc3QgJiYgbGlzdC5jaGlsZE5vZGVzKSB8fCBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gbGFzdCA/IChsYXN0Lm9mZnNldFdpZHRoICsgbGFzdC5vZmZzZXRMZWZ0ICsgdGhpcy5vZmZzZXQpIDogMDtcblxuICAgICAgICAgICAgICAgIGlmICh3IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxkaWZmID0gIChlbmQgLSB3KSAqIC0gMTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtdyA9IHcgLyAyO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNoaWxkcmVuW3RoaXMuY3VycmVudF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRW5kID0gc2VsZWN0ZWQgJiYgc2VsZWN0ZWQub2Zmc2V0V2lkdGggKyBzZWxlY3RlZC5vZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiBtdyA8IHNlbGVjdGVkRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gKHNlbGVjdGVkRW5kIC0gbXcpICogLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobGRpZmYgPiBkaWZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gbGRpZmYgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgICAgICAgbGlzdC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke2RpZmZ9cHgpYDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RDbGFzc2VzID0gIHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5yb290Q2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgICAgJ25vQ2VudGVyQWxpZ24nOiBlbmQgPT09IDAgPyB0cnVlIDogdyA8IGVuZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc1NlbGVjdGVkVmFsdWUoaSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgJiYgdGhpcy5zZWxlY3RlZFZhbHVlc1tpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldChkZWZhdWx0Q3VycmVudCA9IDApe1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgJiYgdGhpcy5vbkNoYW5nZShkZWZhdWx0Q3VycmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DbGlja1N0ZXAoaSl7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiB0aGlzLm1heFN0ZXApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSAmJiB0aGlzLm9uQ2hhbmdlKGkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0RHJhZygpe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZERyYWcoKXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW92ZURyYWcoZSl7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxtID0gdGhpcy4kcmVmcy5saXN0O1xuICAgICAgICAgICAgICAgIGlmICghZWxtIHx8ICF0aGlzLmlzTW91c2VEb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRYID0gZS5jbGllbnRYIHx8IChlLnRvdWNoZXNbMF0gfHwgZS5jaGFuZ2VkVG91Y2hlc1swXSB8fCB7fSkucGFnZVg7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxtLnByZXZpb3VzQ2xpZW50WCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjbGllbnRYIC0gZWxtLnByZXZpb3VzQ2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVGb3VuZCA9IGVsbS5zdHlsZS50cmFuc2Zvcm0ubWF0Y2goL3RyYW5zbGF0ZVhcXCgoLiopcHhcXCkvaSkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBzdHlsZUZvdW5kWzFdID8gcGFyc2VJbnQoc3R5bGVGb3VuZFsxXSkgOiAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZWxtLmNoaWxkTm9kZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBsYXN0ID8gKGxhc3Qub2Zmc2V0V2lkdGggKyBsYXN0Lm9mZnNldExlZnQgKyB0aGlzLm9mZnNldCkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhYID0gKGVuZCAtIHcpICogLTE7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkID0gIDEwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbnggPSB4O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnggPSB4K2FkZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG54ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgMCAmJiBtYXhYIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnggPSB4LWFkZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG54IDwgbWF4WCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gbWF4WDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybVN0eWxlID0gYHRyYW5zbGF0ZVgoJHtueH1weClgO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUZvdW5kWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbG0uc3R5bGUudHJhbnNmb3JtID0gZWxtLnN0eWxlLnRyYW5zZm9ybS5yZXBsYWNlKHN0eWxlRm91bmRbMF0sIHRyYW5zZm9ybVN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5zdHlsZS50cmFuc2Zvcm0gKz0gXHR0cmFuc2Zvcm1TdHlsZSArICc7JyA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbG0ucHJldmlvdXNDbGllbnRYID0gY2xpZW50WDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXG4gICAgICAgIHRlbXBsYXRlXG4gICAgfVxuKTtcbiIsIlxuLypcbiAgICBEZWJvdW5jZSBpcyBhIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCxcbiAgICBhcyBsb25nIGFzIGl0IGNvbnRpbnVlcyBiZSBpbnZva2VkLCB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQuXG4gICAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3IgTiBtaWxsaXNlY29uZHMgKHNldCBpbiB0aGUgJ3dhaXQnIHBhcmFtZXRlcikuIFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0KSB7XG5cdGxldCB0aW1lb3V0O1xuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0Y29uc3QgbGF0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRpbWVvdXQgPSBudWxsO1xuXHRcdFx0ZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHR9O1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG5cdH07XG59O1xuXG4vLyBnZXQgdmFsdWUgb2YgdXJsIHBhcmFtIGJ5IG5hbWVcbmV4cG9ydCBjb25zdCBnZXRVcmxQYXJhbWV0ZXIgPSAoc1BhcmFtKSA9PiB7XG4gICAgdmFyIHNQYWdlVVJMID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSksXG4gICAgICAgIHNVUkxWYXJpYWJsZXMgPSBzUGFnZVVSTC5zcGxpdCgnJicpLFxuICAgICAgICBzUGFyYW1ldGVyTmFtZSxcbiAgICAgICAgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzVVJMVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQYXJhbWV0ZXJOYW1lID0gc1VSTFZhcmlhYmxlc1tpXS5zcGxpdCgnPScpO1xuXG4gICAgICAgIGlmIChzUGFyYW1ldGVyTmFtZVswXSA9PT0gc1BhcmFtKSB7XG4gICAgICAgICAgICByZXR1cm4gc1BhcmFtZXRlck5hbWVbMV0gPT09IHVuZGVmaW5lZCA/IHRydWUgOiBkZWNvZGVVUklDb21wb25lbnQoc1BhcmFtZXRlck5hbWVbMV0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gZ2V0IGNvb2tpZSB2YWx1ZSBieSBuYW1lXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llVmFsdWUoYSkge1xuXHR2YXIgYiA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgnKF58OylcXFxccyonICsgYSArICdcXFxccyo9XFxcXHMqKFteO10rKScpO1xuXHRyZXR1cm4gYiA/IGIucG9wKCkgOiAnJztcbn0iLCIvKiBcbkFsbG93cyBmb3IgaW5saW5lIHRleHQgbGlua3MgdG8gdHJpZ2dlciBzcGVjaWZpZWQgVnVlIG1vZGFsc1xuXG4qL1xuXG5pbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHtmb3JtTW9kYWwsIGV4aXRNb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuVnVlLnVzZShWTW9kYWwpO1xuXG5jb25zdCBpbnN0YW5jZSA9IG5ldyBWdWUoe1xuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgdHJpZ2dlckNvbnRhY3RUb29sdGlwKCkge1xuICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3RvZ2dsZS1jb250YWN0Jyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlckZvcm0oZGF0YSkge1xuICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICBmb3JtTW9kYWwudGVtcGxhdGUoZGF0YS5jb250ZW50KSxcbiAgICAgICAgICAgICAgICBmb3JtTW9kYWwubmFtZShkYXRhLm5hbWUpLCBcbiAgICAgICAgICAgICAgICBmb3JtTW9kYWwub3B0aW9ucyhkYXRhLm9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIGZvcm1Nb2RhbC5ldmVudHMoZGF0YS5kYXRhKVxuICAgICAgICAgICAgKVxuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXJFeGl0KGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgZXhpdE1vZGFsLnRlbXBsYXRlKGRhdGEpLFxuICAgICAgICAgICAgICAgIGV4aXRNb2RhbC5uYW1lLCBcbiAgICAgICAgICAgICAgICBleGl0TW9kYWwub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBleGl0TW9kYWwuZXZlbnRzXG4gICAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlTW9kYWwobmFtZSkge1xuICAgICAgICAgICAgLy8gdGhpcy4kbW9kYWwuaGlkZShuYW1lKTtcbiAgICAgICAgICAgIHRoaXMuJG1vZGFsLmhpZGVBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5jb25zdCB0cmlnZ2VyID0gKCkgPT4geyAgICAgICAgXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBcbiAgICAgICAgaWYgKGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICAgICAgICB2YXIgaHJlZkhhc2ggPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zcGxpdChcIiNcIilbMV07ICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcImxlYXZpbmdTaXRlQ2xpY2tFdmVudEFkZGVkXCIpICYmIGhyZWZIYXNoKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoaHJlZkhhc2ggPT09IFwiY29udGFjdHVzdGlwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS50cmlnZ2VyQ29udGFjdFRvb2x0aXAoKTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubW9kYWxIYXNodGFncykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubW9kYWxIYXNodGFncy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZkhhc2ggPT09IGl0ZW0uaGFzaHRhZ25hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkVXJsID0gZS50YXJnZXQuZGF0YXNldC5kb3dubG9hZFVybCB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZE5hbWUgPSBlLnRhcmdldC5kYXRhc2V0LmRvd25sb2FkTmFtZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFByb2R1Y3RzID0gZS50YXJnZXQuZGF0YXNldC5xdW90ZVByb2R1Y3RzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RDYXRlZ29yeSA9IGUudGFyZ2V0LmRhdGFzZXQucHJvZHVjdENhdGVnb3J5IHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdGVyYXR1cmVPcmRlcmVkID0gZS50YXJnZXQuZGF0YXNldC5saXRlcmF0dXJlT3JkZXJlZCB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZS50YXJnZXQuZGF0YXNldC5jb250ZW50IHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnRzID0gZS50YXJnZXQuZGF0YXNldC5jb21tZW50cyB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1F1ZXJ5UGFyYW1zID0gbG9jYXRpb24uc2VhcmNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1F1ZXJ5UGFyYW1zICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvd25sb2FkVXJsICYmIGRvd25sb2FkVXJsICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBcIiZcIiArIGV4aXN0aW5nUXVlcnlQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1F1ZXJ5UGFyYW1zID0gZXhpc3RpbmdRdWVyeVBhcmFtcy5yZXBsYWNlKFwiJiZcIixcIiZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdRdWVyeVBhcmFtcy5zdGFydHNXaXRoKFwiP1wiKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyA9IGV4aXN0aW5nUXVlcnlQYXJhbXMuc2xpY2UoMSk7IC8vIHJlbW92ZSB0aGUgcXVlc3Rpb24gbWFya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udXJsLmluZGV4T2YoXCI/XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1F1ZXJ5UGFyYW1zID0gXCImXCIgKyBleGlzdGluZ1F1ZXJ5UGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBleGlzdGluZ1F1ZXJ5UGFyYW1zLnJlcGxhY2UoXCImJlwiLFwiJlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmdldEZpcnN0VG91Y2hDb29raWVzKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgIGZ1bmN0aW9uIGB3aW5kb3cuZ2V0Rmlyc3RUb3VjaENvb2tpZXNgIHdpbGwgb25seSBiZSBhdmFpbGFibGUgaWYgdGhlIHVzZXIgYWNjZXB0ZWQgY29va2llcy4gVGhpcyBzY3JpcHQgaXMgaW4gdGhlIEJBQ0tFTkQgQ09ERSBPTkxZLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgaXMgaW4gdGhlIGJhY2tlbmQgcHJvamVjdCBvbmx5IGJlY2F1c2UgaXQncyBjb29raWUgY29kZSBhbmQgaGFzIHRvIGJlIGRpc2FibGVkIGJ5IGFuIG9wdGFub24tY2F0ZWdvcnkgZnJvbSBPbmVUcnVzdCBpZiB0aGUgdXNlciBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgYWNjZXB0IGNvb2tpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBGVENvb2tpZXMgPSB3aW5kb3cuZ2V0Rmlyc3RUb3VjaENvb2tpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IExUQ29va2llcyA9IHdpbmRvdy5nZXRMYXN0VG91Y2hDb29raWVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmFtZVByb3BlcnR5KG9iamVjdCwgb2xkTmFtZSwgbmV3TmFtZSkgeyAvLyAubGVuZ3RoIG9mIGZ1bmN0aW9uIGlzIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGROYW1lID09PSBuZXdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkob2xkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RbbmV3TmFtZV0gPSBvYmplY3Rbb2xkTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtvbGROYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoRlRDb29raWVzLCAndXRtX2NhbXBhaWduX0ZUJywgJ1VUTV9DYW1wYWlnbl9GVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShGVENvb2tpZXMsICd1dG1fY29udGVudF9GVCcsICdVVE1fQ29udGVudF9GVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShGVENvb2tpZXMsICd1dG1fbWVkaXVtX0ZUJywgJ1VUTV9NZWRpdW1fRlQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoRlRDb29raWVzLCAndXRtX3NvdXJjZV9GVCcsICdVVE1fU291cmNlX0ZUJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KEZUQ29va2llcywgJ3V0bV9jYW1wYWlnbl9JRF9GVCcsICdVVE1fQ2FtcGFpZ25fSURfRlQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KExUQ29va2llcywgJ3V0bV9jYW1wYWlnbl9MVCcsICdVVE1fQ2FtcGFpZ25fTFQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoTFRDb29raWVzLCAndXRtX2NvbnRlbnRfTFQnLCAnVVRNX0NvbnRlbnRfTFQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoTFRDb29raWVzLCAndXRtX21lZGl1bV9MVCcsICdVVE1fTWVkaXVtX0xUJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KExUQ29va2llcywgJ3V0bV9zb3VyY2VfTFQnLCAnVVRNX1NvdXJjZV9MVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShMVENvb2tpZXMsICd1dG1fY2FtcGFpZ25fSURfTFQnLCAnVVRNX0NhbXBhaWduX0lEX0xUJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvb2tpZVF1ZXJ5U3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ0S2V5cyA9IE9iamVjdC5rZXlzKEZUQ29va2llcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsdEtleXMgPSBPYmplY3Qua2V5cyhMVENvb2tpZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZVF1ZXJ5U3RyaW5nID0gZnRLZXlzLmZpbHRlcih4ID0+IHggIT0gXCJIYXNWYWx1ZXNcIikubWFwKGtleSA9PiBgJHtrZXl9PSR7RlRDb29raWVzW2tleV19YCkuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZVF1ZXJ5U3RyaW5nICs9IFwiJlwiICsgbHRLZXlzLmZpbHRlcih4ID0+IHggIT0gXCJIYXNWYWx1ZXNcIikubWFwKGtleSA9PiBgJHtrZXl9PSR7TFRDb29raWVzW2tleV19YCkuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1F1ZXJ5UGFyYW1zICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgKz0gXCImXCIgKyBjb29raWVRdWVyeVN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBcIj9cIiArIGNvb2tpZVF1ZXJ5U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29va2llUXVlcnlTdHJpbmdcIiwgY29va2llUXVlcnlTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1F1ZXJ5UGFyYW1zICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyArPSBcIiZwcm9kdWN0X2NhdGVnb3J5X3NlbGVjdGlvbnM9XCIgKyBwcm9kdWN0Q2F0ZWdvcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyArPSBcIj9wcm9kdWN0X2NhdGVnb3J5X3NlbGVjdGlvbnM9XCIgKyBwcm9kdWN0Q2F0ZWdvcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzIHx8IHNlbGVjdGVkUHJvZHVjdHMgfHwgbGl0ZXJhdHVyZU9yZGVyZWQgfHwgZG93bmxvYWRVcmwgfHwgZG93bmxvYWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJGb3JtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGRvd25sb2FkVXJsICYmIGRvd25sb2FkVXJsICE9PSBcIlwiID8gKGAke2l0ZW0udXJsfT9yZWRpcmVjdF91cmw9JHtkb3dubG9hZFVybH1gICsgZXhpc3RpbmdRdWVyeVBhcmFtcykgOiAoaXRlbS51cmwgKyBleGlzdGluZ1F1ZXJ5UGFyYW1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5OiBgJHtjb250ZW50ID8gY29udGVudCA6IGBgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLmhhc2h0YWduYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1wiY2xhc3Nlc1wiOiBgYm1pLW1vZGFsIGJtaS1tb2RhbC0tZm9ybSBibWktbW9kYWwtLSR7aXRlbS5oYXNodGFnbmFtZX1gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3NlbGVjdGlvbnM6IHNlbGVjdGVkUHJvZHVjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9jYXRlZ29yeV9zZWxlY3Rpb25zOiBwcm9kdWN0Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWxOYW1lOiBpdGVtLmhhc2h0YWduYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTmFtZTogZG93bmxvYWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYXR1cmVPcmRlcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBjb21tZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS50cmlnZ2VyRm9ybSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpdGVtLnVybCArIGV4aXN0aW5nUXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weTogYCR7Y29udGVudCA/IGNvbnRlbnQgOiBgYH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5oYXNodGFnbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcImNsYXNzZXNcIjogYGJtaS1tb2RhbCBibWktbW9kYWwtLWZvcm0gYm1pLW1vZGFsLS0ke2l0ZW0uaGFzaHRhZ25hbWV9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZS50YXJnZXQnLCBlLnRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgbGV0IGxlYXZpbmdTaXRlQ2xpY2sgPSAgKGUpID0+ICB7IFxuICAgICAgICBpZiAod2luZG93LmxlYXZpbmdTaXRlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBcImNvcHlcIjogd2luZG93LmxlYXZpbmdTaXRlLm1vZGFsQ29udGVudCxcbiAgICAgICAgICAgICAgICBcIm9rXCI6IHdpbmRvdy5sZWF2aW5nU2l0ZS5va0xhYmVsLFxuICAgICAgICAgICAgICAgIFwiY2xvc2VcIjogd2luZG93LmxlYXZpbmdTaXRlLmNsb3NlTGFiZWwsXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgdmFyIGxpbmsgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibWktbW9kYWwtLWV4aXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgd2luZG93LmxlYXZpbmdTaXRlLnNpdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNpdGUgPSB3aW5kb3cubGVhdmluZ1NpdGUuc2l0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsICYmIG1vZGFsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5rLmluY2x1ZGVzKGAke3NpdGV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpbmtcIjogbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJFeGl0KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl0nKS5mb3JFYWNoKGwgPT4geyAgICBcbiAgICAgICAgICAgICAgICBpZiAobC5ocmVmLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImh0dHBcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiAnZXZlbnRBZGRlZCcgY2xhc3MgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsLmNsYXNzTGlzdC5jb250YWlucyhcImxlYXZpbmdTaXRlQ2xpY2tFdmVudEFkZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsLmNsYXNzTGlzdC5hZGQoXCJsZWF2aW5nU2l0ZUNsaWNrRXZlbnRBZGRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsZWF2aW5nU2l0ZUNsaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCA1MDApO1xuICAgIH0pO1xuXG4gICAgLy8gaW4gb3JkZXIgZm9yIHRoZSByZXR1cm4gZmFsc2UvZS5wcmV2ZW50RGVmYXVsdCgpIHRvIGFjdHVhbGx5IHdvcmssIHlvdSBtdXN0IGF0dGFjaCB0aGlzIHRvIHRoZSBhbmNob3IgdGFnIGl0c2VsZiwgbm90IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJcbiAgICAvLyBsaWtlIGl0IHdhcyBwcmV2aW91c2x5LiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgb25seSB3b3JrcyBmb3IgYW55dGhpbmcgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgRE9NLlxuICAgIC8vIFRoZSBhYm92ZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCkgd2lsbCBhZGQgaXQgZm9yIGFueXRoaW5nIHRoYXQncyBpbmplY3RlZCBpbnRvIHRoZSBET00sIHF1ZXJ5aW5nIHRoZSBkb20gNTAwbXMgYWZ0ZXIgdGhlIGNsaWNrLlxuICAgIC8vIHRoaXMgaXMgbm90IGlkZWFsLCBidXQgdGhlcmUncyBub3QgcmVhbGx5IGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy5cbiAgICBcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykuZm9yRWFjaChsID0+IHtcbiAgICAgICAgLy9hZGQgYSAnZXZlbnRBZGRlZCcgY2xhc3MgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgaWYgKGwuaHJlZi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJodHRwXCIpID09IC0xKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmICdldmVudEFkZGVkJyBjbGFzcyB0byB0aGUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFsLmNsYXNzTGlzdC5jb250YWlucyhcImxlYXZpbmdTaXRlQ2xpY2tFdmVudEFkZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgbC5jbGFzc0xpc3QuYWRkKFwibGVhdmluZ1NpdGVDbGlja0V2ZW50QWRkZWRcIik7XG4gICAgICAgICAgICAgICAgbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxlYXZpbmdTaXRlQ2xpY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIGV4cG9ydCBkZWZhdWx0IHRyaWdnZXI7XG5leHBvcnQgeyBpbnN0YW5jZSwgdHJpZ2dlcn07XG4iLCJpbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuXG5sZXQgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGhlaWdodDogXCJhdXRvXCIsXG4gIHNjcm9sbGFibGU6IGZhbHNlLFxuICBhZGFwdGl2ZTogdHJ1ZSxcbiAgZm9jdXNUcmFwOiB0cnVlLFxuICBjbGFzc2VzOiBcImJtaS1tb2RhbFwiLFxuICB3aWR0aDogXCI5MDBweFwiLFxufTtcblxubGV0IGRlZmF1bHRUZW1wbGF0ZSA9IChjb250ZW50LCB0YWdOYW1lKSA9PiB7XG4gICAgcmV0dXJuICB7dGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX193cmFwcGVyXCIgZGF0YS10YWctdHJpZ2dlcj1cInZpc2libGVcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwib3ZlcmxheVwiLCBcInRpdGxlXCI6IFwiJHt0YWdOYW1lID8gdGFnTmFtZSA6IGBDb250ZXh0dWFsIE92ZXJsYXlgfVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJtaS1tb2RhbF9fY2xvc2VcIiBAY2xpY2s9XCIkZW1pdCgnY2xvc2UnKVwiPjwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fYXJlYSBibWktbW9kYWxfX2FyZWEtYm9keVwiPlxuICAgICAgICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgfVxufTtcblxubGV0IHZpZGVvVGVtcGxhdGUgPSAoaWQsIHRpdGxlKSA9PiB7XG4gICAgcmV0dXJuIHt0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX193cmFwcGVyXCIgZGF0YS10YWctdHJpZ2dlcj1cInZpc2libGVcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwib3ZlcmxheVwiLCBcInRpdGxlXCI6IFwiVmlkZW8gT3ZlcmxheVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJtaS1tb2RhbF9fY2xvc2VcIiBAY2xpY2s9XCIkZW1pdCgnY2xvc2UnKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICR7dGl0bGUgPyBgPHAgY2xhc3M9XCJibWktbW9kYWxfX3ZpZGVvLXRpdGxlXCI+JHt0aXRsZX08L3A+YCA6IGBgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3ZpZGVvLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHdpZHRoPVwiNTYwXCIgaGVpZ2h0PVwiMzE1XCIgc3JjPVwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpZH1cIiBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBhbGxvdz1cImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGB9XG59O1xuXG5jb25zdCBtb2RhbENvbnN0cnVjdG9yID0gKFRlbXBsYXRlLCBOYW1lLCBPcHRpb25zLCBFdmVudHMpID0+IChcbiAgICB7XG4gICAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICAgICAgbmFtZToge25hbWU6IE5hbWV9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBuYW1lOiBOYW1lLFxuICAgICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5PcHRpb25zXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czogRXZlbnRzXG4gICAgfVxuKVxuXG5jb25zdCB2aWRlb01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoaWQsIHRpdGxlKSA9PiAgdmlkZW9UZW1wbGF0ZShpZCwgdGl0bGUpLFxuICAgIFwidmlkZW9cIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXZpZGVvJ30sXG4pXG5cbmNvbnN0IHJlbGVhc2VOb3Rlc01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gZGVmYXVsdFRlbXBsYXRlKGAke2NvbnRlbnR9YCwgJ1JlbGVhc2UgTm90ZXMgT3ZlcmxheScpLFxuICAgIFwicmVsZWFzZU5vdGVzXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1yZWxlYXNlLW5vdGVzJ31cbilcblxuY29uc3QgYXBwbGljYXRpb25zTW9kYWwgPSBtb2RhbENvbnN0cnVjdG9yKFxuICAgIGRlZmF1bHRUZW1wbGF0ZSgnJywgJ01hcmtldCBBcHBsaWNhdGlvbnMgT3ZlcmxheScpLFxuICAgIFwiYXBwbGljYXRpb25zXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1hcHBsaWNhdGlvbnMnfSxcbiAgICAoYXBwcykgPT4gKHtcbiAgICAgICAgJ29wZW5lZCc6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJlZm9yZSBvcGVuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYm1pLW1vZGFsLS1hcHBsaWNhdGlvbnMgLmJtaS1tb2RhbF9fYXJlYS1ib2R5Jyk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFwcHMpO1xuICAgICAgICAgICAgfVxuICAgIH0pLFxuKVxuXG5jb25zdCBxdWlja0xpbmtzTW9kYWwgPSBtb2RhbENvbnN0cnVjdG9yKFxuICAgIGRlZmF1bHRUZW1wbGF0ZSgnJywgJ1F1aWNrIExpbmtzIE92ZXJsYXknKSxcbiAgICBcInF1aWNrTGlua3NcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXF1aWNrLWxpbmtzJ30sXG4gICAgKGxpbmtzKSA9PiAoe1xuICAgICAgICAnb3BlbmVkJzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYmVmb3JlIG9wZW5cIik7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibWktbW9kYWwtLXF1aWNrLWxpbmtzIC5ibWktbW9kYWxfX2FyZWEtYm9keScpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgfSksXG4pXG5cbmNvbnN0IHBhdGVudHNNb2RhbCA9IG1vZGFsQ29uc3RydWN0b3IoXG4gICAgZGVmYXVsdFRlbXBsYXRlKCcnLCAnUGF0ZW50cyBPdmVybGF5JyksXG4gICAgXCJwYXRlbnRzXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1wYXRlbnRzJ30sXG4gICAgKGNvbnRlbnQpID0+ICh7XG4gICAgICAgICdvcGVuZWQnOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiZWZvcmUgb3BlblwiKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhjb250ZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJtaS1tb2RhbC0tcGF0ZW50cyAuYm1pLW1vZGFsX19hcmVhLWJvZHknKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgfSksXG4pXG5cbmNvbnN0IHRvb2x0aXBNb2RhbCA9IG1vZGFsQ29uc3RydWN0b3IoXG4gICAgKGNvbnRlbnQpID0+IGRlZmF1bHRUZW1wbGF0ZShgJHtjb250ZW50fWAsICdUb29sdGlwIE92ZXJsYXknKSxcbiAgICBcInRvb2x0aXBcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXRvb2x0aXAnfVxuKTtcblxuY29uc3QgZm9ybU1vZGFsID0ge1xuICAgIHRlbXBsYXRlOiAoY29udGVudCkgPT4gZGVmYXVsdFRlbXBsYXRlKFxuICAgICAgICAgICAgYCR7Y29udGVudC5jb3B5ID8gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fY29weVwiPlxuICAgICAgICAgICAgICAgICR7Y29udGVudC5jb3B5fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgIDogYGB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19mb3JtXCI+XG4gICAgICAgICAgICA8aWZyYW1lIHNyYz1cIiR7Y29udGVudC51cmx9XCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiNTAwXCIgdHlwZT1cInRleHQvaHRtbFwiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93VHJhbnNwYXJlbmN5PVwidHJ1ZVwiIHN0eWxlPVwiYm9yZGVyOiAwXCI+PC9pZnJhbWU+XG4gICAgICAgICAgICA8L2Rpdj5gLCAnRm9ybSBPdmVybGF5J1xuICAgICAgICApLFxuICAgIG5hbWU6ICh2YWx1ZSkgPT4gKHtcIm5hbWVcIjogdmFsdWV9KSxcbiAgICBvcHRpb25zOiAoZGF0YSkgPT4gKHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIGNsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1mb3JtJyxcbiAgICAgICAgLi4uZGF0YVxuICAgIH0pLFxuICAgIGV2ZW50czogKGRhdGEpID0+ICh7XG4gICAgICAgICdvcGVuZWQnOiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaWQgPSBzdG9yZS5zdGF0ZS5HQUlEO1xuXG4gICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5ibWktbW9kYWxfX2Zvcm0gaWZyYW1lXCIpO1xuICAgICAgICAgICAgbGV0IHNyYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYm1pLW1vZGFsX19mb3JtIGlmcmFtZVwiKS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgbGV0IHBhcmFtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIEdBSUQ6IGlkXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW4gPT0gXCJodHRwczovL2luZm8uYmFkZ2VybWV0ZXIuY29tXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZUlmcmFtZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHBvc3REYXRhKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZURhdGEoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShwYXJhbURhdGEpLCAnKicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHBhcmFtRGF0YSksICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgY29uc3Qgc2l6ZUlmcmFtZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdvYmplY3QnID8gZXZlbnQuZGF0YSA6IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5mb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNyYy5pbmNsdWRlcyhkYXRhLmZvcm0pICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLmNvbnRlbnQgKyAyMH1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBtZXNzYWdlXCIsIGUpOyB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudERhdGEgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ29iamVjdCcgPyBldmVudC5kYXRhIDogSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLCAvL3Bhc3MgZGF0YSBmcm9tIHBvc3RtZXNzYWdlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhIC8vYWxzbyBwYXNzIGRhdGEgZnJvbSBtb2RhbCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50RGF0YS5ldmVudERhdGEuc3VibWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHN1Ym1pdHRlZCBldmVudCB3aGVuZXZlciBhIGZvcm0gaXMgc3VibWl0dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnZm9ybS1zdWJtaXR0ZWQnLCBldmVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZyhcIlVuZXhwZWN0ZWQgbWVzc2FnZVwiLCBlKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnY2xvc2VkJyA6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVtaXQgZm9ybSBjbG9zZWQgZXZlbnQgd2hlbmV2ZXIgZm9ybSBpcyBjbG9zZWRcbiAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdmb3JtLWNsb3NlZCcsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuY29uc3QgaW5mb01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAgKHRpdGxlLCBjb250ZW50KSA9PiBkZWZhdWx0VGVtcGxhdGUoYFxuICAgICAgICA8aDIgY2xhc3M9XCJibWktbW9kYWxfX3RpdGxlXCI+XG4gICAgICAgICAgICAke3RpdGxlfVxuICAgICAgICA8L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19jb3B5XCI+XG4gICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgIDwvZGl2PlxuICAgIGAsICdJbmZvIE92ZXJsYXknKSxcbiAgICBcImNvbnRhY3RcIixcbiAgICB7IHdpZHRoOidub25lJywgaGVpZ2h0OiAnbm9uZScsIHNoaWZ0WTogMCwgY2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLWluZm8nfSxcbiAgICB7XG4gICAgICAgIG9wZW5lZDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpO1xuICAgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdibWktbW9kYWxfX2JvZHknKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VkOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImJvZHlcIik7XG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2JtaS1tb2RhbF9fYm9keScpO1xuICAgICAgICB9XG4gICAgfVxuKTtcblxuY29uc3QgZ2VuZXJpY01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gIGRlZmF1bHRUZW1wbGF0ZShjb250ZW50LCBcIkNvbnRlbnQgT3ZlcmxheVwiKSxcbiAgICBcImdlbmVyaWNcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLWdlbmVyaWMnfSxcbilcblxuY29uc3QgZXhpdE1vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gIHtyZXR1cm4ge3RlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fd3JhcHBlclwiIGRhdGEtdGFnLXRyaWdnZXI9XCJ2aXNpYmxlXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcIm92ZXJsYXlcIiwgXCJ0aXRsZVwiOiBcIkV4dGVybmFsIExpbmsgT3ZlcmxheVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19hcmVhIGJtaS1tb2RhbF9fYXJlYS1ib2R5XCI+XG4gICAgICAgICAgICAgICAgJHtjb250ZW50LmNvcHl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fYXJlYSBibWktbW9kYWxfX2FyZWEtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIke2NvbnRlbnQubGlua31cIiBjbGFzcz1cImJ1dHRvbiBwcmltYXJ5LWJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9uLXRleHRcIj48L3NwYW4+JHtjb250ZW50Lm9rfTxzcGFuIGNsYXNzPVwiYnV0dG9uLWljb25cIj48L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwiJGVtaXQoJ2Nsb3NlJylcIiBjbGFzcz1cImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIHNlY29uZGFyeS1idXR0b24tLTFcIj48c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+PC9zcGFuPiR7Y29udGVudC5jbG9zZX08c3BhbiBjbGFzcz1cImJ1dHRvbi1pY29uXCI+PC9zcGFuPjwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgfX0sXG4gICAgXCJleGl0XCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1leGl0J30sXG4pXG5cblxuZXhwb3J0IHsgdmlkZW9Nb2RhbCwgcmVsZWFzZU5vdGVzTW9kYWwsIGFwcGxpY2F0aW9uc01vZGFsLCBxdWlja0xpbmtzTW9kYWwsIGluZm9Nb2RhbCwgcGF0ZW50c01vZGFsLCB0b29sdGlwTW9kYWwsIGZvcm1Nb2RhbCwgZ2VuZXJpY01vZGFsLCBleGl0TW9kYWwgfTtcbiIsImltcG9ydCBDb21wb25lbnRNb2R1bGUgZnJvbSAnbGliL2NvbXBvbmVudC1tb2R1bGUnO1xuaW1wb3J0IHsgbG9yeSB9IGZyb20gJ2xvcnkuanMnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuLi9taXNjJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmFmZmlsaWF0ZXMnLCB7XG4gICAgcHJlZml4OiAnYWZmaWxpYXRlcy0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsb3J5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXY6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTbGlkZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNMYXN0OiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZSgpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0TG9yeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5ID0gbG9yeSh0aGlzLiRlbCwgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZyYW1lOiAnYWZmaWxpYXRlc19fY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVTbGlkZUNvbnRhaW5lcjogICdhZmZpbGlhdGVzX19saXN0JywgXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVQcmV2Q3RybDogJ2FmZmlsaWF0ZXNfX3ByZXYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lTmV4dEN0cmw6ICdhZmZpbGlhdGVzX19uZXh0JywgXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5hZGRFdmVudExpc3RlbmVyKCdhZnRlci5sb3J5LnNsaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGhpcy5sb3J5LnJldHVybkluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsbHkgY2hlY2sgZm9yIGxhc3Qgc2xpZGUgYmVjYXVzZSBsb3J5IGpzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBkb2Vzbid0IHdvcmsgd2l0aCB2YXJpYWJsZSB3aWR0aCBzbGlkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5hZmZpbGlhdGVzX19saXN0JykuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTGFzdFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xhc3RTbGlkZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVzaXplOiBkZWJvdW5jZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xhc3RTbGlkZSgpO1xuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgY2hlY2tMYXN0U2xpZGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250YWluZXJPZmZzZXQgPSBwYXJzZUludCh3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5hZmZpbGlhdGVzX19saXN0LWNvbnRhaW5lcicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFNsaWRlT2Zmc2V0ID0gcGFyc2VJbnQod2luZG93LmlubmVyV2lkdGggLSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuYWZmaWxpYXRlc19fbGlzdCBsaTpsYXN0LWNoaWxkJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xhc3QgPSBjb250YWluZXJPZmZzZXQgPT0gbGFzdFNsaWRlT2Zmc2V0IHx8IChsYXN0U2xpZGVPZmZzZXQgPj0gY29udGFpbmVyT2Zmc2V0IC0gMSAmJiBsYXN0U2xpZGVPZmZzZXQgPD0gY29udGFpbmVyT2Zmc2V0ICsgMSkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRJc01vYmlsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2NTBweCknKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IG1xbC5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuZGVzYy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzLmRlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMubGlzdC5wcmVwZW5kKHRoaXMuZGVzYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5LnNldHVwKCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzYyA9IHRoaXMuJHJlZnMuZGVzYztcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMb3J5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJc01vYmlsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLnJlc2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5tb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF1cbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgZmV0Y2hlciBmcm9tICdsaWIvZmV0Y2hlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbGliL3N0b3JlJztcbmltcG9ydCB7XG4gICAgdGVtcGxhdGUgYXMgaGl3VGVtcGxhdGUsXG4gICAgdGFiTGFiZWwgYXMgaGl3VGFiTGFiZWwsXG4gICAgY29udGVudFRlbXBsYXRlIGFzIGhpd0NvbnRlbnRUZW1wbGF0ZVxufSBmcm9tICdsaWIvaG93LWl0LXdvcmtzJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmZpbmQtZGlzdHJpYnV0b3InLCB7XG4gICAgcHJlZml4OiAnZmluZC1kaXN0cmlidXRvci0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgZmV0Y2hlcih7XG4gICAgICAgICAgICBuYW1lOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3Q6IHsgdGVtcGxhdGU6ICc8ZGl2PjxzbG90Pjwvc2xvdD48L2Rpdj4nIH0sXG4gICAgICAgICAgICAgICAgICAgIGxpc3RWaXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGdldERpc3RyaWJ1dG9ycygpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5jb3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB0ZW1wbGF0ZSA9IHNlbGYuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUkVTXCIsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hpdy10ZW1wbGF0ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5oaXdUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaXctdGFiLWxhYmVsJzogaGl3VGFiTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaXctY29udGVudC10ZW1wbGF0ZSc6IGhpd0NvbnRlbnRUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZldGNoT25VcGRhdGVQYXJhbXM6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgXSxcbiAgICBzdG9yZTogc3RvcmVcbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICcuLi9jb21wb25lbnQtbW9kdWxlJztcbmltcG9ydCBTdG9yYWdlTWFuYWdlciwgeyBMb2NhbFN0b3JhZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vc3RvcmFnZS1tYW5hZ2VyJztcbmltcG9ydCB7IGdldENvb2tpZVZhbHVlIH0gZnJvbSAnLi4vbWlzYyc7XG5cbmNvbnN0IHN0b3JhZ2VNYW5hZ2VyID0gU3RvcmFnZU1hbmFnZXIoTG9jYWxTdG9yYWdlTWFuYWdlcik7XG5cbmNvbnN0IEdMT0JBTF9NRVNTQUdFX1NFU1NJT04gPSAnZ2xvYmFsLW1lc3NzYWdlJztcblxuY29uc3QgZ2V0TmFtZVNlc3Npb24gPSBpZCA9PiB7XG4gICAgcmV0dXJuIEdMT0JBTF9NRVNTQUdFX1NFU1NJT04rJyMnK2lkO1xufVxuXG5jb25zdCBnZXRUaW1lc1Nob3dlZCA9IGlkID0+IHtcbiAgICByZXR1cm4gcGFyc2VJbnQoc3RvcmFnZU1hbmFnZXIuZ2V0KGdldE5hbWVTZXNzaW9uKGlkKSkgfHwgMCk7XG59XG5cbmNvbnN0IGFkZFRpbWVTaG93ZWQgPSAoaWQpID0+IHtcbiAgICBzdG9yYWdlTWFuYWdlci5hZGRUaW1lcyhnZXROYW1lU2Vzc2lvbihpZCkpO1xufVxuXG5Db21wb25lbnRNb2R1bGUuQWRkTW9kdWxlKCcuZ2xvYmFsLW1lc3NhZ2UnLCB7XG4gICAgcHJlZml4OiAnZ2xvYmFsLW1lc3NhZ2UtJyxcbiAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgc2hvd1RpbWVzOiBOdW1iZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgZGF0YTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBpc1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtb3VudGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKFwiX19zaG93LXRpbWVzXCIpICYmIGVsLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzID0gZ2V0VGltZXNTaG93ZWQoZWwuaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG93VGltZXMgPSB0aGlzLnNob3dUaW1lcyB8fCAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMgPj0gc2hvd1RpbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2hvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja09uZVRydXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT25lVHJ1c3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKFwiX19zaG93LXRpbWVzXCIpICYmIGVsLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRUaW1lU2hvd2VkKGVsLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdjbG9zZUdsb2JhbEFsZXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hlY2tPbmVUcnVzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9uZVRydXN0Q29va2llID0gZ2V0Q29va2llVmFsdWUoJ09wdGFub25BbGVydEJveENsb3NlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLiRlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmVUcnVzdENvb2tpZSA9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvbmV0cnVzdC1jbG9zZS1idG4tY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy4kcGFyZW50LiRlbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlbkV2ZW50ID0gbmV3IEV2ZW50KCdvcGVuR2xvYmFsQWxlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG9wZW5FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF1cbn0pO1xuXG4iLCJpbXBvcnQgJy4vcmVjZW50LXBvc3RzJztcbmltcG9ydCAnLi9teS1zYXZlZC1wYWdlJztcbmltcG9ydCAnLi9zb2x1dGlvbi1hcmVhJztcbmltcG9ydCAnLi9tZXRlci1zZWxlY3Rvcic7XG5pbXBvcnQgJy4vZ2xvYmFsLW1lc3NhZ2UnO1xuaW1wb3J0ICcuL2ZpbmQtZGlzdHJpYnV0b3InO1xuaW1wb3J0ICcuL2FmZmlsaWF0ZXMnO1xuaW1wb3J0ICcuL2xvY2F0aW9ucy1tYXAnO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgdGlwcHkgZnJvbSAndGlwcHkuanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4uL3N0b3JlJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmxvY2F0aW9ucy1tYXAnLCB7XG4gICAgcHJlZml4OiAnbG9jYXRpb25zLW1hcC0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZWdpb246IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZVRpbWVvdXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5lZElkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICByZWdpb25zOiB3aW5kb3cubG9jYXRpb25zTWFwRGF0YS5yZWdpb25zLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB3aW5kb3cubG9jYXRpb25zTWFwRGF0YS5sb2NhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb25zKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbG1zID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG9jYXRpb25zLW1hcF9fbG9jYXRpb24tcGluJyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGVsbXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gdGhpcy5sb2NhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVnaW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUmVnaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wZW5lZElkKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3BlbmVkSWQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50VG9vbHRpcFJlZmVyZW5jZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuJGVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95ZWQoKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5yZXNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZXRDb250ZW50VG9vbHRpcFJlZmVyZW5jZShjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZElkID09PSBudWxsICYmIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLmZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSB0aGlzLmZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdsb2NhdGlvbnMtbWFwX190b29sdGlwLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIgPSBkaXY7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRQcmVmaXhDc3MoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKSxcbiAgICAgICAgICAgICAgICAgICAgcHJlID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsKHN0eWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApWzFdLFxuICAgICAgICAgICAgICAgICAgICBkb20gPSAoJ1dlYktpdHxNb3p8TVN8TycpLm1hdGNoKG5ldyBSZWdFeHAoJygnICsgcHJlICsgJyknLCAnaScpKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbTogZG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlOiBwcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3M6ICctJyArIHByZSArICctJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBwcmVbMF0udG9VcHBlckNhc2UoKSArIHByZS5zdWJzdHIoMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFN0eWxlV2l0aFByZWZpeChlbCwgc3R5bGUsIHZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjc3MgfSA9IHRoaXMuZ2V0UHJlZml4Q3NzKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlW2NzcytzdHlsZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZURpZmYoKXtcblxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxIZWlnaHQgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxXaWR0aCA9IDE2MTA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxIZWlnaHQgPSA3NzA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSYXRpbyA9IGZ1bGxXaWR0aC9mdWxsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJSYXRpb24gPSBjb250YWluZXJXaWR0aC9jb250YWluZXJIZWlnaHQ7XG5cblxuICAgICAgICAgICAgICAgICAgICBpZihjb250YWluZXJSYXRpb24gPiBmdWxsUmF0aW8pe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFdpZHRoID0gY29udGFpbmVyV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsSGVpZ2h0ID0gY29udGFpbmVyV2lkdGgvZnVsbFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFdpZHRoID0gY29udGFpbmVySGVpZ2h0KmZ1bGxSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxIZWlnaHQgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdzogcmVhbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaDogcmVhbEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlYWxXaWR0aC9mdWxsV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiByZWFsSGVpZ2h0L2Z1bGxIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1vdmVUb1JlZ2lvbigpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWdpb24gIT09IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPCA4MzUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4OnhEaWZmLCB5OnlEaWZmLCB3IH0gPSB0aGlzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMucmVnaW9uc1t0aGlzLnJlZ2lvbl07XG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gcmVnaW9uLmNvb3JkaW5hdGVzWzBdICogeERpZmYgKiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSByZWdpb24uY29vcmRpbmF0ZXNbMV0gKiB5RGlmZiAqIC0xO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB0aGlzLiRlbC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluTGVmdCA9ICh3IC0gb2Zmc2V0V2lkdGgpICogLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5Ub3AgPSAodyAtIG9mZnNldEhlaWdodCkgKiAtMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgPCBtaW5MZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IG1pbkxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IDwgbWluVG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG1pblRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudEVsZW1lbnQuc3R5bGVbJ2JhY2tncm91bmQtcG9zaXRpb24nXSA9IGAke2x9cHggJHt0fXB4YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5sb2NhdGlvbnNDb250YWluZXIuc3R5bGUubGVmdCA9IGAke2x9cHhgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLmxvY2F0aW9uc0NvbnRhaW5lci5zdHlsZS50b3AgPSBgJHt0fXB4YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wZW4oaWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5lZElkID0gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNpemUoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc2l6ZVRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUmVnaW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVQb3NpdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHg6eERpZmYsIHk6eURpZmYgfSA9IHRoaXMuY2FsY3VsYXRlRGlmZigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtsLCB0XSA9IGkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfdG9wID0gTWF0aC5yb3VuZCh0ICogeURpZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2xlZnQgPSBNYXRoLnJvdW5kKGwgKiB4RGlmZik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbYCR7X2xlZnR9cHhgLCBgJHtfdG9wfXB4YF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9ucztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGxXaWR0aCA9IDE2MTA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdWxsSGVpZ2h0ID0gNzcwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsbFJhdGlvID0gZnVsbFdpZHRoL2Z1bGxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsY0hlaWdodCA9IE1hdGgucm91bmQod2luZG93V2lkdGggLyBmdWxsUmF0aW8pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwID0gdGhpcy4kZWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnN0eWxlLmhlaWdodCA9IGAke2NhbGNIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdG9vbHRpcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NvbnRlbnQtdG9vbHRpcCcsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2lkJywgJ2RhdGEnLCAnb3BlbicsICdpc09wZW4nLCAnc2V0Q29udGVudFRvb2x0aXBSZWZlcmVuY2UnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBweUluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGlsZDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmV2aWV3IENhcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5kYXRhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9iaWxlTW9kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlwcHlJbnN0YW5jZS5zZXRDb250ZW50KCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc09wZW4oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vYmlsZU1vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2V0Q29udGVudCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHotaW5kZXggb2YgY3VycmVudGx5IG9wZW4gdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwcHlUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjdGlwcHktJHt0aGlzLmlkICsgMX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwcHlUYXJnZXQuc3R5bGUuekluZGV4ID0gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25PcGVuKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2UoKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlTW9kZSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDY1MCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudFRvb2x0aXBSZWZlcmVuY2UodGhpcy5jb250ZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VG9vbHRpcENvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9vbHRpcENvbnRlbnQoKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcHB5SW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoJy50aXBweS1jb250ZW50JykuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDaGlsZCA9IHRoaXMuJGVsLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aXBweSh0aGlzLiRlbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dIVE1MOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5kYXRhLnBsYWNlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDk5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ3JlYXRlKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGlwcHlJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFRvb2x0aXBDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSGlkZShpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBdXG59KTtcbiIsImltcG9ydCBxcyBmcm9tICdxcyc7XG5cbmltcG9ydCBDb21wb25lbnRNb2R1bGUgZnJvbSAnbGliL2NvbXBvbmVudC1tb2R1bGUnO1xuaW1wb3J0IGZldGNoZXIgZnJvbSAnbGliL2ZldGNoZXInO1xuXG5pbXBvcnQgc3RvcmUgZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHsgaW5mb01vZGFsIGFzIG1vZGFsIH0gZnJvbSAnLi4vbW9kYWxzJztcblxuLy8gTWV0ZXIgc2VsZWN0b3IgY29tcG9uZW50c1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3Ivc3RlcC1iYXInO1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3IvaW5wdXQtYm94JztcbmltcG9ydCAnbGliL21ldGVyLXNlbGVjdG9yL2J1dHRvbi1zZXQnO1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3IvZnJhbWUnO1xuXG4vLyBNZXRlciBzZWxlY3RvciB0ZW1wbGF0ZXNcbmltcG9ydCBtZXRlclNlbGVjdG9yQ29udGVudFRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1jb250ZW50Lmhicyc7XG5pbXBvcnQgbWV0ZXJTZWxlY3RvclBhZ2luYXRvclRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1wYWdpbmF0b3IuaGJzJztcbmltcG9ydCBwcm9kdWN0SXRlbVZUZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLXYuaGJzJztcbmltcG9ydCBwcm9kdWN0SXRlbUhUZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLWguaGJzJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLm1ldGVyLXNlbGVjdG9yJywge1xuICAgIHByZWZpeDogJ21ldGVyLXNlbGVjdG9yLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICBmZXRjaGVyKHtcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdENvdW50OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTIgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0UXVvdGVCdXR0b246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnW2hyZWY9XCIjbWV0ZXJzZWxlY3RvclwiXScgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IHRoaXMuZGVmYXVsdENvdW50LFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBzdGVwczogW10sIFxuICAgICAgICAgICAgICAgICAgICBzdGVwTnVtYmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICBhbnN3ZXJNZW1vOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgIGFuc3dlck1vZGVsOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRDb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBWYWx1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpc1Jlc3VsdHNQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGFnU3RlcEZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS51bml0cztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcnMoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuYW5zd2VyTWVtby5maWx0ZXIoKF8sIGkpID0+IGkgPCB0aGlzLnN0ZXBOdW1iZXIgKS5yZWR1Y2UoKGEsIGF3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXcucmVkdWNlKChhZSwgZSkgPT4gKHsuLi5hZSwgLi4uZS5xdWVyeSB9KSwge30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLmEsIC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICAgICAgICAgIH0gLHt9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhc0J1dHRvbnMoKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnModGhpcy5zdGVwTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4ocXVlc3Rpb25zLmZpbmQocSA9PiBxLmJ1dHRvbiApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzVHJhbnNwYXJlbnQoKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNSZXN1bHRzUGFnZSB8fCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5oYXNCdXR0b25zO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGl0bGUoKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0aXRsZSB9ID0gKHRoaXMuZGF0YSkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWIgPSB0aGlzLmdldFRhYih0aGlzLnN0ZXBOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRhYiAmJiB0YWIudGFiVGl0bGUpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gKHRoaXMuZGF0YSkgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xvc2VMYWJlbCgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5kYXRhLnNlYXJjaFJlc3VsdHMgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLkNsb3NlTGFiZWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXh0TGFiZWwoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5BZGp1c3RQYXJhbXNMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLk5leHRMYWJlbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNraXBMYWJlbCgpe1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2VhcmNoUmVzdWx0cyAmJiB0aGlzLmRhdGEuc2VhcmNoUmVzdWx0cy5Ta2lwRm9yTm93TGFiZWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsb2FkaW5nTWVzc2FnZSgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5kYXRhLnNlYXJjaFJlc3VsdHMgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLkxvYWRpbmdMYWJlbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnRhY3RCdXR0b24oKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzICYmIHsgbGFiZWw6IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzLkNvbnRhY3RQcm9kdWN0RXhwZXJ0TGFiZWwgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc1Jlc3VsdHNQYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRhYnMgPSBbXSB9ID0gdGhpcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXJNZW1vID0gdGhpcy5hbnN3ZXJNZW1vO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9ucyA9IHRhYnMucmVkdWNlKChhLCB0LCBpdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LnF1ZXN0aW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9ucyA9IHQucXVlc3Rpb25zLm1hcCgocSxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5xLCBxdWVzdGlvbkluZGV4OiBpLCB0YWJJbmRleDogaXQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihxID0+ICFxLmJ1dHRvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYSwgLi4ucXVlc3Rpb25zXTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pOyBcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1vZGVsID0gcXVlc3Rpb25zLm1hcCgocSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YWJJbmRleCwgcXVlc3Rpb25JbmRleCwgLi4ucmVzdH0gPSBxO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlck1lbW9bcS50YWJJbmRleF0gJiYgYW5zd2VyTWVtb1txLnRhYkluZGV4XVtxLnF1ZXN0aW9uSW5kZXhdOyBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSBxdWVzdGlvbnM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlbCh2KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkQW5zd2VyTWVtb09uUmVzdWx0UGFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGljZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlbmFibGVOZXh0V2hlbiB9ID0gdGhpcy5nZXRUYWIodGhpcy5zdGVwTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zKHRoaXMuc3RlcE51bWJlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWVzdGlvbnMpICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnMgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiAoeyAuLi5xLCBpbmRleDogaSB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuYW5zd2VyTW9kZWwuZmlsdGVyKGEgPT4gYSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlcnNWYWx1ZXMgPSBhbnN3ZXJzLnJlZHVjZSgobywgYSkgPT4gKHsgLi4ubywgW2EuaWRdOiBhLnZhbHVlIH0pLCB7fSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSBxdWVzdGlvbnMuZmlsdGVyKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxLnNob3dJZlF1ZXN0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IGFuc3dlcnNWYWx1ZXNbcS5zaG93SWZRdWVzdGlvbl07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhID09PSBxLnNob3dJZlZhbHVlIDogYS5pbmRleE9mKHEuc2hvd0lmVmFsdWUpID49IDApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleGVzID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gcS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkQW5zd2VycyA9IGFuc3dlcnMuZmlsdGVyKGEgPT4gaW5kZXhlcy5pbmRleE9mKGEuaW5kZXgpID49IDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29tcGFyaXNvblR5cGUgPSAnREVGQVVMVCcsIHN0ZXBJZHMgPSBbXSB9ID0gZW5hYmxlTmV4dFdoZW4gfHwge307XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb25UeXBlID09PSAnQU5ZJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gISgoZmlsdGVyZWRBbnN3ZXJzLmZpbmQoYSA9PiBzdGVwSWRzLmluZGV4T2YoYS5pZCkgPj0gMCkgfHwgZmFsc2UpICYmIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25UeXBlID09PSAnQUxMJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcihhID0+IHN0ZXBJZHMuaW5kZXhPZihhLmlkKSA+PSAwKS5sZW5ndGggIT09IHN0ZXBJZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gdGhpcy5xdWVzdGlvbnMubGVuZ3RoICE9PSBmaWx0ZXJlZEFuc3dlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSAoZmlsdGVyZWRBbnN3ZXJzLmZpbmQoYSA9PiBhLm5vdGljZSkgfHwge30pLm5vdGljZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nTWVzc2FnZTogdGhpcy5pc1Jlc3VsdHNQYWdlICYmIHRoaXMubG9hZGluZ01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYm91bmNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZSA9IHNldFRpbWVvdXQodGhpcy5sb2FkRGF0YSwgNjAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8ICFkLnNlYXJjaFJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgVG90YWxSZXN1bHRzLCByZW1haW5pbmcsIFNob3dMYXN0UGFnZSB9ID0gZC5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IGQudGFicyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZm91bmQgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvdGFsUmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IFRvdGFsUmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgIXJlbWFpbmluZyAmJiB0aGlzLnNldERhdGEoZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcHMgPSB0YWJzLm1hcCh0ID0+ICh7IGxhYmVsOiB0LnRhYlRpdGxlU2hvcnQgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2hvd0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN1bHRzUGFnZSA9IHRoaXMuc3RlcHMubGVuZ3RoIDw9IHRoaXMuc3RlcE51bWJlcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGVwTnVtYmVyKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTdGVwRmxhZyA9ICB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRWaWV3KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGVwQW5zd2Vycyh2KXtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJzaXN0ZW50LWN0YScpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmFycy5sZW5ndGg7IGkrKyl7IGNvbnN0IGUgPSBiYXJzW2ldOyBlLmNsYXNzTGlzdC5hZGQoJ3BlcnNpc3RlbnQtY3RhLS1tcycpOyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlZCgpe1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRm9ybSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgLy8gRmV0Y2hzIHRoZSByZW1vdGUgZGF0YVxuICAgICAgICAgICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJzID0gey4uLnRoaXMuZmlsdGVyc307XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXNwb25zZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXREYXRhKHJlc3BvbnNlLmRhdGEgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNTZXJpYWxpemVyOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFzLnN0cmluZ2lmeShwYXJhbXMsIHthcnJheUZvcm1hdDogJ3JlcGVhdCd9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFBhZ2luYXRpb24gbWV0aG9kc1xuICAgICAgICAgICAgICAgIGxvYWRNb3JlOiBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXREYXRhOiBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzZWFyY2hSZXN1bHRzOiB7IFJlc3VsdHMgPSBbXSwgcmVtYWluaW5nLCAuLi5fc2VhcmNoUmVzdWx0cyB9LCAuLi5yZXMgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hSZXN1bHRzID0ge307XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5SZXN1bHRzLmZpbHRlcigoXywgaSkgPT4gaSA8IHRoaXMucGFnZVNpemUgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nOiBSZXN1bHRzLmZpbHRlcigoXywgaSkgPT4gaSA+PSB0aGlzLnBhZ2VTaXplICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uX3NlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25UcmlnZ2VyU3RlcEV2ZW50KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlJlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlbWFpbmluZy5maWx0ZXIoKF8sIGkpID0+IGkgPCB0aGlzLnBhZ2VTaXplIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nLmZpbHRlcigoXywgaSkgPT4gaSA+PSB0aGlzLnBhZ2VTaXplICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uX3NlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBhZ2U6IHNlYXJjaFJlc3VsdHMucmVtYWluaW5nLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLy8gU3RlcCBtZXRob2RzXG4gICAgICAgICAgICAgICAgZ2V0VGFiKHN0ZXBOdW1iZXIsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IChkYXRhICYmIGRhdGEudGFicykgfHwgIHRoaXMuZGF0YS50YWJzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFic1tzdGVwTnVtYmVyXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFF1ZXN0aW9ucyhzdGVwTnVtYmVyLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuZ2V0VGFiKHN0ZXBOdW1iZXIsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiLnF1ZXN0aW9ucyB8fCBbXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxvYWRWaWV3KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBWYWx1ZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTW9kZWwgPSB0aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXSA/IFsuLi50aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXV0gOiBbXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFN0ZXBWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLmRhdGEudGFicyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXJNZW1vID0gdGhpcy5hbnN3ZXJNZW1vO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFZhbHVlcyA9IGFuc3dlck1lbW8ubWFwKChhLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWIgPSB0YWJzW2ldIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiLnRhYlZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYi50YWJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5zdGVwTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gYS5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnZhbHVlID09PSAnb2JqZWN0Jyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgTW9yZUxhYmVsID0gJycgfSA9IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS52YWx1ZS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZS52YWx1ZS5sZW5ndGgtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVbMF0gKyBgICsgJHtjb3VudH0gYCArIE1vcmVMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrTmV4dEJ1dHRvbihza2lwPWZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2xpZGVCYXIub3BlbigpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtbyA9IFsuLi50aGlzLmFuc3dlck1lbW9dO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLnF1ZXN0aW9ucy5tYXAocSA9PiBxLmluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtb1t0aGlzLnN0ZXBOdW1iZXJdID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gdGhpcy5xdWVzdGlvblNraXBSZXN1bHQocSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW53cyA9IHRoaXMuYW5zd2VyTW9kZWwucmVkdWNlKChhLCBlKSA9PiAoIWUgPyBhIDogey4uLmEsIFtlLmluZGV4XTogZX0pLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXSA9IGluZGV4ZXMubWFwKGkgPT4gYW53c1tpXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1vZGVsID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcE51bWJlciArPSAxO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DbGlja1NraXBCdXR0b24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DbGlja05leHRCdXR0b24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VTdGVwTnVtYmVyKHN0ZXBOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gc3RlcE51bWJlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoYW5nZWRBbnN3ZXJNZW1vT25SZXN1bHRQYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlck1lbW8gPSBbLi4udGhpcy5hbnN3ZXJNZW1vXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YWJJbmRleCwgcXVlc3Rpb25JbmRleCwgLi4ucmVzdH0gPSBxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXJNZW1vW3RhYkluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlck1lbW9bdGFiSW5kZXhdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbnN3ZXJNb2RlbFtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlck1lbW9bdGFiSW5kZXhdW3F1ZXN0aW9uSW5kZXhdID0gdGhpcy5xdWVzdGlvblNraXBSZXN1bHQocSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJNZW1vW3RhYkluZGV4XVtxdWVzdGlvbkluZGV4XSA9IHRoaXMuYW5zd2VyTW9kZWxbaV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtbyA9IGFuc3dlck1lbW87XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBxdWVzdGlvblNraXBSZXN1bHQocSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHF1ZXJ5OiBxLmFwaVF1ZXJ5LnJlZHVjZSgoYSwgZSkgPT4gKHsgLi4uYSwgW2VdOiAnc2tpcCcgfSksIHt9KSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJpZ2dlclRhZ2dpbmdFdmVudChkYXRhLCB0eXBlKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ1RGLU1ldGVyLVNlbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndG9vbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ01ldGVyIFNlbGVjdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdpbW11dGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmltbXV0YWJsZURhdGFMYXllclB1c2goZGF0YU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jdXN0b21NdXRhYmxlRGF0YUxheWVyUHVzaChkYXRhT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbmFseXRpY3MgZnJhbWV3b3JrIGVycm9yOiAnLCBlcnIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVHJpZ2dlclF1ZXN0aW9uRXZlbnQoZGF0YSA9IHt9KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGEucXVlc3Rpb25JbmRleCkpe1xuICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWdnaW5nIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuZ2V0VGFiKHRoaXMuc3RlcE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnNbZGF0YS5xdWVzdGlvbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25UaXRsZSA9IHF1ZXN0aW9uLnF1ZXN0aW9uIHx8IHRhYi50YWJUaXRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCdXR0b24gPSBCb29sZWFuKHF1ZXN0aW9uLmJ1dHRvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyVGFnZ2luZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogaXNCdXR0b24gPyBxdWVzdGlvblRpdGxlIDogcXVlc3Rpb24uZmlsdGVyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpc0J1dHRvbiA/IGRhdGEudmFsdWUubGFiZWwgOiBkYXRhLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGU6IGlzQnV0dG9uID8gJ2J1dHRvbicgOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVHJpZ2dlclN0ZXBFdmVudChkYXRhID0ge30pe1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGFnU3RlcEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU3RlcEZsYWcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWdnaW5nIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBObyA9IHRoaXMucGFkU3RhcnQoU3RyaW5nKGkgKyAxKSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoQ291bnQgPSBkYXRhLnNlYXJjaFJlc3VsdHMgJiYgdGhpcy5wYWRTdGFydChTdHJpbmcoZGF0YS5zZWFyY2hSZXN1bHRzLlRvdGFsUmVzdWx0cyksIDMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclRhZ2dpbmdFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5vLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHRoaXMuc3RlcHNbaV0ubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICdpbW11dGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID49IHRoaXMuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJUYWdnaW5nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBObyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiAnQ09NUExFVEUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnaW1tdXRhYmxlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFkU3RhcnQodmFsdWUsIHBhZFNpemUgPSAyKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSAgU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4ubGVuZ3RoIDwgcGFkU2l6ZSkge24gPSBcIjBcIiArIG47fVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRyaWdnZXJGb3JtKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnJlcXVlc3RRdW90ZUJ1dHRvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gdGhpcy5hbnN3ZXJNZW1vLnJlZHVjZSgoYSwgbywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxYSA9IG8uZmlsdGVyKGUgPT4gQm9vbGVhbihlLmxhYmVsKSkubWFwKGUgPT4gKHsgbGFiZWw6IGUubGFiZWwgKyAoZS5vcHRpb24gJiYgZS5vcHRpb24ubGFiZWwgPyAnIGluICcgKyBlLm9wdGlvbi5sYWJlbCA6ICcnKSwgdmFsdWU6IGUudmFsdWUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWEubGVuZ3RoID4gMCA/IFsuLi5hLCAuLi5xYV0gOiBhO1xuICAgICAgICAgICAgICAgICAgICB9ICwgW10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzVGV4dCA9IGNvbW1lbnRzLmZpbHRlcihvID0+IEJvb2xlYW4oby52YWx1ZSkpLm1hcChvID0+IG8ubGFiZWwudG9VcHBlckNhc2UoKSArICc6ICcgKyAoQXJyYXkuaXNBcnJheShvLnZhbHVlKSA/IG8udmFsdWUuam9pbignLCAnKSA6IG8udmFsdWUudG9TdHJpbmcoKSkpLmpvaW4oJyB8ICcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBidXR0b25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRhdGFzZXQuY29tbWVudHMgPSBjb21tZW50c1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnbWV0ZXItc2VsZWN0b3ItcGFnaW5hdG9yJyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpc1Nob3cnXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IG1ldGVyU2VsZWN0b3JQYWdpbmF0b3JUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdtZXRlci1zZWxlY3Rvci1jb250ZW50JyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjb3VudCcsICdpc01hdGNoJywgJ3NlbGVjdGVkVW5pdCddLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1Byb2R1Y3RMYWJlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzLlZpZXdQcm9kdWN0TGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNNYXRjaCAmJiB0aGlzLmNvdW50ID09PSAxID8gJ3Byb2R1Y3QtaXRlbS1oJyA6ICdwcm9kdWN0LWl0ZW0tdic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZHVjdC1pdGVtLXZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2l0ZW0nLCAnc2VsZWN0ZWRVbml0JywgJ3ZpZXdQcm9kdWN0TGFiZWwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcHJvZHVjdEl0ZW1WVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvb2ttYXJrXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2l0ZW0nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzW2Ake3RoaXMudHlwZX1gXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnByb2R1Y3RJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuYXJ0aWNsZUlkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyBcInByb2R1Y3RJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IFwiYXJ0aWNsZUlkXCIgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IFwiZG9jdW1lbnRJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyBcInNvZnR3YXJlSWRcIiA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcInByb2R1Y3QtaXRlbS1oXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydpdGVtJywgJ3NlbGVjdGVkVW5pdCcsICd2aWV3UHJvZHVjdExhYmVsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHByb2R1Y3RJdGVtSFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib29rbWFya1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydpdGVtJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlc1tgJHt0aGlzLnR5cGV9YF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQucHJvZHVjdElkIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQucHJvZHVjdElkID8gXCJwcm9kdWN0SWRcIiA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQgPyBcImFydGljbGVJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgPyBcImRvY3VtZW50SWRcIiA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkID8gXCJzb2Z0d2FyZUlkXCIgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IG1ldGVyU2VsZWN0b3JDb250ZW50VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnbWV0ZXItc2VsZWN0b3ItdG90YWwnOiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2NvdW50J10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdIFxufSk7XG4iLCJpbXBvcnQgQ29tcG9uZW50TW9kdWxlIGZyb20gJ2xpYi9jb21wb25lbnQtbW9kdWxlJztcbmltcG9ydCB0YWJzIGZyb20gJ2xpYi90YWJzJztcbmltcG9ydCB7XG4gICAgdGFiU2VsZWN0TW9iaWxlIGFzIHRhYlNlbGVjdE1vYmlsZVRlbXBsYXRlLFxuICAgIHByb2R1Y3RJdGVtIGFzIHByb2R1Y3RJdGVtVGVtcGxhdGUsXG4gICAgZG9jdW1lbnRJdGVtIGFzIGRvY3VtZW50SXRlbVRlbXBsYXRlLFxuICAgIHNvZnR3YXJlSXRlbSBhcyBzb2Z0d2FyZUl0ZW1UZW1wbGF0ZSxcbiAgICBhcnRpY2xlSXRlbSBhcyBhcnRpY2xlSXRlbVRlbXBsYXRlXG59IGZyb20gJ2xpYi90ZW1wbGF0ZS1zdHJpbmdzL215LXNhdmVkLXBhZ2UnO1xuaW1wb3J0IHN0b3JlIGZyb20gXCIuLi9zdG9yZVwiO1xuLy8gaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiXG4vLyBpbXBvcnQgZnBvZGIgZnJvbSAnLi4vLi4vLi4vLi4vZGIuanNvbic7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi4vZXZlbnQtYnVzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7cmVsZWFzZU5vdGVzTW9kYWx9IGZyb20gJy4vLi4vbW9kYWxzJztcbmltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5cblZ1ZS51c2UoVk1vZGFsKTtcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLm15LXNhdmVkLXBhZ2UnLCB7XG4gICAgcHJlZml4OiAnbXktc2F2ZWQtcGFnZS0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgdGFicyh7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzYXZlZElkczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FsRG9jdW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQcm9kdWN0czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZFNvZnR3YXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWRBcnRpY2xlczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuYXJ0aWNsZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWRMZWdhbERvY3VtZW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZFByb2R1Y3RzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5wcm9kdWN0cyA9IHRoaXMuc2F2ZWRQcm9kdWN0c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZFByb2R1Y3RzLnNoaWZ0KCkgOiB0aGlzLnNhdmVkUHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZERvY3VtZW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzID0gdGhpcy5zYXZlZERvY3VtZW50c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZERvY3VtZW50cy5zaGlmdCgpIDogdGhpcy5zYXZlZERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkU29mdHdhcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlID0gdGhpcy5zYXZlZFNvZnR3YXJlWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkU29mdHdhcmUuc2hpZnQoKSA6IHRoaXMuc2F2ZWRTb2Z0d2FyZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkQXJ0aWNsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmFydGljbGVzID0gdGhpcy5zYXZlZEFydGljbGVzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkQXJ0aWNsZXMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRBcnRpY2xlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkTGVnYWxEb2N1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzID0gdGhpcy5zYXZlZExlZ2FsRG9jdW1lbnRzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkTGVnYWxEb2N1bWVudHMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRMZWdhbERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRTYXZlZElkcygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5wcm9kdWN0cyA9IHRoaXMuc2F2ZWRQcm9kdWN0c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZFByb2R1Y3RzLnNoaWZ0KCkgOiB0aGlzLnNhdmVkUHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzID0gdGhpcy5zYXZlZERvY3VtZW50c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZERvY3VtZW50cy5zaGlmdCgpIDogdGhpcy5zYXZlZERvY3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5zb2Z0d2FyZSA9IHRoaXMuc2F2ZWRTb2Z0d2FyZVswXSA9PSBcIlwiID8gdGhpcy5zYXZlZFNvZnR3YXJlLnNoaWZ0KCkgOiB0aGlzLnNhdmVkU29mdHdhcmU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuYXJ0aWNsZXMgPSB0aGlzLnNhdmVkQXJ0aWNsZXNbMF0gPT0gXCJcIiA/IHRoaXMuc2F2ZWRBcnRpY2xlcy5zaGlmdCgpIDogdGhpcy5zYXZlZEFydGljbGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzID0gdGhpcy5zYXZlZExlZ2FsRG9jdW1lbnRzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkTGVnYWxEb2N1bWVudHMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRMZWdhbERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTYXZlZElkcygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgIHRhYlNlbGVjdE1vYmlsZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGFiLXNlbGVjdC1tb2JpbGUnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGFiU2VsZWN0TW9iaWxlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Q2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbXktc2F2ZWQtcGFnZV9fdGFiLXNlbGVjdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERhdGE6IE9iamVjdFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTbG90cyA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFNsb3QgPSBkZWZhdWx0U2xvdHMgJiYgZGVmYXVsdFNsb3RzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkU2xvdCAmJiBjaGlsZFNsb3QuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYy5jb21wb25lbnRPcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50YWcgIT09ICd0YWInKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gb3B0aW9ucy5wcm9wc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBvcHRpb25zLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BhbiAmJiBzcGFuLmNoaWxkcmVuWzBdICYmIHNwYW4uY2hpbGRyZW5bMF0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZFRhYjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucHVzaCh7aWQsIHRleHR9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWIoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZFByb2R1Y3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzYXZlZC1wcm9kdWN0cycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkU3RyOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImNoZWNrZWRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkU3RyID0gdGhpcy5jaGVja2VkLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aXRlbS5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKGBcXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdEl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvZHVjdC1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZTogcHJvZHVjdEl0ZW1UZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydjaGVja2VkJywgJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdElkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtID0gdGhpcy5pc0NoZWNrZWQgPyBcImFkZFwiIDogXCJyZW1vdmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLiRyZWZzLnVybC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy4kcmVmcy51cmwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZS1jaGVja2VkJywgcGFyYW0sIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2F2ZWRJZHMucHJvZHVjdHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMucHJvZHVjdHMuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmNoZWNrYm94LmRhdGFzZXQucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMucHJvZHVjdHMuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RhcXVvdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSRVFVRVNUIEEgUVVPVEVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZS1jaGVja2VkJywgKHBhcmFtLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGFyYW0gPT0gXCJhZGRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5jaGVja2VkLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09IHZhbHVlLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY2hlY2tlZC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQuc3BsaWNlKHRoaXMuY2hlY2tlZC5pbmRleE9mKGluZGV4KSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgICAgIGRvY0l0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RvYy1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnc2F2ZWRJZHMnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50SWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZUFsbDogbnVsbCwgLy9pcyBcInNlZSBhbGxcIiBmZWF0dXJlIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzYXZlZElkcy5kb2N1bWVudHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLmRvY3VtZW50cy5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxPcGVuID0gIXRoaXMuc2VlQWxsT3BlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5zZWVBbGxDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxzID0gdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJ1bmNhdGVkRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMCwzKS5qb2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb3JlRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMykuam9pbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTCA9IGAke3RydW5jYXRlZERldGFpbHN9JHttb3JlRGV0YWlscyA9PSBcIlwiID8gJycgOiAnLCd9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGVnYWxEb2NJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsZWdhbC1kb2MtaXRlbScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsZWdhbERvY3VtZW50SWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZUFsbDogbnVsbCwgLy9pcyBcInNlZSBhbGxcIiBmZWF0dXJlIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzYXZlZElkcy5sZWdhbERvY3VtZW50c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMubGVnYWxEb2N1bWVudHMuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsT3BlbiA9ICF0aGlzLnNlZUFsbE9wZW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGwgPSBkZXRhaWxzLmxlbmd0aCA+IDMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9yZURldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDMpLmpvaW4oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcmVDb250ZW50ID0gbW9yZURldGFpbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSxgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc29mdHdhcmVJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzb2Z0d2FyZS1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnc2F2ZWRJZHMnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NvZnR3YXJlSWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG5cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2F2ZWRJZHMuc29mdHdhcmVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTW9kYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGVhc2VOb3RlcyA9IHRoaXMuJHJlZnMucmVsZWFzZU5vdGVzLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC50ZW1wbGF0ZShyZWxlYXNlTm90ZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFydGljbGVJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhcnRpY2xlLWl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogWydzYXZlZElkcyddLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJ0aWNsZUlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInNhdmVkSWRzLmFydGljbGVzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZElkcy5hcnRpY2xlcy5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMuYXJ0aWNsZXMuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJQcm9wczoge1xuICAgICAgICAgICAgICAgIHNhdmVkSWRzOiBPYmplY3RcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgdGFiQ29udGVudE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgY29udGVudFByb3BzOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWRJZHM6IE9iamVjdFxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXG4gICAgXVxufSk7XG5cbi8vIHdpbmRvdy5zZWVMZXNzTGFiZWwgPSBcInNlZSBsZXNzXCI7XG4vLyB3aW5kb3cuc2VlQWxsTGFiZWwgPSBcInNlZSBtb3JlXCI7IiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgZmV0Y2hlciBmcm9tICdsaWIvZmV0Y2hlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi4vc3RvcmUnO1xuXG5pbXBvcnQge1xuICAgIGNvbnRlbnQgYXMgcmVjZW50UG9zdHNDb250ZW50VGVtcGxhdGUsXG4gICAgcGFnaW5hdG9yIGFzIHJlY2VudFBvc3RzUGFnaW5hdG9yVGVtcGxhdGUsXG59IGZyb20gJ2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3JlY2VudC1wb3N0cyc7XG5cbkNvbXBvbmVudE1vZHVsZS5BZGRNb2R1bGUoJy5yZWNlbnQtcG9zdHMnLCB7XG4gICAgcHJlZml4OiAncmVjZW50LXBvc3RzLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICBmZXRjaGVyKHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2FkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAga2VlcENvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmN1cnJlbnRMYW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFNYXJrZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZHJvcGRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJEcm9wZG93blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5wYXJhbXMubWFya2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIk1hcmtldFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFUZWNobm9sb2d5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImRyb3Bkb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJvcGRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHRoaXMucGFyYW1zLnRlY2hub2xvZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVjaG5vbG9neVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFQcm9kdWN0TGluZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJkcm9wZG93blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyb3Bkb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiB0aGlzLnBhcmFtcy5wcm9kdWN0TGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQb3N0IFR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgbG9hZE1vcmU6IGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXNwb25zZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3Jlc3VsdHMgPSAgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2VlcENvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0cywgLi4uZGF0YSB9ID0gcmVzcG9uc2UuZGF0YSB8fCB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZGF0YSAmJiBfdGhpcy5kYXRhLnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0cyA9IF90aGlzLmRhdGEucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwQ29udGVudCA9IF90aGlzLmRhdGEua2VlcENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLl9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BhZ2luYXRvcjogZGF0YS5jdXJyZW50UGFnZSA8IGRhdGEudG90YWxQYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6ICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLm5leHRQYWdlKSB8fCAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAncmVjZW50LXBvc3RzLXBhZ2luYXRvcicgOiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnaXNTaG93J10sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiByZWNlbnRQb3N0c1BhZ2luYXRvclRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ3JlY2VudC1wb3N0cy1jb250ZW50JyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcmVjZW50UG9zdHNDb250ZW50VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIF1cbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgdGFicyBmcm9tICdsaWIvdGFicyc7XG5pbXBvcnQge1xuICAgIGNvbnRlbnRBcHBsaWNhdGlvbnMgYXMgY29udGVudEFwcGxpY2F0aW9uc1RlbXBsYXRlLFxufSBmcm9tICdsaWIvdGVtcGxhdGUtc3RyaW5ncy9zb2x1dGlvbi1hcmVhJztcbmltcG9ydCB7IGFwcGxpY2F0aW9uc01vZGFsIH0gZnJvbSBcIi4uL21vZGFsc1wiO1xuaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCBzdG9yZSBmcm9tIFwiLi4vc3RvcmVcIjtcblxuVnVlLnVzZShWTW9kYWwpO1xuXG5Db21wb25lbnRNb2R1bGUuQWRkTW9kdWxlKCcuc29sdXRpb24tYXJlYScsIHtcbiAgICBwcmVmaXg6ICdzb2x1dGlvbi1hcmVhLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICB0YWJzKHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgnYXBwbGljYXRpb25zJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogZnVuY3Rpb24oaWQpe1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiICE9IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGFiIGlmIGNsaWNrZWQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaG93TW9kYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc29sdXRpb24tYXJlYV9fYXBwbGljYXRpb25zLWl0ZW0uYWN0aXZlJykuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhhcHBsaWNhdGlvbnNNb2RhbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uc01vZGFsLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uc01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnNNb2RhbC5ldmVudHMoYXBwcylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGlkZUFwcGxpY2F0aW9ucyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgnYXBwbGljYXRpb25zJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGVja0lzTW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGNoZWNraW5nIGZvciBhIGJyZWFrcG9pbnQgKnNtYWxsZXIqIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGlzTW9iaWxlIGluIHN0b3JlLmpzXG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjUwcHgpJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLnNvbHV0aW9uLWFyZWFfX2NvbnRlbnQtaXRlbS5hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsbU9mZnNldCA9IGVsLm9mZnNldFRvcDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsZWxtT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ3aW5kb3dcIixzY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxtUG9zID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogKGVsbVBvcyAtIDcwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb25zLWNvbnRlbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhcHBsaWNhdGlvbnMtY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBjb250ZW50QXBwbGljYXRpb25zVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDbGFzczoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2FjdGl2ZSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2U6IEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsIC8vc3RhdGljIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLCAvLyBzdGF0aWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxhYmVsLCAvLyBUYWIgbGFiZWwgZS5nLiBEaXN0cmljdCBzeXN0ZW0gYmFsYW5jaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvbHV0aW9uLWFyZWFfX3RhYnMgbGknKSlbKHRoaXMuaWRUYWIgLSAxKV0uaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJEYXRhOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLCAvL3N0YXRpYyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsIC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCwgLy8gVGFiIGxhYmVsIGUuZy4gRGlzdHJpY3Qgc3lzdGVtIGJhbGFuY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJGVsLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFiQ29udGVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhYkNvbnRlbnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLCAvL3N0YXRpYyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsIC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCwgLy8gVGFiIGxhYmVsIGUuZy4gRGlzdHJpY3Qgc3lzdGVtIGJhbGFuY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zb2x1dGlvbi1hcmVhX190YWJzIGxpJykpWyh0aGlzLmlkVGFiIC0gMSldLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSXNNb2JpbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdXG59KTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IHBhcmRvdEZvcm1JbnN0YW5jZSA9IFZ1ZS5jb21wb25lbnQoJ3BhcmRvdC1mb3JtJywge1xuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICBwYXJhbURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgR0FJRDogc3RvcmUuc3RhdGUuR0FJRFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBoYW5kbGVJZnJhbWUoKSB7XG4gICAgICAgICAgICBsZXQgaWZyYW1lID0gdGhpcy4kZWw7XG4gICAgICAgICAgICBsZXQgc3JjID0gdGhpcy4kZWwuZ2V0QXR0cmlidXRlKCdzcmMnKTtcblxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW4gPT0gXCJodHRwczovL2luZm8uYmFkZ2VybWV0ZXIuY29tXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUlmcmFtZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0RGF0YShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucGFyYW1EYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbURhdGEpLCAnKicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHRoaXMucGFyYW1EYXRhKSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzaXplSWZyYW1lID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBzcmMuaW5jbHVkZXMoZGF0YS5mb3JtKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLmNvbnRlbnQgKyAyMH1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdWJtaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBjaGVja1Njcm9sbCgpIHtcbiAgICAgICAgICAgIGxldCBpZnJhbWUgPSB0aGlzLiRlbDtcbiAgICAgICAgICAgIGxldCBpZnJhbWVQb3MgPSBpZnJhbWUub2Zmc2V0VG9wO1xuICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuXG4gICAgICAgICAgICBpZiAoaWZyYW1lUG9zIDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsbVBvcyA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIDEwMDtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAoZWxtUG9zIC0gNzApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVJZnJhbWUoKTtcbiAgICB9XG59KTtcblxuY29uc3QgcGFyZG90Rm9ybSA9ICgpID0+IHtcblxuICAgIGxldCBmb3JtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYXJkb3QtZm9ybScpO1xuXG4gICAgbGV0IGZvcm1Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBwYXJkb3RGb3JtSW5zdGFuY2U7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wYXJkb3QtZm9ybS0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnBhcmRvdC1mb3JtLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgcGFyZG90LWZvcm0tJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGZvcm1Db25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCB7cGFyZG90Rm9ybSwgcGFyZG90Rm9ybUluc3RhbmNlfTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHtwYXRlbnRzTW9kYWx9IGZyb20gJy4vbW9kYWxzJztcblxuVnVlLnVzZShWTW9kYWwpO1xuXG5jb25zdCBwYXRlbnRzID0gKCkgPT4ge1xuXG4gICAgbGV0IHBhdGVudEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhdGVudHMnKTtcblxuICAgIGxldCBwYXRlbnRzQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgncGF0ZW50cycsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgYWxsUGF0ZW50czogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlck1vZGFsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRlbnRzTW9kYWwuZXZlbnRzKHRoaXMuYWxsUGF0ZW50cylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQYXRlbnRzID0gdGhpcy4kcmVmcy5hbGxQYXRlbnRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wYXRlbnRzLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAucGF0ZW50cy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChwYXRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBhdGVudEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHBhdGVudHMtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHBhdGVudHNDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGVudHM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IGZwb2RiIGZyb20gJy4uLy4uLy4uL2RiLmpzb24nO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgQWNjb3JkaW9uLCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQsIENoZWNrYm94LCBQYWdpbmF0aW9uIH0gZnJvbSAnLi9maWx0ZXItY29tcG9uZW50cyc7XG5cbmNvbnN0IFByb2R1Y3RDYXRhbG9nID0gKCkgPT4ge1xuXG4gICAgbGV0IGNhdGFsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jYXRhbG9nJyk7XG5cbiAgICBjb25zdCBwcm9kdWN0Q2F0YWxvZ0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3QtY2F0YWxvZy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiAxLCAvL2N1cnJlbnQgcGFnZSAjXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFBhZ2VzOiBudWxsLCAvL3RvdGFsIHJldHVybnMgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzdWx0czogbnVsbCwgLy90b3RhbCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93blJlc3VsdHM6IG51bGwsIC8vdG90YWwgc2hvd24gaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnNWaXNpYmxlOiBudWxsLCAvL2FyZSBmaWx0ZXJzIHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFyZWFWaXNpYmxlOiB0cnVlLCAvL2lzIGZpbHRlciBhcmVhIChpbmNsdWRpbmcgdW5pdCB0b2dnbGVyIGFuZCBidG5zKSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jc09ubHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBpVXJsOiBudWxsLCAvL2ZvciBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zOiBudWxsLCAvL2ZvciBkZWVwbGlua2luZyBpbi1icm93c2VyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZUFsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdQcm9kdWN0TGFiZWw6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogJ3Byb2R1Y3QtY2F0YWxvZycsXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQuc2xpY2UoMSkgOiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLnVuaXRzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZVJhbmdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPiA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdGVkVW5pdCA9IHRoaXMuY29tcHV0ZWRVbml0O1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInVuaXQgY2hhbmdlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVcmwoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSB0aGlzLnNhdmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzYXZlZCBvbmx5IGZpbHRlciBpZiBubyBzYXZlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zYXZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJ3NhdmVkRG93bmxvYWRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7IC8vIGhhbmRsZSBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTsgLy8gaGFuZGxlIGhpc3RvcnkgcmVjb3JkXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHNhdmVkRG9jc09ubHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWRQcm9kdWN0c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jc09ubHkgPSBzYXZlZE9ubHkgPyBzYXZlZE9ubHkudmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmN1cnJlbnRQYWdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpcyBtb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZWFzdXJpbmdNZWRpdW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVGaWx0ZXIgPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1lYXN1cmVGaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZUZpbHRlci5pbmRleE9mKCdtZWFzdXJpbmdNZWRpdW0nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBtZWFzdXJlRmlsdGVyLmluZGV4T2YoJ21lYXN1cmluZ01lZGl1bScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcInZhbHVlXCI6IHZhbHVlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzYXZlZFByb2R1Y3RzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcInZhbHVlXCI6IGNoZWNrZWQsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogbGFiZWx9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGVGaWx0ZXJzIC0gdGhpcy5kYXRhLmZpbHRlcnM9XCIsIHRoaXMuZGF0YS5maWx0ZXJzKTtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDEgd2hlbiBmaWx0ZXJzIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IG9uY2UgaW5zdGFuY2Ugb2YgZmlsdGVyIHR5cGUgYXQgb25jZSBmb3IgcmFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlcyA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmluZGV4T2YoZW50cnkudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdHlwZXMuaW5kZXhPZihlbnRyeS50eXBlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJzW2luZGV4XS52YWx1ZSA9PSBlbnRyeS52YWx1ZSAmJiB0aGlzLmRhdGEuZmlsdGVyc1tpbmRleF0udHlwZSA9PSBlbnRyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgb2xkIGFuZCBuZXcgZW50cmllcyBhcmUgdGhlIHNhbWUsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGZpbHRlcnMgaWYgbmV3IGVudHJ5IHZhbHVlcyBkaWZmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIGVudHJ5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIGVudHJ5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywgZW50cnldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyBzcGVjaWZpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICByZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3ZlXCIsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZ2V0VXJsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRQYXJhbXMgPSB0aGlzLmRhdGEuc2F2ZWREb2NzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bml0UGFyYW1zID0gdGhpcy5jb21wdXRlZFVuaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtldFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJtYXJrZXRcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdENhdFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0Q2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzdWJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0VHlwZVBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZVBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0TGluZVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZWFzdXJpbmdQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwibWVhc3VyaW5nTWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZFByb2R1Y3RzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZE9ubHkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlUGFyYW1zID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaXplTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNpemVNaW5cIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemVNYXhQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2l6ZU1heFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInRlbXBlcmF0dXJlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wTWF4UGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInRlbXBlcmF0dXJlTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXNzdXJlTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInByZXNzdXJlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVzc3VyZU1heFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcmVzc3VyZU1heFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VNaW5QYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiZmxvd1JhbmdlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VNYXhQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiZmxvd1JhbmdlTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VUeXBlID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImZsb3dSYW5nZU1heFwiIHx8IGl0ZW0udHlwZSA9PSBcImZsb3dSYW5nZU1pblwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZsb3dSYW5nZVR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnVybFBhcmFtcyA9IGAke3VuaXRQYXJhbXMgIT09IFwiXCIgPyBcIiZ1bml0cz1cIiArIHVuaXRQYXJhbXMgOiBcIlwifSR7bWFya2V0UGFyYW1zICE9PSBcIlwiID8gXCImbWFya2V0PVwiICsgbWFya2V0UGFyYW1zIDogXCJcIn0ke3Byb2R1Y3RDYXRQYXJhbXMgIT09IFwiXCIgPyBcIiZwcm9kdWN0Q2F0ZWdvcnk9XCIgKyBwcm9kdWN0Q2F0UGFyYW1zIDogXCJcIn0ke3Byb2R1Y3RUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImcHJvZHVjdFR5cGU9XCIgKyBwcm9kdWN0VHlwZVBhcmFtcyA6IFwiXCJ9JHtwcm9kdWN0TGluZVBhcmFtcyAhPT0gXCJcIiA/IFwiJnByb2R1Y3RMaW5lPVwiICsgcHJvZHVjdExpbmVQYXJhbXMgOiBcIlwifSR7bWVhc3VyaW5nUGFyYW1zICE9PSBcIlwiID8gXCImbWVhc3VyaW5nTWVkaXVtPVwiICsgbWVhc3VyaW5nUGFyYW1zIDogXCJcIn0mc2F2ZWRQcm9kdWN0cz0ke3NhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpfSR7c3VicGFyYW1zICE9PSBcIlwiID8gXCImc3VicGFyYW09XCIgKyBzdWJwYXJhbXMgOiBcIlwifSZwYWdlPSR7cGFnZVBhcmFtc31gO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFwaVVybCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5hcGlVcmwgPSBhcGlVcmw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJhcGkvZG9jdW1lbnRzP1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVVybCA9IHdpbmRvdy5wcm9kdWN0Q2F0YWxvZ0FQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3Byb2R1Y3RzXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvcHJvZHVjdHNUZXN0XCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkUHJvZHVjdHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RDYXRlZ29yeSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZHVjdFR5cGUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RMaW5lID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtYXJrZXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9kdWN0Q2F0ZWdvcnlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9kdWN0TGluZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0TGluZS5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFR5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN1YnBhcmFtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhcmFtLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRWYWx1ZSA9IChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSBwYXJhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciA/IGZpbHRlci52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRGbG93UmFuZ2VUeXBlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSBcImZsb3dSYW5nZU1pblwiIHx8IGl0ZW0udHlwZSA9PT0gXCJmbG93UmFuZ2VNYXhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciA/IGZpbHRlci5mbG93UmFuZ2VUeXBlIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmd1YWdlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHM6IHRoaXMuY29tcHV0ZWRVbml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0OiBtYXJrZXQuam9pbignfCcpID09IFwiXCIgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KG1hcmtldC5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBwcm9kdWN0Q2F0ZWdvcnkuam9pbignfCcpID09IFwiXCIgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHByb2R1Y3RDYXRlZ29yeS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGU6IHByb2R1Y3RUeXBlLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0VHlwZS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdExpbmU6IHByb2R1Y3RMaW5lLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0TGluZS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZU1pbjogZ2V0VmFsdWUoJ3NpemVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVNYXg6IGdldFZhbHVlKCdzaXplTWF4JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93UmFuZ2VUeXBlOiBnZXRGbG93UmFuZ2VUeXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93UmFuZ2VNaW46IGdldFZhbHVlKCdmbG93UmFuZ2VNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dSYW5nZU1heDogZ2V0VmFsdWUoJ2Zsb3dSYW5nZU1heCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyaW5nTWVkaXVtOiBnZXRWYWx1ZSgnbWVhc3VyaW5nTWVkaXVtJykgPT0gbnVsbCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0VmFsdWUoJ21lYXN1cmluZ01lZGl1bScpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlTWluOiBnZXRWYWx1ZSgndGVtcGVyYXR1cmVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlTWF4OiBnZXRWYWx1ZSgndGVtcGVyYXR1cmVNYXgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzdXJlTWluOiBnZXRWYWx1ZSgncHJlc3N1cmVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzdXJlTWF4OiBnZXRWYWx1ZSgncHJlc3N1cmVNYXgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkUHJvZHVjdHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFyYW06IHN1YnBhcmFtLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChzdWJwYXJhbS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpID09IFwiXCIgPyBudWxsIDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykuY2hhckF0KDApID09IFwiLFwiID8gdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8Jykuc2xpY2UoMSkgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiA5LFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHM7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudG90YWxSZXN1bHRzID0gcmVzcG9uc2UuZGF0YS50b3RhbFJlc3VsdHMgPyByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cyA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnNob3duUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA/IHJlc3BvbnNlLmRhdGEucmVzdWx0cy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS52aWV3UHJvZHVjdExhYmVsID0gcmVzcG9uc2UuZGF0YS52aWV3UHJvZHVjdExhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlKGRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFwicHJldlwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFwibmV4dFwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUVtYWlsRG9jcyhkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gWy4uLnRoaXMuZGF0YS5lbWFpbERvY3MsIGRhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcy5zcGxpY2UodGhpcy5kYXRhLmVtYWlsRG9jcy5pbmRleE9mKGl0ZW0pLDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvL3VwZGF0ZSBoaXN0b3J5IHJlY29yZCB3aGVuIGZpbHRlcnMgY2hhbmdlXG4gICAgICAgICAgICAgICAgdXBkYXRlSGlzdG9yeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0/JHt0aGlzLmRhdGEudXJsUGFyYW1zfWA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5LnN0YXRlID09IG51bGwgfHwgaGlzdG9yeS5zdGF0ZSAhPT0gdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh1cmwsXCJcIix1cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZGVlcCBsaW5raW5nIG9uIGhpc3RvcnkgY2hhbmdlXG4gICAgICAgICAgICAgICAgZGVlcGxpbmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5zcGxpdChcIiZcIikuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gIT0gXCJcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTsgLy9jbGVhciBmaWx0ZXJzIGFycmF5IGZpcnN0XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRGaWx0ZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbS5zbGljZSgwLCBwYXJhbS5pbmRleE9mKCc9JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBwYXJhbS5zbGljZShwYXJhbS5pbmRleE9mKCc9JykgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVFlQRVwiLHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDT05URU5UXCIsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInVuaXRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNhdmVkUHJvZHVjdHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ID09IFwiZmFsc2VcIiB8fCBjb250ZW50ID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IHRoaXMuZGF0YS5zYXZlZERvY3NMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFycmF5ID0gY29udGVudC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGRlY29kZVVSSUNvbXBvbmVudChpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGluaXRGaWx0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmluaXRGaWx0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZVVuaXRzKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcChlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1jYXRhbG9nX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRvcCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgLy8gOSA9IHBhZ2Ugc2l6ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEudG90YWxSZXN1bHRzIC8gOSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGRhdGEgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZFswXSA9PSBcIlwiID8gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQgPSBzdG9yZS5zdGF0ZS51bml0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gdGhpcy5kYXRhLmlzTW9iaWxlID8gZmFsc2UgOiB0cnVlOyAvL2luaXQgc2hvdy9oaWRlIGZpbHRlcnMgaWYvaXMgbW9iaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJBcmVhVmlzaWJsZSA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDEwID8gZmFsc2UgOiB0cnVlOyAvLyBoaWRlIGZpbHRlcnMgaWYgbGVzcyB0aGVuIDEwIGluaXRpYWwgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hhcmVBbGwgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSA1ID8gdHJ1ZSA6IGZhbHNlOyAvLyBlbmFibGUgXCJzaGFyZSBhbGxcIiBpZiA1IG9mIGxlc3MgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXNMYWJlbCA9IHRoaXMuJHJlZnMudW5pdFRvZ2dsZXIuZGF0YXNldC51c0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubWV0cmljTGFiZWwgPSB0aGlzLiRyZWZzLnVuaXRUb2dnbGVyLmRhdGFzZXQubWV0cmljTGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBldmVudGJ1cyBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVGaWx0ZXJzJywgKGVsLCBlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVSYW5nZUZpbHRlcicsIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSYW5nZUZpbHRlcihlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdlbWFpbC1kb2NzJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRW1haWxEb2NzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzY3JvbGwtdG8tdG9wJywgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBpbml0aWFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5kZWZhdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5wdXNoKHdpbmRvdy5kZWZhdWx0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsUHJvZHVjdEFwaVJlc3VsdHMucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsUHJvZHVjdEFwaVJlc3VsdHMgPyB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnRvdGFsUmVzdWx0cyA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnJlc3VsdHMgPyB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnJlc3VsdHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnZpZXdQcm9kdWN0TGFiZWwgPSB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzID8gd2luZG93LmluaXRpYWxQcm9kdWN0QXBpUmVzdWx0cy52aWV3UHJvZHVjdExhYmVsIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVzdWx0cyA9IGZwb2RiLnByb2R1Y3RzLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSBmcG9kYi5wcm9kdWN0cy50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5wcm9kdWN0cy5yZXN1bHRzID8gZnBvZGIucHJvZHVjdHMucmVzdWx0cy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEudmlld1Byb2R1Y3RMYWJlbCA9IGZwb2RiLnByb2R1Y3RzLnZpZXdQcm9kdWN0TGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGRlZXBsaW5raW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gcmVzdWx0cyBsaXN0XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3QtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhdGFsb2dfX2NhcmRzLWNvbnRlbnRcIiA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICA8cHJvZHVjdC1yZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiA6a2V5PVwiaW5kZXhcIiA6aW5kZXg9XCJpbmRleFwiIDpkYXRhPVwiZGF0YVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdwcm9kdWN0LXJlc3VsdHMtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnY29udGVudCcsICdpbmRleCddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29udGVudC5pZCB8fCBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiUHJldmlldyBDYXJkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInByb2R1Y3RMaW5lXCI6IHRoaXMuY29udGVudC5icmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5jb250ZW50LnByb2R1Y3ROYW1lID8gdGhpcy5jb250ZW50LnByb2R1Y3ROYW1lLnJlcGxhY2UoJzxwPicsICcnKS5yZXBsYWNlKCc8L3A+JywnJykgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiB0aGlzLmluZGV4IDwgMTAgPyBgMCR7dGhpcy5pbmRleCArIDF9YCA6ICh0aGlzLmluZGV4ICsgMSkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5jb250ZW50LmlkIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRcIiA6ZGF0YT1cImRhdGFcIiA6Y2xhc3M9XCJ7J2hpZGUtYm9va21hcmsnOiAoZGF0YS5zYXZlZERvY3NPbmx5ID09PSB0cnVlKSAmJiAoaXNCb29rbWFya2VkID09PSBmYWxzZSl9XCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgOmRhdGEtdGFnLW1ldGE9XCJ0YWdnaW5nTWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS11dGlsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX191dGlsLWJvb2ttYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRhbG9nLWNhcmRfX2Jvb2ttYXJrXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNCb29rbWFya2VkfVwiIDpkYXRhLXByb2R1Y3QtaWQ9XCJjb250ZW50LmlkXCIgcmVmPVwiYm9va21hcmtcIiB2LW9uOmNsaWNrPVwiaGFuZGxlQm9va21hcmtcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGF5ZXJcIiwgXCJjYXRlZ29yeVwiOiBcIlByb2R1Y3RcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19pbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCIgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX2xpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNhdGFsb2ctY2FyZF9faW1hZ2VcIiA6c3JjPVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxcIiA6YWx0PVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxBbHRUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJjb250ZW50LmJyYW5kSW1hZ2VVcmxcIiA6YWx0PVwiY29udGVudC5icmFuZEltYWdlVXJsQWx0VGV4dFwiIGNsYXNzPVwiY2F0YWxvZy1jYXJkX19sb2dvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCIgdi1odG1sPVwiY29udGVudC5wcm9kdWN0TmFtZVwiIGNsYXNzPVwiY2F0YWxvZy1jYXJkX190aXRsZVwiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtc3RhdHNcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fc3RhdFwiIHYtZm9yPVwiKHNwZWMsIGluZGV4KSBpbiBjb250ZW50LnN0YXRzXCIgOmtleT1cImluZGV4XCIgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fc3RhdC1sYWJlbFwiIHYtaHRtbD1cInNwZWMubGFiZWxcIj57e3NwZWMubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX3N0YXQtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtbWV0cmljIFwiIHYtaWY9XCJkYXRhLnNlbGVjdGVkVW5pdCA9PT0gJ21ldHJpYydcIiB2LWh0bWw9XCJzcGVjLnZhbHVlTWV0cmljXCI+e3tzcGVjLnZhbHVlTWV0cmljfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtdXNcIiB2LWlmPVwiZGF0YS5zZWxlY3RlZFVuaXQgPT09ICd1cydcIiB2LWh0bWw9XCJzcGVjLnZhbHVlSW1wZXJpYWxcIj57e3NwZWMudmFsdWVJbXBlcmlhbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS1jdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiY29udGVudC51cmxcIiBjbGFzcz1cImJ1dHRvbiB0ZXJ0aWFyeS1idXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+e3tkYXRhLnZpZXdQcm9kdWN0TGFiZWx9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJidXR0b24taWNvblwiPjwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0SWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQ7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdlbWFpbC1kb2NzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbHRvOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBtYWlsdG9BbGw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWx0byA9IGAke21haWx0b30ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLm5hbWUpfTogJHtpdGVtLnVybH0lMEQlMEFgO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWlsdG8gPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzaGFyZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvID0gYCR7bWFpbHRvfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0ubmFtZSl9OiAke2l0ZW0udXJsfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haWx0b0FsbCA9IG1haWx0bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdtaW4tbWF4Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWU6IG51bGwsIC8vZmluYWwgdmFsdWVzIHRvIHNlbmQgdG8gYXBpXG4gICAgICAgICAgICAgICAgICAgIG1pblZhbHVlUmFuZ2U6IG51bGwsIC8vIG1vZGVsIGZvciByYW5nZSBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVJbnB1dDogbnVsbCwgLy8gbW9kZWwgZm9yIGlucHV0IGZpZWxkXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlOiBudWxsLCAvL2ZpbmFsIHZhbHVlcyB0byBzZW5kIHRvIGFwaVxuICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZVJhbmdlOiBudWxsLCAvLyBtb2RlbCBmb3IgcmFuZ2Ugc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5wdXQ6IG51bGwsIC8vIG1vZGVsIGZvciBpbnB1dCBmaWVsZFxuXG4gICAgICAgICAgICAgICAgICAgIHVzTWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB1c01heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdXNTdGVwOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNNaW46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY01heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljU3RlcDogbnVsbCxcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVbml0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZXMgPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVzLmluZGV4T2YoYCR7dGhpcy50eXBlfU1pbmApID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlcy5pbmRleE9mKGAke3RoaXMudHlwZX1NYXhgKSA+IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5zZWxlY3RlZFVuaXRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEN1cnJlbnRVbml0cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRVbml0TGFiZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgc2VsZWN0b3JzIHdoZW4gdW5pdHMgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZVJhbmdlID0gdGhpcy5jdXJyZW50TWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLmN1cnJlbnRNYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgaW5wdXRzIGFuZCBpbnB1dCBmaWx0ZXJzIHdoZW4gY2hhbmdpbmcgdW5pdHNcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsIGAke3RoaXMudHlwZX1NaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsIGAke3RoaXMudHlwZX1NYXhgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGF0IG1heCB2YWx1ZSwgc2V0IHRvIG51bGwgZm9yICdubyBtaW4nIGFuZCByZW1vdmUgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlIGV4Y2VlZHMgbWluIG9yIG1heCByYW5nZSwgc2V0IHRvIG9uZSBzdGVwIHVuZGVyIG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSA9PSB0aGlzLmN1cnJlbnRNaW4gfHwgdGhpcy5taW5WYWx1ZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCBudWxsLCBgJHt0aGlzLnR5cGV9TWluYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VGbG9hdCh0aGlzLm1pblZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSB8fCBwYXJzZUZsb2F0KHRoaXMubWluVmFsdWUpID4gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRNYXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm1pblZhbHVlID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRNaW4pID09PSAwID8gMCA6IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1pbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKFwiTWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLm1pblZhbHVlID09IG51bGwgPyB0aGlzLmN1cnJlbnRNaW4gOiB0aGlzLm1pblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlSW5wdXQgPSB0aGlzLm1pblZhbHVlO1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIm1heFZhbHVlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhdCBtYXggdmFsdWUsIHNldCB0byBudWxsIGZvciAnbm8gbWF4JyBhbmQgcmVtb3ZlIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBleGNlZWRzIG1pbiBvciBtYXggcmFuZ2UsIHNldCB0byBvbmUgc3RlcCB1bmRlciBtYXggdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4VmFsdWUgPT0gdGhpcy5jdXJyZW50TWF4IHx8IHRoaXMubWF4VmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1heGApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5tYXhWYWx1ZSkgPiBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgfHwgcGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXhWYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1heGApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKFwiTWF4XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLm1heFZhbHVlID09IG51bGwgPyB0aGlzLmN1cnJlbnRNYXggOiB0aGlzLm1heFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVJhbmdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb24gdG8gcHJldmVudCBkcmFnZ2luZyBzbGlkZXIgYmV5b25kIHRoZSB2YWxpZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlUmFuZ2UpIDw9IHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZVJhbmdlID0gKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSArIHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3RlcCkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlUmFuZ2UgPT0gdGhpcy5jdXJyZW50TWF4ID8gbnVsbCA6IHRoaXMubWF4VmFsdWVSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVSYW5nZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uZGl0aW9uIHRvIHByZXZlbnQgZHJhZ2dpbmcgc2xpZGVyIGJleW9uZCB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSA+PSBwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IChwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZVJhbmdlID09IHRoaXMuY3VycmVudE1pbiA/IG51bGwgOiB0aGlzLm1pblZhbHVlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVyczogZGVib3VuY2UoZnVuY3Rpb24odHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGU6XCIsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHt0eXBlfSAke3RoaXMubGFiZWx9OiAke3R5cGUgPT0gXCJNaW5cIiA/IHRoaXMubWluVmFsdWUgOiB0aGlzLm1heFZhbHVlfSAke3RoaXMuY3VycmVudFVuaXR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlID09IFwiTWluXCIgPyB0aGlzLm1pblZhbHVlIDogdGhpcy5tYXhWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGAke3RoaXMudHlwZX0ke3R5cGV9YFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlUmFuZ2VGaWx0ZXInLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgaGFuZGxlUmFuZ2U6IGRlYm91bmNlKGZ1bmN0aW9uKGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfdCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHR5cGUgPT0gXCJtaW5cIiA/IF90LnZhbHVlIDogdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0eXBlID09IFwibWF4XCIgPyBfdC52YWx1ZSA6IHRoaXMubWF4VmFsdWU7ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNQVhcIiwgbWF4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtaW4pID49IHBhcnNlRmxvYXQobWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSAocGFyc2VGbG9hdChtYXgpIC0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTdGVwKSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1heCkgPD0gcGFyc2VGbG9hdChtaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IChwYXJzZUZsb2F0KG1pbikgKyBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG1pbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVJbnB1dCA9IHRoaXMubWluVmFsdWVJbnB1dCAhPT0gdGhpcy5taW5WYWx1ZSAmJiB0aGlzLm1pblZhbHVlICE9PSBudWxsID8gdGhpcy5taW5WYWx1ZSA6IHRoaXMubWluVmFsdWVJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVJbnB1dCA9IHRoaXMubWF4VmFsdWVJbnB1dCAhPT0gdGhpcy5tYXhWYWx1ZSAmJiB0aGlzLm1heFZhbHVlICE9PSBudWxsID8gdGhpcy5tYXhWYWx1ZSA6IHRoaXMubWF4VmFsdWVJbnB1dDtcblxuICAgICAgICAgICAgICAgICAgICB9LCA1MDApLFxuICAgICAgICAgICAgICAgIGluaXRFdmVudHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucmFuZ2VNaW4uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2UoZSwgJ21pbicpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJhbmdlTWF4LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJhbmdlKGUsICdtYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TWluTWF4KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVU1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzTWluID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzTWF4ID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWF4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzU3RlcCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51c1N0ZXA7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTUVUUklDXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljTWluID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0Lm1ldHJpY01pbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRyaWNNYXggPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubWV0cmljTWF4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY1N0ZXAgPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubWV0cmljU3RlcDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDdXJyZW50VW5pdHMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRDdXJyZW50VW5pdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgVU5JVFNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWluID0gdGhpcy5kYXRhLnNlbGVjdGVkVW5pdCA9PSAndXMnID8gdGhpcy51c01pbiA6IHRoaXMubWV0cmljTWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXggPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09ICd1cycgPyB0aGlzLnVzTWF4IDogdGhpcy5tZXRyaWNNYXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09ICd1cycgPyB0aGlzLnVzU3RlcCA6IHRoaXMubWV0cmljU3RlcDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0VW5pdExhYmVsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdW5pdExhYmVscyA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51bml0cyA/IEpTT04ucGFyc2UodGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVuaXRzKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVuaXQgPSB1bml0TGFiZWxzW3RoaXMuZGF0YS5zZWxlY3RlZFVuaXRdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFN0eWxlcygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSBgLS1hOiAke3RoaXMubWluVmFsdWVSYW5nZSA9PT0gbnVsbCA/IHRoaXMuY3VycmVudE1pbiA6IHRoaXMubWluVmFsdWVSYW5nZX07IC0tYjogJHt0aGlzLm1heFZhbHVlUmFuZ2UgPT09IG51bGwgPyB0aGlzLmN1cnJlbnRNYXggOiB0aGlzLm1heFZhbHVlUmFuZ2V9OyAtLW1pbjogJHt0aGlzLmN1cnJlbnRNaW59OyAtLW1heDogJHt0aGlzLmN1cnJlbnRNYXh9YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0TWluTWF4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0VW5pdExhYmVsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4geyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgc2xpZGVyIHBvc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09IFwidXNcIiA/IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51c01pbiA6IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5tZXRyaWNNaW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVSYW5nZSA9IHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQgPT0gXCJ1c1wiID8gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWF4IDogdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0Lm1ldHJpY01heDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbWluLW1heC1mbG93cmFuZ2UnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbnVsbCwgLy9maW5hbCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVSYW5nZTogbnVsbCwgLy8gbW9kZWwgZm9yIHJhbmdlIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZUlucHV0OiBudWxsLCAvLyBtb2RlbCBmb3IgaW5wdXQgZmllbGRcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWU6IG51bGwsIC8vZmluYWwgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlUmFuZ2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5wdXQ6IG51bGwsXG5cbiAgICAgICAgICAgICAgICAgICAgbWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBncG1NYXg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIGdwbVN0ZXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIG1oTWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBtaFN0ZXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIGxwbU1heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gbHBtU3RlcDogbnVsbCxcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWluOiAwLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVbml0OiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIG1lZGl1bTogbnVsbCwgLy9zZWxlY3RlZCBtZWFzdXJpbmcgbWVkaXVtXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBudWxsIC8vIGRpc3BsYXkgbmFtZSBmb3IgZmlsdGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJkYXRhLmZpbHRlcnNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlcyA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZXMuaW5kZXhPZihgJHt0aGlzLnR5cGV9TWluYCkgPiAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVzLmluZGV4T2YoYCR7dGhpcy50eXBlfU1heGApID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaW5kZXhPZignbWVhc3VyaW5nTWVkaXVtJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpdW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnbWVhc3VyaW5nTWVkaXVtJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaXVtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgIFwibWVkaXVtXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVbml0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsICBudWxsLCAnZmxvd1JhbmdlTWluJyk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCAgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImN1cnJlbnRVbml0XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VW5pdCAhPT0gXCJudWxsXCIgJiYgdGhpcy5jdXJyZW50VW5pdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdE1pbk1heCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC50eXBlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgZmluYWwgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBzbGlkZSByYW5nZSBwb3NpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLmN1cnJlbnRNYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5pdCcsdGhpcy5sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMubGFiZWwgIT09IG51bGwgPyB0aGlzLmxhYmVsIDogdGhpcy4kcmVmcy5yYW5nZU1pbiA/IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5sYWJlbCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbmFsJyx0aGlzLmxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyB1bml0IHNlbGVjdGVkLCByZW1vdmUgZmxvdyByYW5nZSBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsICdmbG93UmFuZ2VNYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtaW5WYWx1ZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgPT0gdGhpcy5jdXJyZW50TWluIHx8IHRoaXMubWluVmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZSkgPCBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgfHwgcGFyc2VGbG9hdCh0aGlzLm1pblZhbHVlKSA+IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5taW5WYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IHRoaXMubWluVmFsdWUgPT0gbnVsbCA/IHRoaXMubWluIDogdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhcIk1pblwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4VmFsdWUgPT0gdGhpcy5jdXJyZW50TWF4IHx8IHRoaXMubWF4VmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5tYXhWYWx1ZSkgPiBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgfHwgcGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXhWYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVSYW5nZSA9IHRoaXMubWF4VmFsdWUgPT0gbnVsbCA/IHRoaXMuY3VycmVudE1heCA6IHRoaXMubWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVJbnB1dCA9IHRoaXMubWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1heFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoXCJNYXhcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbGx5IHNlbGVjdGVkIHVzL21ldHJpYyB1bml0XG4gICAgICAgICAgICAgICAgXCJkYXRhLnNlbGVjdGVkVW5pdFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgY3VycmVudCBmbG93IHJhbmdlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVbml0ID0gXCJudWxsXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdy9oaWRlIG9wdGlvbnMgZm9yIHJlbGV2YW50IHVuaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdFVuaXRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVJhbmdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb24gdG8gcHJldmVudCBkcmFnZ2luZyBzbGlkZXIgYmV5b25kIHRoZSB2YWxpZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlUmFuZ2UpIDw9IHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZVJhbmdlID0gKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSArIHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3RlcCkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlUmFuZ2UgPT0gdGhpcy5jdXJyZW50TWF4ID8gbnVsbCA6IHRoaXMubWF4VmFsdWVSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVSYW5nZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uZGl0aW9uIHRvIHByZXZlbnQgZHJhZ2dpbmcgc2xpZGVyIGJleW9uZCB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSA+PSBwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IChwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZVJhbmdlID09IHRoaXMuY3VycmVudE1pbiA/IG51bGwgOiB0aGlzLm1pblZhbHVlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVyczogZGVib3VuY2UoZnVuY3Rpb24odHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidHlwZTpcIiwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke3R5cGV9ICR7dGhpcy5sYWJlbH06ICR7dHlwZSA9PSBcIk1pblwiID8gdGhpcy5taW5WYWx1ZSA6IHRoaXMubWF4VmFsdWV9ICR7dGhpcy5jdXJyZW50VW5pdH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUgPT0gXCJNaW5cIiA/IHRoaXMubWluVmFsdWUgOiB0aGlzLm1heFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYCR7dGhpcy50eXBlfSR7dHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1JhbmdlVHlwZTogdGhpcy5jdXJyZW50VW5pdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlUmFuZ2VGaWx0ZXInLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgaGFuZGxlUmFuZ2U6IGRlYm91bmNlKGZ1bmN0aW9uKGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF90ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaW4gPSB0eXBlID09IFwibWluXCIgPyBfdC52YWx1ZSA6IHRoaXMubWluVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0eXBlID09IFwibWF4XCIgPyBfdC52YWx1ZSA6IHRoaXMubWF4VmFsdWU7ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtaW4pID49IHBhcnNlRmxvYXQobWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IChwYXJzZUZsb2F0KG1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobWF4KSA8PSBwYXJzZUZsb2F0KG1pbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAocGFyc2VGbG9hdChtaW4pICsgcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTdGVwKSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWUgPSBtaW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZUlucHV0ICE9PSB0aGlzLm1pblZhbHVlICYmIHRoaXMubWluVmFsdWUgIT09IG51bGwgPyB0aGlzLm1pblZhbHVlIDogdGhpcy5taW5WYWx1ZUlucHV0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlSW5wdXQgIT09IHRoaXMubWF4VmFsdWUgJiYgdGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCA/IHRoaXMubWF4VmFsdWUgOiB0aGlzLm1heFZhbHVlSW5wdXQ7XG4gICAgICAgICAgICAgICAgfSw1MDApLFxuICAgICAgICAgICAgICAgIGluaXRFdmVudHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucmFuZ2VNaW4uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2UoZSwgJ21pbicpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJhbmdlTWF4LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJhbmdlKGUsICdtYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0T3B0aW9ucygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXQgPSBpdGVtLmRhdGFzZXQudW5pdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxvdyA9IGl0ZW0uZGF0YXNldC5mbG93VHlwZSA/IGl0ZW0uZGF0YXNldC5mbG93VHlwZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVkaXVtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgPT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pdCA9PSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA9PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbG93LmluY2x1ZGVzKHRoaXMubWVkaXVtKSAmJiB1bml0ID09IHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0U3R5bGVzKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlcyA9IGAtLWE6ICR7dGhpcy5taW5WYWx1ZVJhbmdlID09PSBudWxsID8gdGhpcy5jdXJyZW50TWluIDogdGhpcy5taW5WYWx1ZVJhbmdlfTsgLS1iOiAke3RoaXMubWF4VmFsdWVSYW5nZSA9PT0gbnVsbCA/IHRoaXMuY3VycmVudE1heCA6IHRoaXMubWF4VmFsdWVSYW5nZX07IC0tbWluOiAke3RoaXMuY3VycmVudE1pbn07IC0tbWF4OiAke3RoaXMuY3VycmVudE1heH1gO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0VW5pdChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVuaXQgPSBlLnRhcmdldC52YWx1ZSA9PSBcIm51bGxcIiA/IG51bGwgOiBlLnRhcmdldC52YWx1ZTsgLy9zZXQgc2VsZWN0ZWQgdW5pdFxuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudmFsdWUgIT09IFwibnVsbFwiICYmIGUudGFyZ2V0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UodGhpcy4kZWwucXVlcnlTZWxlY3Rvcihgb3B0aW9uW3ZhbHVlPVwiJHtlLnRhcmdldC52YWx1ZX1cIl1gKS5kYXRhc2V0LmZsb3dEYXRhKTsgLy9nZXQgbWluL21heCBkYXRhIGZvciBzZWxlY3RlZCB1bml0XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbWluL21heCBkYXRhIGZvciBjdXJyZW50IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluID0gZGF0YS5taW47XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXggPSBkYXRhLm1heDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pbiA9IGRhdGEubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IGRhdGEuc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0VW5pdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bml0ID0gdGhpcy5kYXRhLnNlbGVjdGVkVW5pdDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codW5pdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYG9wdGlvbmApLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0QXR0cmlidXRlKCd2YWx1ZScpID09IFwibnVsbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmRhdGFzZXQudW5pdFR5cGUgIT09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdFVuaXRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4gPyB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubGFiZWwgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdyYWRpby1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJtZWFzdXJpbmdNZWRpdW1cIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYWRpbzogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU3RhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCd1cGRhdGVGaWx0ZXJzJywgZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hlY2tTdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC52YWx1ZSA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSBpdGVtID8gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0udmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLiRyZWZzLmlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wcm9kdWN0LWNhdGFsb2ctJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLnByb2R1Y3QtY2F0YWxvZy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIG11bHRpSGFuZGxlUmFuZ2UoKTtcbiAgICBpZiAoY2F0YWxvZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNhdGFsb2cuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgcHJvZHVjdC1jYXRhbG9nLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBwcm9kdWN0Q2F0YWxvZ0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZHVjdENhdGFsb2c7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuY29uc3QgUHJvZHVjdHNBY2Nlc3NvcmllcyA9ICgpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0cy1hY2NfX3dyYXBwZXInKTtcblxuICAgIGxldCBwcm9kdWN0c0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3RzLWFjY2Vzc29yaWVzLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5hdGVkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcGVuVGV4dDogJycsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlVGV4dDogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsSXRlbXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvblRleHQ6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgaXNFeHBhbmRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9IHRoaXMuaXNFeHBhbmRlZCA/IHRoaXMuY29sbGFwc2VUZXh0IDogdGhpcy5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2luYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblRleHQgPSB0aGlzLiRyZWZzLm9wZW5CdXR0b24uZGF0YXNldC5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlVGV4dCA9IHRoaXMuJHJlZnMub3BlbkJ1dHRvbi5kYXRhc2V0LmNvbGxhcHNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLmNvbGxhcHNlVGV4dCA6IHRoaXMub3BlblRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDbGljaygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kcmVmcy5jb250ZW50Q29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJHJlZnMuY29udGVudElubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29udGVudCBhcmVhIGhlaWdodCB0byBjb250ZW50IGhlaWdodCB0byBwcmV2ZW50IHRyYW5zaXRpb25pbmcgZnJvbSBhdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGNvdW50c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxJdGVtcyA9IHRoaXMuJHJlZnMuaW5pdGlhbENvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLnByb2R1Y3QtY2FyZCcpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JlSXRlbXMgPSB0aGlzLiRyZWZzLmNvbnRlbnRJbm5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jYXJkJykubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLmluaXRpYWxJdGVtcyArIHRoaXMubW9yZUl0ZW1zO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGVkID0gdGhpcy5tb3JlSXRlbXMgPiAwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgYnV0dG9uIG9ubHkgaWYgcGFnaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblRleHQgPSB0aGlzLiRyZWZzLm9wZW5CdXR0b24uZGF0YXNldC5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlVGV4dCA9IHRoaXMuJHJlZnMub3BlbkJ1dHRvbi5kYXRhc2V0LmNvbGxhcHNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLmNvbGxhcHNlVGV4dCA6IHRoaXMub3BlblRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAucHJvZHVjdHMtYWNjZXNzb3JpZXMtJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoYC5wcm9kdWN0cy1hY2Nlc3Nvcmllcy0ke2lkfWAsIHRydWUpO1xuXG4gICAgfVxuXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHByb2R1Y3RzLWFjY2Vzc29yaWVzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBwcm9kdWN0c0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZHVjdHNBY2Nlc3NvcmllczsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHsgcXVpY2tMaW5rc01vZGFsIH0gZnJvbSBcIi4vbW9kYWxzXCI7XG5pbXBvcnQgc3RvcmUgZnJvbSBcIi4vc3RvcmVcIjtcblxuY29uc3QgcXVpY2tMaW5rcyA9ICgpID0+IHtcblxuICAgIGNvbnN0IGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWxpbmtzJyk7XG5cbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgcXVpY2tMaW5rc0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3F1aWNrLWxpbmtzJywge1xuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgncXVpY2tMaW5rcycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTW9kYWwoKSB7ICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtzID0gdGhpcy4kcmVmcy5saW5rcy5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWlja0xpbmtzTW9kYWwudGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWlja0xpbmtzTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWNrTGlua3NNb2RhbC5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tMaW5rc01vZGFsLmV2ZW50cyhsaW5rcylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAucXVpY2stbGlua3MtJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC5xdWljay1saW5rcy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmtzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHF1aWNrLWxpbmtzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBxdWlja0xpbmtzQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBxdWlja0xpbmtzOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCB7IGdldFVybFBhcmFtZXRlciB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgc2hvd2Rvd24gZnJvbSAnc2hvd2Rvd24nO1xuXG5jb25zdCBzZWFyY2hSZXN1bHRzID0gKCkgPT4ge1xuXG4gICAgbGV0IHNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0cycpO1xuICAgIFxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWFyY2gtcmVzdWx0cy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UXVlcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRJbnB1dFF1ZXJ5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZTogMSwgLy9jdXJyZW50IHBhZ2UgI1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzOiBbXSwgLy9ib29rbWFya2VkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NMYWJlbDogbnVsbCwgLy9sYWJlbCBmb3Igc2F2ZWQgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXM6IG51bGwsIC8vZm9yIGRlZXBsaW5raW5nIGluLWJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50czoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRZb3VNZWFuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1JldHVybmVkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdzZWFyY2gtcmVzdWx0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9yZWxhdGVkX3F1ZXN0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zb3VyY2VzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3NvdXJjZXNfZGVza3RvcDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zb3VyY2VzX2FsbDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9jaGF0X2RvY19pZDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3Jlc3BvbnNlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfZGlzY2xhaW1lcjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19haV9zdG9wOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX2ZpcnN0X2NhbGxfZmFpbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfc2Vjb25kX2NhbGxfZmFpbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfc2hvd19tb3JlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19zaG93X2RvY3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX2NsaWNrZWRfdW5saWtlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19jbGlja2VkX2xpa2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX3ByZWZpbmFsX3Jlc3VsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfZmluYWxfcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpU2VhcmNoRGVzY0hlaWdodDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXJlbmRlclNob3dNb3JlOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlTm9SZXN1bHRzT25GaXJzdExvYWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlTZWFyY2hFbmFibGVkOiB3aW5kb3cuYWlTZWFyY2hFbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFMMTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5kYXRhLnF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmRhdGEudG90YWxSZXN1bHRzIHx8IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRcIjogXCJIZXJvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRpdGxlXCI6IFwiU2VhcmNoIFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkhlcm8gLSBTZWFyY2ggUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiBcIjAxXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhTDI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHRoaXMuZGF0YS5xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyB8fCAwLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ1RyaWdnZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJlc3VsdHNSZXR1cm5lZCA/IFwidHJpZ2dlclwiIDogbnVsbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGxTYXZlZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWQgPSBzdG9yZS5zdGF0ZS5mYXZvcml0ZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsU2F2ZWQgPSBbLi4uYWxsU2F2ZWQsIC4uLnNhdmVkW3Byb3BdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSBhbGxTYXZlZC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtICE9PSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3VibWl0KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGEuZmlsdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTsgLy8gaGFuZGxlIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEucXVlcnlcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxIHdoZW4gcXVlcnkgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFJlc3VsdHModGhpcy5kYXRhLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSAnc2VhcmNoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSBlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUuY3VycmVudFRhcmdldC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLCBlbmNvZGVVUklDb21wb25lbnQoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja2VkXCIsZS50YXJnZXQuY2hlY2tlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSBcInNhdmVkRG9jdW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogdmFsdWUsIFwidHlwZVwiOiB0eXBlLCBcIm5hbWVcIjogZS5jdXJyZW50VGFyZ2V0Lm5hbWV9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IGNoZWNrZWQsIFwidHlwZVwiOiB0eXBlLCBcIm5hbWVcIjogZS5jdXJyZW50VGFyZ2V0Lm5hbWV9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiSU5ERVhcIiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHNwZWNpZmljIGZpbHRlclxuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtyZXR1cm47fTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlbW92ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGNsZWFycyBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH0sICBcbiAgICAgICAgICAgICAgICBhZGRMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dEZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWVsZC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gQUkgU0VBUkNIXG4gICAgICAgICAgICAgICAgYWlTaG93TW9yZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRcIjogXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImFjY29yZGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTaG93IE1vcmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIkFJIFNlYXJjaCBCb3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRXhwYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX3Nob3dfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhaVZpZXdBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhY2NvcmRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiVmlldyBBbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIkFJIFNlYXJjaCBCb3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRXhwYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc291cmNlcyA9IHRoaXMuZGF0YS5haV9zb3VyY2VzX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfZGVza3RvcCA9IHRoaXMuZGF0YS5haV9zb3VyY2VzX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19zaG93X2RvY3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWlGZWVkYmFja1VubGlrZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5haUZlZWRiYWNrQ2FsbCgxLCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFpRmVlZGJhY2tMaWtlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFpRmVlZGJhY2tDYWxsKDUsIDIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWlGZWVkYmFja0NhbGwocmF0aW5nLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiZWFjb25GZWVkYmFjayA9IFwiL2FwaS9iZWFjb25mZWVkYmFja1wiO1xuICAgICAgICAgICAgICAgICAgICAvLyB2YXIgYmVhY29uRmVlZGJhY2sgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25mZWVkYmFja1wiO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF91bmxpa2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19jbGlja2VkX2xpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF9saWtlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF91bmxpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLnBhdGNoKGJlYWNvbkZlZWRiYWNrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NJZDogdGhpcy5kYXRhLmFpX2NoYXRfZG9jX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nOiByYXRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWVkYmFjazogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImZlZWRiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRmVlZGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHJhdGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogcmF0aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVhY29uIGZlZWRiYWNrIHJlcXVlc3QgZXJyb3IgbWVzc2FnZTogXCIgKyByZXNwb25zZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5hYmxlIHRvIHN1Ym1pdCB1c2VyIGZlZWRiYWNrOiBcIiArIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBSSBTZWFyY2ggLSBhdm9pZCBzaG93aW5nIHRpcCBhbmQgZ2VuZXJhdGluZyBhdCBsb2FkaW5nIHdpdGhvdXQgYSBwcmV2aW91cyBzZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19haV9zdG9wID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnF1ZXJ5ID0gcXVlcnkgPyBxdWVyeSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzUmV0dXJuZWQgPSB0cnVlOyAvL3NldCB0aGlzIG9uY2UgYWZ0ZXIgaW5pdGlhbCByZXN1bHRzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNlYXJjaEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRRdWVyeSA9PSAndGVzdCBubyByZXN1bHRzJykgeyAvLyBGT1IgVEVTVElORyBPTkxZXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlVXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9zZWFyY2hSZXN1bHRzTm9uZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYCR7YmFzZVVybH0ke2Jhc2VVcmwuaW5kZXhPZignPycpID4gLTEgPyAnJyA6ICc/J31gO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvc2VhcmNoUmVzdWx0c1wiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWREb2N1bWVudHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAhPT0gdHJ1ZSAmJiBpdGVtLnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnNTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsdGVycy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmaWx0ZXJzU3RyKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXhpb3NQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxOiB0aGlzLmRhdGEuaW5wdXRRdWVyeSA/IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5ID8gdGhpcy5kYXRhLnF1ZXJ5IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNTdHIgPT0gXCJcIiA/IG51bGwgOiBmaWx0ZXJzU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpID8gc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zKCkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpID8gdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYXhpb3NQYXJhbXMgPSBheGlvc1BhcmFtcztcblxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGVybSA9IGF4aW9zUGFyYW1zLnE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy8gRGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljIGZyb20gZXBpc2VydmVyIGZpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwsIGRpZHlvdW1lYW5Db250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0c19faW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbiAmJiByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4ubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsbEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuLmZvckVhY2goZHltID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckVsZW1lbnQuaHJlZj1gP3E9JHtkeW19YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5pbm5lclRleHQgPSBkeW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5jaG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2VsZi5kaWRZb3VNZWFuKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbEVsZW1lbnRzLnB1c2goYW5jaG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsZWFyIG91dCBhbGwgcHJldmlvdXMgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwuZm9yRWFjaChwYXJlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yRWxlbWVudCA9IGFsbEVsZW1lbnRzW2ldLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpZFlvdU1lYW4oZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kKGFuY2hvckVsZW1lbnQpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGFsbEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbW1hRWwuaW5uZXJUZXh0ID0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFFbC5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiN3B4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwuZm9yRWFjaChlbCA9PiB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFwcGVuZChjb21tYUVsLmNsb25lTm9kZSh0cnVlKSk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBFbmQgb2YgZGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBzaXRlIHNlY3Rpb24gbGFiZWwgaW50byB0aGUgdGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udGl0bGUgJiYgaXRlbS5maWx0ZXJUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50aXRsZS5pbmRleE9mKFwiPHA+XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBgPHA+JHtpdGVtLnRpdGxlLnJlcGxhY2UoXCI8cD5cIiwgXCJcIil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyYXdUaXRsZVwiOiBpdGVtLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBgJHtpdGVtLnRpdGxlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmF3VGl0bGVcIjogaXRlbS50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCEocmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VsZi5kYXRhLmRpZFlvdU1lYW4gPSByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZGlkWW91TWVhbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLm1hbmFnZU5vUmVzdWx0c09uRmlyc3RMb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnJlc3VsdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5tYW5hZ2VOb1Jlc3VsdHNPbkZpcnN0TG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdUTSBUQUdHSU5HXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoVGVybSAmJiBzZWFyY2hUZXJtLmxlbmd0aCA+IDAgJiYgd2luZG93LmRhdGFMYXllciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXJbd2luZG93LmRhdGFMYXllci5sZW5ndGgtMV0uZXZlbnQgIT0gXCJzZWFyY2gtcmVzdWx0c1wiIC8vIGhhY2sgdG8gYXZvaWQgZG91YmxlIGVudHJ5LiAgdGhpcyBydW5zIHR3aWNlIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyAvLyBvbmx5IHB1c2ggaWYgdGhpcyBpcyBhIHF1ZXJ5LCBub3QgYSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJnbG9iYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IFwiU2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogc2VhcmNoVGVybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA/IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA6IG51bGw7IFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnRvdGFsUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY291bnRzIG9mIHNlYXJjaCByZXN1bHQgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5jb3VudHMgPSByZXNwb25zZS5kYXRhLmZpbHRlckNvdW50UmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50cmFja0lkID0gcmVzcG9uc2UuZGF0YS50cmFja0lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmFpU2VhcmNoRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5vbGRJbnB1dFF1ZXJ5ICE9IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUkgU0VBUkNIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21wdCA9IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhaVJlZnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWlEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJlYWNvbnJlZnMgPSBcIi9hcGkvYmVhY29uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJlYWNvbmRvY3MgPSBcIi9hcGkvYmVhY29uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGJlYWNvbnJlZnMgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25yZWZzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGJlYWNvbmRvY3MgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25kb2NzXCI7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX2ZpcnN0X2NhbGxfZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfc2Vjb25kX2NhbGxfZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfc2hvd19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19zaG93X2RvY3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX2NsaWNrZWRfdW5saWtlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19jbGlja2VkX2xpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX3ByZWZpbmFsX3Jlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfZmluYWxfcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnMgY2FsbCAoMSBlcXVhbHMgdG8gcmVmcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYmVhY29ucmVmcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdDogcHJvbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGFnZVRlbXBsYXRlXCI6IFwiU2VhcmNoUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogcHJvbXB0LnJlcGxhY2VBbGwoJ1xcXCInLCcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFJIFJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlc3BvbnNlVHlwZVwiOiBcIkFJIFJlc3BvbnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfcHJlZmluYWxfcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUmVmcyA9IHJlc3BvbnNlLmRhdGEuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0QUlSZWZzVmFsdWVzKGFpUmVmcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlYWNvbiByZWZzIHJlcXVlc3QgZXJyb3IgbWVzc2FnZTogXCIgKyByZXNwb25zZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGFnZVRlbXBsYXRlXCI6IFwiU2VhcmNoUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUkgRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogcHJvbXB0LnJlcGxhY2VBbGwoJ1xcXCInLCcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJTZWFyY2ggUmVzdWx0IG5vIEFJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfZmlyc3RfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlYWNvbiByZWZzIGF4aW9zIGVycm9yIG1lc3NhZ2U6IFwiICsgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93ICYmIHdpbmRvdy5kYXRhTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwYWdlVGVtcGxhdGVcIjogXCJTZWFyY2hSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUkgRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBwcm9tcHQucmVwbGFjZUFsbCgnXFxcIicsJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJTZWFyY2ggUmVzdWx0IG5vIEFJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfZmlyc3RfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2NzIGNhbGwgKDIgZXF1YWxzIHRvIGRvY3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGJlYWNvbmRvY3MsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfc2hvd19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuYWlfc3RhdHVzX3Nob3dfZG9jcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmFpX3N0YXR1c19maW5hbF9yZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlEb2NzID0gcmVzcG9uc2UuZGF0YS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRBSURvY3NWYWx1ZXMoYWlEb2NzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRcIjogXCJzZWFyY2gtcmVzdWx0cy1haVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhZ2VUZW1wbGF0ZVwiOiBcIlNlYXJjaFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlNlYXJjaCBSZXN1bHRzIEFJIEVycm9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHByb21wdC5yZXBsYWNlQWxsKCdcXFwiJywnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVzcG9uc2VUeXBlXCI6IFwiU2VhcmNoIFJlc3VsdCBubyBBSVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuYWlfc3RhdHVzX3NlY29uZF9jYWxsX2ZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVhY29uIGRvY3MgYXhpb3MgZXJyb3IgbWVzc2FnZTogXCIgKyBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwic2VhcmNoLXJlc3VsdHMtYWlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhZ2VUZW1wbGF0ZVwiOiBcIlNlYXJjaFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2ggUmVzdWx0cyBBSSBFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHByb21wdC5yZXBsYWNlQWxsKCdcXFwiJywnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlc3BvbnNlVHlwZVwiOiBcIlNlYXJjaCBSZXN1bHQgbm8gQUlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmFpX3N0YXR1c19zZWNvbmRfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm9sZElucHV0UXVlcnkgPSB0aGlzLmRhdGEuaW5wdXRRdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgc2V0QUlSZWZzVmFsdWVzKGFpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgc2F2ZSBkb2N1bWVudHMgYW5kIGRvY0lkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9jaGF0X2RvY19pZCA9IGFpLmNoYXRfZG9jX2lkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWkuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWkuc291cmNlc1tpXS5zb3VyY2VfdGl0bGUgPSBhaS5zb3VyY2VzW2ldLnNvdXJjZV90aXRsZS5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlcyA9IGFpLnNvdXJjZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc291cmNlcyA9IGFpLnNvdXJjZXMuc2xpY2UoMCwgKHNvdXJjZXMgPiAyID8gMiA6IHNvdXJjZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfZGVza3RvcCA9IGFpLnNvdXJjZXMuc2xpY2UoMCwgKHNvdXJjZXMgPiA0ID8gNCA6IHNvdXJjZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfYWxsID0gYWkuc291cmNlcztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgc2V0QUlEb2NzVmFsdWVzKGFpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoe2Rpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0czogdHJ1ZSwgb3BlbkxpbmtzSW5OZXdXaW5kb3c6IHRydWV9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3Jlc3BvbnNlID0gY29udmVydGVyLm1ha2VIdG1sKGFpLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX2Rpc2NsYWltZXIgPSBhaS5kaXNjbGFpbWVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfcmVsYXRlZF9xdWVzdGlvbnMgPSBhaS5yZWxhdGVkX3F1ZXN0aW9ucztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgbG9hZE1vcmUoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibG9hZCBtb3JlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5heGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZGF0YS5heGlvc1BhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5kYXRhLmF4aW9zUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNlYXJjaEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3NlYXJjaFJlc3VsdHMyXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZGF0YS5heGlvc1BhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGYuZGF0YS5yZXN1bHRzLnB1c2goLi4ucmVzcG9uc2UuZGF0YS5yZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnRpdGxlICYmIGl0ZW0uZmlsdGVyVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50aXRsZS5pbmRleE9mKFwiPHA+XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbSwgXCJ0aXRsZVwiOiBgPHA+JHtpdGVtLnRpdGxlLnJlcGxhY2UoXCI8cD5cIiwgXCJcIil9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbSwgXCJ0aXRsZVwiOiBgJHtpdGVtLnRpdGxlfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkxPQUQgTU9SRVwiLCByZXN1bHRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtzZWxmLmRhdGEucmVzdWx0cy5wdXNoKC4uLnJlc3VsdHMpfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWJtaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXJfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5KHRoaXMuZGF0YS5pbnB1dFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnF1ZXJ5ID0gdGhpcy5kYXRhLmlucHV0UXVlcnk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBsb2FkaW5nIGljb24gc3RhdGVzXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJlZmlsdGVyKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gZ2V0VXJsUGFyYW1ldGVyKCdmaWx0ZXJzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXNBcnJheSA9IHBhcmFtcy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGhhcyBmaWx0ZXIgcGFyYW1zLCBkdW1wIHRoZW0gaW50byBmaWx0ZXJzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt2YWx1ZT1cIiR7aXRlbX1cIl1gKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt2YWx1ZT1cIiR7aXRlbX1cIl1gKS5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA6IG51bGw7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYCR7aXRlbX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlkWW91TWVhbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RpZFlvdU1lYW4oJyxlLCcpJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWVyeSA9ICcsIHF1ZXJ5LCAnZSA9ICcsIGUsIGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlucHV0UXVlcnkgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUhpc3RvcnkocSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBhcmFtID0gXCI/cT1cIiArIGdldFVybFBhcmFtZXRlcigncScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShjdXJyZW50UGFyYW0sIFwiP3E9XCIrZW5jb2RlVVJJQ29tcG9uZW50KHEpKTtcbiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgJycsIG5ld1VybCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuYXZIaXN0b3J5KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSBnZXRVcmxQYXJhbWV0ZXIoJ3EnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBnZXRVcmxQYXJhbWV0ZXIoJ2ZpbHRlcnMnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0c19faW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcl9fZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaW5wdXRRdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL1xcKy9nLCBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9cXCsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgaXMgbW9iaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IHNhdmVkIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsbFNhdmVkID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZCA9IHN0b3JlLnN0YXRlLmZhdm9yaXRlcztcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxTYXZlZCA9IFsuLi5hbGxTYXZlZCwgLi4uc2F2ZWRbcHJvcF1dO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IGFsbFNhdmVkLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gIT09IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBmaWx0ZXJzIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IFxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gZ2V0VXJsUGFyYW1ldGVyKCdxJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVycyA9IGdldFVybFBhcmFtZXRlcignZmlsdGVycycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlucHV0UXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9cXCsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvXFwrL2csIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYXBpIGNhbGwgZm9yIHJlc3VsdHMgaWYgbm8gZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRhdGEuZmlsdGVyc1tdIHdpbGwgdXBkYXRlIGFuZCB0aGUgd2F0Y2hlciB3aWxsIHRyaWdnZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm90aGVyIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkgJiYgIWZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgZmlsdGVyIHVwZGF0ZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVGaWx0ZXJzJywgKGVsLCBlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdyZW1vdmUtZmlsdGVyJywgKGVsLCB2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3VibWl0KCk7XG5cblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFN1Ym1pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnNlYXJjaEJhck1vYmlsZS5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoQmFyRGVza3RvcC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzICYmIHRoaXMuJHJlZnMuYWlTZWFyY2hEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haVNlYXJjaERlc2NIZWlnaHQgPSB0aGlzLiRyZWZzLmFpU2VhcmNoRGVzYy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZWQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLiRyZWZzICYmIHNlbGYuJHJlZnMuYWlTZWFyY2hEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkaGVpZ2h0ID0gc2VsZi5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haVNlYXJjaERlc2NIZWlnaHQgPSBzZWxmLiRyZWZzLmFpU2VhcmNoRGVzYy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGhlaWdodCAhPSBzZWxmLmRhdGEuYWlTZWFyY2hEZXNjSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5yZXJlbmRlclNob3dNb3JlKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnY2hlY2tib3gtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnbmFtZScsICd0eXBlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU3RhdGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5jb3VudHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiRmlsdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXN1bHRDb3VudFwiOiB0aGlzLmNvdW50ID8gdGhpcy5jb3VudCA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZUZpbHRlcnMnLCBlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGVja1N0YXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBcIlNhdmVkJTIwZG9jdW1lbnRzJTIwb25seVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZWwubmFtZSkgPT0gdGhpcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGVsLnZhbHVlKSA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9IGl0ZW0gPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldENvdW50KCkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic2V0IGNvdW50XCIpXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbU5hbWUgPSB0aGlzLiRyZWZzLmlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRPYmogPSB0aGlzLmRhdGEuY291bnRzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZmlsdGVyVmFsdWUudG9TdHJpbmcoKSA9PT0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50T2JqID8gY291bnRPYmouY291bnQgOiAwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMubGFiZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy4kcmVmcy5pbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1N0YXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRDb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFJIFNlYXJjaFxuICAgICAgICAvLyBWdWUuY29tcG9uZW50KCdhaS1kZXNjJywge1xuICAgICAgICAvLyAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAvLyAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgLy8gICAgIDxkaXYgdi1odG1sPVwiZGF0YS5haV9yZXNwb25zZVwiIHJlZj1cImFpU2VhcmNoRGVzY1wiPjwvZGl2PlxuICAgICAgICAvLyAgICAgYCxcbiAgICAgICAgICAgIFxuICAgICAgICAvLyAgICAgdXBkYXRlZCgpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmRhdGEuYWlTZWFyY2hEZXNjSGVpZ2h0ID0gdGhpcy4kcmVmcy5haVNlYXJjaERlc2Mub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5kYXRhID0gXCIsdGhpcy5kYXRhKTtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLT4gb2Zmc2V0SGVpZ2h0ID0gJywgdGhpcy5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodCk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICBcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYWktZGlzY2xhaW1lcicsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2Pnt7ZGF0YS5haV9kaXNjbGFpbWVyfX08L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2FpLXJlbGF0ZWQtcXVlc3Rpb25zJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1xdWVzdGlvblwiIHYtZm9yPVwiaXRlbSBpbiBkYXRhLmFpX3JlbGF0ZWRfcXVlc3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgdi1vbjpjbGljaz1cInNlYXJjaFJlbGF0ZWRRdWVzdGlvbigkZXZlbnQpXCI+e3tpdGVtfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hSZWxhdGVkUXVlc3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaW5wdXRRdWVyeSA9IGUuY3VycmVudFRhcmdldC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBWdWUuY29tcG9uZW50KCdhaS1zb3VyY2VzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBkYXRhLmFpX3NvdXJjZXNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbS1pbWFnZVwiIHYtb246Y2xpY2s9XCJpbWFnZVJlZGlyZWN0KGl0ZW0uc291cmNlX3VybClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgOnNyYz1cIml0ZW0uc291cmNlX3RodW1ibmFpbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5zb3VyY2VfdGl0bGV9fSBbe3tpbmRleCArIDF9fV1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1zZWFyY2gtZG9jLWl0ZW1cIiB2LWZvcj1cIihpdGVtKSBpbiAoKE1hdGguY2VpbChkYXRhLmFpX3NvdXJjZXMubGVuZ3RoLzIpICogMikgLSBkYXRhLmFpX3NvdXJjZXMubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlZGlyZWN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYWktc291cmNlcy1kZXNrdG9wJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBkYXRhLmFpX3NvdXJjZXNfZGVza3RvcFwiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktc2VhcmNoLWRvYy1pdGVtLWltYWdlXCIgdi1vbjpjbGljaz1cImltYWdlUmVkaXJlY3QoaXRlbS5zb3VyY2VfdXJsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyA6c3JjPVwiaXRlbS5zb3VyY2VfdGh1bWJuYWlsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNvdXJjZV90aXRsZX19IFt7e2luZGV4ICsgMX19XVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0pIGluICgoTWF0aC5jZWlsKGRhdGEuYWlfc291cmNlc19kZXNrdG9wLmxlbmd0aC80KSAqIDQpIC0gZGF0YS5haV9zb3VyY2VzX2Rlc2t0b3AubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlZGlyZWN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHJlc3VsdHMgbGlzdFxuICAgICAgICBWdWUuY29tcG9uZW50KCdyZXN1bHRzLWxpc3QnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2lzTG9hZGluZyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c19fY2FyZHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxyZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiAgOmtleT1cImluZGV4XCIgOmRhdGE9XCJkYXRhXCIgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdyZXN1bHRzLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2NvbnRlbnQnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRUeXBlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGw6IG51bGwsIC8vaXMgXCJzZWUgYWxsXCIgZmVhdHVyZSBlbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxPcGVuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgIG1vcmVDb250ZW50OiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsT3BlblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBcImhpZ2hsaWdodGVkQ29weVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmRhdGEucXVlcnksIFwiZ2lcIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VUZXh0ID0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybk1hdGNoID0gdGhpcy5jb250ZW50LmRlc2NyaXB0aW9uLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuTWF0Y2ggIT09IG51bGwgJiYgcGF0dGVybk1hdGNoLmxlbmd0aCA+IDApIHsgcmVwbGFjZVRleHQgPSBwYXR0ZXJuTWF0Y2hbMF19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZGVzY3JpcHRpb24ucmVwbGFjZShyZWdleCxgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2NvcHktLWhpZ2hsaWdodGVkXCI+JHtyZXBsYWNlVGV4dH08L3NwYW4+YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiaGlnaGxpZ2h0ZWRUaXRsZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmRhdGEucXVlcnksIFwiZ2lcIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlRFU1QgVEVTVFwiLCB0aGlzLmNvbnRlbnQudGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VUZXh0ID0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybk1hdGNoID0gdGhpcy5jb250ZW50LnRpdGxlLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuTWF0Y2ggIT09IG51bGwgJiYgcGF0dGVybk1hdGNoLmxlbmd0aCA+IDApIHsgcmVwbGFjZVRleHQgPSBwYXR0ZXJuTWF0Y2hbMF19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudGl0bGUucmVwbGFjZShyZWdleCxgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNhcmRfX3RpdGxlLS1oaWdobGlnaHRlZFwiPiR7cmVwbGFjZVRleHR9PC9zcGFuPmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50aXRsZTsgLy8gZmFsbGJhY2ssIGRlZmF1bHQgdG8ganVzdCB0aXRsZVxuICAgICAgICAgICAgICAgIH0sICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFwibmV3VGFiTGlua1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5saW5rVXJsID8gdGhpcy5jb250ZW50LmxpbmtVcmwucmVwbGFjZSgnZG93bmxvYWQ9dHJ1ZScsICdkb3dubG9hZD1mYWxzZScpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiaHJlZlRhcmdldFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3VGFiTGluaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3VGFiTGluay5pbmNsdWRlcygnZG93bmxvYWQ9ZmFsc2UnKSA/ICdfYmxhbmsnIDogJ19zZWxmJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJ0cmlnZ2VyXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHJhY2thYmxlO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBwcm9wIGluIHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmICh3aW5kb3cuc2VhcmNoRmlsdGVyVmFsdWVzW3Byb3BdID09IHRoaXMuY29udGVudC5maWx0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRyYWNrYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrYWJsZSA/IFwiY2xpY2tcIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInRhZ2dpbmdNZXRhXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YTsgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMucmVzdWx0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3dpdGNoICh0aGlzLnJlc3VsdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjYXNlICdkb2N1bWVudGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWV0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInByb2R1Y3RMaW5lXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjYXNlICdzb2Z0d2FyZSc6XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1ldGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhcHBcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwicHJvZHVjdExpbmVcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNhc2UgJ3Byb2R1Y3RzJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWV0YSA9IHsgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZXZpZXcgQ2FyZFwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJwcm9kdWN0TGluZVwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmNvbnRlbnQucmF3VGl0bGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhID8gSlNPTi5zdHJpbmdpZnkobWV0YSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZFwiPlxuICAgICAgICAgICAgPGEgOmhyZWY9XCJuZXdUYWJMaW5rXCIgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2xpbmtcIiA6dGFyZ2V0PVwiaHJlZlRhcmdldFwiIDpkYXRhLXRhZy10cmlnZ2VyPVwidHJpZ2dlclwiIDpkYXRhLXRhZy1tZXRhPVwidGFnZ2luZ01ldGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0cy1jYXJkX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX3Jvd1wiIDpjbGFzcz1cIntpc3Byb2R1Y3Q6IGNvbnRlbnQuaXNQcm9kdWN0fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fYXJlYSByZXN1bHRzLWNhcmRfX2FyZWEtaW1hZ2VcIiB2LWlmPVwiY29udGVudC5pbWFnZVVybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2ltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJjb250ZW50LmltYWdlVXJsXCIgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2ltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2FyZWEgcmVzdWx0cy1jYXJkX19hcmVhLWNvcHlcIj5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0cy1jYXJkX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fdGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIiB2LWh0bWw9XCJoaWdobGlnaHRlZFRpdGxlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fdGl0bGUtbW9yZVwiIHYtaWY9XCJzZWVBbGwgJiYgc2VlQWxsT3BlblwiIHYtaHRtbD1cIm1vcmVDb250ZW50XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHYtb246Y2xpY2sucHJldmVudD1cInRvZ2dsZVNlZUFsbFwiIHYtaWY9XCJzZWVBbGxcIiB2LWh0bWw9XCJzZWVBbGxMYWJlbFwiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fY29weVwiIHYtaHRtbD1cImhpZ2hsaWdodGVkQ29weVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gd2luZG93LnNlYXJjaEZpbHRlclZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXNbcHJvcF0gPT0gdGhpcy5jb250ZW50LmZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRUeXBlID0gcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSR7bW9yZURldGFpbHMgPT0gXCJcIiA/ICcnIDogJywnfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja0lkID0gc2VsZi5kYXRhLnRyYWNrSWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRJZCA9IHNlbGYuY29udGVudC5oaXRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9IHNlbGYuZGF0YS5xdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwaS9TZWFyY2hIaXQ/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9Jmg9JHtlbmNvZGVVUklDb21wb25lbnQoaGl0SWQpfSZ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNrSWQpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxBbmNob3JzID0gc2VsZi4kZWwucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsQW5jaG9ycy5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIi0tPiBUcmFja2luZyByZXNwb25zZTogXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWxlY3RlZEZpbHRlcnMnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c19fc2VsZWN0ZWQtZmlsdGVyc1wiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsXCIgdi1mb3I9XCJmaWx0ZXIgaW4gZGF0YS5maWx0ZXJzXCIgOmtleT1cImZpbHRlci52YWx1ZVwiIDpkYXRhLXZhbHVlPVwiZmlsdGVyLnZhbHVlXCIgOmRhdGEtdHlwZT1cImZpbHRlci50eXBlXCIgdi1vbjpjbGljaz1cInJlbW92ZUZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItbGFiZWxfX2ljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItbGFiZWxfX3RleHRcIj57e2ZpbHRlci5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCB2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2RlZmF1bHRvcGVuJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46ICh0aGlzLmRlZmF1bHRvcGVuID8gdHJ1ZSA6IGZhbHNlKSwgLy9pcyB0aGUgYWNjb3JkaW9uIG9wZW5cbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsVHlwZXNUZXh0OiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RGaWx0ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5wcm9kdWN0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xpY2soKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQWNjb3JkaW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHRvZ2dsZUFjY29yZGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kcmVmcy5vdXRlckNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRyZWZzLmlubmVyQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2dnbGVTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsVHlwZXNUZXh0ID0gIXRoaXMuc2VlQWxsVHlwZXNUZXh0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zZWFyY2gtcmVzdWx0cy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuc2VhcmNoLXJlc3VsdHMtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2VhcmNoLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHNlYXJjaC1yZXN1bHRzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXMgPSB7XG4gICAgLy8gICAgIGRvY3VtZW50YXRpb246IDE1NyxcbiAgICAvLyAgICAgc29mdHdhcmU6IDU5LFxuICAgIC8vICAgICBwcm9kdWN0czogMTU4XG4gICAgLy8gfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlYXJjaFJlc3VsdHM7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xyXG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XHJcbmltcG9ydCB7IHZpZGVvTW9kYWwgfSBmcm9tICcuL21vZGFscyc7XHJcblxyXG5cclxuXHJcbmNvbnN0IFNsaWRlc2hvdyA9ICgpID0+IHtcclxuICAgIGNvbnN0IHNsaWRlc2hvd0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NsaWRlc2hvdy1zbGlkZXInKVxyXG4gICAgaWYgKCFzbGlkZXNob3dFbCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2xpZGVzRWwgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGVyLXNsaWRlcyAuc2xpZGUnKTtcclxuXHJcbiAgICBjb25zdCBTbGlkZXNob3dDb25zdHJ1Y3RvciA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYWN0aXZlU2xpZGUgPSAxO1xyXG4gICAgICAgIGNvbnN0IGFycm93TCA9IHNsaWRlc2hvd0VsLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXItY29udHJvbHMgLmFycm93LkwnKTtcclxuICAgICAgICBjb25zdCBhcnJvd1IgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyLWNvbnRyb2xzIC5hcnJvdy5SJyk7XHJcbiAgICAgICAgY29uc3QgcGF1c2VQbGF5ID0gc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scyAuY2lyY3VsYXItcHJvZ3Jlc3MnKTtcclxuICAgICAgICBjb25zdCB0b3RhbFNsaWRlcyA9IHNsaWRlc0VsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBzbGlkZXNWaWRlb3MgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpO1xyXG4gICAgICAgIGNvbnN0IG1vZGFsVHJpZ2dlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudmlkZW8tcGxheWVyLWxpbmsgYnV0dG9uJylcclxuXHJcbiAgICAgICAgY29uc3QgY2lyY2xlID0gc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scyBjaXJjbGUuZmcnKTtcclxuICAgICAgICBjb25zdCBjaXJjbGVTaXplID0gMzA7IC8vIHRoaXMgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2Ygc3ZnIChzaG91bGQgYmUgYSBzcXVhcmUgdGhhdCBmaXRzIHRoZSBjaXJjbGUpXHJcbiAgICAgICAgY29uc3Qgc3Ryb2tlVyA9IDJcclxuICAgICAgICBjb25zdCByYWRpdXMgPSAoY2lyY2xlU2l6ZSAtIHN0cm9rZVcpIC8gMlxyXG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSByYWRpdXMgKiBNYXRoLlBJICogMjtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4VGltZSA9IDEwMDAwOyAvLyBpbiBtaWxpc2Vjb25kc1xyXG4gICAgICAgIGNvbnN0IHRpbWVzUGVyU2VjID0gMTAwXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHNsaWRlckludGVydmFsICAgICAgPSBudWxsXHJcbiAgICAgICAgbGV0IHRpbWVFbGFwc2VkICAgICAgICAgPSAwXHJcbiAgICAgICAgbGV0IGlzQXV0b1BsYXlpbmcgICAgICAgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwbGF5aW5nQmVmb3JNb2RhbCAgID0gdHJ1ZTtcclxuICAgICAgICBsZXQgcmVzaXplVGltZW91dCAgICAgICA9IG51bGw7XHJcbiAgICAgICAgbGV0IGxhc3RTY3JlZW5XICAgICAgICAgPSAwO1xyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdXBkYXRlIG1vYmlsZS9kZXNrdG9wIHZpZGVvIGJhY2tncm91bmQgaWYgYW55XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVZpZGVvVXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoc2xpZGVzVmlkZW9zLmxlbmd0aCA+IDAgJiYgd2luZG93LmlubmVyV2lkdGggICE9IGxhc3RTY3JlZW5XKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhc3RTY3JlZW5XID0gd2luZG93LmlubmVyV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gbWFrZSBzdXJlIG9ubHkgd2lkdGggaXMgY2hhbmdpbmcuIG1vYmlsZSBkZXZpY2VzIGFkIGEgbWVudSB0aGF0IG1ha2VzIHRoZSB3aW5kb3cgc21hbGxlciB2ZXJ0aWNhbGx5XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gOTAwKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNWaWRlb3MubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IHNsaWRlc1ZpZGVvc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdmlkLmRhdGFzZXQubW9iO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsICE9IFwibm9uZVwiKSB7IHZpZC5zcmMgPSB1cmwgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNWaWRlb3MubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IHNsaWRlc1ZpZGVvc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdmlkLmRhdGFzZXQuZGVzaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkLnNyYyA9IHVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBzdG9wIHZpZGVvc1xyXG4gICAgICAgIGNvbnN0IHBsYXlBbGxWaWRzID0gZnVuY3Rpb24gKHdpbGxQbGF5KSB7XHJcbiAgICAgICAgICAgIGxldCB2aWRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKVxyXG5cclxuICAgICAgICAgICAgaWYgKHdpbGxQbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsgdmlkc1tpXS5wbGF5KCk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlkcy5sZW5ndGg7IGkrKykgeyB2aWRzW2ldLnBhdXNlKCk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHZpZGVvIGNvbnRyb2xzIGZvciB3aGVuIHBvcHVwIG9wZW5zL2Nsb3Nlc1xyXG4gICAgICAgIGlmIChzbGlkZXNWaWRlb3MubGVuZ3RoID4gMCAmJiBtb2RhbFRyaWdnZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gbW9kYWwgdHJpZ2dlciBidXR0b25zIGluIHNsaWRlc2hvdyBzdG9wIGFsbCB2aWRlb3NcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RhbFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBtb2RhbFRyaWdnZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXlBbGxWaWRzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpc0F1dG9QbGF5aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnRlcnZhbChpc0F1dG9QbGF5aW5nKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyogbm90IG5lZWRlZCBiZWNhdXNlIHRoZSBvYnNlcnZlciBzZWVzIHdoZW4gbW9kYWwgZGlzYXBlYXJzIGluc3RlYWQgb2Ygd2hlbiBjbG9zZSBidXR0b24gaXMgcHJlc3NlZCAqL1xyXG4gICAgICAgICAgICAvLyB0aGUgbW9kYWwgYnV0dG9ucyBzaG91bGQgc3RhcnQgdGhlIHZpZGVvcyBhZ2Fpbi4gYnV0IG1vZGFsIGlzIGNyZWF0ZWQgZHluYW1pY2FsbHkgc28gd2UgbmVlZCB0aGlzOlxyXG4gICAgICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGUudGFyZ2V0LmNsb3Nlc3QoXCIuYm1pLW1vZGFsX19jbG9zZVwiKTsgIFxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgbW9kYWxXaW5kb3cgPSBlLnRhcmdldC5jbG9zZXN0KFwiLnZtLS1vdmVybGF5XCIpOyAgXHJcbiAgICAgICAgICAgIC8vICAgICBpZihtb2RhbFdpbmRvdyB8fCBjbG9zZUJ1dHRvbilcclxuICAgICAgICAgICAgLy8gICAgICAgICB7cGxheUFsbFZpZHModHJ1ZSk7fVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1vZGFsIG9ic2VydmVyXHJcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyQ29uZmlnID0geyBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUgfVxyXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbkxpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoZWRUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbW9kYWxzLWNvbnRhaW5lciAudm0tLWNvbnRhaW5lcicpXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZFRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5QWxsVmlkcyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5aW5nQmVmb3JNb2RhbCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdXRvUGxheWluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzbGlkZXJJbnRlcnZhbCk7ICAvLyBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRvZ2dsZS4uLiBvciBtdWx0aXBsZSBpbnRlcnZhbHMgd2lsbCBiZSBhZGRlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnRlcnZhbCh0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCBvYnNlcnZlckNvbmZpZyk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gc2hvdyBwZXJjZW50IHByb2dyZXNzXHJcbiAgICAgICAgY29uc3QgdXBkYXRlUHJvZ3Jlc3MgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRpbWVFbGFwc2VkICs9IHRpbWVzUGVyU2VjO1xyXG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWVFbGFwc2VkIC8gbWF4VGltZTtcclxuICAgICAgICAgICAgY29uc3QgZGFzaCA9IHByb2dyZXNzICogY2lyY3VtZmVyZW5jZVxyXG4gICAgICAgICAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWRhc2hhcnJheVwiLCBgJHtkYXNofSAgJHtjaXJjdW1mZXJlbmNlIC0gZGFzaH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcyA+PSAxKSB7IHNob3dTbGlkZSgxKSB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdG9nZ2xlIGludGVydmFsXHJcbiAgICAgICAgY29uc3QgdG9nZ2xlSW50ZXJ2YWwgPSBmdW5jdGlvbiAoaXNPbikge1xyXG4gICAgICAgICAgICBpZiAoaXNPbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgc2xpZGVySW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyB1cGRhdGVQcm9ncmVzcygpIH0sIHRpbWVzUGVyU2VjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHsgY2xlYXJJbnRlcnZhbChzbGlkZXJJbnRlcnZhbCkgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGNhbGxlZCBvbiBhcnJvdyBjbGljayBhbmQgd2l0aCBhdXRvIHBsYXlcclxuICAgICAgICBjb25zdCBzaG93U2xpZGUgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRpbWVFbGFwc2VkID0gMFxyXG4gICAgICAgICAgICBhY3RpdmVTbGlkZSArPSBkaXJlY3Rpb25cclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVTbGlkZSA+IHRvdGFsU2xpZGVzKSB7IGFjdGl2ZVNsaWRlID0gMSB9XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVTbGlkZSA8IDEpIHsgYWN0aXZlU2xpZGUgPSB0b3RhbFNsaWRlcyB9XHJcblxyXG4gICAgICAgICAgICBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yKCcuc2xpZGUuYWN0aXZlLXNsaWRlJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlLXNsaWRlJylcclxuICAgICAgICAgICAgc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcihgLnNsaWRlOm50aC1jaGlsZCgke2FjdGl2ZVNsaWRlfSlgKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUtc2xpZGUnKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gYXJyb3dzXHJcbiAgICAgICAgYXJyb3dMLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHNob3dTbGlkZSgtMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXJyb3dSLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHNob3dTbGlkZSgxKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBhdXNlUGxheS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBwYXVzZVBsYXkuY2xhc3NMaXN0LnRvZ2dsZSgncGxheWluZycpXHJcbiAgICAgICAgICAgIGlzQXV0b1BsYXlpbmcgPSAhaXNBdXRvUGxheWluZ1xyXG4gICAgICAgICAgICB0b2dnbGVJbnRlcnZhbChpc0F1dG9QbGF5aW5nKTtcclxuXHJcbiAgICAgICAgICAgIHBsYXlpbmdCZWZvck1vZGFsID0gaXNBdXRvUGxheWluZzsgLy8gdXNlZCB3aGVuIGNsb3NpbmcgbW9kYWxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHN0YXJ0IGludGVydmFsIGFzIHNvb24gYXMgc2NyaXB0IGxvYWRzXHJcbiAgICAgICAgdG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdXBkYXRlIG1vYmlsZSB2aWRlb3MgaWYgdGhlcmUgYXJlIGFueVxyXG4gICAgICAgIHJlc3BvbnNpdmVWaWRlb1VwZGF0ZSgpO1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmVzaXplVGltZW91dCA9IHNldFRpbWVvdXQocmVzcG9uc2l2ZVZpZGVvVXBkYXRlLCAxMDAwKTsgICAgICAgICAgICAgLy8gYWRkIHNob3J0IGRlbGF5IHNvIHRoYXQgdmlkZW8gaXMgb25seSB1cGRhdGVkIHdoZW4gdXNlciBzdG9wcyByZXNpemluZzsgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChzbGlkZXNob3dFbCkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2xpZGUgc3RhcnQgc2xpZGVzaG93IGF1dG8gcGxheSBhbmQgaXRzIHRpbWVyXHJcbiAgICAgICAgaWYgKHNsaWRlc0VsLmxlbmd0aCA+IDEpIHsgU2xpZGVzaG93Q29uc3RydWN0b3IoKTsgfVxyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGRvbnQgc3RhcnQgdGhlIHRpbWVyIGFuZCBoaWRlIHRoZSBjb250cm9scyBmb3IgbW92aW5nL3BcclxuICAgICAgICBlbHNlIHsgc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scycpLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTsgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTbGlkZXNob3c7XHJcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQgeyByZWxlYXNlTm90ZXNNb2RhbCB9IGZyb20gXCIuL21vZGFsc1wiO1xuXG5jb25zdCBzb2Z0d2FyZUNhcmQgPSAoKSA9PiB7XG4gICAgVnVlLnVzZShWTW9kYWwpO1xuICAgIGxldCBzb2Z0d2FyZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zb2Z0d2FyZC1jYXJkLS1ub2ZpbHRlcicpO1xuXG4gICAgbGV0IHNvZnR3YXJlQ2FyZENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLWNhcmQtc2luZ2xlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXNbYCR7dGhpcy50eXBlfWBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlRmF2b3JpdGVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlTW9kYWwoKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWxlYXNlTm90ZXMgPSB0aGlzLiRyZWZzLnJlbGVhc2VOb3Rlcy5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC50ZW1wbGF0ZShyZWxlYXNlTm90ZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU5vdGVzTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc01vZGFsLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBcInNvZnR3YXJlSWRcIjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zb2Z0d2FyZS1jYXJkLS1ub2ZpbHRlci0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnNvZnR3YXJlLWNhcmQtLW5vZmlsdGVyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNvZnR3YXJlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc29mdHdhcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgc29mdHdhcmUtY2FyZC0tbm9maWx0ZXItJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHNvZnR3YXJlQ2FyZENvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgc29mdHdhcmVDYXJkOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7cmVsZWFzZU5vdGVzTW9kYWx9IGZyb20gJy4vbW9kYWxzJztcbmltcG9ydCB7IEFjY29yZGlvbiwgU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LCBDaGVja2JveCwgUGFnaW5hdGlvbiB9IGZyb20gJy4vZmlsdGVyLWNvbXBvbmVudHMnO1xuXG5jb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKTtcbn1cblxuY29uc3QgU29mdHdhcmUgPSAoKSA9PiB7XG5cbiAgICBsZXQgc29mdHdhcmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc29mdHdhcmUnKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBjb25zdCBzb2Z0d2FyZUNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzOiBbXSwgLy9ib29rbWFya2VkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NMYWJlbDogbnVsbCwgLy9sYWJlbCBmb3Igc2F2ZWQgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzT25seTogbnVsbCwgLy9pcyBzYXZlZCBkb2NzIG9ubHkgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmU6IHN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc0xhYmVsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdzb2Z0d2FyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdhcHAnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkWzBdID09IFwiXCIgPyBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZVJhbmdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAxLSR7dGhpcy5kYXRhLnNob3duUmVzdWx0c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZGF0YS50b3RhbFJlc3VsdHMgLSB0aGlzLmRhdGEuc2hvd25SZXN1bHRzICsgMX0tJHt0aGlzLmRhdGEudG90YWxSZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsodGhpcy5kYXRhLnNob3duUmVzdWx0cyAqICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgLSAxKSkgKyAxfS0ke3RoaXMuZGF0YS5zaG93blJlc3VsdHMgKiB0aGlzLmRhdGEuY3VycmVudFBhZ2V9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd25SZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaXRlTGFuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHRoaXMuc2F2ZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNhdmVkIG9ubHkgZmlsdGVyIGlmIG5vIHNhdmVkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNhdmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZignc2F2ZWREb3dubG9hZHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzTW9iaWxlID0gdGhpcy5jb21wdXRlZElzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5jb21wdXRlZElzTW9iaWxlID8gdHJ1ZSA6IHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7IC8vIGhhbmRsZSBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTsgLy8gaGFuZGxlIGhpc3RvcnkgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGlmIHByb2R1Y3RsaW5lIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnR5cGUgPT0gXCJwcm9kdWN0bGluZVwiO1xuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZFNvZnR3YXJlXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3NPbmx5ID0gc2F2ZWRPbmx5ID8gc2F2ZWRPbmx5LnZhbHVlIDogbnVsbDtcblxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVByb2R1Y3RzKHByb2R1Y3RMaW5lcyk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBub3QgYnJhbmQgc2VsZWN0ZWQsIGVtcHR5IHRoZSBwcm9kdWN0cyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByb2R1Y3RzID0gW107IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHByb2R1Y3QgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcih0aGlzLmRhdGEuY2xhc3MsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5jdXJyZW50UGFnZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS50b3RhbFJlc3VsdHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVGaWx0ZXJzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzYWZlU3RyaW5nKGUuY3VycmVudFRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGUuY3VycmVudFRhcmdldC5wYXJlbnROb2RlLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSBlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsvL3Jlc2V0IHBhZ2UgdG8gMSB3aGVuIG5ldyBmaWx0ZXJzIGFkZGVkL3JlbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlXCIsIHNhZmVTdHJpbmcoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja2VkXCIsZS50YXJnZXQuY2hlY2tlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSBcInNhdmVkU29mdHdhcmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogY2hlY2tlZCwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgc3BlY2lmaWMgZmlsdGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlRmlsdGVyKGVsLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGNsZWFycyBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgIH0sICBcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZVByb2R1Y3RzKHByb2R1Y3RMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdExpbmVTdHIgPSBkZWNvZGVVUklDb21wb25lbnQocHJvZHVjdExpbmVzLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGJyYW5kU3RyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cuc29mdHdhcmVBUElVcmw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgL2FwaS9HZXRTb2Z0d2FyZVByb2R1Y3RzQnlCcmFuZGA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9wcm9kdWN0c0J5QnJhbmRcIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kOiBwcm9kdWN0TGluZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5zaXRlTGFuZyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wcm9kdWN0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZGlkWW91TWVhbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlkWW91TWVhbicsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWVyeSA9ICcscXVlcnksICdlID0gJywgZSwgZS50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnVwZGF0ZUhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQnKS52YWx1ZSA9IHF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJhcGkvZG9jdW1lbnRzP1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeSA9PT0gbnVsbCA/IG51bGwgOiBxdWVyeSA/IHF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBxdWVyeSA/IDEgOiB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXJsKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNvZnR3YXJlQVBJVXJsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYCR7YmFzZVVybH0ke2Jhc2VVcmwuaW5kZXhPZignPycpID4gLTEgPyAnJyA6ICc/J31gO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvc29mdHdhcmVcIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmxUZXN0ID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvZG9jdW1lbnRhdGlvblRlc3RcIjsgLy9mcm9tIGpzb24tc2VydmVyXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWRTb2Z0d2FyZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3QgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RMaW5lID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZFR5cGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmcucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInByb2R1Y3RsaW5lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RMaW5lLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb3dubG9hZFR5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUeXBlLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RTdHIgPSBkZWNvZGVVUklDb21wb25lbnQocHJvZHVjdC5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IGRlY29kZVVSSUNvbXBvbmVudChsYW5nLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZVN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0TGluZS5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRUeXBlU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvd25sb2FkVHlwZS5qb2luKCd8JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHE6IHRoaXMuZGF0YS5xdWVyeSA/IHRoaXMuZGF0YS5xdWVyeSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykgPT0gXCJcIiA/IG51bGwgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5jaGFyQXQoMCkgPT0gXCIsXCIgPyB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5zbGljZSgxKSA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLCAvL0BUT0RPIG1ha2UgdGhpcyBsZXNzIGluc2FuZS4gU2VuZCBOVUxMIGlmIGVtcHR5IHN0cmluZy4gUmVtb3ZlIGxlYWRpbmcgY29tbWEgaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IHByb2R1Y3RTdHIgPT0gXCJcIiA/IG51bGwgOiBwcm9kdWN0U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmdTdHIgPT0gXCJcIiA/IG51bGwgOiBsYW5nU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdExpbmU6IHByb2R1Y3RMaW5lU3RyID09IFwiXCIgPyBudWxsIDogcHJvZHVjdExpbmVTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFR5cGU6IGRvd25sb2FkVHlwZVN0ciA9PSBcIlwiID8gbnVsbCA6IGRvd25sb2FkVHlwZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkU29mdHdhcmU6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5zaXRlTGFuZyA/IHRoaXMuc2l0ZUxhbmcgOiB3aW5kb3cuY3VycmVudEN1bHR1cmVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGF4aW9zUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlYXJjaFRlcm0gPSB0aGlzLmRhdGEucXVlcnk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIERpZCB5b3UgbWVhbiBxdWVyeSBsb2dpYyBmcm9tIGVwaXNlcnZlciBmaW5kOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwsIGRpZHlvdW1lYW5Db250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbiAmJiByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4ubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuLmZvckVhY2goZHltID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5ocmVmPVwiI1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5pbm5lclRleHQgPSBkeW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWRZb3VNZWFuKGFuY2hvckVsZW1lbnQuaW5uZXJUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRWxlbWVudHMucHVzaChhbmNob3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGVhciBvdXQgYWxsIHByZXZpb3VzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnICAtLT4gQXBwZW5kaW5nIHRvICcsIGRpZHlvdW1lYW5FbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpPGFsbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwuZm9yRWFjaChlbCA9PiBlbC5hcHBlbmQoYWxsRWxlbWVudHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGFsbEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21tYUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hRWwuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjdweFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IGVsLmFwcGVuZChjb21tYUVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaG93JykpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gRW5kIG9mIGRpZCB5b3UgbWVhbiBxdWVyeSBsb2dpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR1RNIFRBR0dJTkdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoVGVybSAmJiBzZWFyY2hUZXJtLmxlbmd0aCA+IDAgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXJbd2luZG93LmRhdGFMYXllci5sZW5ndGgtMV0uZXZlbnQgIT0gXCJzZWFyY2gtcmVzdWx0c1wiIC8vIGhhY2sgdG8gYXZvaWQgZG91YmxlIGVudHJ5LiAgdGhpcyBydW5zIHR3aWNlIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsgLy8gb25seSBwdXNoIGlmIHRoaXMgaXMgYSBxdWVyeSwgbm90IGEgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCgge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic29mdHdhcmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBcIlNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBzZWFyY2hUZXJtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50b3RhbFJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuc2hvd25SZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudHJhY2tJZCA9IHJlc3BvbnNlLmRhdGEudHJhY2tJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVMb2FkaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hhbmdlUGFnZShkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcInByZXZcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZS0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBcIm5leHRcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2Nyb2xsLXRvLXRvcCcsIHRoaXMuZGF0YS5jbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO31cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5zb2Z0d2FyZV9fYXJlYS1jYXJkcycpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gMTAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0b3ApO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFBhZ2VzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiB0b3RhbCByZXN1bHQgY291bnQsIGRpdmlkZSBieSAxMCB0byBnZXQgdG90YWwgcGFnZXMgbmVlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGggY2VpbCB0byByb3VuZCB1cFxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYWN0aXZlIGZvciBwcmV2L25leHQgYmFzZWQgb24gY3VycmVudCBwYWdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgLyAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZGRMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWVsZC5jbGFzc0xpc3QuYWRkKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dEZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0RmllbGQuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzTW9iaWxlID0gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZFswXSA9PSBcIlwiID8gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnNvZnR3YXJlSWQuc2xpY2UoMSkgOiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gdGhpcy5kYXRhLmlzTW9iaWxlID8gZmFsc2UgOiB0cnVlOyAvL2luaXQgc2hvdy9oaWRlIGZpbHRlcnMgaWYvaXMgbW9iaWxlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgZmlsdGVyIHVwZGF0ZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVGaWx0ZXJzJywgKGVsLCBlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdyZW1vdmUtZmlsdGVyJywgKGVsLCB2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignY2hhbmdlLXBhZ2UtdG8nLCAoZWwsIG51bSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtyZXR1cm47fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2ludGVybmFsLXNlYXJjaCcsICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJzb2Z0d2FyZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExvYWRpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3Njcm9sbC10by10b3AnLCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzID0gd2luZG93LmluaXRpYWxTb2Z0d2FyZUFwaVJlc3VsdHMucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsU29mdHdhcmVBcGlSZXN1bHRzLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsU29mdHdhcmVBcGlSZXN1bHRzLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVsZWFzZU5vdGVzTGFiZWwgPSB3aW5kb3cuaW5pdGlhbFNvZnR3YXJlQXBpUmVzdWx0cy5yZWxlYXNlTm90ZXNMYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVzdWx0cyA9IGZwb2RiLnNvZnR3YXJlLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSBmcG9kYi5zb2Z0d2FyZS50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5zb2Z0d2FyZS5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnJlbGVhc2VOb3Rlc0xhYmVsID0gZnBvZGIuc29mdHdhcmUucmVsZWFzZU5vdGVzTGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlckFyZWFWaXNpYmxlID0gcGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gMTAgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93Lm9ucG9wc3RhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmRlZXBsaW5rKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgICAgICAgICAgICAgIC8vIGZvciBkZWVwbGlua2luZ1xuICAgICAgICAgICAgICAgIC8vIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdzb2Z0d2FyZS1wcm9kdWN0cycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnY2F0ZWdvcnknXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZV9fcHJvZHVjdHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxjaGVja2JveC1pdGVtIHYtZm9yPVwiKHByb2R1Y3RJdGVtLCBpKSBpbiBkYXRhLnByb2R1Y3RzXCIgOmtleT1pIDp0eXBlPVwidHlwZVwiIDpsYWJlbD1cInByb2R1Y3RJdGVtLnZhbHVlXCIgOnZhbHVlPVwicHJvZHVjdEl0ZW0ua2V5XCIgOmRhdGE9XCJkYXRhXCIgOmNhdGVnb3J5PVwiY2F0ZWdvcnlcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gcmVzdWx0cyBsaXN0XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLXJlc3VsdHMtbGlzdCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNvZnR3YXJlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZV9fY2FyZHMtY29udGVudFwiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgIDxzb2Z0d2FyZS1yZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiAgOmtleT1cImluZGV4XCIgOmRhdGE9XCJkYXRhXCIgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNpbmdsZSByZXN1bHRzIGl0ZW1cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc29mdHdhcmUtcmVzdWx0cy1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjb250ZW50JywgJ2lzTG9hZGluZyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ01ldGFCb2R5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImFwcFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogdGhpcy5jb250ZW50LmRvd25sb2FkVHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuY29udGVudC5uYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZHVjdExpbmVcIjogdGhpcy5jb250ZW50LmV5ZWJyb3csIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiOiB0aGlzLmNvbnRlbnQubGFuZ3VhZ2VzLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc29mdHdhcmUtcmVzdWx0cy1pdGVtIC0gd2F0Y2goKSBjb250ZW50IC0+IHRoaXMnLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkXCIgOmRhdGE9XCJkYXRhXCIgOmNsYXNzPVwieydoaWRlLWJvb2ttYXJrJzogKGRhdGEuc2F2ZWREb2NzT25seSA9PT0gdHJ1ZSkgJiYgKGlzQm9va21hcmtlZCA9PT0gZmFsc2UpfVwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIDpkYXRhLXRhZy1tZXRhPVwidGFnTWV0YUJvZHlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fYXJlYSBzb2Z0d2FyZS1jYXJkX19hcmVhLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2V5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50LmV5ZWJyb3d9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudmlld0RldGFpbHNVcmxcIiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3RpdGxlXCIgdi1pZj1cImNvbnRlbnQudmlld0RldGFpbHNVcmxcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiYXBwXCIsIFwiYWN0aW9uXCI6IFwiRGV0YWlsc1wifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3RpdGxlXCIgdi1pZj1cIiFjb250ZW50LnZpZXdEZXRhaWxzVXJsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3N1YnRpdGxlXCIgcmVmPVwiZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQuZGV0YWlsc319IDxzcGFuIHYtaWY9XCJjb250ZW50LnJlbGVhc2VOb3Rlc1wiPnwgPC9zcGFuPjxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwidHJpZ2dlck1vZGFsXCIgdi1pZj1cImNvbnRlbnQucmVsZWFzZU5vdGVzXCI+e3tkYXRhLnJlbGVhc2VOb3Rlc0xhYmVsfX0gPHNwYW4gY2xhc3M9XCJyZWxlYXNlLW5vdGVzXCIgcmVmPVwicmVsZWFzZU5vdGVzXCI+e3tjb250ZW50LnJlbGVhc2VOb3Rlc319PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19hcmVhIHNvZnR3YXJlLWNhcmRfX2FyZWEtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2ljb24gc29mdHdhcmUtY2FyZF9faWNvbi1kb3dubG9hZFwiIDpkYXRhLWRvd25sb2FkLXVybD1cImNvbnRlbnQuZG93bmxvYWRVcmxcIiA6ZGF0YS1kb3dubG9hZC1uYW1lPVwiY29udGVudC5uYW1lXCIgOmhyZWY9XCJjb250ZW50LmRvd25sb2FkSHJlZlwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJhcHBcIiwgXCJhY3Rpb25cIjogXCJEb3dubG9hZFwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic29mdHdhcmUtY2FyZF9faWNvbiBzb2Z0d2FyZS1jYXJkX19pY29uLWJvb2ttYXJrXCIgcmVmPVwiYm9va21hcmtcIiA6ZGF0YS1zb2Z0d2FyZS1pZD1cImNvbnRlbnQuaWRcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJoYW5kbGVCb29rbWFya1wiIDpjbGFzcz1cInthY3RpdmU6IGlzQm9va21hcmtlZH1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiYXBwXCIsIFwiYWN0aW9uXCI6IFwiRmF2b3JpdGVcIn0nPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2ljb24gc29mdHdhcmUtY2FyZF9faWNvbi1hcnJvd1wiIDpjbGFzcz1cIntpbmFjdGl2ZTogY29udGVudC52aWV3RGV0YWlsc1VybCA9PSB1bmRlZmluZWR9XCIgOmhyZWY9XCJjb250ZW50LnZpZXdEZXRhaWxzVXJsXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImFwcFwiLCBcImFjdGlvblwiOiBcIkRldGFpbHNcIn0nPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic29mdHdhcmVJZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGluaXRSZWxlYXNlTm90ZXMoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJHJlZnMuZGV0YWlscy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLnRyaWdnZXJNb2RhbCgpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIHRyaWdnZXJNb2RhbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc01vZGFsLnRlbXBsYXRlKHRoaXMuY29udGVudC5yZWxlYXNlTm90ZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU5vdGVzTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc01vZGFsLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNhdmVkXCIsdGhpcy5zYXZlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0UmVsZWFzZU5vdGVzKCk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrSWQgPSBzZWxmLmRhdGEudHJhY2tJZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhpdElkID0gc2VsZi5jb250ZW50LmhpdElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gc2VsZi5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAvYXBpL1NlYXJjaEhpdD9xPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0maD0ke2VuY29kZVVSSUNvbXBvbmVudChoaXRJZCl9JnQ9JHtlbmNvZGVVUklDb21wb25lbnQodHJhY2tJZCl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsbEFuY2hvcnMgPSBzZWxmLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxBbmNob3JzLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KHVybClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiLS0+IFRyYWNraW5nIHJlc3BvbnNlOiBcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuc29mdHdhcmUtJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLnNvZnR3YXJlLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNvZnR3YXJlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc29mdHdhcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgc29mdHdhcmUtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHNvZnR3YXJlQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTb2Z0d2FyZTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuLy8gY29uc3QgU3BlY1RhYmxlID0gKCkgPT4ge1xuXG4gICAgLy8gY29uc3QgdGFibGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWMtdGFibGUnKTtcblxuICAgIC8vIGNvbnN0IHNwZWNUYWJsZUNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWNzVGFibGVUZW1wbGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NwZWMtdGFibGUtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICAgICAgcHJvcHM6IFsnc2VsZWN0ZWRJdGVtJ10sXG4gICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQ6IHN0b3JlLnN0YXRlLnVuaXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNMYWJlbDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNMYWJlbDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoVG9UZXh0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNb3JlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNPcGVuOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkVW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUudW5pdHM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY3RhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlZpZXcgYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJTcGVjaWZpY2F0aW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5zZWxlY3RlZEl0ZW0gPyB0aGlzLnNlbGVjdGVkSXRlbSA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkVW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVW5pdCA9IHRoaXMuY29tcHV0ZWRVbml0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMYWJlbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICB0b2dnbGVVbml0cygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2V0VW5pdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHNldExhYmVscygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWxUZXh0ID0gdGhpcy5zZWxlY3RlZFVuaXQgPT0gJ3VzJyA/IHRoaXMudXNMYWJlbCA6IHRoaXMubWV0cmljTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRvVGV4dCA9IHRoaXMuc2VsZWN0ZWRVbml0ID09ICd1cycgPyB0aGlzLm1ldHJpY0xhYmVsIDogdGhpcy51c0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmlld0FsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMubG9hZE1vcmUudmlld0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGxhYmVscyBmcm9tIG1hcmsgdXAgdG8gYWNjb21vZGF0ZSBtdWx0aSBsYW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNMYWJlbCA9IHRoaXMuJHJlZnMudW5pdFRvZ2dsZXIuZGF0YXNldC51c0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY0xhYmVsID0gdGhpcy4kcmVmcy51bml0VG9nZ2xlci5kYXRhc2V0Lm1ldHJpY0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExhYmVscygpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3RvZ2dsZU9wZW4nLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjVGFibGVMb2FkTW9yZSA9ICgpID0+IHtcbiAgICAgICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NwZWNpZmljYXRpb25zLWxvYWQtbW9yZScsIHtcbiAgICAgICAgICAgICAgICBwcm9wczogWydsYWJlbFRleHQnLCAnc3dpdGNoVG9UZXh0JywgJ3NlbGVjdGVkVW5pdCcsICdpc09wZW4nXSxcbiAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySGVpZ2h0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNPcGVuOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRyZWZzLmFsbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50SGVpZ2h0ID0gdGhpcy5pbm5lckhlaWdodDtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3RvZ2dsZU9wZW4nLCBmYWxzZSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29udGVudCBhcmVhIGhlaWdodCB0byBjb250ZW50IGhlaWdodCB0byBwcmV2ZW50IHRyYW5zaXRpb25pbmcgZnJvbSBhdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRoZSBlbGVtZW50IHRyYW5zaXRpb24gdG8gaGVpZ2h0OiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCd0b2dnbGVPcGVuJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJIZWlnaHQgPSB0aGlzLiRyZWZzLmFsbElubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIFxuXG4gICAgICAgIC8vIG5ldyBWdWUoe1xuICAgICAgICAvLyAgICAgZWw6IGAuc3BlYy10YWJsZS0ke2lkfWAsXG4gICAgICAgIC8vICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgIC8vIH0pLiRtb3VudChgLnNwZWMtdGFibGUtJHtpZH1gLCB0cnVlKTtcbiAgICAvLyB9XG4gICAgXG4gICAgLy8gaWYgKHRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgIHRhYmxlcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIC8vICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBzcGVjLXRhYmxlLSR7aW5kZXh9YCk7XG4gICAgLy8gICAgICAgICBzcGVjVGFibGVDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgLy8gICAgIH0pXG4gICAgLy8gfVxuXG4vLyB9XG5cbi8vIGV4cG9ydCBkZWZhdWx0IFNwZWNUYWJsZTtcblxuZXhwb3J0IHtzcGVjc1RhYmxlVGVtcGxhdGUsIHNwZWNUYWJsZUxvYWRNb3JlfTsgIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7c3BlY3NUYWJsZVRlbXBsYXRlLCBzcGVjVGFibGVMb2FkTW9yZX0gZnJvbSAnLi9zcGVjLXRhYmxlJztcblxuY29uc3QgU3BlY2lmaWNhdGlvbnMgPSAoKSA9PiB7XG5cbiAgICBjb25zdCBzcGVjcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zcGVjcyAucGFnZS1zZWN0aW9uX193cmFwcGVyJyk7XG5cbiAgICBsZXQgc3BlY3NDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdzcGVjaWZpY2F0aW9ucy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRVcmw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0YWdNZXRhU2VsZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiUHJvZHVjdCBEYXRhIFNoZWV0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJEb3dubG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLnNlbGVjdGVkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZG9jdW1lbnRJZFwiOiB0aGlzLnNlbGVjdGVkSWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RJdGVtKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuJHJlZnMuZHJvcGRvd247XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBJZCA9IHNlbGVjdC5vcHRpb25zW3NlbGVjdC5zZWxlY3RlZEluZGV4XS5kYXRhc2V0LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IElkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVybCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVybCA9IHNlbGVjdC5vcHRpb25zW3NlbGVjdC5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Ym1pdChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odGhpcy5zZWxlY3RlZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuc3BlY3MtJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoYC5zcGVjcy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIHNwZWNzVGFibGVUZW1wbGF0ZSgpO1xuICAgIHNwZWNUYWJsZUxvYWRNb3JlKCk7XG5cbiAgICBpZiAoc3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgICBzcGVjcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBzcGVjcy0ke2luZGV4fWApO1xuICAgICAgICAgICAgc3BlY3NDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNwZWNpZmljYXRpb25zOyIsIi8qXG4gICAgI1N0b3JhZ2VNYW5hZ2VyXG4gICAgICAgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGNvbnRyb2wgYW5kIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiB3aXRoIGRpZmZlcmVudCBraW5kcyBvZiBzdG9yYWdlLiBCeSBkZWZhdWx0IHVzZSBTZXNzaW9uU3RvcmFnZU1hbmFnZXIgKFNlc3Npb25TdG9yYWdlKS5cblxuICAgICAgICAjIGdldDpcbiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZm9yIHJlYWRpbmcgYSB2YWx1ZSBzdG9yZWRcblxuICAgICAgICAjIHNldDpcbiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgdG8gc3RvcmUgYSB2YWx1ZVxuXG4gICAgICAgICMgcmVtb3ZlOlxuICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyB0byByZW1vdmUgYSB2YWx1ZSBzdG9yZWRcblxuICAgICAgICAjIGFkZFRpbWVzOlxuICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyB0byBhZGQgYSBudW1iZXIgdG8gYSBpbnRlZ2VyIHZhbHVlIHN0b3JlZFxuXG4gICAgICAgICMgc3ViVGltZXM6XG4gICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHRvIHN1YnRyYWN0IGEgbnVtYmVyIHRvIGEgaW50ZWdlciB2YWx1ZSBzdG9yZWRcbiovXG5cbmNvbnN0IFN0b3JhZ2VNYW5hZ2VyID0gbWFuYWdlciA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuX21hbmFnZXIuX2dldChrZXkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9tYW5hZ2VyLl9zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fbWFuYWdlci5fcmVtb3ZlKGtleSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWRkVGltZXM6IGZ1bmN0aW9uKGtleSwgbnVtKSB7XG4gICAgICAgICAgICBjb25zdCBhZGQgPSBwYXJzZUludChudW0gfHwgMSk7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuX21hbmFnZXIuX2FkZChrZXksIGFkZCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3ViVGltZXM6IGZ1bmN0aW9uKGtleSwgbnVtKSB7XG4gICAgICAgICAgICBjb25zdCBzdWIgPSBwYXJzZUludChudW0gfHwgMSk7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuX21hbmFnZXIuX3N1YihrZXksIHN1Yik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaW5zdGFuY2UuX21hbmFnZXIgPSBtYW5hZ2VyIHx8IFNlc3Npb25TdG9yYWdlTWFuYWdlcjtcblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZXNzaW9uU3RvcmFnZU1hbmFnZXIgPSB7XG4gICAgX2dldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfSxcblxuICAgIF9zZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIF9yZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihrZXksIG51bSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGFyc2VJbnQoU2Vzc2lvblN0b3JhZ2VNYW5hZ2VyLl9nZXQoa2V5KSB8fCAwKTtcbiAgICAgICAgU2Vzc2lvblN0b3JhZ2VNYW5hZ2VyLl9zZXQoa2V5LCBjdXJyZW50ICsgbnVtKTtcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24oa2V5LCBudW0pIHtcbiAgICAgICAgU2Vzc2lvblN0b3JhZ2VNYW5hZ2VyLl9hZGQoa2V5LCBudW0gKiAtMSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IExvY2FsU3RvcmFnZU1hbmFnZXIgPSB7XG4gICAgX2dldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIH0sXG5cbiAgICBfc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgX3JlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihrZXksIG51bSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcGFyc2VJbnQoTG9jYWxTdG9yYWdlTWFuYWdlci5fZ2V0KGtleSkgfHwgMCk7XG4gICAgICAgIExvY2FsU3RvcmFnZU1hbmFnZXIuX3NldChrZXksIGN1cnJlbnQgKyBudW0pO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihrZXksIG51bSkge1xuICAgICAgICBMb2NhbFN0b3JhZ2VNYW5hZ2VyLl9hZGQoa2V5LCBudW0gKiAtMSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU3RvcmFnZU1hbmFnZXI7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZ1ZXggZnJvbSAndnVleCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtnZXRDb29raWVWYWx1ZX0gZnJvbSAnLi9taXNjLmpzJztcblxuVnVlLnVzZShWdWV4KTtcblxuY29uc3Qgc3RvcmUgPSBuZXcgVnVleC5TdG9yZSh7XG4gICAgc3RhdGU6IHtcbiAgICAgICAgcGFnZVRpdGxlOiAnJyxcbiAgICAgICAgaXNNb2JpbGU6IG51bGwsIC8vaXMgdmlld3BvcnQgPCA4MzVweFxuICAgICAgICBpc1NtYWxsTW9iaWxlOiBudWxsLCAvL2lzIHZpZXdwb3J0IDwgNjUwcHhcbiAgICAgICAgaXNNZERlc2t0b3A6IG51bGwsIC8vaXMgdmlld3BvcnQgPCAxMDI0cHhcbiAgICAgICAgcGFnZUFuY2hvcnM6IFtdLFxuICAgICAgICBzaG93SW5saW5lQW5jaG9yczogZmFsc2UsXG4gICAgICAgIHVuaXRzOiBudWxsLFxuICAgICAgICBtZW51S2V5czogW10sXG4gICAgICAgIGZhdm9yaXRlczogeyAvL05PVEU6IGFsbCBpZHMgc3RvcmVkIGFzIHN0cmluZ3NcbiAgICAgICAgICAgIGRvY3VtZW50SWQ6IFtdLFxuICAgICAgICAgICAgc29mdHdhcmVJZDogW10sXG4gICAgICAgICAgICBhcnRpY2xlSWQ6IFtdLFxuICAgICAgICAgICAgcHJvZHVjdElkOiBbXSxcbiAgICAgICAgICAgIGxlZ2FsRG9jdW1lbnRJZDogW11cbiAgICAgICAgfSxcbiAgICAgICAgY3VycmVudExhbmc6IG51bGwsXG4gICAgICAgIGxpdE9yZGVyQ2FydDogW10sXG4gICAgICAgIEdBSUQ6IG51bGwgXG4gICAgfSxcblxuICAgIG11dGF0aW9uczogIHtcbiAgICAgICAgdXBkYXRlVGl0bGUoc3RhdGUsIHRpdGxlKSB7XG4gICAgICAgICAgICBzdGF0ZS5wYWdlVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0TW9iaWxlU3RhdGUoc3RhdGUsIG1vYmlsZVN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5pc01vYmlsZSA9IG1vYmlsZVN0YXRlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRTbWFsbE1vYmlsZVN0YXRlKHN0YXRlLCBtb2JpbGVTdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuaXNTbWFsbE1vYmlsZSA9IG1vYmlsZVN0YXRlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRNZERlc2t0b3BTdGF0ZShzdGF0ZSwgbW9iaWxlU3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLmlzTWREZXNrdG9wID0gbW9iaWxlU3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFBhZ2VBbmNob3JzKHN0YXRlLCBhbmNob3JzKSB7XG4gICAgICAgICAgICBzdGF0ZS5wYWdlQW5jaG9ycyA9IGFuY2hvcnM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEFuY2hvckRyb3Bkb3duVmlzKHN0YXRlLCBhbmNob3JTdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuc2hvd0lubGluZUFuY2hvcnMgPSBhbmNob3JTdGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0VW5pdHMoc3RhdGUsIHVuaXRzKSB7XG4gICAgICAgICAgICBpZiAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS51bml0cyA9IHVuaXRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS51bml0cyA9IFxuICAgICAgICAgICAgICAgICAgICAgc3RhdGUudW5pdHMgPT0gJ3VzJyA/ICdtZXRyaWMnXG4gICAgICAgICAgICAgICAgICAgIDogc3RhdGUudW5pdHMgPT0gJ21ldHJpYycgPyAndXMnXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlTWVudShzdGF0ZSwgb2JqKSB7XG4gICAgICAgICAgICBzdGF0ZS5tZW51S2V5cy5wdXNoKG9iaik7XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZUZhdm9yaXRlcyhzdGF0ZSwgZGF0YSkge1xuICAgICAgICAgICAgLy8gYWRkL3JlbW92ZSBpdGVtcyBmcm9tIHN0b3JlcyBmYXZvcml0ZXNcbiAgICAgICAgICAgIGlmIChkYXRhLmFjdGlvbiA9PSBcImFkZFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZGRcIik7XG4gICAgICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzW2RhdGEudHlwZV0ucHVzaChkYXRhLmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5hY3Rpb24gPT0gXCJyZW1vdmVcIikge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3ZlXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhdm9yaXRlc1tkYXRhLnR5cGVdLmluY2x1ZGVzKGRhdGEuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhdm9yaXRlc1tkYXRhLnR5cGVdLnNwbGljZShzdGF0ZS5mYXZvcml0ZXNbZGF0YS50eXBlXS5pbmRleE9mKGRhdGEuaWQpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdEZhdm9yaXRlcyhzdGF0ZSwgZGF0YSkge1xuICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzW2RhdGEudHlwZV0gPSBkYXRhLmFycjtcbiAgICAgICAgfSxcbiAgICAgICAgc2FuaXRpemVGYXZvcml0ZXMoc3RhdGUsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIHNhbml0aXN6ZSBmYXZvcml0ZXMgYmFzZWQgb24gdmFsaWQgZmF2cyByZXR1cm5lZCBmcm9tIGFwaVxuICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQgPSByZXN1bHRzLmRvY3VtZW50SWRzLm1hcChpID0+IGAke2l9YCk7XG4gICAgICAgICAgICBzdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZCA9IHJlc3VsdHMuc29mdHdhcmVJZHMubWFwKGkgPT4gYCR7aX1gKTtcbiAgICAgICAgICAgIHN0YXRlLmZhdm9yaXRlcy5hcnRpY2xlSWQgPSByZXN1bHRzLmFydGljbGVJZHMubWFwKGkgPT4gYCR7aX1gKTtcbiAgICAgICAgICAgIHN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQgPSByZXN1bHRzLnByb2R1Y3RJZHMubWFwKGkgPT4gYCR7aX1gKTtcbiAgICAgICAgICAgIHN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQgPSByZXN1bHRzLmxlZ2FsRG9jdW1lbnRJZHMubWFwKGkgPT4gYCR7aX1gKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0Q3VycmVudExhbmcoc3RhdGUsIGxhbmcpIHtcbiAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRMYW5nID0gbGFuZztcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlTGl0T3JkZXJDYXJ0KHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICBzdGF0ZS5saXRPcmRlckNhcnQgPSBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBzZXRHQUlEKHN0YXRlLCBpZCkge1xuICAgICAgICAgICAgc3RhdGUuR0FJRCA9IGlkO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICAgIGNoZWNrTW9iaWxlKGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBtcWxNZCA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA4MzVweCknKTtcbiAgICAgICAgICAgIHZhciBtcWxTbSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2NTBweCknKTtcbiAgICAgICAgICAgIHZhciBtcWxNZERlc2t0b3AgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogMTAyNHB4KScpO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhtcWxNZC5tYXRjaGVzKTtcbiAgICAgICAgICAgIHZhciBpc01vYmlsZSA9IG1xbE1kLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnc2V0TW9iaWxlU3RhdGUnLCBpc01vYmlsZSk7XG5cbiAgICAgICAgICAgIG1xbE1kLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzTW9iaWxlID0gbXFsTWQubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnc2V0TW9iaWxlU3RhdGUnLCBpc01vYmlsZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIGlzU21hbGxNb2JpbGUgPSBtcWxTbS5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ3NldFNtYWxsTW9iaWxlU3RhdGUnLCBpc1NtYWxsTW9iaWxlKTtcblxuICAgICAgICAgICAgbXFsU20uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNTbWFsbE1vYmlsZSA9IG1xbFNtLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ3NldFNtYWxsTW9iaWxlU3RhdGUnLCBpc1NtYWxsTW9iaWxlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgaXNNZERlc2t0b3AgPSBtcWxNZERlc2t0b3AubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdzZXRNZERlc2t0b3BTdGF0ZScsIGlzTWREZXNrdG9wKTtcblxuICAgICAgICAgICAgbXFsTWREZXNrdG9wLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzTWREZXNrdG9wID0gbXFsTWREZXNrdG9wLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ3NldE1kRGVza3RvcFN0YXRlJywgaXNNZERlc2t0b3ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRDb29raWVzKGNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjdXJyZW50IGNvb2tpZXNcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdpbml0RmF2b3JpdGVzJywge1widHlwZVwiOidkb2N1bWVudElkJywgYXJyOiBnZXRDb29raWVWYWx1ZSgnZG9jdW1lbnRJZHMnKS5zcGxpdCgnLCcpfSApO1xuICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ2luaXRGYXZvcml0ZXMnLCB7XCJ0eXBlXCI6J3NvZnR3YXJlSWQnLCBhcnI6IGdldENvb2tpZVZhbHVlKCdzb2Z0d2FyZUlkcycpLnNwbGl0KCcsJyl9ICk7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnaW5pdEZhdm9yaXRlcycsIHtcInR5cGVcIjonYXJ0aWNsZUlkJywgYXJyOiBnZXRDb29raWVWYWx1ZSgnYXJ0aWNsZUlkcycpLnNwbGl0KCcsJyl9ICk7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnaW5pdEZhdm9yaXRlcycsIHtcInR5cGVcIjoncHJvZHVjdElkJywgYXJyOiBnZXRDb29raWVWYWx1ZSgncHJvZHVjdElkcycpLnNwbGl0KCcsJyl9ICk7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnaW5pdEZhdm9yaXRlcycsIHtcInR5cGVcIjonbGVnYWxEb2N1bWVudElkJywgYXJyOiBnZXRDb29raWVWYWx1ZSgnbGVnYWxEb2N1bWVudElkcycpLnNwbGl0KCcsJyl9ICk7XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzKTtcblxuICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29va2llRmF2b3JpdGVzKGNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIGNvb2tpZSBjdXJyZW50IHNhdmVkIGl0ZW1zIGluIHN0b3JlXG4gICAgICAgICAgICBsZXQgZG9jU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IHNvZnR3YXJlU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IGFydGljbGVTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5hcnRpY2xlSWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBwcm9kdWN0U3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbGVnYWxEb2NTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBkb2N1bWVudElkcz0ke2RvY1N0cn07IG1heC1hZ2U9MTIwOTYwMDsgcGF0aD0vYDtcbiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBzb2Z0d2FyZUlkcz0ke3NvZnR3YXJlU3RyfTsgbWF4LWFnZT0xMjA5NjAwOyBwYXRoPS9gO1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYGFydGljbGVJZHM9JHthcnRpY2xlU3RyfTsgbWF4LWFnZT0xMjA5NjAwOyBwYXRoPS9gO1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYHByb2R1Y3RJZHM9JHtwcm9kdWN0U3RyfTsgbWF4LWFnZT0xMjA5NjAwOyBwYXRoPS9gO1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYGxlZ2FsRG9jdW1lbnRJZHM9JHtsZWdhbERvY1N0cn07IG1heC1hZ2U9MTIwOTYwMDsgcGF0aD0vYDtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tGYXZvcml0ZXMoY29udGV4dCkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgY29va2llcyB3aXRoIGFwaVxuICAgICAgICAgICAgbGV0IGRvY1N0ciA9IGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBzb2Z0d2FyZVN0ciA9IGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzLnNvZnR3YXJlSWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBhcnRpY2xlU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMuYXJ0aWNsZUlkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgcHJvZHVjdFN0ciA9IGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IGxlZ2FsRG9jU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMubGVnYWxEb2N1bWVudElkLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudElkOiBkb2NTdHIgPT0gXCJcIiA/IG51bGwgOiBkb2NTdHIuY2hhckF0KDApID09IFwiLFwiID8gZG9jU3RyLnNsaWNlKDEpIDogZG9jU3RyLFxuICAgICAgICAgICAgICAgIHNvZnR3YXJlSWQ6IHNvZnR3YXJlU3RyID09IFwiXCIgPyBudWxsIDogc29mdHdhcmVTdHIuY2hhckF0KDApID09IFwiLFwiID8gc29mdHdhcmVTdHIuc2xpY2UoMSkgOiBzb2Z0d2FyZVN0cixcbiAgICAgICAgICAgICAgICBhcnRpY2xlSWQ6IGFydGljbGVTdHIgPT0gXCJcIiA/IG51bGwgOiBhcnRpY2xlU3RyLmNoYXJBdCgwKSA9PSBcIixcIiA/IGFydGljbGVTdHIuc2xpY2UoMSkgOiBhcnRpY2xlU3RyLFxuICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdFN0ciA9PSBcIlwiID8gbnVsbCA6IHByb2R1Y3RTdHIuY2hhckF0KDApID09IFwiLFwiID8gcHJvZHVjdFN0ci5zbGljZSgxKSA6IHByb2R1Y3RTdHIsXG4gICAgICAgICAgICAgICAgbGVnYWxEb2N1bWVudElkOiBsZWdhbERvY1N0ciA9PSBcIlwiID8gbnVsbCA6IGxlZ2FsRG9jU3RyLmNoYXJBdCgwKSA9PSBcIixcIiA/IGxlZ2FsRG9jU3RyLnNsaWNlKDEpIDogbGVnYWxEb2NTdHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGF4aW9zUGFyYW1zKTtcblxuICAgICAgICAgICAgLy8gY29uc3QgYXBpVXJsID0gZ2V0QXBpVXJsKCk7XG4gICAgICAgICAgICBjb25zdCBhcGlVcmwgPSBgL2FwaS92YWxpZGF0ZWlkcz9gO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXBpVXJsKTtcbiAgICAgICAgICAgIC8vIGxldCBURVNUVVJMID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvdmFsaWRhdGVJZHNcIjtcbiAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYXhpb3NQYXJhbXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3Nhbml0aXplRmF2b3JpdGVzJywgcmVzcG9uc2UuZGF0YS5yZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY29va2llRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRVbml0cyhjb250ZXh0KSB7XG4gICAgICAgICAgICBsZXQgbGFuZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AtYmFyX19zdWJuYXYtbGluay5hY3RpdmUnKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AtYmFyX19zdWJuYXYtbGluay5hY3RpdmUnKS5kYXRhc2V0LmxhbmcgOiBudWxsO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJMQU5HXCIsIGxhbmcpXG4gICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldEN1cnJlbnRMYW5nJywgbGFuZyk7XG4gICAgICAgICAgICBpZiAobGFuZyAhPT0gXCJlbi11c1wiKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCdzZXRVbml0cycsICdtZXRyaWMnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCdzZXRVbml0cycsICd1cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbml0R0FJRChjb250ZXh0KSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBnZXRDb29raWVWYWx1ZSgnX2dhJykgPT0gJycgPyBudWxsIDogZ2V0Q29va2llVmFsdWUoJ19nYScpIDtcbiAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2V0R0FJRCcsIGlkKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGlkKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzdG9yZTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJ1xuXG5jb25zdCBTdWJuYXYgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3VibmF2RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN1Yi1uYXYnKTsgICBcbiAgICBcbiAgICBsZXQgc3VibmF2Q29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc3VibmF2LXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHN0b3JlLnN0YXRlLmlzTW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICBhbmNob3JzOiBzdG9yZS5zdGF0ZS5wYWdlQW5jaG9ycyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWRTaG93QW5jaG9yczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybiBzdG9yZS5zdGF0ZS5zaG93SW5saW5lQW5jaG9ycztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gdGhpcy5jb21wdXRlZElzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZWRTaG93QW5jaG9ycygpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5zaG93QW5jaG9ycyA9IHRoaXMuY29tcHV0ZWRTaG93QW5jaG9ycztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3N1Ym5hdi1kZXNrdG9wJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnaXNNb2JpbGUnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdzdWJuYXZEcm9wZG93bicsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2FuY2hvcnMnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInBhZ2VTZWN0aW9uXCIgY2xhc3M9XCJwZXJzaXN0ZW50LWN0YV9fZHJvcGRvd24gcGVyc2lzdGVudC1jdGFfX2Ryb3Bkb3duLS1pbmxpbmVcIiA6YW5jaG9yPWFuY2hvcnMgdi1vbjpjaGFuZ2U9XCJqdW1wXCI+XG4gICAgICAgICAgICAgICAgPGFuY2hvci1kcm9wZG93bi1pdGVtIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBhbmNob3JzXCIgOmtleT1cImluZGV4XCIgOmRhdGE9XCJpdGVtXCIvPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGp1bXAoZSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGAjJHtlLnRhcmdldC52YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYW5jaG9yLWRyb3Bkb3duLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICAgICAgPG9wdGlvbiA6dmFsdWU9XCJkYXRhLmtleVwiPnt7ZGF0YS5uYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnN1Ym5hdi0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnN1Ym5hdi0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChzdWJuYXZEb20ubGVuZ3RoID4gMCApIHtcbiAgICAgICAgc3VibmF2RG9tLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHN1Ym5hdi0ke2luZGV4fWApO1xuICAgICAgICAgICAgc3VibmF2Q29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJuYXY7IiwiLypcbiAgICBUYWJzIGlzIGEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRvIGFkZCB0aGUgVnVlIFRhYnMgY29tcG9uZW50LlxuICAgICAgICAqIEFyZ3VtZW50czpcbiAgICAgICAgICAgIC0ge09iamVjdH0gb3B0aW9uc1xuICAgICAgICAqIFVzYWdlOlxuICAgICAgICAgICBUaGUgJ29wdGlvbnMnIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gZm9yIGEgVnVlIENvbXBvbmVudC4gaW4gYWRkaXRpb24sIHRoZSBuZXh0IG9wdGlvbnM6XG5cbiAgICAgICAgICAgLSBuYW1lIFtzdHJpbmddOiBuYW1lIHVzZWQgZm9yIFRhYnMgY29tcG9uZW50IGluIFZ1ZS4gKGJ5IGRlZmF1bHQgaXMgJ3RhYnMnLiBSZW1lbWJlciBjb25zaWRlcmluZyB0aGUgcHJlZml4IG9wdGlvbi4pXG5cbiAgICAgICAgKiBQcm9wczpcblxuICAgICAgICAgICAgLSBjdXJyZW50LWlkLXRhYjogc2V0cyB0aGUgZmlyc3QgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIChieSBkZWZhdWx0IGlzICcxJykuXG4gICAgICAgICAgICAtIGFjdGl2ZS1jbGFzczogaXMgYSBDU1MgY2xhc3MsIHVzZXMgd2hlbiB0aGUgdGFiIGlzIGFjdGl2ZS4gdGhpcyB1c2VzIGZvciBwYXNzaW5nIHRoZSBzYW1lIHZhbHVlIHRvIHRoZSB0YWIgY29tcG9uZW50cy5cblxuICAgICAgICAjIFRoZSBTdWItY29tcG9uZW50czpcblxuICAgICAgICAgICAgKiB0YWI6IHRoZSB0YWIgY29tcG9uZW50IGlzIHRoZSB0YWIgYnV0dG9uLCB0aGlzIGhhcyB0aGUgbmV4dCBwcm9wczpcbiAgICAgICAgICAgICAgICAtIGlkLXRhYjogaXMgdGhlIHRhYiBpZCB0aGF0IGxpbmtzIHdpdGggaXRzIGNvbnRlbnQuXG4gICAgICAgICAgICAgICAgLSBjdXJyZW50LXRhYjogaWRlbnRpZmllcyB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgKGlzIHJlcXVpcmVkIGZvciB0aGUgdGFicyBmdW5jdGlvbmFsaXR5KS5cbiAgICAgICAgICAgICAgICAtIGNoYW5nZS10YWI6IGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSB0YWIgY2hhbmdpbmcgKGlzIHJlcXVpcmVkIGZvciB0aGUgdGFicyBmdW5jdGlvbmFsaXR5KS5cbiAgICAgICAgICAgICAgICAtIGFjdGl2ZS1jbGFzczogaXMgYSBDU1MgY2xhc3MsIHVzZXMgd2hlbiB0aGUgdGFiIGlzIGFjdGl2ZS4gKGJ5IGRlZmF1bHQgJ2FjdGl2ZScpXG5cbiAgICAgICAgICAgICogdGFiLWNvbnRlbnQ6IHRoZSB0YWItY29udGVudCBjb21wb25lbnQgaXMgdGhlIHRhYiBjb250ZW50LCB0aGlzIGhhcyB0aGUgbmV4dCBwcm9wczpcbiAgICAgICAgICAgICAgICAtIGlkLXRhYjogaXMgdGhlIHRhYiBpZCB0aGF0IGxpbmtzIHdpdGggaXRzIHRhYiBidXR0b24uXG4gICAgICAgICAgICAgICAgLSBjdXJyZW50LXRhYjogaWRlbnRpZmllcyB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgKGlzIHJlcXVpcmVkIGZvciB0aGUgdGFicyBmdW5jdGlvbmFsaXR5KS5cbiAgICAgICAgICAgICAgICAtIGNoYW5nZS10YWI6IGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSB0YWIgY2hhbmdpbmcgKGlzIHJlcXVpcmVkIGZvciB0aGUgdGFicyBmdW5jdGlvbmFsaXR5IGluIGNhc2NhZGUgbW9kZSkuXG4gICAgICAgICAgICAgICAgLSB0YWItY2xhc3M6IGlzIGEgQ1NTIGNsYXNzLCB1c2VzIHdoZW4gdGhlIHRhYiBidXR0b24gc3R5bGVzLiAoYnkgZGVmYXVsdCAndGFiJywgb25seSBpbiBjYXNjYWRlIG1vZGUpXG4gICAgICAgICAgICAgICAgLSBhY3RpdmUtY2xhc3M6IGlzIGEgQ1NTIGNsYXNzLCB1c2VzIHdoZW4gdGhlIHRhYiBpcyBhY3RpdmUuIChieSBkZWZhdWx0IGlzIGFjdGl2ZSlcbiovXG5pbXBvcnQge1xuICAgIGNvbnRlbnQgYXMgY29udGVudFRlbXBsYXRlLFxuICAgIHRhYiBhcyB0YWJUZW1wbGF0ZSxcbn0gZnJvbSAnLi90ZW1wbGF0ZS1zdHJpbmdzL3RhYnMtY29tcG9uZW50JztcblxuY29uc3QgdGFicyA9ICh7IG5hbWUgPSAndGFicycsIHByb3BzLCBkYXRhOiBkYXRhUHJvcCwgbW91bnRlZCwgbWV0aG9kcywgY29tcG9uZW50cywgdGFiUHJvcHMsIGNvbnRlbnRQcm9wcywgdGFiRGF0YSwgdGFiQ29udGVudERhdGEsIHRhYk9wdGlvbnMsIHRhYkNvbnRlbnRPcHRpb25zLCAuLi5vcHRpb25zfSA9IHt9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGN1cnJlbnRJZFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgIGFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gICAgICAgICAgICAuLi5wcm9wc1xuICAgICAgICB9LFxuICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IF9kYXRhUHJvcCA9IGRhdGFQcm9wICYmIGRhdGFQcm9wKCk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUYWI6IHRoaXMuY3VycmVudElkVGFiIHx8IDEsXG4gICAgICAgICAgICAgICAgLi4uX2RhdGFQcm9wXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBtb3VudGVkICYmIG1vdW50ZWQuY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgY29uc3QgdGFiQ2hpbGRyZW4gPSB7fTtcbiAgICAgICAgICAgIHRoaXMuJGNoaWxkcmVuLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnID0gYy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucy50YWc7XG4gICAgICAgICAgICAgICAgaWYoIVsndGFiJywgJ3RhYi1jb250ZW50J10uaW5jbHVkZXModGFnKSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGMuaWRUYWI7XG4gICAgICAgICAgICAgICAgY29uc3QgZSA9IHRhYkNoaWxkcmVuW2lkXTtcblxuICAgICAgICAgICAgICAgIGlmKCFlKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiQ2hpbGRyZW5baWRdID0gYztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGMuc2V0VGFiSW5zdGFuY2UoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgY2hhbmdlVGFiOiBmdW5jdGlvbihpZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gaWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4ubWV0aG9kc1xuICAgICAgICB9LFxuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAndGFiJyA6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndGFiJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGFiVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYWN0aXZlJ30sXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIC4uLnRhYlByb3BzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRhYkRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRhYk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWIodGhpcy5pZFRhYik7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldFRhYkluc3RhbmNlOiBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNldFRhYkRlZmF1bHRTbG90KHRoaXMuZ2V0RGVmYXVsdFNsb3QoKSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFNsb3Q6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kc2xvdHMuZGVmYXVsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3RhYi1jb250ZW50JyA6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndGFiLWNvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBjb250ZW50VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgIHRhYkNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RhYid9LFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDbGFzczoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2FjdGl2ZSd9LFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUYWI6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAuLi5jb250ZW50UHJvcHNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlNsb3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRhYkNvbnRlbnREYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi50YWJDb250ZW50T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRzbG90cy50YWIgPSB0aGlzLnRhYlNsb3Q7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRhYih0aGlzLmlkVGFiKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGFiSW5zdGFuY2U6IGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUYWJEZWZhdWx0U2xvdChlLmdldERlZmF1bHRTbG90KCkpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldFRhYkRlZmF1bHRTbG90OiBmdW5jdGlvbihzbG90KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFiU2xvdCA9IHNsb3Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmNvbXBvbmVudHNcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRhYnM7XG4iLCJleHBvcnQgY29uc3QgdGFiU2VsZWN0TW9iaWxlID0gYFxuICAgIDxkaXY+XG4gICAgICAgIDxzZWxlY3QgOnZhbHVlPVwiY3VycmVudFRhYlwiIDpjbGFzcz1cInNlbGVjdENsYXNzXCIgdi1vbjpjaGFuZ2U9XCJjaGFuZ2VcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdi1mb3I9XCJvIGluIG9wdGlvbnNcIiA6dmFsdWU9XCJvLmlkXCI+e3tvLnRleHR9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IHByb2R1Y3RJdGVtID0gYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yXCIgOmNoZWNrZWQ9XCJjaGVja2VkXCIgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX193cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2FyZWEgcHJvZHVjdC1jYXJkLWhvcl9fYXJlYS11dGlsc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fdXRpbCBwcm9kdWN0LWNhcmQtaG9yX191dGlsLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveF9fbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2tib3hfX2lucHV0XCIgdi1tb2RlbD1cImlzQ2hlY2tlZFwiIDpkYXRhLXByb2R1Y3QtaWQ9XCJkYXRhLmlkXCIgcmVmPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveF9fY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX191dGlsIHByb2R1Y3QtY2FyZC1ob3JfX3V0aWwtYm9va21hcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWJvb2ttYXJrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9kdWN0LWJvb2ttYXJrIGlubGluZS10ZW1wbGF0ZSA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19ib29rbWFya1wiIDpkYXRhLXByb2R1Y3QtaWQ9XCJkYXRhLmlkXCIgcmVmPVwiYm9va21hcmtcIiB2LW9uOmNsaWNrPVwiaGFuZGxlQm9va21hcmsoKVwiIHYtYmluZDpjbGFzcz1cImlzQm9va21hcmtlZCA/ICdhY3RpdmUnIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9kdWN0LWJvb2ttYXJrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19hcmVhIHByb2R1Y3QtY2FyZC1ob3JfX2FyZWEtaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2ltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyA6c3JjPVwiZGF0YS5wcm9kdWN0SW1hZ2VVcmxcIiA6YWx0PVwiZGF0YS5wcm9kdWN0SW1hZ2VVcmxBbHRUZXh0XCIgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fYXJlYSBwcm9kdWN0LWNhcmQtaG9yX19hcmVhLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgOnNyYz1cImRhdGEuYnJhbmRJbWFnZVVybFwiIDphbHQ9XCJkYXRhLmJyYW5kSW1hZ2VVcmxBbHRUZXh0XCIgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19leWVicm93LWltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFx7e2RhdGEucHJvZHVjdE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2NvcHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5kZXNjcmlwdGlvbn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19jdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiZGF0YS51cmxcIiBjbGFzcz1cImJ1dHRvbiB0ZXJ0aWFyeS1idXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+VmlldyBwcm9kdWN0PC9zcGFuPjxzcGFuIGNsYXNzPVwiYnV0dG9uLWljb25cIj48L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBkb2N1bWVudEl0ZW0gPSBgXG48ZGl2IGNsYXNzPVwiZG9jLWNhcmRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX3dyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5leWVicm93fX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRvYy1jYXJkX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5uYW1lfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgXFx7e2RhdGEuZGV0YWlsc319XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWRvd25sb2FkXCIgOmhyZWY9XCJkYXRhLnVybFwiPjwvYT5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWVtYWlsXCIgOmhyZWY9XCJtYWlsdG9cIj48L2E+XG4gICAgICAgICAgICAgICAgPGRvY3VtZW50LWJvb2ttYXJrIGlubGluZS10ZW1wbGF0ZSA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWJvb2ttYXJrXCIgdi1vbjpjbGljay5wcmV2ZW50PVwiaGFuZGxlQm9va21hcmsoKVwiIDpkYXRhLWRvY3VtZW50LWlkPVwiZGF0YS5pZFwiIHJlZj1cImJvb2ttYXJrXCI+PC9hPlxuICAgICAgICAgICAgICAgIDwvZG9jdW1lbnQtYm9va21hcms+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBzb2Z0d2FyZUl0ZW0gPSBgXG4gICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fYXJlYSBzb2Z0d2FyZS1jYXJkX19hcmVhLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19leWVicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgIFxce3tkYXRhLmV5ZWJyb3d9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgXFx7e2RhdGEubmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19zdWJ0aXRsZVwiIHYtaHRtbD1cImRhdGEuZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fYXJlYSBzb2Z0d2FyZS1jYXJkX19hcmVhLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic29mdHdhcmUtY2FyZF9faWNvbiBzb2Z0d2FyZS1jYXJkX19pY29uLWRvd25sb2FkXCIgOmhyZWY9XCJkYXRhLmRvd25sb2FkVXJsXCI+PC9hPlxuICAgICAgICAgICAgICAgICAgICA8c29mdHdhcmUtYm9va21hcmsgaW5saW5lLXRlbXBsYXRlIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19pY29uIHNvZnR3YXJlLWNhcmRfX2ljb24tYm9va21hcmtcIiBocmVmPVwiI1wiIHYtb246Y2xpY2sucHJldmVudD1cImhhbmRsZUJvb2ttYXJrKClcIiA6ZGF0YS1zb2Z0d2FyZS1pZD1cImRhdGEuaWRcIiByZWY9XCJib29rbWFya1wiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9zb2Z0d2FyZS1ib29rbWFyaz5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19pY29uIHNvZnR3YXJlLWNhcmRfX2ljb24tYXJyb3dcIiA6Y2xhc3M9XCJ7aW5hY3RpdmU6ICFkYXRhLnZpZXdEZXRhaWxzVXJsfVwiIDpocmVmPVwiZGF0YS52aWV3RGV0YWlsc1VybFwiPjwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbmA7XG5cbmV4cG9ydCBjb25zdCBhcnRpY2xlSXRlbSA9IGBcbjxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGUtY2FyZC1oX19hcmVhIGFydGljbGUtY2FyZC1oX19hcmVhLXV0aWxzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGUtY2FyZC1oX191dGlsIGFydGljbGUtY2FyZC1oX191dGlsLWJvb2ttYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29rbWFyay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpY2xlLWJvb2ttYXJrIGlubGluZS10ZW1wbGF0ZSA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFydGljbGUtY2FyZC1oX19ib29rbWFya1wiIDpkYXRhLXByb2R1Y3QtaWQ9XCJkYXRhLmlkXCIgcmVmPVwiYm9va21hcmtcIiB2LW9uOmNsaWNrPVwiaGFuZGxlQm9va21hcmsoKVwiIHYtYmluZDpjbGFzcz1cImlzQm9va21hcmtlZCA/ICdhY3RpdmUnIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2FydGljbGUtYm9va21hcms+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX2FyZWEgYXJ0aWNsZS1jYXJkLWhfX2FyZWEtaW1hZ2VcIiB2LWJpbmQ6c3R5bGU9XCJ7IGJhY2tncm91bmRJbWFnZTogJ3VybCgnICsgZGF0YS5hcnRpY2xlSW1hZ2VVcmwgKyAnKScgfVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX2FyZWEgYXJ0aWNsZS1jYXJkLWhfX2FyZWEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5hcnRpY2xlVGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fY29weVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFx7e2RhdGEuYXJ0aWNsZURldGFpbHN9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5gOyIsImV4cG9ydCBjb25zdCBjb250ZW50ID0gYFxuPGRpdj5cbiAgICA8c2xvdCB2LWlmPVwiZGF0YS5rZWVwQ29udGVudFwiPjwvc2xvdD5cbiAgICA8ZGl2IHYtZm9yPVwiaXRlbSBpbiBkYXRhLnJlc3VsdHNcIiBjbGFzcz1cInJlY2VudC1wb3N0c19fY2VsbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS10aWxlX193cmFwcGVyXCI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImFydGljbGUtdGlsZV9fbGlua1wiIGhyZWY9XCIjXCIgOmhyZWY9XCJpdGVtLnVybFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLXRpbGVfX2ltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcGxhY2Vob2xkLml0LzMwNXgxODBcIiBjbGFzcz1cImFydGljbGUtdGlsZV9faW1hZ2VcIiA6c3JjPVwiaXRlbS5pbWFnZVwiIDphbHQ9XCJpdGVtLmltYWdlQWx0VGV4dFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhcnRpY2xlLXRpbGVfX3RpdGxlXCIgdi1odG1sPVwiaXRlbS50aXRsZVwiPjwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImFydGljbGUtdGlsZV9faW5mb1wiPnt7aXRlbS50eXBlfX0gLyB7e2l0ZW0uaW5mb319PC9wPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IHBhZ2luYXRvciA9IGBcbjxkaXYgdi1pZj1cIihkYXRhLmZpcnN0TG9hZCAmJiBpc1Nob3cpIHx8IGRhdGEubmV4dFBhZ2VcIj5cbiAgICA8c2xvdD48L3Nsb3Q+XG48L2Rpdj5cbmA7XG4iLCJleHBvcnQgY29uc3QgY29udGVudEFwcGxpY2F0aW9ucyA9IGBcbiAgICA8ZGl2IHYtaWY9XCJjdXJyZW50VGFiID09IGlkVGFiXCIgOmNsYXNzPVwiYWN0aXZlQ2xhc3NcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiA6ZGF0YS10YWctbWV0YT1cInRhZ2dpbmdNZXRhXCI+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbmA7XG4iLCJleHBvcnQgY29uc3QgY29udGVudCA9IGBcbiAgICA8ZGl2IDpjbGFzcz1cImN1cnJlbnRUYWIgPT0gaWRUYWIgJiYgYWN0aXZlQ2xhc3NcIiA6ZGF0YS10YWctbWV0YT1cInRhZ2dpbmdNZXRhXCI+XG4gICAgICAgIDxkaXYgdi1pZj1cImNoYW5nZVRhYiAmJiB0YWJTbG90XCIgdi1vbjpjbGljaz1cIm9uQ2xpY2tcIiA6Y2xhc3M9XCJ0YWJDbGFzc1wiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRhYlwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IHYtaWY9XCJjdXJyZW50VGFiID09IGlkVGFiXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IHRhYiA9IGBcbiAgICA8bGkgdi1vbjpjbGljaz1cIm9uQ2xpY2tcIiA6Y2xhc3M9XCJjdXJyZW50VGFiID09IGlkVGFiICYmIGFjdGl2ZUNsYXNzXCIgOmRhdGEtdGFnLW1ldGE9XCJ0YWdnaW5nTWV0YVwiPlxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgPC9saT5cbmA7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHsgbG9yeSB9IGZyb20gJ2xvcnkuanMnO1xuXG5jb25zdCB0ZXN0aW1vbmlhbCA9ICgpID0+IHtcblxuICAgIGxldCB0ZXN0aW1vbmlhbEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGVzdGltb25pYWwnKTtcblxuICAgIGxldCB0ZXN0aW1vbmlhbENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Rlc3RpbW9uaWFsJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVyRWw6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZyYW1lOiAndGVzdGltb25pYWxfX2ZyYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGxvcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogMSxcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0TG9yeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5ID0gbG9yeSh0aGlzLnNsaWRlckVsLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdExpc3RlbmVyKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FmdGVyLmxvcnkuc2xpZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IHRoaXMubG9yeS5yZXR1cm5JbmRleCgpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXh0U2xpZGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9yeS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwcmV2U2xpZGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9yeS5wcmV2KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJFbCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy50ZXN0aW1vbmlhbF9fc2xpZGVyJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcudGVzdGltb25pYWxfX3NsaWRlJykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdExvcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnRlc3RpbW9uaWFsLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAudGVzdGltb25pYWwtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodGVzdGltb25pYWxJdGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGVzdGltb25pYWxJdGVtLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHRlc3RpbW9uaWFsLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICB0ZXN0aW1vbmlhbENvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgdGVzdGltb25pYWw7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCB0aXBweSBmcm9tICd0aXBweS5qcyc7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQgeyB0b29sdGlwTW9kYWwgfSBmcm9tIFwiLi9tb2RhbHNcIjtcblZ1ZS51c2UoVk1vZGFsKTtcblxuY29uc3QgVGltZWxpbmUgPSAoKSA9PiB7XG5cbiAgICBsZXQgdGltZWxpbmVJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aW1lbGluZScpO1xuXG4gICAgbGV0IHRpbWVsaW5lQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgndGltZWxpbmUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRJc01vYmlsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjYWxjIHRoaXNcIiwgd2luZG93LmlubmVyV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoaXMgaXMgY2hlY2tpbmcgZm9yIGEgc21hbGxlciBzY3JlZW4gc2l6ZSB0aGFuIHRoZSBpc01vYmlsZSB2YWx1ZSBpbiB0aGUgdnVleCBzdG9yZVxuICAgICAgICAgICAgICAgICAgICB2YXIgbXFsID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDY1MHB4KScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbXFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IG1xbC5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRJc01vYmlsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCd0aW1lbGluZS1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnaXNNb2JpbGUnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHt9LFxuICAgICAgICAgICAgICAgICAgICBpc09wZW46IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVUb29sdGlwcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdFRpcHB5KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGlwcHkodGhpcy4kcmVmcy50b29sdGlwLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0hUTUw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVPbkNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiA5OSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2hvdyhpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiT1BFTkVEXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkhpZGUoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW9iaWxlVG9vbHRpcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZV9faXRlbS1kYXRlXCI+JHt0aGlzLm1lc3NhZ2UuZGF0ZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmVfX2l0ZW0tZGVzY1wiPiR7dGhpcy5tZXNzYWdlLnRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+JHt0aGlzLm1lc3NhZ2UuY29weX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcE1vZGFsLnRlbXBsYXRlKGNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBNb2RhbC5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc2FibGVUb29sdGlwcygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuJHJlZnMudG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdGFyZ2V0Ll90aXBweTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGlzYWJsZSgpOyAvL0BUT0RPOiBmaWd1cmUgb3V0IHdoeSBkaXNhYmxlIG1ldGhvZCBpc24ndCB3b3JraW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TWVzc2FnZURhdGEoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5jb3B5ID0gdGhpcy4kcmVmcy50b29sdGlwLmdldEF0dHJpYnV0ZSgnZGF0YS10aXBweS1jb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS50aXRsZSA9IHRoaXMuJHJlZnMuZGVzYy5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5kYXRlID0gdGhpcy4kcmVmcy5kYXRlLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRpcHB5KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVUb29sdGlwcygpO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1lc3NhZ2VEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC50aW1lbGluZS0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnRpbWVsaW5lLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVsaW5lSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aW1lbGluZUl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHRpbWVsaW5lLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICB0aW1lbGluZUNvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGltZWxpbmU7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7dmlkZW9Nb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuXG5jb25zdCBWaWRlb1BsYXllckxpbmsgPSAoKSA9PiB7XG5cbiAgICBsZXQgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZpZGVvLXBsYXllci1saW5rJyk7XG4gICAgVnVlLnVzZShWTW9kYWwpO1xuXG4gICAgbGV0IFZpZGVvQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgndmlkZW8tcGxheWVyLXRlbXBsYXRlLWxpbmsnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2aWRlb1VybDogJycsXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvTmFtZTogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgbGF1bmNoVmlkZW8oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb01vZGFsLnRlbXBsYXRlKHRoaXMudmlkZW9VcmwsIHRoaXMudmlkZW9OYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAsXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9VcmwgPSB0aGlzLiRyZWZzLm92ZXJsYXkuZGF0YXNldC52aWRlb0lkO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9OYW1lID0gIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIFxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnZpZGVvLXBsYXllci1saW5rLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAudmlkZW8tcGxheWVyLWxpbmstJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmlkZW9zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHZpZGVvLXBsYXllci1saW5rLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBWaWRlb0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvUGxheWVyTGluazsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHt2aWRlb01vZGFsfSBmcm9tICcuL21vZGFscyc7XG5cbmNvbnN0IFZpZGVvUGxheWVyID0gKCkgPT4ge1xuXG4gICAgbGV0IHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy52aWRlby1wbGF5ZXInKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgVmlkZW9Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCd2aWRlby1wbGF5ZXItdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2aWRlb1VybDogJycsXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvTmFtZTogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgbGF1bmNoVmlkZW8oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb01vZGFsLnRlbXBsYXRlKHRoaXMudmlkZW9VcmwsIHRoaXMudmlkZW9OYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuJHJlZnMub3ZlcmxheS5kYXRhc2V0LnZpZGVvSWQ7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb05hbWUgPSB0aGlzLiRyZWZzLm5hbWUgPyB0aGlzLiRyZWZzLm5hbWUuaW5uZXJIVE1MIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAudmlkZW8tcGxheWVyLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAudmlkZW8tcGxheWVyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZpZGVvcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZpZGVvcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGB2aWRlby1wbGF5ZXItJHtpbmRleH1gKTtcbiAgICAgICAgICAgIFZpZGVvQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlkZW9QbGF5ZXI7IiwiLy8gUG9seWZpbGxzIGZvciBJRVxuaW1wb3J0ICcuL3BvbHlmaWxscy9lbGVtZW50LmNsb3Nlc3QnO1xuaW1wb3J0ICcuL3BvbHlmaWxscy9tYXRjaE1lZGlhJztcbmltcG9ydCAnbm9kZWxpc3QtZm9yZWFjaC1wb2x5ZmlsbCc7XG5pbXBvcnQgJ2NvcmUtanMvZmVhdHVyZXMvcHJvbWlzZSc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvc3ltYm9sL2l0ZXJhdG9yJztcbmltcG9ydCAnY29yZS1qcy9lcy9vYmplY3QvYXNzaWduJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9maW5kJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9mcm9tJztcbmltcG9ydCAnY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcyc7XG5pbXBvcnQgJ2NvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzJztcbmltcG9ydCAnaW50ZXJzZWN0aW9uLW9ic2VydmVyJztcblxuLy8gaW1wb3J0IHNhbXBsZSBmcm9tICcuL2xpYi9zYW1wbGUuanMnO1xuaW1wb3J0IGRyYXdlciBmcm9tICcuL2xpYi9kcmF3ZXIuanMnO1xuaW1wb3J0IHByb2R1Y3RzQWNjZXNzb3JpZXMgZnJvbSAnLi9saWIvcHJvZHVjdHMtYWNjZXNzb3JpZXMuanMnO1xuaW1wb3J0IGN0YUJhclRvcCBmcm9tICcuL2xpYi9jdGEtYmFyLXRvcC5qcyc7XG5pbXBvcnQgY3RhQmFyQm90dG9tIGZyb20gJy4vbGliL2N0YS1iYXItYm90dG9tLmpzJztcbmltcG9ydCBzdWJOYXYgZnJvbSAnLi9saWIvc3ViLW5hdi5qcyc7XG5pbXBvcnQgdG9wQmFyIGZyb20gJy4vbGliL21lbnUtdG9wLWJhci5qcyc7XG5pbXBvcnQgZndNZWRpYSBmcm9tICcuL2xpYi9mdy1tZWRpYS5qcyc7XG5pbXBvcnQgaG93SXRXb3JrcyBmcm9tICcuL2xpYi9ob3ctaXQtd29ya3MuanMnO1xuaW1wb3J0IHZpZGVvUGxheWVyIGZyb20gJy4vbGliL3ZpZGVvLXBsYXllci5qcyc7XG5pbXBvcnQgdmlkZW9QbGF5ZXJMaW5rIGZyb20gJy4vbGliL3ZpZGVvLXBsYXllci1saW5rLmpzJztcblxuaW1wb3J0IHNwZWNpZmljYXRpb25zIGZyb20gJy4vbGliL3NwZWNpZmljYXRpb25zLmpzJztcbmltcG9ydCBoZXJvUHJvZHVjdHMgZnJvbSAnLi9saWIvaGVyby1wcm9kdWN0cy5qcyc7XG5pbXBvcnQgbWFya2V0QXBwcyBmcm9tICcuL2xpYi9tYXJrZXQtYXBwbGljYXRpb25zLmpzJztcbmltcG9ydCBtZWdhbWVudSBmcm9tICcuL2xpYi9tZWdhbWVudS5qcyc7XG5cblxuXG5cblxuXG5cblxuaW1wb3J0IGZvb3RlclVuaXRUb2dnbGVyIGZyb20gJy4vbGliL2Zvb3Rlci11bml0cy5qcyc7XG5pbXBvcnQgZG9jdW1lbnRhdGlvbiBmcm9tICcuL2xpYi9kb2N1bWVudGF0aW9uLmpzJztcbmltcG9ydCBzb2Z0d2FyZSBmcm9tICcuL2xpYi9zb2Z0d2FyZS1maXJtd2FyZS5qcyc7XG5pbXBvcnQgcHJvZHVjdENhdGFsb2cgZnJvbSAnLi9saWIvcHJvZHVjdC1jYXRhbG9nLmpzJztcbmltcG9ydCBpbnRlcm5hbFNlYXJjaCBmcm9tICcuL2xpYi9pbnRlcm5hbC1zZWFyY2guanMnO1xuaW1wb3J0IHtwYXJkb3RGb3JtfSBmcm9tICcuL2xpYi9wYXJkb3QtZm9ybS5qcyc7XG5pbXBvcnQgYm9va21hcmtzIGZyb20gJy4vbGliL2Jvb2ttYXJrcy5qcyc7XG5pbXBvcnQgeyBpbnN0YW5jZSwgdHJpZ2dlcn0gZnJvbSAnLi9saWIvbW9kYWwtdHJpZ2dlci5qcyc7XG5cbmltcG9ydCBkb2N1bWVudGF0aW9uQ29udGV4dHVhbCBmcm9tICcuL2xpYi9kb2N1bWVudGF0aW9uLWNvbnRleHR1YWwuanMnO1xuaW1wb3J0IHNvZnR3YXJlQ2FyZCBmcm9tICcuL2xpYi9zb2Z0d2FyZS1jYXJkLmpzJzsgLy9mb3Igc29mdHdhcmUvZmlybXdhcmUgbm8gZmlsdGVyaW5nIHZlcnNpb25cbmltcG9ydCBxdWlja0xpbmtzIGZyb20gJy4vbGliL3F1aWNrLWxpbmtzLmpzJztcbmltcG9ydCBob21lSGVybyBmcm9tICcuL2xpYi9ob21lLWhlcm8uanMnO1xuaW1wb3J0IHNlYXJjaFJlc3VsdHMgZnJvbSBcIi4vbGliL3NlYXJjaC1yZXN1bHRzXCI7XG5pbXBvcnQgdGVzdGltb25pYWwgZnJvbSBcIi4vbGliL3Rlc3RpbW9uaWFsXCI7XG5pbXBvcnQgcGF0ZW50cyBmcm9tIFwiLi9saWIvcGF0ZW50c1wiO1xuaW1wb3J0IGxlZ2FsQ29tcGxpYW5jZSBmcm9tIFwiLi9saWIvbGVnYWwtY29tcGxpYW5jZVwiO1xuaW1wb3J0IHRpbWVsaW5lIGZyb20gXCIuL2xpYi90aW1lbGluZVwiO1xuaW1wb3J0IGxpdGVyYXR1cmVPcmRlciBmcm9tIFwiLi9saWIvbGl0LW9yZGVyXCI7XG5pbXBvcnQgZ2VuZXJpY01vZGFsIGZyb20gXCIuL2xpYi9nZW5lcmljLW1vZGFsXCI7XG5pbXBvcnQgc2xpZGVzaG93IGZyb20gJy4vbGliL3NsaWRlc2hvdy5qcyc7XG5cbmltcG9ydCBzdG9yZSBmcm9tICcuL2xpYi9zdG9yZSc7XG5cbi8vIGltcG9ydGluZyBsaWJyYXJpZXMgZm9yIG1vZHVsZXNcbmltcG9ydCBDb21wb25lbnRNb2R1bGUgZnJvbSAnLi9saWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgJy4vbGliL21vZHVsZXMnO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIGdlbmVyaWNNb2RhbCgpO1xuICAgIGRyYXdlcigpO1xuICAgIHByb2R1Y3RzQWNjZXNzb3JpZXMoKTtcbiAgICBjdGFCYXJUb3AoKTtcbiAgICBjdGFCYXJCb3R0b20oKTtcbiAgICBzdWJOYXYoKTtcbiAgICB0b3BCYXIoKTtcbiAgICBmd01lZGlhKCk7XG4gICAgaG93SXRXb3JrcygpO1xuICAgIHZpZGVvUGxheWVyKCk7XG4gICAgdmlkZW9QbGF5ZXJMaW5rKCk7XG4gICAgXG4gICAgc3BlY2lmaWNhdGlvbnMoKTtcbiAgICBoZXJvUHJvZHVjdHMoKTtcbiAgICBtYXJrZXRBcHBzKCk7XG4gICAgbWVnYW1lbnUoKTtcbiAgICBmb290ZXJVbml0VG9nZ2xlcigpO1xuICAgIGRvY3VtZW50YXRpb24oKTtcbiAgICBzb2Z0d2FyZSgpO1xuICAgIHByb2R1Y3RDYXRhbG9nKCk7XG4gICAgaW50ZXJuYWxTZWFyY2goKTtcbiAgICBwYXJkb3RGb3JtKCk7XG4gICAgYm9va21hcmtzKCk7XG4gICAgLy8gSW5pdGlhbGl6YXRpb24gbW9kdWxlc1xuICAgIENvbXBvbmVudE1vZHVsZS5Jbml0KCk7XG4gICAgaW5zdGFuY2U7XG4gICAgdHJpZ2dlcigpO1xuICAgIGRvY3VtZW50YXRpb25Db250ZXh0dWFsKCk7XG4gICAgc29mdHdhcmVDYXJkKCk7XG4gICAgcXVpY2tMaW5rcygpO1xuICAgIGhvbWVIZXJvKCk7XG4gICAgc2VhcmNoUmVzdWx0cygpO1xuICAgIHRlc3RpbW9uaWFsKCk7XG4gICAgcGF0ZW50cygpO1xuICAgIGxlZ2FsQ29tcGxpYW5jZSgpO1xuICAgIHRpbWVsaW5lKCk7XG4gICAgbGl0ZXJhdHVyZU9yZGVyKCk7XG4gICAgc2xpZGVzaG93KCk7XG5cbiAgICAvLyBhbHdheXMgc2Nyb2xsIGxvY2sgYm9keSB3aGVuIG1vZGFsIG9yIG1vYmlsZSBtZWdhbWVudSBpcyBvcGVuXG4gICAgbGV0IG9ic2VydmVyVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpO1xuICAgIGxldCBzY3JvbGxMb2NrID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJtaS1tb2RhbCcpIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhbWVudV9fbW9iaWxlLXN1Ym1lbnUuYWN0aXZlJykpIHtcbiAgICAgICAgICAgIG9ic2VydmVyVGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlclRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGwtbG9jaycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICBjaGlsZExpc3Q6IHRydWVcbiAgICB9XG4gICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc2Nyb2xsTG9jayk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShvYnNlcnZlclRhcmdldCwgb3B0aW9ucyk7XG5cbiAgICAvLyBpbml0IHVuaXRzIHRvIHVzIG9yIG1ldHJpY1xuICAgIHN0b3JlLmRpc3BhdGNoKCdpbml0VW5pdHMnKTtcbiAgICAvLyBpbml0IGdldHRpbmcgR0EgY2xpZW50IElEXG4gICAgc3RvcmUuZGlzcGF0Y2goJ2luaXRHQUlEJyk7XG59KTtcblxuc3RvcmUuZGlzcGF0Y2goJ2luaXRDb29raWVzJyk7IC8vaW5pdCBjb29raWVzIGZvciBib29rbWFyayBmZWF0dXJlXG5zdG9yZS5kaXNwYXRjaCgnY2hlY2tNb2JpbGUnKTsgXG4iLCJpZiAoIUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHtcblx0RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyA9IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xufVxuXG5pZiAoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QpIHtcblx0RWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCA9IGZ1bmN0aW9uIGNsb3Nlc3Qocykge1xuXHRcdGNvbnN0IGVsID0gdGhpcztcblx0XHRsZXQgYW5jZXN0b3IgPSB0aGlzO1xuXHRcdGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGVsKSkgcmV0dXJuIG51bGw7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKGFuY2VzdG9yLm1hdGNoZXMocykpIHJldHVybiBhbmNlc3Rvcjtcblx0XHRcdGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50RWxlbWVudDtcblx0XHR9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH07XG59XG4iLCIvLyBNb2Rlcm5penIgc3R5bGUgdGVzdFxuaWYgKCEod2luZG93LndlYmtpdE1hdGNoTWVkaWEgfHwgd2luZG93Lm1vek1hdGNoTWVkaWEgfHwgd2luZG93Lm9NYXRjaE1lZGlhIHx8IHdpbmRvdy5tc01hdGNoTWVkaWEgfHwgd2luZG93Lm1hdGNoTWVkaWEpKSB7XG5cdHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICdodG1sJyApWzBdO1xuXHRyb290LmNsYXNzTmFtZSArPSAnIG5vLW1hdGNobWVkaWEnO1xufVxuXG4vKiEgbWF0Y2hNZWRpYSgpIHBvbHlmaWxsIC0gVGVzdCBhIENTUyBtZWRpYSB0eXBlL3F1ZXJ5IGluIEpTLiBBdXRob3JzICYgY29weXJpZ2h0IChjKSAyMDEyOiBTY290dCBKZWhsLCBQYXVsIElyaXNoLCBOaWNob2xhcyBaYWthcywgRGF2aWQgS25pZ2h0LiBEdWFsIE1JVC9CU0QgbGljZW5zZSAqL1xud2luZG93Lm1hdGNoTWVkaWEgfHwgKHdpbmRvdy5tYXRjaE1lZGlhID0gZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAvLyBGb3IgYnJvd3NlcnMgdGhhdCBzdXBwb3J0IG1hdGNoTWVkaXVtIGFwaSBzdWNoIGFzIElFIDkgYW5kIHdlYmtpdFxuICAgIHZhciBzdHlsZU1lZGlhID0gKHdpbmRvdy5zdHlsZU1lZGlhIHx8IHdpbmRvdy5tZWRpYSk7XG5cbiAgICAvLyBGb3IgdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IG1hdGNoTWVkaXVtXG4gICAgaWYgKCFzdHlsZU1lZGlhKSB7XG4gICAgICAgIHZhciBzdHlsZSAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyksXG4gICAgICAgICAgICBzY3JpcHQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXSxcbiAgICAgICAgICAgIGluZm8gICAgICAgID0gbnVsbDtcblxuICAgICAgICBzdHlsZS50eXBlICA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgIHN0eWxlLmlkICAgID0gJ21hdGNobWVkaWFqcy10ZXN0JztcblxuICAgICAgICBzY3JpcHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3R5bGUsIHNjcmlwdCk7XG5cbiAgICAgICAgLy8gJ3N0eWxlLmN1cnJlbnRTdHlsZScgaXMgdXNlZCBieSBJRSA8PSA4IGFuZCAnd2luZG93LmdldENvbXB1dGVkU3R5bGUnIGZvciBhbGwgb3RoZXIgYnJvd3NlcnNcbiAgICAgICAgaW5mbyA9ICgnZ2V0Q29tcHV0ZWRTdHlsZScgaW4gd2luZG93KSAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSwgbnVsbCkgfHwgc3R5bGUuY3VycmVudFN0eWxlO1xuXG4gICAgICAgIHN0eWxlTWVkaWEgPSB7XG4gICAgICAgICAgICBtYXRjaE1lZGl1bTogZnVuY3Rpb24obWVkaWEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICdAbWVkaWEgJyArIG1lZGlhICsgJ3sgI21hdGNobWVkaWFqcy10ZXN0IHsgd2lkdGg6IDFweDsgfSB9JztcblxuICAgICAgICAgICAgICAgIC8vICdzdHlsZS5zdHlsZVNoZWV0JyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICdzdHlsZS50ZXh0Q29udGVudCcgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRlc3QgaWYgbWVkaWEgcXVlcnkgaXMgdHJ1ZSBvciBmYWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLndpZHRoID09PSAnMXB4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24obWVkaWEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoZXM6IHN0eWxlTWVkaWEubWF0Y2hNZWRpdW0obWVkaWEgfHwgJ2FsbCcpLFxuICAgICAgICAgICAgbWVkaWE6IG1lZGlhIHx8ICdhbGwnXG4gICAgICAgIH07XG4gICAgfTtcbn0oKSk7XG5cbi8qISBtYXRjaE1lZGlhKCkgcG9seWZpbGwgYWRkRXZlbnRMaXN0ZW5lci9yZW1vdmVFdmVudExpc3RlbmVyIGV4dGVuc2lvbi4gQXV0aG9yICYgY29weXJpZ2h0IChjKSAyMDEyOiBTY290dCBKZWhsLiBEdWFsIE1JVC9CU0QgbGljZW5zZSAqL1xuKGZ1bmN0aW9uKCl7XG4gICAgLy8gQmFpbCBvdXQgZm9yIGJyb3dzZXJzIHRoYXQgaGF2ZSBhZGRFdmVudExpc3RlbmVyIHN1cHBvcnRcbiAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJ2FsbCcpLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsb2NhbE1hdGNoTWVkaWEgPSB3aW5kb3cubWF0Y2hNZWRpYSxcbiAgICAgICAgaGFzTWVkaWFRdWVyaWVzID0gbG9jYWxNYXRjaE1lZGlhKCdvbmx5IGFsbCcpLm1hdGNoZXMsXG4gICAgICAgIGlzTGlzdGVuaW5nICAgICA9IGZhbHNlLFxuICAgICAgICB0aW1lb3V0SUQgICAgICAgPSAwLCAgICAvLyBzZXRUaW1lb3V0IGZvciBkZWJvdW5jaW5nICdoYW5kbGVDaGFuZ2UnXG4gICAgICAgIHF1ZXJpZXMgICAgICAgICA9IFtdLCAgIC8vIENvbnRhaW5zIGVhY2ggJ21xbCcgYW5kIGFzc29jaWF0ZWQgJ2xpc3RlbmVycycgaWYgJ2FkZEV2ZW50TGlzdGVuZXInIGlzIHVzZWRcbiAgICAgICAgaGFuZGxlQ2hhbmdlICAgID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICAvLyBEZWJvdW5jZVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7XG5cbiAgICAgICAgICAgIHRpbWVvdXRJRCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gcXVlcmllcy5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWwgICAgICAgICA9IHF1ZXJpZXNbaV0ubXFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzICAgPSBxdWVyaWVzW2ldLmxpc3RlbmVycyB8fCBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgICAgID0gbG9jYWxNYXRjaE1lZGlhKG1xbC5tZWRpYSkubWF0Y2hlcztcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbXFsLm1hdGNoZXMgdmFsdWUgYW5kIGNhbGwgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgbGlzdGVuZXJzIG9ubHkgaWYgdHJhbnNpdGlvbmluZyB0byBvciBmcm9tIG1hdGNoZWQgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgIT09IG1xbC5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtcWwubWF0Y2hlcyA9IG1hdGNoZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqbCA9IGxpc3RlbmVycy5sZW5ndGg7IGogPCBqbDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzW2pdLmNhbGwod2luZG93LCBtcWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMzApO1xuICAgICAgICB9O1xuXG4gICAgd2luZG93Lm1hdGNoTWVkaWEgPSBmdW5jdGlvbihtZWRpYSkge1xuICAgICAgICB2YXIgbXFsICAgICAgICAgPSBsb2NhbE1hdGNoTWVkaWEobWVkaWEpLFxuICAgICAgICAgICAgbGlzdGVuZXJzICAgPSBbXSxcbiAgICAgICAgICAgIGluZGV4ICAgICAgID0gMDtcblxuICAgICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAvLyBDaGFuZ2VzIHdvdWxkIG5vdCBvY2N1ciB0byBjc3MgbWVkaWEgdHlwZSBzbyByZXR1cm4gbm93IChBZmZlY3RzIElFIDw9IDgpXG4gICAgICAgICAgICBpZiAoIWhhc01lZGlhUXVlcmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHVwICdyZXNpemUnIGxpc3RlbmVyIGZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgQ1NTMyBtZWRpYSBxdWVyaWVzIChOb3QgZm9yIElFIDw9IDgpXG4gICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgb25seSBldmVyIGJlIDEgcmVzaXplIGxpc3RlbmVyIHJ1bm5pbmcgZm9yIHBlcmZvcm1hbmNlXG4gICAgICAgICAgICBpZiAoIWlzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAgICAgaXNMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVDaGFuZ2UsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQdXNoIG9iamVjdCBvbmx5IGlmIGl0IGhhcyBub3QgYmVlbiBwdXNoZWQgYWxyZWFkeVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBxdWVyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtcWwgICAgICAgICA6IG1xbCxcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzICAgOiBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG1xbC5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBpbDsgaSsrKXtcbiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lcil7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtcWw7XG4gICAgfTtcbn0oKSk7XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwibWV0ZXJTZWxlY3RvclwiOiB7XG4gICAgXCJhcGlRdWVyeVwiOiBbXG4gICAgICBcImZsb3dUeXBlXCJcbiAgICBdLFxuICAgIFwicXVlc3Rpb25cIjogXCJXaGF0IGFyZSB5b3UgbWVhc3VyaW5nP1wiLFxuICAgIFwidG90YWxTdGVwc1wiOiA5LFxuICAgIFwiZmlsdGVyTmFtZVwiOiBcIkZsb3cgdHlwZVwiLFxuICAgIFwic3RlcElkXCI6IFwiMDEuMFwiLFxuICAgIFwiYnV0dG9uXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJsYWJlbFwiOiBcIldhdGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJXYXRlclwiLFxuICAgICAgICBcImljb25cIjogXCJ3YXRlclwiLFxuICAgICAgICBcInRvdGFsUGFnZXNcIjogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibGFiZWxcIjogXCJPaWxcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIk9pbFwiLFxuICAgICAgICBcImljb25cIjogXCJvaWxcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJsYWJlbFwiOiBcIlN0ZWFtXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJTdGVhbVwiLFxuICAgICAgICBcImljb25cIjogXCJzdGVhbVwiLFxuICAgICAgICBcInRvdGFsUGFnZXNcIjogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibGFiZWxcIjogXCJBaXIgLyBHYXNcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIkFpciAvIEdhc1wiLFxuICAgICAgICBcImljb25cIjogXCJhaXItZ2FzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibGFiZWxcIjogXCJPdGhlciBsaXF1aWRcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIk90aGVyIGxpcXVpZFwiLFxuICAgICAgICBcImljb25cIjogXCJvdGhlclwiLFxuICAgICAgICBcInNlbGVjdGVkTGFiZWxcIjogXCJCYXNlZCBvbiB5b3VyIHNlbGVjdGlvbiwgd2UgcmVjb21tZW5kIHlvdSA8YSB0aXRsZT1cXFwiQ29ubmVjdCB3aXRoIGEgcHJvZHVjdCBleHBlcnRcXFwiIGhyZWY9XFxcIi9tZXRlci1zZWxlY3Rvci8jbWV0ZXJzZWxlY3RvclxcXCI+Y29ubmVjdCB3aXRoIGEgcHJvZHVjdCBleHBlcnQ8L2E+wqBmb3IgYXNzaXN0YW5jZSBmaW5kaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRlciBvcHRpb25zIGZvciB5b3VyIGFwcGxpY2F0aW9uLlwiLFxuICAgICAgICBcInRvdGFsUGFnZXNcIjogMTBcbiAgICAgIH1cbiAgICBdLFxuICAgIFwic2VhcmNoUmVzdWx0c1wiOiB7XG4gICAgICBcIlJlc3VsdHNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzlmZnJ0NjJmb2EvanBlZy9BaXIlMjBhbmQlMjBDb21wcmVzc2VkJTIwR2FzJTIwTWV0ZXJzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC95aGYwa2t0ZnNkL3BuZy9IZWRsYW5kLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJBaXIgYW5kIENvbXByZXNzZWQgR2FzIE1ldGVyXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3ZhcmlhYmxlLWFyZWEtZmxvdy1tZXRlcnMvYWlyLWFuZC1jb21wcmVzc2VkLWdhcy1tZXRlci9cIixcbiAgICAgICAgICBcImlkXCI6IFwiOTRcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjxwPlNpemU8L3A+XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNC4uLjMgaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uODAgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjxwPlRlbXBlcmF0dXJlIFJhbmdlPC9wPlwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCItMjAuLi4yNDAgwrBGXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCItMjkuLi4xMTYgwrBDXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCI8cD5GbG93IFJhbmdlPC9wPlwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIwLjUuLi4yMjAwIHNjZm1cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjAuMi4uLjExMzAgbC9zZWNcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjxwPlByZXNzdXJlIFJhbmdlPC9wPlwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byAxNTAwIFBTSVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gMTAzIGJhclwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJBdXRvbW90aXZlIEZsdWlkIERpc3BlbnNpbmdcIixcbiAgICAgICAgICAgIFwiQXZpYXRpb24gJiBBZXJvc3BhY2VcIixcbiAgICAgICAgICAgIFwiTXVuaWNpcGFsIFdhdGVyIFRyZWF0bWVudCAmIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIlZhcmlhYmxlIEFyZWEgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiSGVkbGFuZFwiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiZ3VpZFwiOiBcImNhMzMxMTM2LWZmNmUtNDNjMS1iNTEzLWQyMDlhNDU1ZTEzOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvbHk0dXZzNDJoZS9qcGVnL0Fpci1DYXVzdGljJTIwYW5kJTIwQ29ycm9zaXZlJTIwR2FzJTIwTWV0ZXJzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC95aGYwa2t0ZnNkL3BuZy9IZWRsYW5kLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDYXVzdGljIGFuZCBDb3Jyb3NpdmUgQWlyL0dhcyBNZXRlclwiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy92YXJpYWJsZS1hcmVhLWZsb3ctbWV0ZXJzL2NhdXN0aWMtYW5kLWNvcnJvc2l2ZS1haXJnYXMtbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjk2XCIsXG4gICAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNOKApjEgMS8yIGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNi4uLjQwIG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJUZW1wZXJhdHVyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIgLTIwLi4uMjQwIMKwRlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiLTI54oCmMTE2IMKwQ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRmxvdyBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIyLi4uODAwIHNjZm1cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjHigKYzNTAgbHBtXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJBY2N1cmFjeVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCLCsTIlICgxLzQgaW4uIGlzICs3JSlcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIsKxMiUgKDEvNCBpbi4gaXMgKzclKVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJBdXRvbW90aXZlIEZsdWlkIERpc3BlbnNpbmdcIixcbiAgICAgICAgICAgIFwiQXZpYXRpb24gJiBBZXJvc3BhY2VcIixcbiAgICAgICAgICAgIFwiTXVuaWNpcGFsIFdhdGVyIFRyZWF0bWVudCAmIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIlZhcmlhYmxlIEFyZWEgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiSGVkbGFuZFwiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiZ3VpZFwiOiBcIjM0OTA3NDg2LTI3ODMtNDMwMS1iYmU4LWQyNTRlMDJlMTk3YlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvNWxyYXd1eXFuZC9qcGVnL0NPSU4tRkYlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NDAwJmg9NDAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvenpoZWxqdXNvMC9wbmcvUHJlc28tTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNPSU4gRkZcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXJzL2NvaW4td2VkZ2UtZmxhbmdlLXByb2Nlc3MtYnktZmxhbmdlLWluc3RydW1lbnRhdGlvbi1tb2RlbC1mZi1mbG93LW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxMzlcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS8yLi4uNDggaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIxMi4uLjEyMTkgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDE1MDAgwrBGXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byA4MTUgwrBDXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiRGVwZW5kZW50IG9uIGZsYW5nZSByYXRpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFjY3VyYWN5XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIkRpZmZlcmVudGlhbCBQcmVzc3VyZSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJQcmVzb1wiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgICBcIlN0ZWFtXCIsXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiNTc4NjkwODctOGM4Ny00NmU0LWI5NjItYzBhNDMyNDc2MzJkXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9zOGl5bWJucWMzL2pwZWcvQ09JTi1OQi0lMjh3aXRoLXdlbGQlMjklMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NDAwJmg9NDAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvenpoZWxqdXNvMC9wbmcvUHJlc28tTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNPSU4gTkJcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXJzL2NvaW4tYnV0dC13ZWxkLXdlZGdlLW1vZGVsLW5iLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjEzN1wiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi40IGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMTIuLi4xMDEgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDgwMCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDQyNiDCsENcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByZXNzdXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIkRlcGVuZGVudCBvbiBmbGFuZ2UgcmF0aW5nXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiQWNjdXJhY3lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsICYgR2FzXCIsXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiRGlmZmVyZW50aWFsIFByZXNzdXJlIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIlByZXNvXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCIzMWZkZmU2Yi1kMDQwLTQwMWEtYWQwYi00ZTY0ZTAwMTYwMTZcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L204dmVycDV0bmkvanBlZy9DT0lOLU5GJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTQwMCZoPTQwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3p6aGVsanVzbzAvcG5nL1ByZXNvLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDT0lOIE5GXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2RpZmZlcmVudGlhbC1wcmVzc3VyZS1mbG93LW1ldGVycy9jb2luLWZsYW5nZWQtd2l0aC1ucHQtcHJlc3N1cmUtdGFwcy1tb2RlbC1uZi1mbG93LW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxMzhcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS8yLi4uNDggaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIxMi4uLjEsMjE5IG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJBY2N1cmFjeVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInByb2R1Y3RDYXRlZ29yeVwiOiBcIk1ldGVyc1wiLFxuICAgICAgICAgIFwicHJvZHVjdFR5cGVcIjogXCJEaWZmZXJlbnRpYWwgUHJlc3N1cmUgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiUHJlc29cIixcbiAgICAgICAgICBcImZsb3dUeXBlc1wiOiBbXG4gICAgICAgICAgICBcIk9pbFwiLFxuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIixcbiAgICAgICAgICAgIFwiV2F0ZXJcIixcbiAgICAgICAgICAgIFwiT3RoZXIgbGlxdWlkXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiZ3VpZFwiOiBcImRjYjdiZDY1LWExZmEtNDMwOS1iYjRkLTY5NzI3NGExNjIzYVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvM25pd2F6N3Zwci9qcGVnL05OJTIwQmFjay10by1CYWNrLVdlZGdlLU1ldGVyJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTQwMCZoPTQwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3p6aGVsanVzbzAvcG5nL1ByZXNvLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDT0lOIE5OXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2RpZmZlcmVudGlhbC1wcmVzc3VyZS1mbG93LW1ldGVycy9jb2luLWJhY2stdG8tYmFjay13ZWRnZS1tb2RlbC1ubi1mbG93LW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxMzZcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS8yLi4uNiBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEyLi4uMTUyIG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJUZW1wZXJhdHVyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byA4MDAgwrBGXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byA0MjYgwrBDXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiRGVwZW5kZW50IG9uIGZsYW5nZSByYXRpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFjY3VyYWN5XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIkRpZmZlcmVudGlhbCBQcmVzc3VyZSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJQcmVzb1wiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgICBcIlN0ZWFtXCIsXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiMmFjYzE5M2MtZGFkNy00NWUyLWIyZGEtZDY2NzE1Yzk5YjZkXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9xaTdtNXRxYzk0L2pwZWcvQ09JTi1OVyUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz00MDAmaD00MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96emhlbGp1c28wL3BuZy9QcmVzby1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQ29pbiBOV1wiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9kaWZmZXJlbnRpYWwtcHJlc3N1cmUtZmxvdy1tZXRlcnMvY29pbi13ZWRnZS13YWZlci1tb2RlbC1udy1mbG93LW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxMzVcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS8yLi4uNCBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEzLi4uMTAxIG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJUZW1wZXJhdHVyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byA4MDAgwrBGXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byA0MjYgwrBDXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYXRpbmdcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiRGVwZW5kZW50IG9uIGZsYW5nZSByYXRpbmcgXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiQWNjdXJhY3lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsICYgR2FzXCIsXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiRGlmZmVyZW50aWFsIFByZXNzdXJlIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIlByZXNvXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCJkN2E3MTIxZC0zOTFhLTRmNGMtODBmOC1kNjgyYmY3NjY5ZDhcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3B5ZmJvZ2ZrNGwvanBlZy8yMDE5X0NvbmUlMjBNZXRlciUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz00MDAmaD00MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96emhlbGp1c28wL3BuZy9QcmVzby1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQ29uZSBEUCBNZXRlcnNcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXJzL2NvbmUtZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjE0MFwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi4yNCBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEyLi4uNjA5IG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJBY2N1cmFjeVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCLCsTAuNSVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIsKxMC41JVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJBdmlhdGlvbiAmIEFlcm9zcGFjZVwiLFxuICAgICAgICAgICAgXCJCdWlsZGluZyBEZXNpZ24sIEhWQUMsICYgUGx1bWJpbmdcIixcbiAgICAgICAgICAgIFwiTXVuaWNpcGFsIFdhdGVyIFRyZWF0bWVudCAmIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIkRpZmZlcmVudGlhbCBQcmVzc3VyZSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJQcmVzb1wiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgICBcIlN0ZWFtXCIsXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiZDNiY2IyYTgtZGFiMy00NTlkLThiZTYtYjdjNzQ4OWQ2Mjk4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9zYWJ3dnAyeXNzL2pwZWcvQ294JTIwR2FzJTIwVHVyYmluZSUyME1ldGVycyUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJiNzNwZlwiLFxuICAgICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvaTNjMG1vejE1aS9wbmcvQ294LUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDUEcgLSBQcmVjaXNpb24gTWV0ZXIgZm9yIEdhc2VzXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3R1cmJpbmUtZmxvdy1tZXRlcnMvcHJlY2lzaW9uLWdhcy1mbG93LW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxNDhcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMC4yNS4uLjIgaW4uIFwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNi4uLjUwIG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJGbG93IFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjAuNC4uLjI1MCBzY2ZtXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIxLjg5Li4uMTE4IGxwc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJlc3N1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gNTAwMCBQU0lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDM0NCBiYXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDUwMCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDI2MCDCsENcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiQXZpYXRpb24gJiBBZXJvc3BhY2VcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIlR1cmJpbmUgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiQ294XCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiY2UwYzNiMTMtZjg3MC00MTEyLWJhYmEtYTg2ZTFmYzA2NGMwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC95bHcwbGQ5a29sL2pwZWcvQ294JTIwUHJlY2lzaW9uJTIwVHVyYmluZSUyME1ldGVycyUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJmtlZXA9YyZjcm9wPXllcyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9pM2MwbW96MTVpL3BuZy9Db3gtTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNQVCAtIFByZWNpc2lvbiBTaW5nbGUgUm90b3JcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdHVyYmluZS1mbG93LW1ldGVycy9wcmVjaXNpb24tdHVyYmluZS1tZXRlci9cIixcbiAgICAgICAgICBcImlkXCI6IFwiMTQ2XCIsXG4gICAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjAuMjUuLi4yIGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNi4uLjUwIG1tXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJGbG93IFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjAuMDUuLi4zMTAgZ3BtXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIwLjE5Li4uMTE3MyBsL21pblwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJlc3N1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gNjAwMCBQU0lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDQwOCBiYXJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDQ1MCDCsEYgXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byAyMzIgwrBDXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIkF2aWF0aW9uICYgQWVyb3NwYWNlXCIsXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIixcbiAgICAgICAgICAgIFwiVGVzdCBFcXVpcG1lbnQgJiBTZXJ2aWNlc1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInByb2R1Y3RDYXRlZ29yeVwiOiBcIk1ldGVyc1wiLFxuICAgICAgICAgIFwicHJvZHVjdFR5cGVcIjogXCJUdXJiaW5lIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIkNveFwiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiZjllZmQ5Y2YtMmIwMC00NjYxLTk3YWMtMmM2ZWJhMDRhOTk0XCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiU2F2ZWRJdGVtc0NvdW50XCI6IDAsXG4gICAgICBcIlRvdGFsUmVzdWx0c1wiOiA3LFxuICAgICAgXCJWaWV3UHJvZHVjdExhYmVsXCI6IFwidmlldyBwcm9kdWN0IGxhYmVsXCJcbiAgICB9XG4gIH0sXG4gIFwic2VhcmNoUmVzdWx0c1wiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIk0yMDAwIEVsZWN0cm9tYWduZXRpYyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db21iaW5pbmcgYSBnZW5lcmFsLXB1cnBvc2UgZGV0ZWN0b3Igd2l0aCBhbiBhbXBsaWZpZXIsIHRoZSBNb2RNQUc8c3VwPiZyZWc7PC9zdXA+IE0yMDAwIEVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGZlYXR1cmVzIGFuIGFkdmFuY2VkLCB1c2VyLWZyaWVuZGx5IGRlc2lnbiB0aGF0IGlzIGJ1aWx0IGZvciBmaWVsZCB2ZXJpZmljYXRpb24gdGVzdGluZyB3aXRoIHRoZSB1c2Ugb2YgYSBzaW1wbGUsIGhhbmRoZWxkIGRldmljZS48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50Lzk3dnVudjN2c3YvanBlZy9Nb2RNQUctTTIwMDAtJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZWxlY3Ryb21hZ25ldGljLWZsb3ctbWV0ZXJzL20yMDAwLWVsZWN0cm9tYWduZXRpYy1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfMTY2NmExNjItMmRmZC00NGQ3LTlmMzQtOWIzOWYwOTBiMjIzX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJNNTAwMCBFbGVjdHJvbWFnbmV0aWMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIE1vZE1BRzxzdXA+JnJlZzs8L3N1cD4gTTUwMDAgRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgaXMgYW4gaWRlYWwgc29sdXRpb24gZm9yIHJlbW90ZSBwb3RhYmxlIHdhdGVyIGFwcGxpY2F0aW9ucywgcHJvdmlkaW5nIGNvbnNpc3RlbnRseSByZWxpYWJsZSBhbmQgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvOXlpaGpidWVwdi9qcGVnL01vZE1BRy1NNTAwMC0lMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1oZGtweHFcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlcnMvbTUwMDAtZWxlY3Ryb21hZ25ldGljLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF9iZmI0MjYwNS1hMTFhLTRjOTItYTU4ZS04MTJkMDU1MjdkMjhfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjxwPlU1MDB3IFVsdHJhc29uaWMgRmxvdyBNZXRlcjwvcD5cIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBEeW5hc29uaWNzPHN1cD4mcmVnOzwvc3VwPiBVNTAwdyBVbHRyYXNvbmljIGZsb3cgbWV0ZXIgdXNlcyBzb2xpZC1zdGF0ZSB0ZWNobm9sb2d5IGluIGEgY29tcGFjdCwgY29tcGxldGVseSBlbmNhcHN1bGF0ZWQgaG91c2luZywgc3VpdGFibGUgZm9yIHJlc2lkZW50aWFsIGFuZCBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucy48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L250aGVoc29hYmwvanBlZy9VNTAwdyUyMFVsdHJhc29uaWMlMjBGbG93JTIwTWV0ZXJzJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1oZGtweHFcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy91bHRyYXNvbmljLWZsb3ctbWV0ZXJzL3U1MDB3LXVsdHJhc29uaWMtZmxvdy1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50XzJlYWY2YmE5LTkzNDAtNGYwMi1hNWJmLTI3ZTBkYWI0YmNmMl9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiRFhOIFBvcnRhYmxlIEh5YnJpZCBVbHRyYXNvbmljIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBEeW5hc29uaWNzPHN1cD4mcmVnOzwvc3VwPiBEWE4gUG9ydGFibGUgSHlicmlkIFVsdHJhc29uaWMgZmxvdyBtZXRlciBpcyBhIHBvd2VyZnVsIHRvb2wgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIGZsb3cgaXNzdWVzLCB3aGV0aGVyIHlvdSB3YW50IHRvIHF1aWNrbHkgdmVyaWZ5IHRoZSBmbG93IHJlYWRpbmcgb2YgYW5vdGhlciBtZXRlciBvciB0byBkYXRhIGxvZyBmbG93IHN5c3RlbSB2YWx1ZXMgb3ZlciBhbiBleHRlbmRlZCBwZXJpb2Qgb2YgdGltZS48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzF1eWU1MGl6YnovanBlZy9IeWJyaWQlMjBVbHRyYXNvbmljJTIwRmxvdyUyME1ldGVycyUyMC0lMjBEWE4lMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NjAwJmg9NjAwJmtlZXA9YyZjcm9wPXllcyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdWx0cmFzb25pYy1mbG93LW1ldGVycy9keG4tcG9ydGFibGUtaHlicmlkLXVsdHJhc29uaWMtZmxvdy1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50XzU0YjM0ODNiLTMzYzUtNDEwNi1hMTJiLWE1MzBhZjhmNTNjNl9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiMzgwIFNlcmllcyBCVFUgU3lzdGVtIE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgU2VyaWVzIDM4MCBCVFUgbWV0ZXIgaXMgYW4gYWxsLWluLW9uZSBlbmVyZ3kgdXNhZ2UgcGFja2FnZSBmb3IgbW9uaXRvcmluZyBoeWRyb25pYyBoZWF0aW5nIG9yIGNvb2xpbmcgc3lzdGVtcy4gVGhpcyBtZXRlciBhY2N1cmF0ZWx5IG1lYXN1cmVzIGZsb3cgYW5kIHRlbXBlcmF0dXJlIGRpZmZlcmVudGlhbCB0byBjb21wdXRlIGVuZXJneSBhbmQgY2FuIGludGVyZmFjZSB3aXRoIG1hbnkgZXhpc3RpbmcgY29udHJvbCBzeXN0ZW1zLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvc2J0ZHBnY3h2ZC9qcGVnLzM4MCUyMFNlcmllcyUyMEJ0dSUyMFN5c3RlbSUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2ltcGVsbGVyLWZsb3ctcHJvZHVjdHMvMzgwLXNlcmllcy1idHUtc3lzdGVtLW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfOWQwOGEyOWYtYzZhNy00NzgzLTlhODUtNzc0YjM2OWRjODlkX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCI8cD5QcmVjaXNpb24gVHVyYmluZSBNZXRlcjwvcD5cIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBDb3g8c3VwPiZyZWc7PC9zdXA+IFByZWNpc2lvbiBUdXJiaW5lIE1ldGVyIGhhcyB1bnByZWNlZGVudGVkIG1lY2hhbmljYWwgbGluZWFyaXR5LCByZXN1bHRpbmcgaW4gbWluaW1pemluZyBvciBuZWdhdGluZyB0ZW1wZXJhdHVyZSBpbmR1Y2VkIHZpc2Nvc2l0eSBpbmZsdWVuY2UuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC95bHcwbGQ5a29sL2pwZWcvQ294JTIwUHJlY2lzaW9uJTIwVHVyYmluZSUyME1ldGVycyUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJmtlZXA9YyZjcm9wPXllcyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdHVyYmluZS1mbG93LW1ldGVycy9wcmVjaXNpb24tdHVyYmluZS1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50X2Y5ZWZkOWNmLTJiMDAtNDY2MS05N2FjLTJjNmViYTA0YTk5NF9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiQjE3NTAgUG9zaXRpdmUgRGlzcGxhY2VtZW50IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgQmxhbmNldHQ8c3VwPiZyZWc7PC9zdXA+IEIxNzUwIFBvc2l0aXZlIERpc3BsYWNlbWVudCBtZXRlciBwcm92aWRlcyBoaWdoIG1lYXN1cmVtZW50IGFjY3VyYWN5IGZvciBmbHVpZHMgb3ZlciBhIHdpZGUgdmlzY29zaXR5IHJhbmdlLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvaWR2M2V4bWJyai9qcGVnL1Bvc2l0aXZlJTIwRGlzcGxhY2VtZW50JTIwLSUyMEIxNzUwJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAma2VlcD1jJmNyb3A9eWVzJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy90dXJiaW5lLWZsb3ctbWV0ZXJzL2IxNzUwLXBvc2l0aXZlLWRpc3BsYWNlbWVudC1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50XzM5OGI2OGE5LTUzYWEtNGY2MC04ZGFkLTg4OWM0NzY0NDMyNF9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiQjE1MDAgVHVyYmluZSBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgQmxhbmNldHQ8c3VwPiZyZWc7PC9zdXA+IEIxNTAwIFR1cmJpbmUgZmxvdyBtZXRlciBoYXMgZXhjZXB0aW9uYWwgbWVjaGFuaWNhbCBsaW5lYXJpdHksIHJlc3VsdGluZyBpbiBtaW5pbWl6aW5nIG9yIG5lZ2F0aW5nIHRlbXBlcmF0dXJlIGluZHVjZWQgdmlzY29zaXR5IGluZmx1ZW5jZS48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3Zldml6YjJ6cGMvanBlZy9CMTUwMCUyMHdpdGglMjBNb25pdG9yJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZrZWVwPWMmY3JvcD15ZXMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3R1cmJpbmUtZmxvdy1tZXRlcnMvYjE1MDAtdHVyYmluZS1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfMTM5MjY0NWEtZTZkYi00YWZlLWE4M2EtN2UyYWI4ZDk1NjU4X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCI5MDAgU2VyaWVzIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBCbGFuY2V0dDxzdXA+JnJlZzs8L3N1cD4gOTAwIFNlcmllcyBmbG93IG1ldGVyIGlzIHJ1Z2dlZCwgbG93LXByaWNlZCBhbmQgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIG1lYXN1cmUgZmxvb2R3YXRlciBsaW5lIGZsb3cgaW4gc2Vjb25kYXJ5IG9pbCByZWNvdmVyeSBvcGVyYXRpb25zLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvd2JuYmNrY2hxdS9qcGVnLzkwMCUyMFNlcmllcyUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJiNzNwZlwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3R1cmJpbmUtZmxvdy1tZXRlcnMvOTAwLXNlcmllcy1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfM2QzOTllM2EtMmU5OC00ODRlLThlNzEtM2JkZmYyNGJiNjVkX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJQaG9zcGhhdGUgRXN0ZXIgRmx1aWQgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBIZWRsYW5kPHN1cD4mcmVnOzwvc3VwPiBwaG9zcGhhdGUgZXN0ZXIgZmx1aWQgbWV0ZXIgcHJvdmlkZXMgYSBtZWFzdXJlbWVudCBzb2x1dGlvbiBmb3IgZmlyZS1yZXNpc3RhbnQgZmx1aWRzLCBhdmlhdGlvbiBoeWRyYXVsaWMgZmx1aWQgYW5kIGluZHVzdHJpYWwgbHVicmljYW50LCB3aGljaCBoYXZlIGhpZ2ggaWduaXRpb24gdGVtcGVyYXR1cmVzIGFuZCBsb3cgdmFwb3IgcHJlc3N1cmVzLjwvcD5cXG48cD48YSB0aXRsZT1cXFwiRG93bmxvYWQgYSBIZWRsYW5kIFByaWNlIExpc3RcXFwiIGhyZWY9XFxcIi9saW5rL2NhMDliMjZhMDQwNTQ0ZTFiNzQyNmM3OTVjYzIyNzA3LmFzcHhcXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIiByZWw9XFxcIm5vb3BlbmVyXFxcIj48ZW0+RG93bmxvYWQgYSBIZWRsYW5kIFByaWNlIExpc3Q8L2VtPjwvYT48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzdrZXV0M2FpZnkvanBlZy9QaG9zcGhhdGUlMjBFc3RlciUyMEZsdWlkJTIwTWV0ZXIlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJiNzNwZlwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3ZhcmlhYmxlLWFyZWEtZmxvdy1tZXRlcnMvcGhvc3BoYXRlLWVzdGVyLWZsdWlkLW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfODIyODVjMTQtMTRiNy00ZTY1LTk4NDgtM2M2N2M2YTFjMWU4X2VuXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIFwic2F2ZWRJdGVtc0NvdW50XCI6IDAsXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogMTU0MixcbiAgICBcInRyYWNrSWRcIjogXCJKWGtKWXJkdHFoa0ZOeUN0Q3JCblB3PT1cIixcbiAgICBcImZpbHRlckNvdW50UmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiY291bnRcIjogMTk2XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU2LFxuICAgICAgICBcImNvdW50XCI6IDI0XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDE1OSxcbiAgICAgICAgXCJjb3VudFwiOiA5XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDYwLFxuICAgICAgICBcImNvdW50XCI6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM2LFxuICAgICAgICBcImNvdW50XCI6IDdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMjIyLFxuICAgICAgICBcImNvdW50XCI6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDIwNSxcbiAgICAgICAgXCJjb3VudFwiOiA5XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDY1LFxuICAgICAgICBcImNvdW50XCI6IDIzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDY0LFxuICAgICAgICBcImNvdW50XCI6IDE5XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImNvdW50XCI6IDEwNzhcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTYxLFxuICAgICAgICBcImNvdW50XCI6IDExXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDE1NyxcbiAgICAgICAgXCJjb3VudFwiOiA1N1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAxNTgsXG4gICAgICAgIFwiY291bnRcIjogMjFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMjAxLFxuICAgICAgICBcImNvdW50XCI6IDQ3XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU4LFxuICAgICAgICBcImNvdW50XCI6IDE0XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDE2MCxcbiAgICAgICAgXCJjb3VudFwiOiA3XG4gICAgICB9XG4gICAgXSxcbiAgICBcImRpZFlvdU1lYW5cIjogW1xuICAgICAgXCJtZXRlciBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICBcInN0cmFpbmVyXCIsXG4gICAgICBcInB1bHNlIG1ldGVyXCIsXG4gICAgICBcIm1ldGVyc1wiLFxuICAgICAgXCJtZXRlciBcIlxuICAgIF1cbiAgfSxcbiAgXCJzZWFyY2hSZXN1bHRzMlwiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIlNwZWNpZmljYXRpb25zIC8gTW9kTUFHXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNb2RNQUfCriBNMzAwMFwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiL3N0YXRpYy9pbWFnZXMvZG9jLWljb24uc3ZnXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvMHl0d2g1MXJhbS9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fYzYzNWIxODItODY3ZC00NmFiLWJiYTYtY2ZhNGU4MmIzZTQ5X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJNMjAwMCBFbGVjdHJvbWFnbmV0aWMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+Q29tYmluaW5nIGEgZ2VuZXJhbC1wdXJwb3NlIGRldGVjdG9yIHdpdGggYW4gYW1wbGlmaWVyLCB0aGUgTW9kTUFHPHN1cD4mcmVnOzwvc3VwPiBNMjAwMCBFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBmZWF0dXJlcyBhbiBhZHZhbmNlZCwgdXNlci1mcmllbmRseSBkZXNpZ24gdGhhdCBpcyBidWlsdCBmb3IgZmllbGQgdmVyaWZpY2F0aW9uIHRlc3Rpbmcgd2l0aCB0aGUgdXNlIG9mIGEgc2ltcGxlLCBoYW5kaGVsZCBkZXZpY2UuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC85N3Z1bnYzdnN2L2pwZWcvTW9kTUFHLU0yMDAwLSUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2VsZWN0cm9tYWduZXRpYy1mbG93LW1ldGVycy9tMjAwMC1lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJpc1Byb2R1Y3RcIjogdHJ1ZSxcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50XzE2NjZhMTYyLTJkZmQtNDRkNy05ZjM0LTliMzlmMDkwYjIyM19lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiUHJvZHVjdCBEYXRhIFNoZWV0cyAvIE1vZE1BR1wiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTS1TZXJpZXPCriBNNDAwMFwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiL3N0YXRpYy9pbWFnZXMvcGRmLWljb24uc3ZnXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvaWlpd3JxbHlkZS9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJpc1Byb2R1Y3RcIjogZmFsc2UsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0Jsb2Nrc19EYXRhQmxvY2tzX0RBTURvY3VtZW50QmxvY2svXzk0N2M4OTQwLWI3MDQtNDMxYS05Y2IxLWFiZTE4Zjg3M2ZlNF9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiQnJvY2h1cmVzIC8gQXF1YUNVRSwgRHluYXNvbmljcywgSW1wZWxsZXIsIEluZHVzdHJpYWwgT3ZhbCBHZWFyIChJT0cpLCBNb2RNQUcsIFJlY29yZGFsbCwgVm9ydGV4XCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNb2RNQUfCriBNNDAwMFwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvcG51b3F5aGszZi9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fZjdkODZmMzgtOGM1ZC00MzZmLWJjZjQtMWZlNWNhNWQyYTIzX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCI8cD5Ib3cgTW9kZXJuIFRlY2hub2xvZ3kgYW5kIERhdGEgQW5hbHl0aWNzIEFyZSBFbmFibGluZyBUb3RhbCBWaXNpYmlsaXR5IG9mIFdhdGVyIFVzZTwvcD5cIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE0xMDAwLCBNMjAwMCBhbmQgTTUwMDAgRmllbGQgVmVyaWZpY2F0aW9uIERldmljZSBNYW51YWxcIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcIlwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2d2NTV6YTdoencvb3JpZ2luYWw/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAzNSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiRG9jdW1lbnRzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0Jsb2Nrc19EYXRhQmxvY2tzX0RBTURvY3VtZW50QmxvY2svX2I0N2M2NTgzLWIzMWQtNDRlNC1iYmZiLWU1OWM5MDY0MjgwNl9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiPHA+QmFkZ2VyIE1ldGVyIEltcHJvdmVzIE9wZXJhdGluZyBSZWxpYWJpbGl0eSBpbiBIeWRyb25pYyBIZWF0aW5nIGFuZCBDb29saW5nIEFwcGxpY2F0aW9uczwvcD5cIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE01MDAwIE9JTUwgQ2VydGlmaWNhdGUgb2YgQ29uZm9ybWl0eVwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvMXk4b2owa2h3ZS9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fMTdhMjcwZTItNDMzZC00NDkwLWI0OTItY2E3YWY4NzZjNmY2X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJNNTAwMCBFbGVjdHJvbWFnbmV0aWMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIE1vZE1BRzxzdXA+JnJlZzs8L3N1cD4gTTUwMDAgRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgaXMgYW4gaWRlYWwgc29sdXRpb24gZm9yIHJlbW90ZSBwb3RhYmxlIHdhdGVyIGFwcGxpY2F0aW9ucywgcHJvdmlkaW5nIGNvbnNpc3RlbnRseSByZWxpYWJsZSBhbmQgYWNjdXJhdGUgbWVhc3VyZW1lbnRzLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvOXlpaGpidWVwdi9qcGVnL01vZE1BRy1NNTAwMC0lMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1oZGtweHFcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlcnMvbTUwMDAtZWxlY3Ryb21hZ25ldGljLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaXNQcm9kdWN0XCI6IHRydWUsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF9iZmI0MjYwNS1hMTFhLTRjOTItYTU4ZS04MTJkMDU1MjdkMjhfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIlNwZWNpZmljYXRpb25zIC8gTW9kTUFHXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNb2RNQUfCriBNNzYwMCBFbGVjdHJvbWFnbmV0aWMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvMWZkd2d5OGVjci9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fYWRjNDNmMzItMDM2Zi00M2JjLWFhNDYtM2E1NzExNmVmMTE0X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJTcGVjaWZpY2F0aW9ucyAvIE1vZE1BR1wiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTW9kTUFHwq4gTTEwMDBcIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcIlwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3JheWZ4NTFhYWsvb3JpZ2luYWw/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAzNSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiRG9jdW1lbnRzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0Jsb2Nrc19EYXRhQmxvY2tzX0RBTURvY3VtZW50QmxvY2svXzllNzNkNTA3LWU3Y2QtNDJjMS1hNWYzLWQ0MTdmMmQ3MjczOV9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiQXBwbGljYXRpb24gRGF0YSBTaGVldHMgLyBNb2RNQUdcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE0yMDAwIENvbm5lY3RpbmcgYSBCYWRnZXIgTWV0ZXIgRW5kcG9pbnQgdG8gdGhlIE0yMDAwXCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC90bXdwbWpycWt4L29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19CbG9ja3NfRGF0YUJsb2Nrc19EQU1Eb2N1bWVudEJsb2NrL19lYWYxOWNjMy0xMjc1LTQxYzItYTQyYy1kMGQ5NDM0YTgyOThfZW5cIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzYXZlZEl0ZW1zQ291bnRcIjogMCxcbiAgICBcInRvdGFsUmVzdWx0c1wiOiAxMjIsXG4gICAgXCJ0cmFja0lkXCI6IFwiSlhrSllyZHRxaGtGTnlDdENyQm5Qdz09XCIsXG4gICAgXCJmaWx0ZXJDb3VudFJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU2LFxuICAgICAgICBcImNvdW50XCI6IDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiY291bnRcIjogOTdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiY291bnRcIjogN1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAzNixcbiAgICAgICAgXCJjb3VudFwiOiAzXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDY0LFxuICAgICAgICBcImNvdW50XCI6IDJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTYxLFxuICAgICAgICBcImNvdW50XCI6IDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTU3LFxuICAgICAgICBcImNvdW50XCI6IDlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTU4LFxuICAgICAgICBcImNvdW50XCI6IDJcbiAgICAgIH1cbiAgICBdLFxuICAgIFwiZGlkWW91TWVhblwiOiBbXG4gICAgICBcIm1vZG1hZyBtMjAwMCBtYW51YWxcIixcbiAgICAgIFwibW9kbWFnIG0yMDAwXCIsXG4gICAgICBcIm1vZG1hZyBcIixcbiAgICAgIFwibW9kbWFnIG1cIlxuICAgIF1cbiAgfSxcbiAgXCJzZWFyY2hSZXN1bHRzTm9uZVwiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtdLFxuICAgIFwic2F2ZWRJdGVtc0NvdW50XCI6IDAsXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogMCxcbiAgICBcInRyYWNrSWRcIjogXCIxdjdzSlgwTzFub3RFdUozTXBGbDV3PT1cIixcbiAgICBcImZpbHRlckNvdW50UmVzdWx0c1wiOiBbXSxcbiAgICBcImRpZFlvdU1lYW5cIjogW1xuICAgICAgXCJtZXRlcnNcIlxuICAgIF1cbiAgfSxcbiAgXCJkb2N1bWVudHNCeUlkXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJBUFBMSUNBVElPTiBEQVRBIFNIRUVUXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGRhdGEgc2hlZXRcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzZcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQVBQTElDQVRJT04gREFUQSBTSEVFVDJcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgZGF0YSBzaGVldFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkVuZ2xpc2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL3dpZGVuLmJhZGdlcm1ldGVyLmNvbS9kYW1zdHVmZi9kb2N1bWVudC5kb2N4XCIsXG4gICAgICAgIFwiaWRcIjogXCIzNlwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJBUFBMSUNBVElPTiBEQVRBIFNIRUVUM1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBkYXRhIHNoZWV0XCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM2XCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwic29mdHdhcmVCeUlkXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJEeW5hc29uaWNzXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIjxwPkR5bmFzb25pY3MgVEZYIFVsdHJhIC0gRW5nbGlzaCBGaXJtd2FyZTxzdXA+JnJlZzs8L3N1cD48cD5cIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiRmlybXdhcmUgfCBWZXJzaW9uIEQwMDctMTA0NS0wMThfUmV2VCB8IFVwZGF0ZWQgSnVseSAyMywgMjAyMCB8IDE5MCBLQiB8IDxhIGhyZWY9XFxcIlxcXCI+U2VlIHJlbGVhc2Ugbm90ZXM8L2E+XCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3Y0eXR5NWxkdXYvb3JpZ2luYWwvRHluYXNvbmljcyUyMFRGWCUyMFVsdHJhJTIwLSUyMEVuZ2xpc2glMjBGaXJtd2FyZS1EMDA3LTEwNDUtMDE4X1JldlQuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpJmV4cGlyZXM9MTU5NTY5NTA4OTI0MCZzaWduYXR1cmUudmVyc2lvbj1WMyZzaWduYXR1cmU9YVktY1U0QWpUaHR2Tzk0REtwU1JSUXJTaDlaQ2dPTE5QeFpGX3pLRm9QUSUzRFwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL2VuL3Rlc3Qtc29mdHdhcmUtcGFnZS0xL1wiLFxuICAgICAgICBcImlkXCI6IFwiNzNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiZXllYnJvd1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJEeW5hc29uaWNzIFRGWCBVbHRyYSAtIEZyZW5jaCBGaXJtd2FyZTJcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiRmlybXdhcmUgfCBWZXJzaW9uIEQwMDctMTA0NS0wMjBfUmV2VSB8IFVwZGF0ZWQgSnVseSAyMywgMjAyMCB8IDE5MCBLQiB8IDxhIGhyZWY9XFxcIlxcXCI+U2VlIHJlbGVhc2Ugbm90ZXM8L2E+XCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3JydXRzeHpxNjgvb3JpZ2luYWwvRHluYXNvbmljcyUyMFRGWCUyMFVsdHJhJTIwLSUyMEZyZW5jaCUyMEZpcm13YXJlLUQwMDctMTA0NS0wMjBfUmV2VS56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGkmZXhwaXJlcz0xNTk1Njk1MDg5MjQwJnNpZ25hdHVyZS52ZXJzaW9uPVYzJnNpZ25hdHVyZT1mNzRkYlIybUxrb1B2cndDckJtYkptLXM4OTlaZlh1a3pyM2hMUkpyX0x3JTNEXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogbnVsbCxcbiAgICAgICAgXCJpZFwiOiBcIjc0XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkR5bmFzb25pY3NcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiRHluYXNvbmljcyBURlggVWx0cmEgRXRoZXJOZXQtSVAgZWRzIGZpbGVcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiU29mdHdhcmUgfCBWZXJzaW9uIE4vQSB8IFVwZGF0ZWQgSnVseSAyMywgMjAyMCB8IDI1IEtCIHwgPGEgaHJlZj1cXFwiXFxcIj5TZWUgcmVsZWFzZSBub3RlczwvYT5cIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdzk4anR1ZnlidS9vcmlnaW5hbC9EeW5hc29uaWNzJTIwVEZYJTIwVWx0cmElMjBFdGhlck5ldC1JUCUyMGVkcyUyMGZpbGUuZWRzP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpJmV4cGlyZXM9MTU5NTY5NTA4OTI0MCZzaWduYXR1cmUudmVyc2lvbj1WMyZzaWduYXR1cmU9Z2FwS0VHeFdLMzhmNlZmQTU1ZVd5WVpSWnh1ZUxQUU1SLWl1emZpalpzWSUzRFwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IG51bGwsXG4gICAgICAgIFwiaWRcIjogXCI3NVwiXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBcInJlY2VudFBvc3RzXCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogXCJ0cnVlXCIsXG4gICAgXCJwYWdlXCI6IDEsXG4gICAgXCJjb3VudFwiOiA1MCxcbiAgICBcInByZXZQYWdlXCI6IG51bGwsXG4gICAgXCJuZXh0UGFnZVwiOiAzLFxuICAgIFwicGFnZUNvdW50XCI6IDMsXG4gICAgXCJ0b3RhbFBhZ2VzXCI6IDYsXG4gICAgXCJsaW1pdFwiOiAyNCxcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImltYWdlXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMzUzeDU1MFwiLFxuICAgICAgICBcInRpdGxlXCI6IFwiPHA+MTAgd2F5cyBmbG93IG1ldGVycyBhaWQgaW4gd2F0ZXIgJiB3YXN0ZXdhdGVyIHRyZWF0bWVudDwvcD5cIixcbiAgICAgICAgXCJ1cmxcIjogXCIjXCIsXG4gICAgICAgIFwidHlwZVwiOiBcIkFydGljbGVcIixcbiAgICAgICAgXCJpbmZvXCI6IFwiMiBtaW4gcmVhZFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImltYWdlXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMzUzeDU1MFwiLFxuICAgICAgICBcInRpdGxlXCI6IFwiPGI+QmxhbmNldHQgbWV0ZXJzPC9iPiBoZWxwIGh5ZHJhdWxpYyBmcmFjdHVyaW5nIGNvbXBhbmllc1wiLFxuICAgICAgICBcInVybFwiOiBcIiNcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwiQXJ0aWNsZVwiLFxuICAgICAgICBcImluZm9cIjogXCIyIG1pbiByZWFkXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiaW1hZ2VcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8zNTN4NTUwXCIsXG4gICAgICAgIFwidGl0bGVcIjogXCI8c3Ryb25nPkhpZ2ggdGVtcGVyYXR1cmU8L3N0cm9uZz48c3VwPsKpPC9zdXA+IGdhcyBjb250cm9sIGZvciBhdXRvbW90aXZlIHRlc3QgY2VsbFwiLFxuICAgICAgICBcInVybFwiOiBcIiNcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwiQXJ0aWNsZVwiLFxuICAgICAgICBcImluZm9cIjogXCIyIG1pbiByZWFkXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiaW1hZ2VcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8zNTN4NTUwXCIsXG4gICAgICAgIFwidGl0bGVcIjogXCI8c3BhbiBzdHlsZT0nZm9udC13ZWlnaHQ6IDQwMDtmb250LXNpemU6MjBweDtjb2xvcjogcmVkO2xpbmUtaGVpZ2h0OjMwcHg7Jz5IaWdoIHRlbXBlcmF0dXJlIGdhcyBjb250cm9sIGZvciBhdXRvbW90aXZlIHRlc3QgY2VsbDwvc3Bhbj5cIixcbiAgICAgICAgXCJ1cmxcIjogXCIjXCIsXG4gICAgICAgIFwidHlwZVwiOiBcIkFydGljbGVcIixcbiAgICAgICAgXCJpbmZvXCI6IFwiMiBtaW4gcmVhZFwiXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBcInByb2R1Y3RzQnlCcmFuZFwiOiB7XG4gICAgXCJzdWNjZXNzXCI6IFwidHJ1ZVwiLFxuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiQjE1MDAgVHVyYmluZSBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJCMTUwMCBUdXJiaW5lIEZsb3cgTWV0ZXJcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJCMTc1MCBQb3NpdGl2ZSBEaXNwbGFjZW1lbnQgTWV0ZXJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIkIxNzUwIFBvc2l0aXZlIERpc3BsYWNlbWVudCBNZXRlclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIkIyOTAwIFNlcmllcyBGbG93IE1vbml0b3JcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIkIyOTAwIFNlcmllcyBGbG93IE1vbml0b3JcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJCMzAwMCBTZXJpZXMgRmxvdyBNb25pdG9yXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJCMzAwMCBTZXJpZXMgRmxvdyBNb25pdG9yXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiQjMxMDAgU2VyaWVzIEZsb3cgTW9uaXRvclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiQjMxMDAgU2VyaWVzIEZsb3cgTW9uaXRvclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIkZsb0NsZWFuIFNhbml0YXJ5IFR1cmJpbmUgRmxvdyBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiRmxvQ2xlYW4gU2FuaXRhcnkgVHVyYmluZSBGbG93IE1ldGVyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiSW50ZWxsaWdlbnQgRnJlcXVlbmN5IENvbnZlcnRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiPHA+SW50ZWxsaWdlbnQgRnJlcXVlbmN5IENvbnZlcnRlcjwvcD5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJLLUZhY3RvciBTY2FsZXIgKEJsYW5jZXR0KVwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiPHA+Sy1GYWN0b3IgU2NhbGVyIChCbGFuY2V0dCk8L3A+XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiTW9kZWwgMTEwMCBUdXJiaW5lIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIk1vZGVsIDExMDAgVHVyYmluZSBGbG93IE1ldGVyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiTW9kZWwgMTIwMCBJbi1MaW5lIFR1cmJpbmUgRmxvdyBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiTW9kZWwgMTIwMCBJbi1MaW5lIFR1cmJpbmUgRmxvdyBNZXRlclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIk1vZGVsIDkwMCBTZXJpZXMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiOTAwIFNlcmllcyBGbG93IE1ldGVyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiUXVpa1NlcnQgR2FzIEIxNDJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIjxwPkIxNDIgR2FzIFF1aWtTZXJ0PHN1cD4mcmVnOzwvc3VwPiBUdXJiaW5lIEZsb3cgTWV0ZXI8L3A+XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiUXVpa1NlcnQgSW4tTGluZSBUdXJiaW5lIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIjxwPlF1aWtTZXJ0PHN1cD4mcmVnOzwvc3VwPiBJbi1MaW5lIFR1cmJpbmUgRmxvdyBNZXRlcjwvcD5cIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgXCJwcm9kdWN0c1wiOiB7XG4gICAgXCJzdWNjZXNzXCI6IFwidHJ1ZVwiLFxuICAgIFwidmlld1Byb2R1Y3RMYWJlbFwiOiBcIlZpZXcgcHJvZHVjdCBsYWJlbFwiLFxuICAgIFwidG90YWxSZXN1bHRzXCI6IDEwLFxuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9vZHZ2amY1eG83L2pwZWcvMTAlMkMwMDAlMjBwc2klMjAtJTIwSFAtMTAlMjAlMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yYjczcGZcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC85cGRjaW9kdWltL3BuZy9SQ1YtTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCI8cD4xMCwwMDAgUFNJIFR5cGUgSFAtMTAgSGlnaCBQcmVzc3VyZSBDb250cm9sIFZhbHZlPC9wPlwiLFxuICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy92YWx2ZXMvMTAwMDAtcHNpLXR5cGUtaHAtMTAtaGlnaC1wcmVzc3VyZS1jb250cm9sLXZhbHZlL1wiLFxuICAgICAgICBcImlkXCI6IFwiNzBcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNC4uLjEvMiBpbi5cIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uMTIgbW1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCI3NeKApjEwMDAgwrBGXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMjTigKY1MzggwrBDXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJGbG93IFJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIw4oCmMi41IGN2XCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMC4uLjM1Ljc1IGt2XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gMTAsMDAwIFBTSVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDY4OSBiYXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICBcIkF2aWF0aW9uICYgQWVyb3NwYWNlXCIsXG4gICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJWYWx2ZXNcIixcbiAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBudWxsLFxuICAgICAgICBcImJyYW5kXCI6IFwiUmVzZWFyY2ggQ29udHJvbCBWYWx2ZXNcIixcbiAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgXCJTdGVhbVwiLFxuICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgIFwiT3RoZXIgbGlxdWlkXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJndWlkXCI6IFwiYjUxOTgzYWYtN2M2ZS00NGQyLTg1MGQtNDc3YmY5OTY4ZGM1XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgPHN1cD5NLVNlcmllczwvc3VwPiBzYW1wbGVcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjdcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kMlwiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjU0IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiNTYzNCBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgMTIzQ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgMTIzRlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAxMjMgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAxMjMgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjhcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kM1wiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nIGVsc2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI5NyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjM0MzUgaW4uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmdcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NjVDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzdGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc3NyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3NyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiMTJcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kNFwiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEtNyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNC0yIGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAwMDBDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAwMDBGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDAwMCBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDAwMCB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiOVwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxMVwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxN1wiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxOFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwicHJvZHVjdHNUZXN0XCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogXCJ0cnVlXCIsXG4gICAgXCJ2aWV3UHJvZHVjdExhYmVsXCI6IFwiVmlldyBwcm9kdWN0IGxhYmVsXCIsXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogMTAsXG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29kdnZqZjV4bzcvanBlZy8xMCUyQzAwMCUyMHBzaSUyMC0lMjBIUC0xMCUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJiNzNwZlwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzlwZGNpb2R1aW0vcG5nL1JDVi1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIjxwPlRlc3Q8L3A+XCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL3ZhbHZlcy8xMDAwMC1wc2ktdHlwZS1ocC0xMC1oaWdoLXByZXNzdXJlLWNvbnRyb2wtdmFsdmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NTYxXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzQuLi4xLzIgaW4uXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNi4uLjEyIG1tXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJUZW1wZXJhdHVyZSBSYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiNzXigKYxMDAwIMKwRlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjI04oCmNTM4IMKwQ1wiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiRmxvdyBSYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMOKApjIuNSBjdlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjAuLi4zNS43NSBrdlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJlc3N1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDEwLDAwMCBQU0lcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byA2ODkgYmFyXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgXCJBdmlhdGlvbiAmIEFlcm9zcGFjZVwiLFxuICAgICAgICAgIFwiT2lsICYgR2FzXCIsXG4gICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgIFwiVGVzdCBFcXVpcG1lbnQgJiBTZXJ2aWNlc1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiVmFsdmVzXCIsXG4gICAgICAgIFwicHJvZHVjdFR5cGVcIjogbnVsbCxcbiAgICAgICAgXCJicmFuZFwiOiBcIlJlc2VhcmNoIENvbnRyb2wgVmFsdmVzXCIsXG4gICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICBcIk9pbFwiLFxuICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgIFwiV2F0ZXJcIixcbiAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZ3VpZFwiOiBcImI1MTk4M2FmLTdjNmUtNDRkMi04NTBkLTQ3N2JmOTk2OGRjNVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIDxzdXA+TS1TZXJpZXM8L3N1cD4gc2FtcGxlXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCI3MDBcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kMlwiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjU0IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiNTYzNCBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgMTIzQ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgMTIzRlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAxMjMgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAxMjMgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJ0ZXN0IHRlc3RNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjgwMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxMjAwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDRcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIxLTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzQtMiBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgMDAwQ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgMDAwRlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAwMDAgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAwMDAgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjkwMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCI1MDBcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kM1wiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nIGVsc2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI5NyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjM0MzUgaW4uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmdcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NjVDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzdGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc3NyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3NyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiNDAwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjEwMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxNTBcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kM1wiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nIGVsc2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI5NyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjM0MzUgaW4uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmdcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NjVDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzdGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc3NyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3NyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBcInNvZnR3YXJlXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJEeW5hc29uaWNzXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkxNX0xNLU9HQS1PR1RBRVJfWlVMX01JRF8wMV8yMDEyXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIkZpcm13YXJlIHwgVmVyc2lvbiBEMDA3LTEwNDUtMDE4X1JldlQgfCBVcGRhdGVkIEp1bHkgMjMsIDIwMjAgfCAxOTAgS0JcIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdjR5dHk1bGR1di9vcmlnaW5hbC9EeW5hc29uaWNzJTIwVEZYJTIwVWx0cmElMjBGaXJtd2FyZSUyMCU1QkVuZ2xpc2glNUQlMjAtJTIwRDAwNy0xMDQ1LTAxOF9SZXZULnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBudWxsLFxuICAgICAgICBcImlkXCI6IFwiMjk1XCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJEeW5hc29uaWNzXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkR5bmFzb25pY3NcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIkZpcm13YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiRHluYXNvbmljcyBURlggVWx0cmEgRmlybXdhcmUgW0VuZ2xpc2hdXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IFwidGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkltcGVsbGVyL0RhdGEgSW5kdXN0cmlhbFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJJbXBlbGxlciAzNDBMVyBTZXJpZXMgTG9uV29ya3MgQ29uZmlndXJhdGlvbiBTb2Z0d2FyZVwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMSBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9obG56bHdkdjB0L29yaWdpbmFsL0ltcGVsbGVyJTIwMzQwTFclMjBTZXJpZXMlMjBMb25Xb3JrcyUyMENvbmZpZ3VyYXRpb24lMjBTb2Z0d2FyZS56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJkb3dubG9hZEhyZWZcIjogXCIjZG93bmxvYWRocmVmXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvc29mdHdhcmUtZmlybXdhcmUvSW1wZWxsZXItMzQwbHctc2VyaWVzLWxvbndvcmtzLWNvbmZpZ3VyYXRpb24tc29mdHdhcmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0MzhcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIlR5cGUgMzQwIExXLUxvbldvcmtzIEJUVSBUcmFuc21pdHRlclwiLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIkltcGVsbGVyL0RhdGEgSW5kdXN0cmlhbFwiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJJbXBlbGxlci9EYXRhIEluZHVzdHJpYWxcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIlNvZnR3YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiSW1wZWxsZXIgMzQwTFcgU2VyaWVzIExvbldvcmtzIENvbmZpZ3VyYXRpb24gU29mdHdhcmVcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTW9kTUFHXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIk1vZE1hZyBGaWVsZCBWZXJpZmljYXRpb24gRGV2aWNlIFBDIFNvZnR3YXJlXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVmVyc2lvbiB2MS4wLjE3IHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCA3LjAyIE1CXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqdnBwaWV3M28vb3JpZ2luYWwvTW9kTUFHJTIwRmllbGQlMjBWZXJpZmljYXRpb24lMjBEZXZpY2UlMjBQQyUyMFNvZnR3YXJlJTIwLSUyMHYxLjAuMTcuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NvZnR3YXJlLWZpcm13YXJlL21vZG1hZy1maWVsZC12ZXJpZmljYXRpb24tZGV2aWNlLXBjLXNvZnR3YXJlL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDQ2XCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJNb2RNQUdcIixcbiAgICAgICAgXCJicmFuZHNcIjogW1xuICAgICAgICAgIFwiTW9kTUFHXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJkb3dubG9hZFR5cGVcIjogXCJTb2Z0d2FyZVwiLFxuICAgICAgICBcImRvY3VtZW50TmFtZVwiOiBcIk1vZE1hZyBGaWVsZCBWZXJpZmljYXRpb24gRGV2aWNlIFBDIFNvZnR3YXJlXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IG51bGxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkJsYW5jZXR0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkJsYW5jZXR0IEIzMTAwIE1vbml0b3IgQ29uZmlndXJhdGlvbiBTb2Z0d2FyZVwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMS41MSBNQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC81eTM0eXJxcHA2L29yaWdpbmFsL0JsYW5jZXR0JTIwQjMxMDAlMjBNb25pdG9yJTIwQ29uZmlndXJhdGlvbiUyMFNvZnR3YXJlLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9ibGFuY2V0dC1iMzEwMC1tb25pdG9yLWNvbmZpZ3VyYXRpb24tc29mdHdhcmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NTJcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkIzMTAwIFNlcmllcyBGbG93IE1vbml0b3JcIixcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJCbGFuY2V0dFwiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJCbGFuY2V0dFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiU29mdHdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJCbGFuY2V0dCBCMzEwMCBNb25pdG9yIENvbmZpZ3VyYXRpb24gU29mdHdhcmVcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogXCJ0ZXN0XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkNveCA7IEltcGVsbGVyL0RhdGEgSW5kdXN0cmlhbFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJGQy01MDAwIEZpcm13YXJlIFtMZWdhY3ldXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIkZpcm13YXJlIHwgVmVyc2lvbiB2MS4yLjQgfCBVcGRhdGVkIEF1Z3VzdCAxOSwgMjAyMCB8IDM3NCBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9rYTRqcGJrdm8wL29yaWdpbmFsL0ZDLTUwMDAlMjBGaXJtd2FyZSUyMC0lMjBMZWdhY3klMjAxLjIuNC56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJkb3dubG9hZEhyZWZcIjogXCIjZG93bmxvYWRocmVmXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvc29mdHdhcmUtZmlybXdhcmUvZmMtNTAwMC1maXJtd2FyZS1sZWdhY3kvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0MzZcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkZDLTUwMDAgQlRVIE1vbml0b3IgOyBGQy01MDAwIEZsb3cgQ29tcHV0ZXIgOyBGQy01MDAwIEZsb3cgRGlzcGxheVwiLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIkNveCwgSW1wZWxsZXIvRGF0YSBJbmR1c3RyaWFsXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkNveFwiLFxuICAgICAgICAgIFwiSW1wZWxsZXIvRGF0YSBJbmR1c3RyaWFsXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJkb3dubG9hZFR5cGVcIjogXCJGaXJtd2FyZVwiLFxuICAgICAgICBcImRvY3VtZW50TmFtZVwiOiBcIkZDLTUwMDAgRmlybXdhcmUgW0xlZ2FjeV1cIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQ29yaW9saXNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQ29yaW9sbHMgUkNUWCBUcmFuc21pdHRlciBFdGhlck5ldC9JUCBFRFNcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiU29mdHdhcmUgfCBVcGRhdGVkIEF1Z3VzdCAxOSwgMjAyMCB8IDMgS0JcIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvYjNjc2p1MXlmdC9vcmlnaW5hbC9Db3Jpb2xscyUyMEV0aGVyTmV0SVAlMjBlZHMlMjBmaWxlJTIwZm9yJTIwUkNUWCUyMHRyYW5zbWl0dGVyLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9jb3Jpb2xpcy1ldGhlcm5ldC1pcC1lZHMtZmlsZS1mb3ItcmN0eC10cmFuc21pdHRlci9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQ1MFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IG51bGwsXG4gICAgICAgIFwibGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAgICBcIkVuZ2xpc2hcIlxuICAgICAgICBdLFxuICAgICAgICBcImJyYW5kXCI6IFwiQ29yaW9saXNcIixcbiAgICAgICAgXCJicmFuZHNcIjogW1xuICAgICAgICAgIFwiQ29yaW9saXNcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIlNvZnR3YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiQ29yaW9sbHMgUkNUWCBUcmFuc21pdHRlciBFdGhlck5ldC9JUCBFRFNcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiRHluYXNvbmljc1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJEeW5hY29uaWNzIEZsb3cgTWV0ZXIgVG9vbFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFZlcnNpb24gdjEuNi4xMCB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMi4yNCBNQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9wMm56NXA1eWxqL29yaWdpbmFsL0R5bmFjb25pY3MlMjBGbG93JTIwTWV0ZXIlMjBUb29sJTIwLSUyMHYxLjYuMTAuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NvZnR3YXJlLWZpcm13YXJlL2R5bmFzb25pY3MtaXNvbmljLTQwMDAtZmxvdy1tZXRlci1zb2Z0d2FyZS9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQ1NVwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IG51bGwsXG4gICAgICAgIFwibGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAgICBcIkVuZ2xpc2hcIlxuICAgICAgICBdLFxuICAgICAgICBcImJyYW5kXCI6IFwiRHluYXNvbmljc1wiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJEeW5hc29uaWNzXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJkb3dubG9hZFR5cGVcIjogXCJTb2Z0d2FyZVwiLFxuICAgICAgICBcImRvY3VtZW50TmFtZVwiOiBcIkR5bmFjb25pY3MgRmxvdyBNZXRlciBUb29sXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IG51bGxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIlJlc2VhcmNoIENvbnRyb2wgVmFsdmUgKFJDVilcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUkNWIFNFVkEgMTAwIEV0aGVyTmV0L0lQIERyaXZlclwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMyBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9yaXd6bmlvc2hnL29yaWdpbmFsL1JDViUyMFNFVkElMjAxMDAlMjBFdGhlck5ldElQJTIwRHJpdmVyLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9yY3Ytc2V2YS0xMDAtZXRoZXJuZXQtaXAtZHJpdmVyL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDQ0XCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJSZXNlYXJjaCBDb250cm9sIFZhbHZlIChSQ1YpXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIlJlc2VhcmNoIENvbnRyb2wgVmFsdmUgKFJDVilcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIlNvZnR3YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiUkNWIFNFVkEgMTAwIEV0aGVyTmV0L0lQIERyaXZlclwiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJDb3Jpb2xpc1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJDb3Jpb2xpcyBSQ1QgQ2FsYyBTZWxlY3Rpb24gVG9vbFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMjEuNzMgTUJcIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvcnlsMGZjYWU2di9vcmlnaW5hbC9Db3Jpb2xpcyUyMFJDVCUyMENhbGMlMjBTZWxlY3Rpb24lMjBUb29sLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zaXppbmctYW5kLXNlbGVjdGlvbi10b29scy9jb3Jpb2xpcy1yY3RjYWxjLXNlbGVjdGlvbi10b29sL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDYwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJDb3Jpb2xpc1wiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJDb3Jpb2xpc1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiU29mdHdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJDb3Jpb2xpcyBSQ1QgQ2FsYyBTZWxlY3Rpb24gVG9vbFwiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNb2RNQUdcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTW9kTUFHIE01MDAwIEZpcm13YXJlXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIkZpcm13YXJlIHwgVmVyc2lvbiB2Mi4wLjI1IHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCA1MyBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC83Njdrc2NsdmNvL29yaWdpbmFsL01vZE1BRyUyME01MDAwJTIwRmlybXdhcmUtdjIuMC4yNS56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJkb3dubG9hZEhyZWZcIjogXCIjZG93bmxvYWRocmVmXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvc29mdHdhcmUtZmlybXdhcmUvbW9kbWFnLW01MDAwLWZpcm13YXJlL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDQyXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNNTAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIk1vZE1BR1wiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJNb2RNQUdcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIkZpcm13YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiTW9kTUFHIE01MDAwIEZpcm13YXJlXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IG51bGxcbiAgICAgIH1cbiAgICBdLFxuICAgIFwic2F2ZWRJdGVtc0NvdW50XCI6IDAsXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogNjAsXG4gICAgXCJyZWxlYXNlTm90ZXNMYWJlbFwiOiBcInJlbGVhc2Ugbm90ZXMgbGFiZWxcIlxuICB9LFxuICBcImRvY3VtZW50YXRpb25cIjoge1xuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkFQUExJQ0FUSU9OIERBVEEgU0hFRVRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTE1fTE0tT0dBLU9HVEFFUl9aVUxfTUlEXzAxXzIwMTJcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9mamNkb3BjbDNuL29yaWdpbmFsL0lPRy1QUy0wMDEzNy1FTl9JbmR1c3RyaWFsJTIwT3ZhbCUyMEdlYXIlMjBJbmxpbmUlMjBhbmQlMjBGbGFuZ2VkJTIwTWV0ZXJzJTIwYW5kJTIwUmVnaXN0ZXIlMjBQYXJ0cy5wZGY/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJpZFwiOiBcIjM1XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImFiYy0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciB1c2VyIG1hbnVhbFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAsIHRlc3QxLCB0ZXN0Mix0ZXN0MywgdGVzdDQsIHRlc3Q1XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJGcmVuY2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2hpdjd2ZDY5dW8vb3JpZ2luYWwvVFRNLVNTLTAzMTI1LUVOX0R5bmFzb25pY3MgVEZYLTUwMDAgRmxvdyBNZXRlciBTcGVjaWZpY2F0aW9ucy5kb2N4P2Rvd25sb2FkPXRydWVcIixcbiAgICAgICAgXCJpZFwiOiBcIjM2XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImRlZi0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM3XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImdoaS0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQVBQTElDQVRJT04gREFUQSBTSEVFVFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBkYXRhIHNoZWV0XCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCwgdGVzdCwgdGVzdCwgdGVzdCwgdGVzdCwgdGVzdFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM4XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImprbC0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciB1c2VyIG1hbnVhbFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM5XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcIm1uby0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQwXCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcInBycS0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQxXCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImFiYy0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQyXCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImFiYy0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQzXCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImFiYy0wMDAtMDAwMC0wMDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFU1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJUZXN0IGl0ZW0gM1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQ0XCIsXG4gICAgICAgIFwiZG9jdW1lbnRJZFwiOiBcImFiYy0wMDAtMDAwMC0wMDBcIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogODhcbiAgfSxcbiAgXCJkb2N1bWVudGF0aW9uVGVzdFwiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQVBQTElDQVRJT04gREFUQSBTSEVFVCB0ZXN0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGRhdGEgc2hlZXRcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzUwXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIk1BTlVBTFMgJiBHVUlERVMgdGVzdFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciB1c2VyIG1hbnVhbFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM2MFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzcwXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIFwidG90YWxSZXN1bHRzXCI6IDExXG4gIH0sXG4gIFwibGVnYWxcIjoge1xuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIlB1cmNoYXNlIHRlcm1zXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlB1cmNoYXNlIG9yZGVyIC0gZ2VuZXJhbCB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJOb3J0aCBBbWVyaWNhLCB0ZXN0MiwgdGVzdDMsIHRlc3Q0LCB0ZXN0NVwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjQwXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIlNhbGVzIHRlcm1zXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkJhZGdlciBNZXRlciBzYWxlcyB0ZXJtcyBhbmQgb25kaXRpb25zXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk5vcnRoIEFtZXJpY2EsIHRlc3QxLCB0ZXN0MlwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjcwXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIFwidG90YWxSZXN1bHRzXCI6IDY3XG4gIH0sXG4gIFwidmFsaWRhdGVJZHNcIjoge1xuICAgIFwic3VjY2Vzc1wiOiBcInRydWVcIixcbiAgICBcInJlc3VsdHNcIjoge1xuICAgICAgXCJpbnZhbGlkSWRzXCI6IFtcbiAgICAgICAgMTAsXG4gICAgICAgIDUsXG4gICAgICAgIDExMCxcbiAgICAgICAgMlxuICAgICAgXSxcbiAgICAgIFwiZG9jdW1lbnRJZHNcIjogW1xuICAgICAgICAzNSxcbiAgICAgICAgNDFcbiAgICAgIF0sXG4gICAgICBcInNvZnR3YXJlSWRzXCI6IFtcbiAgICAgICAgNzRcbiAgICAgIF0sXG4gICAgICBcInByb2R1Y3RJZHNcIjogW1xuICAgICAgICAxMSxcbiAgICAgICAgMjAsXG4gICAgICAgIDM1LFxuICAgICAgICA4XG4gICAgICBdLFxuICAgICAgXCJhcnRpY2xlSWRzXCI6IFtdXG4gICAgfVxuICB9LFxuICBcImJlYWNvbnJlZnNcIjoge1xuICAgIFwic3VjY2Vzc1wiOiB0cnVlLFxuICAgIFwiY29udGVudFwiOiB7XG4gICAgICBcImNoYXRfZG9jX2lkXCI6IFwiMjVjZjExN2ZlZjE1NDIxZTgxMzczOWZmNjIwNGNlZGJcIixcbiAgICAgIFwicHJvbXB0X2ludGVudFwiOiBcIkdFTkVSQUxfUVVFU1RJT05cIixcbiAgICAgIFwicmVzcG9uc2VcIjogXCJUaGUgZm9sbG93aW5nIHJlZmVyZW5jZXMgd2VyZSBpZGVudGlmaWVkIGluIHRoZSBzZWFyY2g6XCIsXG4gICAgICBcInNvdXJjZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFX0RBTVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MiswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9vbmlpNWNkdzdtL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9kYW0vOWFjN2Q5NjJkNGU1ODhiZDcxYjM5ZmQ1YTQzMTI1YTdlMzUzMGQzZDZlOGZhZDQ5MzM3MWRhMzU5OGQ1NWM2Ny5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIlJUUy1EUy0wMDMyMC1FTlxcXFxfUmVjb3JkYWxsIFR1cmJvIFNlcmllcyBNZXRlcnMgTW9kZWxzIDE2MCwgMjAwLCA0NTAsIDEwMDAsIDIwMDAsIDM1MDAsIDU1MDAsIDYyMDBcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJCQURHRVJfTUVURVJfU0lURVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMjowNyswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIyOjA3KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIyOjA3KzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC92b2RldHhreXhoL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3ZvZGV0eGt5eGgvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9jbXMvMjRhMjcwYTI1OTc3MjZmNGRjYTcxMDdhM2MwYjUzYzIxOGZmMGZjNzUwODRkYzZlMTUxMzMxOThkZTYzMWZhNC5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIlwiLFxuICAgICAgICAgIFwic291cmNlX3VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdm9kZXR4a3l4aC9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIzOjM1KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjM6MzUrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjM6MzUrMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2FpZWx3cXRmZmUvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvYWllbHdxdGZmZS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2Ntcy9hMjM2Y2VlY2ViOTc4NjIyOTQ2MjNlMjlhNzQ5OGE2Njk4MzdlN2QxNmE4NWI5MjA5ZWRmYTJiMDBiNDZkZWI0LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9haWVsd3F0ZmZlL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVfREFNXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQxKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2RhbS8zNWU3OGM4OWYxZjI1ZTM5NjM2ZmQ4ZGU5ODI4ODc0M2JjOWQ3YThjNzNmZmUxMzQ4NGJmZjNjMzUwMDA5MWI3LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiT1JJT04gRW5kcG9pbnQgVXRpbGl0eSAyLjcuWCBmb3IgVHJpbWJsZSBSYW5nZXIgMyBNYW51YWwgKE9SSS1VTS0wMDgwMi1FTikucGRmXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVfREFNXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQxKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2RhbS8zNWU3OGM4OWYxZjI1ZTM5NjM2ZmQ4ZGU5ODI4ODc0M2JjOWQ3YThjNzNmZmUxMzQ4NGJmZjNjMzUwMDA5MWI3LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiT1JJT04gRW5kcG9pbnQgVXRpbGl0eSAyLjcuWCBmb3IgVHJpbWJsZSBSYW5nZXIgMyBNYW51YWwgKE9SSS1VTS0wMDgwMi1FTikucGRmXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcInN0YXR1c1wiOiBcIkdFTkVSQVRFX0FOU1dFUl9FTkRcIixcbiAgICAgIFwidG9va19zZWNzXCI6IDAuNTMsXG4gICAgICBcImFub255bW91c19pZFwiOiBcIjk4NmY3ZmIyNWVmOTRkNDNhMzYzMjEwNjhkMmUwMWI0XCJcbiAgICB9XG4gIH0sXG4gIFwiYmVhY29uZG9jc1wiOiB7XG4gICAgXCJzdWNjZXNzXCI6IHRydWUsXG4gICAgXCJjb250ZW50XCI6IHtcbiAgICAgIFwiY2hhdF9kb2NfaWRcIjogXCIwODY4YmVlMWIxZTI0ZmNmYmU0NTc1YjgxYTJlOWRmZVwiLFxuICAgICAgXCJjb25maWRlbmNlX2xldmVsXCI6IG51bGwsXG4gICAgICBcImRpc2NsYWltZXJcIjogXCJUaGlzIGluZm9ybWF0aW9uIHdhcyBnZW5lcmF0ZWQgYnkgYW4gQUkgc3lzdGVtIGFuZCBzaG91bGQgbm90IGJlIHNvbGVseSByZWxpZWQgdXBvbiBmb3IgZGVjaXNpb24tbWFraW5nLiBBbHdheXMgdmVyaWZ5IGluZm9ybWF0aW9uIHdpdGggY3JlZGlibGUgc291cmNlcyBhbmQgY29uc3VsdCB3aXRoIHJlbGV2YW50IGV4cGVydHMgYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIGJhc2VkIG9uIEFJLWdlbmVyYXRlZCBjb250ZW50LlwiLFxuICAgICAgXCJwcmVmZXJyZWRfbGFuZ3VhZ2VcIjogXCJlblwiLFxuICAgICAgXCJwcm9tcHRfaW50ZW50XCI6IFwiR0VORVJBTF9RVUVTVElPTlwiLFxuICAgICAgXCJyZWxhdGVkX3F1ZXN0aW9uc1wiOiBbXG4gICAgICAgIFwiV2hhdCBhcmUgdGhlIHN0ZXBzIHRvIGNsZWFyIGEgdGFtcGVyIGNvbmRpdGlvbiBvbiBhbiBlbmRwb2ludD9cIixcbiAgICAgICAgXCJIb3cgY2FuIGkgdHJvdWJsZXNob290IGNvbW1vbiBpc3N1ZXMgcmVsYXRlZCB0byBlbmRwb2ludCB0YW1wZXJpbmc/XCJcbiAgICAgIF0sXG4gICAgICBcInJlc3BvbnNlXCI6IFwiVGhlIE1vZE1BRyBkb2N1bWVudGF0aW9uIHByb3ZpZGVzIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBpbnN0YWxsYXRpb24sIG9wZXJhdGlvbiwgYW5kIG1haW50ZW5hbmNlIG9mIEJhZGdlciBNZXRlcidzIE1vZE1BRyBmbG93IG1ldGVycy4gSGVyZSBhcmUgc29tZSBrZXkgcG9pbnRzIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudGF0aW9uOlxcblxcbjEuICoqSW5zdGFsbGF0aW9uIFJlcXVpcmVtZW50cyoqOlxcbiAgIC0gVGVtcGVyYXR1cmUgc2Vuc29ycyBtdXN0IGJlIGNvbm5lY3RlZCB0byBzcGVjaWZpYyBjbGFtcHM6IHRoZSBpbmxldCBmbG93IHRlbXBlcmF0dXJlIHNlbnNvciB0byBjbGFtcHMgNSBhbmQgNiwgYW5kIHRoZSBvdXRsZXQgZmxvdyB0ZW1wZXJhdHVyZSBzZW5zb3IgdG8gY2xhbXBzIDcgYW5kIDguIFRoZSBjb2xvciBvZiB0aGUgd2lyZXMgZG9lcyBub3QgbWF0dGVyLCBidXQgY29ubmVjdGlvbnMgbXVzdCBiZSB0aWdodCBbKioyKipdLlxcbiAgIC0gVGhlIHB1bHNlIG91dHB1dCBvZiB0aGUgZmxvdyBtZXRlciBtdXN0IG1hdGNoIHRoZSBjYWxjdWxhdG9yIGlucHV0IHB1bHNlIHZhbHVlLiBGb3IgZmxvdyBtZXRlcnMgd2l0aCBvcGVuIGNvbGxlY3RvciBjb25uZWN0aW9ucywgZW5zdXJlIHRoZSBwb2xhcml0eSBpcyBjb3JyZWN0IFsqKjIqKl0uXFxuXFxuMi4gKipGbG93IE1ldGVyIFNwZWNpZmljYXRpb25zKio6XFxuICAgLSBGbG93IG1ldGVycyBzaG91bGQgY29tcGx5IHdpdGggQ2xhc3MgT0EgKHJlZWQgY29udGFjdCkgYW5kIENsYXNzIE9DIChvcGVuIGNvbGxlY3Rvcikgc3RhbmRhcmRzIGFjY29yZGluZyB0byBFTiAxNDM0LTI6IDIwMTUuIFRoZSBtYXhpbXVtIGlucHV0IGZyZXF1ZW5jeSBpcyAxMCBIeiwgd2l0aCBhIHB1bHNlIGxlbmd0aCBvZiBhdCBsZWFzdCAyNSBtcyBhbmQgYSBwdWxzZSBwYXVzZSBvZiBhdCBsZWFzdCA1MCBtcyBbKioyKipdLlxcblxcbjMuICoqT3BlcmF0aW9uIEd1aWRlbGluZXMqKjpcXG4gICAtIEJlZm9yZSBzdGFydGluZyBvcGVyYXRpb24sIGVuc3VyZSB0aGF0IHRoZSBmbG93IG1ldGVyIGlzIHRoZSBjb3JyZWN0IHNpemUsIHRoZSBkaXJlY3Rpb25hbCBhcnJvdyBtYXRjaGVzIHRoZSBmbG93IGRpcmVjdGlvbiwgYW5kIHRoZXJlIGFyZSBubyBsZWFrcy4gQWRkaXRpb25hbGx5LCBjaGVjayB0aGF0IHRoZSBoZWF0aW5nL2Nvb2xpbmcgc3lzdGVtIGlzIGNsZWFyIG9mIGNsb2dzIFsqKjIqKl0uXFxuXFxuNC4gKipNYWludGVuYW5jZSBQcm9jZWR1cmVzKio6XFxuICAgLSBSZWd1bGFyIGNsZWFuaW5nIG9mIHRoZSBmbG93IHR1YmUgYW5kIGVsZWN0cm9kZXMgbWF5IGJlIG5lY2Vzc2FyeSwgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm9jZXNzIGZsdWlkLiBVc2UgaXNvcHJvcHlsIGFsY29ob2wgb3IgY2xlYW4gd2F0ZXIgZm9yIGNsZWFuaW5nLCBlbnN1cmluZyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG1lYXN1cmVkIGZsdWlkIFsqKjQqKl0uXFxuICAgLSBGdXNlIHJlcGxhY2VtZW50IHNob3VsZCBvbmx5IGJlIHBlcmZvcm1lZCBieSBhdXRob3JpemVkIHBlcnNvbm5lbCwgYW5kIHRoZSBzYW1lIHR5cGUgYW5kIHJhdGluZyBvZiBmdXNlcyBtdXN0IGJlIHVzZWQgWyoqNCoqXS5cXG5cXG41LiAqKlRlY2huaWNhbCBTdXBwb3J0Kio6XFxuICAgLSBJZiBpc3N1ZXMgYXJpc2Ugd2l0aCB0aGUgbWV0ZXIsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNvbnRhY3QgQmFkZ2VyIE1ldGVyJ3MgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIGFzc2lzdGFuY2UsIGVzcGVjaWFsbHkgaWYgYSBwcm9ibGVtIGFwcGVhcnMgdG8gb3JpZ2luYXRlIGZyb20gdGhlIHByaW50ZWQgY2lyY3VpdCBib2FyZCAoUENCKSBbKio0KipdLlxcblxcbkZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgc3BlY2lmaWMgaW5zdGFsbGF0aW9uIGRpYWdyYW1zIGFuZCB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbnMsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIG9mZmljaWFsIEJhZGdlciBNZXRlciBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBvbiB0aGVpciB3ZWJzaXRlIFsqKjEqKl0uXFxuXFxuSWYgeW91IGhhdmUgc3BlY2lmaWMgYXNwZWN0cyBvZiB0aGUgTW9kTUFHIGRvY3VtZW50YXRpb24geW91IHdvdWxkIGxpa2UgdG8gZXhwbG9yZSBmdXJ0aGVyLCBwbGVhc2UgbGV0IG1lIGtub3chXFxuXFxuXCIsXG4gICAgICBcInNvdXJjZXNcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFX0RBTVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MiswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9vbmlpNWNkdzdtL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9kYW0vOWFjN2Q5NjJkNGU1ODhiZDcxYjM5ZmQ1YTQzMTI1YTdlMzUzMGQzZDZlOGZhZDQ5MzM3MWRhMzU5OGQ1NWM2Ny5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIk9SSU9OIEZpZWxkIEFwcGxpY2F0aW9uIDQuMy4wIGZvciBUcmltYmxlIFJhbmdlciAzIHdpdGggUmVhZENlbnRlciBNYW51YWwgKE9SSS1VTS0wMDE4NS1FTikucGRmXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9vbmlpNWNkdzdtL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVcIixcbiAgICAgICAgICBcImRhdGVfY3JlYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjI6MDcrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfcHVibGlzaGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMjowNyswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV91cGRhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMjowNyswMDowMFwiLFxuICAgICAgICAgIFwic291cmNlXCI6IFwiS05OXCIsXG4gICAgICAgICAgXCJzb3VyY2VfbGFuZ3VhZ2VcIjogXCJlblwiLFxuICAgICAgICAgIFwic291cmNlX3BhZ2VfbnVtYmVyXCI6IG51bGwsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeVwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdm9kZXR4a3l4aC9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeV9mdWxsXCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC92b2RldHhreXhoL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV90aHVtYm5haWxcIjogXCJodHRwczovL2FxdWFmbG8uYmVhY29uYW1hLXN0YWdpbmcubmV0L3ZfNl80L3RodW1ibmFpbHMvY21zLzI0YTI3MGEyNTk3NzI2ZjRkY2E3MTA3YTNjMGI1M2MyMThmZjBmYzc1MDg0ZGM2ZTE1MTMzMTk4ZGU2MzFmYTQucG5nXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGl0bGVcIjogXCJcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3ZvZGV0eGt5eGgvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJCQURHRVJfTUVURVJfU0lURVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMzozNSswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIzOjM1KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIzOjM1KzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9haWVsd3F0ZmZlL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2FpZWx3cXRmZmUvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9jbXMvYTIzNmNlZWNlYjk3ODYyMjk0NjIzZTI5YTc0OThhNjY5ODM3ZTdkMTZhODViOTIwOWVkZmEyYjAwYjQ2ZGViNC5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIlwiLFxuICAgICAgICAgIFwic291cmNlX3VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvYWllbHdxdGZmZS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFX0RBTVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MSswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQxKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQxKzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9kYW0vMzVlNzhjODlmMWYyNWUzOTYzNmZkOGRlOTgyODg3NDNiYzlkN2E4YzczZmZlMTM0ODRiZmYzYzM1MDAwOTFiNy5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIk9SSU9OIEVuZHBvaW50IFV0aWxpdHkgMi43LlggZm9yIFRyaW1ibGUgUmFuZ2VyIDMgTWFudWFsIChPUkktVU0tMDA4MDItRU4pLnBkZlwiLFxuICAgICAgICAgIFwic291cmNlX3VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGlcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJzdGF0dXNcIjogXCJHRU5FUkFURV9BTlNXRVJfRU5EXCIsXG4gICAgICBcInRvb2tfc2Vjc1wiOiA2LjEzLFxuICAgICAgXCJhbm9ueW1vdXNfaWRcIjogXCJjMjRkYmU1NjQ3NmE0YmRjOTI3N2YzY2YwNGYxMTM1N1wiXG4gICAgfVxuICB9LFxuICBcImJlYWNvbmZlZWRiYWNrXCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogdHJ1ZVxuICB9XG59IiwiLyoqXG4gKiBAcG9wcGVyanMvY29yZSB2Mi40LjQgLSBNSVQgTGljZW5zZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgdG9wOiByZWN0LnRvcCxcbiAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tLFxuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB4OiByZWN0LmxlZnQsXG4gICAgeTogcmVjdC50b3BcbiAgfTtcbn1cblxuLyo6OiBpbXBvcnQgdHlwZSB7IFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJzsgKi9cblxuLyo6OiBkZWNsYXJlIGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlOiBOb2RlIHwgV2luZG93KTogV2luZG93OyAqL1xuZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufVxuXG4vKjo6IGRlY2xhcmUgZnVuY3Rpb24gaXNFbGVtZW50KG5vZGU6IG1peGVkKTogYm9vbGVhbiAlY2hlY2tzKG5vZGUgaW5zdGFuY2VvZlxuICBFbGVtZW50KTsgKi9cblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuLyo6OiBkZWNsYXJlIGZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZTogbWl4ZWQpOiBib29sZWFuICVjaGVja3Mobm9kZSBpbnN0YW5jZW9mXG4gIEhUTUxFbGVtZW50KTsgKi9cblxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSB7XG4gIC8vICRGbG93Rml4TWU6IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgcmV0dXJuIChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiBlbGVtZW50LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCk7XG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbi8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5mdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gJEZsb3dGaXhNZTogdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICBlbGVtZW50LmFzc2lnbmVkU2xvdCB8fCAvLyBzdGVwIGludG8gdGhlIHNoYWRvdyBET00gb2YgdGhlIHBhcmVudCBvZiBhIHNsb3R0ZWQgbm9kZVxuICAgIGVsZW1lbnQucGFyZW50Tm9kZSB8fCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIC8vICRGbG93Rml4TWU6IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG4gICAgZWxlbWVudC5ob3N0IHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lOiBIVE1MRWxlbWVudCBpcyBhIE5vZGVcbiAgICBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkgLy8gZmFsbGJhY2tcblxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWU6IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn1cblxuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZSBcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5mdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KGVsZW1lbnQpO1xuICB2YXIgaXNCb2R5ID0gZ2V0Tm9kZU5hbWUoc2Nyb2xsUGFyZW50KSA9PT0gJ2JvZHknO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59XG5cbmZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmRleE9mKGdldE5vZGVOYW1lKGVsZW1lbnQpKSA+PSAwO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDtcblxuICBpZiAob2Zmc2V0UGFyZW50KSB7XG4gICAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcblxuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJyAmJiBnZXRDb21wdXRlZFN0eWxlKGh0bWwpLnBvc2l0aW9uICE9PSAnc3RhdGljJykge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmIFsnaHRtbCcsICdib2R5J10uaW5kZXhPZihnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpIDwgMCkge1xuICAgIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTsgLy8gVGhpcyBpcyBub24tZXhoYXVzdGl2ZSBidXQgY292ZXJzIHRoZSBtb3N0IGNvbW1vbiBDU1MgcHJvcGVydGllcyB0aGF0XG4gICAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cblxuICAgIGlmIChjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgY3NzLndpbGxDaGFuZ2UgJiYgY3NzLndpbGxDaGFuZ2UgIT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UGFyZW50ICYmIGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbmRvdztcbn1cblxudmFyIHRvcCA9ICd0b3AnO1xudmFyIGJvdHRvbSA9ICdib3R0b20nO1xudmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbnZhciBsZWZ0ID0gJ2xlZnQnO1xudmFyIGF1dG8gPSAnYXV0byc7XG52YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbnZhciBzdGFydCA9ICdzdGFydCc7XG52YXIgZW5kID0gJ2VuZCc7XG52YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG52YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xudmFyIHBvcHBlciA9ICdwb3BwZXInO1xudmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xudmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbnZhciBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL1tdLmNvbmNhdChiYXNlUGxhY2VtZW50cywgW2F1dG9dKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQsIHBsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7IC8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5cbnZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xudmFyIHJlYWQgPSAncmVhZCc7XG52YXIgYWZ0ZXJSZWFkID0gJ2FmdGVyUmVhZCc7IC8vIHB1cmUtbG9naWMgbW9kaWZpZXJzXG5cbnZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xudmFyIG1haW4gPSAnbWFpbic7XG52YXIgYWZ0ZXJNYWluID0gJ2FmdGVyTWFpbic7IC8vIG1vZGlmaWVyIHdpdGggdGhlIHB1cnBvc2UgdG8gd3JpdGUgdG8gdGhlIERPTSAob3Igd3JpdGUgaW50byBhIGZyYW1ld29yayBzdGF0ZSlcblxudmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbnZhciB3cml0ZSA9ICd3cml0ZSc7XG52YXIgYWZ0ZXJXcml0ZSA9ICdhZnRlcldyaXRlJztcbnZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTtcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn1cblxuZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXQoc3RyKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQoYXJncykucmVkdWNlKGZ1bmN0aW9uIChwLCBjKSB7XG4gICAgcmV0dXJuIHAucmVwbGFjZSgvJXMvLCBjKTtcbiAgfSwgc3RyKTtcbn1cblxudmFyIElOVkFMSURfTU9ESUZJRVJfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcHJvdmlkZWQgYW4gaW52YWxpZCAlcyBwcm9wZXJ0eSwgZXhwZWN0ZWQgJXMgYnV0IGdvdCAlcyc7XG52YXIgTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SID0gJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHJlcXVpcmVzIFwiJXNcIiwgYnV0IFwiJXNcIiBtb2RpZmllciBpcyBub3QgYXZhaWxhYmxlJztcbnZhciBWQUxJRF9QUk9QRVJUSUVTID0gWyduYW1lJywgJ2VuYWJsZWQnLCAncGhhc2UnLCAnZm4nLCAnZWZmZWN0JywgJ3JlcXVpcmVzJywgJ29wdGlvbnMnXTtcbmZ1bmN0aW9uIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBPYmplY3Qua2V5cyhtb2RpZmllcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICduYW1lJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBTdHJpbmcobW9kaWZpZXIubmFtZSksICdcIm5hbWVcIicsICdcInN0cmluZ1wiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIubmFtZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VuYWJsZWQnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlbmFibGVkXCInLCAnXCJib29sZWFuXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5lbmFibGVkKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICBpZiAobW9kaWZpZXJQaGFzZXMuaW5kZXhPZihtb2RpZmllci5waGFzZSkgPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJwaGFzZVwiJywgXCJlaXRoZXIgXCIgKyBtb2RpZmllclBoYXNlcy5qb2luKCcsICcpLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5waGFzZSkgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2ZuJzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJmblwiJywgJ1wiZnVuY3Rpb25cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmZuKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWZmZWN0JzpcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmVmZmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZWZmZWN0XCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyZXF1aXJlcyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wicmVxdWlyZXNcIicsICdcImFycmF5XCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5yZXF1aXJlcykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzSWZFeGlzdHMnOlxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wicmVxdWlyZXNJZkV4aXN0c1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUG9wcGVySlM6IGFuIGludmFsaWQgcHJvcGVydHkgaGFzIGJlZW4gcHJvdmlkZWQgdG8gdGhlIFxcXCJcIiArIG1vZGlmaWVyLm5hbWUgKyBcIlxcXCIgbW9kaWZpZXIsIHZhbGlkIHByb3BlcnRpZXMgYXJlIFwiICsgVkFMSURfUFJPUEVSVElFUy5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIHMgKyBcIlxcXCJcIjtcbiAgICAgICAgICB9KS5qb2luKCcsICcpICsgXCI7IGJ1dCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIHByb3ZpZGVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbW9kaWZpZXIucmVxdWlyZXMgJiYgbW9kaWZpZXIucmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWlyZW1lbnQpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChtb2QpIHtcbiAgICAgICAgICByZXR1cm4gbW9kLm5hbWUgPT09IHJlcXVpcmVtZW50O1xuICAgICAgICB9KSA9PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SLCBTdHJpbmcobW9kaWZpZXIubmFtZSksIHJlcXVpcmVtZW50LCByZXF1aXJlbWVudCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZUJ5KGFyciwgZm4pIHtcbiAgdmFyIGlkZW50aWZpZXJzID0gbmV3IFNldCgpO1xuICByZXR1cm4gYXJyLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBpZGVudGlmaWVyID0gZm4oaXRlbSk7XG5cbiAgICBpZiAoIWlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgaWRlbnRpZmllcnMuYWRkKGlkZW50aWZpZXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufVxuXG5mdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcpLCBjdXJyZW50KSwge30sIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucyksIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEpLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7IC8vIE5COiBUaGlzIGlzbid0IHN1cHBvcnRlZCBvbiBpT1MgPD0gMTIuIElmIHRoZSBrZXlib2FyZCBpcyBvcGVuLCB0aGUgcG9wcGVyXG4gIC8vIGNhbiBiZSBvYnNjdXJlZCB1bmRlcm5lYXRoIGl0LlxuICAvLyBBbHNvLCBgaHRtbC5jbGllbnRIZWlnaHRgIGFkZHMgdGhlIGJvdHRvbSBiYXIgaGVpZ2h0IGluIFNhZmFyaSBpT1MsIGV2ZW5cbiAgLy8gaWYgaXQgaXNuJ3Qgb3Blbiwgc28gaWYgdGhpcyBpc24ndCBhdmFpbGFibGUsIHRoZSBwb3BwZXIgd2lsbCBiZSBkZXRlY3RlZFxuICAvLyB0byBvdmVyZmxvdyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gdG9vIGVhcmx5LlxuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0OyAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG4gICAgLy8gRmVhdHVyZSBkZXRlY3Rpb24gZmFpbHMgaW4gbW9iaWxlIGVtdWxhdGlvbiBtb2RlIGluIENocm9tZS5cbiAgICAvLyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZpc3VhbFZpZXdwb3J0LnNjYWxlIC0gdmlzdWFsVmlld3BvcnQud2lkdGgpIDxcbiAgICAvLyAwLjAwMVxuICAgIC8vIEZhbGxiYWNrIGhlcmU6IFwiTm90IFNhZmFyaVwiIHVzZXJBZ2VudFxuXG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufVxuXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICB2YXIgd2lkdGggPSBNYXRoLm1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLm1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBNYXRoLm1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICAvLyAkRmxvd0ZpeE1lOiBoYXNPd25Qcm9wZXJ0eSBkb2Vzbid0IHNlZW0gdG8gd29yayBpbiB0ZXN0c1xuICB2YXIgaXNTaGFkb3cgPSBCb29sZWFuKGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCkuaG9zdCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKGlzU2hhZG93KSB7XG4gICAgICB2YXIgbmV4dCA9IGNoaWxkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuZXh0ICYmIHBhcmVudC5pc1NhbWVOb2RlKG5leHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZWN0KSwge30sIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpKSA6IGlzSFRNTEVsZW1lbnQoY2xpcHBpbmdQYXJlbnQpID8gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50KTtcbiAgICBhY2NSZWN0LnRvcCA9IE1hdGgubWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IE1hdGgubWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gTWF0aC5taW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBNYXRoLm1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHJlZmVyZW5jZSA9IF9yZWYucmVmZXJlbmNlLFxuICAgICAgZWxlbWVudCA9IF9yZWYuZWxlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciB2YXJpYXRpb24gPSBwbGFjZW1lbnQgPyBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA6IG51bGw7XG4gIHZhciBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZWxlbWVudC53aWR0aCAvIDI7XG4gIHZhciBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgdmFyIG9mZnNldHM7XG5cbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGJvdHRvbTpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSByaWdodDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cblxuICB2YXIgbWFpbkF4aXMgPSBiYXNlUGxhY2VtZW50ID8gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgc3dpdGNoICh2YXJpYXRpb24pIHtcbiAgICAgIGNhc2Ugc3RhcnQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gTWF0aC5mbG9vcihvZmZzZXRzW21haW5BeGlzXSkgLSBNYXRoLmZsb29yKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gTWF0aC5mbG9vcihvZmZzZXRzW21haW5BeGlzXSkgKyBNYXRoLmNlaWwocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufVxuXG5mdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpKSwgcGFkZGluZ09iamVjdCk7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFRvSGFzaE1hcCh2YWx1ZSwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGhhc2hNYXAsIGtleSkge1xuICAgIGhhc2hNYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBoYXNoTWFwO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciByZWZlcmVuY2VFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIHZhciBjbGlwcGluZ0NsaWVudFJlY3QgPSBnZXRDbGlwcGluZ1JlY3QoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudCA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2VFbGVtZW50KTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QpLCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn1cblxudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvcHBlckdlbmVyYXRvcihnZW5lcmF0b3JPcHRpb25zKSB7XG4gIGlmIChnZW5lcmF0b3JPcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBnZW5lcmF0b3JPcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX2dlbmVyYXRvck9wdGlvbnMgPSBnZW5lcmF0b3JPcHRpb25zLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE1vZGlmaWVycyxcbiAgICAgIGRlZmF1bHRNb2RpZmllcnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPT09IHZvaWQgMCA/IFtdIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmLFxuICAgICAgX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRPcHRpb25zLFxuICAgICAgZGVmYXVsdE9wdGlvbnMgPSBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID09PSB2b2lkIDAgPyBERUZBVUxUX09QVElPTlMgOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyO1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZSwgcG9wcGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TKSwgZGVmYXVsdE9wdGlvbnMpLFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyOiBwb3BwZXJcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge31cbiAgICB9O1xuICAgIHZhciBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgdmFyIGlzRGVzdHJveWVkID0gZmFsc2U7XG4gICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgc2V0T3B0aW9uczogZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucyksIHN0YXRlLm9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICB2YXIgbW9kaWZpZXJzID0gdW5pcXVlQnkoW10uY29uY2F0KG9yZGVyZWRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgICAgICAgIGlmIChnZXRCYXNlUGxhY2VtZW50KHN0YXRlLm9wdGlvbnMucGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgICAgICAgICAgdmFyIGZsaXBNb2RpZmllciA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmMi5uYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ2ZsaXAnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZmxpcE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXV0b1wiIHBsYWNlbWVudHMgcmVxdWlyZSB0aGUgXCJmbGlwXCIgbW9kaWZpZXIgYmUnLCAncHJlc2VudCBhbmQgZW5hYmxlZCB0byB3b3JrLiddLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwb3BwZXIpLFxuICAgICAgICAgICAgICBtYXJnaW5Ub3AgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3AsXG4gICAgICAgICAgICAgIG1hcmdpblJpZ2h0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luUmlnaHQsXG4gICAgICAgICAgICAgIG1hcmdpbkJvdHRvbSA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgICAgbWFyZ2luTGVmdCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQ7IC8vIFdlIG5vIGxvbmdlciB0YWtlIGludG8gYWNjb3VudCBgbWFyZ2luc2Agb24gdGhlIHBvcHBlciwgYW5kIGl0IGNhblxuICAgICAgICAgIC8vIGNhdXNlIGJ1Z3Mgd2l0aCBwb3NpdGlvbmluZywgc28gd2UnbGwgd2FybiB0aGUgY29uc3VtZXJcblxuXG4gICAgICAgICAgaWYgKFttYXJnaW5Ub3AsIG1hcmdpblJpZ2h0LCBtYXJnaW5Cb3R0b20sIG1hcmdpbkxlZnRdLnNvbWUoZnVuY3Rpb24gKG1hcmdpbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobWFyZ2luKTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBDU1MgXCJtYXJnaW5cIiBzdHlsZXMgY2Fubm90IGJlIHVzZWQgdG8gYXBwbHkgcGFkZGluZycsICdiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudCBvciBib3VuZGFyeS4nLCAnVG8gcmVwbGljYXRlIG1hcmdpbiwgdXNlIHRoZSBgb2Zmc2V0YCBtb2RpZmllciwgYXMgd2VsbCBhcycsICd0aGUgYHBhZGRpbmdgIG9wdGlvbiBpbiB0aGUgYHByZXZlbnRPdmVyZmxvd2AgYW5kIGBmbGlwYCcsICdtb2RpZmllcnMuJ10uam9pbignICcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIOKAkyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX19kZWJ1Z19sb29wc19fID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmMy5uYW1lLFxuICAgICAgICAgICAgX3JlZjMkb3B0aW9ucyA9IF9yZWYzLm9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zID0gX3JlZjMkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmMyRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZjMuZWZmZWN0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNsZWFudXBGbiA9IGVmZmVjdCh7XG4gICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIG5vb3BGbiA9IGZ1bmN0aW9uIG5vb3BGbigpIHt9O1xuXG4gICAgICAgICAgZWZmZWN0Q2xlYW51cEZucy5wdXNoKGNsZWFudXBGbiB8fCBub29wRm4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbnVwTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgZWZmZWN0Q2xlYW51cEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGV2ZW50TGlzdGVuZXJzID0ge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgcG9wcGVyT2Zmc2V0cyQxID0ge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTtcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHMoX3JlZikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IE1hdGgucm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiBNYXRoLnJvdW5kKHkgKiBkcHIpIC8gZHByIHx8IDBcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlO1xuXG4gIHZhciBfcm91bmRPZmZzZXRzID0gcm91bmRPZmZzZXRzKG9mZnNldHMpLFxuICAgICAgeCA9IF9yb3VuZE9mZnNldHMueCxcbiAgICAgIHkgPSBfcm91bmRPZmZzZXRzLnk7XG5cbiAgdmFyIGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIHZhciBoYXNZID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneScpO1xuICB2YXIgc2lkZVggPSBsZWZ0O1xuICB2YXIgc2lkZVkgPSB0b3A7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG5cbiAgaWYgKGFkYXB0aXZlKSB7XG4gICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChwb3BwZXIpO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuICAgIH0gLy8gJEZsb3dGaXhNZTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuICAgIC8qOjogb2Zmc2V0UGFyZW50ID0gKG9mZnNldFBhcmVudDogRWxlbWVudCk7ICovXG5cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICB5IC09IG9mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQpIHtcbiAgICAgIHNpZGVYID0gcmlnaHQ7XG4gICAgICB4IC09IG9mZnNldFBhcmVudC5jbGllbnRXaWR0aCAtIHBvcHBlclJlY3Qud2lkdGg7XG4gICAgICB4ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcG9zaXRpb246IHBvc2l0aW9uXG4gIH0sIGFkYXB0aXZlICYmIHVuc2V0U2lkZXMpO1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMpLCB7fSwgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPCAyID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcyksIHt9LCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmMykge1xuICB2YXIgc3RhdGUgPSBfcmVmMy5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMy5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmU7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvblxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIpLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcyksIHt9LCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZVxuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3cpLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcyksIHt9LCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2VcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyKSwge30sIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGNvbXB1dGVTdHlsZXMkMSA9IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59O1xuXG4vLyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBIVE1MRWxlbWVudHMgc3VjaCBhcyBwb3BwZXIgYW5kIGFycm93XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGVzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZTtcbiAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgc3R5bGUgPSBzdGF0ZS5zdHlsZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRmxvdyBkb2Vzbid0IHN1cHBvcnQgdG8gZXh0ZW5kIHRoaXMgcHJvcGVydHksIGJ1dCBpdCdzIHRoZSBtb3N0XG4gICAgLy8gZWZmZWN0aXZlIHdheSB0byBhcHBseSBzdHlsZXMgdG8gYW4gSFRNTEVsZW1lbnRcbiAgICAvLyAkRmxvd0ZpeE1lXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0JDEoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG4gIHZhciBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnXG4gICAgfSxcbiAgICBhcnJvdzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICB9LFxuICAgIHJlZmVyZW5jZToge31cbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcblxuICBpZiAoc3RhdGUuZWxlbWVudHMuYXJyb3cpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbbmFtZV07XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgICB2YXIgc3R5bGVQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc3RhdGUuc3R5bGVzLmhhc093blByb3BlcnR5KG5hbWUpID8gc3RhdGUuc3R5bGVzW25hbWVdIDogaW5pdGlhbFN0eWxlc1tuYW1lXSk7IC8vIFNldCBhbGwgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZyB0byB1bnNldCB0aGVtXG5cbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlUHJvcGVydGllcy5yZWR1Y2UoZnVuY3Rpb24gKHN0eWxlLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdHlsZVtwcm9wZXJ0eV0gPSAnJztcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfSwge30pOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgICAgLy8gZWZmZWN0aXZlIHdheSB0byBhcHBseSBzdHlsZXMgdG8gYW4gSFRNTEVsZW1lbnRcbiAgICAgIC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgYXBwbHlTdHlsZXMkMSA9IHtcbiAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBhcHBseVN0eWxlcyxcbiAgZWZmZWN0OiBlZmZlY3QkMSxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59O1xuXG5mdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZWN0cyksIHt9LCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBvZmZzZXQkMSA9IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTtcblxudmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59XG5cbnZhciBoYXNoJDEgPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2gkMVttYXRjaGVkXTtcbiAgfSk7XG59XG5cbi8qOjogdHlwZSBPdmVyZmxvd3NNYXAgPSB7IFtDb21wdXRlZFBsYWNlbWVudF06IG51bWJlciB9OyAqL1xuXG4vKjs7IHR5cGUgT3ZlcmZsb3dzTWFwID0geyBba2V5IGluIENvbXB1dGVkUGxhY2VtZW50XTogbnVtYmVyIH07ICovXG5mdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IHBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMkMSA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50czsgLy8gJEZsb3dGaXhNZVxuXG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMkMS5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMkMTtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBmbGlwJDEgPSB7XG4gIG5hbWU6ICdmbGlwJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGZsaXAsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG4gIGRhdGE6IHtcbiAgICBfc2tpcDogZmFsc2VcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG5cbmZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4odmFsdWUsIG1heCkpO1xufVxuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzKSwge30sIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBkYXRhID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmICghcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIHRldGhlck9mZnNldFZhbHVlIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSB0ZXRoZXJPZmZzZXRWYWx1ZTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgdGV0aGVyT2Zmc2V0VmFsdWUgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIHRldGhlck9mZnNldFZhbHVlO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XVttYWluQXhpc10gOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IE1hdGgubWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBNYXRoLm1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHdpdGhpbihfbWluLCBfb2Zmc2V0LCBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIHByZXZlbnRPdmVyZmxvdyQxID0ge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gIGlmICghYXJyb3dFbGVtZW50IHx8ICFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWUgKyBcIiNwZXJzaXN0ZW50XCJdLnBhZGRpbmc7XG4gIHZhciBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIHZhciBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgdmFyIG1heFByb3AgPSBheGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgdmFyIGVuZERpZmYgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbbGVuXSArIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5wb3BwZXJbbGVuXTtcbiAgdmFyIHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG4gIHZhciBhcnJvd09mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChhcnJvd0VsZW1lbnQpO1xuICB2YXIgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRXaWR0aCB8fCAwIDogMDtcbiAgdmFyIGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyOyAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcblxuICB2YXIgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgdmFyIG1heCA9IGNsaWVudFNpemUgLSBhcnJvd1JlY3RbbGVuXSAtIHBhZGRpbmdPYmplY3RbbWF4UHJvcF07XG4gIHZhciBjZW50ZXIgPSBjbGllbnRTaXplIC8gMiAtIGFycm93UmVjdFtsZW5dIC8gMiArIGNlbnRlclRvUmVmZXJlbmNlO1xuICB2YXIgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBQcmV2ZW50cyBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLi4uXG5cbiAgdmFyIGF4aXNQcm9wID0gYXhpcztcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IChfc3RhdGUkbW9kaWZpZXJzRGF0YSQgPSB7fSwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkW2F4aXNQcm9wXSA9IG9mZnNldCwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkLmNlbnRlck9mZnNldCA9IG9mZnNldCAtIGNlbnRlciwgX3N0YXRlJG1vZGlmaWVyc0RhdGEkKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0JDIoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQsXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXJyb3dcIiBlbGVtZW50IG11c3QgYmUgYW4gSFRNTEVsZW1lbnQgKG5vdCBhbiBTVkdFbGVtZW50KS4nLCAnVG8gdXNlIGFuIFNWRyBhcnJvdywgd3JhcCBpdCBpbiBhbiBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgdXNlZCBhcycsICd0aGUgYXJyb3cuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgbW9kaWZpZXJcXCdzIGBlbGVtZW50YCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHBvcHBlcicsICdlbGVtZW50LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZSArIFwiI3BlcnNpc3RlbnRcIl0gPSB7XG4gICAgcGFkZGluZzogbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGFycm93JDEgPSB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QkMixcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59O1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIpLCB7fSwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGhpZGUkMSA9IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTtcblxudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMkMSwgY29tcHV0ZVN0eWxlcyQxLCBhcHBseVN0eWxlcyQxLCBvZmZzZXQkMSwgZmxpcCQxLCBwcmV2ZW50T3ZlcmZsb3ckMSwgYXJyb3ckMSwgaGlkZSQxXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0cy5jcmVhdGVQb3BwZXIgPSBjcmVhdGVQb3BwZXI7XG5leHBvcnRzLmRlZmF1bHRNb2RpZmllcnMgPSBkZWZhdWx0TW9kaWZpZXJzO1xuZXhwb3J0cy5kZXRlY3RPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93O1xuZXhwb3J0cy5wb3BwZXJHZW5lcmF0b3IgPSBwb3BwZXJHZW5lcmF0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb3BwZXIuanMubWFwXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgc2V0dGxlID0gcmVxdWlyZSgnLi8uLi9jb3JlL3NldHRsZScpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgYnVpbGRGdWxsUGF0aCA9IHJlcXVpcmUoJy4uL2NvcmUvYnVpbGRGdWxsUGF0aCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICB2YXIgdXNlcm5hbWUgPSBjb25maWcuYXV0aC51c2VybmFtZSB8fCAnJztcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkIHx8ICcnO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFjb25maWcucmVzcG9uc2VUeXBlIHx8IGNvbmZpZy5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICB2YXIgdGltZW91dEVycm9yTWVzc2FnZSA9ICd0aW1lb3V0IG9mICcgKyBjb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCc7XG4gICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIGNvbmZpZywgJ0VDT05OQUJPUlRFRCcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG4gICAgaWYgKHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHtcbiAgICAgIHZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcblxuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICB2YXIgeHNyZlZhbHVlID0gKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgaXNVUkxTYW1lT3JpZ2luKGZ1bGxQYXRoKSkgJiYgY29uZmlnLnhzcmZDb29raWVOYW1lID9cbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbY29uZmlnLnhzcmZIZWFkZXJOYW1lXSA9IHhzcmZWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3REYXRhID09PSAndW5kZWZpbmVkJyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChjb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IGNvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIERPTUV4Y2VwdGlvbiB0aHJvd24gYnkgYnJvd3NlcnMgbm90IGNvbXBhdGlibGUgWE1MSHR0cFJlcXVlc3QgTGV2ZWwgMi5cbiAgICAgICAgLy8gQnV0LCB0aGlzIGNhbiBiZSBzdXBwcmVzc2VkIGZvciAnanNvbicgdHlwZSBhcyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGRlZmF1bHQgJ3RyYW5zZm9ybVJlc3BvbnNlJyBmdW5jdGlvbi5cbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25Eb3dubG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzID09PSAnZnVuY3Rpb24nICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vblVwbG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4ucHJvbWlzZS50aGVuKGZ1bmN0aW9uIG9uQ2FuY2VsZWQoY2FuY2VsKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVqZWN0KGNhbmNlbCk7XG4gICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEpO1xuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9jb3JlL21lcmdlQ29uZmlnJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIHZhciBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG5heGlvcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGF4aW9zLmRlZmF1bHRzLCBpbnN0YW5jZUNvbmZpZykpO1xufTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWwnKTtcbmF4aW9zLkNhbmNlbFRva2VuID0gcmVxdWlyZSgnLi9jYW5jZWwvQ2FuY2VsVG9rZW4nKTtcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcblxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSBgQ2FuY2VsYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbChtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XG59O1xuXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENhbmNlbDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsVG9rZW4oZXhlY3V0b3IpIHtcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciByZXNvbHZlUHJvbWlzZTtcbiAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gIH0pO1xuXG4gIHZhciB0b2tlbiA9IHRoaXM7XG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XG4gICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcbiAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5DYW5jZWxUb2tlbi5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gIGlmICh0aGlzLnJlYXNvbikge1xuICAgIHRocm93IHRoaXMucmVhc29uO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gKi9cbkNhbmNlbFRva2VuLnNvdXJjZSA9IGZ1bmN0aW9uIHNvdXJjZSgpIHtcbiAgdmFyIGNhbmNlbDtcbiAgdmFyIHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICBjYW5jZWwgPSBjO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgY2FuY2VsOiBjYW5jZWxcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsVG9rZW47XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGJ1aWxkVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IHJlcXVpcmUoJy4vSW50ZXJjZXB0b3JNYW5hZ2VyJyk7XG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9kaXNwYXRjaFJlcXVlc3QnKTtcbnZhciBtZXJnZUNvbmZpZyA9IHJlcXVpcmUoJy4vbWVyZ2VDb25maWcnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gQXhpb3MoaW5zdGFuY2VDb25maWcpIHtcbiAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICB9O1xufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICovXG5BeGlvcy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIHJlcXVlc3QoY29uZmlnKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZyA9IGFyZ3VtZW50c1sxXSB8fCB7fTtcbiAgICBjb25maWcudXJsID0gYXJndW1lbnRzWzBdO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgfVxuXG4gIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gY29uZmlnLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdHMubWV0aG9kKSB7XG4gICAgY29uZmlnLm1ldGhvZCA9IHRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnLm1ldGhvZCA9ICdnZXQnO1xuICB9XG5cbiAgLy8gSG9vayB1cCBpbnRlcmNlcHRvcnMgbWlkZGxld2FyZVxuICB2YXIgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LCB1bmRlZmluZWRdO1xuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgIGNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgd2hpbGUgKGNoYWluLmxlbmd0aCkge1xuICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW4uc2hpZnQoKSwgY2hhaW4uc2hpZnQoKSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbkF4aW9zLnByb3RvdHlwZS5nZXRVcmkgPSBmdW5jdGlvbiBnZXRVcmkoY29uZmlnKSB7XG4gIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gIHJldHVybiBidWlsZFVSTChjb25maWcudXJsLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlxcPy8sICcnKTtcbn07XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybFxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmwsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiBlamVjdChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgZm4oaCk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTCcpO1xudmFyIGNvbWJpbmVVUkxzID0gcmVxdWlyZSgnLi4vaGVscGVycy9jb21iaW5lVVJMcycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVuaGFuY2VFcnJvciA9IHJlcXVpcmUoJy4vZW5oYW5jZUVycm9yJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVycm9yKG1lc3NhZ2UsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcbiAgY29uZmlnLmhlYWRlcnMgPSBjb25maWcuaGVhZGVycyB8fCB7fTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICBjb25maWcuZGF0YSxcbiAgICBjb25maWcuaGVhZGVycyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGNvbmZpZy5oZWFkZXJzLmNvbW1vbiB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1tjb25maWcubWV0aG9kXSB8fCB7fSxcbiAgICBjb25maWcuaGVhZGVyc1xuICApO1xuXG4gIHV0aWxzLmZvckVhY2goXG4gICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgZnVuY3Rpb24gY2xlYW5IZWFkZXJDb25maWcobWV0aG9kKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcbiAgICB9XG4gICk7XG5cbiAgdmFyIGFkYXB0ZXIgPSBjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YShcbiAgICAgIHJlc3BvbnNlLmRhdGEsXG4gICAgICByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXBkYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWcsIGVycm9yIGNvZGUsIGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciBUaGUgZXJyb3IgdG8gdXBkYXRlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xuICBpZiAoY29kZSkge1xuICAgIGVycm9yLmNvZGUgPSBjb2RlO1xuICB9XG5cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIGVycm9yLmlzQXhpb3NFcnJvciA9IHRydWU7XG5cbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb2RlOiB0aGlzLmNvZGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gZXJyb3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgdmFyIGNvbmZpZyA9IHt9O1xuXG4gIHZhciB2YWx1ZUZyb21Db25maWcyS2V5cyA9IFsndXJsJywgJ21ldGhvZCcsICdwYXJhbXMnLCAnZGF0YSddO1xuICB2YXIgbWVyZ2VEZWVwUHJvcGVydGllc0tleXMgPSBbJ2hlYWRlcnMnLCAnYXV0aCcsICdwcm94eSddO1xuICB2YXIgZGVmYXVsdFRvQ29uZmlnMktleXMgPSBbXG4gICAgJ2Jhc2VVUkwnLCAndXJsJywgJ3RyYW5zZm9ybVJlcXVlc3QnLCAndHJhbnNmb3JtUmVzcG9uc2UnLCAncGFyYW1zU2VyaWFsaXplcicsXG4gICAgJ3RpbWVvdXQnLCAnd2l0aENyZWRlbnRpYWxzJywgJ2FkYXB0ZXInLCAncmVzcG9uc2VUeXBlJywgJ3hzcmZDb29raWVOYW1lJyxcbiAgICAneHNyZkhlYWRlck5hbWUnLCAnb25VcGxvYWRQcm9ncmVzcycsICdvbkRvd25sb2FkUHJvZ3Jlc3MnLFxuICAgICdtYXhDb250ZW50TGVuZ3RoJywgJ3ZhbGlkYXRlU3RhdHVzJywgJ21heFJlZGlyZWN0cycsICdodHRwQWdlbnQnLFxuICAgICdodHRwc0FnZW50JywgJ2NhbmNlbFRva2VuJywgJ3NvY2tldFBhdGgnXG4gIF07XG5cbiAgdXRpbHMuZm9yRWFjaCh2YWx1ZUZyb21Db25maWcyS2V5cywgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcyW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMltwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gobWVyZ2VEZWVwUHJvcGVydGllc0tleXMsIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMocHJvcCkge1xuICAgIGlmICh1dGlscy5pc09iamVjdChjb25maWcyW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gdXRpbHMuZGVlcE1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNPYmplY3QoY29uZmlnMVtwcm9wXSkpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IHV0aWxzLmRlZXBNZXJnZShjb25maWcxW3Byb3BdKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcxW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMVtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHV0aWxzLmZvckVhY2goZGVmYXVsdFRvQ29uZmlnMktleXMsIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMVtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzFbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICB2YXIgYXhpb3NLZXlzID0gdmFsdWVGcm9tQ29uZmlnMktleXNcbiAgICAuY29uY2F0KG1lcmdlRGVlcFByb3BlcnRpZXNLZXlzKVxuICAgIC5jb25jYXQoZGVmYXVsdFRvQ29uZmlnMktleXMpO1xuXG4gIHZhciBvdGhlcktleXMgPSBPYmplY3RcbiAgICAua2V5cyhjb25maWcyKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gZmlsdGVyQXhpb3NLZXlzKGtleSkge1xuICAgICAgcmV0dXJuIGF4aW9zS2V5cy5pbmRleE9mKGtleSkgPT09IC0xO1xuICAgIH0pO1xuXG4gIHV0aWxzLmZvckVhY2gob3RoZXJLZXlzLCBmdW5jdGlvbiBvdGhlcktleXNEZWZhdWx0VG9Db25maWcyKHByb3ApIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzFbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcxW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy94aHInKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG52YXIgZGVmYXVsdHMgPSB7XG4gIGFkYXB0ZXI6IGdldERlZmF1bHRBZGFwdGVyKCksXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgJ0FjY2VwdCcpO1xuICAgIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpO1xuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIElnbm9yZSAqLyB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9XG59O1xuXG5kZWZhdWx0cy5oZWFkZXJzID0ge1xuICBjb21tb246IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBbdmFsXTtcbiAgICAgIH1cblxuICAgICAgdXRpbHMuZm9yRWFjaCh2YWwsIGZ1bmN0aW9uIHBhcnNlVmFsdWUodikge1xuICAgICAgICBpZiAodXRpbHMuaXNEYXRlKHYpKSB7XG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdCh2KSkge1xuICAgICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGVuY29kZShrZXkpICsgJz0nICsgZW5jb2RlKHYpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcnRzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cblxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAgICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgICAgIHZhciBjb29raWUgPSBbXTtcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIoZXhwaXJlcykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcoZG9tYWluKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VjdXJlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKG5hbWUpIHtcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIHdyaXRlKCkge30sXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICB2YXIgbXNpZSA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICB2YXIgb3JpZ2luVVJMO1xuXG4gICAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICAgIHZhciBocmVmID0gdXJsO1xuXG4gICAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgICAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG5cbi8qZ2xvYmFsIHRvU3RyaW5nOnRydWUqL1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodmFsKSB7XG4gIHJldHVybiAodHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJykgJiYgKHZhbCBpbnN0YW5jZW9mIEZvcm1EYXRhKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAodmFsLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJlYW0odmFsKSB7XG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJykucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICovXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTmF0aXZlU2NyaXB0JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTlMnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gZXF1YWwgdG8gbWVyZ2Ugd2l0aCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IG5vIHJlZmVyZW5jZVxuICogdG8gb3JpZ2luYWwgb2JqZWN0cyBpcyBrZXB0LlxuICpcbiAqIEBzZWUgbWVyZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGRlZXBNZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKGEsIGIsIHRoaXNBcmcpIHtcbiAgZm9yRWFjaChiLCBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0aGlzQXJnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBkZWVwTWVyZ2U6IGRlZXBNZXJnZSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRyaW06IHRyaW1cbn07XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnZmluZCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnQXJyYXknLCAnaW5jbHVkZXMnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzJyk7XG52YXIgZW50cnlVbmJpbmQgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZW50cnktdW5iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW50cnlVbmJpbmQoJ1N0cmluZycsICdpbmNsdWRlcycpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3dyYXBwZWQtd2VsbC1rbm93bi1zeW1ib2wnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoJ2l0ZXJhdG9yJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2VzL3Byb21pc2UnKTtcblxucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLnRyeScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQucHJvbWlzZS5hbnknKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcblxudmFyIFVOU0NPUEFCTEVTID0gd2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBoaWRlKEFycmF5UHJvdG90eXBlLCBVTlNDT1BBQkxFUywgY3JlYXRlKG51bGwpKTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCAnICsgKG5hbWUgPyBuYW1lICsgJyAnIDogJycpICsgJ2ludm9jYXRpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmdcbiAgICAgICAgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSlcbiAgICAgICAgOiBzdGVwLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG4vLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9iaW5kLWNvbnRleHQnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG4vLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbi8vIDQgLT4gQXJyYXkjZXZlcnlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuLy8gNiAtPiBBcnJheSNmaW5kSW5kZXhcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHNwZWNpZmljQ3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiB0YXJnZXQucHVzaCh2YWx1ZSk7ICAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2UgaWYgKElTX0VWRVJZKSByZXR1cm4gZmFsc2U7ICAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsQXJyYXkpKSB7XG4gICAgQyA9IG9yaWdpbmFsQXJyYXkuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gbmV3IChDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEMpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwidmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXJhdG9yLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSBJdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBJdGVyYXRvcnNDb3JlLkJVR0dZX1NBRkFSSV9JVEVSQVRPUlM7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcbnZhciBFTlRSSUVTID0gJ2VudHJpZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhYmxlLCBOQU1FLCBJdGVyYXRvckNvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuXG4gIHZhciBnZXRJdGVyYXRpb25NZXRob2QgPSBmdW5jdGlvbiAoS0lORCkge1xuICAgIGlmIChLSU5EID09PSBERUZBVUxUICYmIGRlZmF1bHRJdGVyYXRvcikgcmV0dXJuIGRlZmF1bHRJdGVyYXRvcjtcbiAgICBpZiAoIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09ICdBcnJheScgPyBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzIHx8IG5hdGl2ZUl0ZXJhdG9yIDogbmF0aXZlSXRlcmF0b3I7XG4gIHZhciBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIG1ldGhvZHMsIEtFWTtcblxuICAvLyBmaXggbmF0aXZlXG4gIGlmIChhbnlOYXRpdmVJdGVyYXRvcikge1xuICAgIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGFueU5hdGl2ZUl0ZXJhdG9yLmNhbGwobmV3IEl0ZXJhYmxlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaGlkZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmF0aXZlSXRlcmF0b3IuY2FsbCh0aGlzKTsgfTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBoaWRlKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yKTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIHJlZGVmaW5lKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dyYXBwZWQtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSkge1xuICB2YXIgU3ltYm9sID0gcGF0aC5TeW1ib2wgfHwgKHBhdGguU3ltYm9sID0ge30pO1xuICBpZiAoIWhhcyhTeW1ib2wsIE5BTUUpKSBkZWZpbmVQcm9wZXJ0eShTeW1ib2wsIE5BTUUsIHtcbiAgICB2YWx1ZTogd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKE5BTUUpXG4gIH0pO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBleGlzdCA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGV4aXN0ID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIvLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9iaW5kLWNvbnRleHQnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9ELCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJpbmQoY2FsbCwgZ2xvYmFsW0NPTlNUUlVDVE9SXS5wcm90b3R5cGVbTUVUSE9EXSwgbGVuZ3RoKTtcbn07XG4iLCIvLyBJRTgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gW1xuICAnY29uc3RydWN0b3InLFxuICAnaGFzT3duUHJvcGVydHknLFxuICAnaXNQcm90b3R5cGVPZicsXG4gICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICd0b0xvY2FsZVN0cmluZycsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJ1xuXTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGhpZGUoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhcmVkKCduYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nJywgRnVuY3Rpb24udG9TdHJpbmcpO1xuIiwidmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICdmdW5jdGlvbicgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxbbmFtZXNwYWNlXSAmJiBnbG9iYWxbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBPID0gJ29iamVjdCc7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSBPICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gTyAmJiB3aW5kb3cpIHx8XG4gIGNoZWNrKHR5cGVvZiBzZWxmID09IE8gJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSBPICYmIGdsb2JhbCkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS5lcnJvcikge1xuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjb25zb2xlLmVycm9yKGEpIDogY29uc29sZS5lcnJvcihhLCBiKTtcbiAgfVxufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT0gNztcbn0pO1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGhpZGUoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCJ2YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG90eXBlW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbi8vIGBJc0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gY2xhc3NvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9iaW5kLWNvbnRleHQnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xuXG52YXIgQlJFQUsgPSB7fTtcblxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZm4sIHRoYXQsIEVOVFJJRVMsIElURVJBVE9SKSB7XG4gIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChmbiwgdGhhdCwgRU5UUklFUyA/IDIgOiAxKTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgc3RlcDtcblxuICBpZiAoSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IEVOVFJJRVMgPyBib3VuZEZ1bmN0aW9uKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGJvdW5kRnVuY3Rpb24oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gQlJFQUspIHJldHVybiBCUkVBSztcbiAgICAgIH0gcmV0dXJuO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICBpZiAoY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgYm91bmRGdW5jdGlvbiwgc3RlcC52YWx1ZSwgRU5UUklFUykgPT09IEJSRUFLKSByZXR1cm4gQlJFQUs7XG4gIH1cbn07XG5cbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSBmYWxzZTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLW9iamVjdFxudmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7XG5cbmlmIChbXS5rZXlzKSB7XG4gIGFycmF5SXRlcmF0b3IgPSBbXS5rZXlzKCk7XG4gIC8vIFNhZmFyaSA4IGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlO1xuICBlbHNlIHtcbiAgICBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSk7XG4gICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cbn1cblxuaWYgKEl0ZXJhdG9yUHJvdG90eXBlID09IHVuZGVmaW5lZCkgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbmlmICghSVNfUFVSRSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdXNlci1hZ2VudCcpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuLy8gTm9kZS5qcyAxMSBzaG93cyBFeHBlcmltZW50YWxXYXJuaW5nIG9uIGdldHRpbmcgYHF1ZXVlTWljcm90YXNrYFxudmFyIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIHF1ZXVlTWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcblxudmFyIGZsdXNoLCBoZWFkLCBsYXN0LCBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZTtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghcXVldWVNaWNyb3Rhc2spIHtcbiAgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKElTX05PREUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoTXV0YXRpb25PYnNlcnZlciAmJiAhLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWV1ZU1pY3JvdGFzayB8fCBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICBpZiAoIWhlYWQpIHtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoV2Vha01hcCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xuXG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcblxudmFyIG5hdGl2ZUFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhbmF0aXZlQXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBzeW1ib2wgPSBTeW1ib2woKTtcbiAgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtzeW1ib2xdID0gNztcbiAgYWxwaGFiZXQuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNocikgeyBCW2Nocl0gPSBjaHI7IH0pO1xuICByZXR1cm4gbmF0aXZlQXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cyhuYXRpdmVBc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IG9iamVjdEtleXMoUykuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogbmF0aXZlQXNzaWduO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgc2NyaXB0ID0gJ3NjcmlwdCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGpzID0gJ2phdmEnICsgc2NyaXB0ICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSBTdHJpbmcoanMpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgc2NyaXB0ICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnLycgKyBzY3JpcHQgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5oaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaSsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcblxudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZURlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xuXG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIXByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheUluY2x1ZGVzKGZhbHNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7XG5cbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCJ2YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3JyZWN0U2V0dGVyID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBjb3JyZWN0U2V0dGVyID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMoTywgcHJvdG8pO1xuICAgIGlmIChjb3JyZWN0U2V0dGVyKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSAhPT0gJ1tvYmplY3Qgel0nID8gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn0gOiB0ZXN0LnRvU3RyaW5nO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIFJlZmxlY3QgPSBnbG9iYWwuUmVmbGVjdDtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0ICYmIFJlZmxlY3Qub3duS2V5cyB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgVEVNUExBVEUgPSBTdHJpbmcobmF0aXZlRnVuY3Rpb25Ub1N0cmluZykuc3BsaXQoJ3RvU3RyaW5nJyk7XG5cbnNoYXJlZCgnaW5zcGVjdFNvdXJjZScsIGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gbmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKGl0KTtcbn0pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdW5zYWZlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy51bnNhZmUgOiBmYWxzZTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuZW51bWVyYWJsZSA6IGZhbHNlO1xuICB2YXIgbm9UYXJnZXRHZXQgPSBvcHRpb25zID8gISFvcHRpb25zLm5vVGFyZ2V0R2V0IDogZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnICYmICFoYXModmFsdWUsICduYW1lJykpIGhpZGUodmFsdWUsICduYW1lJywga2V5KTtcbiAgICBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSkuc291cmNlID0gVEVNUExBVEUuam9pbih0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8ga2V5IDogJycpO1xuICB9XG4gIGlmIChPID09PSBnbG9iYWwpIHtcbiAgICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgICBlbHNlIHNldEdsb2JhbChrZXksIHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXVuc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gIH0gZWxzZSBpZiAoIW5vVGFyZ2V0R2V0ICYmIE9ba2V5XSkge1xuICAgIHNpbXBsZSA9IHRydWU7XG4gIH1cbiAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7XG4gIGVsc2UgaGlkZShPLCBrZXksIHZhbHVlKTtcbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iLCIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBoaWRlKGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIEMgPSBnZXRCdWlsdEluKENPTlNUUlVDVE9SX05BTUUpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICBpZiAoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSkgZGVmaW5lUHJvcGVydHkoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgc2V0R2xvYmFsKFNIQVJFRCwge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMS4zJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IHRydWUgIC0+IFN0cmluZyNhdFxuLy8gQ09OVkVSVF9UT19TVFJJTkc6IGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgcG9zLCBDT05WRVJUX1RPX1NUUklORykge1xuICB2YXIgUyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoYXQpKTtcbiAgdmFyIHBvc2l0aW9uID0gdG9JbnRlZ2VyKHBvcyk7XG4gIHZhciBzaXplID0gUy5sZW5ndGg7XG4gIHZhciBmaXJzdCwgc2Vjb25kO1xuICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICBmaXJzdCA9IFMuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gIHJldHVybiBmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCBwb3NpdGlvbiArIDEgPT09IHNpemVcbiAgICB8fCAoc2Vjb25kID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uICsgMSkpIDwgMHhEQzAwIHx8IHNlY29uZCA+IDB4REZGRlxuICAgICAgPyBDT05WRVJUX1RPX1NUUklORyA/IFMuY2hhckF0KHBvc2l0aW9uKSA6IGZpcnN0XG4gICAgICA6IENPTlZFUlRfVE9fU1RSSU5HID8gUy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAyKSA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxudmFyIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIHBvc3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzICYmICFmYWlscyhwb3N0KSkge1xuICAgIGRlZmVyID0gcG9zdDtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsInZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYFRvSW50ZWdlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyBTdHJpbmcocHJvdG8pICsgJyBhcyBhIHByb3RvdHlwZScpO1xuICB9XG59O1xuIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZy5wcm90b3R5cGUuJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleFwiKTtcbiAgfSByZXR1cm4gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wnKTtcblxudmFyIFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgc3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIFN5bWJvbFtuYW1lXVxuICAgIHx8IChOQVRJVkVfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuIiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhcnJheU1ldGhvZHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kcycpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBpbnRlcm5hbEZpbmQgPSBhcnJheU1ldGhvZHMoNSk7XG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoRklORCBpbiBbXSkgQXJyYXkoMSlbRklORF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gaW50ZXJuYWxGaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkQpO1xuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBpbnRlcm5hbEluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyh0cnVlKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiBpbnRlcm5hbEluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZW50cmllc1xuLy8gYEFycmF5LnByb3RvdHlwZS5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudmFsdWVzXG4vLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4vLyBgQ3JlYXRlQXJyYXlJdGVyYXRvcmAgaW50ZXJuYWwgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDtcbiAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCsrO1xuICBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBpbmRleCwgZG9uZTogZmFsc2UgfTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiB7IHZhbHVlOiB0YXJnZXRbaW5kZXhdLCBkb25lOiBmYWxzZSB9O1xuICByZXR1cm4geyB2YWx1ZTogW2luZGV4LCB0YXJnZXRbaW5kZXhdXSwgZG9uZTogZmFsc2UgfTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY3JlYXRlbWFwcGVkYXJndW1lbnRzb2JqZWN0XG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuYXNzaWduICE9PSBhc3NpZ24gfSwge1xuICBhc3NpZ246IGFzc2lnblxufSk7XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nJyk7XG5cbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAodG9TdHJpbmcgIT09IE9iamVjdFByb3RvdHlwZS50b1N0cmluZykge1xuICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICd0b1N0cmluZycsIHRvU3RyaW5nLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcblxuLy8gYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lLWFsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciB0YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21pY3JvdGFzaycpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciAkZmV0Y2ggPSBnbG9iYWwuZmV0Y2g7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXI7XG5cbnZhciBGT1JDRUQgPSBpc0ZvcmNlZChQUk9NSVNFLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW1NQRUNJRVNdID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gIH07XG4gIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICEoKElTX05PREUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICYmICghSVNfUFVSRSB8fCBwcm9taXNlWydmaW5hbGx5J10pXG4gICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xKTtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBwcm9taXNlLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3QodGhpcywgc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLCB7XG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlYWN0aW9ucy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0ZSAhPSBQRU5ESU5HKSBub3RpZnkodGhpcywgc3RhdGUsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb21pc2UpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gYmluZChpbnRlcm5hbFJlc29sdmUsIHByb21pc2UsIHN0YXRlKTtcbiAgICB0aGlzLnJlamVjdCA9IGJpbmQoaW50ZXJuYWxSZWplY3QsIHByb21pc2UsIHN0YXRlKTtcbiAgfTtcbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgLy8gd3JhcCBmZXRjaCByZXN1bHRcbiAgaWYgKCFJU19QVVJFICYmIHR5cGVvZiAkZmV0Y2ggPT0gJ2Z1bmN0aW9uJykgJCh7IGdsb2JhbDogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBmZXRjaDogZnVuY3Rpb24gZmV0Y2goaW5wdXQpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShQcm9taXNlQ29uc3RydWN0b3IsICRmZXRjaC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cykpO1xuICAgIH1cbiAgfSk7XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5Qcm9taXNlV3JhcHBlciA9IHBhdGhbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gYFByb21pc2UucmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZWplY3RcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgY2FwYWJpbGl0eS5yZWplY3QuY2FsbCh1bmRlZmluZWQsIHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VEIH0sIHtcbiAgLy8gYFByb21pc2UucmVzb2x2ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoSVNfUFVSRSAmJiB0aGlzID09PSBQcm9taXNlV3JhcHBlciA/IFByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgLy8gYFByb21pc2UuYWxsYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2VcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICAkcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdmFsaWRhdGVBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtc3RyaW5nLW1ldGhvZC1hcmd1bWVudHMnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX52YWxpZGF0ZUFyZ3VtZW50cyh0aGlzLCBzZWFyY2hTdHJpbmcsICdpbmNsdWRlcycpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29kZVBvaW50QXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLWF0Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiBTdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY29kZVBvaW50QXQoc3RyaW5nLCBpbmRleCwgdHJ1ZSk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCJ2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG4vLyBgU3ltYm9sLml0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLml0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcblxudmFyICRBZ2dyZWdhdGVFcnJvciA9IGZ1bmN0aW9uIEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSkge1xuICB2YXIgdGhhdCA9IHRoaXM7XG4gIGlmICghKHRoYXQgaW5zdGFuY2VvZiAkQWdncmVnYXRlRXJyb3IpKSByZXR1cm4gbmV3ICRBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UpO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3IEVycm9yKG1lc3NhZ2UpLCBnZXRQcm90b3R5cGVPZih0aGF0KSk7XG4gIH1cbiAgdmFyIGVycm9yc0FycmF5ID0gW107XG4gIGl0ZXJhdGUoZXJyb3JzLCBlcnJvcnNBcnJheS5wdXNoLCBlcnJvcnNBcnJheSk7XG4gIHRoYXQuZXJyb3JzID0gZXJyb3JzQXJyYXk7XG4gIGlmIChtZXNzYWdlICE9PSB1bmRlZmluZWQpIGhpZGUodGhhdCwgJ21lc3NhZ2UnLCBTdHJpbmcobWVzc2FnZSkpO1xuICByZXR1cm4gdGhhdDtcbn07XG5cbiRBZ2dyZWdhdGVFcnJvci5wcm90b3R5cGUgPSBjcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDUsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuJCh7IGdsb2JhbDogdHJ1ZSB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG5cbi8vIGBQcm9taXNlLmFsbFNldHRsZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1hbGxTZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uOiBlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxudmFyIFBST01JU0VfQU5ZX0VSUk9SID0gJ05vIG9uZSBwcm9taXNlIHJlc29sdmVkJztcblxuLy8gYFByb21pc2UuYW55YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtYW55XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICBhbnk6IGZ1bmN0aW9uIGFueShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFGdW5jdGlvbihDLnJlc29sdmUpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICB2YXIgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5UmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZXJyb3JzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIHByb21pc2VSZXNvbHZlLmNhbGwoQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yc1tpbmRleF0gPSBlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgKGdldEJ1aWx0SW4oJ0FnZ3JlZ2F0ZUVycm9yJykpKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcblxuLy8gYFByb21pc2UudHJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUgfSwge1xuICAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAgIChyZXN1bHQuZXJyb3IgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbQ09MTEVDVElPTl9OQU1FXTtcbiAgdmFyIENvbGxlY3Rpb25Qcm90b3R5cGUgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZSkge1xuICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gQXJyYXlWYWx1ZXMpIHRyeSB7XG4gICAgICBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdID0gQXJyYXlWYWx1ZXM7XG4gICAgfVxuICAgIGlmICghQ29sbGVjdGlvblByb3RvdHlwZVtUT19TVFJJTkdfVEFHXSkgaGlkZShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIGlmIChET01JdGVyYWJsZXNbQ09MTEVDVElPTl9OQU1FXSkgZm9yICh2YXIgTUVUSE9EX05BTUUgaW4gQXJyYXlJdGVyYXRvck1ldGhvZHMpIHtcbiAgICAgIC8vIHNvbWUgQ2hyb21lIHZlcnNpb25zIGhhdmUgbm9uLWNvbmZpZ3VyYWJsZSBtZXRob2RzIG9uIERPTVRva2VuTGlzdFxuICAgICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdICE9PSBBcnJheUl0ZXJhdG9yTWV0aG9kc1tNRVRIT0RfTkFNRV0pIHRyeSB7XG4gICAgICAgIGhpZGUoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgVzNDIFNPRlRXQVJFIEFORCBET0NVTUVOVCBOT1RJQ0UgQU5EIExJQ0VOU0UuXG4gKlxuICogIGh0dHBzOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMTUvY29weXJpZ2h0LXNvZnR3YXJlLWFuZC1kb2N1bWVudFxuICpcbiAqL1xuKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBFeGl0IGVhcmx5IGlmIHdlJ3JlIG5vdCBydW5uaW5nIGluIGEgYnJvd3Nlci5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAnb2JqZWN0Jykge1xuICByZXR1cm47XG59XG5cbi8vIEV4aXQgZWFybHkgaWYgYWxsIEludGVyc2VjdGlvbk9ic2VydmVyIGFuZCBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5XG4vLyBmZWF0dXJlcyBhcmUgbmF0aXZlbHkgc3VwcG9ydGVkLlxuaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gd2luZG93ICYmXG4gICAgJ0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnknIGluIHdpbmRvdyAmJlxuICAgICdpbnRlcnNlY3Rpb25SYXRpbycgaW4gd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkucHJvdG90eXBlKSB7XG5cbiAgLy8gTWluaW1hbCBwb2x5ZmlsbCBmb3IgRWRnZSAxNSdzIGxhY2sgb2YgYGlzSW50ZXJzZWN0aW5nYFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvaXNzdWVzLzIxMVxuICBpZiAoISgnaXNJbnRlcnNlY3RpbmcnIGluIHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkucHJvdG90eXBlLFxuICAgICAgJ2lzSW50ZXJzZWN0aW5nJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc2VjdGlvblJhdGlvID4gMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZW1iZWRkaW5nIGZyYW1lIGVsZW1lbnQsIGlmIGFueS5cbiAqIEBwYXJhbSB7IURvY3VtZW50fSBkb2NcbiAqIEByZXR1cm4geyFFbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXRGcmFtZUVsZW1lbnQoZG9jKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyAmJiBkb2MuZGVmYXVsdFZpZXcuZnJhbWVFbGVtZW50IHx8IG51bGw7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZ25vcmUgdGhlIGVycm9yLlxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgZG9jdW1lbnQuXG4gKi9cbnZhciBkb2N1bWVudCA9IChmdW5jdGlvbihzdGFydERvYykge1xuICB2YXIgZG9jID0gc3RhcnREb2M7XG4gIHZhciBmcmFtZSA9IGdldEZyYW1lRWxlbWVudChkb2MpO1xuICB3aGlsZSAoZnJhbWUpIHtcbiAgICBkb2MgPSBmcmFtZS5vd25lckRvY3VtZW50O1xuICAgIGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGRvYyk7XG4gIH1cbiAgcmV0dXJuIGRvYztcbn0pKHdpbmRvdy5kb2N1bWVudCk7XG5cbi8qKlxuICogQW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuIFRoaXMgcmVnaXN0cnkgZXhpc3RzIHRvIGhvbGQgYSBzdHJvbmdcbiAqIHJlZmVyZW5jZSB0byBJbnRlcnNlY3Rpb25PYnNlcnZlciBpbnN0YW5jZXMgY3VycmVudGx5IG9ic2VydmluZyBhIHRhcmdldFxuICogZWxlbWVudC4gV2l0aG91dCB0aGlzIHJlZ2lzdHJ5LCBpbnN0YW5jZXMgd2l0aG91dCBhbm90aGVyIHJlZmVyZW5jZSBtYXkgYmVcbiAqIGdhcmJhZ2UgY29sbGVjdGVkLlxuICovXG52YXIgcmVnaXN0cnkgPSBbXTtcblxuLyoqXG4gKiBUaGUgc2lnbmFsIHVwZGF0ZXIgZm9yIGNyb3NzLW9yaWdpbiBpbnRlcnNlY3Rpb24uIFdoZW4gbm90IG51bGwsIGl0IG1lYW5zXG4gKiB0aGF0IHRoZSBwb2x5ZmlsbCBpcyBjb25maWd1cmVkIHRvIHdvcmsgaW4gYSBjcm9zcy1vcmlnaW4gbW9kZS5cbiAqIEB0eXBlIHtmdW5jdGlvbihET01SZWN0fENsaWVudFJlY3QsIERPTVJlY3R8Q2xpZW50UmVjdCl9XG4gKi9cbnZhciBjcm9zc09yaWdpblVwZGF0ZXIgPSBudWxsO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGNyb3NzLW9yaWdpbiBpbnRlcnNlY3Rpb24uIE9ubHkgdXNlZCBpbiB0aGUgY3Jvc3Mtb3JpZ2luIG1vZGUuXG4gKiBAdHlwZSB7RE9NUmVjdHxDbGllbnRSZWN0fVxuICovXG52YXIgY3Jvc3NPcmlnaW5SZWN0ID0gbnVsbDtcblxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IGNvbnN0cnVjdG9yLlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ludGVyc2VjdGlvbk9ic2VydmVyLyNpbnRlcnNlY3Rpb24tb2JzZXJ2ZXItZW50cnlcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRyeSBBIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgcHJvcGVydGllcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KGVudHJ5KSB7XG4gIHRoaXMudGltZSA9IGVudHJ5LnRpbWU7XG4gIHRoaXMudGFyZ2V0ID0gZW50cnkudGFyZ2V0O1xuICB0aGlzLnJvb3RCb3VuZHMgPSBlbnN1cmVET01SZWN0KGVudHJ5LnJvb3RCb3VuZHMpO1xuICB0aGlzLmJvdW5kaW5nQ2xpZW50UmVjdCA9IGVuc3VyZURPTVJlY3QoZW50cnkuYm91bmRpbmdDbGllbnRSZWN0KTtcbiAgdGhpcy5pbnRlcnNlY3Rpb25SZWN0ID0gZW5zdXJlRE9NUmVjdChlbnRyeS5pbnRlcnNlY3Rpb25SZWN0IHx8IGdldEVtcHR5UmVjdCgpKTtcbiAgdGhpcy5pc0ludGVyc2VjdGluZyA9ICEhZW50cnkuaW50ZXJzZWN0aW9uUmVjdDtcblxuICAvLyBDYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIHZhciB0YXJnZXRSZWN0ID0gdGhpcy5ib3VuZGluZ0NsaWVudFJlY3Q7XG4gIHZhciB0YXJnZXRBcmVhID0gdGFyZ2V0UmVjdC53aWR0aCAqIHRhcmdldFJlY3QuaGVpZ2h0O1xuICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHRoaXMuaW50ZXJzZWN0aW9uUmVjdDtcbiAgdmFyIGludGVyc2VjdGlvbkFyZWEgPSBpbnRlcnNlY3Rpb25SZWN0LndpZHRoICogaW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQ7XG5cbiAgLy8gU2V0cyBpbnRlcnNlY3Rpb24gcmF0aW8uXG4gIGlmICh0YXJnZXRBcmVhKSB7XG4gICAgLy8gUm91bmQgdGhlIGludGVyc2VjdGlvbiByYXRpbyB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBtYXRoIGlzc3VlczpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8zMjRcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gTnVtYmVyKChpbnRlcnNlY3Rpb25BcmVhIC8gdGFyZ2V0QXJlYSkudG9GaXhlZCg0KSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYXJlYSBpcyB6ZXJvIGFuZCBpcyBpbnRlcnNlY3RpbmcsIHNldHMgdG8gMSwgb3RoZXJ3aXNlIHRvIDBcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gdGhpcy5pc0ludGVyc2VjdGluZyA/IDEgOiAwO1xuICB9XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1pbnRlcmZhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGludGVyc2VjdGlvblxuICogICAgIGNoYW5nZXMgaGF2ZSBxdWV1ZWQuIFRoZSBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBpZiB0aGUgcXVldWUgaGFzXG4gKiAgICAgYmVlbiBlbXB0aWVkIGJ5IGNhbGxpbmcgdGhlIGB0YWtlUmVjb3Jkc2AgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdF9vcHRpb25zKSB7XG5cbiAgdmFyIG9wdGlvbnMgPSBvcHRfb3B0aW9ucyB8fCB7fTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucm9vdCAmJiBvcHRpb25zLnJvb3Qubm9kZVR5cGUgIT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCBtdXN0IGJlIGFuIEVsZW1lbnQnKTtcbiAgfVxuXG4gIC8vIEJpbmRzIGFuZCB0aHJvdHRsZXMgYHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9uc2AuXG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyA9IHRocm90dGxlKFxuICAgICAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLmJpbmQodGhpcyksIHRoaXMuVEhST1RUTEVfVElNRU9VVCk7XG5cbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzLlxuICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICB0aGlzLl9yb290TWFyZ2luVmFsdWVzID0gdGhpcy5fcGFyc2VSb290TWFyZ2luKG9wdGlvbnMucm9vdE1hcmdpbik7XG5cbiAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gIHRoaXMudGhyZXNob2xkcyA9IHRoaXMuX2luaXRUaHJlc2hvbGRzKG9wdGlvbnMudGhyZXNob2xkKTtcbiAgdGhpcy5yb290ID0gb3B0aW9ucy5yb290IHx8IG51bGw7XG4gIHRoaXMucm9vdE1hcmdpbiA9IHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMubWFwKGZ1bmN0aW9uKG1hcmdpbikge1xuICAgIHJldHVybiBtYXJnaW4udmFsdWUgKyBtYXJnaW4udW5pdDtcbiAgfSkuam9pbignICcpO1xuXG4gIC8qKiBAcHJpdmF0ZSBAY29uc3QgeyFBcnJheTwhRG9jdW1lbnQ+fSAqL1xuICB0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzID0gW107XG4gIC8qKiBAcHJpdmF0ZSBAY29uc3QgeyFBcnJheTxmdW5jdGlvbigpPn0gKi9cbiAgdGhpcy5fbW9uaXRvcmluZ1Vuc3Vic2NyaWJlcyA9IFtdO1xufVxuXG5cbi8qKlxuICogVGhlIG1pbmltdW0gaW50ZXJ2YWwgd2l0aGluIHdoaWNoIHRoZSBkb2N1bWVudCB3aWxsIGJlIGNoZWNrZWQgZm9yXG4gKiBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlRIUk9UVExFX1RJTUVPVVQgPSAxMDA7XG5cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGluIHdoaWNoIHRoZSBwb2x5ZmlsbCBwb2xscyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiB0aGlzIGNhbiBiZSB1cGRhdGVkIG9uIGEgcGVyIGluc3RhbmNlIGJhc2lzIGFuZCBtdXN0IGJlIHNldCBwcmlvciB0b1xuICogY2FsbGluZyBgb2JzZXJ2ZWAgb24gdGhlIGZpcnN0IHRhcmdldC5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlBPTExfSU5URVJWQUwgPSBudWxsO1xuXG4vKipcbiAqIFVzZSBhIG11dGF0aW9uIG9ic2VydmVyIG9uIHRoZSByb290IGVsZW1lbnRcbiAqIHRvIGRldGVjdCBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlVTRV9NVVRBVElPTl9PQlNFUlZFUiA9IHRydWU7XG5cblxuLyoqXG4gKiBTZXRzIHVwIHRoZSBwb2x5ZmlsbCBpbiB0aGUgY3Jvc3Mtb3JpZ2luIG1vZGUuIFRoZSByZXN1bHQgaXMgdGhlXG4gKiB1cGRhdGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0d28gYXJndW1lbnRzOiBgYm91bmRpbmdDbGllbnRSZWN0YCBhbmRcbiAqIGBpbnRlcnNlY3Rpb25SZWN0YCAtIGp1c3QgYXMgdGhlc2UgZmllbGRzIHdvdWxkIGJlIGF2YWlsYWJsZSB0byB0aGVcbiAqIHBhcmVudCB2aWEgYEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlgLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWRcbiAqIGVhY2ggdGltZSB0aGUgaWZyYW1lIHJlY2VpdmVzIGludGVyc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXJlbnRcbiAqIHdpbmRvdywgZS5nLiB2aWEgbWVzc2FnaW5nLlxuICogQHJldHVybiB7ZnVuY3Rpb24oRE9NUmVjdHxDbGllbnRSZWN0LCBET01SZWN0fENsaWVudFJlY3QpfVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5fc2V0dXBDcm9zc09yaWdpblVwZGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFjcm9zc09yaWdpblVwZGF0ZXIpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R8Q2xpZW50UmVjdH0gYm91bmRpbmdDbGllbnRSZWN0XG4gICAgICogQHBhcmFtIHtET01SZWN0fENsaWVudFJlY3R9IGludGVyc2VjdGlvblJlY3RcbiAgICAgKi9cbiAgICBjcm9zc09yaWdpblVwZGF0ZXIgPSBmdW5jdGlvbihib3VuZGluZ0NsaWVudFJlY3QsIGludGVyc2VjdGlvblJlY3QpIHtcbiAgICAgIGlmICghYm91bmRpbmdDbGllbnRSZWN0IHx8ICFpbnRlcnNlY3Rpb25SZWN0KSB7XG4gICAgICAgIGNyb3NzT3JpZ2luUmVjdCA9IGdldEVtcHR5UmVjdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Jvc3NPcmlnaW5SZWN0ID0gY29udmVydEZyb21QYXJlbnRSZWN0KGJvdW5kaW5nQ2xpZW50UmVjdCwgaW50ZXJzZWN0aW9uUmVjdCk7XG4gICAgICB9XG4gICAgICByZWdpc3RyeS5mb3JFYWNoKGZ1bmN0aW9uKG9ic2VydmVyKSB7XG4gICAgICAgIG9ic2VydmVyLl9jaGVja0ZvckludGVyc2VjdGlvbnMoKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNyb3NzT3JpZ2luVXBkYXRlcjtcbn07XG5cblxuLyoqXG4gKiBSZXNldHMgdGhlIGNyb3NzLW9yaWdpbiBtb2RlLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5fcmVzZXRDcm9zc09yaWdpblVwZGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgY3Jvc3NPcmlnaW5VcGRhdGVyID0gbnVsbDtcbiAgY3Jvc3NPcmlnaW5SZWN0ID0gbnVsbDtcbn07XG5cblxuLyoqXG4gKiBTdGFydHMgb2JzZXJ2aW5nIGEgdGFyZ2V0IGVsZW1lbnQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGJhc2VkIG9uXG4gKiB0aGUgdGhyZXNob2xkcyB2YWx1ZXMuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgdG8gb2JzZXJ2ZS5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgdmFyIGlzVGFyZ2V0QWxyZWFkeU9ic2VydmVkID0gdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgPT0gdGFyZ2V0O1xuICB9KTtcblxuICBpZiAoaXNUYXJnZXRBbHJlYWR5T2JzZXJ2ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBFbGVtZW50Jyk7XG4gIH1cblxuICB0aGlzLl9yZWdpc3Rlckluc3RhbmNlKCk7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5wdXNoKHtlbGVtZW50OiB0YXJnZXQsIGVudHJ5OiBudWxsfSk7XG4gIHRoaXMuX21vbml0b3JJbnRlcnNlY3Rpb25zKHRhcmdldC5vd25lckRvY3VtZW50KTtcbiAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zKCk7XG59O1xuXG5cbi8qKlxuICogU3RvcHMgb2JzZXJ2aW5nIGEgdGFyZ2V0IGVsZW1lbnQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgVGhlIERPTSBlbGVtZW50IHRvIG9ic2VydmUuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS51bm9ic2VydmUgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzID1cbiAgICAgIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS5lbGVtZW50ICE9IHRhcmdldDtcbiAgICAgIH0pO1xuICB0aGlzLl91bm1vbml0b3JJbnRlcnNlY3Rpb25zKHRhcmdldC5vd25lckRvY3VtZW50KTtcbiAgaWYgKHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5sZW5ndGggPT0gMCkge1xuICAgIHRoaXMuX3VucmVnaXN0ZXJJbnN0YW5jZSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgb2JzZXJ2aW5nIGFsbCB0YXJnZXQgZWxlbWVudHMgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fdW5tb25pdG9yQWxsSW50ZXJzZWN0aW9ucygpO1xuICB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFueSBxdWV1ZSBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVwb3J0ZWQgdG8gdGhlXG4gKiBjYWxsYmFjayBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICogY2FsbGJhY2sgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBtb3N0IHVwLXRvLWRhdGUgaW50ZXJzZWN0aW9uIGluZm9ybWF0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjdXJyZW50bHkgcXVldWVkIGVudHJpZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVjb3JkcyA9IHRoaXMuX3F1ZXVlZEVudHJpZXMuc2xpY2UoKTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICByZXR1cm4gcmVjb3Jkcztcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZnJvbSB0aGUgdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcbiAqIHJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2YgdW5pcXVlIHRocmVzaG9sZCB2YWx1ZXMuIElmIGEgdmFsdWUgaXMgbm90XG4gKiBiZXR3ZWVuIDAgYW5kIDEgYW5kIGVycm9yIGlzIHRocm93bi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fG51bWJlcj19IG9wdF90aHJlc2hvbGQgQW4gb3B0aW9uYWwgdGhyZXNob2xkIHZhbHVlIG9yXG4gKiAgICAgYSBsaXN0IG9mIHRocmVzaG9sZCB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gWzBdLlxuICogQHJldHVybiB7QXJyYXl9IEEgc29ydGVkIGxpc3Qgb2YgdW5pcXVlIGFuZCB2YWxpZCB0aHJlc2hvbGQgdmFsdWVzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2luaXRUaHJlc2hvbGRzID0gZnVuY3Rpb24ob3B0X3RocmVzaG9sZCkge1xuICB2YXIgdGhyZXNob2xkID0gb3B0X3RocmVzaG9sZCB8fCBbMF07XG4gIGlmICghQXJyYXkuaXNBcnJheSh0aHJlc2hvbGQpKSB0aHJlc2hvbGQgPSBbdGhyZXNob2xkXTtcblxuICByZXR1cm4gdGhyZXNob2xkLnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24odCwgaSwgYSkge1xuICAgIGlmICh0eXBlb2YgdCAhPSAnbnVtYmVyJyB8fCBpc05hTih0KSB8fCB0IDwgMCB8fCB0ID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlbHknKTtcbiAgICB9XG4gICAgcmV0dXJuIHQgIT09IGFbaSAtIDFdO1xuICB9KTtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSByb290TWFyZ2luIHZhbHVlIGZyb20gdGhlIHVzZXIgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBmb3VyIG1hcmdpbiB2YWx1ZXMgYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmdcbiAqIHRoZSB2YWx1ZSBhbmQgdW5pdCBwcm9wZXJ0aWVzLiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBhcmUgbm90IHByb3Blcmx5XG4gKiBmb3JtYXR0ZWQgb3IgdXNlIGEgdW5pdCBvdGhlciB0aGFuIHB4IG9yICUsIGFuZCBlcnJvciBpcyB0aHJvd24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfcm9vdE1hcmdpbiBBbiBvcHRpb25hbCByb290TWFyZ2luIHZhbHVlLFxuICogICAgIGRlZmF1bHRpbmcgdG8gJzBweCcuXG4gKiBAcmV0dXJuIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBtYXJnaW4gb2JqZWN0cyB3aXRoIHRoZSBrZXlzXG4gKiAgICAgdmFsdWUgYW5kIHVuaXQuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcGFyc2VSb290TWFyZ2luID0gZnVuY3Rpb24ob3B0X3Jvb3RNYXJnaW4pIHtcbiAgdmFyIG1hcmdpblN0cmluZyA9IG9wdF9yb290TWFyZ2luIHx8ICcwcHgnO1xuICB2YXIgbWFyZ2lucyA9IG1hcmdpblN0cmluZy5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihtYXJnaW4pIHtcbiAgICB2YXIgcGFydHMgPSAvXigtP1xcZCpcXC4/XFxkKykocHh8JSkkLy5leGVjKG1hcmdpbik7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290TWFyZ2luIG11c3QgYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciBwZXJjZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHBhcnNlRmxvYXQocGFydHNbMV0pLCB1bml0OiBwYXJ0c1syXX07XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXMgc2hvcnRoYW5kLlxuICBtYXJnaW5zWzFdID0gbWFyZ2luc1sxXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzJdID0gbWFyZ2luc1syXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzNdID0gbWFyZ2luc1szXSB8fCBtYXJnaW5zWzFdO1xuXG4gIHJldHVybiBtYXJnaW5zO1xufTtcblxuXG4vKipcbiAqIFN0YXJ0cyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBpZiB0aGUgcG9sbGluZyBpcyBub3QgYWxyZWFkeVxuICogaGFwcGVuaW5nLCBhbmQgaWYgdGhlIHBhZ2UncyB2aXNpYmlsaXR5IHN0YXRlIGlzIHZpc2libGUuXG4gKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX21vbml0b3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oZG9jKSB7XG4gIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gIGlmICghd2luKSB7XG4gICAgLy8gQWxyZWFkeSBkZXN0cm95ZWQuXG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzLmluZGV4T2YoZG9jKSAhPSAtMSkge1xuICAgIC8vIEFscmVhZHkgbW9uaXRvcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQcml2YXRlIHN0YXRlIGZvciBtb25pdG9yaW5nLlxuICB2YXIgY2FsbGJhY2sgPSB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnM7XG4gIHZhciBtb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsO1xuICB2YXIgZG9tT2JzZXJ2ZXIgPSBudWxsO1xuXG4gIC8vIElmIGEgcG9sbCBpbnRlcnZhbCBpcyBzZXQsIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgbGlzdGVuaW5nIHRvXG4gIC8vIHJlc2l6ZSBhbmQgc2Nyb2xsIGV2ZW50cyBvciBET00gbXV0YXRpb25zLlxuICBpZiAodGhpcy5QT0xMX0lOVEVSVkFMKSB7XG4gICAgbW9uaXRvcmluZ0ludGVydmFsID0gd2luLnNldEludGVydmFsKGNhbGxiYWNrLCB0aGlzLlBPTExfSU5URVJWQUwpO1xuICB9IGVsc2Uge1xuICAgIGFkZEV2ZW50KHdpbiwgJ3Jlc2l6ZScsIGNhbGxiYWNrLCB0cnVlKTtcbiAgICBhZGRFdmVudChkb2MsICdzY3JvbGwnLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgaWYgKHRoaXMuVVNFX01VVEFUSU9OX09CU0VSVkVSICYmICdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW4pIHtcbiAgICAgIGRvbU9ic2VydmVyID0gbmV3IHdpbi5NdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIGRvbU9ic2VydmVyLm9ic2VydmUoZG9jLCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fbW9uaXRvcmluZ0RvY3VtZW50cy5wdXNoKGRvYyk7XG4gIHRoaXMuX21vbml0b3JpbmdVbnN1YnNjcmliZXMucHVzaChmdW5jdGlvbigpIHtcbiAgICAvLyBHZXQgdGhlIHdpbmRvdyBvYmplY3QgYWdhaW4uIFdoZW4gYSBmcmllbmRseSBpZnJhbWUgaXMgZGVzdHJveWVkLCBpdFxuICAgIC8vIHdpbGwgYmUgbnVsbC5cbiAgICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuXG4gICAgaWYgKHdpbikge1xuICAgICAgaWYgKG1vbml0b3JpbmdJbnRlcnZhbCkge1xuICAgICAgICB3aW4uY2xlYXJJbnRlcnZhbChtb25pdG9yaW5nSW50ZXJ2YWwpO1xuICAgICAgfVxuICAgICAgcmVtb3ZlRXZlbnQod2luLCAncmVzaXplJywgY2FsbGJhY2ssIHRydWUpO1xuICAgIH1cblxuICAgIHJlbW92ZUV2ZW50KGRvYywgJ3Njcm9sbCcsIGNhbGxiYWNrLCB0cnVlKTtcbiAgICBpZiAoZG9tT2JzZXJ2ZXIpIHtcbiAgICAgIGRvbU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFsc28gbW9uaXRvciB0aGUgcGFyZW50LlxuICBpZiAoZG9jICE9ICh0aGlzLnJvb3QgJiYgdGhpcy5yb290Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpKSB7XG4gICAgdmFyIGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGRvYyk7XG4gICAgaWYgKGZyYW1lKSB7XG4gICAgICB0aGlzLl9tb25pdG9ySW50ZXJzZWN0aW9ucyhmcmFtZS5vd25lckRvY3VtZW50KTtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTdG9wcyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIEBwYXJhbSB7IURvY3VtZW50fSBkb2NcbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucyA9IGZ1bmN0aW9uKGRvYykge1xuICB2YXIgaW5kZXggPSB0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzLmluZGV4T2YoZG9jKTtcbiAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHJvb3REb2MgPSAodGhpcy5yb290ICYmIHRoaXMucm9vdC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50KTtcblxuICAvLyBDaGVjayBpZiBhbnkgZGVwZW5kZW50IHRhcmdldHMgYXJlIHN0aWxsIHJlbWFpbmluZy5cbiAgdmFyIGhhc0RlcGVuZGVudFRhcmdldHMgPVxuICAgICAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgaXRlbURvYyA9IGl0ZW0uZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAvLyBUYXJnZXQgaXMgaW4gdGhpcyBjb250ZXh0LlxuICAgICAgICBpZiAoaXRlbURvYyA9PSBkb2MpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUYXJnZXQgaXMgbmVzdGVkIGluIHRoaXMgY29udGV4dC5cbiAgICAgICAgd2hpbGUgKGl0ZW1Eb2MgJiYgaXRlbURvYyAhPSByb290RG9jKSB7XG4gICAgICAgICAgdmFyIGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGl0ZW1Eb2MpO1xuICAgICAgICAgIGl0ZW1Eb2MgPSBmcmFtZSAmJiBmcmFtZS5vd25lckRvY3VtZW50O1xuICAgICAgICAgIGlmIChpdGVtRG9jID09IGRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICBpZiAoaGFzRGVwZW5kZW50VGFyZ2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVuc3Vic2NyaWJlLlxuICB2YXIgdW5zdWJzY3JpYmUgPSB0aGlzLl9tb25pdG9yaW5nVW5zdWJzY3JpYmVzW2luZGV4XTtcbiAgdGhpcy5fbW9uaXRvcmluZ0RvY3VtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB0aGlzLl9tb25pdG9yaW5nVW5zdWJzY3JpYmVzLnNwbGljZShpbmRleCwgMSk7XG4gIHVuc3Vic2NyaWJlKCk7XG5cbiAgLy8gQWxzbyB1bm1vbml0b3IgdGhlIHBhcmVudC5cbiAgaWYgKGRvYyAhPSByb290RG9jKSB7XG4gICAgdmFyIGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGRvYyk7XG4gICAgaWYgKGZyYW1lKSB7XG4gICAgICB0aGlzLl91bm1vbml0b3JJbnRlcnNlY3Rpb25zKGZyYW1lLm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIFN0b3BzIHBvbGxpbmcgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICogQHBhcmFtIHshRG9jdW1lbnR9IGRvY1xuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl91bm1vbml0b3JBbGxJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oKSB7XG4gIHZhciB1bnN1YnNjcmliZXMgPSB0aGlzLl9tb25pdG9yaW5nVW5zdWJzY3JpYmVzLnNsaWNlKDApO1xuICB0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzLmxlbmd0aCA9IDA7XG4gIHRoaXMuX21vbml0b3JpbmdVbnN1YnNjcmliZXMubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bnN1YnNjcmliZXMubGVuZ3RoOyBpKyspIHtcbiAgICB1bnN1YnNjcmliZXNbaV0oKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIFNjYW5zIGVhY2ggb2JzZXJ2YXRpb24gdGFyZ2V0IGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBhbmQgYWRkcyB0aGVtXG4gKiB0byB0aGUgaW50ZXJuYWwgZW50cmllcyBxdWV1ZS4gSWYgbmV3IGVudHJpZXMgYXJlIGZvdW5kLCBpdFxuICogc2NoZWR1bGVzIHRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9jaGVja0ZvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLnJvb3QgJiYgY3Jvc3NPcmlnaW5VcGRhdGVyICYmICFjcm9zc09yaWdpblJlY3QpIHtcbiAgICAvLyBDcm9zcyBvcmlnaW4gbW9uaXRvcmluZywgYnV0IG5vIGluaXRpYWwgZGF0YSBhdmFpbGFibGUgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciByb290SXNJbkRvbSA9IHRoaXMuX3Jvb3RJc0luRG9tKCk7XG4gIHZhciByb290UmVjdCA9IHJvb3RJc0luRG9tID8gdGhpcy5fZ2V0Um9vdFJlY3QoKSA6IGdldEVtcHR5UmVjdCgpO1xuXG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB2YXIgdGFyZ2V0ID0gaXRlbS5lbGVtZW50O1xuICAgIHZhciB0YXJnZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRhcmdldCk7XG4gICAgdmFyIHJvb3RDb250YWluc1RhcmdldCA9IHRoaXMuX3Jvb3RDb250YWluc1RhcmdldCh0YXJnZXQpO1xuICAgIHZhciBvbGRFbnRyeSA9IGl0ZW0uZW50cnk7XG4gICAgdmFyIGludGVyc2VjdGlvblJlY3QgPSByb290SXNJbkRvbSAmJiByb290Q29udGFpbnNUYXJnZXQgJiZcbiAgICAgICAgdGhpcy5fY29tcHV0ZVRhcmdldEFuZFJvb3RJbnRlcnNlY3Rpb24odGFyZ2V0LCB0YXJnZXRSZWN0LCByb290UmVjdCk7XG5cbiAgICB2YXIgbmV3RW50cnkgPSBpdGVtLmVudHJ5ID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkoe1xuICAgICAgdGltZTogbm93KCksXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIGJvdW5kaW5nQ2xpZW50UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgIHJvb3RCb3VuZHM6IGNyb3NzT3JpZ2luVXBkYXRlciAmJiAhdGhpcy5yb290ID8gbnVsbCA6IHJvb3RSZWN0LFxuICAgICAgaW50ZXJzZWN0aW9uUmVjdDogaW50ZXJzZWN0aW9uUmVjdFxuICAgIH0pO1xuXG4gICAgaWYgKCFvbGRFbnRyeSkge1xuICAgICAgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICB9IGVsc2UgaWYgKHJvb3RJc0luRG9tICYmIHJvb3RDb250YWluc1RhcmdldCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBlbnRyeSBpbnRlcnNlY3Rpb24gcmF0aW8gaGFzIGNyb3NzZWQgYW55IG9mIHRoZVxuICAgICAgLy8gdGhyZXNob2xkcywgYWRkIGEgbmV3IGVudHJ5LlxuICAgICAgaWYgKHRoaXMuX2hhc0Nyb3NzZWRUaHJlc2hvbGQob2xkRW50cnksIG5ld0VudHJ5KSkge1xuICAgICAgICB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobmV3RW50cnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgcm9vdCBpcyBub3QgaW4gdGhlIERPTSBvciB0YXJnZXQgaXMgbm90IGNvbnRhaW5lZCB3aXRoaW5cbiAgICAgIC8vIHJvb3QgYnV0IHRoZSBwcmV2aW91cyBlbnRyeSBmb3IgdGhpcyB0YXJnZXQgaGFkIGFuIGludGVyc2VjdGlvbixcbiAgICAgIC8vIGFkZCBhIG5ldyByZWNvcmQgaW5kaWNhdGluZyByZW1vdmFsLlxuICAgICAgaWYgKG9sZEVudHJ5ICYmIG9sZEVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZEVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICBpZiAodGhpcy5fcXVldWVkRW50cmllcy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFjayh0aGlzLnRha2VSZWNvcmRzKCksIHRoaXMpO1xuICB9XG59O1xuXG5cbi8qKlxuICogQWNjZXB0cyBhIHRhcmdldCBhbmQgcm9vdCByZWN0IGNvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGVuXG4gKiBmb2xsb3dpbmcgdGhlIGFsZ29yaXRobSBpbiB0aGUgc3BlYy5cbiAqIFRPRE8ocGhpbGlwd2FsdG9uKTogYXQgdGhpcyB0aW1lIGNsaXAtcGF0aCBpcyBub3QgY29uc2lkZXJlZC5cbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9JbnRlcnNlY3Rpb25PYnNlcnZlci8jY2FsY3VsYXRlLWludGVyc2VjdGlvbi1yZWN0LWFsZ29cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSB0YXJnZXQgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRSZWN0IFRoZSBib3VuZGluZyByZWN0IG9mIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0ge09iamVjdH0gcm9vdFJlY3QgVGhlIGJvdW5kaW5nIHJlY3Qgb2YgdGhlIHJvb3QgYWZ0ZXIgYmVpbmdcbiAqICAgICBleHBhbmRlZCBieSB0aGUgcm9vdE1hcmdpbiB2YWx1ZS5cbiAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBmaW5hbCBpbnRlcnNlY3Rpb24gcmVjdCBvYmplY3Qgb3IgdW5kZWZpbmVkIGlmIG5vXG4gKiAgICAgaW50ZXJzZWN0aW9uIGlzIGZvdW5kLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9jb21wdXRlVGFyZ2V0QW5kUm9vdEludGVyc2VjdGlvbiA9XG4gICAgZnVuY3Rpb24odGFyZ2V0LCB0YXJnZXRSZWN0LCByb290UmVjdCkge1xuICAvLyBJZiB0aGUgZWxlbWVudCBpc24ndCBkaXNwbGF5ZWQsIGFuIGludGVyc2VjdGlvbiBjYW4ndCBoYXBwZW4uXG4gIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmRpc3BsYXkgPT0gJ25vbmUnKSByZXR1cm47XG5cbiAgdmFyIGludGVyc2VjdGlvblJlY3QgPSB0YXJnZXRSZWN0O1xuICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSh0YXJnZXQpO1xuICB2YXIgYXRSb290ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCFhdFJvb3QgJiYgcGFyZW50KSB7XG4gICAgdmFyIHBhcmVudFJlY3QgPSBudWxsO1xuICAgIHZhciBwYXJlbnRDb21wdXRlZFN0eWxlID0gcGFyZW50Lm5vZGVUeXBlID09IDEgP1xuICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpIDoge307XG5cbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzbid0IGRpc3BsYXllZCwgYW4gaW50ZXJzZWN0aW9uIGNhbid0IGhhcHBlbi5cbiAgICBpZiAocGFyZW50Q29tcHV0ZWRTdHlsZS5kaXNwbGF5ID09ICdub25lJykgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAocGFyZW50ID09IHRoaXMucm9vdCB8fCBwYXJlbnQubm9kZVR5cGUgPT0gLyogRE9DVU1FTlQgKi8gOSkge1xuICAgICAgYXRSb290ID0gdHJ1ZTtcbiAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy5yb290IHx8IHBhcmVudCA9PSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoY3Jvc3NPcmlnaW5VcGRhdGVyICYmICF0aGlzLnJvb3QpIHtcbiAgICAgICAgICBpZiAoIWNyb3NzT3JpZ2luUmVjdCB8fFxuICAgICAgICAgICAgICBjcm9zc09yaWdpblJlY3Qud2lkdGggPT0gMCAmJiBjcm9zc09yaWdpblJlY3QuaGVpZ2h0ID09IDApIHtcbiAgICAgICAgICAgIC8vIEEgMC1zaXplIGNyb3NzLW9yaWdpbiBpbnRlcnNlY3Rpb24gbWVhbnMgbm8taW50ZXJzZWN0aW9uLlxuICAgICAgICAgICAgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHBhcmVudFJlY3QgPSBudWxsO1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmVjdCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudFJlY3QgPSBjcm9zc09yaWdpblJlY3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudFJlY3QgPSByb290UmVjdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGZyYW1lIHRoYXQgY2FuIGJlIG5hdmlnYXRlZCB0by5cbiAgICAgICAgdmFyIGZyYW1lID0gZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICB2YXIgZnJhbWVSZWN0ID0gZnJhbWUgJiYgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGZyYW1lKTtcbiAgICAgICAgdmFyIGZyYW1lSW50ZXJzZWN0ID1cbiAgICAgICAgICAgIGZyYW1lICYmXG4gICAgICAgICAgICB0aGlzLl9jb21wdXRlVGFyZ2V0QW5kUm9vdEludGVyc2VjdGlvbihmcmFtZSwgZnJhbWVSZWN0LCByb290UmVjdCk7XG4gICAgICAgIGlmIChmcmFtZVJlY3QgJiYgZnJhbWVJbnRlcnNlY3QpIHtcbiAgICAgICAgICBwYXJlbnQgPSBmcmFtZTtcbiAgICAgICAgICBwYXJlbnRSZWN0ID0gY29udmVydEZyb21QYXJlbnRSZWN0KGZyYW1lUmVjdCwgZnJhbWVJbnRlcnNlY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgaW50ZXJzZWN0aW9uUmVjdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgbm9uLXZpc2libGUgb3ZlcmZsb3csIGFuZCBpdCdzIG5vdCB0aGUgPGJvZHk+XG4gICAgICAvLyBvciA8aHRtbD4gZWxlbWVudCwgdXBkYXRlIHRoZSBpbnRlcnNlY3Rpb24gcmVjdC5cbiAgICAgIC8vIE5vdGU6IDxib2R5PiBhbmQgPGh0bWw+IGNhbm5vdCBiZSBjbGlwcGVkIHRvIGEgcmVjdCB0aGF0J3Mgbm90IGFsc29cbiAgICAgIC8vIHRoZSBkb2N1bWVudCByZWN0LCBzbyBubyBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgaW50ZXJzZWN0aW9uLlxuICAgICAgdmFyIGRvYyA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICAgICAgaWYgKHBhcmVudCAhPSBkb2MuYm9keSAmJlxuICAgICAgICAgIHBhcmVudCAhPSBkb2MuZG9jdW1lbnRFbGVtZW50ICYmXG4gICAgICAgICAgcGFyZW50Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPSAndmlzaWJsZScpIHtcbiAgICAgICAgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBvZiB0aGUgYWJvdmUgY29uZGl0aW9uYWxzIHNldCBhIG5ldyBwYXJlbnRSZWN0LFxuICAgIC8vIGNhbGN1bGF0ZSBuZXcgaW50ZXJzZWN0aW9uIGRhdGEuXG4gICAgaWYgKHBhcmVudFJlY3QpIHtcbiAgICAgIGludGVyc2VjdGlvblJlY3QgPSBjb21wdXRlUmVjdEludGVyc2VjdGlvbihwYXJlbnRSZWN0LCBpbnRlcnNlY3Rpb25SZWN0KTtcbiAgICB9XG4gICAgaWYgKCFpbnRlcnNlY3Rpb25SZWN0KSBicmVhaztcbiAgICBwYXJlbnQgPSBwYXJlbnQgJiYgZ2V0UGFyZW50Tm9kZShwYXJlbnQpO1xuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25SZWN0O1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJvb3QgcmVjdCBhZnRlciBiZWluZyBleHBhbmRlZCBieSB0aGUgcm9vdE1hcmdpbiB2YWx1ZS5cbiAqIEByZXR1cm4ge0NsaWVudFJlY3R9IFRoZSBleHBhbmRlZCByb290IHJlY3QuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2dldFJvb3RSZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciByb290UmVjdDtcbiAgaWYgKHRoaXMucm9vdCkge1xuICAgIHJvb3RSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMucm9vdCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIDxodG1sPi88Ym9keT4gaW5zdGVhZCBvZiB3aW5kb3cgc2luY2Ugc2Nyb2xsIGJhcnMgYWZmZWN0IHNpemUuXG4gICAgdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgIHJvb3RSZWN0ID0ge1xuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiBodG1sLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgICB3aWR0aDogaHRtbC5jbGllbnRXaWR0aCB8fCBib2R5LmNsaWVudFdpZHRoLFxuICAgICAgYm90dG9tOiBodG1sLmNsaWVudEhlaWdodCB8fCBib2R5LmNsaWVudEhlaWdodCxcbiAgICAgIGhlaWdodDogaHRtbC5jbGllbnRIZWlnaHQgfHwgYm9keS5jbGllbnRIZWlnaHRcbiAgICB9O1xuICB9XG4gIHJldHVybiB0aGlzLl9leHBhbmRSZWN0QnlSb290TWFyZ2luKHJvb3RSZWN0KTtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIGEgcmVjdCBhbmQgZXhwYW5kcyBpdCBieSB0aGUgcm9vdE1hcmdpbiB2YWx1ZS5cbiAqIEBwYXJhbSB7RE9NUmVjdHxDbGllbnRSZWN0fSByZWN0IFRoZSByZWN0IG9iamVjdCB0byBleHBhbmQuXG4gKiBAcmV0dXJuIHtDbGllbnRSZWN0fSBUaGUgZXhwYW5kZWQgcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fZXhwYW5kUmVjdEJ5Um9vdE1hcmdpbiA9IGZ1bmN0aW9uKHJlY3QpIHtcbiAgdmFyIG1hcmdpbnMgPSB0aGlzLl9yb290TWFyZ2luVmFsdWVzLm1hcChmdW5jdGlvbihtYXJnaW4sIGkpIHtcbiAgICByZXR1cm4gbWFyZ2luLnVuaXQgPT0gJ3B4JyA/IG1hcmdpbi52YWx1ZSA6XG4gICAgICAgIG1hcmdpbi52YWx1ZSAqIChpICUgMiA/IHJlY3Qud2lkdGggOiByZWN0LmhlaWdodCkgLyAxMDA7XG4gIH0pO1xuICB2YXIgbmV3UmVjdCA9IHtcbiAgICB0b3A6IHJlY3QudG9wIC0gbWFyZ2luc1swXSxcbiAgICByaWdodDogcmVjdC5yaWdodCArIG1hcmdpbnNbMV0sXG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnNbMl0sXG4gICAgbGVmdDogcmVjdC5sZWZ0IC0gbWFyZ2luc1szXVxuICB9O1xuICBuZXdSZWN0LndpZHRoID0gbmV3UmVjdC5yaWdodCAtIG5ld1JlY3QubGVmdDtcbiAgbmV3UmVjdC5oZWlnaHQgPSBuZXdSZWN0LmJvdHRvbSAtIG5ld1JlY3QudG9wO1xuXG4gIHJldHVybiBuZXdSZWN0O1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYW4gb2xkIGFuZCBuZXcgZW50cnkgYW5kIHJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlXG4gKiB0aHJlc2hvbGQgdmFsdWVzIGhhcyBiZWVuIGNyb3NzZWQuXG4gKiBAcGFyYW0gez9JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5fSBvbGRFbnRyeSBUaGUgcHJldmlvdXMgZW50cnkgZm9yIGFcbiAqICAgIHBhcnRpY3VsYXIgdGFyZ2V0IGVsZW1lbnQgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbnRyeSBleGlzdHMuXG4gKiBAcGFyYW0ge0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnl9IG5ld0VudHJ5IFRoZSBjdXJyZW50IGVudHJ5IGZvciBhXG4gKiAgICBwYXJ0aWN1bGFyIHRhcmdldCBlbGVtZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgYW55IHRocmVzaG9sZCBoYXMgYmVlbiBjcm9zc2VkLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9oYXNDcm9zc2VkVGhyZXNob2xkID1cbiAgICBmdW5jdGlvbihvbGRFbnRyeSwgbmV3RW50cnkpIHtcblxuICAvLyBUbyBtYWtlIGNvbXBhcmluZyBlYXNpZXIsIGFuIGVudHJ5IHRoYXQgaGFzIGEgcmF0aW8gb2YgMFxuICAvLyBidXQgZG9lcyBub3QgYWN0dWFsbHkgaW50ZXJzZWN0IGlzIGdpdmVuIGEgdmFsdWUgb2YgLTFcbiAgdmFyIG9sZFJhdGlvID0gb2xkRW50cnkgJiYgb2xkRW50cnkuaXNJbnRlcnNlY3RpbmcgP1xuICAgICAgb2xkRW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gfHwgMCA6IC0xO1xuICB2YXIgbmV3UmF0aW8gPSBuZXdFbnRyeS5pc0ludGVyc2VjdGluZyA/XG4gICAgICBuZXdFbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyB8fCAwIDogLTE7XG5cbiAgLy8gSWdub3JlIHVuY2hhbmdlZCByYXRpb3NcbiAgaWYgKG9sZFJhdGlvID09PSBuZXdSYXRpbykgcmV0dXJuO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aHJlc2hvbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkc1tpXTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGFuIGVudHJ5IG1hdGNoZXMgYSB0aHJlc2hvbGQgb3IgaWYgdGhlIG5ldyByYXRpb1xuICAgIC8vIGFuZCB0aGUgb2xkIHJhdGlvIGFyZSBvbiB0aGUgb3Bwb3NpdGUgc2lkZXMgb2YgYSB0aHJlc2hvbGQuXG4gICAgaWYgKHRocmVzaG9sZCA9PSBvbGRSYXRpbyB8fCB0aHJlc2hvbGQgPT0gbmV3UmF0aW8gfHxcbiAgICAgICAgdGhyZXNob2xkIDwgb2xkUmF0aW8gIT09IHRocmVzaG9sZCA8IG5ld1JhdGlvKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb290IGVsZW1lbnQgaXMgYW4gZWxlbWVudCBhbmQgaXMgaW4gdGhlIERPTS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHJvb3QgZWxlbWVudCBpcyBhbiBlbGVtZW50IGFuZCBpcyBpbiB0aGUgRE9NLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yb290SXNJbkRvbSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMucm9vdCB8fCBjb250YWluc0RlZXAoZG9jdW1lbnQsIHRoaXMucm9vdCk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiByb290LlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiByb290LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yb290Q29udGFpbnNUYXJnZXQgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgcmV0dXJuIGNvbnRhaW5zRGVlcCh0aGlzLnJvb3QgfHwgZG9jdW1lbnQsIHRhcmdldCkgJiZcbiAgICAoIXRoaXMucm9vdCB8fCB0aGlzLnJvb3Qub3duZXJEb2N1bWVudCA9PSB0YXJnZXQub3duZXJEb2N1bWVudCk7XG59O1xuXG5cbi8qKlxuICogQWRkcyB0aGUgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlciByZWdpc3RyeSBpZiBpdCBpc24ndFxuICogYWxyZWFkeSBwcmVzZW50LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChyZWdpc3RyeS5pbmRleE9mKHRoaXMpIDwgMCkge1xuICAgIHJlZ2lzdHJ5LnB1c2godGhpcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3VucmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5kZXggPSByZWdpc3RyeS5pbmRleE9mKHRoaXMpO1xuICBpZiAoaW5kZXggIT0gLTEpIHJlZ2lzdHJ5LnNwbGljZShpbmRleCwgMSk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBwZXJmb3JtYW5jZS5ub3coKSBtZXRob2Qgb3IgbnVsbCBpbiBicm93c2Vyc1xuICogdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBBUEkuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHBhZ2Ugd2FzIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyAmJiBwZXJmb3JtYW5jZS5ub3coKTtcbn1cblxuXG4vKipcbiAqIFRocm90dGxlcyBhIGZ1bmN0aW9uIGFuZCBkZWxheXMgaXRzIGV4ZWN1dGlvbiwgc28gaXQncyBvbmx5IGNhbGxlZCBhdCBtb3N0XG4gKiBvbmNlIHdpdGhpbiBhIGdpdmVuIHRpbWUgcGVyaW9kLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgbXVzdCBwYXNzIGJlZm9yZSB0aGVcbiAqICAgICBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFnYWluLlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCB0aW1lb3V0KSB7XG4gIHZhciB0aW1lciA9IG51bGw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aW1lcikge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBmbigpO1xuICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gIH07XG59XG5cblxuLyoqXG4gKiBBZGRzIGFuIGV2ZW50IGhhbmRsZXIgdG8gYSBET00gbm9kZSBlbnN1cmluZyBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHkuXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgVGhlIERPTSBub2RlIHRvIGFkZCB0aGUgZXZlbnQgaGFuZGxlciB0by5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBldmVudCBoYW5kbGVyIHRvIGFkZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X3VzZUNhcHR1cmUgT3B0aW9uYWxseSBhZGRzIHRoZSBldmVuIHRvIHRoZSBjYXB0dXJlXG4gKiAgICAgcGhhc2UuIE5vdGU6IHRoaXMgb25seSB3b3JrcyBpbiBtb2Rlcm4gYnJvd3NlcnMuXG4gKi9cbmZ1bmN0aW9uIGFkZEV2ZW50KG5vZGUsIGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUpIHtcbiAgaWYgKHR5cGVvZiBub2RlLmFkZEV2ZW50TGlzdGVuZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlIHx8IGZhbHNlKTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2Ygbm9kZS5hdHRhY2hFdmVudCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGZuKTtcbiAgfVxufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgYWRkZWQgZXZlbnQgaGFuZGxlciBmcm9tIGEgRE9NIG5vZGUuXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgVGhlIERPTSBub2RlIHRvIHJlbW92ZSB0aGUgZXZlbnQgaGFuZGxlciBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlLlxuICogQHBhcmFtIHtib29sZWFufSBvcHRfdXNlQ2FwdHVyZSBJZiB0aGUgZXZlbnQgaGFuZGxlciB3YXMgYWRkZWQgd2l0aCB0aGlzXG4gKiAgICAgZmxhZyBzZXQgdG8gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byB0cnVlIGhlcmUgaW4gb3JkZXIgdG8gcmVtb3ZlIGl0LlxuICovXG5mdW5jdGlvbiByZW1vdmVFdmVudChub2RlLCBldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIG5vZGUuZGV0YXRjaEV2ZW50ID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLmRldGF0Y2hFdmVudCgnb24nICsgZXZlbnQsIGZuKTtcbiAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHJlY3Qgb2JqZWN0cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0MSBUaGUgZmlyc3QgcmVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZWN0MiBUaGUgc2Vjb25kIHJlY3QuXG4gKiBAcmV0dXJuIHs/T2JqZWN0fD9DbGllbnRSZWN0fSBUaGUgaW50ZXJzZWN0aW9uIHJlY3Qgb3IgdW5kZWZpbmVkIGlmIG5vXG4gKiAgICAgaW50ZXJzZWN0aW9uIGlzIGZvdW5kLlxuICovXG5mdW5jdGlvbiBjb21wdXRlUmVjdEludGVyc2VjdGlvbihyZWN0MSwgcmVjdDIpIHtcbiAgdmFyIHRvcCA9IE1hdGgubWF4KHJlY3QxLnRvcCwgcmVjdDIudG9wKTtcbiAgdmFyIGJvdHRvbSA9IE1hdGgubWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKTtcbiAgdmFyIGxlZnQgPSBNYXRoLm1heChyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KTtcbiAgdmFyIHJpZ2h0ID0gTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KTtcbiAgdmFyIHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICB2YXIgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuXG4gIHJldHVybiAod2lkdGggPj0gMCAmJiBoZWlnaHQgPj0gMCkgJiYge1xuICAgIHRvcDogdG9wLFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9IHx8IG51bGw7XG59XG5cblxuLyoqXG4gKiBTaGltcyB0aGUgbmF0aXZlIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIElFLlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBUaGUgZWxlbWVudCB3aG9zZSBib3VuZGluZyByZWN0IHRvIGdldC5cbiAqIEByZXR1cm4ge0RPTVJlY3R8Q2xpZW50UmVjdH0gVGhlIChwb3NzaWJseSBzaGltbWVkKSByZWN0IG9mIHRoZSBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpIHtcbiAgdmFyIHJlY3Q7XG5cbiAgdHJ5IHtcbiAgICByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElnbm9yZSBXaW5kb3dzIDcgSUUxMSBcIlVuc3BlY2lmaWVkIGVycm9yXCJcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL3B1bGwvMjA1XG4gIH1cblxuICBpZiAoIXJlY3QpIHJldHVybiBnZXRFbXB0eVJlY3QoKTtcblxuICAvLyBPbGRlciBJRVxuICBpZiAoIShyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSkge1xuICAgIHJlY3QgPSB7XG4gICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgcmlnaHQ6IHJlY3QucmlnaHQsXG4gICAgICBib3R0b206IHJlY3QuYm90dG9tLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgICBoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9O1xuICB9XG4gIHJldHVybiByZWN0O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBlbXB0eSByZWN0IG9iamVjdC4gQW4gZW1wdHkgcmVjdCBpcyByZXR1cm5lZCB3aGVuIGFuIGVsZW1lbnRcbiAqIGlzIG5vdCBpbiB0aGUgRE9NLlxuICogQHJldHVybiB7Q2xpZW50UmVjdH0gVGhlIGVtcHR5IHJlY3QuXG4gKi9cbmZ1bmN0aW9uIGdldEVtcHR5UmVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG59XG5cblxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBmaWVsZHMgb2YgdGhlIERPTVJlY3QuXG4gKiBTcGVjaWZpY2FsbHkgdGhpcyBlbnN1cmVzIHRoYXQgYHhgIGFuZCBgeWAgZmllbGRzIGFyZSBzZXQuXG4gKlxuICogQHBhcmFtIHs/RE9NUmVjdHw/Q2xpZW50UmVjdH0gcmVjdFxuICogQHJldHVybiB7P0RPTVJlY3R9XG4gKi9cbmZ1bmN0aW9uIGVuc3VyZURPTVJlY3QocmVjdCkge1xuICAvLyBBIGBET01SZWN0YCBvYmplY3QgaGFzIGB4YCBhbmQgYHlgIGZpZWxkcy5cbiAgaWYgKCFyZWN0IHx8ICd4JyBpbiByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH1cbiAgLy8gQSBJRSdzIGBDbGllbnRSZWN0YCB0eXBlIGRvZXMgbm90IGhhdmUgYHhgIGFuZCBgeWAuIFRoZSBzYW1lIGlzIHRoZSBjYXNlXG4gIC8vIGZvciBpbnRlcm5hbGx5IGNhbGN1bGF0ZWQgUmVjdCBvYmplY3RzLiBGb3IgdGhlIHB1cnBvc2VzIG9mXG4gIC8vIGBJbnRlcnNlY3Rpb25PYnNlcnZlcmAsIGl0J3Mgc3VmZmljaWVudCB0byBzaW1wbHkgbWlycm9yIGBsZWZ0YCBhbmQgYHRvcGBcbiAgLy8gZm9yIHRoZXNlIGZpZWxkcy5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHk6IHJlY3QudG9wLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHg6IHJlY3QubGVmdCxcbiAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cblxuLyoqXG4gKiBJbnZlcnRzIHRoZSBpbnRlcnNlY3Rpb24gYW5kIGJvdW5kaW5nIHJlY3QgZnJvbSB0aGUgcGFyZW50IChmcmFtZSkgQkNSIHRvXG4gKiB0aGUgbG9jYWwgQkNSIHNwYWNlLlxuICogQHBhcmFtIHtET01SZWN0fENsaWVudFJlY3R9IHBhcmVudEJvdW5kaW5nUmVjdCBUaGUgcGFyZW50J3MgYm91bmQgY2xpZW50IHJlY3QuXG4gKiBAcGFyYW0ge0RPTVJlY3R8Q2xpZW50UmVjdH0gcGFyZW50SW50ZXJzZWN0aW9uUmVjdCBUaGUgcGFyZW50J3Mgb3duIGludGVyc2VjdGlvbiByZWN0LlxuICogQHJldHVybiB7Q2xpZW50UmVjdH0gVGhlIGxvY2FsIHJvb3QgYm91bmRpbmcgcmVjdCBmb3IgdGhlIHBhcmVudCdzIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RnJvbVBhcmVudFJlY3QocGFyZW50Qm91bmRpbmdSZWN0LCBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0KSB7XG4gIHZhciB0b3AgPSBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0LnRvcCAtIHBhcmVudEJvdW5kaW5nUmVjdC50b3A7XG4gIHZhciBsZWZ0ID0gcGFyZW50SW50ZXJzZWN0aW9uUmVjdC5sZWZ0IC0gcGFyZW50Qm91bmRpbmdSZWN0LmxlZnQ7XG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgbGVmdDogbGVmdCxcbiAgICBoZWlnaHQ6IHBhcmVudEludGVyc2VjdGlvblJlY3QuaGVpZ2h0LFxuICAgIHdpZHRoOiBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0LndpZHRoLFxuICAgIGJvdHRvbTogdG9wICsgcGFyZW50SW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQsXG4gICAgcmlnaHQ6IGxlZnQgKyBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0LndpZHRoXG4gIH07XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdG8gc2VlIGlmIGEgcGFyZW50IGVsZW1lbnQgY29udGFpbnMgYSBjaGlsZCBlbGVtZW50IChpbmNsdWRpbmcgaW5zaWRlXG4gKiBzaGFkb3cgRE9NKS5cbiAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50IFRoZSBwYXJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Tm9kZX0gY2hpbGQgVGhlIGNoaWxkIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXJlbnQgbm9kZSBjb250YWlucyB0aGUgY2hpbGQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNEZWVwKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIG5vZGUgPSBjaGlsZDtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PSBwYXJlbnQpIHJldHVybiB0cnVlO1xuXG4gICAgbm9kZSA9IGdldFBhcmVudE5vZGUobm9kZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8qKlxuICogR2V0cyB0aGUgcGFyZW50IG5vZGUgb2YgYW4gZWxlbWVudCBvciBpdHMgaG9zdCBlbGVtZW50IGlmIHRoZSBwYXJlbnQgbm9kZVxuICogaXMgYSBzaGFkb3cgcm9vdC5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB3aG9zZSBwYXJlbnQgdG8gZ2V0LlxuICogQHJldHVybiB7Tm9kZXxudWxsfSBUaGUgcGFyZW50IG5vZGUgb3IgbnVsbCBpZiBubyBwYXJlbnQgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKG5vZGUpIHtcbiAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcblxuICBpZiAobm9kZS5ub2RlVHlwZSA9PSAvKiBET0NVTUVOVCAqLyA5ICYmIG5vZGUgIT0gZG9jdW1lbnQpIHtcbiAgICAvLyBJZiB0aGlzIG5vZGUgaXMgYSBkb2N1bWVudCBub2RlLCBsb29rIGZvciB0aGUgZW1iZWRkaW5nIGZyYW1lLlxuICAgIHJldHVybiBnZXRGcmFtZUVsZW1lbnQobm9kZSk7XG4gIH1cblxuICBpZiAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxMSAmJiBwYXJlbnQuaG9zdCkge1xuICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgYSBzaGFkb3cgcm9vdCwgcmV0dXJuIHRoZSBob3N0IGVsZW1lbnQuXG4gICAgcmV0dXJuIHBhcmVudC5ob3N0O1xuICB9XG5cbiAgaWYgKHBhcmVudCAmJiBwYXJlbnQuYXNzaWduZWRTbG90KSB7XG4gICAgLy8gSWYgdGhlIHBhcmVudCBpcyBkaXN0cmlidXRlZCBpbiBhIDxzbG90PiwgcmV0dXJuIHRoZSBwYXJlbnQgb2YgYSBzbG90LlxuICAgIHJldHVybiBwYXJlbnQuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gcGFyZW50O1xufVxuXG5cbi8vIEV4cG9zZXMgdGhlIGNvbnN0cnVjdG9ycyBnbG9iYWxseS5cbndpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlciA9IEludGVyc2VjdGlvbk9ic2VydmVyO1xud2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPSBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5O1xuXG59KCkpO1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IGZhY3RvcnkoKTtcblx0XHRmb3IodmFyIGkgaW4gYSkgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGV4cG9ydHMgOiByb290KVtpXSA9IGFbaV07XG5cdH1cbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgLyogZ2xvYmFscyBqUXVlcnkgKi9cblxuZXhwb3J0cy5sb3J5ID0gbG9yeTtcblxudmFyIF9kZXRlY3RQcmVmaXhlcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfZGV0ZWN0UHJlZml4ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGV0ZWN0UHJlZml4ZXMpO1xuXG52YXIgX2RldGVjdFN1cHBvcnRzUGFzc2l2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cbnZhciBfZGV0ZWN0U3VwcG9ydHNQYXNzaXZlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RldGVjdFN1cHBvcnRzUGFzc2l2ZSk7XG5cbnZhciBfZGlzcGF0Y2hFdmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbnZhciBfZGlzcGF0Y2hFdmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwYXRjaEV2ZW50KTtcblxudmFyIF9kZWZhdWx0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cbnZhciBfZGVmYXVsdHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmYXVsdHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmZ1bmN0aW9uIGxvcnkoc2xpZGVyLCBvcHRzKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gdm9pZCAwO1xuICAgIHZhciBzbGlkZXNXaWR0aCA9IHZvaWQgMDtcbiAgICB2YXIgZnJhbWVXaWR0aCA9IHZvaWQgMDtcbiAgICB2YXIgc2xpZGVzID0gdm9pZCAwO1xuXG4gICAgLyoqXG4gICAgICogc2xpZGVyIERPTSBlbGVtZW50c1xuICAgICAqL1xuICAgIHZhciBmcmFtZSA9IHZvaWQgMDtcbiAgICB2YXIgc2xpZGVDb250YWluZXIgPSB2b2lkIDA7XG4gICAgdmFyIHByZXZDdHJsID0gdm9pZCAwO1xuICAgIHZhciBuZXh0Q3RybCA9IHZvaWQgMDtcbiAgICB2YXIgcHJlZml4ZXMgPSB2b2lkIDA7XG4gICAgdmFyIHRyYW5zaXRpb25FbmRDYWxsYmFjayA9IHZvaWQgMDtcblxuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICB2YXIgdG91Y2hFdmVudFBhcmFtcyA9ICgwLCBfZGV0ZWN0U3VwcG9ydHNQYXNzaXZlMi5kZWZhdWx0KSgpID8geyBwYXNzaXZlOiB0cnVlIH0gOiBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIGlmIG9iamVjdCBpcyBqUXVlcnkgY29udmVydCB0byBuYXRpdmUgRE9NIGVsZW1lbnRcbiAgICAgKi9cbiAgICBpZiAodHlwZW9mIGpRdWVyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2xpZGVyIGluc3RhbmNlb2YgalF1ZXJ5KSB7XG4gICAgICAgIHNsaWRlciA9IHNsaWRlclswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwcml2YXRlXG4gICAgICogc2V0IGFjdGl2ZSBjbGFzcyB0byBlbGVtZW50IHdoaWNoIGlzIHRoZSBjdXJyZW50IHNsaWRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0QWN0aXZlRWxlbWVudChzbGlkZXMsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICAgICAgY2xhc3NOYW1lQWN0aXZlU2xpZGUgPSBfb3B0aW9ucy5jbGFzc05hbWVBY3RpdmVTbGlkZTtcblxuXG4gICAgICAgIHNsaWRlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUFjdGl2ZVNsaWRlKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVBY3RpdmVTbGlkZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNsaWRlc1tjdXJyZW50SW5kZXhdLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lQWN0aXZlU2xpZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHByaXZhdGVcbiAgICAgKiBzZXR1cEluZmluaXRlOiBmdW5jdGlvbiB0byBzZXR1cCBpZiBpbmZpbml0ZSBpcyBzZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge2FycmF5fSBzbGlkZUFycmF5XG4gICAgICogQHJldHVybiB7YXJyYXl9IGFycmF5IG9mIHVwZGF0ZWQgc2xpZGVDb250YWluZXIgZWxlbWVudHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXR1cEluZmluaXRlKHNsaWRlQXJyYXkpIHtcbiAgICAgICAgdmFyIF9vcHRpb25zMiA9IG9wdGlvbnMsXG4gICAgICAgICAgICBpbmZpbml0ZSA9IF9vcHRpb25zMi5pbmZpbml0ZTtcblxuXG4gICAgICAgIHZhciBmcm9udCA9IHNsaWRlQXJyYXkuc2xpY2UoMCwgaW5maW5pdGUpO1xuICAgICAgICB2YXIgYmFjayA9IHNsaWRlQXJyYXkuc2xpY2Uoc2xpZGVBcnJheS5sZW5ndGggLSBpbmZpbml0ZSwgc2xpZGVBcnJheS5sZW5ndGgpO1xuXG4gICAgICAgIGZyb250LmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZWQgPSBlbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcblxuICAgICAgICAgICAgc2xpZGVDb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmFjay5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGNsb25lZCA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgICAgICBzbGlkZUNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2xvbmVkLCBzbGlkZUNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2xpZGVDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihwcmVmaXhlcy50cmFuc2l0aW9uRW5kLCBvblRyYW5zaXRpb25FbmQpO1xuXG4gICAgICAgIHJldHVybiBzbGljZS5jYWxsKHNsaWRlQ29udGFpbmVyLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbZGlzcGF0Y2hTbGlkZXJFdmVudCBkZXNjcmlwdGlvbl1cbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19IFtkZXNjcmlwdGlvbl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXNwYXRjaFNsaWRlckV2ZW50KHBoYXNlLCB0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgKDAsIF9kaXNwYXRjaEV2ZW50Mi5kZWZhdWx0KShzbGlkZXIsIHBoYXNlICsgJy5sb3J5LicgKyB0eXBlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRyYW5zbGF0ZXMgdG8gYSBnaXZlbiBwb3NpdGlvbiBpbiBhIGdpdmVuIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAgICpcbiAgICAgKiBAdG8gICAgICAgIHtudW1iZXJ9IG51bWJlciBpbiBwaXhlbHMgd2hlcmUgdG8gdHJhbnNsYXRlIHRvXG4gICAgICogQGR1cmF0aW9uICB7bnVtYmVyfSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXN0aW9uXG4gICAgICogQGVhc2UgICAgICB7c3RyaW5nfSBlYXNpbmcgY3NzIHByb3BlcnR5XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKHRvLCBkdXJhdGlvbiwgZWFzZSkge1xuICAgICAgICB2YXIgc3R5bGUgPSBzbGlkZUNvbnRhaW5lciAmJiBzbGlkZUNvbnRhaW5lci5zdHlsZTtcblxuICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHN0eWxlW3ByZWZpeGVzLnRyYW5zaXRpb24gKyAnVGltaW5nRnVuY3Rpb24nXSA9IGVhc2U7XG4gICAgICAgICAgICBzdHlsZVtwcmVmaXhlcy50cmFuc2l0aW9uICsgJ0R1cmF0aW9uJ10gPSBkdXJhdGlvbiArICdtcyc7XG4gICAgICAgICAgICBzdHlsZVtwcmVmaXhlcy50cmFuc2Zvcm1dID0gJ3RyYW5zbGF0ZVgoJyArIHRvICsgJ3B4KSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGFuIGVsZW1lbnQncyB3aWR0aFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVsZW1lbnRXaWR0aChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogc2xpZGVmdW5jdGlvbiBjYWxsZWQgYnkgcHJldiwgbmV4dCAmIHRvdWNoZW5kXG4gICAgICpcbiAgICAgKiBkZXRlcm1pbmUgbmV4dEluZGV4IGFuZCBzbGlkZSB0byBuZXh0IHBvc3Rpb25cbiAgICAgKiB1bmRlciByZXN0cmljdGlvbnMgb2YgdGhlIGRlZmluZWQgb3B0aW9uc1xuICAgICAqXG4gICAgICogQGRpcmVjdGlvbiAge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpZGUobmV4dEluZGV4LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIF9vcHRpb25zMyA9IG9wdGlvbnMsXG4gICAgICAgICAgICBzbGlkZVNwZWVkID0gX29wdGlvbnMzLnNsaWRlU3BlZWQsXG4gICAgICAgICAgICBzbGlkZXNUb1Njcm9sbCA9IF9vcHRpb25zMy5zbGlkZXNUb1Njcm9sbCxcbiAgICAgICAgICAgIGluZmluaXRlID0gX29wdGlvbnMzLmluZmluaXRlLFxuICAgICAgICAgICAgcmV3aW5kID0gX29wdGlvbnMzLnJld2luZCxcbiAgICAgICAgICAgIHJld2luZFByZXYgPSBfb3B0aW9uczMucmV3aW5kUHJldixcbiAgICAgICAgICAgIHJld2luZFNwZWVkID0gX29wdGlvbnMzLnJld2luZFNwZWVkLFxuICAgICAgICAgICAgZWFzZSA9IF9vcHRpb25zMy5lYXNlLFxuICAgICAgICAgICAgY2xhc3NOYW1lQWN0aXZlU2xpZGUgPSBfb3B0aW9uczMuY2xhc3NOYW1lQWN0aXZlU2xpZGUsXG4gICAgICAgICAgICBfb3B0aW9uczMkY2xhc3NOYW1lRGkgPSBfb3B0aW9uczMuY2xhc3NOYW1lRGlzYWJsZWROZXh0Q3RybCxcbiAgICAgICAgICAgIGNsYXNzTmFtZURpc2FibGVkTmV4dEN0cmwgPSBfb3B0aW9uczMkY2xhc3NOYW1lRGkgPT09IHVuZGVmaW5lZCA/ICdkaXNhYmxlZCcgOiBfb3B0aW9uczMkY2xhc3NOYW1lRGksXG4gICAgICAgICAgICBfb3B0aW9uczMkY2xhc3NOYW1lRGkyID0gX29wdGlvbnMzLmNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwsXG4gICAgICAgICAgICBjbGFzc05hbWVEaXNhYmxlZFByZXZDdHJsID0gX29wdGlvbnMzJGNsYXNzTmFtZURpMiA9PT0gdW5kZWZpbmVkID8gJ2Rpc2FibGVkJyA6IF9vcHRpb25zMyRjbGFzc05hbWVEaTI7XG5cblxuICAgICAgICB2YXIgZHVyYXRpb24gPSBzbGlkZVNwZWVkO1xuXG4gICAgICAgIHZhciBuZXh0U2xpZGUgPSBkaXJlY3Rpb24gPyBpbmRleCArIDEgOiBpbmRleCAtIDE7XG4gICAgICAgIHZhciBtYXhPZmZzZXQgPSBNYXRoLnJvdW5kKHNsaWRlc1dpZHRoIC0gZnJhbWVXaWR0aCk7XG5cbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYmVmb3JlJywgJ3NsaWRlJywge1xuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgbmV4dFNsaWRlOiBuZXh0U2xpZGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc2V0IGNvbnRyb2wgY2xhc3Nlc1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHByZXZDdHJsKSB7XG4gICAgICAgICAgICBwcmV2Q3RybC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0Q3RybCkge1xuICAgICAgICAgICAgbmV4dEN0cmwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWVEaXNhYmxlZE5leHRDdHJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbmV4dEluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChpbmZpbml0ZSAmJiBpbmRleCArIGluZmluaXRlICogMiAhPT0gc2xpZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSBpbmRleCArIChpbmZpbml0ZSAtIGluZGV4ICUgaW5maW5pdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IGluZGV4ICsgc2xpZGVzVG9TY3JvbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5maW5pdGUgJiYgaW5kZXggJSBpbmZpbml0ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSBpbmRleCAtIGluZGV4ICUgaW5maW5pdGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gaW5kZXggLSBzbGlkZXNUb1Njcm9sbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0SW5kZXggPSBNYXRoLm1pbihNYXRoLm1heChuZXh0SW5kZXgsIDApLCBzbGlkZXMubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgaWYgKGluZmluaXRlICYmIGRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggKz0gaW5maW5pdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV3aW5kUHJldiAmJiBNYXRoLmFicyhwb3NpdGlvbi54KSA9PT0gMCAmJiBkaXJlY3Rpb24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSBzbGlkZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gcmV3aW5kU3BlZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dE9mZnNldCA9IE1hdGgubWluKE1hdGgubWF4KHNsaWRlc1tuZXh0SW5kZXhdLm9mZnNldExlZnQgKiAtMSwgbWF4T2Zmc2V0ICogLTEpLCAwKTtcblxuICAgICAgICBpZiAocmV3aW5kICYmIE1hdGguYWJzKHBvc2l0aW9uLngpID09PSBtYXhPZmZzZXQgJiYgZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHJld2luZFNwZWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRyYW5zbGF0ZSB0byB0aGUgbmV4dE9mZnNldCBieSBhIGRlZmluZWQgZHVyYXRpb24gYW5kIGVhc2UgZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zbGF0ZShuZXh0T2Zmc2V0LCBkdXJhdGlvbiwgZWFzZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHVwZGF0ZSB0aGUgcG9zaXRpb24gd2l0aCB0aGUgbmV4dCBwb3NpdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgcG9zaXRpb24ueCA9IG5leHRPZmZzZXQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCB0aGUgbmV4dEluZGV4IG9ubHkgaWZcbiAgICAgICAgICogdGhlIG9mZnNldCBvZiB0aGUgbmV4dEluZGV4IGlzIGluIHRoZSByYW5nZSBvZiB0aGUgbWF4T2Zmc2V0XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoc2xpZGVzW25leHRJbmRleF0ub2Zmc2V0TGVmdCA8PSBtYXhPZmZzZXQpIHtcbiAgICAgICAgICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZmluaXRlICYmIChuZXh0SW5kZXggPT09IHNsaWRlcy5sZW5ndGggLSBpbmZpbml0ZSB8fCBuZXh0SW5kZXggPT09IHNsaWRlcy5sZW5ndGggLSBzbGlkZXMubGVuZ3RoICUgaW5maW5pdGUgfHwgbmV4dEluZGV4ID09PSAwKSkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5maW5pdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBzbGlkZXMubGVuZ3RoIC0gaW5maW5pdGUgKiAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb3NpdGlvbi54ID0gc2xpZGVzW2luZGV4XS5vZmZzZXRMZWZ0ICogLTE7XG5cbiAgICAgICAgICAgIHRyYW5zaXRpb25FbmRDYWxsYmFjayA9IGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUoc2xpZGVzW2luZGV4XS5vZmZzZXRMZWZ0ICogLTEsIDAsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzTmFtZUFjdGl2ZVNsaWRlKSB7XG4gICAgICAgICAgICBzZXRBY3RpdmVFbGVtZW50KHNsaWNlLmNhbGwoc2xpZGVzKSwgaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHVwZGF0ZSBjbGFzc2VzIGZvciBuZXh0IGFuZCBwcmV2IGFycm93c1xuICAgICAgICAgKiBiYXNlZCBvbiB1c2VyIHNldHRpbmdzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAocHJldkN0cmwgJiYgIWluZmluaXRlICYmICFyZXdpbmRQcmV2ICYmIG5leHRJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcHJldkN0cmwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVEaXNhYmxlZFByZXZDdHJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0Q3RybCAmJiAhaW5maW5pdGUgJiYgIXJld2luZCAmJiBuZXh0SW5kZXggKyAxID09PSBzbGlkZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBuZXh0Q3RybC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZURpc2FibGVkTmV4dEN0cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYWZ0ZXInLCAnc2xpZGUnLCB7XG4gICAgICAgICAgICBjdXJyZW50U2xpZGU6IGluZGV4XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB1YmxpY1xuICAgICAqIHNldHVwIGZ1bmN0aW9uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0dXAoKSB7XG4gICAgICAgIGRpc3BhdGNoU2xpZGVyRXZlbnQoJ2JlZm9yZScsICdpbml0Jyk7XG5cbiAgICAgICAgcHJlZml4ZXMgPSAoMCwgX2RldGVjdFByZWZpeGVzMi5kZWZhdWx0KSgpO1xuICAgICAgICBvcHRpb25zID0gX2V4dGVuZHMoe30sIF9kZWZhdWx0czIuZGVmYXVsdCwgb3B0cyk7XG5cbiAgICAgICAgdmFyIF9vcHRpb25zNCA9IG9wdGlvbnMsXG4gICAgICAgICAgICBjbGFzc05hbWVGcmFtZSA9IF9vcHRpb25zNC5jbGFzc05hbWVGcmFtZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZVNsaWRlQ29udGFpbmVyID0gX29wdGlvbnM0LmNsYXNzTmFtZVNsaWRlQ29udGFpbmVyLFxuICAgICAgICAgICAgY2xhc3NOYW1lUHJldkN0cmwgPSBfb3B0aW9uczQuY2xhc3NOYW1lUHJldkN0cmwsXG4gICAgICAgICAgICBjbGFzc05hbWVOZXh0Q3RybCA9IF9vcHRpb25zNC5jbGFzc05hbWVOZXh0Q3RybCxcbiAgICAgICAgICAgIF9vcHRpb25zNCRjbGFzc05hbWVEaSA9IF9vcHRpb25zNC5jbGFzc05hbWVEaXNhYmxlZE5leHRDdHJsLFxuICAgICAgICAgICAgY2xhc3NOYW1lRGlzYWJsZWROZXh0Q3RybCA9IF9vcHRpb25zNCRjbGFzc05hbWVEaSA9PT0gdW5kZWZpbmVkID8gJ2Rpc2FibGVkJyA6IF9vcHRpb25zNCRjbGFzc05hbWVEaSxcbiAgICAgICAgICAgIF9vcHRpb25zNCRjbGFzc05hbWVEaTIgPSBfb3B0aW9uczQuY2xhc3NOYW1lRGlzYWJsZWRQcmV2Q3RybCxcbiAgICAgICAgICAgIGNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwgPSBfb3B0aW9uczQkY2xhc3NOYW1lRGkyID09PSB1bmRlZmluZWQgPyAnZGlzYWJsZWQnIDogX29wdGlvbnM0JGNsYXNzTmFtZURpMixcbiAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzID0gX29wdGlvbnM0LmVuYWJsZU1vdXNlRXZlbnRzLFxuICAgICAgICAgICAgY2xhc3NOYW1lQWN0aXZlU2xpZGUgPSBfb3B0aW9uczQuY2xhc3NOYW1lQWN0aXZlU2xpZGUsXG4gICAgICAgICAgICBpbml0aWFsSW5kZXggPSBfb3B0aW9uczQuaW5pdGlhbEluZGV4O1xuXG5cbiAgICAgICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gICAgICAgIGZyYW1lID0gc2xpZGVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lRnJhbWUpWzBdO1xuICAgICAgICBzbGlkZUNvbnRhaW5lciA9IGZyYW1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lU2xpZGVDb250YWluZXIpWzBdO1xuICAgICAgICBwcmV2Q3RybCA9IHNsaWRlci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVByZXZDdHJsKVswXTtcbiAgICAgICAgbmV4dEN0cmwgPSBzbGlkZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVOZXh0Q3RybClbMF07XG5cbiAgICAgICAgcG9zaXRpb24gPSB7XG4gICAgICAgICAgICB4OiBzbGlkZUNvbnRhaW5lci5vZmZzZXRMZWZ0LFxuICAgICAgICAgICAgeTogc2xpZGVDb250YWluZXIub2Zmc2V0VG9wXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5maW5pdGUpIHtcbiAgICAgICAgICAgIHNsaWRlcyA9IHNldHVwSW5maW5pdGUoc2xpY2UuY2FsbChzbGlkZUNvbnRhaW5lci5jaGlsZHJlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2xpZGVzID0gc2xpY2UuY2FsbChzbGlkZUNvbnRhaW5lci5jaGlsZHJlbik7XG5cbiAgICAgICAgICAgIGlmIChwcmV2Q3RybCAmJiAhb3B0aW9ucy5yZXdpbmRQcmV2KSB7XG4gICAgICAgICAgICAgICAgcHJldkN0cmwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVEaXNhYmxlZFByZXZDdHJsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5leHRDdHJsICYmIHNsaWRlcy5sZW5ndGggPT09IDEgJiYgIW9wdGlvbnMucmV3aW5kKSB7XG4gICAgICAgICAgICAgICAgbmV4dEN0cmwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVEaXNhYmxlZE5leHRDdHJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc2V0KCk7XG5cbiAgICAgICAgaWYgKGNsYXNzTmFtZUFjdGl2ZVNsaWRlKSB7XG4gICAgICAgICAgICBzZXRBY3RpdmVFbGVtZW50KHNsaWRlcywgaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZDdHJsICYmIG5leHRDdHJsKSB7XG4gICAgICAgICAgICBwcmV2Q3RybC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHByZXYpO1xuICAgICAgICAgICAgbmV4dEN0cmwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBuZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoc3RhcnQsIHRvdWNoRXZlbnRQYXJhbXMpO1xuXG4gICAgICAgIGlmIChlbmFibGVNb3VzZUV2ZW50cykge1xuICAgICAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Ub3VjaHN0YXJ0KTtcbiAgICAgICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7XG5cbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYWZ0ZXInLCAnaW5pdCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB1YmxpY1xuICAgICAqIHJlc2V0IGZ1bmN0aW9uOiBjYWxsZWQgb24gcmVzaXplXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIHZhciBfb3B0aW9uczUgPSBvcHRpb25zLFxuICAgICAgICAgICAgaW5maW5pdGUgPSBfb3B0aW9uczUuaW5maW5pdGUsXG4gICAgICAgICAgICBlYXNlID0gX29wdGlvbnM1LmVhc2UsXG4gICAgICAgICAgICByZXdpbmRTcGVlZCA9IF9vcHRpb25zNS5yZXdpbmRTcGVlZCxcbiAgICAgICAgICAgIHJld2luZE9uUmVzaXplID0gX29wdGlvbnM1LnJld2luZE9uUmVzaXplLFxuICAgICAgICAgICAgY2xhc3NOYW1lQWN0aXZlU2xpZGUgPSBfb3B0aW9uczUuY2xhc3NOYW1lQWN0aXZlU2xpZGUsXG4gICAgICAgICAgICBpbml0aWFsSW5kZXggPSBfb3B0aW9uczUuaW5pdGlhbEluZGV4O1xuXG5cbiAgICAgICAgc2xpZGVzV2lkdGggPSBlbGVtZW50V2lkdGgoc2xpZGVDb250YWluZXIpO1xuICAgICAgICBmcmFtZVdpZHRoID0gZWxlbWVudFdpZHRoKGZyYW1lKTtcblxuICAgICAgICBpZiAoZnJhbWVXaWR0aCA9PT0gc2xpZGVzV2lkdGgpIHtcbiAgICAgICAgICAgIHNsaWRlc1dpZHRoID0gc2xpZGVzLnJlZHVjZShmdW5jdGlvbiAocHJldmlvdXNWYWx1ZSwgc2xpZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNWYWx1ZSArIGVsZW1lbnRXaWR0aChzbGlkZSk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXdpbmRPblJlc2l6ZSkge1xuICAgICAgICAgICAgaW5kZXggPSBpbml0aWFsSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlYXNlID0gbnVsbDtcbiAgICAgICAgICAgIHJld2luZFNwZWVkID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZpbml0ZSkge1xuICAgICAgICAgICAgdHJhbnNsYXRlKHNsaWRlc1tpbmRleCArIGluZmluaXRlXS5vZmZzZXRMZWZ0ICogLTEsIDAsIG51bGwpO1xuXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgaW5maW5pdGU7XG4gICAgICAgICAgICBwb3NpdGlvbi54ID0gc2xpZGVzW2luZGV4XS5vZmZzZXRMZWZ0ICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFuc2xhdGUoc2xpZGVzW2luZGV4XS5vZmZzZXRMZWZ0ICogLTEsIHJld2luZFNwZWVkLCBlYXNlKTtcbiAgICAgICAgICAgIHBvc2l0aW9uLnggPSBzbGlkZXNbaW5kZXhdLm9mZnNldExlZnQgKiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbGFzc05hbWVBY3RpdmVTbGlkZSkge1xuICAgICAgICAgICAgc2V0QWN0aXZlRWxlbWVudChzbGljZS5jYWxsKHNsaWRlcyksIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB1YmxpY1xuICAgICAqIHNsaWRlVG86IGNhbGxlZCBvbiBjbGlja2hhbmRsZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGlkZVRvKGluZGV4KSB7XG4gICAgICAgIHNsaWRlKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdWJsaWNcbiAgICAgKiByZXR1cm5JbmRleCBmdW5jdGlvbjogY2FsbGVkIG9uIGNsaWNraGFuZGxlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldHVybkluZGV4KCkge1xuICAgICAgICByZXR1cm4gaW5kZXggLSBvcHRpb25zLmluZmluaXRlIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVibGljXG4gICAgICogcHJldiBmdW5jdGlvbjogY2FsbGVkIG9uIGNsaWNraGFuZGxlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByZXYoKSB7XG4gICAgICAgIHNsaWRlKGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVibGljXG4gICAgICogbmV4dCBmdW5jdGlvbjogY2FsbGVkIG9uIGNsaWNraGFuZGxlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIHNsaWRlKGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdWJsaWNcbiAgICAgKiBkZXN0cm95IGZ1bmN0aW9uOiBjYWxsZWQgdG8gZ3JhY2VmdWxseSBkZXN0cm95IHRoZSBsb3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYmVmb3JlJywgJ2Rlc3Ryb3knKTtcblxuICAgICAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIocHJlZml4ZXMudHJhbnNpdGlvbkVuZCwgb25UcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hzdGFydCwgdG91Y2hFdmVudFBhcmFtcyk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2htb3ZlLCB0b3VjaEV2ZW50UGFyYW1zKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Ub3VjaG1vdmUpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvblRvdWNoc3RhcnQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Ub3VjaGVuZCk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrKTtcblxuICAgICAgICBvcHRpb25zLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZSk7XG5cbiAgICAgICAgaWYgKHByZXZDdHJsKSB7XG4gICAgICAgICAgICBwcmV2Q3RybC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHByZXYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRDdHJsKSB7XG4gICAgICAgICAgICBuZXh0Q3RybC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNsb25lZCBzbGlkZXMgaWYgaW5maW5pdGUgaXMgc2V0XG4gICAgICAgIGlmIChvcHRpb25zLmluZmluaXRlKSB7XG4gICAgICAgICAgICBBcnJheS5hcHBseShudWxsLCBBcnJheShvcHRpb25zLmluZmluaXRlKSkuZm9yRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2xpZGVDb250YWluZXIucmVtb3ZlQ2hpbGQoc2xpZGVDb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgc2xpZGVDb250YWluZXIucmVtb3ZlQ2hpbGQoc2xpZGVDb250YWluZXIubGFzdENoaWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYWZ0ZXInLCAnZGVzdHJveScpO1xuICAgIH1cblxuICAgIC8vIGV2ZW50IGhhbmRsaW5nXG5cbiAgICB2YXIgdG91Y2hPZmZzZXQgPSB2b2lkIDA7XG4gICAgdmFyIGRlbHRhID0gdm9pZCAwO1xuICAgIHZhciBpc1Njcm9sbGluZyA9IHZvaWQgMDtcblxuICAgIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZCgpIHtcbiAgICAgICAgaWYgKHRyYW5zaXRpb25FbmRDYWxsYmFjaykge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrKCk7XG5cbiAgICAgICAgICAgIHRyYW5zaXRpb25FbmRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hzdGFydChldmVudCkge1xuICAgICAgICB2YXIgX29wdGlvbnM2ID0gb3B0aW9ucyxcbiAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzID0gX29wdGlvbnM2LmVuYWJsZU1vdXNlRXZlbnRzO1xuXG4gICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcblxuICAgICAgICBpZiAoZW5hYmxlTW91c2VFdmVudHMpIHtcbiAgICAgICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uVG91Y2htb3ZlKTtcbiAgICAgICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2htb3ZlLCB0b3VjaEV2ZW50UGFyYW1zKTtcbiAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoZW5kKTtcblxuICAgICAgICB2YXIgcGFnZVggPSB0b3VjaGVzLnBhZ2VYLFxuICAgICAgICAgICAgcGFnZVkgPSB0b3VjaGVzLnBhZ2VZO1xuXG5cbiAgICAgICAgdG91Y2hPZmZzZXQgPSB7XG4gICAgICAgICAgICB4OiBwYWdlWCxcbiAgICAgICAgICAgIHk6IHBhZ2VZLFxuICAgICAgICAgICAgdGltZTogRGF0ZS5ub3coKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlzU2Nyb2xsaW5nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRlbHRhID0ge307XG5cbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnb24nLCAndG91Y2hzdGFydCcsIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNobW92ZShldmVudCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgICAgIHZhciBwYWdlWCA9IHRvdWNoZXMucGFnZVgsXG4gICAgICAgICAgICBwYWdlWSA9IHRvdWNoZXMucGFnZVk7XG5cblxuICAgICAgICBkZWx0YSA9IHtcbiAgICAgICAgICAgIHg6IHBhZ2VYIC0gdG91Y2hPZmZzZXQueCxcbiAgICAgICAgICAgIHk6IHBhZ2VZIC0gdG91Y2hPZmZzZXQueVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgaXNTY3JvbGxpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpc1Njcm9sbGluZyA9ICEhKGlzU2Nyb2xsaW5nIHx8IE1hdGguYWJzKGRlbHRhLngpIDwgTWF0aC5hYnMoZGVsdGEueSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZyAmJiB0b3VjaE9mZnNldCkge1xuICAgICAgICAgICAgdHJhbnNsYXRlKHBvc2l0aW9uLnggKyBkZWx0YS54LCAwLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1heSBiZVxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdvbicsICd0b3VjaG1vdmUnLCB7XG4gICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaGVuZChldmVudCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogdGltZSBiZXR3ZWVuIHRvdWNoc3RhcnQgYW5kIHRvdWNoZW5kIGluIG1pbGxpc2Vjb25kc1xuICAgICAgICAgKiBAZHVyYXRpb24ge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IHRvdWNoT2Zmc2V0ID8gRGF0ZS5ub3coKSAtIHRvdWNoT2Zmc2V0LnRpbWUgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlzIHZhbGlkIGlmOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtPiBzd2lwZSBhdHRlbXB0IHRpbWUgaXMgb3ZlciAzMDAgbXNcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIC0+IHN3aXBlIGRpc3RhbmNlIGlzIGdyZWF0ZXIgdGhhbiAyNXB4XG4gICAgICAgICAqIG9yXG4gICAgICAgICAqIC0+IHN3aXBlIGRpc3RhbmNlIGlzIG1vcmUgdGhlbiBhIHRoaXJkIG9mIHRoZSBzd2lwZSBhcmVhXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpc1ZhbGlkU2xpZGUge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB2YXIgaXNWYWxpZCA9IE51bWJlcihkdXJhdGlvbikgPCAzMDAgJiYgTWF0aC5hYnMoZGVsdGEueCkgPiAyNSB8fCBNYXRoLmFicyhkZWx0YS54KSA+IGZyYW1lV2lkdGggLyAzO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpcyBvdXQgb2YgYm91bmRzIGlmOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtPiBpbmRleCBpcyAwIGFuZCBkZWx0YSB4IGlzIGdyZWF0ZXIgdGhhbiAwXG4gICAgICAgICAqIG9yXG4gICAgICAgICAqIC0+IGluZGV4IGlzIHRoZSBsYXN0IHNsaWRlIGFuZCBkZWx0YSBpcyBzbWFsbGVyIHRoYW4gMFxuICAgICAgICAgKlxuICAgICAgICAgKiBAaXNPdXRPZkJvdW5kcyB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHZhciBpc091dE9mQm91bmRzID0gIWluZGV4ICYmIGRlbHRhLnggPiAwIHx8IGluZGV4ID09PSBzbGlkZXMubGVuZ3RoIC0gMSAmJiBkZWx0YS54IDwgMDtcblxuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZGVsdGEueCA8IDA7XG5cbiAgICAgICAgaWYgKCFpc1Njcm9sbGluZykge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQgJiYgIWlzT3V0T2ZCb3VuZHMpIHtcbiAgICAgICAgICAgICAgICBzbGlkZShmYWxzZSwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlKHBvc2l0aW9uLngsIG9wdGlvbnMuc25hcEJhY2tTcGVlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0b3VjaE9mZnNldCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogcmVtb3ZlIGV2ZW50bGlzdGVuZXJzIGFmdGVyIHN3aXBlIGF0dGVtcHRcbiAgICAgICAgICovXG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2htb3ZlKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Ub3VjaG1vdmUpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Ub3VjaGVuZCk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblRvdWNoZW5kKTtcblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdvbicsICd0b3VjaGVuZCcsIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmIChkZWx0YS54KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25SZXNpemUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGZyYW1lV2lkdGggIT09IGVsZW1lbnRXaWR0aChmcmFtZSkpIHtcbiAgICAgICAgICAgIHJlc2V0KCk7XG5cbiAgICAgICAgICAgIGRpc3BhdGNoU2xpZGVyRXZlbnQoJ29uJywgJ3Jlc2l6ZScsIHtcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlciBpbml0aWFsIHNldHVwXG4gICAgc2V0dXAoKTtcblxuICAgIC8vIGV4cG9zZSBwdWJsaWMgYXBpXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dXA6IHNldHVwLFxuICAgICAgICByZXNldDogcmVzZXQsXG4gICAgICAgIHNsaWRlVG86IHNsaWRlVG8sXG4gICAgICAgIHJldHVybkluZGV4OiByZXR1cm5JbmRleCxcbiAgICAgICAgcHJldjogcHJldixcbiAgICAgICAgbmV4dDogbmV4dCxcbiAgICAgICAgZGVzdHJveTogZGVzdHJveVxuICAgIH07XG59XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZXRlY3RQcmVmaXhlcztcbi8qKlxuICogRGV0ZWN0aW5nIHByZWZpeGVzIGZvciBzYXZpbmcgdGltZSBhbmQgYnl0ZXNcbiAqL1xuZnVuY3Rpb24gZGV0ZWN0UHJlZml4ZXMoKSB7XG4gICAgdmFyIHRyYW5zZm9ybSA9IHZvaWQgMDtcbiAgICB2YXIgdHJhbnNpdGlvbiA9IHZvaWQgMDtcbiAgICB2YXIgdHJhbnNpdGlvbkVuZCA9IHZvaWQgMDtcblxuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ18nKTtcbiAgICAgICAgdmFyIHN0eWxlID0gZWwuc3R5bGU7XG5cbiAgICAgICAgdmFyIHByb3AgPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKHN0eWxlW3Byb3AgPSAnd2Via2l0VHJhbnNpdGlvbiddID09PSAnJykge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZCA9ICd3ZWJraXRUcmFuc2l0aW9uRW5kJztcbiAgICAgICAgICAgIHRyYW5zaXRpb24gPSBwcm9wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0eWxlW3Byb3AgPSAndHJhbnNpdGlvbiddID09PSAnJykge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZCA9ICd0cmFuc2l0aW9uZW5kJztcbiAgICAgICAgICAgIHRyYW5zaXRpb24gPSBwcm9wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0eWxlW3Byb3AgPSAnd2Via2l0VHJhbnNmb3JtJ10gPT09ICcnKSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm0gPSBwcm9wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0eWxlW3Byb3AgPSAnbXNUcmFuc2Zvcm0nXSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVbcHJvcCA9ICd0cmFuc2Zvcm0nXSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShlbCwgbnVsbCk7XG4gICAgICAgIHN0eWxlW3RyYW5zZm9ybV0gPSAndHJhbnNsYXRlWCgwKSc7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH0pKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbixcbiAgICAgICAgdHJhbnNpdGlvbkVuZDogdHJhbnNpdGlvbkVuZFxuICAgIH07XG59XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZXRlY3RTdXBwb3J0c1Bhc3NpdmU7XG5mdW5jdGlvbiBkZXRlY3RTdXBwb3J0c1Bhc3NpdmUoKSB7XG4gICAgdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgc3VwcG9ydHNQYXNzaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIG9wdHMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICByZXR1cm4gc3VwcG9ydHNQYXNzaXZlO1xufVxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZGlzcGF0Y2hFdmVudDtcblxudmFyIF9jdXN0b21FdmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbnZhciBfY3VzdG9tRXZlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3VzdG9tRXZlbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIGRpc3BhdGNoIGN1c3RvbSBldmVudHNcbiAqXG4gKiBAcGFyYW0gIHtlbGVtZW50fSBlbCAgICAgICAgIHNsaWRlc2hvdyBlbGVtZW50XG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0eXBlICAgICAgIGN1c3RvbSBldmVudCBuYW1lXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBkZXRhaWwgICAgIGN1c3RvbSBkZXRhaWwgaW5mb3JtYXRpb25cbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCh0YXJnZXQsIHR5cGUsIGRldGFpbCkge1xuICAgIHZhciBldmVudCA9IG5ldyBfY3VzdG9tRXZlbnQyLmRlZmF1bHQodHlwZSwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IGRldGFpbFxuICAgIH0pO1xuXG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKGdsb2JhbCkge1xudmFyIE5hdGl2ZUN1c3RvbUV2ZW50ID0gZ2xvYmFsLkN1c3RvbUV2ZW50O1xuXG5mdW5jdGlvbiB1c2VOYXRpdmUgKCkge1xuICB0cnkge1xuICAgIHZhciBwID0gbmV3IE5hdGl2ZUN1c3RvbUV2ZW50KCdjYXQnLCB7IGRldGFpbDogeyBmb286ICdiYXInIH0gfSk7XG4gICAgcmV0dXJuICAnY2F0JyA9PT0gcC50eXBlICYmICdiYXInID09PSBwLmRldGFpbC5mb287XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3Jvc3MtYnJvd3NlciBgQ3VzdG9tRXZlbnRgIGNvbnN0cnVjdG9yLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudC5DdXN0b21FdmVudFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVzZU5hdGl2ZSgpID8gTmF0aXZlQ3VzdG9tRXZlbnQgOlxuXG4vLyBJRSA+PSA5XG4ndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGRvY3VtZW50ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA/IGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gIH0gZWxzZSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCB2b2lkIDApO1xuICB9XG4gIHJldHVybiBlO1xufSA6XG5cbi8vIElFIDw9IDhcbmZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICBlLnR5cGUgPSB0eXBlO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5idWJibGVzID0gQm9vbGVhbihwYXJhbXMuYnViYmxlcyk7XG4gICAgZS5jYW5jZWxhYmxlID0gQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSk7XG4gICAgZS5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICB9IGVsc2Uge1xuICAgIGUuYnViYmxlcyA9IGZhbHNlO1xuICAgIGUuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIGUuZGV0YWlsID0gdm9pZCAwO1xuICB9XG4gIHJldHVybiBlO1xufVxuXG4vKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi99LmNhbGwoZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyg1KSkpXG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIC8qKlxuICAgKiBzbGlkZXMgc2Nyb2xsZWQgYXQgb25jZVxuICAgKiBAc2xpZGVzVG9TY3JvbGwge051bWJlcn1cbiAgICovXG4gIHNsaWRlc1RvU2Nyb2xsOiAxLFxuXG4gIC8qKlxuICAgKiB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGFuaW1hdGlvbiBvZiBhIHZhbGlkIHNsaWRlIGF0dGVtcHRcbiAgICogQHNsaWRlU3BlZWQge051bWJlcn1cbiAgICovXG4gIHNsaWRlU3BlZWQ6IDMwMCxcblxuICAvKipcbiAgICogdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhbmltYXRpb24gb2YgdGhlIHJld2luZCBhZnRlciB0aGUgbGFzdCBzbGlkZVxuICAgKiBAcmV3aW5kU3BlZWQge051bWJlcn1cbiAgICovXG4gIHJld2luZFNwZWVkOiA2MDAsXG5cbiAgLyoqXG4gICAqIHRpbWUgZm9yIHRoZSBzbmFwQmFjayBvZiB0aGUgc2xpZGVyIGlmIHRoZSBzbGlkZSBhdHRlbXB0IHdhcyBub3QgdmFsaWRcbiAgICogQHNuYXBCYWNrU3BlZWQge051bWJlcn1cbiAgICovXG4gIHNuYXBCYWNrU3BlZWQ6IDIwMCxcblxuICAvKipcbiAgICogQmFzaWMgZWFzaW5nIGZ1bmN0aW9uczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvQ1NTL3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uXG4gICAqIGN1YmljIGJlemllciBlYXNpbmcgZnVuY3Rpb25zOiBodHRwOi8vZWFzaW5ncy5uZXQvZGVcbiAgICogQGVhc2Uge1N0cmluZ31cbiAgICovXG4gIGVhc2U6ICdlYXNlJyxcblxuICAvKipcbiAgICogaWYgc2xpZGVyIHJlYWNoZWQgdGhlIGxhc3Qgc2xpZGUsIHdpdGggbmV4dCBjbGljayB0aGUgc2xpZGVyIGdvZXMgYmFjayB0byB0aGUgc3RhcnRpbmRleC5cbiAgICogdXNlIGluZmluaXRlIG9yIHJld2luZCwgbm90IGJvdGhcbiAgICogQHJld2luZCB7Qm9vbGVhbn1cbiAgICovXG4gIHJld2luZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIG51bWJlciBvZiB2aXNpYmxlIHNsaWRlcyBvciBmYWxzZVxuICAgKiB1c2UgaW5maW5pdGUgb3IgcmV3aW5kLCBub3QgYm90aFxuICAgKiBAaW5maW5pdGUge251bWJlcn1cbiAgICovXG4gIGluZmluaXRlOiBmYWxzZSxcblxuICAvKipcbiAgICogdGhlIHNsaWRlIGluZGV4IHRvIHNob3cgd2hlbiB0aGUgc2xpZGVyIGlzIGluaXRpYWxpemVkLlxuICAgKiBAaW5pdGlhbEluZGV4IHtudW1iZXJ9XG4gICAqL1xuICBpbml0aWFsSW5kZXg6IDAsXG5cbiAgLyoqXG4gICAqIGNsYXNzIG5hbWUgZm9yIHNsaWRlciBmcmFtZVxuICAgKiBAY2xhc3NOYW1lRnJhbWUge3N0cmluZ31cbiAgICovXG4gIGNsYXNzTmFtZUZyYW1lOiAnanNfZnJhbWUnLFxuXG4gIC8qKlxuICAgKiBjbGFzcyBuYW1lIGZvciBzbGlkZXMgY29udGFpbmVyXG4gICAqIEBjbGFzc05hbWVTbGlkZUNvbnRhaW5lciB7c3RyaW5nfVxuICAgKi9cbiAgY2xhc3NOYW1lU2xpZGVDb250YWluZXI6ICdqc19zbGlkZXMnLFxuXG4gIC8qKlxuICAgKiBjbGFzcyBuYW1lIGZvciBzbGlkZXIgcHJldiBjb250cm9sXG4gICAqIEBjbGFzc05hbWVQcmV2Q3RybCB7c3RyaW5nfVxuICAgKi9cbiAgY2xhc3NOYW1lUHJldkN0cmw6ICdqc19wcmV2JyxcblxuICAvKipcbiAgICogY2xhc3MgbmFtZSBmb3Igc2xpZGVyIG5leHQgY29udHJvbFxuICAgKiBAY2xhc3NOYW1lTmV4dEN0cmwge3N0cmluZ31cbiAgICovXG4gIGNsYXNzTmFtZU5leHRDdHJsOiAnanNfbmV4dCcsXG5cbiAgLyoqXG4gICAqIGNsYXNzIG5hbWUgZm9yIGN1cnJlbnQgYWN0aXZlIHNsaWRlXG4gICAqIGlmIGVtcHR5U3RyaW5nIHRoZW4gbm8gY2xhc3MgaXMgc2V0XG4gICAqIEBjbGFzc05hbWVBY3RpdmVTbGlkZSB7c3RyaW5nfVxuICAgKi9cbiAgY2xhc3NOYW1lQWN0aXZlU2xpZGU6ICdhY3RpdmUnLFxuXG4gIC8qKlxuICAgKiBlbmFibGVzIG1vdXNlIGV2ZW50cyBmb3Igc3dpcGluZyBvbiBkZXNrdG9wIGRldmljZXNcbiAgICogQGVuYWJsZU1vdXNlRXZlbnRzIHtib29sZWFufVxuICAgKi9cbiAgZW5hYmxlTW91c2VFdmVudHM6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiB3aW5kb3cgaW5zdGFuY2VcbiAgICogQHdpbmRvdyB7b2JqZWN0fVxuICAgKi9cbiAgd2luZG93OiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IG51bGwsXG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBzbGlkZXMgbG9yeSB0byB0aGUgZmlyc3Qgc2xpZGUgb24gd2luZG93IHJlc2l6ZS5cbiAgICogQHJld2luZE9uUmVzaXplIHtib29sZWFufVxuICAgKi9cbiAgcmV3aW5kT25SZXNpemU6IHRydWVcbn07XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiaWYgKHdpbmRvdy5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHtcclxuICAgIE5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7XHJcbiAgICAgICAgdGhpc0FyZyA9IHRoaXNBcmcgfHwgd2luZG93O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXNbaV0sIGksIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6ICdSRkMzOTg2JyxcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dQcm90b3R5cGVzOiBmYWxzZSxcbiAgICBhcnJheUxpbWl0OiAyMCxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgY29tbWE6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBpZ25vcmVRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiBmYWxzZSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwYXJzZUFycmF5czogdHJ1ZSxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBpbnRlcnByZXROdW1lcmljRW50aXRpZXMgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcXGQrKTsvZywgZnVuY3Rpb24gKCQwLCBudW1iZXJTdHIpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtYmVyU3RyLCAxMCkpO1xuICAgIH0pO1xufTtcblxuLy8gVGhpcyBpcyB3aGF0IGJyb3dzZXJzIHdpbGwgc3VibWl0IHdoZW4gdGhlIOKckyBjaGFyYWN0ZXIgb2NjdXJzIGluIGFuXG4vLyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgYm9keSBhbmQgdGhlIGVuY29kaW5nIG9mIHRoZSBwYWdlIGNvbnRhaW5pbmdcbi8vIHRoZSBmb3JtIGlzIGlzby04ODU5LTEsIG9yIHdoZW4gdGhlIHN1Ym1pdHRlZCBmb3JtIGhhcyBhbiBhY2NlcHQtY2hhcnNldFxuLy8gYXR0cmlidXRlIG9mIGlzby04ODU5LTEuIFByZXN1bWFibHkgYWxzbyB3aXRoIG90aGVyIGNoYXJzZXRzIHRoYXQgZG8gbm90IGNvbnRhaW5cbi8vIHRoZSDinJMgY2hhcmFjdGVyLCBzdWNoIGFzIHVzLWFzY2lpLlxudmFyIGlzb1NlbnRpbmVsID0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0InOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JylcblxuLy8gVGhlc2UgYXJlIHRoZSBwZXJjZW50LWVuY29kZWQgdXRmLTggb2N0ZXRzIHJlcHJlc2VudGluZyBhIGNoZWNrbWFyaywgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGlzIHV0Zi04IGVuY29kZWQuXG52YXIgY2hhcnNldFNlbnRpbmVsID0gJ3V0Zjg9JUUyJTlDJTkzJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuXG52YXIgcGFyc2VWYWx1ZXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nVmFsdWVzKHN0ciwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSB7fTtcbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgdmFyIGxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gSW5maW5pdHkgPyB1bmRlZmluZWQgOiBvcHRpb25zLnBhcmFtZXRlckxpbWl0O1xuICAgIHZhciBwYXJ0cyA9IGNsZWFuU3RyLnNwbGl0KG9wdGlvbnMuZGVsaW1pdGVyLCBsaW1pdCk7XG4gICAgdmFyIHNraXBJbmRleCA9IC0xOyAvLyBLZWVwIHRyYWNrIG9mIHdoZXJlIHRoZSB1dGY4IHNlbnRpbmVsIHdhcyBmb3VuZFxuICAgIHZhciBpO1xuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQ7XG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHBhcnRzW2ldLmluZGV4T2YoJ3V0Zjg9JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydHNbaV0gPT09IGNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ3V0Zi04JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRzW2ldID09PSBpc29TZW50aW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gJ2lzby04ODU5LTEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGkgPSBwYXJ0cy5sZW5ndGg7IC8vIFRoZSBlc2xpbnQgc2V0dGluZ3MgZG8gbm90IGFsbG93IGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpID09PSBza2lwSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XG5cbiAgICAgICAgdmFyIGJyYWNrZXRFcXVhbHNQb3MgPSBwYXJ0LmluZGV4T2YoJ109Jyk7XG4gICAgICAgIHZhciBwb3MgPSBicmFja2V0RXF1YWxzUG9zID09PSAtMSA/IHBhcnQuaW5kZXhPZignPScpIDogYnJhY2tldEVxdWFsc1BvcyArIDE7XG5cbiAgICAgICAgdmFyIGtleSwgdmFsO1xuICAgICAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKHBvcyArIDEpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgJiYgb3B0aW9ucy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgJiYgY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICB2YWwgPSBpbnRlcnByZXROdW1lcmljRW50aXRpZXModmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhcy5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB1dGlscy5jb21iaW5lKG9ialtrZXldLCB2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIHBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKGNoYWluLCB2YWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGVhZiA9IHZhbDtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbY2xlYW5Sb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5cyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zKTtcbn07XG5cbnZhciBub3JtYWxpemVQYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVjb2RlciAhPT0gbnVsbCAmJiBvcHRzLmRlY29kZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhcnJheUxpbWl0OiB0eXBlb2Ygb3B0cy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWE6IHR5cGVvZiBvcHRzLmNvbW1hID09PSAnYm9vbGVhbicgPyBvcHRzLmNvbW1hIDogZGVmYXVsdHMuY29tbWEsXG4gICAgICAgIGRlY29kZXI6IHR5cGVvZiBvcHRzLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0cy5kZWxpbWl0ZXIpID8gb3B0cy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGRlcHRoOiB0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ251bWJlcicgPyBvcHRzLmRlcHRoIDogZGVmYXVsdHMuZGVwdGgsXG4gICAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBvcHRzLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlLFxuICAgICAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IHR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgOiBkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMsXG4gICAgICAgIHBhcmFtZXRlckxpbWl0OiB0eXBlb2Ygb3B0cy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQsXG4gICAgICAgIHBhcnNlQXJyYXlzOiBvcHRzLnBhcnNlQXJyYXlzICE9PSBmYWxzZSxcbiAgICAgICAgcGxhaW5PYmplY3RzOiB0eXBlb2Ygb3B0cy5wbGFpbk9iamVjdHMgPT09ICdib29sZWFuJyA/IG9wdHMucGxhaW5PYmplY3RzIDogZGVmYXVsdHMucGxhaW5PYmplY3RzLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyLCBvcHRzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cyk7XG5cbiAgICBpZiAoc3RyID09PSAnJyB8fCBzdHIgPT09IG51bGwgfHwgdHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIH1cblxuICAgIHZhciB0ZW1wT2JqID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIDogc3RyO1xuICAgIHZhciBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBhbmQgc2V0dXAgdGhlIG5ldyBvYmplY3RcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGVtcE9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICB2YXIgbmV3T2JqID0gcGFyc2VLZXlzKGtleSwgdGVtcE9ialtrZXldLCBvcHRpb25zKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5jb21wYWN0KG9iaik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRzWydkZWZhdWx0J11dLFxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0XG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IG9iai5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChwcmVmaXgsIGtleSkgOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICAgICAgY2hhcnNldFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICBwcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgICAgICBjaGFyc2V0XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG52YXIgbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5jb2RlciAhPT0gbnVsbCAmJiBvcHRzLmVuY29kZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgZGVmYXVsdHMuY2hhcnNldDtcbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICBpZiAodHlwZW9mIG9wdHMuZm9ybWF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoIWhhcy5jYWxsKGZvcm1hdHMuZm9ybWF0dGVycywgb3B0cy5mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGZvcm1hdCBvcHRpb24gcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0ID0gb3B0cy5mb3JtYXQ7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcblxuICAgIHZhciBmaWx0ZXIgPSBkZWZhdWx0cy5maWx0ZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0FycmF5KG9wdHMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRzLmRlbGltaXRlcixcbiAgICAgICAgZW5jb2RlOiB0eXBlb2Ygb3B0cy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlLFxuICAgICAgICBlbmNvZGVyOiB0eXBlb2Ygb3B0cy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcixcbiAgICAgICAgZW5jb2RlVmFsdWVzT25seTogdHlwZW9mIG9wdHMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAob3B0cyAmJiAnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gJ2luZGljZXMnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW2FycmF5Rm9ybWF0XTtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgb3B0aW9ucy5za2lwTnVsbHMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXRcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKSwgdGhlIFwibnVtZXJpYyBlbnRpdHlcIiByZXByZXNlbnRhdGlvbiBvZiBhIGNoZWNrbWFya1xuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JUUyJTlDJTkzJic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCkge1xuICAgIC8vIFRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEJyaWFuIFdoaXRlIChtc2NkZXgpIGZvciB0aGUgaW8uanMgY29yZSBxdWVyeXN0cmluZyBsaWJyYXJ5LlxuICAgIC8vIEl0IGhhcyBiZWVuIGFkYXB0ZWQgaGVyZSBmb3Igc3RyaWN0ZXIgYWRoZXJlbmNlIHRvIFJGQyAzOTg2XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICB2YXIgc3RyaW5nID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBzdHIgOiBTdHJpbmcoc3RyKTtcblxuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyV1WzAtOWEtZl17NH0vZ2ksIGZ1bmN0aW9uICgkMCkge1xuICAgICAgICAgICAgcmV0dXJuICclMjYlMjMnICsgcGFyc2VJbnQoJDAuc2xpY2UoMiksIDE2KSArICclM0InO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFjdFF1ZXVlKHF1ZXVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxudmFyIGNvbWJpbmUgPSBmdW5jdGlvbiBjb21iaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGEsIGIpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCI7LyohIHNob3dkb3duIHYgMi4xLjAgLSAyMS0wNC0yMDIyICovXHJcbihmdW5jdGlvbigpe1xyXG4vKipcbiAqIENyZWF0ZWQgYnkgVGl2aWUgb24gMTMtMDctMjAxNS5cbiAqL1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0cyAoc2ltcGxlKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgb21pdEV4dHJhV0xJbkNvZGVCbG9ja3M6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ09taXQgdGhlIGRlZmF1bHQgZXh0cmEgd2hpdGVsaW5lIGFkZGVkIHRvIGNvZGUgYmxvY2tzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgbm9IZWFkZXJJZDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVHVybiBvbi9vZmYgZ2VuZXJhdGVkIGhlYWRlciBpZCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHByZWZpeEhlYWRlcklkOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdBZGQgYSBwcmVmaXggdG8gdGhlIGdlbmVyYXRlZCBoZWFkZXIgaWRzLiBQYXNzaW5nIGEgc3RyaW5nIHdpbGwgcHJlZml4IHRoYXQgc3RyaW5nIHRvIHRoZSBoZWFkZXIgaWQuIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGFkZCBhIGdlbmVyaWMgXFwnc2VjdGlvbi1cXCcgcHJlZml4JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgfSxcbiAgICByYXdQcmVmaXhIZWFkZXJJZDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnU2V0dGluZyB0aGlzIG9wdGlvbiB0byB0cnVlIHdpbGwgcHJldmVudCBzaG93ZG93biBmcm9tIG1vZGlmeWluZyB0aGUgcHJlZml4LiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiBtYWxmb3JtZWQgSURzIChpZiwgZm9yIGluc3RhbmNlLCB0aGUgXCIgY2hhciBpcyB1c2VkIGluIHRoZSBwcmVmaXgpJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZ2hDb21wYXRpYmxlSGVhZGVySWQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0dlbmVyYXRlIGhlYWRlciBpZHMgY29tcGF0aWJsZSB3aXRoIGdpdGh1YiBzdHlsZSAoc3BhY2VzIGFyZSByZXBsYWNlZCB3aXRoIGRhc2hlcywgYSBidW5jaCBvZiBub24gYWxwaGFudW1lcmljIGNoYXJzIGFyZSByZW1vdmVkKScsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHJhd0hlYWRlcklkOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdSZW1vdmUgb25seSBzcGFjZXMsIFxcJyBhbmQgXCIgZnJvbSBnZW5lcmF0ZWQgaGVhZGVyIGlkcyAoaW5jbHVkaW5nIHByZWZpeGVzKSwgcmVwbGFjaW5nIHRoZW0gd2l0aCBkYXNoZXMgKC0pLiBXQVJOSU5HOiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiBtYWxmb3JtZWQgaWRzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgaGVhZGVyTGV2ZWxTdGFydDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVGhlIGhlYWRlciBibG9ja3MgbGV2ZWwgc3RhcnQnLFxuICAgICAgdHlwZTogJ2ludGVnZXInXG4gICAgfSxcbiAgICBwYXJzZUltZ0RpbWVuc2lvbnM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1R1cm4gb24vb2ZmIGltYWdlIGRpbWVuc2lvbiBwYXJzaW5nJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc2ltcGxpZmllZEF1dG9MaW5rOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdUdXJuIG9uL29mZiBHRk0gYXV0b2xpbmsgc3R5bGUnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBleGNsdWRlVHJhaWxpbmdQdW5jdHVhdGlvbkZyb21VUkxzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdFeGNsdWRlcyB0cmFpbGluZyBwdW5jdHVhdGlvbiBmcm9tIGxpbmtzIGdlbmVyYXRlZCB3aXRoIGF1dG9MaW5raW5nJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgbGl0ZXJhbE1pZFdvcmRVbmRlcnNjb3Jlczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnUGFyc2UgbWlkd29yZCB1bmRlcnNjb3JlcyBhcyBsaXRlcmFsIHVuZGVyc2NvcmVzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgbGl0ZXJhbE1pZFdvcmRBc3Rlcmlza3M6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1BhcnNlIG1pZHdvcmQgYXN0ZXJpc2tzIGFzIGxpdGVyYWwgYXN0ZXJpc2tzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc3RyaWtldGhyb3VnaDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVHVybiBvbi9vZmYgc3RyaWtldGhyb3VnaCBzdXBwb3J0JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgdGFibGVzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdUdXJuIG9uL29mZiB0YWJsZXMgc3VwcG9ydCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHRhYmxlc0hlYWRlcklkOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdBZGQgYW4gaWQgdG8gdGFibGUgaGVhZGVycycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGdoQ29kZUJsb2Nrczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgZGVzY3JpYmU6ICdUdXJuIG9uL29mZiBHRk0gZmVuY2VkIGNvZGUgYmxvY2tzIHN1cHBvcnQnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICB0YXNrbGlzdHM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1R1cm4gb24vb2ZmIEdGTSB0YXNrbGlzdCBzdXBwb3J0JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc21vb3RoTGl2ZVByZXZpZXc6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1ByZXZlbnRzIHdlaXJkIGVmZmVjdHMgaW4gbGl2ZSBwcmV2aWV3cyBkdWUgdG8gaW5jb21wbGV0ZSBpbnB1dCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHNtYXJ0SW5kZW50YXRpb25GaXg6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1RyaWVzIHRvIHNtYXJ0bHkgZml4IGluZGVudGF0aW9uIGluIGVzNiBzdHJpbmdzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdEaXNhYmxlcyB0aGUgcmVxdWlyZW1lbnQgb2YgaW5kZW50aW5nIG5lc3RlZCBzdWJsaXN0cyBieSA0IHNwYWNlcycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHNpbXBsZUxpbmVCcmVha3M6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1BhcnNlcyBzaW1wbGUgbGluZSBicmVha3MgYXMgPGJyPiAoR0ZNIFN0eWxlKScsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHJlcXVpcmVTcGFjZUJlZm9yZUhlYWRpbmdUZXh0OiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdNYWtlcyBhZGRpbmcgYSBzcGFjZSBiZXR3ZWVuIGAjYCBhbmQgdGhlIGhlYWRlciB0ZXh0IG1hbmRhdG9yeSAoR0ZNIFN0eWxlKScsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGdoTWVudGlvbnM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0VuYWJsZXMgZ2l0aHViIEBtZW50aW9ucycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGdoTWVudGlvbnNMaW5rOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6ICdodHRwczovL2dpdGh1Yi5jb20ve3V9JyxcbiAgICAgIGRlc2NyaWJlOiAnQ2hhbmdlcyB0aGUgbGluayBnZW5lcmF0ZWQgYnkgQG1lbnRpb25zLiBPbmx5IGFwcGxpZXMgaWYgZ2hNZW50aW9ucyBvcHRpb24gaXMgZW5hYmxlZC4nLFxuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9LFxuICAgIGVuY29kZUVtYWlsczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgZGVzY3JpYmU6ICdFbmNvZGUgZS1tYWlsIGFkZHJlc3NlcyB0aHJvdWdoIHRoZSB1c2Ugb2YgQ2hhcmFjdGVyIEVudGl0aWVzLCB0cmFuc2Zvcm1pbmcgQVNDSUkgZS1tYWlsIGFkZHJlc3NlcyBpbnRvIGl0cyBlcXVpdmFsZW50IGRlY2ltYWwgZW50aXRpZXMnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBvcGVuTGlua3NJbk5ld1dpbmRvdzoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnT3BlbiBhbGwgbGlua3MgaW4gbmV3IHdpbmRvd3MnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBiYWNrc2xhc2hFc2NhcGVzSFRNTFRhZ3M6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1N1cHBvcnQgZm9yIEhUTUwgVGFnIGVzY2FwaW5nLiBleDogXFw8ZGl2PmZvb1xcPC9kaXY+JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZW1vamk6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0VuYWJsZSBlbW9qaSBzdXBwb3J0LiBFeDogYHRoaXMgaXMgYSA6c21pbGU6IGVtb2ppYCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHVuZGVybGluZToge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnRW5hYmxlIHN1cHBvcnQgZm9yIHVuZGVybGluZS4gU3ludGF4IGlzIGRvdWJsZSBvciB0cmlwbGUgdW5kZXJzY29yZXM6IGBfX3VuZGVybGluZSB3b3JkX19gLiBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHVuZGVyc2NvcmVzIG5vIGxvbmdlciBwYXJzZXMgaW50byBgPGVtPmAgYW5kIGA8c3Ryb25nPmAnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBlbGxpcHNpczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgZGVzY3JpYmU6ICdSZXBsYWNlcyB0aHJlZSBkb3RzIHdpdGggdGhlIGVsbGlwc2lzIHVuaWNvZGUgY2hhcmFjdGVyJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgY29tcGxldGVIVE1MRG9jdW1lbnQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ091dHB1dHMgYSBjb21wbGV0ZSBodG1sIGRvY3VtZW50LCBpbmNsdWRpbmcgYDxodG1sPmAsIGA8aGVhZD5gIGFuZCBgPGJvZHk+YCB0YWdzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0VuYWJsZSBzdXBwb3J0IGZvciBkb2N1bWVudCBtZXRhZGF0YSAoZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIGDCq8KrwqtgIGFuZCBgwrvCu8K7YCBvciBiZXR3ZWVuIGAtLS1gIGFuZCBgLS0tYCkuJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc3BsaXRBZGphY2VudEJsb2NrcXVvdGVzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdTcGxpdCBhZGphY2VudCBibG9ja3F1b3RlIGJsb2NrcycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9XG4gIH07XG4gIGlmIChzaW1wbGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdE9wdGlvbnMpKTtcbiAgfVxuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIG9wdCBpbiBkZWZhdWx0T3B0aW9ucykge1xuICAgIGlmIChkZWZhdWx0T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7XG4gICAgICByZXRbb3B0XSA9IGRlZmF1bHRPcHRpb25zW29wdF0uZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBhbGxPcHRpb25zT24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHZhciBvcHRpb25zID0gZ2V0RGVmYXVsdE9wdHModHJ1ZSksXG4gICAgICByZXQgPSB7fTtcbiAgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHQpKSB7XG4gICAgICByZXRbb3B0XSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cclxuLyoqXG4gKiBDcmVhdGVkIGJ5IFRpdmllIG9uIDA2LTAxLTIwMTUuXG4gKi9cblxuLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG52YXIgc2hvd2Rvd24gPSB7fSxcbiAgICBwYXJzZXJzID0ge30sXG4gICAgZXh0ZW5zaW9ucyA9IHt9LFxuICAgIGdsb2JhbE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyh0cnVlKSxcbiAgICBzZXRGbGF2b3IgPSAndmFuaWxsYScsXG4gICAgZmxhdm9yID0ge1xuICAgICAgZ2l0aHViOiB7XG4gICAgICAgIG9taXRFeHRyYVdMSW5Db2RlQmxvY2tzOiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2ltcGxpZmllZEF1dG9MaW5rOiAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBleGNsdWRlVHJhaWxpbmdQdW5jdHVhdGlvbkZyb21VUkxzOiAgIHRydWUsXG4gICAgICAgIGxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXM6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICB0YWJsZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHRhYmxlc0hlYWRlcklkOiAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZ2hDb2RlQmxvY2tzOiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICB0YXNrbGlzdHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGRpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0czogdHJ1ZSxcbiAgICAgICAgc2ltcGxlTGluZUJyZWFrczogICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICByZXF1aXJlU3BhY2VCZWZvcmVIZWFkaW5nVGV4dDogICAgICAgIHRydWUsXG4gICAgICAgIGdoQ29tcGF0aWJsZUhlYWRlcklkOiAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZ2hNZW50aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBiYWNrc2xhc2hFc2NhcGVzSFRNTFRhZ3M6ICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGVtb2ppOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc3BsaXRBZGphY2VudEJsb2NrcXVvdGVzOiAgICAgICAgICAgICB0cnVlXG4gICAgICB9LFxuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgbm9IZWFkZXJJZDogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBnaENvZGVCbG9ja3M6ICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICB9LFxuICAgICAgZ2hvc3Q6IHtcbiAgICAgICAgb21pdEV4dHJhV0xJbkNvZGVCbG9ja3M6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBwYXJzZUltZ0RpbWVuc2lvbnM6ICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNpbXBsaWZpZWRBdXRvTGluazogICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZXhjbHVkZVRyYWlsaW5nUHVuY3R1YXRpb25Gcm9tVVJMczogICB0cnVlLFxuICAgICAgICBsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHN0cmlrZXRocm91Z2g6ICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGFibGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICB0YWJsZXNIZWFkZXJJZDogICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGdoQ29kZUJsb2NrczogICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGFza2xpc3RzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzbW9vdGhMaXZlUHJldmlldzogICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNpbXBsZUxpbmVCcmVha3M6ICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgcmVxdWlyZVNwYWNlQmVmb3JlSGVhZGluZ1RleHQ6ICAgICAgICB0cnVlLFxuICAgICAgICBnaE1lbnRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICBlbmNvZGVFbWFpbHM6ICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgIH0sXG4gICAgICB2YW5pbGxhOiBnZXREZWZhdWx0T3B0cyh0cnVlKSxcbiAgICAgIGFsbE9uOiBhbGxPcHRpb25zT24oKVxuICAgIH07XG5cbi8qKlxuICogaGVscGVyIG5hbWVzcGFjZVxuICogQHR5cGUge3t9fVxuICovXG5zaG93ZG93bi5oZWxwZXIgPSB7fTtcblxuLyoqXG4gKiBUT0RPIExFR0FDWSBTVVBQT1JUIENPREVcbiAqIEB0eXBlIHt7fX1cbiAqL1xuc2hvd2Rvd24uZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIFNldCBhIGdsb2JhbCBvcHRpb25cbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzaG93ZG93bn1cbiAqL1xuc2hvd2Rvd24uc2V0T3B0aW9uID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBnbG9iYWxPcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldCBhIGdsb2JhbCBvcHRpb25cbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHsqfVxuICovXG5zaG93ZG93bi5nZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIGdsb2JhbE9wdGlvbnNba2V5XTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBnbG9iYWwgb3B0aW9uc1xuICogQHN0YXRpY1xuICogQHJldHVybnMge3t9fVxuICovXG5zaG93ZG93bi5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiBnbG9iYWxPcHRpb25zO1xufTtcblxuLyoqXG4gKiBSZXNldCBnbG9iYWwgb3B0aW9ucyB0byB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAqIEBzdGF0aWNcbiAqL1xuc2hvd2Rvd24ucmVzZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIGdsb2JhbE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyh0cnVlKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBmbGF2b3Igc2hvd2Rvd24gc2hvdWxkIHVzZSBhcyBkZWZhdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5zaG93ZG93bi5zZXRGbGF2b3IgPSBmdW5jdGlvbiAobmFtZSkge1xuICAndXNlIHN0cmljdCc7XG4gIGlmICghZmxhdm9yLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgdGhyb3cgRXJyb3IobmFtZSArICcgZmxhdm9yIHdhcyBub3QgZm91bmQnKTtcbiAgfVxuICBzaG93ZG93bi5yZXNldE9wdGlvbnMoKTtcbiAgdmFyIHByZXNldCA9IGZsYXZvcltuYW1lXTtcbiAgc2V0Rmxhdm9yID0gbmFtZTtcbiAgZm9yICh2YXIgb3B0aW9uIGluIHByZXNldCkge1xuICAgIGlmIChwcmVzZXQuaGFzT3duUHJvcGVydHkob3B0aW9uKSkge1xuICAgICAgZ2xvYmFsT3B0aW9uc1tvcHRpb25dID0gcHJlc2V0W29wdGlvbl07XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudGx5IHNldCBmbGF2b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnNob3dkb3duLmdldEZsYXZvciA9IGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gc2V0Rmxhdm9yO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIG9wdGlvbnMgb2YgYSBzcGVjaWZpZWQgZmxhdm9yLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgZmxhdm9yIHdhcyBub3QgZm91bmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZsYXZvclxuICogQHJldHVybnMge3t9fHVuZGVmaW5lZH1cbiAqL1xuc2hvd2Rvd24uZ2V0Rmxhdm9yT3B0aW9ucyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKGZsYXZvci5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgIHJldHVybiBmbGF2b3JbbmFtZV07XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IG9wdGlvbnNcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NpbXBsZT10cnVlXVxuICogQHJldHVybnMge3t9fVxuICovXG5zaG93ZG93bi5nZXREZWZhdWx0T3B0aW9ucyA9IGZ1bmN0aW9uIChzaW1wbGUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gZ2V0RGVmYXVsdE9wdHMoc2ltcGxlKTtcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCBhIHN1YlBhcnNlclxuICpcbiAqIHN1YlBhcnNlcihuYW1lKSAgICAgICAtIEdldCBhIHJlZ2lzdGVyZWQgc3ViUGFyc2VyXG4gKiBzdWJQYXJzZXIobmFtZSwgZnVuYykgLSBSZWdpc3RlciBhIHN1YlBhcnNlclxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmdW5jXVxuICogQHJldHVybnMgeyp9XG4gKi9cbnNob3dkb3duLnN1YlBhcnNlciA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKHNob3dkb3duLmhlbHBlci5pc1N0cmluZyhuYW1lKSkge1xuICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcnNlcnNbbmFtZV0gPSBmdW5jO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFyc2Vycy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gcGFyc2Vyc1tuYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKCdTdWJQYXJzZXIgbmFtZWQgJyArIG5hbWUgKyAnIG5vdCByZWdpc3RlcmVkIScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIG9yIHJlZ2lzdGVycyBhbiBleHRlbnNpb25cbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge29iamVjdHxvYmplY3RbXXxmdW5jdGlvbj19IGV4dFxuICogQHJldHVybnMgeyp9XG4gKi9cbnNob3dkb3duLmV4dGVuc2lvbiA9IGZ1bmN0aW9uIChuYW1lLCBleHQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKG5hbWUpKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0V4dGVuc2lvbiBcXCduYW1lXFwnIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIG5hbWUgPSBzaG93ZG93bi5oZWxwZXIuc3RkRXh0TmFtZShuYW1lKTtcblxuICAvLyBHZXR0ZXJcbiAgaWYgKHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChleHQpKSB7XG4gICAgaWYgKCFleHRlbnNpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICB0aHJvdyBFcnJvcignRXh0ZW5zaW9uIG5hbWVkICcgKyBuYW1lICsgJyBpcyBub3QgcmVnaXN0ZXJlZCEnKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvbnNbbmFtZV07XG5cbiAgICAvLyBTZXR0ZXJcbiAgfSBlbHNlIHtcbiAgICAvLyBFeHBhbmQgZXh0ZW5zaW9uIGlmIGl0J3Mgd3JhcHBlZCBpbiBhIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiBleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGV4dCA9IGV4dCgpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBleHRlbnNpb24gaXMgYW4gYXJyYXlcbiAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc0FycmF5KGV4dCkpIHtcbiAgICAgIGV4dCA9IFtleHRdO1xuICAgIH1cblxuICAgIHZhciB2YWxpZEV4dGVuc2lvbiA9IHZhbGlkYXRlKGV4dCwgbmFtZSk7XG5cbiAgICBpZiAodmFsaWRFeHRlbnNpb24udmFsaWQpIHtcbiAgICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKHZhbGlkRXh0ZW5zaW9uLmVycm9yKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhbGwgZXh0ZW5zaW9ucyByZWdpc3RlcmVkXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbnNob3dkb3duLmdldEFsbEV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIGV4dGVuc2lvbnM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBleHRlbnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbnNob3dkb3duLnJlbW92ZUV4dGVuc2lvbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV07XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGV4dGVuc2lvbnNcbiAqL1xuc2hvd2Rvd24ucmVzZXRFeHRlbnNpb25zID0gZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIGV4dGVuc2lvbnMgPSB7fTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgZXh0ZW5zaW9uXG4gKiBAcGFyYW0ge2FycmF5fSBleHRlbnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7e3ZhbGlkOiBib29sZWFuLCBlcnJvcjogc3RyaW5nfX1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGUgKGV4dGVuc2lvbiwgbmFtZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGVyck1zZyA9IChuYW1lKSA/ICdFcnJvciBpbiAnICsgbmFtZSArICcgZXh0ZW5zaW9uLT4nIDogJ0Vycm9yIGluIHVubmFtZWQgZXh0ZW5zaW9uJyxcbiAgICAgIHJldCA9IHtcbiAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIGVycm9yOiAnJ1xuICAgICAgfTtcblxuICBpZiAoIXNob3dkb3duLmhlbHBlci5pc0FycmF5KGV4dGVuc2lvbikpIHtcbiAgICBleHRlbnNpb24gPSBbZXh0ZW5zaW9uXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJhc2VNc2cgPSBlcnJNc2cgKyAnIHN1Yi1leHRlbnNpb24gJyArIGkgKyAnOiAnLFxuICAgICAgICBleHQgPSBleHRlbnNpb25baV07XG4gICAgaWYgKHR5cGVvZiBleHQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyAnbXVzdCBiZSBhbiBvYmplY3QsIGJ1dCAnICsgdHlwZW9mIGV4dCArICcgZ2l2ZW4nO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1N0cmluZyhleHQudHlwZSkpIHtcbiAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdwcm9wZXJ0eSBcInR5cGVcIiBtdXN0IGJlIGEgc3RyaW5nLCBidXQgJyArIHR5cGVvZiBleHQudHlwZSArICcgZ2l2ZW4nO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IGV4dC50eXBlID0gZXh0LnR5cGUudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIG5vcm1hbGl6ZSBleHRlbnNpb24gdHlwZVxuICAgIGlmICh0eXBlID09PSAnbGFuZ3VhZ2UnKSB7XG4gICAgICB0eXBlID0gZXh0LnR5cGUgPSAnbGFuZyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdodG1sJykge1xuICAgICAgdHlwZSA9IGV4dC50eXBlID0gJ291dHB1dCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdsYW5nJyAmJiB0eXBlICE9PSAnb3V0cHV0JyAmJiB0eXBlICE9PSAnbGlzdGVuZXInKSB7XG4gICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyAndHlwZSAnICsgdHlwZSArICcgaXMgbm90IHJlY29nbml6ZWQuIFZhbGlkIHZhbHVlczogXCJsYW5nL2xhbmd1YWdlXCIsIFwib3V0cHV0L2h0bWxcIiBvciBcImxpc3RlbmVyXCInO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2xpc3RlbmVyJykge1xuICAgICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChleHQubGlzdGVuZXJzKSkge1xuICAgICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICcuIEV4dGVuc2lvbnMgb2YgdHlwZSBcImxpc3RlbmVyXCIgbXVzdCBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIFwibGlzdGVuZXJzXCInO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dC5maWx0ZXIpICYmIHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChleHQucmVnZXgpKSB7XG4gICAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgdHlwZSArICcgZXh0ZW5zaW9ucyBtdXN0IGRlZmluZSBlaXRoZXIgYSBcInJlZ2V4XCIgcHJvcGVydHkgb3IgYSBcImZpbHRlclwiIG1ldGhvZCc7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dC5saXN0ZW5lcnMpIHtcbiAgICAgIGlmICh0eXBlb2YgZXh0Lmxpc3RlbmVycyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyAnXCJsaXN0ZW5lcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIG9iamVjdCBidXQgJyArIHR5cGVvZiBleHQubGlzdGVuZXJzICsgJyBnaXZlbic7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBsbiBpbiBleHQubGlzdGVuZXJzKSB7XG4gICAgICAgIGlmIChleHQubGlzdGVuZXJzLmhhc093blByb3BlcnR5KGxuKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZXh0Lmxpc3RlbmVyc1tsbl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdcImxpc3RlbmVyc1wiIHByb3BlcnR5IG11c3QgYmUgYW4gaGFzaCBvZiBbZXZlbnQgbmFtZV06IFtjYWxsYmFja10uIGxpc3RlbmVycy4nICsgbG4gK1xuICAgICAgICAgICAgICAnIG11c3QgYmUgYSBmdW5jdGlvbiBidXQgJyArIHR5cGVvZiBleHQubGlzdGVuZXJzW2xuXSArICcgZ2l2ZW4nO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0LmZpbHRlcikge1xuICAgICAgaWYgKHR5cGVvZiBleHQuZmlsdGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgJ1wiZmlsdGVyXCIgbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgJyArIHR5cGVvZiBleHQuZmlsdGVyICsgJyBnaXZlbic7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHQucmVnZXgpIHtcbiAgICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcoZXh0LnJlZ2V4KSkge1xuICAgICAgICBleHQucmVnZXggPSBuZXcgUmVnRXhwKGV4dC5yZWdleCwgJ2cnKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGV4dC5yZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCkpIHtcbiAgICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyAnXCJyZWdleFwiIHByb3BlcnR5IG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgUmVnRXhwIG9iamVjdCwgYnV0ICcgKyB0eXBlb2YgZXh0LnJlZ2V4ICsgJyBnaXZlbic7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dC5yZXBsYWNlKSkge1xuICAgICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdcInJlZ2V4XCIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCBhIHJlcGxhY2Ugc3RyaW5nIG9yIGZ1bmN0aW9uJztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBleHRlbnNpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBleHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5zaG93ZG93bi52YWxpZGF0ZUV4dGVuc2lvbiA9IGZ1bmN0aW9uIChleHQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB2YWxpZGF0ZUV4dGVuc2lvbiA9IHZhbGlkYXRlKGV4dCwgbnVsbCk7XG4gIGlmICghdmFsaWRhdGVFeHRlbnNpb24udmFsaWQpIHtcbiAgICBjb25zb2xlLndhcm4odmFsaWRhdGVFeHRlbnNpb24uZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cclxuLyoqXG4gKiBzaG93ZG93bmpzIGhlbHBlciBmdW5jdGlvbnNcbiAqL1xuXG5pZiAoIXNob3dkb3duLmhhc093blByb3BlcnR5KCdoZWxwZXInKSkge1xuICBzaG93ZG93bi5oZWxwZXIgPSB7fTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YXIgaXMgc3RyaW5nXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnNob3dkb3duLmhlbHBlci5pc1N0cmluZyA9IGZ1bmN0aW9uIChhKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgfHwgYSBpbnN0YW5jZW9mIFN0cmluZyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHZhciBpcyBhIGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5zaG93ZG93bi5oZWxwZXIuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChhKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGdldFR5cGUgPSB7fTtcbiAgcmV0dXJuIGEgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGEpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxuLyoqXG4gKiBpc0FycmF5IGhlbHBlciBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQHBhcmFtIHsqfSBhXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkgPSBmdW5jdGlvbiAoYSkge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGEpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59O1xuXG4vKipcbiAqIEZvckVhY2ggaGVscGVyIGZ1bmN0aW9uXG4gKiBJdGVyYXRlcyBvdmVyIEFycmF5cyBhbmQgT2JqZWN0cyAob3duIHByb3BlcnRpZXMgb25seSlcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBBY2NlcHRzIDMgcGFyYW1zOiAxLiB2YWx1ZSwgMi4ga2V5LCAzLiB0aGUgb3JpZ2luYWwgYXJyYXkvb2JqZWN0XG4gKi9cbnNob3dkb3duLmhlbHBlci5mb3JFYWNoID0gZnVuY3Rpb24gKG9iaiwgY2FsbGJhY2spIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICAvLyBjaGVjayBpZiBvYmogaXMgZGVmaW5lZFxuICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKG9iaikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29iaiBwYXJhbSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgaWYgKHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChjYWxsYmFjaykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIHBhcmFtIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIXNob3dkb3duLmhlbHBlci5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgcGFyYW0gbXVzdCBiZSBhIGZ1bmN0aW9uL2Nsb3N1cmUnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICBvYmouZm9yRWFjaChjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAoc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkob2JqKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjYWxsYmFjayhvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiAob2JqKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBjYWxsYmFjayhvYmpbcHJvcF0sIHByb3AsIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignb2JqIGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gYXJyYXkgb3IgYW4gaXRlcmFibGUgb2JqZWN0Jyk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RhbmRhcmRpZGl6ZSBleHRlbnNpb24gbmFtZVxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IHMgZXh0ZW5zaW9uIG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnNob3dkb3duLmhlbHBlci5zdGRFeHROYW1lID0gZnVuY3Rpb24gKHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gcy5yZXBsYWNlKC9bXz8qK1xcL1xcXFwuXi1dL2csICcnKS5yZXBsYWNlKC9cXHMvZywgJycpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG5mdW5jdGlvbiBlc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2sgKHdob2xlTWF0Y2gsIG0xKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGNoYXJDb2RlVG9Fc2NhcGUgPSBtMS5jaGFyQ29kZUF0KDApO1xuICByZXR1cm4gJ8KoRScgKyBjaGFyQ29kZVRvRXNjYXBlICsgJ0UnO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgd2hlbiBwYXNzaW5nIHRocm91Z2ggU3RyaW5nLnJlcGxhY2VcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSB3aG9sZU1hdGNoXG4gKiBAcGFyYW0ge3N0cmluZ30gbTFcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2sgPSBlc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2s7XG5cbi8qKlxuICogRXNjYXBlIGNoYXJhY3RlcnMgaW4gYSBzdHJpbmdcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhcnNUb0VzY2FwZVxuICogQHBhcmFtIHtib29sZWFufSBhZnRlckJhY2tzbGFzaFxuICogQHJldHVybnMge1hNTHxzdHJpbmd8dm9pZHwqfVxuICovXG5zaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVycyA9IGZ1bmN0aW9uICh0ZXh0LCBjaGFyc1RvRXNjYXBlLCBhZnRlckJhY2tzbGFzaCkge1xuICAndXNlIHN0cmljdCc7XG4gIC8vIEZpcnN0IHdlIGhhdmUgdG8gZXNjYXBlIHRoZSBlc2NhcGUgY2hhcmFjdGVycyBzbyB0aGF0XG4gIC8vIHdlIGNhbiBidWlsZCBhIGNoYXJhY3RlciBjbGFzcyBvdXQgb2YgdGhlbVxuICB2YXIgcmVnZXhTdHJpbmcgPSAnKFsnICsgY2hhcnNUb0VzY2FwZS5yZXBsYWNlKC8oW1xcW1xcXVxcXFxdKS9nLCAnXFxcXCQxJykgKyAnXSknO1xuXG4gIGlmIChhZnRlckJhY2tzbGFzaCkge1xuICAgIHJlZ2V4U3RyaW5nID0gJ1xcXFxcXFxcJyArIHJlZ2V4U3RyaW5nO1xuICB9XG5cbiAgdmFyIHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0cmluZywgJ2cnKTtcbiAgdGV4dCA9IHRleHQucmVwbGFjZShyZWdleCwgZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcblxuICByZXR1cm4gdGV4dDtcbn07XG5cbi8qKlxuICogVW5lc2NhcGUgSFRNTCBlbnRpdGllc1xuICogQHBhcmFtIHR4dFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uaGVscGVyLnVuZXNjYXBlSFRNTEVudGl0aWVzID0gZnVuY3Rpb24gKHR4dCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIHR4dFxuICAgIC5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJylcbiAgICAucmVwbGFjZSgvJmx0Oy9nLCAnPCcpXG4gICAgLnJlcGxhY2UoLyZndDsvZywgJz4nKVxuICAgIC5yZXBsYWNlKC8mYW1wOy9nLCAnJicpO1xufTtcblxudmFyIHJneEZpbmRNYXRjaFBvcyA9IGZ1bmN0aW9uIChzdHIsIGxlZnQsIHJpZ2h0LCBmbGFncykge1xuICAndXNlIHN0cmljdCc7XG4gIHZhciBmID0gZmxhZ3MgfHwgJycsXG4gICAgICBnID0gZi5pbmRleE9mKCdnJykgPiAtMSxcbiAgICAgIHggPSBuZXcgUmVnRXhwKGxlZnQgKyAnfCcgKyByaWdodCwgJ2cnICsgZi5yZXBsYWNlKC9nL2csICcnKSksXG4gICAgICBsID0gbmV3IFJlZ0V4cChsZWZ0LCBmLnJlcGxhY2UoL2cvZywgJycpKSxcbiAgICAgIHBvcyA9IFtdLFxuICAgICAgdCwgcywgbSwgc3RhcnQsIGVuZDtcblxuICBkbyB7XG4gICAgdCA9IDA7XG4gICAgd2hpbGUgKChtID0geC5leGVjKHN0cikpKSB7XG4gICAgICBpZiAobC50ZXN0KG1bMF0pKSB7XG4gICAgICAgIGlmICghKHQrKykpIHtcbiAgICAgICAgICBzID0geC5sYXN0SW5kZXg7XG4gICAgICAgICAgc3RhcnQgPSBzIC0gbVswXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodCkge1xuICAgICAgICBpZiAoIS0tdCkge1xuICAgICAgICAgIGVuZCA9IG0uaW5kZXggKyBtWzBdLmxlbmd0aDtcbiAgICAgICAgICB2YXIgb2JqID0ge1xuICAgICAgICAgICAgbGVmdDoge3N0YXJ0OiBzdGFydCwgZW5kOiBzfSxcbiAgICAgICAgICAgIG1hdGNoOiB7c3RhcnQ6IHMsIGVuZDogbS5pbmRleH0sXG4gICAgICAgICAgICByaWdodDoge3N0YXJ0OiBtLmluZGV4LCBlbmQ6IGVuZH0sXG4gICAgICAgICAgICB3aG9sZU1hdGNoOiB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHBvcy5wdXNoKG9iaik7XG4gICAgICAgICAgaWYgKCFnKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAodCAmJiAoeC5sYXN0SW5kZXggPSBzKSk7XG5cbiAgcmV0dXJuIHBvcztcbn07XG5cbi8qKlxuICogbWF0Y2hSZWN1cnNpdmVSZWdFeHBcbiAqXG4gKiAoYykgMjAwNyBTdGV2ZW4gTGV2aXRoYW4gPHN0ZXZlbmxldml0aGFuLmNvbT5cbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQWNjZXB0cyBhIHN0cmluZyB0byBzZWFyY2gsIGEgbGVmdCBhbmQgcmlnaHQgZm9ybWF0IGRlbGltaXRlclxuICogYXMgcmVnZXggcGF0dGVybnMsIGFuZCBvcHRpb25hbCByZWdleCBmbGFncy4gUmV0dXJucyBhbiBhcnJheVxuICogb2YgbWF0Y2hlcywgYWxsb3dpbmcgbmVzdGVkIGluc3RhbmNlcyBvZiBsZWZ0L3JpZ2h0IGRlbGltaXRlcnMuXG4gKiBVc2UgdGhlIFwiZ1wiIGZsYWcgdG8gcmV0dXJuIGFsbCBtYXRjaGVzLCBvdGhlcndpc2Ugb25seSB0aGVcbiAqIGZpcnN0IGlzIHJldHVybmVkLiBCZSBjYXJlZnVsIHRvIGVuc3VyZSB0aGF0IHRoZSBsZWZ0IGFuZFxuICogcmlnaHQgZm9ybWF0IGRlbGltaXRlcnMgcHJvZHVjZSBtdXR1YWxseSBleGNsdXNpdmUgbWF0Y2hlcy5cbiAqIEJhY2tyZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGhpbiB0aGUgcmlnaHQgZGVsaW1pdGVyXG4gKiBkdWUgdG8gaG93IGl0IGlzIGludGVybmFsbHkgY29tYmluZWQgd2l0aCB0aGUgbGVmdCBkZWxpbWl0ZXIuXG4gKiBXaGVuIG1hdGNoaW5nIHN0cmluZ3Mgd2hvc2UgZm9ybWF0IGRlbGltaXRlcnMgYXJlIHVuYmFsYW5jZWRcbiAqIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LCB0aGUgb3V0cHV0IGlzIGludGVudGlvbmFsbHkgYXMgYVxuICogY29udmVudGlvbmFsIHJlZ2V4IGxpYnJhcnkgd2l0aCByZWN1cnNpb24gc3VwcG9ydCB3b3VsZFxuICogcHJvZHVjZSwgZS5nLiBcIjw8eD5cIiBhbmQgXCI8eD4+XCIgYm90aCBwcm9kdWNlIFtcInhcIl0gd2hlbiB1c2luZ1xuICogXCI8XCIgYW5kIFwiPlwiIGFzIHRoZSBkZWxpbWl0ZXJzIChib3RoIHN0cmluZ3MgY29udGFpbiBhIHNpbmdsZSxcbiAqIGJhbGFuY2VkIGluc3RhbmNlIG9mIFwiPHg+XCIpLlxuICpcbiAqIGV4YW1wbGVzOlxuICogbWF0Y2hSZWN1cnNpdmVSZWdFeHAoXCJ0ZXN0XCIsIFwiXFxcXChcIiwgXCJcXFxcKVwiKVxuICogcmV0dXJuczogW11cbiAqIG1hdGNoUmVjdXJzaXZlUmVnRXhwKFwiPHQ8PGU+PjxzPj50PD5cIiwgXCI8XCIsIFwiPlwiLCBcImdcIilcbiAqIHJldHVybnM6IFtcInQ8PGU+PjxzPlwiLCBcIlwiXVxuICogbWF0Y2hSZWN1cnNpdmVSZWdFeHAoXCI8ZGl2IGlkPVxcXCJ4XFxcIj50ZXN0PC9kaXY+XCIsIFwiPGRpdlxcXFxiW14+XSo+XCIsIFwiPC9kaXY+XCIsIFwiZ2lcIilcbiAqIHJldHVybnM6IFtcInRlc3RcIl1cbiAqL1xuc2hvd2Rvd24uaGVscGVyLm1hdGNoUmVjdXJzaXZlUmVnRXhwID0gZnVuY3Rpb24gKHN0ciwgbGVmdCwgcmlnaHQsIGZsYWdzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbWF0Y2hQb3MgPSByZ3hGaW5kTWF0Y2hQb3MgKHN0ciwgbGVmdCwgcmlnaHQsIGZsYWdzKSxcbiAgICAgIHJlc3VsdHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoUG9zLmxlbmd0aDsgKytpKSB7XG4gICAgcmVzdWx0cy5wdXNoKFtcbiAgICAgIHN0ci5zbGljZShtYXRjaFBvc1tpXS53aG9sZU1hdGNoLnN0YXJ0LCBtYXRjaFBvc1tpXS53aG9sZU1hdGNoLmVuZCksXG4gICAgICBzdHIuc2xpY2UobWF0Y2hQb3NbaV0ubWF0Y2guc3RhcnQsIG1hdGNoUG9zW2ldLm1hdGNoLmVuZCksXG4gICAgICBzdHIuc2xpY2UobWF0Y2hQb3NbaV0ubGVmdC5zdGFydCwgbWF0Y2hQb3NbaV0ubGVmdC5lbmQpLFxuICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLnJpZ2h0LnN0YXJ0LCBtYXRjaFBvc1tpXS5yaWdodC5lbmQpXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbn0gcmVwbGFjZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZWZ0XG4gKiBAcGFyYW0ge3N0cmluZ30gcmlnaHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAgPSBmdW5jdGlvbiAoc3RyLCByZXBsYWNlbWVudCwgbGVmdCwgcmlnaHQsIGZsYWdzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIXNob3dkb3duLmhlbHBlci5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSkge1xuICAgIHZhciByZXBTdHIgPSByZXBsYWNlbWVudDtcbiAgICByZXBsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXBTdHI7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBtYXRjaFBvcyA9IHJneEZpbmRNYXRjaFBvcyhzdHIsIGxlZnQsIHJpZ2h0LCBmbGFncyksXG4gICAgICBmaW5hbFN0ciA9IHN0cixcbiAgICAgIGxuZyA9IG1hdGNoUG9zLmxlbmd0aDtcblxuICBpZiAobG5nID4gMCkge1xuICAgIHZhciBiaXRzID0gW107XG4gICAgaWYgKG1hdGNoUG9zWzBdLndob2xlTWF0Y2guc3RhcnQgIT09IDApIHtcbiAgICAgIGJpdHMucHVzaChzdHIuc2xpY2UoMCwgbWF0Y2hQb3NbMF0ud2hvbGVNYXRjaC5zdGFydCkpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxuZzsgKytpKSB7XG4gICAgICBiaXRzLnB1c2goXG4gICAgICAgIHJlcGxhY2VtZW50KFxuICAgICAgICAgIHN0ci5zbGljZShtYXRjaFBvc1tpXS53aG9sZU1hdGNoLnN0YXJ0LCBtYXRjaFBvc1tpXS53aG9sZU1hdGNoLmVuZCksXG4gICAgICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLm1hdGNoLnN0YXJ0LCBtYXRjaFBvc1tpXS5tYXRjaC5lbmQpLFxuICAgICAgICAgIHN0ci5zbGljZShtYXRjaFBvc1tpXS5sZWZ0LnN0YXJ0LCBtYXRjaFBvc1tpXS5sZWZ0LmVuZCksXG4gICAgICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLnJpZ2h0LnN0YXJ0LCBtYXRjaFBvc1tpXS5yaWdodC5lbmQpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBpZiAoaSA8IGxuZyAtIDEpIHtcbiAgICAgICAgYml0cy5wdXNoKHN0ci5zbGljZShtYXRjaFBvc1tpXS53aG9sZU1hdGNoLmVuZCwgbWF0Y2hQb3NbaSArIDFdLndob2xlTWF0Y2guc3RhcnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoUG9zW2xuZyAtIDFdLndob2xlTWF0Y2guZW5kIDwgc3RyLmxlbmd0aCkge1xuICAgICAgYml0cy5wdXNoKHN0ci5zbGljZShtYXRjaFBvc1tsbmcgLSAxXS53aG9sZU1hdGNoLmVuZCkpO1xuICAgIH1cbiAgICBmaW5hbFN0ciA9IGJpdHMuam9pbignJyk7XG4gIH1cbiAgcmV0dXJuIGZpbmFsU3RyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCB3aXRoaW4gdGhlIHBhc3NlZCBTdHJpbmcgb2JqZWN0IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgcmVnZXgsXG4gKiBzdGFydGluZyB0aGUgc2VhcmNoIGF0IGZyb21JbmRleC4gUmV0dXJucyAtMSBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgc3RyaW5nIHRvIHNlYXJjaFxuICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4IFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2hcbiAqIEBwYXJhbSB7aW50fSBbZnJvbUluZGV4ID0gMF0gSW5kZXggdG8gc3RhcnQgdGhlIHNlYXJjaFxuICogQHJldHVybnMge051bWJlcn1cbiAqIEB0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXJyb3JcbiAqL1xuc2hvd2Rvd24uaGVscGVyLnJlZ2V4SW5kZXhPZiA9IGZ1bmN0aW9uIChzdHIsIHJlZ2V4LCBmcm9tSW5kZXgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1N0cmluZyhzdHIpKSB7XG4gICAgdGhyb3cgJ0ludmFsaWRBcmd1bWVudEVycm9yOiBmaXJzdCBwYXJhbWV0ZXIgb2Ygc2hvd2Rvd24uaGVscGVyLnJlZ2V4SW5kZXhPZiBmdW5jdGlvbiBtdXN0IGJlIGEgc3RyaW5nJztcbiAgfVxuICBpZiAocmVnZXggaW5zdGFuY2VvZiBSZWdFeHAgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgJ0ludmFsaWRBcmd1bWVudEVycm9yOiBzZWNvbmQgcGFyYW1ldGVyIG9mIHNob3dkb3duLmhlbHBlci5yZWdleEluZGV4T2YgZnVuY3Rpb24gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBSZWdFeHAnO1xuICB9XG4gIHZhciBpbmRleE9mID0gc3RyLnN1YnN0cmluZyhmcm9tSW5kZXggfHwgMCkuc2VhcmNoKHJlZ2V4KTtcbiAgcmV0dXJuIChpbmRleE9mID49IDApID8gKGluZGV4T2YgKyAoZnJvbUluZGV4IHx8IDApKSA6IGluZGV4T2Y7XG59O1xuXG4vKipcbiAqIFNwbGl0cyB0aGUgcGFzc2VkIHN0cmluZyBvYmplY3QgYXQgdGhlIGRlZmluZWQgaW5kZXgsIGFuZCByZXR1cm5zIGFuIGFycmF5IGNvbXBvc2VkIG9mIHRoZSB0d28gc3Vic3RyaW5nc1xuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBzdHJpbmcgdG8gc3BsaXRcbiAqIEBwYXJhbSB7aW50fSBpbmRleCBpbmRleCB0byBzcGxpdCBzdHJpbmcgYXRcbiAqIEByZXR1cm5zIHtbc3RyaW5nLHN0cmluZ119XG4gKiBAdGhyb3dzIEludmFsaWRBcmd1bWVudEVycm9yXG4gKi9cbnNob3dkb3duLmhlbHBlci5zcGxpdEF0SW5kZXggPSBmdW5jdGlvbiAoc3RyLCBpbmRleCkge1xuICAndXNlIHN0cmljdCc7XG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKHN0cikpIHtcbiAgICB0aHJvdyAnSW52YWxpZEFyZ3VtZW50RXJyb3I6IGZpcnN0IHBhcmFtZXRlciBvZiBzaG93ZG93bi5oZWxwZXIucmVnZXhJbmRleE9mIGZ1bmN0aW9uIG11c3QgYmUgYSBzdHJpbmcnO1xuICB9XG4gIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBpbmRleCksIHN0ci5zdWJzdHJpbmcoaW5kZXgpXTtcbn07XG5cbi8qKlxuICogT2JmdXNjYXRlIGFuIGUtbWFpbCBhZGRyZXNzIHRocm91Z2ggdGhlIHVzZSBvZiBDaGFyYWN0ZXIgRW50aXRpZXMsXG4gKiB0cmFuc2Zvcm1pbmcgQVNDSUkgY2hhcmFjdGVycyBpbnRvIHRoZWlyIGVxdWl2YWxlbnQgZGVjaW1hbCBvciBoZXggZW50aXRpZXMuXG4gKlxuICogU2luY2UgaXQgaGFzIGEgcmFuZG9tIGNvbXBvbmVudCwgc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFpbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uaGVscGVyLmVuY29kZUVtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uIChtYWlsKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGVuY29kZSA9IFtcbiAgICBmdW5jdGlvbiAoY2gpIHtcbiAgICAgIHJldHVybiAnJiMnICsgY2guY2hhckNvZGVBdCgwKSArICc7JztcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjaCkge1xuICAgICAgcmV0dXJuICcmI3gnICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgKyAnOyc7XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoY2gpIHtcbiAgICAgIHJldHVybiBjaDtcbiAgICB9XG4gIF07XG5cbiAgbWFpbCA9IG1haWwucmVwbGFjZSgvLi9nLCBmdW5jdGlvbiAoY2gpIHtcbiAgICBpZiAoY2ggPT09ICdAJykge1xuICAgICAgLy8gdGhpcyAqbXVzdCogYmUgZW5jb2RlZC4gSSBpbnNpc3QuXG4gICAgICBjaCA9IGVuY29kZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKV0oY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAvLyByb3VnaGx5IDEwJSByYXcsIDQ1JSBoZXgsIDQ1JSBkZWNcbiAgICAgIGNoID0gKFxuICAgICAgICByID4gMC45ID8gZW5jb2RlWzJdKGNoKSA6IHIgPiAwLjQ1ID8gZW5jb2RlWzFdKGNoKSA6IGVuY29kZVswXShjaClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjaDtcbiAgfSk7XG5cbiAgcmV0dXJuIG1haWw7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gc3RyXG4gKiBAcGFyYW0gdGFyZ2V0TGVuZ3RoXG4gKiBAcGFyYW0gcGFkU3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5zaG93ZG93bi5oZWxwZXIucGFkRW5kID0gZnVuY3Rpb24gcGFkRW5kIChzdHIsIHRhcmdldExlbmd0aCwgcGFkU3RyaW5nKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLypqc2hpbnQgYml0d2lzZTogZmFsc2UqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3BhY2UtaW5maXgtb3BzXG4gIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aD4+MDsgLy9mbG9vciBpZiBudW1iZXIgb3IgY29udmVydCBub24tbnVtYmVyIHRvIDA7XG4gIC8qanNoaW50IGJpdHdpc2U6IHRydWUqL1xuICBwYWRTdHJpbmcgPSBTdHJpbmcocGFkU3RyaW5nIHx8ICcgJyk7XG4gIGlmIChzdHIubGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzdHIpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCAtIHN0ci5sZW5ndGg7XG4gICAgaWYgKHRhcmdldExlbmd0aCA+IHBhZFN0cmluZy5sZW5ndGgpIHtcbiAgICAgIHBhZFN0cmluZyArPSBwYWRTdHJpbmcucmVwZWF0KHRhcmdldExlbmd0aCAvIHBhZFN0cmluZy5sZW5ndGgpOyAvL2FwcGVuZCB0byBvcmlnaW5hbCB0byBlbnN1cmUgd2UgYXJlIGxvbmdlciB0aGFuIG5lZWRlZFxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHN0cikgKyBwYWRTdHJpbmcuc2xpY2UoMCx0YXJnZXRMZW5ndGgpO1xuICB9XG59O1xuXG4vKipcbiAqIFBPTFlGSUxMU1xuICovXG4vLyB1c2UgdGhpcyBpbnN0ZWFkIG9mIGJ1aWx0aW4gaXMgdW5kZWZpbmVkIGZvciBJRTggY29tcGF0aWJpbGl0eVxuaWYgKHR5cGVvZiAoY29uc29sZSkgPT09ICd1bmRlZmluZWQnKSB7XG4gIGNvbnNvbGUgPSB7XG4gICAgd2FybjogZnVuY3Rpb24gKG1zZykge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgYWxlcnQobXNnKTtcbiAgICB9LFxuICAgIGxvZzogZnVuY3Rpb24gKG1zZykge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgYWxlcnQobXNnKTtcbiAgICB9LFxuICAgIGVycm9yOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICB0aHJvdyBtc2c7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENvbW1vbiByZWdleGVzLlxuICogV2UgZGVjbGFyZSBzb21lIGNvbW1vbiByZWdleGVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2VcbiAqL1xuc2hvd2Rvd24uaGVscGVyLnJlZ2V4ZXMgPSB7XG4gIGFzdGVyaXNrRGFzaEFuZENvbG9uOiAvKFsqXzp+XSkvZ1xufTtcblxuLyoqXG4gKiBFTU9KSVMgTElTVFxuICovXG5zaG93ZG93bi5oZWxwZXIuZW1vamlzID0ge1xuICAnKzEnOidcXHVkODNkXFx1ZGM0ZCcsXG4gICctMSc6J1xcdWQ4M2RcXHVkYzRlJyxcbiAgJzEwMCc6J1xcdWQ4M2RcXHVkY2FmJyxcbiAgJzEyMzQnOidcXHVkODNkXFx1ZGQyMicsXG4gICcxc3RfcGxhY2VfbWVkYWwnOidcXHVkODNlXFx1ZGQ0NycsXG4gICcybmRfcGxhY2VfbWVkYWwnOidcXHVkODNlXFx1ZGQ0OCcsXG4gICczcmRfcGxhY2VfbWVkYWwnOidcXHVkODNlXFx1ZGQ0OScsXG4gICc4YmFsbCc6J1xcdWQ4M2NcXHVkZmIxJyxcbiAgJ2EnOidcXHVkODNjXFx1ZGQ3MFxcdWZlMGYnLFxuICAnYWInOidcXHVkODNjXFx1ZGQ4ZScsXG4gICdhYmMnOidcXHVkODNkXFx1ZGQyNCcsXG4gICdhYmNkJzonXFx1ZDgzZFxcdWRkMjEnLFxuICAnYWNjZXB0JzonXFx1ZDgzY1xcdWRlNTEnLFxuICAnYWVyaWFsX3RyYW13YXknOidcXHVkODNkXFx1ZGVhMScsXG4gICdhaXJwbGFuZSc6J1xcdTI3MDhcXHVmZTBmJyxcbiAgJ2FsYXJtX2Nsb2NrJzonXFx1MjNmMCcsXG4gICdhbGVtYmljJzonXFx1MjY5N1xcdWZlMGYnLFxuICAnYWxpZW4nOidcXHVkODNkXFx1ZGM3ZCcsXG4gICdhbWJ1bGFuY2UnOidcXHVkODNkXFx1ZGU5MScsXG4gICdhbXBob3JhJzonXFx1ZDgzY1xcdWRmZmEnLFxuICAnYW5jaG9yJzonXFx1MjY5M1xcdWZlMGYnLFxuICAnYW5nZWwnOidcXHVkODNkXFx1ZGM3YycsXG4gICdhbmdlcic6J1xcdWQ4M2RcXHVkY2EyJyxcbiAgJ2FuZ3J5JzonXFx1ZDgzZFxcdWRlMjAnLFxuICAnYW5ndWlzaGVkJzonXFx1ZDgzZFxcdWRlMjcnLFxuICAnYW50JzonXFx1ZDgzZFxcdWRjMWMnLFxuICAnYXBwbGUnOidcXHVkODNjXFx1ZGY0ZScsXG4gICdhcXVhcml1cyc6J1xcdTI2NTJcXHVmZTBmJyxcbiAgJ2FyaWVzJzonXFx1MjY0OFxcdWZlMGYnLFxuICAnYXJyb3dfYmFja3dhcmQnOidcXHUyNWMwXFx1ZmUwZicsXG4gICdhcnJvd19kb3VibGVfZG93bic6J1xcdTIzZWMnLFxuICAnYXJyb3dfZG91YmxlX3VwJzonXFx1MjNlYicsXG4gICdhcnJvd19kb3duJzonXFx1MmIwN1xcdWZlMGYnLFxuICAnYXJyb3dfZG93bl9zbWFsbCc6J1xcdWQ4M2RcXHVkZDNkJyxcbiAgJ2Fycm93X2ZvcndhcmQnOidcXHUyNWI2XFx1ZmUwZicsXG4gICdhcnJvd19oZWFkaW5nX2Rvd24nOidcXHUyOTM1XFx1ZmUwZicsXG4gICdhcnJvd19oZWFkaW5nX3VwJzonXFx1MjkzNFxcdWZlMGYnLFxuICAnYXJyb3dfbGVmdCc6J1xcdTJiMDVcXHVmZTBmJyxcbiAgJ2Fycm93X2xvd2VyX2xlZnQnOidcXHUyMTk5XFx1ZmUwZicsXG4gICdhcnJvd19sb3dlcl9yaWdodCc6J1xcdTIxOThcXHVmZTBmJyxcbiAgJ2Fycm93X3JpZ2h0JzonXFx1MjdhMVxcdWZlMGYnLFxuICAnYXJyb3dfcmlnaHRfaG9vayc6J1xcdTIxYWFcXHVmZTBmJyxcbiAgJ2Fycm93X3VwJzonXFx1MmIwNlxcdWZlMGYnLFxuICAnYXJyb3dfdXBfZG93bic6J1xcdTIxOTVcXHVmZTBmJyxcbiAgJ2Fycm93X3VwX3NtYWxsJzonXFx1ZDgzZFxcdWRkM2MnLFxuICAnYXJyb3dfdXBwZXJfbGVmdCc6J1xcdTIxOTZcXHVmZTBmJyxcbiAgJ2Fycm93X3VwcGVyX3JpZ2h0JzonXFx1MjE5N1xcdWZlMGYnLFxuICAnYXJyb3dzX2Nsb2Nrd2lzZSc6J1xcdWQ4M2RcXHVkZDAzJyxcbiAgJ2Fycm93c19jb3VudGVyY2xvY2t3aXNlJzonXFx1ZDgzZFxcdWRkMDQnLFxuICAnYXJ0JzonXFx1ZDgzY1xcdWRmYTgnLFxuICAnYXJ0aWN1bGF0ZWRfbG9ycnknOidcXHVkODNkXFx1ZGU5YicsXG4gICdhcnRpZmljaWFsX3NhdGVsbGl0ZSc6J1xcdWQ4M2RcXHVkZWYwJyxcbiAgJ2FzdG9uaXNoZWQnOidcXHVkODNkXFx1ZGUzMicsXG4gICdhdGhsZXRpY19zaG9lJzonXFx1ZDgzZFxcdWRjNWYnLFxuICAnYXRtJzonXFx1ZDgzY1xcdWRmZTcnLFxuICAnYXRvbV9zeW1ib2wnOidcXHUyNjliXFx1ZmUwZicsXG4gICdhdm9jYWRvJzonXFx1ZDgzZVxcdWRkNTEnLFxuICAnYic6J1xcdWQ4M2NcXHVkZDcxXFx1ZmUwZicsXG4gICdiYWJ5JzonXFx1ZDgzZFxcdWRjNzYnLFxuICAnYmFieV9ib3R0bGUnOidcXHVkODNjXFx1ZGY3YycsXG4gICdiYWJ5X2NoaWNrJzonXFx1ZDgzZFxcdWRjMjQnLFxuICAnYmFieV9zeW1ib2wnOidcXHVkODNkXFx1ZGViYycsXG4gICdiYWNrJzonXFx1ZDgzZFxcdWRkMTknLFxuICAnYmFjb24nOidcXHVkODNlXFx1ZGQ1MycsXG4gICdiYWRtaW50b24nOidcXHVkODNjXFx1ZGZmOCcsXG4gICdiYWdnYWdlX2NsYWltJzonXFx1ZDgzZFxcdWRlYzQnLFxuICAnYmFndWV0dGVfYnJlYWQnOidcXHVkODNlXFx1ZGQ1NicsXG4gICdiYWxhbmNlX3NjYWxlJzonXFx1MjY5NlxcdWZlMGYnLFxuICAnYmFsbG9vbic6J1xcdWQ4M2NcXHVkZjg4JyxcbiAgJ2JhbGxvdF9ib3gnOidcXHVkODNkXFx1ZGRmMycsXG4gICdiYWxsb3RfYm94X3dpdGhfY2hlY2snOidcXHUyNjExXFx1ZmUwZicsXG4gICdiYW1ib28nOidcXHVkODNjXFx1ZGY4ZCcsXG4gICdiYW5hbmEnOidcXHVkODNjXFx1ZGY0YycsXG4gICdiYW5nYmFuZyc6J1xcdTIwM2NcXHVmZTBmJyxcbiAgJ2JhbmsnOidcXHVkODNjXFx1ZGZlNicsXG4gICdiYXJfY2hhcnQnOidcXHVkODNkXFx1ZGNjYScsXG4gICdiYXJiZXInOidcXHVkODNkXFx1ZGM4OCcsXG4gICdiYXNlYmFsbCc6J1xcdTI2YmVcXHVmZTBmJyxcbiAgJ2Jhc2tldGJhbGwnOidcXHVkODNjXFx1ZGZjMCcsXG4gICdiYXNrZXRiYWxsX21hbic6J1xcdTI2ZjlcXHVmZTBmJyxcbiAgJ2Jhc2tldGJhbGxfd29tYW4nOidcXHUyNmY5XFx1ZmUwZiZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnYmF0JzonXFx1ZDgzZVxcdWRkODcnLFxuICAnYmF0aCc6J1xcdWQ4M2RcXHVkZWMwJyxcbiAgJ2JhdGh0dWInOidcXHVkODNkXFx1ZGVjMScsXG4gICdiYXR0ZXJ5JzonXFx1ZDgzZFxcdWRkMGInLFxuICAnYmVhY2hfdW1icmVsbGEnOidcXHVkODNjXFx1ZGZkNicsXG4gICdiZWFyJzonXFx1ZDgzZFxcdWRjM2InLFxuICAnYmVkJzonXFx1ZDgzZFxcdWRlY2YnLFxuICAnYmVlJzonXFx1ZDgzZFxcdWRjMWQnLFxuICAnYmVlcic6J1xcdWQ4M2NcXHVkZjdhJyxcbiAgJ2JlZXJzJzonXFx1ZDgzY1xcdWRmN2InLFxuICAnYmVldGxlJzonXFx1ZDgzZFxcdWRjMWUnLFxuICAnYmVnaW5uZXInOidcXHVkODNkXFx1ZGQzMCcsXG4gICdiZWxsJzonXFx1ZDgzZFxcdWRkMTQnLFxuICAnYmVsbGhvcF9iZWxsJzonXFx1ZDgzZFxcdWRlY2UnLFxuICAnYmVudG8nOidcXHVkODNjXFx1ZGY3MScsXG4gICdiaWtpbmdfbWFuJzonXFx1ZDgzZFxcdWRlYjQnLFxuICAnYmlrZSc6J1xcdWQ4M2RcXHVkZWIyJyxcbiAgJ2Jpa2luZ193b21hbic6J1xcdWQ4M2RcXHVkZWI0Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdiaWtpbmknOidcXHVkODNkXFx1ZGM1OScsXG4gICdiaW9oYXphcmQnOidcXHUyNjIzXFx1ZmUwZicsXG4gICdiaXJkJzonXFx1ZDgzZFxcdWRjMjYnLFxuICAnYmlydGhkYXknOidcXHVkODNjXFx1ZGY4MicsXG4gICdibGFja19jaXJjbGUnOidcXHUyNmFiXFx1ZmUwZicsXG4gICdibGFja19mbGFnJzonXFx1ZDgzY1xcdWRmZjQnLFxuICAnYmxhY2tfaGVhcnQnOidcXHVkODNkXFx1ZGRhNCcsXG4gICdibGFja19qb2tlcic6J1xcdWQ4M2NcXHVkY2NmJyxcbiAgJ2JsYWNrX2xhcmdlX3NxdWFyZSc6J1xcdTJiMWJcXHVmZTBmJyxcbiAgJ2JsYWNrX21lZGl1bV9zbWFsbF9zcXVhcmUnOidcXHUyNWZlXFx1ZmUwZicsXG4gICdibGFja19tZWRpdW1fc3F1YXJlJzonXFx1MjVmY1xcdWZlMGYnLFxuICAnYmxhY2tfbmliJzonXFx1MjcxMlxcdWZlMGYnLFxuICAnYmxhY2tfc21hbGxfc3F1YXJlJzonXFx1MjVhYVxcdWZlMGYnLFxuICAnYmxhY2tfc3F1YXJlX2J1dHRvbic6J1xcdWQ4M2RcXHVkZDMyJyxcbiAgJ2Jsb25kZV9tYW4nOidcXHVkODNkXFx1ZGM3MScsXG4gICdibG9uZGVfd29tYW4nOidcXHVkODNkXFx1ZGM3MSZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnYmxvc3NvbSc6J1xcdWQ4M2NcXHVkZjNjJyxcbiAgJ2Jsb3dmaXNoJzonXFx1ZDgzZFxcdWRjMjEnLFxuICAnYmx1ZV9ib29rJzonXFx1ZDgzZFxcdWRjZDgnLFxuICAnYmx1ZV9jYXInOidcXHVkODNkXFx1ZGU5OScsXG4gICdibHVlX2hlYXJ0JzonXFx1ZDgzZFxcdWRjOTknLFxuICAnYmx1c2gnOidcXHVkODNkXFx1ZGUwYScsXG4gICdib2FyJzonXFx1ZDgzZFxcdWRjMTcnLFxuICAnYm9hdCc6J1xcdTI2ZjVcXHVmZTBmJyxcbiAgJ2JvbWInOidcXHVkODNkXFx1ZGNhMycsXG4gICdib29rJzonXFx1ZDgzZFxcdWRjZDYnLFxuICAnYm9va21hcmsnOidcXHVkODNkXFx1ZGQxNicsXG4gICdib29rbWFya190YWJzJzonXFx1ZDgzZFxcdWRjZDEnLFxuICAnYm9va3MnOidcXHVkODNkXFx1ZGNkYScsXG4gICdib29tJzonXFx1ZDgzZFxcdWRjYTUnLFxuICAnYm9vdCc6J1xcdWQ4M2RcXHVkYzYyJyxcbiAgJ2JvdXF1ZXQnOidcXHVkODNkXFx1ZGM5MCcsXG4gICdib3dpbmdfbWFuJzonXFx1ZDgzZFxcdWRlNDcnLFxuICAnYm93X2FuZF9hcnJvdyc6J1xcdWQ4M2NcXHVkZmY5JyxcbiAgJ2Jvd2luZ193b21hbic6J1xcdWQ4M2RcXHVkZTQ3Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdib3dsaW5nJzonXFx1ZDgzY1xcdWRmYjMnLFxuICAnYm94aW5nX2dsb3ZlJzonXFx1ZDgzZVxcdWRkNGEnLFxuICAnYm95JzonXFx1ZDgzZFxcdWRjNjYnLFxuICAnYnJlYWQnOidcXHVkODNjXFx1ZGY1ZScsXG4gICdicmlkZV93aXRoX3ZlaWwnOidcXHVkODNkXFx1ZGM3MCcsXG4gICdicmlkZ2VfYXRfbmlnaHQnOidcXHVkODNjXFx1ZGYwOScsXG4gICdicmllZmNhc2UnOidcXHVkODNkXFx1ZGNiYycsXG4gICdicm9rZW5faGVhcnQnOidcXHVkODNkXFx1ZGM5NCcsXG4gICdidWcnOidcXHVkODNkXFx1ZGMxYicsXG4gICdidWlsZGluZ19jb25zdHJ1Y3Rpb24nOidcXHVkODNjXFx1ZGZkNycsXG4gICdidWxiJzonXFx1ZDgzZFxcdWRjYTEnLFxuICAnYnVsbGV0dHJhaW5fZnJvbnQnOidcXHVkODNkXFx1ZGU4NScsXG4gICdidWxsZXR0cmFpbl9zaWRlJzonXFx1ZDgzZFxcdWRlODQnLFxuICAnYnVycml0byc6J1xcdWQ4M2NcXHVkZjJmJyxcbiAgJ2J1cyc6J1xcdWQ4M2RcXHVkZThjJyxcbiAgJ2J1c2luZXNzX3N1aXRfbGV2aXRhdGluZyc6J1xcdWQ4M2RcXHVkZDc0JyxcbiAgJ2J1c3N0b3AnOidcXHVkODNkXFx1ZGU4ZicsXG4gICdidXN0X2luX3NpbGhvdWV0dGUnOidcXHVkODNkXFx1ZGM2NCcsXG4gICdidXN0c19pbl9zaWxob3VldHRlJzonXFx1ZDgzZFxcdWRjNjUnLFxuICAnYnV0dGVyZmx5JzonXFx1ZDgzZVxcdWRkOGInLFxuICAnY2FjdHVzJzonXFx1ZDgzY1xcdWRmMzUnLFxuICAnY2FrZSc6J1xcdWQ4M2NcXHVkZjcwJyxcbiAgJ2NhbGVuZGFyJzonXFx1ZDgzZFxcdWRjYzYnLFxuICAnY2FsbF9tZV9oYW5kJzonXFx1ZDgzZVxcdWRkMTknLFxuICAnY2FsbGluZyc6J1xcdWQ4M2RcXHVkY2YyJyxcbiAgJ2NhbWVsJzonXFx1ZDgzZFxcdWRjMmInLFxuICAnY2FtZXJhJzonXFx1ZDgzZFxcdWRjZjcnLFxuICAnY2FtZXJhX2ZsYXNoJzonXFx1ZDgzZFxcdWRjZjgnLFxuICAnY2FtcGluZyc6J1xcdWQ4M2NcXHVkZmQ1JyxcbiAgJ2NhbmNlcic6J1xcdTI2NGJcXHVmZTBmJyxcbiAgJ2NhbmRsZSc6J1xcdWQ4M2RcXHVkZDZmJyxcbiAgJ2NhbmR5JzonXFx1ZDgzY1xcdWRmNmMnLFxuICAnY2Fub2UnOidcXHVkODNkXFx1ZGVmNicsXG4gICdjYXBpdGFsX2FiY2QnOidcXHVkODNkXFx1ZGQyMCcsXG4gICdjYXByaWNvcm4nOidcXHUyNjUxXFx1ZmUwZicsXG4gICdjYXInOidcXHVkODNkXFx1ZGU5NycsXG4gICdjYXJkX2ZpbGVfYm94JzonXFx1ZDgzZFxcdWRkYzMnLFxuICAnY2FyZF9pbmRleCc6J1xcdWQ4M2RcXHVkY2M3JyxcbiAgJ2NhcmRfaW5kZXhfZGl2aWRlcnMnOidcXHVkODNkXFx1ZGRjMicsXG4gICdjYXJvdXNlbF9ob3JzZSc6J1xcdWQ4M2NcXHVkZmEwJyxcbiAgJ2NhcnJvdCc6J1xcdWQ4M2VcXHVkZDU1JyxcbiAgJ2NhdCc6J1xcdWQ4M2RcXHVkYzMxJyxcbiAgJ2NhdDInOidcXHVkODNkXFx1ZGMwOCcsXG4gICdjZCc6J1xcdWQ4M2RcXHVkY2JmJyxcbiAgJ2NoYWlucyc6J1xcdTI2ZDMnLFxuICAnY2hhbXBhZ25lJzonXFx1ZDgzY1xcdWRmN2UnLFxuICAnY2hhcnQnOidcXHVkODNkXFx1ZGNiOScsXG4gICdjaGFydF93aXRoX2Rvd253YXJkc190cmVuZCc6J1xcdWQ4M2RcXHVkY2M5JyxcbiAgJ2NoYXJ0X3dpdGhfdXB3YXJkc190cmVuZCc6J1xcdWQ4M2RcXHVkY2M4JyxcbiAgJ2NoZWNrZXJlZF9mbGFnJzonXFx1ZDgzY1xcdWRmYzEnLFxuICAnY2hlZXNlJzonXFx1ZDgzZVxcdWRkYzAnLFxuICAnY2hlcnJpZXMnOidcXHVkODNjXFx1ZGY1MicsXG4gICdjaGVycnlfYmxvc3NvbSc6J1xcdWQ4M2NcXHVkZjM4JyxcbiAgJ2NoZXN0bnV0JzonXFx1ZDgzY1xcdWRmMzAnLFxuICAnY2hpY2tlbic6J1xcdWQ4M2RcXHVkYzE0JyxcbiAgJ2NoaWxkcmVuX2Nyb3NzaW5nJzonXFx1ZDgzZFxcdWRlYjgnLFxuICAnY2hpcG11bmsnOidcXHVkODNkXFx1ZGMzZicsXG4gICdjaG9jb2xhdGVfYmFyJzonXFx1ZDgzY1xcdWRmNmInLFxuICAnY2hyaXN0bWFzX3RyZWUnOidcXHVkODNjXFx1ZGY4NCcsXG4gICdjaHVyY2gnOidcXHUyNmVhXFx1ZmUwZicsXG4gICdjaW5lbWEnOidcXHVkODNjXFx1ZGZhNicsXG4gICdjaXJjdXNfdGVudCc6J1xcdWQ4M2NcXHVkZmFhJyxcbiAgJ2NpdHlfc3VucmlzZSc6J1xcdWQ4M2NcXHVkZjA3JyxcbiAgJ2NpdHlfc3Vuc2V0JzonXFx1ZDgzY1xcdWRmMDYnLFxuICAnY2l0eXNjYXBlJzonXFx1ZDgzY1xcdWRmZDknLFxuICAnY2wnOidcXHVkODNjXFx1ZGQ5MScsXG4gICdjbGFtcCc6J1xcdWQ4M2RcXHVkZGRjJyxcbiAgJ2NsYXAnOidcXHVkODNkXFx1ZGM0ZicsXG4gICdjbGFwcGVyJzonXFx1ZDgzY1xcdWRmYWMnLFxuICAnY2xhc3NpY2FsX2J1aWxkaW5nJzonXFx1ZDgzY1xcdWRmZGInLFxuICAnY2xpbmtpbmdfZ2xhc3Nlcyc6J1xcdWQ4M2VcXHVkZDQyJyxcbiAgJ2NsaXBib2FyZCc6J1xcdWQ4M2RcXHVkY2NiJyxcbiAgJ2Nsb2NrMSc6J1xcdWQ4M2RcXHVkZDUwJyxcbiAgJ2Nsb2NrMTAnOidcXHVkODNkXFx1ZGQ1OScsXG4gICdjbG9jazEwMzAnOidcXHVkODNkXFx1ZGQ2NScsXG4gICdjbG9jazExJzonXFx1ZDgzZFxcdWRkNWEnLFxuICAnY2xvY2sxMTMwJzonXFx1ZDgzZFxcdWRkNjYnLFxuICAnY2xvY2sxMic6J1xcdWQ4M2RcXHVkZDViJyxcbiAgJ2Nsb2NrMTIzMCc6J1xcdWQ4M2RcXHVkZDY3JyxcbiAgJ2Nsb2NrMTMwJzonXFx1ZDgzZFxcdWRkNWMnLFxuICAnY2xvY2syJzonXFx1ZDgzZFxcdWRkNTEnLFxuICAnY2xvY2syMzAnOidcXHVkODNkXFx1ZGQ1ZCcsXG4gICdjbG9jazMnOidcXHVkODNkXFx1ZGQ1MicsXG4gICdjbG9jazMzMCc6J1xcdWQ4M2RcXHVkZDVlJyxcbiAgJ2Nsb2NrNCc6J1xcdWQ4M2RcXHVkZDUzJyxcbiAgJ2Nsb2NrNDMwJzonXFx1ZDgzZFxcdWRkNWYnLFxuICAnY2xvY2s1JzonXFx1ZDgzZFxcdWRkNTQnLFxuICAnY2xvY2s1MzAnOidcXHVkODNkXFx1ZGQ2MCcsXG4gICdjbG9jazYnOidcXHVkODNkXFx1ZGQ1NScsXG4gICdjbG9jazYzMCc6J1xcdWQ4M2RcXHVkZDYxJyxcbiAgJ2Nsb2NrNyc6J1xcdWQ4M2RcXHVkZDU2JyxcbiAgJ2Nsb2NrNzMwJzonXFx1ZDgzZFxcdWRkNjInLFxuICAnY2xvY2s4JzonXFx1ZDgzZFxcdWRkNTcnLFxuICAnY2xvY2s4MzAnOidcXHVkODNkXFx1ZGQ2MycsXG4gICdjbG9jazknOidcXHVkODNkXFx1ZGQ1OCcsXG4gICdjbG9jazkzMCc6J1xcdWQ4M2RcXHVkZDY0JyxcbiAgJ2Nsb3NlZF9ib29rJzonXFx1ZDgzZFxcdWRjZDUnLFxuICAnY2xvc2VkX2xvY2tfd2l0aF9rZXknOidcXHVkODNkXFx1ZGQxMCcsXG4gICdjbG9zZWRfdW1icmVsbGEnOidcXHVkODNjXFx1ZGYwMicsXG4gICdjbG91ZCc6J1xcdTI2MDFcXHVmZTBmJyxcbiAgJ2Nsb3VkX3dpdGhfbGlnaHRuaW5nJzonXFx1ZDgzY1xcdWRmMjknLFxuICAnY2xvdWRfd2l0aF9saWdodG5pbmdfYW5kX3JhaW4nOidcXHUyNmM4JyxcbiAgJ2Nsb3VkX3dpdGhfcmFpbic6J1xcdWQ4M2NcXHVkZjI3JyxcbiAgJ2Nsb3VkX3dpdGhfc25vdyc6J1xcdWQ4M2NcXHVkZjI4JyxcbiAgJ2Nsb3duX2ZhY2UnOidcXHVkODNlXFx1ZGQyMScsXG4gICdjbHVicyc6J1xcdTI2NjNcXHVmZTBmJyxcbiAgJ2NvY2t0YWlsJzonXFx1ZDgzY1xcdWRmNzgnLFxuICAnY29mZmVlJzonXFx1MjYxNVxcdWZlMGYnLFxuICAnY29mZmluJzonXFx1MjZiMFxcdWZlMGYnLFxuICAnY29sZF9zd2VhdCc6J1xcdWQ4M2RcXHVkZTMwJyxcbiAgJ2NvbWV0JzonXFx1MjYwNFxcdWZlMGYnLFxuICAnY29tcHV0ZXInOidcXHVkODNkXFx1ZGNiYicsXG4gICdjb21wdXRlcl9tb3VzZSc6J1xcdWQ4M2RcXHVkZGIxJyxcbiAgJ2NvbmZldHRpX2JhbGwnOidcXHVkODNjXFx1ZGY4YScsXG4gICdjb25mb3VuZGVkJzonXFx1ZDgzZFxcdWRlMTYnLFxuICAnY29uZnVzZWQnOidcXHVkODNkXFx1ZGUxNScsXG4gICdjb25ncmF0dWxhdGlvbnMnOidcXHUzMjk3XFx1ZmUwZicsXG4gICdjb25zdHJ1Y3Rpb24nOidcXHVkODNkXFx1ZGVhNycsXG4gICdjb25zdHJ1Y3Rpb25fd29ya2VyX21hbic6J1xcdWQ4M2RcXHVkYzc3JyxcbiAgJ2NvbnN0cnVjdGlvbl93b3JrZXJfd29tYW4nOidcXHVkODNkXFx1ZGM3NyZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnY29udHJvbF9rbm9icyc6J1xcdWQ4M2NcXHVkZjliJyxcbiAgJ2NvbnZlbmllbmNlX3N0b3JlJzonXFx1ZDgzY1xcdWRmZWEnLFxuICAnY29va2llJzonXFx1ZDgzY1xcdWRmNmEnLFxuICAnY29vbCc6J1xcdWQ4M2NcXHVkZDkyJyxcbiAgJ3BvbGljZW1hbic6J1xcdWQ4M2RcXHVkYzZlJyxcbiAgJ2NvcHlyaWdodCc6J1xcdTAwYTlcXHVmZTBmJyxcbiAgJ2Nvcm4nOidcXHVkODNjXFx1ZGYzZCcsXG4gICdjb3VjaF9hbmRfbGFtcCc6J1xcdWQ4M2RcXHVkZWNiJyxcbiAgJ2NvdXBsZSc6J1xcdWQ4M2RcXHVkYzZiJyxcbiAgJ2NvdXBsZV93aXRoX2hlYXJ0X3dvbWFuX21hbic6J1xcdWQ4M2RcXHVkYzkxJyxcbiAgJ2NvdXBsZV93aXRoX2hlYXJ0X21hbl9tYW4nOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1Mjc2NFxcdWZlMGYmendqO1xcdWQ4M2RcXHVkYzY4JyxcbiAgJ2NvdXBsZV93aXRoX2hlYXJ0X3dvbWFuX3dvbWFuJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdTI3NjRcXHVmZTBmJnp3ajtcXHVkODNkXFx1ZGM2OScsXG4gICdjb3VwbGVraXNzX21hbl9tYW4nOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1Mjc2NFxcdWZlMGYmendqO1xcdWQ4M2RcXHVkYzhiJnp3ajtcXHVkODNkXFx1ZGM2OCcsXG4gICdjb3VwbGVraXNzX21hbl93b21hbic6J1xcdWQ4M2RcXHVkYzhmJyxcbiAgJ2NvdXBsZWtpc3Nfd29tYW5fd29tYW4nOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1Mjc2NFxcdWZlMGYmendqO1xcdWQ4M2RcXHVkYzhiJnp3ajtcXHVkODNkXFx1ZGM2OScsXG4gICdjb3cnOidcXHVkODNkXFx1ZGMyZScsXG4gICdjb3cyJzonXFx1ZDgzZFxcdWRjMDQnLFxuICAnY293Ym95X2hhdF9mYWNlJzonXFx1ZDgzZVxcdWRkMjAnLFxuICAnY3JhYic6J1xcdWQ4M2VcXHVkZDgwJyxcbiAgJ2NyYXlvbic6J1xcdWQ4M2RcXHVkZDhkJyxcbiAgJ2NyZWRpdF9jYXJkJzonXFx1ZDgzZFxcdWRjYjMnLFxuICAnY3Jlc2NlbnRfbW9vbic6J1xcdWQ4M2NcXHVkZjE5JyxcbiAgJ2NyaWNrZXQnOidcXHVkODNjXFx1ZGZjZicsXG4gICdjcm9jb2RpbGUnOidcXHVkODNkXFx1ZGMwYScsXG4gICdjcm9pc3NhbnQnOidcXHVkODNlXFx1ZGQ1MCcsXG4gICdjcm9zc2VkX2ZpbmdlcnMnOidcXHVkODNlXFx1ZGQxZScsXG4gICdjcm9zc2VkX2ZsYWdzJzonXFx1ZDgzY1xcdWRmOGMnLFxuICAnY3Jvc3NlZF9zd29yZHMnOidcXHUyNjk0XFx1ZmUwZicsXG4gICdjcm93bic6J1xcdWQ4M2RcXHVkYzUxJyxcbiAgJ2NyeSc6J1xcdWQ4M2RcXHVkZTIyJyxcbiAgJ2NyeWluZ19jYXRfZmFjZSc6J1xcdWQ4M2RcXHVkZTNmJyxcbiAgJ2NyeXN0YWxfYmFsbCc6J1xcdWQ4M2RcXHVkZDJlJyxcbiAgJ2N1Y3VtYmVyJzonXFx1ZDgzZVxcdWRkNTInLFxuICAnY3VwaWQnOidcXHVkODNkXFx1ZGM5OCcsXG4gICdjdXJseV9sb29wJzonXFx1MjdiMCcsXG4gICdjdXJyZW5jeV9leGNoYW5nZSc6J1xcdWQ4M2RcXHVkY2IxJyxcbiAgJ2N1cnJ5JzonXFx1ZDgzY1xcdWRmNWInLFxuICAnY3VzdGFyZCc6J1xcdWQ4M2NcXHVkZjZlJyxcbiAgJ2N1c3RvbXMnOidcXHVkODNkXFx1ZGVjMycsXG4gICdjeWNsb25lJzonXFx1ZDgzY1xcdWRmMDAnLFxuICAnZGFnZ2VyJzonXFx1ZDgzZFxcdWRkZTEnLFxuICAnZGFuY2VyJzonXFx1ZDgzZFxcdWRjODMnLFxuICAnZGFuY2luZ193b21lbic6J1xcdWQ4M2RcXHVkYzZmJyxcbiAgJ2RhbmNpbmdfbWVuJzonXFx1ZDgzZFxcdWRjNmYmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ2RhbmdvJzonXFx1ZDgzY1xcdWRmNjEnLFxuICAnZGFya19zdW5nbGFzc2VzJzonXFx1ZDgzZFxcdWRkNzYnLFxuICAnZGFydCc6J1xcdWQ4M2NcXHVkZmFmJyxcbiAgJ2Rhc2gnOidcXHVkODNkXFx1ZGNhOCcsXG4gICdkYXRlJzonXFx1ZDgzZFxcdWRjYzUnLFxuICAnZGVjaWR1b3VzX3RyZWUnOidcXHVkODNjXFx1ZGYzMycsXG4gICdkZWVyJzonXFx1ZDgzZVxcdWRkOGMnLFxuICAnZGVwYXJ0bWVudF9zdG9yZSc6J1xcdWQ4M2NcXHVkZmVjJyxcbiAgJ2RlcmVsaWN0X2hvdXNlJzonXFx1ZDgzY1xcdWRmZGEnLFxuICAnZGVzZXJ0JzonXFx1ZDgzY1xcdWRmZGMnLFxuICAnZGVzZXJ0X2lzbGFuZCc6J1xcdWQ4M2NcXHVkZmRkJyxcbiAgJ2Rlc2t0b3BfY29tcHV0ZXInOidcXHVkODNkXFx1ZGRhNScsXG4gICdtYWxlX2RldGVjdGl2ZSc6J1xcdWQ4M2RcXHVkZDc1XFx1ZmUwZicsXG4gICdkaWFtb25kX3NoYXBlX3dpdGhfYV9kb3RfaW5zaWRlJzonXFx1ZDgzZFxcdWRjYTAnLFxuICAnZGlhbW9uZHMnOidcXHUyNjY2XFx1ZmUwZicsXG4gICdkaXNhcHBvaW50ZWQnOidcXHVkODNkXFx1ZGUxZScsXG4gICdkaXNhcHBvaW50ZWRfcmVsaWV2ZWQnOidcXHVkODNkXFx1ZGUyNScsXG4gICdkaXp6eSc6J1xcdWQ4M2RcXHVkY2FiJyxcbiAgJ2Rpenp5X2ZhY2UnOidcXHVkODNkXFx1ZGUzNScsXG4gICdkb19ub3RfbGl0dGVyJzonXFx1ZDgzZFxcdWRlYWYnLFxuICAnZG9nJzonXFx1ZDgzZFxcdWRjMzYnLFxuICAnZG9nMic6J1xcdWQ4M2RcXHVkYzE1JyxcbiAgJ2RvbGxhcic6J1xcdWQ4M2RcXHVkY2I1JyxcbiAgJ2RvbGxzJzonXFx1ZDgzY1xcdWRmOGUnLFxuICAnZG9scGhpbic6J1xcdWQ4M2RcXHVkYzJjJyxcbiAgJ2Rvb3InOidcXHVkODNkXFx1ZGVhYScsXG4gICdkb3VnaG51dCc6J1xcdWQ4M2NcXHVkZjY5JyxcbiAgJ2RvdmUnOidcXHVkODNkXFx1ZGQ0YScsXG4gICdkcmFnb24nOidcXHVkODNkXFx1ZGMwOScsXG4gICdkcmFnb25fZmFjZSc6J1xcdWQ4M2RcXHVkYzMyJyxcbiAgJ2RyZXNzJzonXFx1ZDgzZFxcdWRjNTcnLFxuICAnZHJvbWVkYXJ5X2NhbWVsJzonXFx1ZDgzZFxcdWRjMmEnLFxuICAnZHJvb2xpbmdfZmFjZSc6J1xcdWQ4M2VcXHVkZDI0JyxcbiAgJ2Ryb3BsZXQnOidcXHVkODNkXFx1ZGNhNycsXG4gICdkcnVtJzonXFx1ZDgzZVxcdWRkNDEnLFxuICAnZHVjayc6J1xcdWQ4M2VcXHVkZDg2JyxcbiAgJ2R2ZCc6J1xcdWQ4M2RcXHVkY2MwJyxcbiAgJ2UtbWFpbCc6J1xcdWQ4M2RcXHVkY2U3JyxcbiAgJ2VhZ2xlJzonXFx1ZDgzZVxcdWRkODUnLFxuICAnZWFyJzonXFx1ZDgzZFxcdWRjNDInLFxuICAnZWFyX29mX3JpY2UnOidcXHVkODNjXFx1ZGYzZScsXG4gICdlYXJ0aF9hZnJpY2EnOidcXHVkODNjXFx1ZGYwZCcsXG4gICdlYXJ0aF9hbWVyaWNhcyc6J1xcdWQ4M2NcXHVkZjBlJyxcbiAgJ2VhcnRoX2FzaWEnOidcXHVkODNjXFx1ZGYwZicsXG4gICdlZ2cnOidcXHVkODNlXFx1ZGQ1YScsXG4gICdlZ2dwbGFudCc6J1xcdWQ4M2NcXHVkZjQ2JyxcbiAgJ2VpZ2h0X3BvaW50ZWRfYmxhY2tfc3Rhcic6J1xcdTI3MzRcXHVmZTBmJyxcbiAgJ2VpZ2h0X3Nwb2tlZF9hc3Rlcmlzayc6J1xcdTI3MzNcXHVmZTBmJyxcbiAgJ2VsZWN0cmljX3BsdWcnOidcXHVkODNkXFx1ZGQwYycsXG4gICdlbGVwaGFudCc6J1xcdWQ4M2RcXHVkYzE4JyxcbiAgJ2VtYWlsJzonXFx1MjcwOVxcdWZlMGYnLFxuICAnZW5kJzonXFx1ZDgzZFxcdWRkMWEnLFxuICAnZW52ZWxvcGVfd2l0aF9hcnJvdyc6J1xcdWQ4M2RcXHVkY2U5JyxcbiAgJ2V1cm8nOidcXHVkODNkXFx1ZGNiNicsXG4gICdldXJvcGVhbl9jYXN0bGUnOidcXHVkODNjXFx1ZGZmMCcsXG4gICdldXJvcGVhbl9wb3N0X29mZmljZSc6J1xcdWQ4M2NcXHVkZmU0JyxcbiAgJ2V2ZXJncmVlbl90cmVlJzonXFx1ZDgzY1xcdWRmMzInLFxuICAnZXhjbGFtYXRpb24nOidcXHUyNzU3XFx1ZmUwZicsXG4gICdleHByZXNzaW9ubGVzcyc6J1xcdWQ4M2RcXHVkZTExJyxcbiAgJ2V5ZSc6J1xcdWQ4M2RcXHVkYzQxJyxcbiAgJ2V5ZV9zcGVlY2hfYnViYmxlJzonXFx1ZDgzZFxcdWRjNDEmendqO1xcdWQ4M2RcXHVkZGU4JyxcbiAgJ2V5ZWdsYXNzZXMnOidcXHVkODNkXFx1ZGM1MycsXG4gICdleWVzJzonXFx1ZDgzZFxcdWRjNDAnLFxuICAnZmFjZV93aXRoX2hlYWRfYmFuZGFnZSc6J1xcdWQ4M2VcXHVkZDE1JyxcbiAgJ2ZhY2Vfd2l0aF90aGVybW9tZXRlcic6J1xcdWQ4M2VcXHVkZDEyJyxcbiAgJ2Zpc3Rfb25jb21pbmcnOidcXHVkODNkXFx1ZGM0YScsXG4gICdmYWN0b3J5JzonXFx1ZDgzY1xcdWRmZWQnLFxuICAnZmFsbGVuX2xlYWYnOidcXHVkODNjXFx1ZGY0MicsXG4gICdmYW1pbHlfbWFuX3dvbWFuX2JveSc6J1xcdWQ4M2RcXHVkYzZhJyxcbiAgJ2ZhbWlseV9tYW5fYm95JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fYm95X2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2NiZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV9tYW5fZ2lybF9ib3knOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fZ2lybF9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfbWFuX21hbl9ib3knOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fbWFuX2JveV9ib3knOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY2Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfbWFuX21hbl9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfbWFuX21hbl9naXJsX2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fbWFuX2dpcmxfZ2lybCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV9tYW5fd29tYW5fYm95X2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjYmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fd29tYW5fZ2lybCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFtaWx5X21hbl93b21hbl9naXJsX2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fd29tYW5fZ2lybF9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFtaWx5X3dvbWFuX2JveSc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfd29tYW5fYm95X2JveSc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NiZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X3dvbWFuX2dpcmwnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFtaWx5X3dvbWFuX2dpcmxfYm95JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfd29tYW5fZ2lybF9naXJsJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfd29tYW5fd29tYW5fYm95JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfd29tYW5fd29tYW5fYm95X2JveSc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjYmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV93b21hbl93b21hbl9naXJsJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfd29tYW5fd29tYW5fZ2lybF9ib3knOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfd29tYW5fd29tYW5fZ2lybF9naXJsJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFzdF9mb3J3YXJkJzonXFx1MjNlOScsXG4gICdmYXgnOidcXHVkODNkXFx1ZGNlMCcsXG4gICdmZWFyZnVsJzonXFx1ZDgzZFxcdWRlMjgnLFxuICAnZmVldCc6J1xcdWQ4M2RcXHVkYzNlJyxcbiAgJ2ZlbWFsZV9kZXRlY3RpdmUnOidcXHVkODNkXFx1ZGQ3NVxcdWZlMGYmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ2ZlcnJpc193aGVlbCc6J1xcdWQ4M2NcXHVkZmExJyxcbiAgJ2ZlcnJ5JzonXFx1MjZmNCcsXG4gICdmaWVsZF9ob2NrZXknOidcXHVkODNjXFx1ZGZkMScsXG4gICdmaWxlX2NhYmluZXQnOidcXHVkODNkXFx1ZGRjNCcsXG4gICdmaWxlX2ZvbGRlcic6J1xcdWQ4M2RcXHVkY2MxJyxcbiAgJ2ZpbG1fcHJvamVjdG9yJzonXFx1ZDgzZFxcdWRjZmQnLFxuICAnZmlsbV9zdHJpcCc6J1xcdWQ4M2NcXHVkZjllJyxcbiAgJ2ZpcmUnOidcXHVkODNkXFx1ZGQyNScsXG4gICdmaXJlX2VuZ2luZSc6J1xcdWQ4M2RcXHVkZTkyJyxcbiAgJ2ZpcmV3b3Jrcyc6J1xcdWQ4M2NcXHVkZjg2JyxcbiAgJ2ZpcnN0X3F1YXJ0ZXJfbW9vbic6J1xcdWQ4M2NcXHVkZjEzJyxcbiAgJ2ZpcnN0X3F1YXJ0ZXJfbW9vbl93aXRoX2ZhY2UnOidcXHVkODNjXFx1ZGYxYicsXG4gICdmaXNoJzonXFx1ZDgzZFxcdWRjMWYnLFxuICAnZmlzaF9jYWtlJzonXFx1ZDgzY1xcdWRmNjUnLFxuICAnZmlzaGluZ19wb2xlX2FuZF9maXNoJzonXFx1ZDgzY1xcdWRmYTMnLFxuICAnZmlzdF9yYWlzZWQnOidcXHUyNzBhJyxcbiAgJ2Zpc3RfbGVmdCc6J1xcdWQ4M2VcXHVkZDFiJyxcbiAgJ2Zpc3RfcmlnaHQnOidcXHVkODNlXFx1ZGQxYycsXG4gICdmbGFncyc6J1xcdWQ4M2NcXHVkZjhmJyxcbiAgJ2ZsYXNobGlnaHQnOidcXHVkODNkXFx1ZGQyNicsXG4gICdmbGV1cl9kZV9saXMnOidcXHUyNjljXFx1ZmUwZicsXG4gICdmbGlnaHRfYXJyaXZhbCc6J1xcdWQ4M2RcXHVkZWVjJyxcbiAgJ2ZsaWdodF9kZXBhcnR1cmUnOidcXHVkODNkXFx1ZGVlYicsXG4gICdmbG9wcHlfZGlzayc6J1xcdWQ4M2RcXHVkY2JlJyxcbiAgJ2Zsb3dlcl9wbGF5aW5nX2NhcmRzJzonXFx1ZDgzY1xcdWRmYjQnLFxuICAnZmx1c2hlZCc6J1xcdWQ4M2RcXHVkZTMzJyxcbiAgJ2ZvZyc6J1xcdWQ4M2NcXHVkZjJiJyxcbiAgJ2ZvZ2d5JzonXFx1ZDgzY1xcdWRmMDEnLFxuICAnZm9vdGJhbGwnOidcXHVkODNjXFx1ZGZjOCcsXG4gICdmb290cHJpbnRzJzonXFx1ZDgzZFxcdWRjNjMnLFxuICAnZm9ya19hbmRfa25pZmUnOidcXHVkODNjXFx1ZGY3NCcsXG4gICdmb3VudGFpbic6J1xcdTI2ZjJcXHVmZTBmJyxcbiAgJ2ZvdW50YWluX3Blbic6J1xcdWQ4M2RcXHVkZDhiJyxcbiAgJ2ZvdXJfbGVhZl9jbG92ZXInOidcXHVkODNjXFx1ZGY0MCcsXG4gICdmb3hfZmFjZSc6J1xcdWQ4M2VcXHVkZDhhJyxcbiAgJ2ZyYW1lZF9waWN0dXJlJzonXFx1ZDgzZFxcdWRkYmMnLFxuICAnZnJlZSc6J1xcdWQ4M2NcXHVkZDkzJyxcbiAgJ2ZyaWVkX2VnZyc6J1xcdWQ4M2NcXHVkZjczJyxcbiAgJ2ZyaWVkX3NocmltcCc6J1xcdWQ4M2NcXHVkZjY0JyxcbiAgJ2ZyaWVzJzonXFx1ZDgzY1xcdWRmNWYnLFxuICAnZnJvZyc6J1xcdWQ4M2RcXHVkYzM4JyxcbiAgJ2Zyb3duaW5nJzonXFx1ZDgzZFxcdWRlMjYnLFxuICAnZnJvd25pbmdfZmFjZSc6J1xcdTI2MzlcXHVmZTBmJyxcbiAgJ2Zyb3duaW5nX21hbic6J1xcdWQ4M2RcXHVkZTRkJnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdmcm93bmluZ193b21hbic6J1xcdWQ4M2RcXHVkZTRkJyxcbiAgJ21pZGRsZV9maW5nZXInOidcXHVkODNkXFx1ZGQ5NScsXG4gICdmdWVscHVtcCc6J1xcdTI2ZmRcXHVmZTBmJyxcbiAgJ2Z1bGxfbW9vbic6J1xcdWQ4M2NcXHVkZjE1JyxcbiAgJ2Z1bGxfbW9vbl93aXRoX2ZhY2UnOidcXHVkODNjXFx1ZGYxZCcsXG4gICdmdW5lcmFsX3Vybic6J1xcdTI2YjFcXHVmZTBmJyxcbiAgJ2dhbWVfZGllJzonXFx1ZDgzY1xcdWRmYjInLFxuICAnZ2Vhcic6J1xcdTI2OTlcXHVmZTBmJyxcbiAgJ2dlbSc6J1xcdWQ4M2RcXHVkYzhlJyxcbiAgJ2dlbWluaSc6J1xcdTI2NGFcXHVmZTBmJyxcbiAgJ2dob3N0JzonXFx1ZDgzZFxcdWRjN2InLFxuICAnZ2lmdCc6J1xcdWQ4M2NcXHVkZjgxJyxcbiAgJ2dpZnRfaGVhcnQnOidcXHVkODNkXFx1ZGM5ZCcsXG4gICdnaXJsJzonXFx1ZDgzZFxcdWRjNjcnLFxuICAnZ2xvYmVfd2l0aF9tZXJpZGlhbnMnOidcXHVkODNjXFx1ZGYxMCcsXG4gICdnb2FsX25ldCc6J1xcdWQ4M2VcXHVkZDQ1JyxcbiAgJ2dvYXQnOidcXHVkODNkXFx1ZGMxMCcsXG4gICdnb2xmJzonXFx1MjZmM1xcdWZlMGYnLFxuICAnZ29sZmluZ19tYW4nOidcXHVkODNjXFx1ZGZjY1xcdWZlMGYnLFxuICAnZ29sZmluZ193b21hbic6J1xcdWQ4M2NcXHVkZmNjXFx1ZmUwZiZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnZ29yaWxsYSc6J1xcdWQ4M2VcXHVkZDhkJyxcbiAgJ2dyYXBlcyc6J1xcdWQ4M2NcXHVkZjQ3JyxcbiAgJ2dyZWVuX2FwcGxlJzonXFx1ZDgzY1xcdWRmNGYnLFxuICAnZ3JlZW5fYm9vayc6J1xcdWQ4M2RcXHVkY2Q3JyxcbiAgJ2dyZWVuX2hlYXJ0JzonXFx1ZDgzZFxcdWRjOWEnLFxuICAnZ3JlZW5fc2FsYWQnOidcXHVkODNlXFx1ZGQ1NycsXG4gICdncmV5X2V4Y2xhbWF0aW9uJzonXFx1Mjc1NScsXG4gICdncmV5X3F1ZXN0aW9uJzonXFx1Mjc1NCcsXG4gICdncmltYWNpbmcnOidcXHVkODNkXFx1ZGUyYycsXG4gICdncmluJzonXFx1ZDgzZFxcdWRlMDEnLFxuICAnZ3Jpbm5pbmcnOidcXHVkODNkXFx1ZGUwMCcsXG4gICdndWFyZHNtYW4nOidcXHVkODNkXFx1ZGM4MicsXG4gICdndWFyZHN3b21hbic6J1xcdWQ4M2RcXHVkYzgyJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdndWl0YXInOidcXHVkODNjXFx1ZGZiOCcsXG4gICdndW4nOidcXHVkODNkXFx1ZGQyYicsXG4gICdoYWlyY3V0X3dvbWFuJzonXFx1ZDgzZFxcdWRjODcnLFxuICAnaGFpcmN1dF9tYW4nOidcXHVkODNkXFx1ZGM4NyZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnaGFtYnVyZ2VyJzonXFx1ZDgzY1xcdWRmNTQnLFxuICAnaGFtbWVyJzonXFx1ZDgzZFxcdWRkMjgnLFxuICAnaGFtbWVyX2FuZF9waWNrJzonXFx1MjY5MicsXG4gICdoYW1tZXJfYW5kX3dyZW5jaCc6J1xcdWQ4M2RcXHVkZWUwJyxcbiAgJ2hhbXN0ZXInOidcXHVkODNkXFx1ZGMzOScsXG4gICdoYW5kJzonXFx1MjcwYicsXG4gICdoYW5kYmFnJzonXFx1ZDgzZFxcdWRjNWMnLFxuICAnaGFuZHNoYWtlJzonXFx1ZDgzZVxcdWRkMWQnLFxuICAnaGFua2V5JzonXFx1ZDgzZFxcdWRjYTknLFxuICAnaGF0Y2hlZF9jaGljayc6J1xcdWQ4M2RcXHVkYzI1JyxcbiAgJ2hhdGNoaW5nX2NoaWNrJzonXFx1ZDgzZFxcdWRjMjMnLFxuICAnaGVhZHBob25lcyc6J1xcdWQ4M2NcXHVkZmE3JyxcbiAgJ2hlYXJfbm9fZXZpbCc6J1xcdWQ4M2RcXHVkZTQ5JyxcbiAgJ2hlYXJ0JzonXFx1Mjc2NFxcdWZlMGYnLFxuICAnaGVhcnRfZGVjb3JhdGlvbic6J1xcdWQ4M2RcXHVkYzlmJyxcbiAgJ2hlYXJ0X2V5ZXMnOidcXHVkODNkXFx1ZGUwZCcsXG4gICdoZWFydF9leWVzX2NhdCc6J1xcdWQ4M2RcXHVkZTNiJyxcbiAgJ2hlYXJ0YmVhdCc6J1xcdWQ4M2RcXHVkYzkzJyxcbiAgJ2hlYXJ0cHVsc2UnOidcXHVkODNkXFx1ZGM5NycsXG4gICdoZWFydHMnOidcXHUyNjY1XFx1ZmUwZicsXG4gICdoZWF2eV9jaGVja19tYXJrJzonXFx1MjcxNFxcdWZlMGYnLFxuICAnaGVhdnlfZGl2aXNpb25fc2lnbic6J1xcdTI3OTcnLFxuICAnaGVhdnlfZG9sbGFyX3NpZ24nOidcXHVkODNkXFx1ZGNiMicsXG4gICdoZWF2eV9oZWFydF9leGNsYW1hdGlvbic6J1xcdTI3NjNcXHVmZTBmJyxcbiAgJ2hlYXZ5X21pbnVzX3NpZ24nOidcXHUyNzk2JyxcbiAgJ2hlYXZ5X211bHRpcGxpY2F0aW9uX3gnOidcXHUyNzE2XFx1ZmUwZicsXG4gICdoZWF2eV9wbHVzX3NpZ24nOidcXHUyNzk1JyxcbiAgJ2hlbGljb3B0ZXInOidcXHVkODNkXFx1ZGU4MScsXG4gICdoZXJiJzonXFx1ZDgzY1xcdWRmM2YnLFxuICAnaGliaXNjdXMnOidcXHVkODNjXFx1ZGYzYScsXG4gICdoaWdoX2JyaWdodG5lc3MnOidcXHVkODNkXFx1ZGQwNicsXG4gICdoaWdoX2hlZWwnOidcXHVkODNkXFx1ZGM2MCcsXG4gICdob2Nobyc6J1xcdWQ4M2RcXHVkZDJhJyxcbiAgJ2hvbGUnOidcXHVkODNkXFx1ZGQ3MycsXG4gICdob25leV9wb3QnOidcXHVkODNjXFx1ZGY2ZicsXG4gICdob3JzZSc6J1xcdWQ4M2RcXHVkYzM0JyxcbiAgJ2hvcnNlX3JhY2luZyc6J1xcdWQ4M2NcXHVkZmM3JyxcbiAgJ2hvc3BpdGFsJzonXFx1ZDgzY1xcdWRmZTUnLFxuICAnaG90X3BlcHBlcic6J1xcdWQ4M2NcXHVkZjM2JyxcbiAgJ2hvdGRvZyc6J1xcdWQ4M2NcXHVkZjJkJyxcbiAgJ2hvdGVsJzonXFx1ZDgzY1xcdWRmZTgnLFxuICAnaG90c3ByaW5ncyc6J1xcdTI2NjhcXHVmZTBmJyxcbiAgJ2hvdXJnbGFzcyc6J1xcdTIzMWJcXHVmZTBmJyxcbiAgJ2hvdXJnbGFzc19mbG93aW5nX3NhbmQnOidcXHUyM2YzJyxcbiAgJ2hvdXNlJzonXFx1ZDgzY1xcdWRmZTAnLFxuICAnaG91c2Vfd2l0aF9nYXJkZW4nOidcXHVkODNjXFx1ZGZlMScsXG4gICdob3VzZXMnOidcXHVkODNjXFx1ZGZkOCcsXG4gICdodWdzJzonXFx1ZDgzZVxcdWRkMTcnLFxuICAnaHVzaGVkJzonXFx1ZDgzZFxcdWRlMmYnLFxuICAnaWNlX2NyZWFtJzonXFx1ZDgzY1xcdWRmNjgnLFxuICAnaWNlX2hvY2tleSc6J1xcdWQ4M2NcXHVkZmQyJyxcbiAgJ2ljZV9za2F0ZSc6J1xcdTI2ZjgnLFxuICAnaWNlY3JlYW0nOidcXHVkODNjXFx1ZGY2NicsXG4gICdpZCc6J1xcdWQ4M2NcXHVkZDk0JyxcbiAgJ2lkZW9ncmFwaF9hZHZhbnRhZ2UnOidcXHVkODNjXFx1ZGU1MCcsXG4gICdpbXAnOidcXHVkODNkXFx1ZGM3ZicsXG4gICdpbmJveF90cmF5JzonXFx1ZDgzZFxcdWRjZTUnLFxuICAnaW5jb21pbmdfZW52ZWxvcGUnOidcXHVkODNkXFx1ZGNlOCcsXG4gICd0aXBwaW5nX2hhbmRfd29tYW4nOidcXHVkODNkXFx1ZGM4MScsXG4gICdpbmZvcm1hdGlvbl9zb3VyY2UnOidcXHUyMTM5XFx1ZmUwZicsXG4gICdpbm5vY2VudCc6J1xcdWQ4M2RcXHVkZTA3JyxcbiAgJ2ludGVycm9iYW5nJzonXFx1MjA0OVxcdWZlMGYnLFxuICAnaXBob25lJzonXFx1ZDgzZFxcdWRjZjEnLFxuICAnaXpha2F5YV9sYW50ZXJuJzonXFx1ZDgzY1xcdWRmZWUnLFxuICAnamFja19vX2xhbnRlcm4nOidcXHVkODNjXFx1ZGY4MycsXG4gICdqYXBhbic6J1xcdWQ4M2RcXHVkZGZlJyxcbiAgJ2phcGFuZXNlX2Nhc3RsZSc6J1xcdWQ4M2NcXHVkZmVmJyxcbiAgJ2phcGFuZXNlX2dvYmxpbic6J1xcdWQ4M2RcXHVkYzdhJyxcbiAgJ2phcGFuZXNlX29ncmUnOidcXHVkODNkXFx1ZGM3OScsXG4gICdqZWFucyc6J1xcdWQ4M2RcXHVkYzU2JyxcbiAgJ2pveSc6J1xcdWQ4M2RcXHVkZTAyJyxcbiAgJ2pveV9jYXQnOidcXHVkODNkXFx1ZGUzOScsXG4gICdqb3lzdGljayc6J1xcdWQ4M2RcXHVkZDc5JyxcbiAgJ2thYWJhJzonXFx1ZDgzZFxcdWRkNGInLFxuICAna2V5JzonXFx1ZDgzZFxcdWRkMTEnLFxuICAna2V5Ym9hcmQnOidcXHUyMzI4XFx1ZmUwZicsXG4gICdrZXljYXBfdGVuJzonXFx1ZDgzZFxcdWRkMWYnLFxuICAna2lja19zY29vdGVyJzonXFx1ZDgzZFxcdWRlZjQnLFxuICAna2ltb25vJzonXFx1ZDgzZFxcdWRjNTgnLFxuICAna2lzcyc6J1xcdWQ4M2RcXHVkYzhiJyxcbiAgJ2tpc3NpbmcnOidcXHVkODNkXFx1ZGUxNycsXG4gICdraXNzaW5nX2NhdCc6J1xcdWQ4M2RcXHVkZTNkJyxcbiAgJ2tpc3NpbmdfY2xvc2VkX2V5ZXMnOidcXHVkODNkXFx1ZGUxYScsXG4gICdraXNzaW5nX2hlYXJ0JzonXFx1ZDgzZFxcdWRlMTgnLFxuICAna2lzc2luZ19zbWlsaW5nX2V5ZXMnOidcXHVkODNkXFx1ZGUxOScsXG4gICdraXdpX2ZydWl0JzonXFx1ZDgzZVxcdWRkNWQnLFxuICAna29hbGEnOidcXHVkODNkXFx1ZGMyOCcsXG4gICdrb2tvJzonXFx1ZDgzY1xcdWRlMDEnLFxuICAnbGFiZWwnOidcXHVkODNjXFx1ZGZmNycsXG4gICdsYXJnZV9ibHVlX2NpcmNsZSc6J1xcdWQ4M2RcXHVkZDM1JyxcbiAgJ2xhcmdlX2JsdWVfZGlhbW9uZCc6J1xcdWQ4M2RcXHVkZDM3JyxcbiAgJ2xhcmdlX29yYW5nZV9kaWFtb25kJzonXFx1ZDgzZFxcdWRkMzYnLFxuICAnbGFzdF9xdWFydGVyX21vb24nOidcXHVkODNjXFx1ZGYxNycsXG4gICdsYXN0X3F1YXJ0ZXJfbW9vbl93aXRoX2ZhY2UnOidcXHVkODNjXFx1ZGYxYycsXG4gICdsYXRpbl9jcm9zcyc6J1xcdTI3MWRcXHVmZTBmJyxcbiAgJ2xhdWdoaW5nJzonXFx1ZDgzZFxcdWRlMDYnLFxuICAnbGVhdmVzJzonXFx1ZDgzY1xcdWRmNDMnLFxuICAnbGVkZ2VyJzonXFx1ZDgzZFxcdWRjZDInLFxuICAnbGVmdF9sdWdnYWdlJzonXFx1ZDgzZFxcdWRlYzUnLFxuICAnbGVmdF9yaWdodF9hcnJvdyc6J1xcdTIxOTRcXHVmZTBmJyxcbiAgJ2xlZnR3YXJkc19hcnJvd193aXRoX2hvb2snOidcXHUyMWE5XFx1ZmUwZicsXG4gICdsZW1vbic6J1xcdWQ4M2NcXHVkZjRiJyxcbiAgJ2xlbyc6J1xcdTI2NGNcXHVmZTBmJyxcbiAgJ2xlb3BhcmQnOidcXHVkODNkXFx1ZGMwNicsXG4gICdsZXZlbF9zbGlkZXInOidcXHVkODNjXFx1ZGY5YScsXG4gICdsaWJyYSc6J1xcdTI2NGVcXHVmZTBmJyxcbiAgJ2xpZ2h0X3JhaWwnOidcXHVkODNkXFx1ZGU4OCcsXG4gICdsaW5rJzonXFx1ZDgzZFxcdWRkMTcnLFxuICAnbGlvbic6J1xcdWQ4M2VcXHVkZDgxJyxcbiAgJ2xpcHMnOidcXHVkODNkXFx1ZGM0NCcsXG4gICdsaXBzdGljayc6J1xcdWQ4M2RcXHVkYzg0JyxcbiAgJ2xpemFyZCc6J1xcdWQ4M2VcXHVkZDhlJyxcbiAgJ2xvY2snOidcXHVkODNkXFx1ZGQxMicsXG4gICdsb2NrX3dpdGhfaW5rX3Blbic6J1xcdWQ4M2RcXHVkZDBmJyxcbiAgJ2xvbGxpcG9wJzonXFx1ZDgzY1xcdWRmNmQnLFxuICAnbG9vcCc6J1xcdTI3YmYnLFxuICAnbG91ZF9zb3VuZCc6J1xcdWQ4M2RcXHVkZDBhJyxcbiAgJ2xvdWRzcGVha2VyJzonXFx1ZDgzZFxcdWRjZTInLFxuICAnbG92ZV9ob3RlbCc6J1xcdWQ4M2NcXHVkZmU5JyxcbiAgJ2xvdmVfbGV0dGVyJzonXFx1ZDgzZFxcdWRjOGMnLFxuICAnbG93X2JyaWdodG5lc3MnOidcXHVkODNkXFx1ZGQwNScsXG4gICdseWluZ19mYWNlJzonXFx1ZDgzZVxcdWRkMjUnLFxuICAnbSc6J1xcdTI0YzJcXHVmZTBmJyxcbiAgJ21hZyc6J1xcdWQ4M2RcXHVkZDBkJyxcbiAgJ21hZ19yaWdodCc6J1xcdWQ4M2RcXHVkZDBlJyxcbiAgJ21haGpvbmcnOidcXHVkODNjXFx1ZGMwNFxcdWZlMGYnLFxuICAnbWFpbGJveCc6J1xcdWQ4M2RcXHVkY2ViJyxcbiAgJ21haWxib3hfY2xvc2VkJzonXFx1ZDgzZFxcdWRjZWEnLFxuICAnbWFpbGJveF93aXRoX21haWwnOidcXHVkODNkXFx1ZGNlYycsXG4gICdtYWlsYm94X3dpdGhfbm9fbWFpbCc6J1xcdWQ4M2RcXHVkY2VkJyxcbiAgJ21hbic6J1xcdWQ4M2RcXHVkYzY4JyxcbiAgJ21hbl9hcnRpc3QnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmYTgnLFxuICAnbWFuX2FzdHJvbmF1dCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGU4MCcsXG4gICdtYW5fY2FydHdoZWVsaW5nJzonXFx1ZDgzZVxcdWRkMzgmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21hbl9jb29rJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2NcXHVkZjczJyxcbiAgJ21hbl9kYW5jaW5nJzonXFx1ZDgzZFxcdWRkN2EnLFxuICAnbWFuX2ZhY2VwYWxtaW5nJzonXFx1ZDgzZVxcdWRkMjYmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21hbl9mYWN0b3J5X3dvcmtlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNjXFx1ZGZlZCcsXG4gICdtYW5fZmFybWVyJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2NcXHVkZjNlJyxcbiAgJ21hbl9maXJlZmlnaHRlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGU5MicsXG4gICdtYW5faGVhbHRoX3dvcmtlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHUyNjk1XFx1ZmUwZicsXG4gICdtYW5faW5fdHV4ZWRvJzonXFx1ZDgzZVxcdWRkMzUnLFxuICAnbWFuX2p1ZGdlJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdTI2OTZcXHVmZTBmJyxcbiAgJ21hbl9qdWdnbGluZyc6J1xcdWQ4M2VcXHVkZDM5Jnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdtYW5fbWVjaGFuaWMnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRkMjcnLFxuICAnbWFuX29mZmljZV93b3JrZXInOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjYmMnLFxuICAnbWFuX3BpbG90JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdTI3MDhcXHVmZTBmJyxcbiAgJ21hbl9wbGF5aW5nX2hhbmRiYWxsJzonXFx1ZDgzZVxcdWRkM2UmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21hbl9wbGF5aW5nX3dhdGVyX3BvbG8nOidcXHVkODNlXFx1ZGQzZCZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWFuX3NjaWVudGlzdCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGQyYycsXG4gICdtYW5fc2hydWdnaW5nJzonXFx1ZDgzZVxcdWRkMzcmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21hbl9zaW5nZXInOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmYTQnLFxuICAnbWFuX3N0dWRlbnQnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmOTMnLFxuICAnbWFuX3RlYWNoZXInOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmZWInLFxuICAnbWFuX3RlY2hub2xvZ2lzdCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGNiYicsXG4gICdtYW5fd2l0aF9ndWFfcGlfbWFvJzonXFx1ZDgzZFxcdWRjNzInLFxuICAnbWFuX3dpdGhfdHVyYmFuJzonXFx1ZDgzZFxcdWRjNzMnLFxuICAndGFuZ2VyaW5lJzonXFx1ZDgzY1xcdWRmNGEnLFxuICAnbWFuc19zaG9lJzonXFx1ZDgzZFxcdWRjNWUnLFxuICAnbWFudGVscGllY2VfY2xvY2snOidcXHVkODNkXFx1ZGQ3MCcsXG4gICdtYXBsZV9sZWFmJzonXFx1ZDgzY1xcdWRmNDEnLFxuICAnbWFydGlhbF9hcnRzX3VuaWZvcm0nOidcXHVkODNlXFx1ZGQ0YicsXG4gICdtYXNrJzonXFx1ZDgzZFxcdWRlMzcnLFxuICAnbWFzc2FnZV93b21hbic6J1xcdWQ4M2RcXHVkYzg2JyxcbiAgJ21hc3NhZ2VfbWFuJzonXFx1ZDgzZFxcdWRjODYmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21lYXRfb25fYm9uZSc6J1xcdWQ4M2NcXHVkZjU2JyxcbiAgJ21lZGFsX21pbGl0YXJ5JzonXFx1ZDgzY1xcdWRmOTYnLFxuICAnbWVkYWxfc3BvcnRzJzonXFx1ZDgzY1xcdWRmYzUnLFxuICAnbWVnYSc6J1xcdWQ4M2RcXHVkY2UzJyxcbiAgJ21lbG9uJzonXFx1ZDgzY1xcdWRmNDgnLFxuICAnbWVtbyc6J1xcdWQ4M2RcXHVkY2RkJyxcbiAgJ21lbl93cmVzdGxpbmcnOidcXHVkODNlXFx1ZGQzYyZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWVub3JhaCc6J1xcdWQ4M2RcXHVkZDRlJyxcbiAgJ21lbnMnOidcXHVkODNkXFx1ZGViOScsXG4gICdtZXRhbCc6J1xcdWQ4M2VcXHVkZDE4JyxcbiAgJ21ldHJvJzonXFx1ZDgzZFxcdWRlODcnLFxuICAnbWljcm9waG9uZSc6J1xcdWQ4M2NcXHVkZmE0JyxcbiAgJ21pY3Jvc2NvcGUnOidcXHVkODNkXFx1ZGQyYycsXG4gICdtaWxrX2dsYXNzJzonXFx1ZDgzZVxcdWRkNWInLFxuICAnbWlsa3lfd2F5JzonXFx1ZDgzY1xcdWRmMGMnLFxuICAnbWluaWJ1cyc6J1xcdWQ4M2RcXHVkZTkwJyxcbiAgJ21pbmlkaXNjJzonXFx1ZDgzZFxcdWRjYmQnLFxuICAnbW9iaWxlX3Bob25lX29mZic6J1xcdWQ4M2RcXHVkY2Y0JyxcbiAgJ21vbmV5X21vdXRoX2ZhY2UnOidcXHVkODNlXFx1ZGQxMScsXG4gICdtb25leV93aXRoX3dpbmdzJzonXFx1ZDgzZFxcdWRjYjgnLFxuICAnbW9uZXliYWcnOidcXHVkODNkXFx1ZGNiMCcsXG4gICdtb25rZXknOidcXHVkODNkXFx1ZGMxMicsXG4gICdtb25rZXlfZmFjZSc6J1xcdWQ4M2RcXHVkYzM1JyxcbiAgJ21vbm9yYWlsJzonXFx1ZDgzZFxcdWRlOWQnLFxuICAnbW9vbic6J1xcdWQ4M2NcXHVkZjE0JyxcbiAgJ21vcnRhcl9ib2FyZCc6J1xcdWQ4M2NcXHVkZjkzJyxcbiAgJ21vc3F1ZSc6J1xcdWQ4M2RcXHVkZDRjJyxcbiAgJ21vdG9yX2JvYXQnOidcXHVkODNkXFx1ZGVlNScsXG4gICdtb3Rvcl9zY29vdGVyJzonXFx1ZDgzZFxcdWRlZjUnLFxuICAnbW90b3JjeWNsZSc6J1xcdWQ4M2NcXHVkZmNkJyxcbiAgJ21vdG9yd2F5JzonXFx1ZDgzZFxcdWRlZTMnLFxuICAnbW91bnRfZnVqaSc6J1xcdWQ4M2RcXHVkZGZiJyxcbiAgJ21vdW50YWluJzonXFx1MjZmMCcsXG4gICdtb3VudGFpbl9iaWtpbmdfbWFuJzonXFx1ZDgzZFxcdWRlYjUnLFxuICAnbW91bnRhaW5fYmlraW5nX3dvbWFuJzonXFx1ZDgzZFxcdWRlYjUmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ21vdW50YWluX2NhYmxld2F5JzonXFx1ZDgzZFxcdWRlYTAnLFxuICAnbW91bnRhaW5fcmFpbHdheSc6J1xcdWQ4M2RcXHVkZTllJyxcbiAgJ21vdW50YWluX3Nub3cnOidcXHVkODNjXFx1ZGZkNCcsXG4gICdtb3VzZSc6J1xcdWQ4M2RcXHVkYzJkJyxcbiAgJ21vdXNlMic6J1xcdWQ4M2RcXHVkYzAxJyxcbiAgJ21vdmllX2NhbWVyYSc6J1xcdWQ4M2NcXHVkZmE1JyxcbiAgJ21veWFpJzonXFx1ZDgzZFxcdWRkZmYnLFxuICAnbXJzX2NsYXVzJzonXFx1ZDgzZVxcdWRkMzYnLFxuICAnbXVzY2xlJzonXFx1ZDgzZFxcdWRjYWEnLFxuICAnbXVzaHJvb20nOidcXHVkODNjXFx1ZGY0NCcsXG4gICdtdXNpY2FsX2tleWJvYXJkJzonXFx1ZDgzY1xcdWRmYjknLFxuICAnbXVzaWNhbF9ub3RlJzonXFx1ZDgzY1xcdWRmYjUnLFxuICAnbXVzaWNhbF9zY29yZSc6J1xcdWQ4M2NcXHVkZmJjJyxcbiAgJ211dGUnOidcXHVkODNkXFx1ZGQwNycsXG4gICduYWlsX2NhcmUnOidcXHVkODNkXFx1ZGM4NScsXG4gICduYW1lX2JhZGdlJzonXFx1ZDgzZFxcdWRjZGInLFxuICAnbmF0aW9uYWxfcGFyayc6J1xcdWQ4M2NcXHVkZmRlJyxcbiAgJ25hdXNlYXRlZF9mYWNlJzonXFx1ZDgzZVxcdWRkMjInLFxuICAnbmVja3RpZSc6J1xcdWQ4M2RcXHVkYzU0JyxcbiAgJ25lZ2F0aXZlX3NxdWFyZWRfY3Jvc3NfbWFyayc6J1xcdTI3NGUnLFxuICAnbmVyZF9mYWNlJzonXFx1ZDgzZVxcdWRkMTMnLFxuICAnbmV1dHJhbF9mYWNlJzonXFx1ZDgzZFxcdWRlMTAnLFxuICAnbmV3JzonXFx1ZDgzY1xcdWRkOTUnLFxuICAnbmV3X21vb24nOidcXHVkODNjXFx1ZGYxMScsXG4gICduZXdfbW9vbl93aXRoX2ZhY2UnOidcXHVkODNjXFx1ZGYxYScsXG4gICduZXdzcGFwZXInOidcXHVkODNkXFx1ZGNmMCcsXG4gICduZXdzcGFwZXJfcm9sbCc6J1xcdWQ4M2RcXHVkZGRlJyxcbiAgJ25leHRfdHJhY2tfYnV0dG9uJzonXFx1MjNlZCcsXG4gICduZyc6J1xcdWQ4M2NcXHVkZDk2JyxcbiAgJ25vX2dvb2RfbWFuJzonXFx1ZDgzZFxcdWRlNDUmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ25vX2dvb2Rfd29tYW4nOidcXHVkODNkXFx1ZGU0NScsXG4gICduaWdodF93aXRoX3N0YXJzJzonXFx1ZDgzY1xcdWRmMDMnLFxuICAnbm9fYmVsbCc6J1xcdWQ4M2RcXHVkZDE1JyxcbiAgJ25vX2JpY3ljbGVzJzonXFx1ZDgzZFxcdWRlYjMnLFxuICAnbm9fZW50cnknOidcXHUyNmQ0XFx1ZmUwZicsXG4gICdub19lbnRyeV9zaWduJzonXFx1ZDgzZFxcdWRlYWInLFxuICAnbm9fbW9iaWxlX3Bob25lcyc6J1xcdWQ4M2RcXHVkY2Y1JyxcbiAgJ25vX21vdXRoJzonXFx1ZDgzZFxcdWRlMzYnLFxuICAnbm9fcGVkZXN0cmlhbnMnOidcXHVkODNkXFx1ZGViNycsXG4gICdub19zbW9raW5nJzonXFx1ZDgzZFxcdWRlYWQnLFxuICAnbm9uLXBvdGFibGVfd2F0ZXInOidcXHVkODNkXFx1ZGViMScsXG4gICdub3NlJzonXFx1ZDgzZFxcdWRjNDMnLFxuICAnbm90ZWJvb2snOidcXHVkODNkXFx1ZGNkMycsXG4gICdub3RlYm9va193aXRoX2RlY29yYXRpdmVfY292ZXInOidcXHVkODNkXFx1ZGNkNCcsXG4gICdub3Rlcyc6J1xcdWQ4M2NcXHVkZmI2JyxcbiAgJ251dF9hbmRfYm9sdCc6J1xcdWQ4M2RcXHVkZDI5JyxcbiAgJ28nOidcXHUyYjU1XFx1ZmUwZicsXG4gICdvMic6J1xcdWQ4M2NcXHVkZDdlXFx1ZmUwZicsXG4gICdvY2Vhbic6J1xcdWQ4M2NcXHVkZjBhJyxcbiAgJ29jdG9wdXMnOidcXHVkODNkXFx1ZGMxOScsXG4gICdvZGVuJzonXFx1ZDgzY1xcdWRmNjInLFxuICAnb2ZmaWNlJzonXFx1ZDgzY1xcdWRmZTInLFxuICAnb2lsX2RydW0nOidcXHVkODNkXFx1ZGVlMicsXG4gICdvayc6J1xcdWQ4M2NcXHVkZDk3JyxcbiAgJ29rX2hhbmQnOidcXHVkODNkXFx1ZGM0YycsXG4gICdva19tYW4nOidcXHVkODNkXFx1ZGU0NiZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnb2tfd29tYW4nOidcXHVkODNkXFx1ZGU0NicsXG4gICdvbGRfa2V5JzonXFx1ZDgzZFxcdWRkZGQnLFxuICAnb2xkZXJfbWFuJzonXFx1ZDgzZFxcdWRjNzQnLFxuICAnb2xkZXJfd29tYW4nOidcXHVkODNkXFx1ZGM3NScsXG4gICdvbSc6J1xcdWQ4M2RcXHVkZDQ5JyxcbiAgJ29uJzonXFx1ZDgzZFxcdWRkMWInLFxuICAnb25jb21pbmdfYXV0b21vYmlsZSc6J1xcdWQ4M2RcXHVkZTk4JyxcbiAgJ29uY29taW5nX2J1cyc6J1xcdWQ4M2RcXHVkZThkJyxcbiAgJ29uY29taW5nX3BvbGljZV9jYXInOidcXHVkODNkXFx1ZGU5NCcsXG4gICdvbmNvbWluZ190YXhpJzonXFx1ZDgzZFxcdWRlOTYnLFxuICAnb3Blbl9maWxlX2ZvbGRlcic6J1xcdWQ4M2RcXHVkY2MyJyxcbiAgJ29wZW5faGFuZHMnOidcXHVkODNkXFx1ZGM1MCcsXG4gICdvcGVuX21vdXRoJzonXFx1ZDgzZFxcdWRlMmUnLFxuICAnb3Blbl91bWJyZWxsYSc6J1xcdTI2MDJcXHVmZTBmJyxcbiAgJ29waGl1Y2h1cyc6J1xcdTI2Y2UnLFxuICAnb3JhbmdlX2Jvb2snOidcXHVkODNkXFx1ZGNkOScsXG4gICdvcnRob2RveF9jcm9zcyc6J1xcdTI2MjZcXHVmZTBmJyxcbiAgJ291dGJveF90cmF5JzonXFx1ZDgzZFxcdWRjZTQnLFxuICAnb3dsJzonXFx1ZDgzZVxcdWRkODknLFxuICAnb3gnOidcXHVkODNkXFx1ZGMwMicsXG4gICdwYWNrYWdlJzonXFx1ZDgzZFxcdWRjZTYnLFxuICAncGFnZV9mYWNpbmdfdXAnOidcXHVkODNkXFx1ZGNjNCcsXG4gICdwYWdlX3dpdGhfY3VybCc6J1xcdWQ4M2RcXHVkY2MzJyxcbiAgJ3BhZ2VyJzonXFx1ZDgzZFxcdWRjZGYnLFxuICAncGFpbnRicnVzaCc6J1xcdWQ4M2RcXHVkZDhjJyxcbiAgJ3BhbG1fdHJlZSc6J1xcdWQ4M2NcXHVkZjM0JyxcbiAgJ3BhbmNha2VzJzonXFx1ZDgzZVxcdWRkNWUnLFxuICAncGFuZGFfZmFjZSc6J1xcdWQ4M2RcXHVkYzNjJyxcbiAgJ3BhcGVyY2xpcCc6J1xcdWQ4M2RcXHVkY2NlJyxcbiAgJ3BhcGVyY2xpcHMnOidcXHVkODNkXFx1ZGQ4NycsXG4gICdwYXJhc29sX29uX2dyb3VuZCc6J1xcdTI2ZjEnLFxuICAncGFya2luZyc6J1xcdWQ4M2NcXHVkZDdmXFx1ZmUwZicsXG4gICdwYXJ0X2FsdGVybmF0aW9uX21hcmsnOidcXHUzMDNkXFx1ZmUwZicsXG4gICdwYXJ0bHlfc3VubnknOidcXHUyNmM1XFx1ZmUwZicsXG4gICdwYXNzZW5nZXJfc2hpcCc6J1xcdWQ4M2RcXHVkZWYzJyxcbiAgJ3Bhc3Nwb3J0X2NvbnRyb2wnOidcXHVkODNkXFx1ZGVjMicsXG4gICdwYXVzZV9idXR0b24nOidcXHUyM2Y4JyxcbiAgJ3BlYWNlX3N5bWJvbCc6J1xcdTI2MmVcXHVmZTBmJyxcbiAgJ3BlYWNoJzonXFx1ZDgzY1xcdWRmNTEnLFxuICAncGVhbnV0cyc6J1xcdWQ4M2VcXHVkZDVjJyxcbiAgJ3BlYXInOidcXHVkODNjXFx1ZGY1MCcsXG4gICdwZW4nOidcXHVkODNkXFx1ZGQ4YScsXG4gICdwZW5jaWwyJzonXFx1MjcwZlxcdWZlMGYnLFxuICAncGVuZ3Vpbic6J1xcdWQ4M2RcXHVkYzI3JyxcbiAgJ3BlbnNpdmUnOidcXHVkODNkXFx1ZGUxNCcsXG4gICdwZXJmb3JtaW5nX2FydHMnOidcXHVkODNjXFx1ZGZhZCcsXG4gICdwZXJzZXZlcmUnOidcXHVkODNkXFx1ZGUyMycsXG4gICdwZXJzb25fZmVuY2luZyc6J1xcdWQ4M2VcXHVkZDNhJyxcbiAgJ3BvdXRpbmdfd29tYW4nOidcXHVkODNkXFx1ZGU0ZScsXG4gICdwaG9uZSc6J1xcdTI2MGVcXHVmZTBmJyxcbiAgJ3BpY2snOidcXHUyNmNmJyxcbiAgJ3BpZyc6J1xcdWQ4M2RcXHVkYzM3JyxcbiAgJ3BpZzInOidcXHVkODNkXFx1ZGMxNicsXG4gICdwaWdfbm9zZSc6J1xcdWQ4M2RcXHVkYzNkJyxcbiAgJ3BpbGwnOidcXHVkODNkXFx1ZGM4YScsXG4gICdwaW5lYXBwbGUnOidcXHVkODNjXFx1ZGY0ZCcsXG4gICdwaW5nX3BvbmcnOidcXHVkODNjXFx1ZGZkMycsXG4gICdwaXNjZXMnOidcXHUyNjUzXFx1ZmUwZicsXG4gICdwaXp6YSc6J1xcdWQ4M2NcXHVkZjU1JyxcbiAgJ3BsYWNlX29mX3dvcnNoaXAnOidcXHVkODNkXFx1ZGVkMCcsXG4gICdwbGF0ZV93aXRoX2N1dGxlcnknOidcXHVkODNjXFx1ZGY3ZCcsXG4gICdwbGF5X29yX3BhdXNlX2J1dHRvbic6J1xcdTIzZWYnLFxuICAncG9pbnRfZG93bic6J1xcdWQ4M2RcXHVkYzQ3JyxcbiAgJ3BvaW50X2xlZnQnOidcXHVkODNkXFx1ZGM0OCcsXG4gICdwb2ludF9yaWdodCc6J1xcdWQ4M2RcXHVkYzQ5JyxcbiAgJ3BvaW50X3VwJzonXFx1MjYxZFxcdWZlMGYnLFxuICAncG9pbnRfdXBfMic6J1xcdWQ4M2RcXHVkYzQ2JyxcbiAgJ3BvbGljZV9jYXInOidcXHVkODNkXFx1ZGU5MycsXG4gICdwb2xpY2V3b21hbic6J1xcdWQ4M2RcXHVkYzZlJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdwb29kbGUnOidcXHVkODNkXFx1ZGMyOScsXG4gICdwb3Bjb3JuJzonXFx1ZDgzY1xcdWRmN2YnLFxuICAncG9zdF9vZmZpY2UnOidcXHVkODNjXFx1ZGZlMycsXG4gICdwb3N0YWxfaG9ybic6J1xcdWQ4M2RcXHVkY2VmJyxcbiAgJ3Bvc3Rib3gnOidcXHVkODNkXFx1ZGNlZScsXG4gICdwb3RhYmxlX3dhdGVyJzonXFx1ZDgzZFxcdWRlYjAnLFxuICAncG90YXRvJzonXFx1ZDgzZVxcdWRkNTQnLFxuICAncG91Y2gnOidcXHVkODNkXFx1ZGM1ZCcsXG4gICdwb3VsdHJ5X2xlZyc6J1xcdWQ4M2NcXHVkZjU3JyxcbiAgJ3BvdW5kJzonXFx1ZDgzZFxcdWRjYjcnLFxuICAncmFnZSc6J1xcdWQ4M2RcXHVkZTIxJyxcbiAgJ3BvdXRpbmdfY2F0JzonXFx1ZDgzZFxcdWRlM2UnLFxuICAncG91dGluZ19tYW4nOidcXHVkODNkXFx1ZGU0ZSZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAncHJheSc6J1xcdWQ4M2RcXHVkZTRmJyxcbiAgJ3ByYXllcl9iZWFkcyc6J1xcdWQ4M2RcXHVkY2ZmJyxcbiAgJ3ByZWduYW50X3dvbWFuJzonXFx1ZDgzZVxcdWRkMzAnLFxuICAncHJldmlvdXNfdHJhY2tfYnV0dG9uJzonXFx1MjNlZScsXG4gICdwcmluY2UnOidcXHVkODNlXFx1ZGQzNCcsXG4gICdwcmluY2Vzcyc6J1xcdWQ4M2RcXHVkYzc4JyxcbiAgJ3ByaW50ZXInOidcXHVkODNkXFx1ZGRhOCcsXG4gICdwdXJwbGVfaGVhcnQnOidcXHVkODNkXFx1ZGM5YycsXG4gICdwdXJzZSc6J1xcdWQ4M2RcXHVkYzViJyxcbiAgJ3B1c2hwaW4nOidcXHVkODNkXFx1ZGNjYycsXG4gICdwdXRfbGl0dGVyX2luX2l0c19wbGFjZSc6J1xcdWQ4M2RcXHVkZWFlJyxcbiAgJ3F1ZXN0aW9uJzonXFx1Mjc1MycsXG4gICdyYWJiaXQnOidcXHVkODNkXFx1ZGMzMCcsXG4gICdyYWJiaXQyJzonXFx1ZDgzZFxcdWRjMDcnLFxuICAncmFjZWhvcnNlJzonXFx1ZDgzZFxcdWRjMGUnLFxuICAncmFjaW5nX2Nhcic6J1xcdWQ4M2NcXHVkZmNlJyxcbiAgJ3JhZGlvJzonXFx1ZDgzZFxcdWRjZmInLFxuICAncmFkaW9fYnV0dG9uJzonXFx1ZDgzZFxcdWRkMTgnLFxuICAncmFkaW9hY3RpdmUnOidcXHUyNjIyXFx1ZmUwZicsXG4gICdyYWlsd2F5X2Nhcic6J1xcdWQ4M2RcXHVkZTgzJyxcbiAgJ3JhaWx3YXlfdHJhY2snOidcXHVkODNkXFx1ZGVlNCcsXG4gICdyYWluYm93JzonXFx1ZDgzY1xcdWRmMDgnLFxuICAncmFpbmJvd19mbGFnJzonXFx1ZDgzY1xcdWRmZjNcXHVmZTBmJnp3ajtcXHVkODNjXFx1ZGYwOCcsXG4gICdyYWlzZWRfYmFja19vZl9oYW5kJzonXFx1ZDgzZVxcdWRkMWEnLFxuICAncmFpc2VkX2hhbmRfd2l0aF9maW5nZXJzX3NwbGF5ZWQnOidcXHVkODNkXFx1ZGQ5MCcsXG4gICdyYWlzZWRfaGFuZHMnOidcXHVkODNkXFx1ZGU0YycsXG4gICdyYWlzaW5nX2hhbmRfd29tYW4nOidcXHVkODNkXFx1ZGU0YicsXG4gICdyYWlzaW5nX2hhbmRfbWFuJzonXFx1ZDgzZFxcdWRlNGImendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ3JhbSc6J1xcdWQ4M2RcXHVkYzBmJyxcbiAgJ3JhbWVuJzonXFx1ZDgzY1xcdWRmNWMnLFxuICAncmF0JzonXFx1ZDgzZFxcdWRjMDAnLFxuICAncmVjb3JkX2J1dHRvbic6J1xcdTIzZmEnLFxuICAncmVjeWNsZSc6J1xcdTI2N2JcXHVmZTBmJyxcbiAgJ3JlZF9jaXJjbGUnOidcXHVkODNkXFx1ZGQzNCcsXG4gICdyZWdpc3RlcmVkJzonXFx1MDBhZVxcdWZlMGYnLFxuICAncmVsYXhlZCc6J1xcdTI2M2FcXHVmZTBmJyxcbiAgJ3JlbGlldmVkJzonXFx1ZDgzZFxcdWRlMGMnLFxuICAncmVtaW5kZXJfcmliYm9uJzonXFx1ZDgzY1xcdWRmOTcnLFxuICAncmVwZWF0JzonXFx1ZDgzZFxcdWRkMDEnLFxuICAncmVwZWF0X29uZSc6J1xcdWQ4M2RcXHVkZDAyJyxcbiAgJ3Jlc2N1ZV93b3JrZXJfaGVsbWV0JzonXFx1MjZkMScsXG4gICdyZXN0cm9vbSc6J1xcdWQ4M2RcXHVkZWJiJyxcbiAgJ3Jldm9sdmluZ19oZWFydHMnOidcXHVkODNkXFx1ZGM5ZScsXG4gICdyZXdpbmQnOidcXHUyM2VhJyxcbiAgJ3JoaW5vY2Vyb3MnOidcXHVkODNlXFx1ZGQ4ZicsXG4gICdyaWJib24nOidcXHVkODNjXFx1ZGY4MCcsXG4gICdyaWNlJzonXFx1ZDgzY1xcdWRmNWEnLFxuICAncmljZV9iYWxsJzonXFx1ZDgzY1xcdWRmNTknLFxuICAncmljZV9jcmFja2VyJzonXFx1ZDgzY1xcdWRmNTgnLFxuICAncmljZV9zY2VuZSc6J1xcdWQ4M2NcXHVkZjkxJyxcbiAgJ3JpZ2h0X2FuZ2VyX2J1YmJsZSc6J1xcdWQ4M2RcXHVkZGVmJyxcbiAgJ3JpbmcnOidcXHVkODNkXFx1ZGM4ZCcsXG4gICdyb2JvdCc6J1xcdWQ4M2VcXHVkZDE2JyxcbiAgJ3JvY2tldCc6J1xcdWQ4M2RcXHVkZTgwJyxcbiAgJ3JvZmwnOidcXHVkODNlXFx1ZGQyMycsXG4gICdyb2xsX2V5ZXMnOidcXHVkODNkXFx1ZGU0NCcsXG4gICdyb2xsZXJfY29hc3Rlcic6J1xcdWQ4M2NcXHVkZmEyJyxcbiAgJ3Jvb3N0ZXInOidcXHVkODNkXFx1ZGMxMycsXG4gICdyb3NlJzonXFx1ZDgzY1xcdWRmMzknLFxuICAncm9zZXR0ZSc6J1xcdWQ4M2NcXHVkZmY1JyxcbiAgJ3JvdGF0aW5nX2xpZ2h0JzonXFx1ZDgzZFxcdWRlYTgnLFxuICAncm91bmRfcHVzaHBpbic6J1xcdWQ4M2RcXHVkY2NkJyxcbiAgJ3Jvd2luZ19tYW4nOidcXHVkODNkXFx1ZGVhMycsXG4gICdyb3dpbmdfd29tYW4nOidcXHVkODNkXFx1ZGVhMyZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAncnVnYnlfZm9vdGJhbGwnOidcXHVkODNjXFx1ZGZjOScsXG4gICdydW5uaW5nX21hbic6J1xcdWQ4M2NcXHVkZmMzJyxcbiAgJ3J1bm5pbmdfc2hpcnRfd2l0aF9zYXNoJzonXFx1ZDgzY1xcdWRmYmQnLFxuICAncnVubmluZ193b21hbic6J1xcdWQ4M2NcXHVkZmMzJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdzYSc6J1xcdWQ4M2NcXHVkZTAyXFx1ZmUwZicsXG4gICdzYWdpdHRhcml1cyc6J1xcdTI2NTBcXHVmZTBmJyxcbiAgJ3Nha2UnOidcXHVkODNjXFx1ZGY3NicsXG4gICdzYW5kYWwnOidcXHVkODNkXFx1ZGM2MScsXG4gICdzYW50YSc6J1xcdWQ4M2NcXHVkZjg1JyxcbiAgJ3NhdGVsbGl0ZSc6J1xcdWQ4M2RcXHVkY2UxJyxcbiAgJ3NheG9waG9uZSc6J1xcdWQ4M2NcXHVkZmI3JyxcbiAgJ3NjaG9vbCc6J1xcdWQ4M2NcXHVkZmViJyxcbiAgJ3NjaG9vbF9zYXRjaGVsJzonXFx1ZDgzY1xcdWRmOTInLFxuICAnc2Npc3NvcnMnOidcXHUyNzAyXFx1ZmUwZicsXG4gICdzY29ycGlvbic6J1xcdWQ4M2VcXHVkZDgyJyxcbiAgJ3Njb3JwaXVzJzonXFx1MjY0ZlxcdWZlMGYnLFxuICAnc2NyZWFtJzonXFx1ZDgzZFxcdWRlMzEnLFxuICAnc2NyZWFtX2NhdCc6J1xcdWQ4M2RcXHVkZTQwJyxcbiAgJ3Njcm9sbCc6J1xcdWQ4M2RcXHVkY2RjJyxcbiAgJ3NlYXQnOidcXHVkODNkXFx1ZGNiYScsXG4gICdzZWNyZXQnOidcXHUzMjk5XFx1ZmUwZicsXG4gICdzZWVfbm9fZXZpbCc6J1xcdWQ4M2RcXHVkZTQ4JyxcbiAgJ3NlZWRsaW5nJzonXFx1ZDgzY1xcdWRmMzEnLFxuICAnc2VsZmllJzonXFx1ZDgzZVxcdWRkMzMnLFxuICAnc2hhbGxvd19wYW5fb2ZfZm9vZCc6J1xcdWQ4M2VcXHVkZDU4JyxcbiAgJ3NoYW1yb2NrJzonXFx1MjYxOFxcdWZlMGYnLFxuICAnc2hhcmsnOidcXHVkODNlXFx1ZGQ4OCcsXG4gICdzaGF2ZWRfaWNlJzonXFx1ZDgzY1xcdWRmNjcnLFxuICAnc2hlZXAnOidcXHVkODNkXFx1ZGMxMScsXG4gICdzaGVsbCc6J1xcdWQ4M2RcXHVkYzFhJyxcbiAgJ3NoaWVsZCc6J1xcdWQ4M2RcXHVkZWUxJyxcbiAgJ3NoaW50b19zaHJpbmUnOidcXHUyNmU5JyxcbiAgJ3NoaXAnOidcXHVkODNkXFx1ZGVhMicsXG4gICdzaGlydCc6J1xcdWQ4M2RcXHVkYzU1JyxcbiAgJ3Nob3BwaW5nJzonXFx1ZDgzZFxcdWRlY2QnLFxuICAnc2hvcHBpbmdfY2FydCc6J1xcdWQ4M2RcXHVkZWQyJyxcbiAgJ3Nob3dlcic6J1xcdWQ4M2RcXHVkZWJmJyxcbiAgJ3NocmltcCc6J1xcdWQ4M2VcXHVkZDkwJyxcbiAgJ3NpZ25hbF9zdHJlbmd0aCc6J1xcdWQ4M2RcXHVkY2Y2JyxcbiAgJ3NpeF9wb2ludGVkX3N0YXInOidcXHVkODNkXFx1ZGQyZicsXG4gICdza2knOidcXHVkODNjXFx1ZGZiZicsXG4gICdza2llcic6J1xcdTI2ZjcnLFxuICAnc2t1bGwnOidcXHVkODNkXFx1ZGM4MCcsXG4gICdza3VsbF9hbmRfY3Jvc3Nib25lcyc6J1xcdTI2MjBcXHVmZTBmJyxcbiAgJ3NsZWVwaW5nJzonXFx1ZDgzZFxcdWRlMzQnLFxuICAnc2xlZXBpbmdfYmVkJzonXFx1ZDgzZFxcdWRlY2MnLFxuICAnc2xlZXB5JzonXFx1ZDgzZFxcdWRlMmEnLFxuICAnc2xpZ2h0bHlfZnJvd25pbmdfZmFjZSc6J1xcdWQ4M2RcXHVkZTQxJyxcbiAgJ3NsaWdodGx5X3NtaWxpbmdfZmFjZSc6J1xcdWQ4M2RcXHVkZTQyJyxcbiAgJ3Nsb3RfbWFjaGluZSc6J1xcdWQ4M2NcXHVkZmIwJyxcbiAgJ3NtYWxsX2FpcnBsYW5lJzonXFx1ZDgzZFxcdWRlZTknLFxuICAnc21hbGxfYmx1ZV9kaWFtb25kJzonXFx1ZDgzZFxcdWRkMzknLFxuICAnc21hbGxfb3JhbmdlX2RpYW1vbmQnOidcXHVkODNkXFx1ZGQzOCcsXG4gICdzbWFsbF9yZWRfdHJpYW5nbGUnOidcXHVkODNkXFx1ZGQzYScsXG4gICdzbWFsbF9yZWRfdHJpYW5nbGVfZG93bic6J1xcdWQ4M2RcXHVkZDNiJyxcbiAgJ3NtaWxlJzonXFx1ZDgzZFxcdWRlMDQnLFxuICAnc21pbGVfY2F0JzonXFx1ZDgzZFxcdWRlMzgnLFxuICAnc21pbGV5JzonXFx1ZDgzZFxcdWRlMDMnLFxuICAnc21pbGV5X2NhdCc6J1xcdWQ4M2RcXHVkZTNhJyxcbiAgJ3NtaWxpbmdfaW1wJzonXFx1ZDgzZFxcdWRlMDgnLFxuICAnc21pcmsnOidcXHVkODNkXFx1ZGUwZicsXG4gICdzbWlya19jYXQnOidcXHVkODNkXFx1ZGUzYycsXG4gICdzbW9raW5nJzonXFx1ZDgzZFxcdWRlYWMnLFxuICAnc25haWwnOidcXHVkODNkXFx1ZGMwYycsXG4gICdzbmFrZSc6J1xcdWQ4M2RcXHVkYzBkJyxcbiAgJ3NuZWV6aW5nX2ZhY2UnOidcXHVkODNlXFx1ZGQyNycsXG4gICdzbm93Ym9hcmRlcic6J1xcdWQ4M2NcXHVkZmMyJyxcbiAgJ3Nub3dmbGFrZSc6J1xcdTI3NDRcXHVmZTBmJyxcbiAgJ3Nub3dtYW4nOidcXHUyNmM0XFx1ZmUwZicsXG4gICdzbm93bWFuX3dpdGhfc25vdyc6J1xcdTI2MDNcXHVmZTBmJyxcbiAgJ3NvYic6J1xcdWQ4M2RcXHVkZTJkJyxcbiAgJ3NvY2Nlcic6J1xcdTI2YmRcXHVmZTBmJyxcbiAgJ3Nvb24nOidcXHVkODNkXFx1ZGQxYycsXG4gICdzb3MnOidcXHVkODNjXFx1ZGQ5OCcsXG4gICdzb3VuZCc6J1xcdWQ4M2RcXHVkZDA5JyxcbiAgJ3NwYWNlX2ludmFkZXInOidcXHVkODNkXFx1ZGM3ZScsXG4gICdzcGFkZXMnOidcXHUyNjYwXFx1ZmUwZicsXG4gICdzcGFnaGV0dGknOidcXHVkODNjXFx1ZGY1ZCcsXG4gICdzcGFya2xlJzonXFx1Mjc0N1xcdWZlMGYnLFxuICAnc3BhcmtsZXInOidcXHVkODNjXFx1ZGY4NycsXG4gICdzcGFya2xlcyc6J1xcdTI3MjgnLFxuICAnc3BhcmtsaW5nX2hlYXJ0JzonXFx1ZDgzZFxcdWRjOTYnLFxuICAnc3BlYWtfbm9fZXZpbCc6J1xcdWQ4M2RcXHVkZTRhJyxcbiAgJ3NwZWFrZXInOidcXHVkODNkXFx1ZGQwOCcsXG4gICdzcGVha2luZ19oZWFkJzonXFx1ZDgzZFxcdWRkZTMnLFxuICAnc3BlZWNoX2JhbGxvb24nOidcXHVkODNkXFx1ZGNhYycsXG4gICdzcGVlZGJvYXQnOidcXHVkODNkXFx1ZGVhNCcsXG4gICdzcGlkZXInOidcXHVkODNkXFx1ZGQ3NycsXG4gICdzcGlkZXJfd2ViJzonXFx1ZDgzZFxcdWRkNzgnLFxuICAnc3BpcmFsX2NhbGVuZGFyJzonXFx1ZDgzZFxcdWRkZDMnLFxuICAnc3BpcmFsX25vdGVwYWQnOidcXHVkODNkXFx1ZGRkMicsXG4gICdzcG9vbic6J1xcdWQ4M2VcXHVkZDQ0JyxcbiAgJ3NxdWlkJzonXFx1ZDgzZVxcdWRkOTEnLFxuICAnc3RhZGl1bSc6J1xcdWQ4M2NcXHVkZmRmJyxcbiAgJ3N0YXInOidcXHUyYjUwXFx1ZmUwZicsXG4gICdzdGFyMic6J1xcdWQ4M2NcXHVkZjFmJyxcbiAgJ3N0YXJfYW5kX2NyZXNjZW50JzonXFx1MjYyYVxcdWZlMGYnLFxuICAnc3Rhcl9vZl9kYXZpZCc6J1xcdTI3MjFcXHVmZTBmJyxcbiAgJ3N0YXJzJzonXFx1ZDgzY1xcdWRmMjAnLFxuICAnc3RhdGlvbic6J1xcdWQ4M2RcXHVkZTg5JyxcbiAgJ3N0YXR1ZV9vZl9saWJlcnR5JzonXFx1ZDgzZFxcdWRkZmQnLFxuICAnc3RlYW1fbG9jb21vdGl2ZSc6J1xcdWQ4M2RcXHVkZTgyJyxcbiAgJ3N0ZXcnOidcXHVkODNjXFx1ZGY3MicsXG4gICdzdG9wX2J1dHRvbic6J1xcdTIzZjknLFxuICAnc3RvcF9zaWduJzonXFx1ZDgzZFxcdWRlZDEnLFxuICAnc3RvcHdhdGNoJzonXFx1MjNmMScsXG4gICdzdHJhaWdodF9ydWxlcic6J1xcdWQ4M2RcXHVkY2NmJyxcbiAgJ3N0cmF3YmVycnknOidcXHVkODNjXFx1ZGY1MycsXG4gICdzdHVja19vdXRfdG9uZ3VlJzonXFx1ZDgzZFxcdWRlMWInLFxuICAnc3R1Y2tfb3V0X3Rvbmd1ZV9jbG9zZWRfZXllcyc6J1xcdWQ4M2RcXHVkZTFkJyxcbiAgJ3N0dWNrX291dF90b25ndWVfd2lua2luZ19leWUnOidcXHVkODNkXFx1ZGUxYycsXG4gICdzdHVkaW9fbWljcm9waG9uZSc6J1xcdWQ4M2NcXHVkZjk5JyxcbiAgJ3N0dWZmZWRfZmxhdGJyZWFkJzonXFx1ZDgzZVxcdWRkNTknLFxuICAnc3VuX2JlaGluZF9sYXJnZV9jbG91ZCc6J1xcdWQ4M2NcXHVkZjI1JyxcbiAgJ3N1bl9iZWhpbmRfcmFpbl9jbG91ZCc6J1xcdWQ4M2NcXHVkZjI2JyxcbiAgJ3N1bl9iZWhpbmRfc21hbGxfY2xvdWQnOidcXHVkODNjXFx1ZGYyNCcsXG4gICdzdW5fd2l0aF9mYWNlJzonXFx1ZDgzY1xcdWRmMWUnLFxuICAnc3VuZmxvd2VyJzonXFx1ZDgzY1xcdWRmM2InLFxuICAnc3VuZ2xhc3Nlcyc6J1xcdWQ4M2RcXHVkZTBlJyxcbiAgJ3N1bm55JzonXFx1MjYwMFxcdWZlMGYnLFxuICAnc3VucmlzZSc6J1xcdWQ4M2NcXHVkZjA1JyxcbiAgJ3N1bnJpc2Vfb3Zlcl9tb3VudGFpbnMnOidcXHVkODNjXFx1ZGYwNCcsXG4gICdzdXJmaW5nX21hbic6J1xcdWQ4M2NcXHVkZmM0JyxcbiAgJ3N1cmZpbmdfd29tYW4nOidcXHVkODNjXFx1ZGZjNCZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnc3VzaGknOidcXHVkODNjXFx1ZGY2MycsXG4gICdzdXNwZW5zaW9uX3JhaWx3YXknOidcXHVkODNkXFx1ZGU5ZicsXG4gICdzd2VhdCc6J1xcdWQ4M2RcXHVkZTEzJyxcbiAgJ3N3ZWF0X2Ryb3BzJzonXFx1ZDgzZFxcdWRjYTYnLFxuICAnc3dlYXRfc21pbGUnOidcXHVkODNkXFx1ZGUwNScsXG4gICdzd2VldF9wb3RhdG8nOidcXHVkODNjXFx1ZGY2MCcsXG4gICdzd2ltbWluZ19tYW4nOidcXHVkODNjXFx1ZGZjYScsXG4gICdzd2ltbWluZ193b21hbic6J1xcdWQ4M2NcXHVkZmNhJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdzeW1ib2xzJzonXFx1ZDgzZFxcdWRkMjMnLFxuICAnc3luYWdvZ3VlJzonXFx1ZDgzZFxcdWRkNGQnLFxuICAnc3lyaW5nZSc6J1xcdWQ4M2RcXHVkYzg5JyxcbiAgJ3RhY28nOidcXHVkODNjXFx1ZGYyZScsXG4gICd0YWRhJzonXFx1ZDgzY1xcdWRmODknLFxuICAndGFuYWJhdGFfdHJlZSc6J1xcdWQ4M2NcXHVkZjhiJyxcbiAgJ3RhdXJ1cyc6J1xcdTI2NDlcXHVmZTBmJyxcbiAgJ3RheGknOidcXHVkODNkXFx1ZGU5NScsXG4gICd0ZWEnOidcXHVkODNjXFx1ZGY3NScsXG4gICd0ZWxlcGhvbmVfcmVjZWl2ZXInOidcXHVkODNkXFx1ZGNkZScsXG4gICd0ZWxlc2NvcGUnOidcXHVkODNkXFx1ZGQyZCcsXG4gICd0ZW5uaXMnOidcXHVkODNjXFx1ZGZiZScsXG4gICd0ZW50JzonXFx1MjZmYVxcdWZlMGYnLFxuICAndGhlcm1vbWV0ZXInOidcXHVkODNjXFx1ZGYyMScsXG4gICd0aGlua2luZyc6J1xcdWQ4M2VcXHVkZDE0JyxcbiAgJ3Rob3VnaHRfYmFsbG9vbic6J1xcdWQ4M2RcXHVkY2FkJyxcbiAgJ3RpY2tldCc6J1xcdWQ4M2NcXHVkZmFiJyxcbiAgJ3RpY2tldHMnOidcXHVkODNjXFx1ZGY5ZicsXG4gICd0aWdlcic6J1xcdWQ4M2RcXHVkYzJmJyxcbiAgJ3RpZ2VyMic6J1xcdWQ4M2RcXHVkYzA1JyxcbiAgJ3RpbWVyX2Nsb2NrJzonXFx1MjNmMicsXG4gICd0aXBwaW5nX2hhbmRfbWFuJzonXFx1ZDgzZFxcdWRjODEmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ3RpcmVkX2ZhY2UnOidcXHVkODNkXFx1ZGUyYicsXG4gICd0bSc6J1xcdTIxMjJcXHVmZTBmJyxcbiAgJ3RvaWxldCc6J1xcdWQ4M2RcXHVkZWJkJyxcbiAgJ3Rva3lvX3Rvd2VyJzonXFx1ZDgzZFxcdWRkZmMnLFxuICAndG9tYXRvJzonXFx1ZDgzY1xcdWRmNDUnLFxuICAndG9uZ3VlJzonXFx1ZDgzZFxcdWRjNDUnLFxuICAndG9wJzonXFx1ZDgzZFxcdWRkMWQnLFxuICAndG9waGF0JzonXFx1ZDgzY1xcdWRmYTknLFxuICAndG9ybmFkbyc6J1xcdWQ4M2NcXHVkZjJhJyxcbiAgJ3RyYWNrYmFsbCc6J1xcdWQ4M2RcXHVkZGIyJyxcbiAgJ3RyYWN0b3InOidcXHVkODNkXFx1ZGU5YycsXG4gICd0cmFmZmljX2xpZ2h0JzonXFx1ZDgzZFxcdWRlYTUnLFxuICAndHJhaW4nOidcXHVkODNkXFx1ZGU4YicsXG4gICd0cmFpbjInOidcXHVkODNkXFx1ZGU4NicsXG4gICd0cmFtJzonXFx1ZDgzZFxcdWRlOGEnLFxuICAndHJpYW5ndWxhcl9mbGFnX29uX3Bvc3QnOidcXHVkODNkXFx1ZGVhOScsXG4gICd0cmlhbmd1bGFyX3J1bGVyJzonXFx1ZDgzZFxcdWRjZDAnLFxuICAndHJpZGVudCc6J1xcdWQ4M2RcXHVkZDMxJyxcbiAgJ3RyaXVtcGgnOidcXHVkODNkXFx1ZGUyNCcsXG4gICd0cm9sbGV5YnVzJzonXFx1ZDgzZFxcdWRlOGUnLFxuICAndHJvcGh5JzonXFx1ZDgzY1xcdWRmYzYnLFxuICAndHJvcGljYWxfZHJpbmsnOidcXHVkODNjXFx1ZGY3OScsXG4gICd0cm9waWNhbF9maXNoJzonXFx1ZDgzZFxcdWRjMjAnLFxuICAndHJ1Y2snOidcXHVkODNkXFx1ZGU5YScsXG4gICd0cnVtcGV0JzonXFx1ZDgzY1xcdWRmYmEnLFxuICAndHVsaXAnOidcXHVkODNjXFx1ZGYzNycsXG4gICd0dW1ibGVyX2dsYXNzJzonXFx1ZDgzZVxcdWRkNDMnLFxuICAndHVya2V5JzonXFx1ZDgzZVxcdWRkODMnLFxuICAndHVydGxlJzonXFx1ZDgzZFxcdWRjMjInLFxuICAndHYnOidcXHVkODNkXFx1ZGNmYScsXG4gICd0d2lzdGVkX3JpZ2h0d2FyZHNfYXJyb3dzJzonXFx1ZDgzZFxcdWRkMDAnLFxuICAndHdvX2hlYXJ0cyc6J1xcdWQ4M2RcXHVkYzk1JyxcbiAgJ3R3b19tZW5faG9sZGluZ19oYW5kcyc6J1xcdWQ4M2RcXHVkYzZjJyxcbiAgJ3R3b193b21lbl9ob2xkaW5nX2hhbmRzJzonXFx1ZDgzZFxcdWRjNmQnLFxuICAndTUyNzInOidcXHVkODNjXFx1ZGUzOScsXG4gICd1NTQwOCc6J1xcdWQ4M2NcXHVkZTM0JyxcbiAgJ3U1NWI2JzonXFx1ZDgzY1xcdWRlM2EnLFxuICAndTYzMDcnOidcXHVkODNjXFx1ZGUyZlxcdWZlMGYnLFxuICAndTY3MDgnOidcXHVkODNjXFx1ZGUzN1xcdWZlMGYnLFxuICAndTY3MDknOidcXHVkODNjXFx1ZGUzNicsXG4gICd1NmU4MCc6J1xcdWQ4M2NcXHVkZTM1JyxcbiAgJ3U3MTIxJzonXFx1ZDgzY1xcdWRlMWFcXHVmZTBmJyxcbiAgJ3U3NTMzJzonXFx1ZDgzY1xcdWRlMzgnLFxuICAndTc5ODEnOidcXHVkODNjXFx1ZGUzMicsXG4gICd1N2E3YSc6J1xcdWQ4M2NcXHVkZTMzJyxcbiAgJ3VtYnJlbGxhJzonXFx1MjYxNFxcdWZlMGYnLFxuICAndW5hbXVzZWQnOidcXHVkODNkXFx1ZGUxMicsXG4gICd1bmRlcmFnZSc6J1xcdWQ4M2RcXHVkZDFlJyxcbiAgJ3VuaWNvcm4nOidcXHVkODNlXFx1ZGQ4NCcsXG4gICd1bmxvY2snOidcXHVkODNkXFx1ZGQxMycsXG4gICd1cCc6J1xcdWQ4M2NcXHVkZDk5JyxcbiAgJ3Vwc2lkZV9kb3duX2ZhY2UnOidcXHVkODNkXFx1ZGU0MycsXG4gICd2JzonXFx1MjcwY1xcdWZlMGYnLFxuICAndmVydGljYWxfdHJhZmZpY19saWdodCc6J1xcdWQ4M2RcXHVkZWE2JyxcbiAgJ3Zocyc6J1xcdWQ4M2RcXHVkY2ZjJyxcbiAgJ3ZpYnJhdGlvbl9tb2RlJzonXFx1ZDgzZFxcdWRjZjMnLFxuICAndmlkZW9fY2FtZXJhJzonXFx1ZDgzZFxcdWRjZjknLFxuICAndmlkZW9fZ2FtZSc6J1xcdWQ4M2NcXHVkZmFlJyxcbiAgJ3Zpb2xpbic6J1xcdWQ4M2NcXHVkZmJiJyxcbiAgJ3ZpcmdvJzonXFx1MjY0ZFxcdWZlMGYnLFxuICAndm9sY2Fubyc6J1xcdWQ4M2NcXHVkZjBiJyxcbiAgJ3ZvbGxleWJhbGwnOidcXHVkODNjXFx1ZGZkMCcsXG4gICd2cyc6J1xcdWQ4M2NcXHVkZDlhJyxcbiAgJ3Z1bGNhbl9zYWx1dGUnOidcXHVkODNkXFx1ZGQ5NicsXG4gICd3YWxraW5nX21hbic6J1xcdWQ4M2RcXHVkZWI2JyxcbiAgJ3dhbGtpbmdfd29tYW4nOidcXHVkODNkXFx1ZGViNiZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnd2FuaW5nX2NyZXNjZW50X21vb24nOidcXHVkODNjXFx1ZGYxOCcsXG4gICd3YW5pbmdfZ2liYm91c19tb29uJzonXFx1ZDgzY1xcdWRmMTYnLFxuICAnd2FybmluZyc6J1xcdTI2YTBcXHVmZTBmJyxcbiAgJ3dhc3RlYmFza2V0JzonXFx1ZDgzZFxcdWRkZDEnLFxuICAnd2F0Y2gnOidcXHUyMzFhXFx1ZmUwZicsXG4gICd3YXRlcl9idWZmYWxvJzonXFx1ZDgzZFxcdWRjMDMnLFxuICAnd2F0ZXJtZWxvbic6J1xcdWQ4M2NcXHVkZjQ5JyxcbiAgJ3dhdmUnOidcXHVkODNkXFx1ZGM0YicsXG4gICd3YXZ5X2Rhc2gnOidcXHUzMDMwXFx1ZmUwZicsXG4gICd3YXhpbmdfY3Jlc2NlbnRfbW9vbic6J1xcdWQ4M2NcXHVkZjEyJyxcbiAgJ3djJzonXFx1ZDgzZFxcdWRlYmUnLFxuICAnd2VhcnknOidcXHVkODNkXFx1ZGUyOScsXG4gICd3ZWRkaW5nJzonXFx1ZDgzZFxcdWRjOTInLFxuICAnd2VpZ2h0X2xpZnRpbmdfbWFuJzonXFx1ZDgzY1xcdWRmY2JcXHVmZTBmJyxcbiAgJ3dlaWdodF9saWZ0aW5nX3dvbWFuJzonXFx1ZDgzY1xcdWRmY2JcXHVmZTBmJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3aGFsZSc6J1xcdWQ4M2RcXHVkYzMzJyxcbiAgJ3doYWxlMic6J1xcdWQ4M2RcXHVkYzBiJyxcbiAgJ3doZWVsX29mX2RoYXJtYSc6J1xcdTI2MzhcXHVmZTBmJyxcbiAgJ3doZWVsY2hhaXInOidcXHUyNjdmXFx1ZmUwZicsXG4gICd3aGl0ZV9jaGVja19tYXJrJzonXFx1MjcwNScsXG4gICd3aGl0ZV9jaXJjbGUnOidcXHUyNmFhXFx1ZmUwZicsXG4gICd3aGl0ZV9mbGFnJzonXFx1ZDgzY1xcdWRmZjNcXHVmZTBmJyxcbiAgJ3doaXRlX2Zsb3dlcic6J1xcdWQ4M2RcXHVkY2FlJyxcbiAgJ3doaXRlX2xhcmdlX3NxdWFyZSc6J1xcdTJiMWNcXHVmZTBmJyxcbiAgJ3doaXRlX21lZGl1bV9zbWFsbF9zcXVhcmUnOidcXHUyNWZkXFx1ZmUwZicsXG4gICd3aGl0ZV9tZWRpdW1fc3F1YXJlJzonXFx1MjVmYlxcdWZlMGYnLFxuICAnd2hpdGVfc21hbGxfc3F1YXJlJzonXFx1MjVhYlxcdWZlMGYnLFxuICAnd2hpdGVfc3F1YXJlX2J1dHRvbic6J1xcdWQ4M2RcXHVkZDMzJyxcbiAgJ3dpbHRlZF9mbG93ZXInOidcXHVkODNlXFx1ZGQ0MCcsXG4gICd3aW5kX2NoaW1lJzonXFx1ZDgzY1xcdWRmOTAnLFxuICAnd2luZF9mYWNlJzonXFx1ZDgzY1xcdWRmMmMnLFxuICAnd2luZV9nbGFzcyc6J1xcdWQ4M2NcXHVkZjc3JyxcbiAgJ3dpbmsnOidcXHVkODNkXFx1ZGUwOScsXG4gICd3b2xmJzonXFx1ZDgzZFxcdWRjM2EnLFxuICAnd29tYW4nOidcXHVkODNkXFx1ZGM2OScsXG4gICd3b21hbl9hcnRpc3QnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzY1xcdWRmYTgnLFxuICAnd29tYW5fYXN0cm9uYXV0JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkZTgwJyxcbiAgJ3dvbWFuX2NhcnR3aGVlbGluZyc6J1xcdWQ4M2VcXHVkZDM4Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21hbl9jb29rJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2NcXHVkZjczJyxcbiAgJ3dvbWFuX2ZhY2VwYWxtaW5nJzonXFx1ZDgzZVxcdWRkMjYmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuX2ZhY3Rvcnlfd29ya2VyJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2NcXHVkZmVkJyxcbiAgJ3dvbWFuX2Zhcm1lcic6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNjXFx1ZGYzZScsXG4gICd3b21hbl9maXJlZmlnaHRlcic6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGU5MicsXG4gICd3b21hbl9oZWFsdGhfd29ya2VyJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdTI2OTVcXHVmZTBmJyxcbiAgJ3dvbWFuX2p1ZGdlJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdTI2OTZcXHVmZTBmJyxcbiAgJ3dvbWFuX2p1Z2dsaW5nJzonXFx1ZDgzZVxcdWRkMzkmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuX21lY2hhbmljJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkZDI3JyxcbiAgJ3dvbWFuX29mZmljZV93b3JrZXInOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjYmMnLFxuICAnd29tYW5fcGlsb3QnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1MjcwOFxcdWZlMGYnLFxuICAnd29tYW5fcGxheWluZ19oYW5kYmFsbCc6J1xcdWQ4M2VcXHVkZDNlJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21hbl9wbGF5aW5nX3dhdGVyX3BvbG8nOidcXHVkODNlXFx1ZGQzZCZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnd29tYW5fc2NpZW50aXN0JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkZDJjJyxcbiAgJ3dvbWFuX3NocnVnZ2luZyc6J1xcdWQ4M2VcXHVkZDM3Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21hbl9zaW5nZXInOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzY1xcdWRmYTQnLFxuICAnd29tYW5fc3R1ZGVudCc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNjXFx1ZGY5MycsXG4gICd3b21hbl90ZWFjaGVyJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2NcXHVkZmViJyxcbiAgJ3dvbWFuX3RlY2hub2xvZ2lzdCc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGNiYicsXG4gICd3b21hbl93aXRoX3R1cmJhbic6J1xcdWQ4M2RcXHVkYzczJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21hbnNfY2xvdGhlcyc6J1xcdWQ4M2RcXHVkYzVhJyxcbiAgJ3dvbWFuc19oYXQnOidcXHVkODNkXFx1ZGM1MicsXG4gICd3b21lbl93cmVzdGxpbmcnOidcXHVkODNlXFx1ZGQzYyZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnd29tZW5zJzonXFx1ZDgzZFxcdWRlYmEnLFxuICAnd29ybGRfbWFwJzonXFx1ZDgzZFxcdWRkZmEnLFxuICAnd29ycmllZCc6J1xcdWQ4M2RcXHVkZTFmJyxcbiAgJ3dyZW5jaCc6J1xcdWQ4M2RcXHVkZDI3JyxcbiAgJ3dyaXRpbmdfaGFuZCc6J1xcdTI3MGRcXHVmZTBmJyxcbiAgJ3gnOidcXHUyNzRjJyxcbiAgJ3llbGxvd19oZWFydCc6J1xcdWQ4M2RcXHVkYzliJyxcbiAgJ3llbic6J1xcdWQ4M2RcXHVkY2I0JyxcbiAgJ3lpbl95YW5nJzonXFx1MjYyZlxcdWZlMGYnLFxuICAneXVtJzonXFx1ZDgzZFxcdWRlMGInLFxuICAnemFwJzonXFx1MjZhMVxcdWZlMGYnLFxuICAnemlwcGVyX21vdXRoX2ZhY2UnOidcXHVkODNlXFx1ZGQxMCcsXG4gICd6enonOidcXHVkODNkXFx1ZGNhNCcsXG5cbiAgLyogc3BlY2lhbCBlbW9qaXMgOlAgKi9cbiAgJ29jdG9jYXQnOiAgJzxpbWcgYWx0PVwiOm9jdG9jYXQ6XCIgaGVpZ2h0PVwiMjBcIiB3aWR0aD1cIjIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBzcmM9XCJodHRwczovL2Fzc2V0cy1jZG4uZ2l0aHViLmNvbS9pbWFnZXMvaWNvbnMvZW1vamkvb2N0b2NhdC5wbmdcIj4nLFxuICAnc2hvd2Rvd24nOiAnPHNwYW4gc3R5bGU9XCJmb250LWZhbWlseTogXFwnQW5vbnltb3VzIFByb1xcJywgbW9ub3NwYWNlOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBkYXNoZWQ7IHRleHQtZGVjb3JhdGlvbi1jb2xvcjogIzNlOGI4YTt0ZXh0LXVuZGVybGluZS1wb3NpdGlvbjogdW5kZXI7XCI+Uzwvc3Bhbj4nXG59O1xuXHJcbi8qKlxuICogQ3JlYXRlZCBieSBFc3RldmFvIG9uIDMxLTA1LTIwMTUuXG4gKi9cblxuLyoqXG4gKiBTaG93ZG93biBDb252ZXJ0ZXIgY2xhc3NcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtvYmplY3R9IFtjb252ZXJ0ZXJPcHRpb25zXVxuICogQHJldHVybnMge0NvbnZlcnRlcn1cbiAqL1xuc2hvd2Rvd24uQ29udmVydGVyID0gZnVuY3Rpb24gKGNvbnZlcnRlck9wdGlvbnMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhclxuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25zIHVzZWQgYnkgdGhpcyBjb252ZXJ0ZXJcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAdHlwZSB7e319XG4gICAgICAgKi9cbiAgICAgIG9wdGlvbnMgPSB7fSxcblxuICAgICAgLyoqXG4gICAgICAgKiBMYW5ndWFnZSBleHRlbnNpb25zIHVzZWQgYnkgdGhpcyBjb252ZXJ0ZXJcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICAgKi9cbiAgICAgIGxhbmdFeHRlbnNpb25zID0gW10sXG5cbiAgICAgIC8qKlxuICAgICAgICogT3V0cHV0IG1vZGlmaWVycyBleHRlbnNpb25zIHVzZWQgYnkgdGhpcyBjb252ZXJ0ZXJcbiAgICAgICAqIEBwcml2YXRlXG4gICAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICAgKi9cbiAgICAgIG91dHB1dE1vZGlmaWVycyA9IFtdLFxuXG4gICAgICAvKipcbiAgICAgICAqIEV2ZW50IGxpc3RlbmVyc1xuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEB0eXBlIHt7fX1cbiAgICAgICAqL1xuICAgICAgbGlzdGVuZXJzID0ge30sXG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGZsYXZvciBzZXQgaW4gdGhpcyBjb252ZXJ0ZXJcbiAgICAgICAqL1xuICAgICAgc2V0Q29udkZsYXZvciA9IHNldEZsYXZvcixcblxuICAgICAgLyoqXG4gICAgICAgKiBNZXRhZGF0YSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgICAqIEB0eXBlIHt7cGFyc2VkOiB7fSwgcmF3OiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nfX1cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGEgPSB7XG4gICAgICAgIHBhcnNlZDoge30sXG4gICAgICAgIHJhdzogJycsXG4gICAgICAgIGZvcm1hdDogJydcbiAgICAgIH07XG5cbiAgX2NvbnN0cnVjdG9yKCk7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRlciBjb25zdHJ1Y3RvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gX2NvbnN0cnVjdG9yICgpIHtcbiAgICBjb252ZXJ0ZXJPcHRpb25zID0gY29udmVydGVyT3B0aW9ucyB8fCB7fTtcblxuICAgIGZvciAodmFyIGdPcHQgaW4gZ2xvYmFsT3B0aW9ucykge1xuICAgICAgaWYgKGdsb2JhbE9wdGlvbnMuaGFzT3duUHJvcGVydHkoZ09wdCkpIHtcbiAgICAgICAgb3B0aW9uc1tnT3B0XSA9IGdsb2JhbE9wdGlvbnNbZ09wdF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugb3B0aW9uc1xuICAgIGlmICh0eXBlb2YgY29udmVydGVyT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIG9wdCBpbiBjb252ZXJ0ZXJPcHRpb25zKSB7XG4gICAgICAgIGlmIChjb252ZXJ0ZXJPcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgICAgICBvcHRpb25zW29wdF0gPSBjb252ZXJ0ZXJPcHRpb25zW29wdF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NvbnZlcnRlciBleHBlY3RzIHRoZSBwYXNzZWQgcGFyYW1ldGVyIHRvIGJlIGFuIG9iamVjdCwgYnV0ICcgKyB0eXBlb2YgY29udmVydGVyT3B0aW9ucyArXG4gICAgICAnIHdhcyBwYXNzZWQgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHRlbnNpb25zKSB7XG4gICAgICBzaG93ZG93bi5oZWxwZXIuZm9yRWFjaChvcHRpb25zLmV4dGVuc2lvbnMsIF9wYXJzZUV4dGVuc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGV4dGVuc2lvblxuICAgKiBAcGFyYW0geyp9IGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9JyddXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBfcGFyc2VFeHRlbnNpb24gKGV4dCwgbmFtZSkge1xuXG4gICAgbmFtZSA9IG5hbWUgfHwgbnVsbDtcbiAgICAvLyBJZiBpdCdzIGEgc3RyaW5nLCB0aGUgZXh0ZW5zaW9uIHdhcyBwcmV2aW91c2x5IGxvYWRlZFxuICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcoZXh0KSkge1xuICAgICAgZXh0ID0gc2hvd2Rvd24uaGVscGVyLnN0ZEV4dE5hbWUoZXh0KTtcbiAgICAgIG5hbWUgPSBleHQ7XG5cbiAgICAgIC8vIExFR0FDWV9TVVBQT1JUIENPREVcbiAgICAgIGlmIChzaG93ZG93bi5leHRlbnNpb25zW2V4dF0pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdERVBSRUNBVElPTiBXQVJOSU5HOiAnICsgZXh0ICsgJyBpcyBhbiBvbGQgZXh0ZW5zaW9uIHRoYXQgdXNlcyBhIGRlcHJlY2F0ZWQgbG9hZGluZyBtZXRob2QuJyArXG4gICAgICAgICAgJ1BsZWFzZSBpbmZvcm0gdGhlIGRldmVsb3BlciB0aGF0IHRoZSBleHRlbnNpb24gc2hvdWxkIGJlIHVwZGF0ZWQhJyk7XG4gICAgICAgIGxlZ2FjeUV4dGVuc2lvbkxvYWRpbmcoc2hvd2Rvd24uZXh0ZW5zaW9uc1tleHRdLCBleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIEVORCBMRUdBQ1kgU1VQUE9SVCBDT0RFXG5cbiAgICAgIH0gZWxzZSBpZiAoIXNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChleHRlbnNpb25zW2V4dF0pKSB7XG4gICAgICAgIGV4dCA9IGV4dGVuc2lvbnNbZXh0XTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0V4dGVuc2lvbiBcIicgKyBleHQgKyAnXCIgY291bGQgbm90IGJlIGxvYWRlZC4gSXQgd2FzIGVpdGhlciBub3QgZm91bmQgb3IgaXMgbm90IGEgdmFsaWQgZXh0ZW5zaW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBleHQgPSBleHQoKTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc0FycmF5KGV4dCkpIHtcbiAgICAgIGV4dCA9IFtleHRdO1xuICAgIH1cblxuICAgIHZhciB2YWxpZEV4dCA9IHZhbGlkYXRlKGV4dCwgbmFtZSk7XG4gICAgaWYgKCF2YWxpZEV4dC52YWxpZCkge1xuICAgICAgdGhyb3cgRXJyb3IodmFsaWRFeHQuZXJyb3IpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBzd2l0Y2ggKGV4dFtpXS50eXBlKSB7XG5cbiAgICAgICAgY2FzZSAnbGFuZyc6XG4gICAgICAgICAgbGFuZ0V4dGVuc2lvbnMucHVzaChleHRbaV0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ291dHB1dCc6XG4gICAgICAgICAgb3V0cHV0TW9kaWZpZXJzLnB1c2goZXh0W2ldKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChleHRbaV0uaGFzT3duUHJvcGVydHkoJ2xpc3RlbmVycycpKSB7XG4gICAgICAgIGZvciAodmFyIGxuIGluIGV4dFtpXS5saXN0ZW5lcnMpIHtcbiAgICAgICAgICBpZiAoZXh0W2ldLmxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShsbikpIHtcbiAgICAgICAgICAgIGxpc3RlbihsbiwgZXh0W2ldLmxpc3RlbmVyc1tsbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICAqIExFR0FDWV9TVVBQT1JUXG4gICAqIEBwYXJhbSB7Kn0gZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiBsZWdhY3lFeHRlbnNpb25Mb2FkaW5nIChleHQsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXh0ID0gZXh0KG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoKSk7XG4gICAgfVxuICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkoZXh0KSkge1xuICAgICAgZXh0ID0gW2V4dF07XG4gICAgfVxuICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlKGV4dCwgbmFtZSk7XG5cbiAgICBpZiAoIXZhbGlkLnZhbGlkKSB7XG4gICAgICB0aHJvdyBFcnJvcih2YWxpZC5lcnJvcik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHQubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN3aXRjaCAoZXh0W2ldLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbGFuZyc6XG4gICAgICAgICAgbGFuZ0V4dGVuc2lvbnMucHVzaChleHRbaV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvdXRwdXQnOlxuICAgICAgICAgIG91dHB1dE1vZGlmaWVycy5wdXNoKGV4dFtpXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6Ly8gc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmVcbiAgICAgICAgICB0aHJvdyBFcnJvcignRXh0ZW5zaW9uIGxvYWRlciBlcnJvcjogVHlwZSB1bnJlY29nbml6ZWQhISEnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIHRvIGFuIGV2ZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBmdW5jdGlvbiBsaXN0ZW4gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcobmFtZSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IGluIGNvbnZlcnRlci5saXN0ZW4oKSBtZXRob2Q6IG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0ICcgKyB0eXBlb2YgbmFtZSArICcgZ2l2ZW4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBpbiBjb252ZXJ0ZXIubGlzdGVuKCkgbWV0aG9kOiBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCAnICsgdHlwZW9mIGNhbGxiYWNrICsgJyBnaXZlbicpO1xuICAgIH1cblxuICAgIGlmICghbGlzdGVuZXJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBsaXN0ZW5lcnNbbmFtZV0gPSBbXTtcbiAgICB9XG4gICAgbGlzdGVuZXJzW25hbWVdLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gclRyaW1JbnB1dFRleHQgKHRleHQpIHtcbiAgICB2YXIgcnNwID0gdGV4dC5tYXRjaCgvXlxccyovKVswXS5sZW5ndGgsXG4gICAgICAgIHJneCA9IG5ldyBSZWdFeHAoJ15cXFxcc3swLCcgKyByc3AgKyAnfScsICdnbScpO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2Uocmd4LCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2dE5hbWUgRXZlbnQgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXh0XG4gICAqIEBwYXJhbSB7e319IG9wdGlvbnMgQ29udmVydGVyIE9wdGlvbnNcbiAgICogQHBhcmFtIHt7fX0gZ2xvYmFsc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdGhpcy5fZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCAoZXZ0TmFtZSwgdGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAgIGlmIChsaXN0ZW5lcnMuaGFzT3duUHJvcGVydHkoZXZ0TmFtZSkpIHtcbiAgICAgIGZvciAodmFyIGVpID0gMDsgZWkgPCBsaXN0ZW5lcnNbZXZ0TmFtZV0ubGVuZ3RoOyArK2VpKSB7XG4gICAgICAgIHZhciBuVGV4dCA9IGxpc3RlbmVyc1tldnROYW1lXVtlaV0oZXZ0TmFtZSwgdGV4dCwgdGhpcywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICAgIGlmIChuVGV4dCAmJiB0eXBlb2YgblRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGV4dCA9IG5UZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3Nob3dkb3duLkNvbnZlcnRlcn1cbiAgICovXG4gIHRoaXMubGlzdGVuID0gZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgbGlzdGVuKG5hbWUsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQ29udmVydHMgYSBtYXJrZG93biBzdHJpbmcgaW50byBIVE1MXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgdGhpcy5tYWtlSHRtbCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgLy9jaGVjayBpZiB0ZXh0IGlzIG5vdCBmYWxzeVxuICAgIGlmICghdGV4dCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGdsb2JhbHMgPSB7XG4gICAgICBnSHRtbEJsb2NrczogICAgIFtdLFxuICAgICAgZ0h0bWxNZEJsb2NrczogICBbXSxcbiAgICAgIGdIdG1sU3BhbnM6ICAgICAgW10sXG4gICAgICBnVXJsczogICAgICAgICAgIHt9LFxuICAgICAgZ1RpdGxlczogICAgICAgICB7fSxcbiAgICAgIGdEaW1lbnNpb25zOiAgICAge30sXG4gICAgICBnTGlzdExldmVsOiAgICAgIDAsXG4gICAgICBoYXNoTGlua0NvdW50czogIHt9LFxuICAgICAgbGFuZ0V4dGVuc2lvbnM6ICBsYW5nRXh0ZW5zaW9ucyxcbiAgICAgIG91dHB1dE1vZGlmaWVyczogb3V0cHV0TW9kaWZpZXJzLFxuICAgICAgY29udmVydGVyOiAgICAgICB0aGlzLFxuICAgICAgZ2hDb2RlQmxvY2tzOiAgICBbXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHBhcnNlZDoge30sXG4gICAgICAgIHJhdzogJycsXG4gICAgICAgIGZvcm1hdDogJydcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVGhpcyBsZXRzIHVzIHVzZSDCqCB0cmVtYSBhcyBhbiBlc2NhcGUgY2hhciB0byBhdm9pZCBtZDUgaGFzaGVzXG4gICAgLy8gVGhlIGNob2ljZSBvZiBjaGFyYWN0ZXIgaXMgYXJiaXRyYXJ5OyBhbnl0aGluZyB0aGF0IGlzbid0XG4gICAgLy8gbWFnaWMgaW4gTWFya2Rvd24gd2lsbCB3b3JrLlxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoL2csICfCqFQnKTtcblxuICAgIC8vIFJlcGxhY2UgJCB3aXRoIMKoRFxuICAgIC8vIFJlZ0V4cCBpbnRlcnByZXRzICQgYXMgYSBzcGVjaWFsIGNoYXJhY3RlclxuICAgIC8vIHdoZW4gaXQncyBpbiBhIHJlcGxhY2VtZW50IHN0cmluZ1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcJC9nLCAnwqhEJyk7XG5cbiAgICAvLyBTdGFuZGFyZGl6ZSBsaW5lIGVuZGluZ3NcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpOyAvLyBET1MgdG8gVW5peFxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcci9nLCAnXFxuJyk7IC8vIE1hYyB0byBVbml4XG5cbiAgICAvLyBTdGFyZGFyZGl6ZSBsaW5lIHNwYWNlc1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcdTAwQTAvZywgJyZuYnNwOycpO1xuXG4gICAgaWYgKG9wdGlvbnMuc21hcnRJbmRlbnRhdGlvbkZpeCkge1xuICAgICAgdGV4dCA9IHJUcmltSW5wdXRUZXh0KHRleHQpO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGJlZ2lucyBhbmQgZW5kcyB3aXRoIGEgY291cGxlIG9mIG5ld2xpbmVzOlxuICAgIHRleHQgPSAnXFxuXFxuJyArIHRleHQgKyAnXFxuXFxuJztcblxuICAgIC8vIGRldGFiXG4gICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignZGV0YWInKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAgIC8qKlxuICAgICAqIFN0cmlwIGFueSBsaW5lcyBjb25zaXN0aW5nIG9ubHkgb2Ygc3BhY2VzIGFuZCB0YWJzLlxuICAgICAqIFRoaXMgbWFrZXMgc3Vic2VxdWVudCByZWdleHMgZWFzaWVyIHRvIHdyaXRlLCBiZWNhdXNlIHdlIGNhblxuICAgICAqIG1hdGNoIGNvbnNlY3V0aXZlIGJsYW5rIGxpbmVzIHdpdGggL1xcbisvIGluc3RlYWQgb2Ygc29tZXRoaW5nXG4gICAgICogY29udG9ydGVkIGxpa2UgL1sgXFx0XSpcXG4rL1xuICAgICAqL1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15bIFxcdF0rJC9tZywgJycpO1xuXG4gICAgLy9ydW4gbGFuZ3VhZ2VFeHRlbnNpb25zXG4gICAgc2hvd2Rvd24uaGVscGVyLmZvckVhY2gobGFuZ0V4dGVuc2lvbnMsIGZ1bmN0aW9uIChleHQpIHtcbiAgICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3J1bkV4dGVuc2lvbicpKGV4dCwgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgfSk7XG5cbiAgICAvLyBydW4gdGhlIHN1YiBwYXJzZXJzXG4gICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWV0YWRhdGEnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoUHJlQ29kZVRhZ3MnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdnaXRodWJDb2RlQmxvY2tzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignaGFzaEhUTUxCbG9ja3MnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQ29kZVRhZ3MnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzdHJpcExpbmtEZWZpbml0aW9ucycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2Jsb2NrR2FtdXQnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmhhc2hIVE1MU3BhbnMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmVzY2FwZVNwZWNpYWxDaGFycycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gICAgLy8gYXR0YWNrbGFiOiBSZXN0b3JlIGRvbGxhciBzaWduc1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoRC9nLCAnJCQnKTtcblxuICAgIC8vIGF0dGFja2xhYjogUmVzdG9yZSB0cmVtYXNcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqFQvZywgJ8KoJyk7XG5cbiAgICAvLyByZW5kZXIgYSBjb21wbGV0ZSBodG1sIGRvY3VtZW50IGluc3RlYWQgb2YgYSBwYXJ0aWFsIGlmIHRoZSBvcHRpb24gaXMgZW5hYmxlZFxuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2NvbXBsZXRlSFRNTERvY3VtZW50JykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgICAvLyBSdW4gb3V0cHV0IG1vZGlmaWVyc1xuICAgIHNob3dkb3duLmhlbHBlci5mb3JFYWNoKG91dHB1dE1vZGlmaWVycywgZnVuY3Rpb24gKGV4dCkge1xuICAgICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcigncnVuRXh0ZW5zaW9uJykoZXh0LCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZSBtZXRhZGF0YVxuICAgIG1ldGFkYXRhID0gZ2xvYmFscy5tZXRhZGF0YTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gSFRNTCBzdHJpbmcgaW50byBhIG1hcmtkb3duIHN0cmluZ1xuICAgKiBAcGFyYW0gc3JjXG4gICAqIEBwYXJhbSBbSFRNTFBhcnNlcl0gQSBXSEFUV0cgRE9NIGFuZCBIVE1MIHBhcnNlciwgc3VjaCBhcyBKU0RPTS4gSWYgbm9uZSBpcyBzdXBwbGllZCwgd2luZG93LmRvY3VtZW50IHdpbGwgYmUgdXNlZC5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRoaXMubWFrZU1hcmtkb3duID0gdGhpcy5tYWtlTWQgPSBmdW5jdGlvbiAoc3JjLCBIVE1MUGFyc2VyKSB7XG5cbiAgICAvLyByZXBsYWNlIFxcclxcbiB3aXRoIFxcblxuICAgIHNyYyA9IHNyYy5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICAgIHNyYyA9IHNyYy5yZXBsYWNlKC9cXHIvZywgJ1xcbicpOyAvLyBvbGQgbWFjc1xuXG4gICAgLy8gZHVlIHRvIGFuIGVkZ2UgY2FzZSwgd2UgbmVlZCB0byBmaW5kIHRoaXM6ID4gPFxuICAgIC8vIHRvIHByZXZlbnQgcmVtb3Zpbmcgb2Ygbm9uIHNpbGVudCB3aGl0ZSBzcGFjZXNcbiAgICAvLyBleDogPGVtPnRoaXMgaXM8L2VtPiA8c3Ryb25nPnNwYXJ0YTwvc3Ryb25nPlxuICAgIHNyYyA9IHNyYy5yZXBsYWNlKC8+WyBcXHRdKzwvLCAnPsKoTkJTUDs8Jyk7XG5cbiAgICBpZiAoIUhUTUxQYXJzZXIpIHtcbiAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgIEhUTUxQYXJzZXIgPSB3aW5kb3cuZG9jdW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hUTUxQYXJzZXIgaXMgdW5kZWZpbmVkLiBJZiBpbiBhIHdlYndvcmtlciBvciBub2RlanMgZW52aXJvbm1lbnQsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBXSEFUV0cgRE9NIGFuZCBIVE1MIHN1Y2ggYXMgSlNET00nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZG9jID0gSFRNTFBhcnNlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkb2MuaW5uZXJIVE1MID0gc3JjO1xuXG4gICAgdmFyIGdsb2JhbHMgPSB7XG4gICAgICBwcmVMaXN0OiBzdWJzdGl0dXRlUHJlQ29kZVRhZ3MoZG9jKVxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgYWxsIG5ld2xpbmVzIGFuZCBjb2xsYXBzZSBzcGFjZXNcbiAgICBjbGVhbihkb2MpO1xuXG4gICAgLy8gc29tZSBzdHVmZiwgbGlrZSBhY2NpZGVudGFsIHJlZmVyZW5jZSBsaW5rcyBtdXN0IG5vdyBiZSBlc2NhcGVkXG4gICAgLy8gVE9ET1xuICAgIC8vIGRvYy5pbm5lckhUTUwgPSBkb2MuaW5uZXJIVE1MLnJlcGxhY2UoL1xcW1tcXFNcXHQgXV0vKTtcblxuICAgIHZhciBub2RlcyA9IGRvYy5jaGlsZE5vZGVzLFxuICAgICAgICBtZERvYyA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbWREb2MgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKG5vZGVzW2ldLCBnbG9iYWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbiAobm9kZSkge1xuICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW25dO1xuICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICBpZiAoIS9cXFMvLnRlc3QoY2hpbGQubm9kZVZhbHVlKSAmJiAhL15bIF0rJC8udGVzdChjaGlsZC5ub2RlVmFsdWUpKSB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIC0tbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGQubm9kZVZhbHVlID0gY2hpbGQubm9kZVZhbHVlLnNwbGl0KCdcXG4nKS5qb2luKCcgJyk7XG4gICAgICAgICAgICBjaGlsZC5ub2RlVmFsdWUgPSBjaGlsZC5ub2RlVmFsdWUucmVwbGFjZSgvKFxccykrL2csICckMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgIGNsZWFuKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbmQgYWxsIHByZSB0YWdzIGFuZCByZXBsYWNlIGNvbnRlbnRzIHdpdGggcGxhY2Vob2xkZXJcbiAgICAvLyB3ZSBuZWVkIHRoaXMgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGh0bWxcbiAgICAvLyB0byBlYXNlIHVwIHBhcnNpbmdcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlUHJlQ29kZVRhZ3MgKGRvYykge1xuXG4gICAgICB2YXIgcHJlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdwcmUnKSxcbiAgICAgICAgICBwcmVzUEggPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgaWYgKHByZXNbaV0uY2hpbGRFbGVtZW50Q291bnQgPT09IDEgJiYgcHJlc1tpXS5maXJzdENoaWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NvZGUnKSB7XG4gICAgICAgICAgdmFyIGNvbnRlbnQgPSBwcmVzW2ldLmZpcnN0Q2hpbGQuaW5uZXJIVE1MLnRyaW0oKSxcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBwcmVzW2ldLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLWxhbmd1YWdlJykgfHwgJyc7XG5cbiAgICAgICAgICAvLyBpZiBkYXRhLWxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgdGhlbiB3ZSBsb29rIGZvciBjbGFzcyBsYW5ndWFnZS0qXG4gICAgICAgICAgaWYgKGxhbmd1YWdlID09PSAnJykge1xuICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBwcmVzW2ldLmZpcnN0Q2hpbGQuY2xhc3NOYW1lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyArK2MpIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZXMgPSBjbGFzc2VzW2NdLm1hdGNoKC9ebGFuZ3VhZ2UtKC4rKSQvKTtcbiAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IG1hdGNoZXNbMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB1bmVzY2FwZSBodG1sIGVudGl0aWVzIGluIGNvbnRlbnRcbiAgICAgICAgICBjb250ZW50ID0gc2hvd2Rvd24uaGVscGVyLnVuZXNjYXBlSFRNTEVudGl0aWVzKGNvbnRlbnQpO1xuXG4gICAgICAgICAgcHJlc1BILnB1c2goY29udGVudCk7XG4gICAgICAgICAgcHJlc1tpXS5vdXRlckhUTUwgPSAnPHByZWNvZGUgbGFuZ3VhZ2U9XCInICsgbGFuZ3VhZ2UgKyAnXCIgcHJlY29kZW51bT1cIicgKyBpLnRvU3RyaW5nKCkgKyAnXCI+PC9wcmVjb2RlPic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlc1BILnB1c2gocHJlc1tpXS5pbm5lckhUTUwpO1xuICAgICAgICAgIHByZXNbaV0uaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgcHJlc1tpXS5zZXRBdHRyaWJ1dGUoJ3ByZW51bScsIGkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmVzUEg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1kRG9jO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgYW4gb3B0aW9uIG9mIHRoaXMgQ29udmVydGVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgdGhpcy5zZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9wdGlvbiBvZiB0aGlzIENvbnZlcnRlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgdGhpcy5nZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG9wdGlvbnNba2V5XTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb25zIG9mIHRoaXMgQ29udmVydGVyIGluc3RhbmNlXG4gICAqIEByZXR1cm5zIHt7fX1cbiAgICovXG4gIHRoaXMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGV4dGVuc2lvbiB0byBUSElTIGNvbnZlcnRlclxuICAgKiBAcGFyYW0ge3t9fSBleHRlbnNpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPW51bGxdXG4gICAqL1xuICB0aGlzLmFkZEV4dGVuc2lvbiA9IGZ1bmN0aW9uIChleHRlbnNpb24sIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBudWxsO1xuICAgIF9wYXJzZUV4dGVuc2lvbihleHRlbnNpb24sIG5hbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVc2UgYSBnbG9iYWwgcmVnaXN0ZXJlZCBleHRlbnNpb24gd2l0aCBUSElTIGNvbnZlcnRlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZXh0ZW5zaW9uXG4gICAqL1xuICB0aGlzLnVzZUV4dGVuc2lvbiA9IGZ1bmN0aW9uIChleHRlbnNpb25OYW1lKSB7XG4gICAgX3BhcnNlRXh0ZW5zaW9uKGV4dGVuc2lvbk5hbWUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZsYXZvciBUSElTIGNvbnZlcnRlciBzaG91bGQgdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICB0aGlzLnNldEZsYXZvciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKCFmbGF2b3IuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHRocm93IEVycm9yKG5hbWUgKyAnIGZsYXZvciB3YXMgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHZhciBwcmVzZXQgPSBmbGF2b3JbbmFtZV07XG4gICAgc2V0Q29udkZsYXZvciA9IG5hbWU7XG4gICAgZm9yICh2YXIgb3B0aW9uIGluIHByZXNldCkge1xuICAgICAgaWYgKHByZXNldC5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSB7XG4gICAgICAgIG9wdGlvbnNbb3B0aW9uXSA9IHByZXNldFtvcHRpb25dO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50bHkgc2V0IGZsYXZvciBvZiB0aGlzIGNvbnZlcnRlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdGhpcy5nZXRGbGF2b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNldENvbnZGbGF2b3I7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBleHRlbnNpb24gZnJvbSBUSElTIGNvbnZlcnRlci5cbiAgICogTm90ZTogVGhpcyBpcyBhIGNvc3RseSBvcGVyYXRpb24uIEl0J3MgYmV0dGVyIHRvIGluaXRpYWxpemUgYSBuZXcgY29udmVydGVyXG4gICAqIGFuZCBzcGVjaWZ5IHRoZSBleHRlbnNpb25zIHlvdSB3aXNoIHRvIHVzZVxuICAgKiBAcGFyYW0ge0FycmF5fSBleHRlbnNpb25cbiAgICovXG4gIHRoaXMucmVtb3ZlRXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkoZXh0ZW5zaW9uKSkge1xuICAgICAgZXh0ZW5zaW9uID0gW2V4dGVuc2lvbl07XG4gICAgfVxuICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZXh0ZW5zaW9uLmxlbmd0aDsgKythKSB7XG4gICAgICB2YXIgZXh0ID0gZXh0ZW5zaW9uW2FdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYW5nRXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobGFuZ0V4dGVuc2lvbnNbaV0gPT09IGV4dCkge1xuICAgICAgICAgIGxhbmdFeHRlbnNpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG91dHB1dE1vZGlmaWVycy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgaWYgKG91dHB1dE1vZGlmaWVyc1tpaV0gPT09IGV4dCkge1xuICAgICAgICAgIG91dHB1dE1vZGlmaWVycy5zcGxpY2UoaWksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGV4dGVuc2lvbiBvZiBUSElTIGNvbnZlcnRlclxuICAgKiBAcmV0dXJucyB7e2xhbmd1YWdlOiBBcnJheSwgb3V0cHV0OiBBcnJheX19XG4gICAqL1xuICB0aGlzLmdldEFsbEV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhbmd1YWdlOiBsYW5nRXh0ZW5zaW9ucyxcbiAgICAgIG91dHB1dDogb3V0cHV0TW9kaWZpZXJzXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJldmlvdXNseSBwYXJzZWQgZG9jdW1lbnRcbiAgICogQHBhcmFtIHJhd1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfHt9fVxuICAgKi9cbiAgdGhpcy5nZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICBpZiAocmF3KSB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEucmF3O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWV0YWRhdGEucGFyc2VkO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBtZXRhZGF0YSBmb3JtYXQgb2YgdGhlIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0aGlzLmdldE1ldGFkYXRhRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBtZXRhZGF0YS5mb3JtYXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGU6IHNldCBhIHNpbmdsZSBrZXksIHZhbHVlIG1ldGFkYXRhIHBhaXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICovXG4gIHRoaXMuX3NldE1ldGFkYXRhUGFpciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgbWV0YWRhdGEucGFyc2VkW2tleV0gPSB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZTogc2V0IG1ldGFkYXRhIGZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gICAqL1xuICB0aGlzLl9zZXRNZXRhZGF0YUZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBtZXRhZGF0YS5mb3JtYXQgPSBmb3JtYXQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByaXZhdGU6IHNldCBtZXRhZGF0YSByYXcgdGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3XG4gICAqL1xuICB0aGlzLl9zZXRNZXRhZGF0YVJhdyA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICBtZXRhZGF0YS5yYXcgPSByYXc7XG4gIH07XG59O1xuXHJcbi8qKlxuICogVHVybiBNYXJrZG93biBsaW5rIHNob3J0Y3V0cyBpbnRvIFhIVE1MIDxhPiB0YWdzLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2FuY2hvcnMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnYW5jaG9ycy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIgd3JpdGVBbmNob3JUYWcgPSBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbGlua1RleHQsIGxpbmtJZCwgdXJsLCBtNSwgbTYsIHRpdGxlKSB7XG4gICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZCh0aXRsZSkpIHtcbiAgICAgIHRpdGxlID0gJyc7XG4gICAgfVxuICAgIGxpbmtJZCA9IGxpbmtJZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBleHBsaWNpdCBlbXB0eSB1cmxcbiAgICBpZiAod2hvbGVNYXRjaC5zZWFyY2goL1xcKDw/XFxzKj4/ID8oWydcIl0uKlsnXCJdKT9cXCkkL20pID4gLTEpIHtcbiAgICAgIHVybCA9ICcnO1xuICAgIH0gZWxzZSBpZiAoIXVybCkge1xuICAgICAgaWYgKCFsaW5rSWQpIHtcbiAgICAgICAgLy8gbG93ZXItY2FzZSBhbmQgdHVybiBlbWJlZGRlZCBuZXdsaW5lcyBpbnRvIHNwYWNlc1xuICAgICAgICBsaW5rSWQgPSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyA/XFxuL2csICcgJyk7XG4gICAgICB9XG4gICAgICB1cmwgPSAnIycgKyBsaW5rSWQ7XG5cbiAgICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGdsb2JhbHMuZ1VybHNbbGlua0lkXSkpIHtcbiAgICAgICAgdXJsID0gZ2xvYmFscy5nVXJsc1tsaW5rSWRdO1xuICAgICAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChnbG9iYWxzLmdUaXRsZXNbbGlua0lkXSkpIHtcbiAgICAgICAgICB0aXRsZSA9IGdsb2JhbHMuZ1RpdGxlc1tsaW5rSWRdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gd2hvbGVNYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3VybCA9IHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzKHVybCwgJypfJywgZmFsc2UpOyAvLyByZXBsYWNlZCBsaW5lIHRvIGltcHJvdmUgcGVyZm9ybWFuY2VcbiAgICB1cmwgPSB1cmwucmVwbGFjZShzaG93ZG93bi5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG5cbiAgICB2YXIgcmVzdWx0ID0gJzxhIGhyZWY9XCInICsgdXJsICsgJ1wiJztcblxuICAgIGlmICh0aXRsZSAhPT0gJycgJiYgdGl0bGUgIT09IG51bGwpIHtcbiAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICAgICAgLy90aXRsZSA9IHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzKHRpdGxlLCAnKl8nLCBmYWxzZSk7IC8vIHJlcGxhY2VkIGxpbmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAgIHJlc3VsdCArPSAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJztcbiAgICB9XG5cbiAgICAvLyBvcHRpb25MaW5rc0luTmV3V2luZG93IG9ubHkgYXBwbGllc1xuICAgIC8vIHRvIGV4dGVybmFsIGxpbmtzLiBIYXNoIGxpbmtzICgjKSBvcGVuIGluIHNhbWUgcGFnZVxuICAgIGlmIChvcHRpb25zLm9wZW5MaW5rc0luTmV3V2luZG93ICYmICEvXiMvLnRlc3QodXJsKSkge1xuICAgICAgLy8gZXNjYXBlZCBfXG4gICAgICByZXN1bHQgKz0gJyByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiwqhFOTVFYmxhbmtcIic7XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9ICc+JyArIGxpbmtUZXh0ICsgJzwvYT4nO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBGaXJzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBsaW5rczogW2xpbmsgdGV4dF0gW2lkXVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFsoKD86XFxbW15cXF1dKl18W15cXFtcXF1dKSopXSA/KD86XFxuICopP1xcWyguKj8pXSgpKCkoKSgpL2csIHdyaXRlQW5jaG9yVGFnKTtcblxuICAvLyBOZXh0LCBpbmxpbmUtc3R5bGUgbGlua3M6IFtsaW5rIHRleHRdKHVybCBcIm9wdGlvbmFsIHRpdGxlXCIpXG4gIC8vIGNhc2VzIHdpdGggY3JhenkgdXJscyBsaWtlIC4vaW1hZ2UvY2F0MSkucG5nXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcWygoPzpcXFtbXlxcXV0qXXxbXlxcW1xcXV0pKildKClbIFxcdF0qXFwoWyBcXHRdPzwoW14+XSopPig/OlsgXFx0XSooKFtcIiddKShbXlwiXSo/KVxcNSkpP1sgXFx0XT9cXCkvZyxcbiAgICB3cml0ZUFuY2hvclRhZyk7XG5cbiAgLy8gbm9ybWFsIGNhc2VzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcWygoPzpcXFtbXlxcXV0qXXxbXlxcW1xcXV0pKildKClbIFxcdF0qXFwoWyBcXHRdPzw/KFtcXFNdKz8oPzpcXChbXFxTXSo/XFwpW1xcU10qPyk/KT4/KD86WyBcXHRdKigoW1wiJ10pKFteXCJdKj8pXFw1KSk/WyBcXHRdP1xcKS9nLFxuICAgIHdyaXRlQW5jaG9yVGFnKTtcblxuICAvLyBoYW5kbGUgcmVmZXJlbmNlLXN0eWxlIHNob3J0Y3V0czogW2xpbmsgdGV4dF1cbiAgLy8gVGhlc2UgbXVzdCBjb21lIGxhc3QgaW4gY2FzZSB5b3UndmUgYWxzbyBnb3QgW2xpbmsgdGVzdF1bMV1cbiAgLy8gb3IgW2xpbmsgdGVzdF0oL2ZvbylcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxbKFteXFxbXFxdXSspXSgpKCkoKSgpKCkvZywgd3JpdGVBbmNob3JUYWcpO1xuXG4gIC8vIExhc3RseSBoYW5kbGUgR2l0aHViTWVudGlvbnMgaWYgb3B0aW9uIGlzIGVuYWJsZWRcbiAgaWYgKG9wdGlvbnMuZ2hNZW50aW9ucykge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhefFxccykoXFxcXCk/KEAoW2EtelxcZF0rKD86W2EtelxcZC4tXSs/W2EtelxcZF0rKSopKS9nbWksIGZ1bmN0aW9uICh3bSwgc3QsIGVzY2FwZSwgbWVudGlvbnMsIHVzZXJuYW1lKSB7XG4gICAgICBpZiAoZXNjYXBlID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmV0dXJuIHN0ICsgbWVudGlvbnM7XG4gICAgICB9XG5cbiAgICAgIC8vY2hlY2sgaWYgb3B0aW9ucy5naE1lbnRpb25zTGluayBpcyBhIHN0cmluZ1xuICAgICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcob3B0aW9ucy5naE1lbnRpb25zTGluaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnaE1lbnRpb25zTGluayBvcHRpb24gbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgdmFyIGxuayA9IG9wdGlvbnMuZ2hNZW50aW9uc0xpbmsucmVwbGFjZSgvXFx7dX0vZywgdXNlcm5hbWUpLFxuICAgICAgICAgIHRhcmdldCA9ICcnO1xuICAgICAgaWYgKG9wdGlvbnMub3BlbkxpbmtzSW5OZXdXaW5kb3cpIHtcbiAgICAgICAgdGFyZ2V0ID0gJyByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiwqhFOTVFYmxhbmtcIic7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3QgKyAnPGEgaHJlZj1cIicgKyBsbmsgKyAnXCInICsgdGFyZ2V0ICsgJz4nICsgbWVudGlvbnMgKyAnPC9hPic7XG4gICAgfSk7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdhbmNob3JzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLy8gdXJsIGFsbG93ZWQgY2hhcnMgW2EtelxcZF8ufjovPyNbXUAhJCYnKCkqKyw7PS1dXG5cbnZhciBzaW1wbGVVUkxSZWdleCAgPSAvKFsqfl9dK3xcXGIpKCgoaHR0cHM/fGZ0cHxkaWN0KTpcXC9cXC98d3d3XFwuKVteJ1wiPlxcc10rP1xcLlteJ1wiPlxcc10rPykoKShcXDEpPyg/PVxcc3wkKSg/IVtcIjw+XSkvZ2ksXG4gICAgc2ltcGxlVVJMUmVnZXgyID0gLyhbKn5fXSt8XFxiKSgoKGh0dHBzP3xmdHB8ZGljdCk6XFwvXFwvfHd3d1xcLilbXidcIj5cXHNdK1xcLlteJ1wiPlxcc10rPykoWy4hPywoKVxcW1xcXV0pPyhcXDEpPyg/PVxcc3wkKSg/IVtcIjw+XSkvZ2ksXG4gICAgZGVsaW1VcmxSZWdleCAgID0gLygpPCgoKGh0dHBzP3xmdHB8ZGljdCk6XFwvXFwvfHd3d1xcLilbXidcIj5cXHNdKykoKT4oKS9naSxcbiAgICBzaW1wbGVNYWlsUmVnZXggPSAvKF58XFxzKSg/Om1haWx0bzopPyhbQS1aYS16MC05ISMkJSYnKistLz0/Xl9ge3x9fi5dK0BbLWEtejAtOV0rKFxcLlstYS16MC05XSspKlxcLlthLXpdKykoPz0kfFxccykvZ21pLFxuICAgIGRlbGltTWFpbFJlZ2V4ICA9IC88KCkoPzptYWlsdG86KT8oWy0uXFx3XStAWy1hLXowLTldKyhcXC5bLWEtejAtOV0rKSpcXC5bYS16XSspPi9naSxcblxuICAgIHJlcGxhY2VMaW5rID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIHJldHVybiBmdW5jdGlvbiAod20sIGxlYWRpbmdNYWdpY0NoYXJzLCBsaW5rLCBtMiwgbTMsIHRyYWlsaW5nUHVuY3R1YXRpb24sIHRyYWlsaW5nTWFnaWNDaGFycykge1xuICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAgICAgdmFyIGxua1R4dCA9IGxpbmssXG4gICAgICAgICAgICBhcHBlbmQgPSAnJyxcbiAgICAgICAgICAgIHRhcmdldCA9ICcnLFxuICAgICAgICAgICAgbG1jICAgID0gbGVhZGluZ01hZ2ljQ2hhcnMgfHwgJycsXG4gICAgICAgICAgICB0bWMgICAgPSB0cmFpbGluZ01hZ2ljQ2hhcnMgfHwgJyc7XG4gICAgICAgIGlmICgvXnd3d1xcLi9pLnRlc3QobGluaykpIHtcbiAgICAgICAgICBsaW5rID0gbGluay5yZXBsYWNlKC9ed3d3XFwuL2ksICdodHRwOi8vd3d3LicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGVUcmFpbGluZ1B1bmN0dWF0aW9uRnJvbVVSTHMgJiYgdHJhaWxpbmdQdW5jdHVhdGlvbikge1xuICAgICAgICAgIGFwcGVuZCA9IHRyYWlsaW5nUHVuY3R1YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3BlbkxpbmtzSW5OZXdXaW5kb3cpIHtcbiAgICAgICAgICB0YXJnZXQgPSAnIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB0YXJnZXQ9XCLCqEU5NUVibGFua1wiJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG1jICsgJzxhIGhyZWY9XCInICsgbGluayArICdcIicgKyB0YXJnZXQgKyAnPicgKyBsbmtUeHQgKyAnPC9hPicgKyBhcHBlbmQgKyB0bWM7XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICByZXBsYWNlTWFpbCA9IGZ1bmN0aW9uIChvcHRpb25zLCBnbG9iYWxzKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHdob2xlTWF0Y2gsIGIsIG1haWwpIHtcbiAgICAgICAgdmFyIGhyZWYgPSAnbWFpbHRvOic7XG4gICAgICAgIGIgPSBiIHx8ICcnO1xuICAgICAgICBtYWlsID0gc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmVzY2FwZVNwZWNpYWxDaGFycycpKG1haWwsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgICBpZiAob3B0aW9ucy5lbmNvZGVFbWFpbHMpIHtcbiAgICAgICAgICBocmVmID0gc2hvd2Rvd24uaGVscGVyLmVuY29kZUVtYWlsQWRkcmVzcyhocmVmICsgbWFpbCk7XG4gICAgICAgICAgbWFpbCA9IHNob3dkb3duLmhlbHBlci5lbmNvZGVFbWFpbEFkZHJlc3MobWFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHJlZiA9IGhyZWYgKyBtYWlsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiICsgJzxhIGhyZWY9XCInICsgaHJlZiArICdcIj4nICsgbWFpbCArICc8L2E+JztcbiAgICAgIH07XG4gICAgfTtcblxuc2hvd2Rvd24uc3ViUGFyc2VyKCdhdXRvTGlua3MnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnYXV0b0xpbmtzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoZGVsaW1VcmxSZWdleCwgcmVwbGFjZUxpbmsob3B0aW9ucykpO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGRlbGltTWFpbFJlZ2V4LCByZXBsYWNlTWFpbChvcHRpb25zLCBnbG9iYWxzKSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnYXV0b0xpbmtzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxuc2hvd2Rvd24uc3ViUGFyc2VyKCdzaW1wbGlmaWVkQXV0b0xpbmtzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghb3B0aW9ucy5zaW1wbGlmaWVkQXV0b0xpbmspIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3NpbXBsaWZpZWRBdXRvTGlua3MuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgaWYgKG9wdGlvbnMuZXhjbHVkZVRyYWlsaW5nUHVuY3R1YXRpb25Gcm9tVVJMcykge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uoc2ltcGxlVVJMUmVnZXgyLCByZXBsYWNlTGluayhvcHRpb25zKSk7XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShzaW1wbGVVUkxSZWdleCwgcmVwbGFjZUxpbmsob3B0aW9ucykpO1xuICB9XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2Uoc2ltcGxlTWFpbFJlZ2V4LCByZXBsYWNlTWFpbChvcHRpb25zLCBnbG9iYWxzKSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc2ltcGxpZmllZEF1dG9MaW5rcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBUaGVzZSBhcmUgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBmb3JtIGJsb2NrLWxldmVsXG4gKiB0YWdzIGxpa2UgcGFyYWdyYXBocywgaGVhZGVycywgYW5kIGxpc3QgaXRlbXMuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignYmxvY2tHYW11dCcsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdibG9ja0dhbXV0LmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIHdlIHBhcnNlIGJsb2NrcXVvdGVzIGZpcnN0IHNvIHRoYXQgd2UgY2FuIGhhdmUgaGVhZGluZ3MgYW5kIGhyc1xuICAvLyBpbnNpZGUgYmxvY2txdW90ZXNcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignYmxvY2tRdW90ZXMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignaGVhZGVycycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIERvIEhvcml6b250YWwgUnVsZXM6XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hvcml6b250YWxSdWxlJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbGlzdHMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignY29kZUJsb2NrcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCd0YWJsZXMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBXZSBhbHJlYWR5IHJhbiBfSGFzaEhUTUxCbG9ja3MoKSBiZWZvcmUsIGluIE1hcmtkb3duKCksIGJ1dCB0aGF0XG4gIC8vIHdhcyB0byBlc2NhcGUgcmF3IEhUTUwgaW4gdGhlIG9yaWdpbmFsIE1hcmtkb3duIHNvdXJjZS4gVGhpcyB0aW1lLFxuICAvLyB3ZSdyZSBlc2NhcGluZyB0aGUgbWFya3VwIHdlJ3ZlIGp1c3QgY3JlYXRlZCwgc28gdGhhdCB3ZSBkb24ndCB3cmFwXG4gIC8vIDxwPiB0YWdzIGFyb3VuZCBibG9jay1sZXZlbCB0YWdzLlxuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoSFRNTEJsb2NrcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdwYXJhZ3JhcGhzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnYmxvY2tHYW11dC5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdibG9ja1F1b3RlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdibG9ja1F1b3Rlcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBhZGQgYSBjb3VwbGUgZXh0cmEgbGluZXMgYWZ0ZXIgdGhlIHRleHQgYW5kIGVuZHRleHQgbWFya1xuICB0ZXh0ID0gdGV4dCArICdcXG5cXG4nO1xuXG4gIHZhciByZ3ggPSAvKF4gezAsM30+WyBcXHRdPy4rXFxuKC4rXFxuKSpcXG4qKSsvZ207XG5cbiAgaWYgKG9wdGlvbnMuc3BsaXRBZGphY2VudEJsb2NrcXVvdGVzKSB7XG4gICAgcmd4ID0gL14gezAsM30+W1xcc1xcU10qPyg/OlxcblxcbikvZ207XG4gIH1cblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJneCwgZnVuY3Rpb24gKGJxKSB7XG4gICAgLy8gYXR0YWNrbGFiOiBoYWNrIGFyb3VuZCBLb25xdWVyb3IgMy41LjQgYnVnOlxuICAgIC8vIFwiLS0tLS0tLS0tLWJ1Z1wiLnJlcGxhY2UoL14tL2csXCJcIikgPT0gXCJidWdcIlxuICAgIGJxID0gYnEucmVwbGFjZSgvXlsgXFx0XSo+WyBcXHRdPy9nbSwgJycpOyAvLyB0cmltIG9uZSBsZXZlbCBvZiBxdW90aW5nXG5cbiAgICAvLyBhdHRhY2tsYWI6IGNsZWFuIHVwIGhhY2tcbiAgICBicSA9IGJxLnJlcGxhY2UoL8KoMC9nLCAnJyk7XG5cbiAgICBicSA9IGJxLnJlcGxhY2UoL15bIFxcdF0rJC9nbSwgJycpOyAvLyB0cmltIHdoaXRlc3BhY2Utb25seSBsaW5lc1xuICAgIGJxID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdnaXRodWJDb2RlQmxvY2tzJykoYnEsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIGJxID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdibG9ja0dhbXV0JykoYnEsIG9wdGlvbnMsIGdsb2JhbHMpOyAvLyByZWN1cnNlXG5cbiAgICBicSA9IGJxLnJlcGxhY2UoLyhefFxcbikvZywgJyQxICAnKTtcbiAgICAvLyBUaGVzZSBsZWFkaW5nIHNwYWNlcyBzY3JldyB3aXRoIDxwcmU+IGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gZml4IHRoYXQ6XG4gICAgYnEgPSBicS5yZXBsYWNlKC8oXFxzKjxwcmU+W15cXHJdKz88XFwvcHJlPikvZ20sIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSkge1xuICAgICAgdmFyIHByZSA9IG0xO1xuICAgICAgLy8gYXR0YWNrbGFiOiBoYWNrIGFyb3VuZCBLb25xdWVyb3IgMy41LjQgYnVnOlxuICAgICAgcHJlID0gcHJlLnJlcGxhY2UoL14gIC9tZywgJ8KoMCcpO1xuICAgICAgcHJlID0gcHJlLnJlcGxhY2UoL8KoMC9nLCAnJyk7XG4gICAgICByZXR1cm4gcHJlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNob3dkb3duLnN1YlBhcnNlcignaGFzaEJsb2NrJykoJzxibG9ja3F1b3RlPlxcbicgKyBicSArICdcXG48L2Jsb2NrcXVvdGU+Jywgb3B0aW9ucywgZ2xvYmFscyk7XG4gIH0pO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2Jsb2NrUXVvdGVzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBQcm9jZXNzIE1hcmtkb3duIGA8cHJlPjxjb2RlPmAgYmxvY2tzLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2NvZGVCbG9ja3MnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnY29kZUJsb2Nrcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBzZW50aW5lbCB3b3JrYXJvdW5kcyBmb3IgbGFjayBvZiBcXEEgYW5kIFxcWiwgc2FmYXJpXFxraHRtbCBidWdcbiAgdGV4dCArPSAnwqgwJztcblxuICB2YXIgcGF0dGVybiA9IC8oPzpcXG5cXG58XikoKD86KD86WyBdezR9fFxcdCkuKlxcbispKykoXFxuKlsgXXswLDN9W14gXFx0XFxuXXwoPz3CqDApKS9nO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHBhdHRlcm4sIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSwgbTIpIHtcbiAgICB2YXIgY29kZWJsb2NrID0gbTEsXG4gICAgICAgIG5leHRDaGFyID0gbTIsXG4gICAgICAgIGVuZCA9ICdcXG4nO1xuXG4gICAgY29kZWJsb2NrID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdvdXRkZW50JykoY29kZWJsb2NrLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICBjb2RlYmxvY2sgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUNvZGUnKShjb2RlYmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIGNvZGVibG9jayA9IHNob3dkb3duLnN1YlBhcnNlcignZGV0YWInKShjb2RlYmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIGNvZGVibG9jayA9IGNvZGVibG9jay5yZXBsYWNlKC9eXFxuKy9nLCAnJyk7IC8vIHRyaW0gbGVhZGluZyBuZXdsaW5lc1xuICAgIGNvZGVibG9jayA9IGNvZGVibG9jay5yZXBsYWNlKC9cXG4rJC9nLCAnJyk7IC8vIHRyaW0gdHJhaWxpbmcgbmV3bGluZXNcblxuICAgIGlmIChvcHRpb25zLm9taXRFeHRyYVdMSW5Db2RlQmxvY2tzKSB7XG4gICAgICBlbmQgPSAnJztcbiAgICB9XG5cbiAgICBjb2RlYmxvY2sgPSAnPHByZT48Y29kZT4nICsgY29kZWJsb2NrICsgZW5kICsgJzwvY29kZT48L3ByZT4nO1xuXG4gICAgcmV0dXJuIHNob3dkb3duLnN1YlBhcnNlcignaGFzaEJsb2NrJykoY29kZWJsb2NrLCBvcHRpb25zLCBnbG9iYWxzKSArIG5leHRDaGFyO1xuICB9KTtcblxuICAvLyBzdHJpcCBzZW50aW5lbFxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqDAvLCAnJyk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnY29kZUJsb2Nrcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICpcbiAqICAgKiAgQmFja3RpY2sgcXVvdGVzIGFyZSB1c2VkIGZvciA8Y29kZT48L2NvZGU+IHNwYW5zLlxuICpcbiAqICAgKiAgWW91IGNhbiB1c2UgbXVsdGlwbGUgYmFja3RpY2tzIGFzIHRoZSBkZWxpbWl0ZXJzIGlmIHlvdSB3YW50IHRvXG4gKiAgICAgaW5jbHVkZSBsaXRlcmFsIGJhY2t0aWNrcyBpbiB0aGUgY29kZSBzcGFuLiBTbywgdGhpcyBpbnB1dDpcbiAqXG4gKiAgICAgICAgIEp1c3QgdHlwZSBgYGZvbyBgYmFyYCBiYXpgYCBhdCB0aGUgcHJvbXB0LlxuICpcbiAqICAgICAgIFdpbGwgdHJhbnNsYXRlIHRvOlxuICpcbiAqICAgICAgICAgPHA+SnVzdCB0eXBlIDxjb2RlPmZvbyBgYmFyYCBiYXo8L2NvZGU+IGF0IHRoZSBwcm9tcHQuPC9wPlxuICpcbiAqICAgIFRoZXJlJ3Mgbm8gYXJiaXRyYXJ5IGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgYmFja3RpY2tzIHlvdVxuICogICAgY2FuIHVzZSBhcyBkZWxpbXRlcnMuIElmIHlvdSBuZWVkIHRocmVlIGNvbnNlY3V0aXZlIGJhY2t0aWNrc1xuICogICAgaW4geW91ciBjb2RlLCB1c2UgZm91ciBmb3IgZGVsaW1pdGVycywgZXRjLlxuICpcbiAqICAqICBZb3UgY2FuIHVzZSBzcGFjZXMgdG8gZ2V0IGxpdGVyYWwgYmFja3RpY2tzIGF0IHRoZSBlZGdlczpcbiAqXG4gKiAgICAgICAgIC4uLiB0eXBlIGBgIGBiYXJgIGBgIC4uLlxuICpcbiAqICAgICAgIFR1cm5zIHRvOlxuICpcbiAqICAgICAgICAgLi4uIHR5cGUgPGNvZGU+YGJhcmA8L2NvZGU+IC4uLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2NvZGVTcGFucycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdjb2RlU3BhbnMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgaWYgKHR5cGVvZiAodGV4dCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGV4dCA9ICcnO1xuICB9XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhefFteXFxcXF0pKGArKShbXlxccl0qP1teYF0pXFwyKD8hYCkvZ20sXG4gICAgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xLCBtMiwgbTMpIHtcbiAgICAgIHZhciBjID0gbTM7XG4gICAgICBjID0gYy5yZXBsYWNlKC9eKFsgXFx0XSopL2csICcnKTtcdC8vIGxlYWRpbmcgd2hpdGVzcGFjZVxuICAgICAgYyA9IGMucmVwbGFjZSgvWyBcXHRdKiQvZywgJycpO1x0Ly8gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgYyA9IHNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScpKGMsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgYyA9IG0xICsgJzxjb2RlPicgKyBjICsgJzwvY29kZT4nO1xuICAgICAgYyA9IHNob3dkb3duLnN1YlBhcnNlcignaGFzaEhUTUxTcGFucycpKGMsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICApO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2NvZGVTcGFucy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogQ3JlYXRlIGEgZnVsbCBIVE1MIGRvY3VtZW50IGZyb20gdGhlIHByb2Nlc3NlZCBtYXJrZG93blxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2NvbXBsZXRlSFRNTERvY3VtZW50JywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghb3B0aW9ucy5jb21wbGV0ZUhUTUxEb2N1bWVudCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnY29tcGxldGVIVE1MRG9jdW1lbnQuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdmFyIGRvY3R5cGUgPSAnaHRtbCcsXG4gICAgICBkb2N0eXBlUGFyc2VkID0gJzwhRE9DVFlQRSBIVE1MPlxcbicsXG4gICAgICB0aXRsZSA9ICcnLFxuICAgICAgY2hhcnNldCA9ICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cXG4nLFxuICAgICAgbGFuZyA9ICcnLFxuICAgICAgbWV0YWRhdGEgPSAnJztcblxuICBpZiAodHlwZW9mIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkLmRvY3R5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZG9jdHlwZVBhcnNlZCA9ICc8IURPQ1RZUEUgJyArICBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZC5kb2N0eXBlICsgJz5cXG4nO1xuICAgIGRvY3R5cGUgPSBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZC5kb2N0eXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZG9jdHlwZSA9PT0gJ2h0bWwnIHx8IGRvY3R5cGUgPT09ICdodG1sNScpIHtcbiAgICAgIGNoYXJzZXQgPSAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+JztcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBtZXRhIGluIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkKSB7XG4gICAgaWYgKGdsb2JhbHMubWV0YWRhdGEucGFyc2VkLmhhc093blByb3BlcnR5KG1ldGEpKSB7XG4gICAgICBzd2l0Y2ggKG1ldGEudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdkb2N0eXBlJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAgdGl0bGUgPSAnPHRpdGxlPicgKyAgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQudGl0bGUgKyAnPC90aXRsZT5cXG4nO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoYXJzZXQnOlxuICAgICAgICAgIGlmIChkb2N0eXBlID09PSAnaHRtbCcgfHwgZG9jdHlwZSA9PT0gJ2h0bWw1Jykge1xuICAgICAgICAgICAgY2hhcnNldCA9ICc8bWV0YSBjaGFyc2V0PVwiJyArIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkLmNoYXJzZXQgKyAnXCI+XFxuJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhcnNldCA9ICc8bWV0YSBuYW1lPVwiY2hhcnNldFwiIGNvbnRlbnQ9XCInICsgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQuY2hhcnNldCArICdcIj5cXG4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsYW5ndWFnZSc6XG4gICAgICAgIGNhc2UgJ2xhbmcnOlxuICAgICAgICAgIGxhbmcgPSAnIGxhbmc9XCInICsgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWRbbWV0YV0gKyAnXCInO1xuICAgICAgICAgIG1ldGFkYXRhICs9ICc8bWV0YSBuYW1lPVwiJyArIG1ldGEgKyAnXCIgY29udGVudD1cIicgKyBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZFttZXRhXSArICdcIj5cXG4nO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbWV0YWRhdGEgKz0gJzxtZXRhIG5hbWU9XCInICsgbWV0YSArICdcIiBjb250ZW50PVwiJyArIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkW21ldGFdICsgJ1wiPlxcbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGV4dCA9IGRvY3R5cGVQYXJzZWQgKyAnPGh0bWwnICsgbGFuZyArICc+XFxuPGhlYWQ+XFxuJyArIHRpdGxlICsgY2hhcnNldCArIG1ldGFkYXRhICsgJzwvaGVhZD5cXG48Ym9keT5cXG4nICsgdGV4dC50cmltKCkgKyAnXFxuPC9ib2R5PlxcbjwvaHRtbD4nO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2NvbXBsZXRlSFRNTERvY3VtZW50LmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBDb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlc1xuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2RldGFiJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdkZXRhYi5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBleHBhbmQgZmlyc3Qgbi0xIHRhYnNcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFx0KD89XFx0KS9nLCAnICAgICcpOyAvLyBnX3RhYl93aWR0aFxuXG4gIC8vIHJlcGxhY2UgdGhlIG50aCB3aXRoIHR3byBzZW50aW5lbHNcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFx0L2csICfCqEHCqEInKTtcblxuICAvLyB1c2UgdGhlIHNlbnRpbmVsIHRvIGFuY2hvciBvdXIgcmVnZXggc28gaXQgZG9lc24ndCBleHBsb2RlXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoQiguKz8pwqhBL2csIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSkge1xuICAgIHZhciBsZWFkaW5nVGV4dCA9IG0xLFxuICAgICAgICBudW1TcGFjZXMgPSA0IC0gbGVhZGluZ1RleHQubGVuZ3RoICUgNDsgIC8vIGdfdGFiX3dpZHRoXG5cbiAgICAvLyB0aGVyZSAqbXVzdCogYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM6XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1TcGFjZXM7IGkrKykge1xuICAgICAgbGVhZGluZ1RleHQgKz0gJyAnO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFkaW5nVGV4dDtcbiAgfSk7XG5cbiAgLy8gY2xlYW4gdXAgc2VudGluZWxzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoQS9nLCAnICAgICcpOyAgLy8gZ190YWJfd2lkdGhcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhCL2csICcnKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdkZXRhYi5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignZWxsaXBzaXMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFvcHRpb25zLmVsbGlwc2lzKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbGxpcHNpcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXC5cXC5cXC4vZywgJ+KApicpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2VsbGlwc2lzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFR1cm4gZW1vamkgY29kZXMgaW50byBlbW9qaXNcbiAqXG4gKiBMaXN0IG9mIHN1cHBvcnRlZCBlbW9qaXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaG93ZG93bmpzL3Nob3dkb3duL3dpa2kvRW1vamlzXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZW1vamknLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFvcHRpb25zLmVtb2ppKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbW9qaS5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIgZW1vamlSZ3ggPSAvOihbXFxTXSs/KTovZztcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGVtb2ppUmd4LCBmdW5jdGlvbiAod20sIGVtb2ppQ29kZSkge1xuICAgIGlmIChzaG93ZG93bi5oZWxwZXIuZW1vamlzLmhhc093blByb3BlcnR5KGVtb2ppQ29kZSkpIHtcbiAgICAgIHJldHVybiBzaG93ZG93bi5oZWxwZXIuZW1vamlzW2Vtb2ppQ29kZV07XG4gICAgfVxuICAgIHJldHVybiB3bTtcbiAgfSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW1vamkuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogU21hcnQgcHJvY2Vzc2luZyBmb3IgYW1wZXJzYW5kcyBhbmQgYW5nbGUgYnJhY2tldHMgdGhhdCBuZWVkIHRvIGJlIGVuY29kZWQuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQW1wc0FuZEFuZ2xlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW5jb2RlQW1wc0FuZEFuZ2xlcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBBbXBlcnNhbmQtZW5jb2RpbmcgYmFzZWQgZW50aXJlbHkgb24gTmF0IElyb25zJ3MgQW1wdXRhdG9yIE1UIHBsdWdpbjpcbiAgLy8gaHR0cDovL2J1bXBwby5uZXQvcHJvamVjdHMvYW1wdXRhdG9yL1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8mKD8hIz9beFhdPyg/OlswLTlhLWZBLUZdK3xcXHcrKTspL2csICcmYW1wOycpO1xuXG4gIC8vIEVuY29kZSBuYWtlZCA8J3NcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvPCg/IVthLXpcXC8/JCFdKS9naSwgJyZsdDsnKTtcblxuICAvLyBFbmNvZGUgPFxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG5cbiAgLy8gRW5jb2RlID5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2VuY29kZUFtcHNBbmRBbmdsZXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZywgd2l0aCBhZnRlciBwcm9jZXNzaW5nIHRoZSBmb2xsb3dpbmcgYmFja3NsYXNoIGVzY2FwZSBzZXF1ZW5jZXMuXG4gKlxuICogYXR0YWNrbGFiOiBUaGUgcG9saXRlIHdheSB0byBkbyB0aGlzIGlzIHdpdGggdGhlIG5ldyBlc2NhcGVDaGFyYWN0ZXJzKCkgZnVuY3Rpb246XG4gKlxuICogICAgdGV4dCA9IGVzY2FwZUNoYXJhY3RlcnModGV4dCxcIlxcXFxcIix0cnVlKTtcbiAqICAgIHRleHQgPSBlc2NhcGVDaGFyYWN0ZXJzKHRleHQsXCJgKl97fVtdKCk+IystLiFcIix0cnVlKTtcbiAqXG4gKiAuLi5idXQgd2UncmUgc2lkZXN0ZXBwaW5nIGl0cyB1c2Ugb2YgdGhlIChzbG93KSBSZWdFeHAgY29uc3RydWN0b3JcbiAqIGFzIGFuIG9wdGltaXphdGlvbiBmb3IgRmlyZWZveC4gIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYSBMT1QuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQmFja3NsYXNoRXNjYXBlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW5jb2RlQmFja3NsYXNoRXNjYXBlcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFxcKFxcXFwpL2csIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFxcKFtgKl97fVxcW1xcXSgpPiMrLiF+PXw6LV0pL2csIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2VuY29kZUJhY2tzbGFzaEVzY2FwZXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIEVuY29kZS9lc2NhcGUgY2VydGFpbiBjaGFyYWN0ZXJzIGluc2lkZSBNYXJrZG93biBjb2RlIHJ1bnMuXG4gKiBUaGUgcG9pbnQgaXMgdGhhdCBpbiBjb2RlLCB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBsaXRlcmFscyxcbiAqIGFuZCBsb3NlIHRoZWlyIHNwZWNpYWwgTWFya2Rvd24gbWVhbmluZ3MuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbmNvZGVDb2RlLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIEVuY29kZSBhbGwgYW1wZXJzYW5kczsgSFRNTCBlbnRpdGllcyBhcmUgbm90XG4gIC8vIGVudGl0aWVzIHdpdGhpbiBhIE1hcmtkb3duIGNvZGUgc3Bhbi5cbiAgdGV4dCA9IHRleHRcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAvLyBEbyB0aGUgYW5nbGUgYnJhY2tldCBzb25nIGFuZCBkYW5jZTpcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAvLyBOb3csIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG1hZ2ljIGluIE1hcmtkb3duOlxuICAgIC5yZXBsYWNlKC8oWypfe31cXFtcXF1cXFxcPX4tXSkvZywgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW5jb2RlQ29kZS5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogV2l0aGluIHRhZ3MgLS0gbWVhbmluZyBiZXR3ZWVuIDwgYW5kID4gLS0gZW5jb2RlIFtcXCBgICogXyB+ID1dIHNvIHRoZXlcbiAqIGRvbid0IGNvbmZsaWN0IHdpdGggdGhlaXIgdXNlIGluIE1hcmtkb3duIGZvciBjb2RlLCBpdGFsaWNzIGFuZCBzdHJvbmcuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBCdWlsZCBhIHJlZ2V4IHRvIGZpbmQgSFRNTCB0YWdzLlxuICB2YXIgdGFncyAgICAgPSAvPFxcLz9bYS16XFxkXzotXSsoPzpbXFxzXStbXFxzXFxTXSs/KT8+L2dpLFxuICAgICAgY29tbWVudHMgPSAvPCEoLS0oPzooPzpbXj4tXXwtW14+XSkoPzpbXi1dfC1bXi1dKSopLS0pPi9naTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHRhZ3MsIGZ1bmN0aW9uICh3aG9sZU1hdGNoKSB7XG4gICAgcmV0dXJuIHdob2xlTWF0Y2hcbiAgICAgIC5yZXBsYWNlKC8oLik8XFwvP2NvZGU+KD89LikvZywgJyQxYCcpXG4gICAgICAucmVwbGFjZSgvKFtcXFxcYCpffj18XSkvZywgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gIH0pO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoY29tbWVudHMsIGZ1bmN0aW9uICh3aG9sZU1hdGNoKSB7XG4gICAgcmV0dXJuIHdob2xlTWF0Y2hcbiAgICAgIC5yZXBsYWNlKC8oW1xcXFxgKl9+PXxdKS9nLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgfSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogSGFuZGxlIGdpdGh1YiBjb2RlYmxvY2tzIHByaW9yIHRvIHJ1bm5pbmcgSGFzaEhUTUwgc28gdGhhdFxuICogSFRNTCBjb250YWluZWQgd2l0aGluIHRoZSBjb2RlYmxvY2sgZ2V0cyBlc2NhcGVkIHByb3Blcmx5XG4gKiBFeGFtcGxlOlxuICogYGBgcnVieVxuICogICAgIGRlZiBoZWxsb193b3JsZCh4KVxuICogICAgICAgcHV0cyBcIkhlbGxvLCAje3h9XCJcbiAqICAgICBlbmRcbiAqIGBgYFxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2dpdGh1YkNvZGVCbG9ja3MnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gZWFybHkgZXhpdCBpZiBvcHRpb24gaXMgbm90IGVuYWJsZWRcbiAgaWYgKCFvcHRpb25zLmdoQ29kZUJsb2Nrcykge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZ2l0aHViQ29kZUJsb2Nrcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ICs9ICfCqDAnO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyg/Ol58XFxuKSg/OiB7MCwzfSkoYGBgK3x+fn4rKSg/OiAqKShbXlxcc2B+XSopXFxuKFtcXHNcXFNdKj8pXFxuKD86IHswLDN9KVxcMS9nLCBmdW5jdGlvbiAod2hvbGVNYXRjaCwgZGVsaW0sIGxhbmd1YWdlLCBjb2RlYmxvY2spIHtcbiAgICB2YXIgZW5kID0gKG9wdGlvbnMub21pdEV4dHJhV0xJbkNvZGVCbG9ja3MpID8gJycgOiAnXFxuJztcblxuICAgIC8vIEZpcnN0IHBhcnNlIHRoZSBnaXRodWIgY29kZSBibG9ja1xuICAgIGNvZGVibG9jayA9IHNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScpKGNvZGVibG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgY29kZWJsb2NrID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdkZXRhYicpKGNvZGVibG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgY29kZWJsb2NrID0gY29kZWJsb2NrLnJlcGxhY2UoL15cXG4rL2csICcnKTsgLy8gdHJpbSBsZWFkaW5nIG5ld2xpbmVzXG4gICAgY29kZWJsb2NrID0gY29kZWJsb2NrLnJlcGxhY2UoL1xcbiskL2csICcnKTsgLy8gdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlXG5cbiAgICBjb2RlYmxvY2sgPSAnPHByZT48Y29kZScgKyAobGFuZ3VhZ2UgPyAnIGNsYXNzPVwiJyArIGxhbmd1YWdlICsgJyBsYW5ndWFnZS0nICsgbGFuZ3VhZ2UgKyAnXCInIDogJycpICsgJz4nICsgY29kZWJsb2NrICsgZW5kICsgJzwvY29kZT48L3ByZT4nO1xuXG4gICAgY29kZWJsb2NrID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKShjb2RlYmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gICAgLy8gU2luY2UgR0hDb2RlYmxvY2tzIGNhbiBiZSBmYWxzZSBwb3NpdGl2ZXMsIHdlIG5lZWQgdG9cbiAgICAvLyBzdG9yZSB0aGUgcHJpbWl0aXZlIHRleHQgYW5kIHRoZSBwYXJzZWQgdGV4dCBpbiBhIGdsb2JhbCB2YXIsXG4gICAgLy8gYW5kIHRoZW4gcmV0dXJuIGEgdG9rZW5cbiAgICByZXR1cm4gJ1xcblxcbsKoRycgKyAoZ2xvYmFscy5naENvZGVCbG9ja3MucHVzaCh7dGV4dDogd2hvbGVNYXRjaCwgY29kZWJsb2NrOiBjb2RlYmxvY2t9KSAtIDEpICsgJ0dcXG5cXG4nO1xuICB9KTtcblxuICAvLyBhdHRhY2tsYWI6IHN0cmlwIHNlbnRpbmVsXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoMC8sICcnKTtcblxuICByZXR1cm4gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdnaXRodWJDb2RlQmxvY2tzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hCbG9jaycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaGFzaEJsb2NrLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXlxcbit8XFxuKyQpL2csICcnKTtcbiAgdGV4dCA9ICdcXG5cXG7CqEsnICsgKGdsb2JhbHMuZ0h0bWxCbG9ja3MucHVzaCh0ZXh0KSAtIDEpICsgJ0tcXG5cXG4nO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoQmxvY2suYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIEhhc2ggYW5kIGVzY2FwZSA8Y29kZT4gZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHBhcnNlZCBhcyBtYXJrZG93blxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hDb2RlVGFncycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaGFzaENvZGVUYWdzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciByZXBGdW5jID0gZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG1hdGNoLCBsZWZ0LCByaWdodCkge1xuICAgIHZhciBjb2RlYmxvY2sgPSBsZWZ0ICsgc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVDb2RlJykobWF0Y2gsIG9wdGlvbnMsIGdsb2JhbHMpICsgcmlnaHQ7XG4gICAgcmV0dXJuICfCqEMnICsgKGdsb2JhbHMuZ0h0bWxTcGFucy5wdXNoKGNvZGVibG9jaykgLSAxKSArICdDJztcbiAgfTtcblxuICAvLyBIYXNoIG5ha2VkIDxjb2RlPlxuICB0ZXh0ID0gc2hvd2Rvd24uaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAodGV4dCwgcmVwRnVuYywgJzxjb2RlXFxcXGJbXj5dKj4nLCAnPC9jb2RlPicsICdnaW0nKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoQ29kZVRhZ3MuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hFbGVtZW50JywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHJldHVybiBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbTEpIHtcbiAgICB2YXIgYmxvY2tUZXh0ID0gbTE7XG5cbiAgICAvLyBVbmRvIGRvdWJsZSBsaW5lc1xuICAgIGJsb2NrVGV4dCA9IGJsb2NrVGV4dC5yZXBsYWNlKC9cXG5cXG4vZywgJ1xcbicpO1xuICAgIGJsb2NrVGV4dCA9IGJsb2NrVGV4dC5yZXBsYWNlKC9eXFxuLywgJycpO1xuXG4gICAgLy8gc3RyaXAgdHJhaWxpbmcgYmxhbmsgbGluZXNcbiAgICBibG9ja1RleHQgPSBibG9ja1RleHQucmVwbGFjZSgvXFxuKyQvZywgJycpO1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgZWxlbWVudCB0ZXh0IHdpdGggYSBtYXJrZXIgKFwiwqhLeEtcIiB3aGVyZSB4IGlzIGl0cyBrZXkpXG4gICAgYmxvY2tUZXh0ID0gJ1xcblxcbsKoSycgKyAoZ2xvYmFscy5nSHRtbEJsb2Nrcy5wdXNoKGJsb2NrVGV4dCkgLSAxKSArICdLXFxuXFxuJztcblxuICAgIHJldHVybiBibG9ja1RleHQ7XG4gIH07XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hIVE1MQmxvY2tzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoSFRNTEJsb2Nrcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIgYmxvY2tUYWdzID0gW1xuICAgICAgICAncHJlJyxcbiAgICAgICAgJ2RpdicsXG4gICAgICAgICdoMScsXG4gICAgICAgICdoMicsXG4gICAgICAgICdoMycsXG4gICAgICAgICdoNCcsXG4gICAgICAgICdoNScsXG4gICAgICAgICdoNicsXG4gICAgICAgICdibG9ja3F1b3RlJyxcbiAgICAgICAgJ3RhYmxlJyxcbiAgICAgICAgJ2RsJyxcbiAgICAgICAgJ29sJyxcbiAgICAgICAgJ3VsJyxcbiAgICAgICAgJ3NjcmlwdCcsXG4gICAgICAgICdub3NjcmlwdCcsXG4gICAgICAgICdmb3JtJyxcbiAgICAgICAgJ2ZpZWxkc2V0JyxcbiAgICAgICAgJ2lmcmFtZScsXG4gICAgICAgICdtYXRoJyxcbiAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgJ3NlY3Rpb24nLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2Zvb3RlcicsXG4gICAgICAgICduYXYnLFxuICAgICAgICAnYXJ0aWNsZScsXG4gICAgICAgICdhc2lkZScsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICAgJ2F1ZGlvJyxcbiAgICAgICAgJ2NhbnZhcycsXG4gICAgICAgICdmaWd1cmUnLFxuICAgICAgICAnaGdyb3VwJyxcbiAgICAgICAgJ291dHB1dCcsXG4gICAgICAgICd2aWRlbycsXG4gICAgICAgICdwJ1xuICAgICAgXSxcbiAgICAgIHJlcEZ1bmMgPSBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbWF0Y2gsIGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHZhciB0eHQgPSB3aG9sZU1hdGNoO1xuICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGh0bWwgZWxlbWVudCBpcyBtYXJrZWQgYXMgbWFya2Rvd25cbiAgICAgICAgLy8gaWYgc28sIGl0J3MgY29udGVudHMgc2hvdWxkIGJlIHBhcnNlZCBhcyBtYXJrZG93blxuICAgICAgICBpZiAobGVmdC5zZWFyY2goL1xcYm1hcmtkb3duXFxiLykgIT09IC0xKSB7XG4gICAgICAgICAgdHh0ID0gbGVmdCArIGdsb2JhbHMuY29udmVydGVyLm1ha2VIdG1sKG1hdGNoKSArIHJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnXFxuXFxuwqhLJyArIChnbG9iYWxzLmdIdG1sQmxvY2tzLnB1c2godHh0KSAtIDEpICsgJ0tcXG5cXG4nO1xuICAgICAgfTtcblxuICBpZiAob3B0aW9ucy5iYWNrc2xhc2hFc2NhcGVzSFRNTFRhZ3MpIHtcbiAgICAvLyBlbmNvZGUgYmFja3NsYXNoIGVzY2FwZWQgSFRNTCB0YWdzXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxcXDwoXFwvP1tePl0rPyk+L2csIGZ1bmN0aW9uICh3bSwgaW5zaWRlKSB7XG4gICAgICByZXR1cm4gJyZsdDsnICsgaW5zaWRlICsgJyZndDsnO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gaGFzaCBIVE1MIEJsb2Nrc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrVGFncy5sZW5ndGg7ICsraSkge1xuXG4gICAgdmFyIG9wVGFnUG9zLFxuICAgICAgICByZ3gxICAgICA9IG5ldyBSZWdFeHAoJ14gezAsM30oPCcgKyBibG9ja1RhZ3NbaV0gKyAnXFxcXGJbXj5dKj4pJywgJ2ltJyksXG4gICAgICAgIHBhdExlZnQgID0gJzwnICsgYmxvY2tUYWdzW2ldICsgJ1xcXFxiW14+XSo+JyxcbiAgICAgICAgcGF0UmlnaHQgPSAnPC8nICsgYmxvY2tUYWdzW2ldICsgJz4nO1xuICAgIC8vIDEuIExvb2sgZm9yIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb3BlbmluZyBIVE1MIHRhZyBpbiB0aGUgdGV4dFxuICAgIHdoaWxlICgob3BUYWdQb3MgPSBzaG93ZG93bi5oZWxwZXIucmVnZXhJbmRleE9mKHRleHQsIHJneDEpKSAhPT0gLTEpIHtcblxuICAgICAgLy8gaWYgdGhlIEhUTUwgdGFnIGlzIFxcIGVzY2FwZWQsIHdlIG5lZWQgdG8gZXNjYXBlIGl0IGFuZCBicmVha1xuXG5cbiAgICAgIC8vMi4gU3BsaXQgdGhlIHRleHQgaW4gdGhhdCBwb3NpdGlvblxuICAgICAgdmFyIHN1YlRleHRzID0gc2hvd2Rvd24uaGVscGVyLnNwbGl0QXRJbmRleCh0ZXh0LCBvcFRhZ1BvcyksXG4gICAgICAgICAgLy8zLiBNYXRjaCByZWN1cnNpdmVseVxuICAgICAgICAgIG5ld1N1YlRleHQxID0gc2hvd2Rvd24uaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAoc3ViVGV4dHNbMV0sIHJlcEZ1bmMsIHBhdExlZnQsIHBhdFJpZ2h0LCAnaW0nKTtcblxuICAgICAgLy8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICBpZiAobmV3U3ViVGV4dDEgPT09IHN1YlRleHRzWzFdKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGV4dCA9IHN1YlRleHRzWzBdLmNvbmNhdChuZXdTdWJUZXh0MSk7XG4gICAgfVxuICB9XG4gIC8vIEhSIFNQRUNJQUwgQ0FTRVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oXFxuIHswLDN9KDwoaHIpXFxiKFtePD5dKSo/XFwvPz4pWyBcXHRdKig/PVxcbnsyLH0pKS9nLFxuICAgIHNob3dkb3duLnN1YlBhcnNlcignaGFzaEVsZW1lbnQnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSk7XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBzdGFuZGFsb25lIEhUTUwgY29tbWVudHNcbiAgdGV4dCA9IHNob3dkb3duLmhlbHBlci5yZXBsYWNlUmVjdXJzaXZlUmVnRXhwKHRleHQsIGZ1bmN0aW9uICh0eHQpIHtcbiAgICByZXR1cm4gJ1xcblxcbsKoSycgKyAoZ2xvYmFscy5nSHRtbEJsb2Nrcy5wdXNoKHR4dCkgLSAxKSArICdLXFxuXFxuJztcbiAgfSwgJ14gezAsM308IS0tJywgJy0tPicsICdnbScpO1xuXG4gIC8vIFBIUCBhbmQgQVNQLXN0eWxlIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMgKDw/Li4uPz4gYW5kIDwlLi4uJT4pXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyg/OlxcblxcbikoIHswLDN9KD86PChbPyVdKVteXFxyXSo/XFwyPilbIFxcdF0qKD89XFxuezIsfSkpL2csXG4gICAgc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoRWxlbWVudCcpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoSFRNTEJsb2Nrcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogSGFzaCBzcGFuIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXJzZWQgYXMgbWFya2Rvd25cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoSFRNTFNwYW5zJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoSFRNTFNwYW5zLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIGZ1bmN0aW9uIGhhc2hIVE1MU3BhbiAoaHRtbCkge1xuICAgIHJldHVybiAnwqhDJyArIChnbG9iYWxzLmdIdG1sU3BhbnMucHVzaChodG1sKSAtIDEpICsgJ0MnO1xuICB9XG5cbiAgLy8gSGFzaCBTZWxmIENsb3NpbmcgdGFnc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88W14+XSs/XFwvPi9naSwgZnVuY3Rpb24gKHdtKSB7XG4gICAgcmV0dXJuIGhhc2hIVE1MU3Bhbih3bSk7XG4gIH0pO1xuXG4gIC8vIEhhc2ggdGFncyB3aXRob3V0IHByb3BlcnRpZXNcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvPChbXj5dKz8pPltcXHNcXFNdKj88XFwvXFwxPi9nLCBmdW5jdGlvbiAod20pIHtcbiAgICByZXR1cm4gaGFzaEhUTUxTcGFuKHdtKTtcbiAgfSk7XG5cbiAgLy8gSGFzaCB0YWdzIHdpdGggcHJvcGVydGllc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88KFtePl0rPylcXHNbXj5dKz8+W1xcc1xcU10qPzxcXC9cXDE+L2csIGZ1bmN0aW9uICh3bSkge1xuICAgIHJldHVybiBoYXNoSFRNTFNwYW4od20pO1xuICB9KTtcblxuICAvLyBIYXNoIHNlbGYgY2xvc2luZyB0YWdzIHdpdGhvdXQgLz5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvPFtePl0rPz4vZ2ksIGZ1bmN0aW9uICh3bSkge1xuICAgIHJldHVybiBoYXNoSFRNTFNwYW4od20pO1xuICB9KTtcblxuICAvKnNob3dkb3duLmhlbHBlci5tYXRjaFJlY3Vyc2l2ZVJlZ0V4cCh0ZXh0LCAnPGNvZGVcXFxcYltePl0qPicsICc8L2NvZGU+JywgJ2dpJyk7Ki9cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoSFRNTFNwYW5zLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cbi8qKlxuICogVW5oYXNoIEhUTUwgc3BhbnNcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmhhc2hIVE1MU3BhbnMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3VuaGFzaEhUTUxTcGFucy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGdsb2JhbHMuZ0h0bWxTcGFucy5sZW5ndGg7ICsraSkge1xuICAgIHZhciByZXBUZXh0ID0gZ2xvYmFscy5nSHRtbFNwYW5zW2ldLFxuICAgICAgICAvLyBsaW1pdGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCAoYXNzdW1lIDEwIGFzIGxpbWl0IGZvciByZWN1cnNlKVxuICAgICAgICBsaW1pdCA9IDA7XG5cbiAgICB3aGlsZSAoL8KoQyhcXGQrKUMvLnRlc3QocmVwVGV4dCkpIHtcbiAgICAgIHZhciBudW0gPSBSZWdFeHAuJDE7XG4gICAgICByZXBUZXh0ID0gcmVwVGV4dC5yZXBsYWNlKCfCqEMnICsgbnVtICsgJ0MnLCBnbG9iYWxzLmdIdG1sU3BhbnNbbnVtXSk7XG4gICAgICBpZiAobGltaXQgPT09IDEwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ21heGltdW0gbmVzdGluZyBvZiAxMCBzcGFucyByZWFjaGVkISEhJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgKytsaW1pdDtcbiAgICB9XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgnwqhDJyArIGkgKyAnQycsIHJlcFRleHQpO1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgndW5oYXNoSFRNTFNwYW5zLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBIYXNoIGFuZCBlc2NhcGUgPHByZT48Y29kZT4gZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHBhcnNlZCBhcyBtYXJrZG93blxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hQcmVDb2RlVGFncycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaGFzaFByZUNvZGVUYWdzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciByZXBGdW5jID0gZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG1hdGNoLCBsZWZ0LCByaWdodCkge1xuICAgIC8vIGVuY29kZSBodG1sIGVudGl0aWVzXG4gICAgdmFyIGNvZGVibG9jayA9IGxlZnQgKyBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUNvZGUnKShtYXRjaCwgb3B0aW9ucywgZ2xvYmFscykgKyByaWdodDtcbiAgICByZXR1cm4gJ1xcblxcbsKoRycgKyAoZ2xvYmFscy5naENvZGVCbG9ja3MucHVzaCh7dGV4dDogd2hvbGVNYXRjaCwgY29kZWJsb2NrOiBjb2RlYmxvY2t9KSAtIDEpICsgJ0dcXG5cXG4nO1xuICB9O1xuXG4gIC8vIEhhc2ggPHByZT48Y29kZT5cbiAgdGV4dCA9IHNob3dkb3duLmhlbHBlci5yZXBsYWNlUmVjdXJzaXZlUmVnRXhwKHRleHQsIHJlcEZ1bmMsICdeIHswLDN9PHByZVxcXFxiW14+XSo+XFxcXHMqPGNvZGVcXFxcYltePl0qPicsICdeIHswLDN9PC9jb2RlPlxcXFxzKjwvcHJlPicsICdnaW0nKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoUHJlQ29kZVRhZ3MuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hlYWRlcnMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaGVhZGVycy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIgaGVhZGVyTGV2ZWxTdGFydCA9IChpc05hTihwYXJzZUludChvcHRpb25zLmhlYWRlckxldmVsU3RhcnQpKSkgPyAxIDogcGFyc2VJbnQob3B0aW9ucy5oZWFkZXJMZXZlbFN0YXJ0KSxcblxuICAgICAgLy8gU2V0IHRleHQtc3R5bGUgaGVhZGVyczpcbiAgICAgIC8vXHRIZWFkZXIgMVxuICAgICAgLy9cdD09PT09PT09XG4gICAgICAvL1xuICAgICAgLy9cdEhlYWRlciAyXG4gICAgICAvL1x0LS0tLS0tLS1cbiAgICAgIC8vXG4gICAgICBzZXRleHRSZWdleEgxID0gKG9wdGlvbnMuc21vb3RoTGl2ZVByZXZpZXcpID8gL14oLispWyBcXHRdKlxcbj17Mix9WyBcXHRdKlxcbisvZ20gOiAvXiguKylbIFxcdF0qXFxuPStbIFxcdF0qXFxuKy9nbSxcbiAgICAgIHNldGV4dFJlZ2V4SDIgPSAob3B0aW9ucy5zbW9vdGhMaXZlUHJldmlldykgPyAvXiguKylbIFxcdF0qXFxuLXsyLH1bIFxcdF0qXFxuKy9nbSA6IC9eKC4rKVsgXFx0XSpcXG4tK1sgXFx0XSpcXG4rL2dtO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2Uoc2V0ZXh0UmVnZXhIMSwgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xKSB7XG5cbiAgICB2YXIgc3BhbkdhbXV0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnKShtMSwgb3B0aW9ucywgZ2xvYmFscyksXG4gICAgICAgIGhJRCA9IChvcHRpb25zLm5vSGVhZGVySWQpID8gJycgOiAnIGlkPVwiJyArIGhlYWRlcklkKG0xKSArICdcIicsXG4gICAgICAgIGhMZXZlbCA9IGhlYWRlckxldmVsU3RhcnQsXG4gICAgICAgIGhhc2hCbG9jayA9ICc8aCcgKyBoTGV2ZWwgKyBoSUQgKyAnPicgKyBzcGFuR2FtdXQgKyAnPC9oJyArIGhMZXZlbCArICc+JztcbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKShoYXNoQmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB9KTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHNldGV4dFJlZ2V4SDIsIGZ1bmN0aW9uIChtYXRjaEZvdW5kLCBtMSkge1xuICAgIHZhciBzcGFuR2FtdXQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcpKG0xLCBvcHRpb25zLCBnbG9iYWxzKSxcbiAgICAgICAgaElEID0gKG9wdGlvbnMubm9IZWFkZXJJZCkgPyAnJyA6ICcgaWQ9XCInICsgaGVhZGVySWQobTEpICsgJ1wiJyxcbiAgICAgICAgaExldmVsID0gaGVhZGVyTGV2ZWxTdGFydCArIDEsXG4gICAgICAgIGhhc2hCbG9jayA9ICc8aCcgKyBoTGV2ZWwgKyBoSUQgKyAnPicgKyBzcGFuR2FtdXQgKyAnPC9oJyArIGhMZXZlbCArICc+JztcbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKShoYXNoQmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB9KTtcblxuICAvLyBhdHgtc3R5bGUgaGVhZGVyczpcbiAgLy8gICMgSGVhZGVyIDFcbiAgLy8gICMjIEhlYWRlciAyXG4gIC8vICAjIyBIZWFkZXIgMiB3aXRoIGNsb3NpbmcgaGFzaGVzICMjXG4gIC8vICAuLi5cbiAgLy8gICMjIyMjIyBIZWFkZXIgNlxuICAvL1xuICB2YXIgYXR4U3R5bGUgPSAob3B0aW9ucy5yZXF1aXJlU3BhY2VCZWZvcmVIZWFkaW5nVGV4dCkgPyAvXigjezEsNn0pWyBcXHRdKyguKz8pWyBcXHRdKiMqXFxuKy9nbSA6IC9eKCN7MSw2fSlbIFxcdF0qKC4rPylbIFxcdF0qIypcXG4rL2dtO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoYXR4U3R5bGUsIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSwgbTIpIHtcbiAgICB2YXIgaFRleHQgPSBtMjtcbiAgICBpZiAob3B0aW9ucy5jdXN0b21pemVkSGVhZGVySWQpIHtcbiAgICAgIGhUZXh0ID0gbTIucmVwbGFjZSgvXFxzP1xceyhbXntdKz8pfVxccyokLywgJycpO1xuICAgIH1cblxuICAgIHZhciBzcGFuID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnKShoVGV4dCwgb3B0aW9ucywgZ2xvYmFscyksXG4gICAgICAgIGhJRCA9IChvcHRpb25zLm5vSGVhZGVySWQpID8gJycgOiAnIGlkPVwiJyArIGhlYWRlcklkKG0yKSArICdcIicsXG4gICAgICAgIGhMZXZlbCA9IGhlYWRlckxldmVsU3RhcnQgLSAxICsgbTEubGVuZ3RoLFxuICAgICAgICBoZWFkZXIgPSAnPGgnICsgaExldmVsICsgaElEICsgJz4nICsgc3BhbiArICc8L2gnICsgaExldmVsICsgJz4nO1xuXG4gICAgcmV0dXJuIHNob3dkb3duLnN1YlBhcnNlcignaGFzaEJsb2NrJykoaGVhZGVyLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gaGVhZGVySWQgKG0pIHtcbiAgICB2YXIgdGl0bGUsXG4gICAgICAgIHByZWZpeDtcblxuICAgIC8vIEl0IGlzIHNlcGFyYXRlIGZyb20gb3RoZXIgb3B0aW9ucyB0byBhbGxvdyBjb21iaW5pbmcgcHJlZml4IGFuZCBjdXN0b21pemVkXG4gICAgaWYgKG9wdGlvbnMuY3VzdG9taXplZEhlYWRlcklkKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBtLm1hdGNoKC9cXHsoW157XSs/KX1cXHMqJC8pO1xuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzFdKSB7XG4gICAgICAgIG0gPSBtYXRjaFsxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aXRsZSA9IG07XG5cbiAgICAvLyBQcmVmaXggaWQgdG8gcHJldmVudCBjYXVzaW5nIGluYWR2ZXJ0ZW50IHByZS1leGlzdGluZyBzdHlsZSBtYXRjaGVzLlxuICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcob3B0aW9ucy5wcmVmaXhIZWFkZXJJZCkpIHtcbiAgICAgIHByZWZpeCA9IG9wdGlvbnMucHJlZml4SGVhZGVySWQ7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnByZWZpeEhlYWRlcklkID09PSB0cnVlKSB7XG4gICAgICBwcmVmaXggPSAnc2VjdGlvbi0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaXggPSAnJztcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMucmF3UHJlZml4SGVhZGVySWQpIHtcbiAgICAgIHRpdGxlID0gcHJlZml4ICsgdGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZ2hDb21wYXRpYmxlSGVhZGVySWQpIHtcbiAgICAgIHRpdGxlID0gdGl0bGVcbiAgICAgICAgLnJlcGxhY2UoLyAvZywgJy0nKVxuICAgICAgICAvLyByZXBsYWNlIHByZXZpb3VzbHkgZXNjYXBlZCBjaGFycyAoJiwgwqggYW5kICQpXG4gICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL8KoVC9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL8KoRC9nLCAnJylcbiAgICAgICAgLy8gcmVwbGFjZSByZXN0IG9mIHRoZSBjaGFycyAoJn4kIGFyZSByZXBlYXRlZCBhcyB0aGV5IG1pZ2h0IGhhdmUgYmVlbiBlc2NhcGVkKVxuICAgICAgICAvLyBib3Jyb3dlZCBmcm9tIGdpdGh1YidzIHJlZGNhcnBldCAoc29tZSB0aGV5IHNob3VsZCBwcm9kdWNlIHNpbWlsYXIgcmVzdWx0cylcbiAgICAgICAgLnJlcGxhY2UoL1smKyQsXFwvOjs9P0BcIiN7fXxewqh+XFxbXFxdYFxcXFwqKSglLiEnPD5dL2csICcnKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucmF3SGVhZGVySWQpIHtcbiAgICAgIHRpdGxlID0gdGl0bGVcbiAgICAgICAgLnJlcGxhY2UoLyAvZywgJy0nKVxuICAgICAgICAvLyByZXBsYWNlIHByZXZpb3VzbHkgZXNjYXBlZCBjaGFycyAoJiwgwqggYW5kICQpXG4gICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCAnJicpXG4gICAgICAgIC5yZXBsYWNlKC/CqFQvZywgJ8KoJylcbiAgICAgICAgLnJlcGxhY2UoL8KoRC9nLCAnJCcpXG4gICAgICAgIC8vIHJlcGxhY2UgXCIgYW5kICdcbiAgICAgICAgLnJlcGxhY2UoL1tcIiddL2csICctJylcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gdGl0bGVcbiAgICAgICAgLnJlcGxhY2UoL1teXFx3XS9nLCAnJylcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmF3UHJlZml4SGVhZGVySWQpIHtcbiAgICAgIHRpdGxlID0gcHJlZml4ICsgdGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKGdsb2JhbHMuaGFzaExpbmtDb3VudHNbdGl0bGVdKSB7XG4gICAgICB0aXRsZSA9IHRpdGxlICsgJy0nICsgKGdsb2JhbHMuaGFzaExpbmtDb3VudHNbdGl0bGVdKyspO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxzLmhhc2hMaW5rQ291bnRzW3RpdGxlXSA9IDE7XG4gICAgfVxuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hlYWRlcnMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFR1cm4gTWFya2Rvd24gbGluayBzaG9ydGN1dHMgaW50byBYSFRNTCA8YT4gdGFncy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdob3Jpem9udGFsUnVsZScsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaG9yaXpvbnRhbFJ1bGUuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdmFyIGtleSA9IHNob3dkb3duLnN1YlBhcnNlcignaGFzaEJsb2NrJykoJzxociAvPicsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eIHswLDJ9KCA/LSl7Myx9WyBcXHRdKiQvZ20sIGtleSk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14gezAsMn0oID9cXCopezMsfVsgXFx0XSokL2dtLCBrZXkpO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eIHswLDJ9KCA/Xyl7Myx9WyBcXHRdKiQvZ20sIGtleSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaG9yaXpvbnRhbFJ1bGUuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFR1cm4gTWFya2Rvd24gaW1hZ2Ugc2hvcnRjdXRzIGludG8gPGltZz4gdGFncy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdpbWFnZXMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaW1hZ2VzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciBpbmxpbmVSZWdFeHAgICAgICA9IC8hXFxbKFteXFxdXSo/KV1bIFxcdF0qKClcXChbIFxcdF0/PD8oW1xcU10rPyg/OlxcKFtcXFNdKj9cXClbXFxTXSo/KT8pPj8oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qKD86KFtcIiddKShbXlwiXSo/KVxcNik/WyBcXHRdP1xcKS9nLFxuICAgICAgY3JhenlSZWdFeHAgICAgICAgPSAvIVxcWyhbXlxcXV0qPyldWyBcXHRdKigpXFwoWyBcXHRdPzwoW14+XSopPig/OiA9KFsqXFxkXStbQS1aYS16JV17MCw0fSl4KFsqXFxkXStbQS1aYS16JV17MCw0fSkpP1sgXFx0XSooPzooPzooW1wiJ10pKFteXCJdKj8pXFw2KSk/WyBcXHRdP1xcKS9nLFxuICAgICAgYmFzZTY0UmVnRXhwICAgICAgPSAvIVxcWyhbXlxcXV0qPyldWyBcXHRdKigpXFwoWyBcXHRdPzw/KGRhdGE6Lis/XFwvLis/O2Jhc2U2NCxbQS1aYS16MC05Ky89XFxuXSs/KT4/KD86ID0oWypcXGRdK1tBLVphLXolXXswLDR9KXgoWypcXGRdK1tBLVphLXolXXswLDR9KSk/WyBcXHRdKig/OihbXCInXSkoW15cIl0qPylcXDYpP1sgXFx0XT9cXCkvZyxcbiAgICAgIHJlZmVyZW5jZVJlZ0V4cCAgID0gLyFcXFsoW15cXF1dKj8pXSA/KD86XFxuICopP1xcWyhbXFxzXFxTXSo/KV0oKSgpKCkoKSgpL2csXG4gICAgICByZWZTaG9ydGN1dFJlZ0V4cCA9IC8hXFxbKFteXFxbXFxdXSspXSgpKCkoKSgpKCkvZztcblxuICBmdW5jdGlvbiB3cml0ZUltYWdlVGFnQmFzZTY0ICh3aG9sZU1hdGNoLCBhbHRUZXh0LCBsaW5rSWQsIHVybCwgd2lkdGgsIGhlaWdodCwgbTUsIHRpdGxlKSB7XG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgcmV0dXJuIHdyaXRlSW1hZ2VUYWcgKHdob2xlTWF0Y2gsIGFsdFRleHQsIGxpbmtJZCwgdXJsLCB3aWR0aCwgaGVpZ2h0LCBtNSwgdGl0bGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JpdGVJbWFnZVRhZyAod2hvbGVNYXRjaCwgYWx0VGV4dCwgbGlua0lkLCB1cmwsIHdpZHRoLCBoZWlnaHQsIG01LCB0aXRsZSkge1xuXG4gICAgdmFyIGdVcmxzICAgPSBnbG9iYWxzLmdVcmxzLFxuICAgICAgICBnVGl0bGVzID0gZ2xvYmFscy5nVGl0bGVzLFxuICAgICAgICBnRGltcyAgID0gZ2xvYmFscy5nRGltZW5zaW9ucztcblxuICAgIGxpbmtJZCA9IGxpbmtJZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCF0aXRsZSkge1xuICAgICAgdGl0bGUgPSAnJztcbiAgICB9XG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBleHBsaWNpdCBlbXB0eSB1cmxcbiAgICBpZiAod2hvbGVNYXRjaC5zZWFyY2goL1xcKDw/XFxzKj4/ID8oWydcIl0uKlsnXCJdKT9cXCkkL20pID4gLTEpIHtcbiAgICAgIHVybCA9ICcnO1xuXG4gICAgfSBlbHNlIGlmICh1cmwgPT09ICcnIHx8IHVybCA9PT0gbnVsbCkge1xuICAgICAgaWYgKGxpbmtJZCA9PT0gJycgfHwgbGlua0lkID09PSBudWxsKSB7XG4gICAgICAgIC8vIGxvd2VyLWNhc2UgYW5kIHR1cm4gZW1iZWRkZWQgbmV3bGluZXMgaW50byBzcGFjZXNcbiAgICAgICAgbGlua0lkID0gYWx0VGV4dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyA/XFxuL2csICcgJyk7XG4gICAgICB9XG4gICAgICB1cmwgPSAnIycgKyBsaW5rSWQ7XG5cbiAgICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGdVcmxzW2xpbmtJZF0pKSB7XG4gICAgICAgIHVybCA9IGdVcmxzW2xpbmtJZF07XG4gICAgICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGdUaXRsZXNbbGlua0lkXSkpIHtcbiAgICAgICAgICB0aXRsZSA9IGdUaXRsZXNbbGlua0lkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChnRGltc1tsaW5rSWRdKSkge1xuICAgICAgICAgIHdpZHRoID0gZ0RpbXNbbGlua0lkXS53aWR0aDtcbiAgICAgICAgICBoZWlnaHQgPSBnRGltc1tsaW5rSWRdLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHdob2xlTWF0Y2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYWx0VGV4dCA9IGFsdFRleHRcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAvL2FsdFRleHQgPSBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVycyhhbHRUZXh0LCAnKl8nLCBmYWxzZSk7XG4gICAgICAucmVwbGFjZShzaG93ZG93bi5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gICAgLy91cmwgPSBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVycyh1cmwsICcqXycsIGZhbHNlKTtcbiAgICB1cmwgPSB1cmwucmVwbGFjZShzaG93ZG93bi5oZWxwZXIucmVnZXhlcy5hc3Rlcmlza0Rhc2hBbmRDb2xvbiwgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gICAgdmFyIHJlc3VsdCA9ICc8aW1nIHNyYz1cIicgKyB1cmwgKyAnXCIgYWx0PVwiJyArIGFsdFRleHQgKyAnXCInO1xuXG4gICAgaWYgKHRpdGxlICYmIHNob3dkb3duLmhlbHBlci5pc1N0cmluZyh0aXRsZSkpIHtcbiAgICAgIHRpdGxlID0gdGl0bGVcbiAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgLy90aXRsZSA9IHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzKHRpdGxlLCAnKl8nLCBmYWxzZSk7XG4gICAgICAgIC5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAgIHJlc3VsdCArPSAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJztcbiAgICB9XG5cbiAgICBpZiAod2lkdGggJiYgaGVpZ2h0KSB7XG4gICAgICB3aWR0aCAgPSAod2lkdGggPT09ICcqJykgPyAnYXV0bycgOiB3aWR0aDtcbiAgICAgIGhlaWdodCA9IChoZWlnaHQgPT09ICcqJykgPyAnYXV0bycgOiBoZWlnaHQ7XG5cbiAgICAgIHJlc3VsdCArPSAnIHdpZHRoPVwiJyArIHdpZHRoICsgJ1wiJztcbiAgICAgIHJlc3VsdCArPSAnIGhlaWdodD1cIicgKyBoZWlnaHQgKyAnXCInO1xuICAgIH1cblxuICAgIHJlc3VsdCArPSAnIC8+JztcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBGaXJzdCwgaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBsYWJlbGVkIGltYWdlczogIVthbHQgdGV4dF1baWRdXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UocmVmZXJlbmNlUmVnRXhwLCB3cml0ZUltYWdlVGFnKTtcblxuICAvLyBOZXh0LCBoYW5kbGUgaW5saW5lIGltYWdlczogICFbYWx0IHRleHRdKHVybCA9PHdpZHRoPng8aGVpZ2h0PiBcIm9wdGlvbmFsIHRpdGxlXCIpXG5cbiAgLy8gYmFzZTY0IGVuY29kZWQgaW1hZ2VzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoYmFzZTY0UmVnRXhwLCB3cml0ZUltYWdlVGFnQmFzZTY0KTtcblxuICAvLyBjYXNlcyB3aXRoIGNyYXp5IHVybHMgbGlrZSAuL2ltYWdlL2NhdDEpLnBuZ1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGNyYXp5UmVnRXhwLCB3cml0ZUltYWdlVGFnKTtcblxuICAvLyBub3JtYWwgY2FzZXNcbiAgdGV4dCA9IHRleHQucmVwbGFjZShpbmxpbmVSZWdFeHAsIHdyaXRlSW1hZ2VUYWcpO1xuXG4gIC8vIGhhbmRsZSByZWZlcmVuY2Utc3R5bGUgc2hvcnRjdXRzOiAhW2ltZyB0ZXh0XVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlZlNob3J0Y3V0UmVnRXhwLCB3cml0ZUltYWdlVGFnKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdpbWFnZXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2l0YWxpY3NBbmRCb2xkJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2l0YWxpY3NBbmRCb2xkLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIGl0J3MgZmFzdGVyIHRvIGhhdmUgMyBzZXBhcmF0ZSByZWdleGVzIGZvciBlYWNoIGNhc2UgdGhhbiBoYXZlIGp1c3Qgb25lXG4gIC8vIGJlY2F1c2Ugb2YgYmFja3RyYWNpbmcsIGluIHNvbWUgY2FzZXMsIGl0IGNvdWxkIGxlYWQgdG8gYW4gZXhwb25lbnRpYWwgZWZmZWN0XG4gIC8vIGNhbGxlZCBcImNhdGFzdHJvcGhpYyBiYWNrdHJhY2VcIi4gT21pbm91cyFcblxuICBmdW5jdGlvbiBwYXJzZUluc2lkZSAodHh0LCBsZWZ0LCByaWdodCkge1xuICAgIC8qXG4gICAgaWYgKG9wdGlvbnMuc2ltcGxpZmllZEF1dG9MaW5rKSB7XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NpbXBsaWZpZWRBdXRvTGlua3MnKSh0eHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIH1cbiAgICAqL1xuICAgIHJldHVybiBsZWZ0ICsgdHh0ICsgcmlnaHQ7XG4gIH1cblxuICAvLyBQYXJzZSB1bmRlcnNjb3Jlc1xuICBpZiAob3B0aW9ucy5saXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxiX19fKFxcU1tcXHNcXFNdKj8pX19fXFxiL2csIGZ1bmN0aW9uICh3bSwgdHh0KSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnNpZGUgKHR4dCwgJzxzdHJvbmc+PGVtPicsICc8L2VtPjwvc3Ryb25nPicpO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcYl9fKFxcU1tcXHNcXFNdKj8pX19cXGIvZywgZnVuY3Rpb24gKHdtLCB0eHQpIHtcbiAgICAgIHJldHVybiBwYXJzZUluc2lkZSAodHh0LCAnPHN0cm9uZz4nLCAnPC9zdHJvbmc+Jyk7XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxiXyhcXFNbXFxzXFxTXSo/KV9cXGIvZywgZnVuY3Rpb24gKHdtLCB0eHQpIHtcbiAgICAgIHJldHVybiBwYXJzZUluc2lkZSAodHh0LCAnPGVtPicsICc8L2VtPicpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL19fXyhcXFNbXFxzXFxTXSo/KV9fXy9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8c3Ryb25nPjxlbT4nLCAnPC9lbT48L3N0cm9uZz4nKSA6IHdtO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL19fKFxcU1tcXHNcXFNdKj8pX18vZywgZnVuY3Rpb24gKHdtLCBtKSB7XG4gICAgICByZXR1cm4gKC9cXFMkLy50ZXN0KG0pKSA/IHBhcnNlSW5zaWRlIChtLCAnPHN0cm9uZz4nLCAnPC9zdHJvbmc+JykgOiB3bTtcbiAgICB9KTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9fKFteXFxzX11bXFxzXFxTXSo/KV8vZywgZnVuY3Rpb24gKHdtLCBtKSB7XG4gICAgICAvLyAhL15fW15fXS8udGVzdChtKSAtIHRlc3QgaWYgaXQgZG9lc24ndCBzdGFydCB3aXRoIF9fIChzaW5jZSBpdCBzZWVtcyByZWR1bmRhbnQsIHdlIHJlbW92ZWQgaXQpXG4gICAgICByZXR1cm4gKC9cXFMkLy50ZXN0KG0pKSA/IHBhcnNlSW5zaWRlIChtLCAnPGVtPicsICc8L2VtPicpIDogd207XG4gICAgfSk7XG4gIH1cblxuICAvLyBOb3cgcGFyc2UgYXN0ZXJpc2tzXG4gIGlmIChvcHRpb25zLmxpdGVyYWxNaWRXb3JkQXN0ZXJpc2tzKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFteKl18XilcXEJcXCpcXCpcXCooXFxTW1xcc1xcU10qPylcXCpcXCpcXCpcXEIoPyFcXCopL2csIGZ1bmN0aW9uICh3bSwgbGVhZCwgdHh0KSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnNpZGUgKHR4dCwgbGVhZCArICc8c3Ryb25nPjxlbT4nLCAnPC9lbT48L3N0cm9uZz4nKTtcbiAgICB9KTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oW14qXXxeKVxcQlxcKlxcKihcXFNbXFxzXFxTXSo/KVxcKlxcKlxcQig/IVxcKikvZywgZnVuY3Rpb24gKHdtLCBsZWFkLCB0eHQpIHtcbiAgICAgIHJldHVybiBwYXJzZUluc2lkZSAodHh0LCBsZWFkICsgJzxzdHJvbmc+JywgJzwvc3Ryb25nPicpO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbXipdfF4pXFxCXFwqKFxcU1tcXHNcXFNdKj8pXFwqXFxCKD8hXFwqKS9nLCBmdW5jdGlvbiAod20sIGxlYWQsIHR4dCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW5zaWRlICh0eHQsIGxlYWQgKyAnPGVtPicsICc8L2VtPicpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcKlxcKlxcKihcXFNbXFxzXFxTXSo/KVxcKlxcKlxcKi9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8c3Ryb25nPjxlbT4nLCAnPC9lbT48L3N0cm9uZz4nKSA6IHdtO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcKlxcKihcXFNbXFxzXFxTXSo/KVxcKlxcKi9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8c3Ryb25nPicsICc8L3N0cm9uZz4nKSA6IHdtO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcKihbXlxccypdW1xcc1xcU10qPylcXCovZywgZnVuY3Rpb24gKHdtLCBtKSB7XG4gICAgICAvLyAhL15cXCpbXipdLy50ZXN0KG0pIC0gdGVzdCBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggKiogKHNpbmNlIGl0IHNlZW1zIHJlZHVuZGFudCwgd2UgcmVtb3ZlZCBpdClcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8ZW0+JywgJzwvZW0+JykgOiB3bTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaXRhbGljc0FuZEJvbGQuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIEZvcm0gSFRNTCBvcmRlcmVkIChudW1iZXJlZCkgYW5kIHVub3JkZXJlZCAoYnVsbGV0ZWQpIGxpc3RzLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2xpc3RzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIHNpbmdsZSBvcmRlcmVkIG9yIHVub3JkZXJlZCBsaXN0LCBzcGxpdHRpbmcgaXRcbiAgICogaW50byBpbmRpdmlkdWFsIGxpc3QgaXRlbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaXN0U3RyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJpbVRyYWlsaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTGlzdEl0ZW1zIChsaXN0U3RyLCB0cmltVHJhaWxpbmcpIHtcbiAgICAvLyBUaGUgJGdfbGlzdF9sZXZlbCBnbG9iYWwga2VlcHMgdHJhY2sgb2Ygd2hlbiB3ZSdyZSBpbnNpZGUgYSBsaXN0LlxuICAgIC8vIEVhY2ggdGltZSB3ZSBlbnRlciBhIGxpc3QsIHdlIGluY3JlbWVudCBpdDsgd2hlbiB3ZSBsZWF2ZSBhIGxpc3QsXG4gICAgLy8gd2UgZGVjcmVtZW50LiBJZiBpdCdzIHplcm8sIHdlJ3JlIG5vdCBpbiBhIGxpc3QgYW55bW9yZS5cbiAgICAvL1xuICAgIC8vIFdlIGRvIHRoaXMgYmVjYXVzZSB3aGVuIHdlJ3JlIG5vdCBpbnNpZGUgYSBsaXN0LCB3ZSB3YW50IHRvIHRyZWF0XG4gICAgLy8gc29tZXRoaW5nIGxpa2UgdGhpczpcbiAgICAvL1xuICAgIC8vICAgIEkgcmVjb21tZW5kIHVwZ3JhZGluZyB0byB2ZXJzaW9uXG4gICAgLy8gICAgOC4gT29wcywgbm93IHRoaXMgbGluZSBpcyB0cmVhdGVkXG4gICAgLy8gICAgYXMgYSBzdWItbGlzdC5cbiAgICAvL1xuICAgIC8vIEFzIGEgc2luZ2xlIHBhcmFncmFwaCwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBzZWNvbmQgbGluZSBzdGFydHNcbiAgICAvLyB3aXRoIGEgZGlnaXQtcGVyaW9kLXNwYWNlIHNlcXVlbmNlLlxuICAgIC8vXG4gICAgLy8gV2hlcmVhcyB3aGVuIHdlJ3JlIGluc2lkZSBhIGxpc3QgKG9yIHN1Yi1saXN0KSwgdGhhdCBsaW5lIHdpbGwgYmVcbiAgICAvLyB0cmVhdGVkIGFzIHRoZSBzdGFydCBvZiBhIHN1Yi1saXN0LiBXaGF0IGEga2x1ZGdlLCBodWg/IFRoaXMgaXNcbiAgICAvLyBhbiBhc3BlY3Qgb2YgTWFya2Rvd24ncyBzeW50YXggdGhhdCdzIGhhcmQgdG8gcGFyc2UgcGVyZmVjdGx5XG4gICAgLy8gd2l0aG91dCByZXNvcnRpbmcgdG8gbWluZC1yZWFkaW5nLiBQZXJoYXBzIHRoZSBzb2x1dGlvbiBpcyB0b1xuICAgIC8vIGNoYW5nZSB0aGUgc3ludGF4IHJ1bGVzIHN1Y2ggdGhhdCBzdWItbGlzdHMgbXVzdCBzdGFydCB3aXRoIGFcbiAgICAvLyBzdGFydGluZyBjYXJkaW5hbCBudW1iZXI7IGUuZy4gXCIxLlwiIG9yIFwiYS5cIi5cbiAgICBnbG9iYWxzLmdMaXN0TGV2ZWwrKztcblxuICAgIC8vIHRyaW0gdHJhaWxpbmcgYmxhbmsgbGluZXM6XG4gICAgbGlzdFN0ciA9IGxpc3RTdHIucmVwbGFjZSgvXFxuezIsfSQvLCAnXFxuJyk7XG5cbiAgICAvLyBhdHRhY2tsYWI6IGFkZCBzZW50aW5lbCB0byBlbXVsYXRlIFxcelxuICAgIGxpc3RTdHIgKz0gJ8KoMCc7XG5cbiAgICB2YXIgcmd4ID0gLyhcXG4pPyheIHswLDN9KShbKistXXxcXGQrWy5dKVsgXFx0XSsoKFxcWyh4fFh8ICk/XSk/WyBcXHRdKlteXFxyXSs/KFxcbnsxLDJ9KSkoPz1cXG4qKMKoMHwgezAsM30oWyorLV18XFxkK1suXSlbIFxcdF0rKSkvZ20sXG4gICAgICAgIGlzUGFyYWdyYXBoZWQgPSAoL1xcblsgXFx0XSpcXG4oPyHCqDApLy50ZXN0KGxpc3RTdHIpKTtcblxuICAgIC8vIFNpbmNlIHZlcnNpb24gMS41LCBuZXN0aW5nIHN1Ymxpc3RzIHJlcXVpcmVzIDQgc3BhY2VzIChvciAxIHRhYikgaW5kZW50YXRpb24sXG4gICAgLy8gd2hpY2ggaXMgYSBzeW50YXggYnJlYWtpbmcgY2hhbmdlXG4gICAgLy8gYWN0aXZhdGluZyB0aGlzIG9wdGlvbiByZXZlcnRzIHRvIG9sZCBiZWhhdmlvclxuICAgIGlmIChvcHRpb25zLmRpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0cykge1xuICAgICAgcmd4ID0gLyhcXG4pPyheIHswLDN9KShbKistXXxcXGQrWy5dKVsgXFx0XSsoKFxcWyh4fFh8ICk/XSk/WyBcXHRdKlteXFxyXSs/KFxcbnsxLDJ9KSkoPz1cXG4qKMKoMHxcXDIoWyorLV18XFxkK1suXSlbIFxcdF0rKSkvZ207XG4gICAgfVxuXG4gICAgbGlzdFN0ciA9IGxpc3RTdHIucmVwbGFjZShyZ3gsIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSwgbTIsIG0zLCBtNCwgdGFza2J0biwgY2hlY2tlZCkge1xuICAgICAgY2hlY2tlZCA9IChjaGVja2VkICYmIGNoZWNrZWQudHJpbSgpICE9PSAnJyk7XG5cbiAgICAgIHZhciBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdvdXRkZW50JykobTQsIG9wdGlvbnMsIGdsb2JhbHMpLFxuICAgICAgICAgIGJ1bGxldFN0eWxlID0gJyc7XG5cbiAgICAgIC8vIFN1cHBvcnQgZm9yIGdpdGh1YiB0YXNrbGlzdHNcbiAgICAgIGlmICh0YXNrYnRuICYmIG9wdGlvbnMudGFza2xpc3RzKSB7XG4gICAgICAgIGJ1bGxldFN0eWxlID0gJyBjbGFzcz1cInRhc2stbGlzdC1pdGVtXCIgc3R5bGU9XCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XCInO1xuICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9eWyBcXHRdKlxcWyh4fFh8ICk/XS9tLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIG90cCA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGlzYWJsZWQgc3R5bGU9XCJtYXJnaW46IDBweCAwLjM1ZW0gMC4yNWVtIC0xLjZlbTsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIic7XG4gICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgIG90cCArPSAnIGNoZWNrZWQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdHAgKz0gJz4nO1xuICAgICAgICAgIHJldHVybiBvdHA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJU1NVRSAjMzEyXG4gICAgICAvLyBUaGlzIGlucHV0OiAtIC0gLSBhXG4gICAgICAvLyBjYXVzZXMgdHJvdWJsZSB0byB0aGUgcGFyc2VyLCBzaW5jZSBpdCBpbnRlcnByZXRzIGl0IGFzOlxuICAgICAgLy8gPHVsPjxsaT48bGk+PGxpPmE8L2xpPjwvbGk+PC9saT48L3VsPlxuICAgICAgLy8gaW5zdGVhZCBvZjpcbiAgICAgIC8vIDx1bD48bGk+LSAtIGE8L2xpPjwvdWw+XG4gICAgICAvLyBTbywgdG8gcHJldmVudCBpdCwgd2Ugd2lsbCBwdXQgYSBtYXJrZXIgKMKoQSlpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAvLyBLaW5kIG9mIGhhY2tpc2gvbW9ua2V5IHBhdGNoaW5nLCBidXQgc2VlbXMgbW9yZSBlZmZlY3RpdmUgdGhhbiBvdmVyY29tcGxpY2F0aW5nIHRoZSBsaXN0IHBhcnNlclxuICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXihbLSorXXxcXGRcXC4pWyBcXHRdK1tcXFNcXG4gXSovZywgZnVuY3Rpb24gKHdtMikge1xuICAgICAgICByZXR1cm4gJ8KoQScgKyB3bTI7XG4gICAgICB9KTtcblxuICAgICAgLy8gbTEgLSBMZWFkaW5nIGxpbmUgb3JcbiAgICAgIC8vIEhhcyBhIGRvdWJsZSByZXR1cm4gKG11bHRpIHBhcmFncmFwaCkgb3JcbiAgICAgIC8vIEhhcyBzdWJsaXN0XG4gICAgICBpZiAobTEgfHwgKGl0ZW0uc2VhcmNoKC9cXG57Mix9LykgPiAtMSkpIHtcbiAgICAgICAgaXRlbSA9IHNob3dkb3duLnN1YlBhcnNlcignZ2l0aHViQ29kZUJsb2NrcycpKGl0ZW0sIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgICBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdibG9ja0dhbXV0JykoaXRlbSwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWN1cnNpb24gZm9yIHN1Yi1saXN0czpcbiAgICAgICAgaXRlbSA9IHNob3dkb3duLnN1YlBhcnNlcignbGlzdHMnKShpdGVtLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXFxuJC8sICcnKTsgLy8gY2hvbXAoaXRlbSlcbiAgICAgICAgaXRlbSA9IHNob3dkb3duLnN1YlBhcnNlcignaGFzaEhUTUxCbG9ja3MnKShpdGVtLCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAgICAgICAvLyBDb2xhcHNlIGRvdWJsZSBsaW5lYnJlYWtzXG4gICAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL1xcblxcbisvZywgJ1xcblxcbicpO1xuICAgICAgICBpZiAoaXNQYXJhZ3JhcGhlZCkge1xuICAgICAgICAgIGl0ZW0gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3BhcmFncmFwaHMnKShpdGVtLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnKShpdGVtLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgdGhlIG1hcmtlciAowqhBKVxuICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgnwqhBJywgJycpO1xuICAgICAgLy8gd2UgY2FuIGZpbmFsbHkgd3JhcCB0aGUgbGluZSBpbiBsaXN0IGl0ZW0gdGFnc1xuICAgICAgaXRlbSA9ICAnPGxpJyArIGJ1bGxldFN0eWxlICsgJz4nICsgaXRlbSArICc8L2xpPlxcbic7XG5cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG4gICAgLy8gYXR0YWNrbGFiOiBzdHJpcCBzZW50aW5lbFxuICAgIGxpc3RTdHIgPSBsaXN0U3RyLnJlcGxhY2UoL8KoMC9nLCAnJyk7XG5cbiAgICBnbG9iYWxzLmdMaXN0TGV2ZWwtLTtcblxuICAgIGlmICh0cmltVHJhaWxpbmcpIHtcbiAgICAgIGxpc3RTdHIgPSBsaXN0U3RyLnJlcGxhY2UoL1xccyskLywgJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3RyO1xuICB9XG5cbiAgZnVuY3Rpb24gc3R5bGVTdGFydE51bWJlciAobGlzdCwgbGlzdFR5cGUpIHtcbiAgICAvLyBjaGVjayBpZiBvbCBhbmQgc3RhcnRzIGJ5IGEgbnVtYmVyIGRpZmZlcmVudCB0aGFuIDFcbiAgICBpZiAobGlzdFR5cGUgPT09ICdvbCcpIHtcbiAgICAgIHZhciByZXMgPSBsaXN0Lm1hdGNoKC9eICooXFxkKylcXC4vKTtcbiAgICAgIGlmIChyZXMgJiYgcmVzWzFdICE9PSAnMScpIHtcbiAgICAgICAgcmV0dXJuICcgc3RhcnQ9XCInICsgcmVzWzFdICsgJ1wiJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFuZCBwYXJzZSBjb25zZWN1dGl2ZSBsaXN0cyAoYmV0dGVyIGZpeCBmb3IgaXNzdWUgIzE0MilcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RUeXBlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJpbVRyYWlsaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUNvbnNlY3V0aXZlTGlzdHMgKGxpc3QsIGxpc3RUeXBlLCB0cmltVHJhaWxpbmcpIHtcbiAgICAvLyBjaGVjayBpZiB3ZSBjYXVnaHQgMiBvciBtb3JlIGNvbnNlY3V0aXZlIGxpc3RzIGJ5IG1pc3Rha2VcbiAgICAvLyB3ZSB1c2UgdGhlIGNvdW50ZXJSZ3gsIG1lYW5pbmcgaWYgbGlzdFR5cGUgaXMgVUwgd2UgbG9vayBmb3IgT0wgYW5kIHZpY2UgdmVyc2FcbiAgICB2YXIgb2xSZ3ggPSAob3B0aW9ucy5kaXNhYmxlRm9yY2VkNFNwYWNlc0luZGVudGVkU3VibGlzdHMpID8gL14gP1xcZCtcXC5bIFxcdF0vZ20gOiAvXiB7MCwzfVxcZCtcXC5bIFxcdF0vZ20sXG4gICAgICAgIHVsUmd4ID0gKG9wdGlvbnMuZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzKSA/IC9eID9bKistXVsgXFx0XS9nbSA6IC9eIHswLDN9WyorLV1bIFxcdF0vZ20sXG4gICAgICAgIGNvdW50ZXJSeGcgPSAobGlzdFR5cGUgPT09ICd1bCcpID8gb2xSZ3ggOiB1bFJneCxcbiAgICAgICAgcmVzdWx0ID0gJyc7XG5cbiAgICBpZiAobGlzdC5zZWFyY2goY291bnRlclJ4ZykgIT09IC0xKSB7XG4gICAgICAoZnVuY3Rpb24gcGFyc2VDTCAodHh0KSB7XG4gICAgICAgIHZhciBwb3MgPSB0eHQuc2VhcmNoKGNvdW50ZXJSeGcpLFxuICAgICAgICAgICAgc3R5bGUgPSBzdHlsZVN0YXJ0TnVtYmVyKGxpc3QsIGxpc3RUeXBlKTtcbiAgICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAvLyBzbGljZVxuICAgICAgICAgIHJlc3VsdCArPSAnXFxuXFxuPCcgKyBsaXN0VHlwZSArIHN0eWxlICsgJz5cXG4nICsgcHJvY2Vzc0xpc3RJdGVtcyh0eHQuc2xpY2UoMCwgcG9zKSwgISF0cmltVHJhaWxpbmcpICsgJzwvJyArIGxpc3RUeXBlICsgJz5cXG4nO1xuXG4gICAgICAgICAgLy8gaW52ZXJ0IGNvdW50ZXJUeXBlIGFuZCBsaXN0VHlwZVxuICAgICAgICAgIGxpc3RUeXBlID0gKGxpc3RUeXBlID09PSAndWwnKSA/ICdvbCcgOiAndWwnO1xuICAgICAgICAgIGNvdW50ZXJSeGcgPSAobGlzdFR5cGUgPT09ICd1bCcpID8gb2xSZ3ggOiB1bFJneDtcblxuICAgICAgICAgIC8vcmVjdXJzZVxuICAgICAgICAgIHBhcnNlQ0wodHh0LnNsaWNlKHBvcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSAnXFxuXFxuPCcgKyBsaXN0VHlwZSArIHN0eWxlICsgJz5cXG4nICsgcHJvY2Vzc0xpc3RJdGVtcyh0eHQsICEhdHJpbVRyYWlsaW5nKSArICc8LycgKyBsaXN0VHlwZSArICc+XFxuJztcbiAgICAgICAgfVxuICAgICAgfSkobGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlU3RhcnROdW1iZXIobGlzdCwgbGlzdFR5cGUpO1xuICAgICAgcmVzdWx0ID0gJ1xcblxcbjwnICsgbGlzdFR5cGUgKyBzdHlsZSArICc+XFxuJyArIHByb2Nlc3NMaXN0SXRlbXMobGlzdCwgISF0cmltVHJhaWxpbmcpICsgJzwvJyArIGxpc3RUeXBlICsgJz5cXG4nO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogU3RhcnQgb2YgbGlzdCBwYXJzaW5nICoqL1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdsaXN0cy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgLy8gYWRkIHNlbnRpbmVsIHRvIGhhY2sgYXJvdW5kIGtodG1sL3NhZmFyaSBidWc6XG4gIC8vIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMjMxXG4gIHRleHQgKz0gJ8KoMCc7XG5cbiAgaWYgKGdsb2JhbHMuZ0xpc3RMZXZlbCkge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14oKCB7MCwzfShbKistXXxcXGQrWy5dKVsgXFx0XSspW15cXHJdKz8owqgwfFxcbnsyLH0oPz1cXFMpKD8hWyBcXHRdKig/OlsqKy1dfFxcZCtbLl0pWyBcXHRdKykpKS9nbSxcbiAgICAgIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBsaXN0LCBtMikge1xuICAgICAgICB2YXIgbGlzdFR5cGUgPSAobTIuc2VhcmNoKC9bKistXS9nKSA+IC0xKSA/ICd1bCcgOiAnb2wnO1xuICAgICAgICByZXR1cm4gcGFyc2VDb25zZWN1dGl2ZUxpc3RzKGxpc3QsIGxpc3RUeXBlLCB0cnVlKTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXG5cXG58Xlxcbj8pKCggezAsM30oWyorLV18XFxkK1suXSlbIFxcdF0rKVteXFxyXSs/KMKoMHxcXG57Mix9KD89XFxTKSg/IVsgXFx0XSooPzpbKistXXxcXGQrWy5dKVsgXFx0XSspKSkvZ20sXG4gICAgICBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbTEsIGxpc3QsIG0zKSB7XG4gICAgICAgIHZhciBsaXN0VHlwZSA9IChtMy5zZWFyY2goL1sqKy1dL2cpID4gLTEpID8gJ3VsJyA6ICdvbCc7XG4gICAgICAgIHJldHVybiBwYXJzZUNvbnNlY3V0aXZlTGlzdHMobGlzdCwgbGlzdFR5cGUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLy8gc3RyaXAgc2VudGluZWxcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqgwLywgJycpO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdsaXN0cy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogUGFyc2UgbWV0YWRhdGEgYXQgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnRcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdtZXRhZGF0YScsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIW9wdGlvbnMubWV0YWRhdGEpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ21ldGFkYXRhLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIGZ1bmN0aW9uIHBhcnNlTWV0YWRhdGFDb250ZW50cyAoY29udGVudCkge1xuICAgIC8vIHJhdyBpcyByYXcgc28gaXQncyBub3QgY2hhbmdlZCBpbiBhbnkgd2F5XG4gICAgZ2xvYmFscy5tZXRhZGF0YS5yYXcgPSBjb250ZW50O1xuXG4gICAgLy8gZXNjYXBlIGNoYXJzIGZvcmJpZGRlbiBpbiBodG1sIGF0dHJpYnV0ZXNcbiAgICAvLyBkb3VibGUgcXVvdGVzXG4gICAgY29udGVudCA9IGNvbnRlbnRcbiAgICAgIC8vIGFtcGVyc2FuZCBmaXJzdFxuICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgIC8vIGRvdWJsZSBxdW90ZXNcbiAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9cXG4gezR9L2csICcgJyk7XG4gICAgY29udGVudC5yZXBsYWNlKC9eKFtcXFMgXSspOiArKFtcXHNcXFNdKz8pJC9nbSwgZnVuY3Rpb24gKHdtLCBrZXksIHZhbHVlKSB7XG4gICAgICBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZFtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG4gIH1cblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxzKsKrwqvCqysoXFxTKj8pXFxuKFtcXHNcXFNdKz8pXFxuwrvCu8K7K1xcbi8sIGZ1bmN0aW9uICh3aG9sZW1hdGNoLCBmb3JtYXQsIGNvbnRlbnQpIHtcbiAgICBwYXJzZU1ldGFkYXRhQ29udGVudHMoY29udGVudCk7XG4gICAgcmV0dXJuICfCqE0nO1xuICB9KTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxzKi0tLSsoXFxTKj8pXFxuKFtcXHNcXFNdKz8pXFxuLS0tK1xcbi8sIGZ1bmN0aW9uICh3aG9sZW1hdGNoLCBmb3JtYXQsIGNvbnRlbnQpIHtcbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICBnbG9iYWxzLm1ldGFkYXRhLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG4gICAgcGFyc2VNZXRhZGF0YUNvbnRlbnRzKGNvbnRlbnQpO1xuICAgIHJldHVybiAnwqhNJztcbiAgfSk7XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhNL2csICcnKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdtZXRhZGF0YS5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogUmVtb3ZlIG9uZSBsZXZlbCBvZiBsaW5lLWxlYWRpbmcgdGFicyBvciBzcGFjZXNcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdvdXRkZW50JywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdvdXRkZW50LmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIGF0dGFja2xhYjogaGFjayBhcm91bmQgS29ucXVlcm9yIDMuNS40IGJ1ZzpcbiAgLy8gXCItLS0tLS0tLS0tYnVnXCIucmVwbGFjZSgvXi0vZyxcIlwiKSA9PSBcImJ1Z1wiXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14oXFx0fFsgXXsxLDR9KS9nbSwgJ8KoMCcpOyAvLyBhdHRhY2tsYWI6IGdfdGFiX3dpZHRoXG5cbiAgLy8gYXR0YWNrbGFiOiBjbGVhbiB1cCBoYWNrXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoMC9nLCAnJyk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnb3V0ZGVudC5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICpcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdwYXJhZ3JhcGhzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3BhcmFncmFwaHMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIC8vIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGxpbmVzOlxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxuKy9nLCAnJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbiskL2csICcnKTtcblxuICB2YXIgZ3JhZnMgPSB0ZXh0LnNwbGl0KC9cXG57Mix9L2cpLFxuICAgICAgZ3JhZnNPdXQgPSBbXSxcbiAgICAgIGVuZCA9IGdyYWZzLmxlbmd0aDsgLy8gV3JhcCA8cD4gdGFnc1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgc3RyID0gZ3JhZnNbaV07XG4gICAgLy8gaWYgdGhpcyBpcyBhbiBIVE1MIG1hcmtlciwgY29weSBpdFxuICAgIGlmIChzdHIuc2VhcmNoKC/CqChLfEcpKFxcZCspXFwxL2cpID49IDApIHtcbiAgICAgIGdyYWZzT3V0LnB1c2goc3RyKTtcblxuICAgIC8vIHRlc3QgZm9yIHByZXNlbmNlIG9mIGNoYXJhY3RlcnMgdG8gcHJldmVudCBlbXB0eSBsaW5lcyBiZWluZyBwYXJzZWRcbiAgICAvLyBhcyBwYXJhZ3JhcGhzIChyZXN1bHRpbmcgaW4gdW5kZXNpcmVkIGV4dHJhIGVtcHR5IHBhcmFncmFwaHMpXG4gICAgfSBlbHNlIGlmIChzdHIuc2VhcmNoKC9cXFMvKSA+PSAwKSB7XG4gICAgICBzdHIgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcpKHN0ciwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXihbIFxcdF0qKS9nLCAnPHA+Jyk7XG4gICAgICBzdHIgKz0gJzwvcD4nO1xuICAgICAgZ3JhZnNPdXQucHVzaChzdHIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBVbmhhc2hpZnkgSFRNTCBibG9ja3MgKi9cbiAgZW5kID0gZ3JhZnNPdXQubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgYmxvY2tUZXh0ID0gJycsXG4gICAgICAgIGdyYWZzT3V0SXQgPSBncmFmc091dFtpXSxcbiAgICAgICAgY29kZUZsYWcgPSBmYWxzZTtcbiAgICAvLyBpZiB0aGlzIGlzIGEgbWFya2VyIGZvciBhbiBodG1sIGJsb2NrLi4uXG4gICAgLy8gdXNlIFJlZ0V4cC50ZXN0IGluc3RlYWQgb2Ygc3RyaW5nLnNlYXJjaCBiZWNhdXNlIG9mIFFNTCBidWdcbiAgICB3aGlsZSAoL8KoKEt8RykoXFxkKylcXDEvLnRlc3QoZ3JhZnNPdXRJdCkpIHtcbiAgICAgIHZhciBkZWxpbSA9IFJlZ0V4cC4kMSxcbiAgICAgICAgICBudW0gICA9IFJlZ0V4cC4kMjtcblxuICAgICAgaWYgKGRlbGltID09PSAnSycpIHtcbiAgICAgICAgYmxvY2tUZXh0ID0gZ2xvYmFscy5nSHRtbEJsb2Nrc1tudW1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiBnaEJsb2NrIGlzIGEgZmFsc2UgcG9zaXRpdmVcbiAgICAgICAgaWYgKGNvZGVGbGFnKSB7XG4gICAgICAgICAgLy8gdXNlIGVuY29kZWQgdmVyc2lvbiBvZiBhbGwgdGV4dFxuICAgICAgICAgIGJsb2NrVGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScpKGdsb2JhbHMuZ2hDb2RlQmxvY2tzW251bV0udGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2tUZXh0ID0gZ2xvYmFscy5naENvZGVCbG9ja3NbbnVtXS5jb2RlYmxvY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJsb2NrVGV4dCA9IGJsb2NrVGV4dC5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTsgLy8gRXNjYXBlIGFueSBkb2xsYXIgc2lnbnNcblxuICAgICAgZ3JhZnNPdXRJdCA9IGdyYWZzT3V0SXQucmVwbGFjZSgvKFxcblxcbik/wqgoS3xHKVxcZCtcXDIoXFxuXFxuKT8vLCBibG9ja1RleHQpO1xuICAgICAgLy8gQ2hlY2sgaWYgZ3JhZnNPdXRJdCBpcyBhIHByZS0+Y29kZVxuICAgICAgaWYgKC9ePHByZVxcYltePl0qPlxccyo8Y29kZVxcYltePl0qPi8udGVzdChncmFmc091dEl0KSkge1xuICAgICAgICBjb2RlRmxhZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGdyYWZzT3V0W2ldID0gZ3JhZnNPdXRJdDtcbiAgfVxuICB0ZXh0ID0gZ3JhZnNPdXQuam9pbignXFxuJyk7XG4gIC8vIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGxpbmVzOlxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxuKy9nLCAnJyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbiskL2csICcnKTtcbiAgcmV0dXJuIGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgncGFyYWdyYXBocy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xufSk7XG5cclxuLyoqXG4gKiBSdW4gZXh0ZW5zaW9uXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcigncnVuRXh0ZW5zaW9uJywgZnVuY3Rpb24gKGV4dCwgdGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKGV4dC5maWx0ZXIpIHtcbiAgICB0ZXh0ID0gZXh0LmZpbHRlcih0ZXh0LCBnbG9iYWxzLmNvbnZlcnRlciwgb3B0aW9ucyk7XG5cbiAgfSBlbHNlIGlmIChleHQucmVnZXgpIHtcbiAgICAvLyBUT0RPIHJlbW92ZSB0aGlzIHdoZW4gb2xkIGV4dGVuc2lvbiBsb2FkaW5nIG1lY2hhbmlzbSBpcyBkZXByZWNhdGVkXG4gICAgdmFyIHJlID0gZXh0LnJlZ2V4O1xuICAgIGlmICghKHJlIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgcmUgPSBuZXcgUmVnRXhwKHJlLCAnZycpO1xuICAgIH1cbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlLCBleHQucmVwbGFjZSk7XG4gIH1cblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogVGhlc2UgYXJlIGFsbCB0aGUgdHJhbnNmb3JtYXRpb25zIHRoYXQgb2NjdXIgKndpdGhpbiogYmxvY2stbGV2ZWxcbiAqIHRhZ3MgbGlrZSBwYXJhZ3JhcGhzLCBoZWFkZXJzLCBhbmQgbGlzdCBpdGVtcy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc3BhbkdhbXV0LmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdjb2RlU3BhbnMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignZXNjYXBlU3BlY2lhbENoYXJzV2l0aGluVGFnQXR0cmlidXRlcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVCYWNrc2xhc2hFc2NhcGVzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gUHJvY2VzcyBhbmNob3IgYW5kIGltYWdlIHRhZ3MuIEltYWdlcyBtdXN0IGNvbWUgZmlyc3QsXG4gIC8vIGJlY2F1c2UgIVtmb29dW2ZdIGxvb2tzIGxpa2UgYW4gYW5jaG9yLlxuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdpbWFnZXMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignYW5jaG9ycycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIE1ha2UgbGlua3Mgb3V0IG9mIHRoaW5ncyBsaWtlIGA8aHR0cDovL2V4YW1wbGUuY29tLz5gXG4gIC8vIE11c3QgY29tZSBhZnRlciBhbmNob3JzLCBiZWNhdXNlIHlvdSBjYW4gdXNlIDwgYW5kID5cbiAgLy8gZGVsaW1pdGVycyBpbiBpbmxpbmUgbGlua3MgbGlrZSBbdGhpc10oPHVybD4pLlxuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdhdXRvTGlua3MnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignc2ltcGxpZmllZEF1dG9MaW5rcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbW9qaScpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmRlcmxpbmUnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignaXRhbGljc0FuZEJvbGQnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignc3RyaWtldGhyb3VnaCcpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbGxpcHNpcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIHdlIG5lZWQgdG8gaGFzaCBIVE1MIHRhZ3MgaW5zaWRlIHNwYW5zXG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hIVE1MU3BhbnMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBub3cgd2UgZW5jb2RlIGFtcHMgYW5kIGFuZ2xlc1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVBbXBzQW5kQW5nbGVzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gRG8gaGFyZCBicmVha3NcbiAgaWYgKG9wdGlvbnMuc2ltcGxlTGluZUJyZWFrcykge1xuICAgIC8vIEdGTSBzdHlsZSBoYXJkIGJyZWFrc1xuICAgIC8vIG9ubHkgYWRkIGxpbmUgYnJlYWtzIGlmIHRoZSB0ZXh0IGRvZXMgbm90IGNvbnRhaW4gYSBibG9jayAoc3BlY2lhbCBjYXNlIGZvciBsaXN0cylcbiAgICBpZiAoIS9cXG5cXG7CqEsvLnRlc3QodGV4dCkpIHtcbiAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcbisvZywgJzxiciAvPlxcbicpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBWYW5pbGxhIGhhcmQgYnJlYWtzXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvICArXFxuL2csICc8YnIgLz5cXG4nKTtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3NwYW5HYW11dC5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignc3RyaWtldGhyb3VnaCcsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBwYXJzZUluc2lkZSAodHh0KSB7XG4gICAgaWYgKG9wdGlvbnMuc2ltcGxpZmllZEF1dG9MaW5rKSB7XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NpbXBsaWZpZWRBdXRvTGlua3MnKSh0eHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIH1cbiAgICByZXR1cm4gJzxkZWw+JyArIHR4dCArICc8L2RlbD4nO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3RyaWtldGhyb3VnaCkge1xuICAgIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3N0cmlrZXRocm91Z2guYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKD86fil7Mn0oW1xcc1xcU10rPykoPzp+KXsyfS9nLCBmdW5jdGlvbiAod20sIHR4dCkgeyByZXR1cm4gcGFyc2VJbnNpZGUodHh0KTsgfSk7XG4gICAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc3RyaWtldGhyb3VnaC5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB9XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFN0cmlwcyBsaW5rIGRlZmluaXRpb25zIGZyb20gdGV4dCwgc3RvcmVzIHRoZSBVUkxzIGFuZCB0aXRsZXMgaW5cbiAqIGhhc2ggcmVmZXJlbmNlcy5cbiAqIExpbmsgZGVmcyBhcmUgaW4gdGhlIGZvcm06IF5baWRdOiB1cmwgXCJvcHRpb25hbCB0aXRsZVwiXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignc3RyaXBMaW5rRGVmaW5pdGlvbnMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHJlZ2V4ICAgICAgID0gL14gezAsM31cXFsoW15cXF1dKyldOlsgXFx0XSpcXG4/WyBcXHRdKjw/KFtePlxcc10rKT4/KD86ID0oWypcXGRdK1tBLVphLXolXXswLDR9KXgoWypcXGRdK1tBLVphLXolXXswLDR9KSk/WyBcXHRdKlxcbj9bIFxcdF0qKD86KFxcbiopW1wifCcoXSguKz8pW1wifCcpXVsgXFx0XSopPyg/Olxcbit8KD89wqgwKSkvZ20sXG4gICAgICBiYXNlNjRSZWdleCA9IC9eIHswLDN9XFxbKFteXFxdXSspXTpbIFxcdF0qXFxuP1sgXFx0XSo8PyhkYXRhOi4rP1xcLy4rPztiYXNlNjQsW0EtWmEtejAtOSsvPVxcbl0rPyk+Pyg/OiA9KFsqXFxkXStbQS1aYS16JV17MCw0fSl4KFsqXFxkXStbQS1aYS16JV17MCw0fSkpP1sgXFx0XSpcXG4/WyBcXHRdKig/OihcXG4qKVtcInwnKF0oLis/KVtcInwnKV1bIFxcdF0qKT8oPzpcXG5cXG58KD89wqgwKXwoPz1cXG5cXFspKS9nbTtcblxuICAvLyBhdHRhY2tsYWI6IHNlbnRpbmVsIHdvcmthcm91bmRzIGZvciBsYWNrIG9mIFxcQSBhbmQgXFxaLCBzYWZhcmlcXGtodG1sIGJ1Z1xuICB0ZXh0ICs9ICfCqDAnO1xuXG4gIHZhciByZXBsYWNlRnVuYyA9IGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBsaW5rSWQsIHVybCwgd2lkdGgsIGhlaWdodCwgYmxhbmtMaW5lcywgdGl0bGUpIHtcblxuICAgIC8vIGlmIHRoZXJlIGFyZW4ndCB0d28gaW5zdGFuY2VzIG9mIGxpbmtJZCBpdCBtdXN0IG5vdCBiZSBhIHJlZmVyZW5jZSBsaW5rIHNvIGJhY2sgb3V0XG4gICAgbGlua0lkID0gbGlua0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHRleHQudG9Mb3dlckNhc2UoKS5zcGxpdChsaW5rSWQpLmxlbmd0aCAtIDEgPCAyKSB7XG4gICAgICByZXR1cm4gd2hvbGVNYXRjaDtcbiAgICB9XG4gICAgaWYgKHVybC5tYXRjaCgvXmRhdGE6Lis/XFwvLis/O2Jhc2U2NCwvKSkge1xuICAgICAgLy8gcmVtb3ZlIG5ld2xpbmVzXG4gICAgICBnbG9iYWxzLmdVcmxzW2xpbmtJZF0gPSB1cmwucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFscy5nVXJsc1tsaW5rSWRdID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVBbXBzQW5kQW5nbGVzJykodXJsLCBvcHRpb25zLCBnbG9iYWxzKTsgIC8vIExpbmsgSURzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG4gICAgfVxuXG4gICAgaWYgKGJsYW5rTGluZXMpIHtcbiAgICAgIC8vIE9vcHMsIGZvdW5kIGJsYW5rIGxpbmVzLCBzbyBpdCdzIG5vdCBhIHRpdGxlLlxuICAgICAgLy8gUHV0IGJhY2sgdGhlIHBhcmVudGhldGljYWwgc3RhdGVtZW50IHdlIHN0b2xlLlxuICAgICAgcmV0dXJuIGJsYW5rTGluZXMgKyB0aXRsZTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgZ2xvYmFscy5nVGl0bGVzW2xpbmtJZF0gPSB0aXRsZS5yZXBsYWNlKC9cInwnL2csICcmcXVvdDsnKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnBhcnNlSW1nRGltZW5zaW9ucyAmJiB3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgICAgZ2xvYmFscy5nRGltZW5zaW9uc1tsaW5rSWRdID0ge1xuICAgICAgICAgIHdpZHRoOiAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUgdGV4dFxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAvLyBmaXJzdCB3ZSB0cnkgdG8gZmluZCBiYXNlNjQgbGluayByZWZlcmVuY2VzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoYmFzZTY0UmVnZXgsIHJlcGxhY2VGdW5jKTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlZ2V4LCByZXBsYWNlRnVuYyk7XG5cbiAgLy8gYXR0YWNrbGFiOiBzdHJpcCBzZW50aW5lbFxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqDAvLCAnJyk7XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3RhYmxlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIW9wdGlvbnMudGFibGVzKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB2YXIgdGFibGVSZ3ggICAgICAgPSAvXiB7MCwzfVxcfD8uK1xcfC4rXFxuIHswLDN9XFx8P1sgXFx0XSo6P1sgXFx0XSooPzpbLT1dKXsyLH1bIFxcdF0qOj9bIFxcdF0qXFx8WyBcXHRdKjo/WyBcXHRdKig/OlstPV0pezIsfVtcXHNcXFNdKz8oPzpcXG5cXG58wqgwKS9nbSxcbiAgICAgIC8vc2luZ2VDb2xUYmxSZ3ggPSAvXiB7MCwzfVxcfC4rXFx8XFxuIHswLDN9XFx8WyBcXHRdKjo/WyBcXHRdKig/OlstPV0pezIsfVsgXFx0XSo6P1sgXFx0XSpcXHxbIFxcdF0qXFxuKD86IHswLDN9XFx8LitcXHxcXG4pKyg/OlxcblxcbnzCqDApL2dtO1xuICAgICAgc2luZ2VDb2xUYmxSZ3ggPSAvXiB7MCwzfVxcfC4rXFx8WyBcXHRdKlxcbiB7MCwzfVxcfFsgXFx0XSo6P1sgXFx0XSooPzpbLT1dKXsyLH1bIFxcdF0qOj9bIFxcdF0qXFx8WyBcXHRdKlxcbiggezAsM31cXHwuK1xcfFsgXFx0XSpcXG4pKig/OlxcbnzCqDApL2dtO1xuXG4gIGZ1bmN0aW9uIHBhcnNlU3R5bGVzIChzTGluZSkge1xuICAgIGlmICgvXjpbIFxcdF0qLS0qJC8udGVzdChzTGluZSkpIHtcbiAgICAgIHJldHVybiAnIHN0eWxlPVwidGV4dC1hbGlnbjpsZWZ0O1wiJztcbiAgICB9IGVsc2UgaWYgKC9eLS0qWyBcXHRdKjpbIFxcdF0qJC8udGVzdChzTGluZSkpIHtcbiAgICAgIHJldHVybiAnIHN0eWxlPVwidGV4dC1hbGlnbjpyaWdodDtcIic7XG4gICAgfSBlbHNlIGlmICgvXjpbIFxcdF0qLS0qWyBcXHRdKjokLy50ZXN0KHNMaW5lKSkge1xuICAgICAgcmV0dXJuICcgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhlYWRlcnMgKGhlYWRlciwgc3R5bGUpIHtcbiAgICB2YXIgaWQgPSAnJztcbiAgICBoZWFkZXIgPSBoZWFkZXIudHJpbSgpO1xuICAgIC8vIHN1cHBvcnQgYm90aCB0YWJsZXNIZWFkZXJJZCBhbmQgdGFibGVIZWFkZXJJZCBkdWUgdG8gZXJyb3IgaW4gZG9jdW1lbnRhdGlvbiBzbyB3ZSBkb24ndCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGlmIChvcHRpb25zLnRhYmxlc0hlYWRlcklkIHx8IG9wdGlvbnMudGFibGVIZWFkZXJJZCkge1xuICAgICAgaWQgPSAnIGlkPVwiJyArIGhlYWRlci5yZXBsYWNlKC8gL2csICdfJykudG9Mb3dlckNhc2UoKSArICdcIic7XG4gICAgfVxuICAgIGhlYWRlciA9IHNob3dkb3duLnN1YlBhcnNlcignc3BhbkdhbXV0JykoaGVhZGVyLCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAgIHJldHVybiAnPHRoJyArIGlkICsgc3R5bGUgKyAnPicgKyBoZWFkZXIgKyAnPC90aD5cXG4nO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VDZWxscyAoY2VsbCwgc3R5bGUpIHtcbiAgICB2YXIgc3ViVGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignc3BhbkdhbXV0JykoY2VsbCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgcmV0dXJuICc8dGQnICsgc3R5bGUgKyAnPicgKyBzdWJUZXh0ICsgJzwvdGQ+XFxuJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkVGFibGUgKGhlYWRlcnMsIGNlbGxzKSB7XG4gICAgdmFyIHRiID0gJzx0YWJsZT5cXG48dGhlYWQ+XFxuPHRyPlxcbicsXG4gICAgICAgIHRibExnbiA9IGhlYWRlcnMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YmxMZ247ICsraSkge1xuICAgICAgdGIgKz0gaGVhZGVyc1tpXTtcbiAgICB9XG4gICAgdGIgKz0gJzwvdHI+XFxuPC90aGVhZD5cXG48dGJvZHk+XFxuJztcblxuICAgIGZvciAoaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7ICsraSkge1xuICAgICAgdGIgKz0gJzx0cj5cXG4nO1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHRibExnbjsgKytpaSkge1xuICAgICAgICB0YiArPSBjZWxsc1tpXVtpaV07XG4gICAgICB9XG4gICAgICB0YiArPSAnPC90cj5cXG4nO1xuICAgIH1cbiAgICB0YiArPSAnPC90Ym9keT5cXG48L3RhYmxlPlxcbic7XG4gICAgcmV0dXJuIHRiO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VUYWJsZSAocmF3VGFibGUpIHtcbiAgICB2YXIgaSwgdGFibGVMaW5lcyA9IHJhd1RhYmxlLnNwbGl0KCdcXG4nKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZUxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBzdHJpcCB3cm9uZyBmaXJzdCBhbmQgbGFzdCBjb2x1bW4gaWYgd3JhcHBlZCB0YWJsZXMgYXJlIHVzZWRcbiAgICAgIGlmICgvXiB7MCwzfVxcfC8udGVzdCh0YWJsZUxpbmVzW2ldKSkge1xuICAgICAgICB0YWJsZUxpbmVzW2ldID0gdGFibGVMaW5lc1tpXS5yZXBsYWNlKC9eIHswLDN9XFx8LywgJycpO1xuICAgICAgfVxuICAgICAgaWYgKC9cXHxbIFxcdF0qJC8udGVzdCh0YWJsZUxpbmVzW2ldKSkge1xuICAgICAgICB0YWJsZUxpbmVzW2ldID0gdGFibGVMaW5lc1tpXS5yZXBsYWNlKC9cXHxbIFxcdF0qJC8sICcnKTtcbiAgICAgIH1cbiAgICAgIC8vIHBhcnNlIGNvZGUgc3BhbnMgZmlyc3QsIGJ1dCB3ZSBvbmx5IHN1cHBvcnQgb25lIGxpbmUgY29kZSBzcGFuc1xuICAgICAgdGFibGVMaW5lc1tpXSA9IHNob3dkb3duLnN1YlBhcnNlcignY29kZVNwYW5zJykodGFibGVMaW5lc1tpXSwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgfVxuXG4gICAgdmFyIHJhd0hlYWRlcnMgPSB0YWJsZUxpbmVzWzBdLnNwbGl0KCd8JykubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnRyaW0oKTt9KSxcbiAgICAgICAgcmF3U3R5bGVzID0gdGFibGVMaW5lc1sxXS5zcGxpdCgnfCcpLm1hcChmdW5jdGlvbiAocykgeyByZXR1cm4gcy50cmltKCk7fSksXG4gICAgICAgIHJhd0NlbGxzID0gW10sXG4gICAgICAgIGhlYWRlcnMgPSBbXSxcbiAgICAgICAgc3R5bGVzID0gW10sXG4gICAgICAgIGNlbGxzID0gW107XG5cbiAgICB0YWJsZUxpbmVzLnNoaWZ0KCk7XG4gICAgdGFibGVMaW5lcy5zaGlmdCgpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhYmxlTGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0YWJsZUxpbmVzW2ldLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByYXdDZWxscy5wdXNoKFxuICAgICAgICB0YWJsZUxpbmVzW2ldXG4gICAgICAgICAgLnNwbGl0KCd8JylcbiAgICAgICAgICAubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy50cmltKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJhd0hlYWRlcnMubGVuZ3RoIDwgcmF3U3R5bGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHJhd1RhYmxlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCByYXdTdHlsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHBhcnNlU3R5bGVzKHJhd1N0eWxlc1tpXSkpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCByYXdIZWFkZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKHN0eWxlc1tpXSkpIHtcbiAgICAgICAgc3R5bGVzW2ldID0gJyc7XG4gICAgICB9XG4gICAgICBoZWFkZXJzLnB1c2gocGFyc2VIZWFkZXJzKHJhd0hlYWRlcnNbaV0sIHN0eWxlc1tpXSkpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCByYXdDZWxscy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJvdyA9IFtdO1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGhlYWRlcnMubGVuZ3RoOyArK2lpKSB7XG4gICAgICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQocmF3Q2VsbHNbaV1baWldKSkge1xuXG4gICAgICAgIH1cbiAgICAgICAgcm93LnB1c2gocGFyc2VDZWxscyhyYXdDZWxsc1tpXVtpaV0sIHN0eWxlc1tpaV0pKTtcbiAgICAgIH1cbiAgICAgIGNlbGxzLnB1c2gocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRUYWJsZShoZWFkZXJzLCBjZWxscyk7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd0YWJsZXMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gZmluZCBlc2NhcGVkIHBpcGUgY2hhcmFjdGVyc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFxcKFxcfCkvZywgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG5cbiAgLy8gcGFyc2UgbXVsdGkgY29sdW1uIHRhYmxlc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHRhYmxlUmd4LCBwYXJzZVRhYmxlKTtcblxuICAvLyBwYXJzZSBvbmUgY29sdW1uIHRhYmxlc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHNpbmdlQ29sVGJsUmd4LCBwYXJzZVRhYmxlKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd0YWJsZXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcigndW5kZXJsaW5lJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghb3B0aW9ucy51bmRlcmxpbmUpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3VuZGVybGluZS5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICBpZiAob3B0aW9ucy5saXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxiX19fKFxcU1tcXHNcXFNdKj8pX19fXFxiL2csIGZ1bmN0aW9uICh3bSwgdHh0KSB7XG4gICAgICByZXR1cm4gJzx1PicgKyB0eHQgKyAnPC91Pic7XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxiX18oXFxTW1xcc1xcU10qPylfX1xcYi9nLCBmdW5jdGlvbiAod20sIHR4dCkge1xuICAgICAgcmV0dXJuICc8dT4nICsgdHh0ICsgJzwvdT4nO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL19fXyhcXFNbXFxzXFxTXSo/KV9fXy9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gJzx1PicgKyBtICsgJzwvdT4nIDogd207XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvX18oXFxTW1xcc1xcU10qPylfXy9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gJzx1PicgKyBtICsgJzwvdT4nIDogd207XG4gICAgfSk7XG4gIH1cblxuICAvLyBlc2NhcGUgcmVtYWluaW5nIHVuZGVyc2NvcmVzIHRvIHByZXZlbnQgdGhlbSBiZWluZyBwYXJzZWQgYnkgaXRhbGljIGFuZCBib2xkXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhfKS9nLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd1bmRlcmxpbmUuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogU3dhcCBiYWNrIGluIGFsbCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHdlJ3ZlIGhpZGRlbi5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmVzY2FwZVNwZWNpYWxDaGFycycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgndW5lc2NhcGVTcGVjaWFsQ2hhcnMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhFKFxcZCspRS9nLCBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbTEpIHtcbiAgICB2YXIgY2hhckNvZGVUb1JlcGxhY2UgPSBwYXJzZUludChtMSk7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVUb1JlcGxhY2UpO1xuICB9KTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd1bmVzY2FwZVNwZWNpYWxDaGFycy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmJsb2NrcXVvdGUnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgaW5uZXJUeHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMpO1xuXG4gICAgICBpZiAoaW5uZXJUeHQgPT09ICcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHh0ICs9IGlubmVyVHh0O1xuICAgIH1cbiAgfVxuICAvLyBjbGVhbnVwXG4gIHR4dCA9IHR4dC50cmltKCk7XG4gIHR4dCA9ICc+ICcgKyB0eHQuc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbj4gJyk7XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5jb2RlQmxvY2snLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGxhbmcgPSBub2RlLmdldEF0dHJpYnV0ZSgnbGFuZ3VhZ2UnKSxcbiAgICAgIG51bSAgPSBub2RlLmdldEF0dHJpYnV0ZSgncHJlY29kZW51bScpO1xuICByZXR1cm4gJ2BgYCcgKyBsYW5nICsgJ1xcbicgKyBnbG9iYWxzLnByZUxpc3RbbnVtXSArICdcXG5gYGAnO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uY29kZVNwYW4nLCBmdW5jdGlvbiAobm9kZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuICdgJyArIG5vZGUuaW5uZXJIVE1MICsgJ2AnO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uZW1waGFzaXMnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICB0eHQgKz0gJyonO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzKTtcbiAgICB9XG4gICAgdHh0ICs9ICcqJztcbiAgfVxuICByZXR1cm4gdHh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMsIGhlYWRlckxldmVsKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgaGVhZGVyTWFyayA9IG5ldyBBcnJheShoZWFkZXJMZXZlbCArIDEpLmpvaW4oJyMnKSxcbiAgICAgIHR4dCA9ICcnO1xuXG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHR4dCA9IGhlYWRlck1hcmsgKyAnICc7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzLFxuICAgICAgICBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7ICsraSkge1xuICAgICAgdHh0ICs9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ocicsIGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHJldHVybiAnLS0tJztcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmltYWdlJywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJztcbiAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCdzcmMnKSkge1xuICAgIHR4dCArPSAnIVsnICsgbm9kZS5nZXRBdHRyaWJ1dGUoJ2FsdCcpICsgJ10oJztcbiAgICB0eHQgKz0gJzwnICsgbm9kZS5nZXRBdHRyaWJ1dGUoJ3NyYycpICsgJz4nO1xuICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZSgnd2lkdGgnKSAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnaGVpZ2h0JykpIHtcbiAgICAgIHR4dCArPSAnID0nICsgbm9kZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgKyAneCcgKyBub2RlLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCd0aXRsZScpKSB7XG4gICAgICB0eHQgKz0gJyBcIicgKyBub2RlLmdldEF0dHJpYnV0ZSgndGl0bGUnKSArICdcIic7XG4gICAgfVxuICAgIHR4dCArPSAnKSc7XG4gIH1cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmxpbmtzJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJztcbiAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpICYmIG5vZGUuaGFzQXR0cmlidXRlKCdocmVmJykpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHR4dCA9ICdbJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyArK2kpIHtcbiAgICAgIHR4dCArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMpO1xuICAgIH1cbiAgICB0eHQgKz0gJ10oJztcbiAgICB0eHQgKz0gJzwnICsgbm9kZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSArICc+JztcbiAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgIHR4dCArPSAnIFwiJyArIG5vZGUuZ2V0QXR0cmlidXRlKCd0aXRsZScpICsgJ1wiJztcbiAgICB9XG4gICAgdHh0ICs9ICcpJztcbiAgfVxuICByZXR1cm4gdHh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlzdCcsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzLCB0eXBlKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmICghbm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgdmFyIGxpc3RJdGVtcyAgICAgICA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgIGxpc3RJdGVtc0xlbmdodCA9IGxpc3RJdGVtcy5sZW5ndGgsXG4gICAgICBsaXN0TnVtID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3N0YXJ0JykgfHwgMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RJdGVtc0xlbmdodDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0SXRlbXNbaV0udGFnTmFtZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbGlzdEl0ZW1zW2ldLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2xpJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gZGVmaW5lIHRoZSBidWxsZXQgdG8gdXNlIGluIGxpc3RcbiAgICB2YXIgYnVsbGV0ID0gJyc7XG4gICAgaWYgKHR5cGUgPT09ICdvbCcpIHtcbiAgICAgIGJ1bGxldCA9IGxpc3ROdW0udG9TdHJpbmcoKSArICcuICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1bGxldCA9ICctICc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2UgbGlzdCBpdGVtXG4gICAgdHh0ICs9IGJ1bGxldCArIHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmxpc3RJdGVtJykobGlzdEl0ZW1zW2ldLCBnbG9iYWxzKTtcbiAgICArK2xpc3ROdW07XG4gIH1cblxuICAvLyBhZGQgY29tbWVudCBhdCB0aGUgZW5kIHRvIHByZXZlbnQgY29uc2VjdXRpdmUgbGlzdHMgdG8gYmUgcGFyc2VkIGFzIG9uZVxuICB0eHQgKz0gJ1xcbjwhLS0gLS0+XFxuJztcbiAgcmV0dXJuIHR4dC50cmltKCk7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5saXN0SXRlbScsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbGlzdEl0ZW1UeHQgPSAnJztcblxuICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICBjaGlsZHJlbkxlbmdodCA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ2h0OyArK2kpIHtcbiAgICBsaXN0SXRlbVR4dCArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMpO1xuICB9XG4gIC8vIGlmIGl0J3Mgb25seSBvbmUgbGluZXIsIHdlIG5lZWQgdG8gYWRkIGEgbmV3bGluZSBhdCB0aGUgZW5kXG4gIGlmICghL1xcbiQvLnRlc3QobGlzdEl0ZW1UeHQpKSB7XG4gICAgbGlzdEl0ZW1UeHQgKz0gJ1xcbic7XG4gIH0gZWxzZSB7XG4gICAgLy8gaXQncyBtdWx0aXBhcmFncmFwaCwgc28gd2UgbmVlZCB0byBpbmRlbnRcbiAgICBsaXN0SXRlbVR4dCA9IGxpc3RJdGVtVHh0XG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuam9pbignXFxuICAgICcpXG4gICAgICAucmVwbGFjZSgvXiB7NH0kL2dtLCAnJylcbiAgICAgIC5yZXBsYWNlKC9cXG5cXG4rL2csICdcXG5cXG4nKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0SXRlbVR4dDtcbn0pO1xuXHJcblxuXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMsIHNwYW5zT25seSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgc3BhbnNPbmx5ID0gc3BhbnNPbmx5IHx8IGZhbHNlO1xuXG4gIHZhciB0eHQgPSAnJztcblxuICAvLyBlZGdlIGNhc2Ugb2YgdGV4dCB3aXRob3V0IHdyYXBwZXIgcGFyYWdyYXBoXG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnR4dCcpKG5vZGUsIGdsb2JhbHMpO1xuICB9XG5cbiAgLy8gSFRNTCBjb21tZW50XG4gIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgcmV0dXJuICc8IS0tJyArIG5vZGUuZGF0YSArICctLT5cXG5cXG4nO1xuICB9XG5cbiAgLy8gcHJvY2VzcyBvbmx5IG5vZGUgZWxlbWVudHNcbiAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgdGFnTmFtZSA9IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHN3aXRjaCAodGFnTmFtZSkge1xuXG4gICAgLy9cbiAgICAvLyBCTE9DS1NcbiAgICAvL1xuICAgIGNhc2UgJ2gxJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDEpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2gyJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDIpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2gzJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDMpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2g0JzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDQpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2g1JzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDUpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2g2JzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhlYWRlcicpKG5vZGUsIGdsb2JhbHMsIDYpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncCc6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5wYXJhZ3JhcGgnKShub2RlLCBnbG9iYWxzKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uYmxvY2txdW90ZScpKG5vZGUsIGdsb2JhbHMpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaHInOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaHInKShub2RlLCBnbG9iYWxzKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29sJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmxpc3QnKShub2RlLCBnbG9iYWxzLCAnb2wnKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3VsJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmxpc3QnKShub2RlLCBnbG9iYWxzLCAndWwnKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ByZWNvZGUnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uY29kZUJsb2NrJykobm9kZSwgZ2xvYmFscykgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwcmUnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ucHJlJykobm9kZSwgZ2xvYmFscykgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0YWJsZSc6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi50YWJsZScpKG5vZGUsIGdsb2JhbHMpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgLy9cbiAgICAvLyBTUEFOU1xuICAgIC8vXG4gICAgY2FzZSAnY29kZSc6XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5jb2RlU3BhbicpKG5vZGUsIGdsb2JhbHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdlbSc6XG4gICAgY2FzZSAnaSc6XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5lbXBoYXNpcycpKG5vZGUsIGdsb2JhbHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzdHJvbmcnOlxuICAgIGNhc2UgJ2InOlxuICAgICAgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uc3Ryb25nJykobm9kZSwgZ2xvYmFscyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RlbCc6XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5zdHJpa2V0aHJvdWdoJykobm9kZSwgZ2xvYmFscyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2EnOlxuICAgICAgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlua3MnKShub2RlLCBnbG9iYWxzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmltYWdlJykobm9kZSwgZ2xvYmFscyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0eHQgPSBub2RlLm91dGVySFRNTCArICdcXG5cXG4nO1xuICB9XG5cbiAgLy8gY29tbW9uIG5vcm1hbGl6YXRpb25cbiAgLy8gVE9ETyBldmVudHVhbGx5XG5cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnBhcmFncmFwaCcsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzKTtcbiAgICB9XG4gIH1cblxuICAvLyBzb21lIHRleHQgbm9ybWFsaXphdGlvblxuICB0eHQgPSB0eHQudHJpbSgpO1xuXG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5wcmUnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG51bSAgPSBub2RlLmdldEF0dHJpYnV0ZSgncHJlbnVtJyk7XG4gIHJldHVybiAnPHByZT4nICsgZ2xvYmFscy5wcmVMaXN0W251bV0gKyAnPC9wcmU+Jztcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnN0cmlrZXRocm91Z2gnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICB0eHQgKz0gJ35+JztcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7ICsraSkge1xuICAgICAgdHh0ICs9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG4gICAgfVxuICAgIHR4dCArPSAnfn4nO1xuICB9XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5zdHJvbmcnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICB0eHQgKz0gJyoqJztcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7ICsraSkge1xuICAgICAgdHh0ICs9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG4gICAgfVxuICAgIHR4dCArPSAnKionO1xuICB9XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi50YWJsZScsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJycsXG4gICAgICB0YWJsZUFycmF5ID0gW1tdLCBbXV0sXG4gICAgICBoZWFkaW5ncyAgID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZD50cj50aCcpLFxuICAgICAgcm93cyAgICAgICA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgndGJvZHk+dHInKSxcbiAgICAgIGksIGlpO1xuICBmb3IgKGkgPSAwOyBpIDwgaGVhZGluZ3MubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaGVhZENvbnRlbnQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi50YWJsZUNlbGwnKShoZWFkaW5nc1tpXSwgZ2xvYmFscyksXG4gICAgICAgIGFsbGlnbiA9ICctLS0nO1xuXG4gICAgaWYgKGhlYWRpbmdzW2ldLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgdmFyIHN0eWxlID0gaGVhZGluZ3NbaV0uZ2V0QXR0cmlidXRlKCdzdHlsZScpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgICAgY2FzZSAndGV4dC1hbGlnbjpsZWZ0Oyc6XG4gICAgICAgICAgYWxsaWduID0gJzotLS0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0LWFsaWduOnJpZ2h0Oyc6XG4gICAgICAgICAgYWxsaWduID0gJy0tLTonO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0LWFsaWduOmNlbnRlcjsnOlxuICAgICAgICAgIGFsbGlnbiA9ICc6LS0tOic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRhYmxlQXJyYXlbMF1baV0gPSBoZWFkQ29udGVudC50cmltKCk7XG4gICAgdGFibGVBcnJheVsxXVtpXSA9IGFsbGlnbjtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHIgPSB0YWJsZUFycmF5LnB1c2goW10pIC0gMSxcbiAgICAgICAgY29scyA9IHJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RkJyk7XG5cbiAgICBmb3IgKGlpID0gMDsgaWkgPCBoZWFkaW5ncy5sZW5ndGg7ICsraWkpIHtcbiAgICAgIHZhciBjZWxsQ29udGVudCA9ICcgJztcbiAgICAgIGlmICh0eXBlb2YgY29sc1tpaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNlbGxDb250ZW50ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24udGFibGVDZWxsJykoY29sc1tpaV0sIGdsb2JhbHMpO1xuICAgICAgfVxuICAgICAgdGFibGVBcnJheVtyXS5wdXNoKGNlbGxDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2VsbFNwYWNlc0NvdW50ID0gMztcbiAgZm9yIChpID0gMDsgaSA8IHRhYmxlQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICBmb3IgKGlpID0gMDsgaWkgPCB0YWJsZUFycmF5W2ldLmxlbmd0aDsgKytpaSkge1xuICAgICAgdmFyIHN0ckxlbiA9IHRhYmxlQXJyYXlbaV1baWldLmxlbmd0aDtcbiAgICAgIGlmIChzdHJMZW4gPiBjZWxsU3BhY2VzQ291bnQpIHtcbiAgICAgICAgY2VsbFNwYWNlc0NvdW50ID0gc3RyTGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCB0YWJsZUFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgZm9yIChpaSA9IDA7IGlpIDwgdGFibGVBcnJheVtpXS5sZW5ndGg7ICsraWkpIHtcbiAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgIGlmICh0YWJsZUFycmF5W2ldW2lpXS5zbGljZSgtMSkgPT09ICc6Jykge1xuICAgICAgICAgIHRhYmxlQXJyYXlbaV1baWldID0gc2hvd2Rvd24uaGVscGVyLnBhZEVuZCh0YWJsZUFycmF5W2ldW2lpXS5zbGljZSgtMSksIGNlbGxTcGFjZXNDb3VudCAtIDEsICctJykgKyAnOic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFibGVBcnJheVtpXVtpaV0gPSBzaG93ZG93bi5oZWxwZXIucGFkRW5kKHRhYmxlQXJyYXlbaV1baWldLCBjZWxsU3BhY2VzQ291bnQsICctJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYmxlQXJyYXlbaV1baWldID0gc2hvd2Rvd24uaGVscGVyLnBhZEVuZCh0YWJsZUFycmF5W2ldW2lpXSwgY2VsbFNwYWNlc0NvdW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdHh0ICs9ICd8ICcgKyB0YWJsZUFycmF5W2ldLmpvaW4oJyB8ICcpICsgJyB8XFxuJztcbiAgfVxuXG4gIHJldHVybiB0eHQudHJpbSgpO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24udGFibGVDZWxsJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJztcbiAgaWYgKCFub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyArK2kpIHtcbiAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gdHh0LnRyaW0oKTtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnR4dCcsIGZ1bmN0aW9uIChub2RlKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gbm9kZS5ub2RlVmFsdWU7XG5cbiAgLy8gbXVsdGlwbGUgc3BhY2VzIGFyZSBjb2xsYXBzZWRcbiAgdHh0ID0gdHh0LnJlcGxhY2UoLyArL2csICcgJyk7XG5cbiAgLy8gcmVwbGFjZSB0aGUgY3VzdG9tIMKoTkJTUDsgd2l0aCBhIHNwYWNlXG4gIHR4dCA9IHR4dC5yZXBsYWNlKC/CqE5CU1A7L2csICcgJyk7XG5cbiAgLy8gXCIsIDwsID4gYW5kICYgc2hvdWxkIHJlcGxhY2UgZXNjYXBlZCBodG1sIGVudGl0aWVzXG4gIHR4dCA9IHNob3dkb3duLmhlbHBlci51bmVzY2FwZUhUTUxFbnRpdGllcyh0eHQpO1xuXG4gIC8vIGVzY2FwZSBtYXJrZG93biBtYWdpYyBjaGFyYWN0ZXJzXG4gIC8vIGVtcGhhc2lzLCBzdHJvbmcgYW5kIHN0cmlrZXRocm91Z2ggLSBjYW4gYXBwZWFyIGV2ZXJ5d2hlcmVcbiAgLy8gd2UgYWxzbyBlc2NhcGUgcGlwZSAofCkgYmVjYXVzZSBvZiB0YWJsZXNcbiAgLy8gYW5kIGVzY2FwZSBgIGJlY2F1c2Ugb2YgY29kZSBibG9ja3MgYW5kIHNwYW5zXG4gIHR4dCA9IHR4dC5yZXBsYWNlKC8oWypffnxgXSkvZywgJ1xcXFwkMScpO1xuXG4gIC8vIGVzY2FwZSA+IGJlY2F1c2Ugb2YgYmxvY2txdW90ZXNcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL14oXFxzKik+L2csICdcXFxcJDE+Jyk7XG5cbiAgLy8gaGFzaCBjaGFyYWN0ZXIsIG9ubHkgdHJvdWJsZXNvbWUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgYmVjYXVzZSBvZiBoZWFkZXJzXG4gIHR4dCA9IHR4dC5yZXBsYWNlKC9eIy9nbSwgJ1xcXFwjJyk7XG5cbiAgLy8gaG9yaXpvbnRhbCBydWxlc1xuICB0eHQgPSB0eHQucmVwbGFjZSgvXihcXHMqKShbLT1dezMsfSkoXFxzKikkLywgJyQxXFxcXCQyJDMnKTtcblxuICAvLyBkb3QsIGJlY2F1c2Ugb2Ygb3JkZXJlZCBsaXN0cywgb25seSB0cm91Ymxlc29tZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aGVuIHByZWNlZGVkIGJ5IGFuIGludGVnZXJcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL14oIHswLDN9XFxkKylcXC4vZ20sICckMVxcXFwuJyk7XG5cbiAgLy8gKywgKiBhbmQgLSwgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgYmVjb21lcyBhIGxpc3QsIHNvIHdlIG5lZWQgdG8gZXNjYXBlIHRoZW0gYWxzbyAoYXN0ZXJpc2sgd2FzIGFscmVhZHkgZXNjYXBlZClcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL14oIHswLDN9KShbKy1dKS9nbSwgJyQxXFxcXCQyJyk7XG5cbiAgLy8gaW1hZ2VzIGFuZCBsaW5rcywgXSBmb2xsb3dlZCBieSAoIGlzIHByb2JsZW1hdGljLCBzbyB3ZSBlc2NhcGUgaXRcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL10oW1xcc10qKVxcKC9nLCAnXFxcXF0kMVxcXFwoJyk7XG5cbiAgLy8gcmVmZXJlbmNlIFVSSXMgbXVzdCBhbHNvIGJlIGVzY2FwZWRcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL14gezAsM31cXFsoW1xcUyBcXHRdKj8pXTovZ20sICdcXFxcWyQxXTonKTtcblxuICByZXR1cm4gdHh0O1xufSk7XG5cclxudmFyIHJvb3QgPSB0aGlzO1xuXG4vLyBBTUQgTG9hZGVyXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiBzaG93ZG93bjtcbiAgfSk7XG5cbi8vIENvbW1vbkpTL25vZGVKUyBMb2FkZXJcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzaG93ZG93bjtcblxuLy8gUmVndWxhciBCcm93c2VyIGxvYWRlclxufSBlbHNlIHtcbiAgcm9vdC5zaG93ZG93biA9IHNob3dkb3duO1xufVxufSkuY2FsbCh0aGlzKTtcclxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaG93ZG93bi5qcy5tYXBcclxuIiwidmFyIG5leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaW1tZWRpYXRlSWRzID0ge307XG52YXIgbmV4dEltbWVkaWF0ZUlkID0gMDtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsgdGltZW91dC5jbG9zZSgpOyB9O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIFRoYXQncyBub3QgaG93IG5vZGUuanMgaW1wbGVtZW50cyBpdCBidXQgdGhlIGV4cG9zZWQgYXBpIGlzIHRoZSBzYW1lLlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBzZXRJbW1lZGlhdGUgOiBmdW5jdGlvbihmbikge1xuICB2YXIgaWQgPSBuZXh0SW1tZWRpYXRlSWQrKztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGZhbHNlIDogc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGltbWVkaWF0ZUlkc1tpZF0gPSB0cnVlO1xuXG4gIG5leHRUaWNrKGZ1bmN0aW9uIG9uTmV4dFRpY2soKSB7XG4gICAgaWYgKGltbWVkaWF0ZUlkc1tpZF0pIHtcbiAgICAgIC8vIGZuLmNhbGwoKSBpcyBmYXN0ZXIgc28gd2Ugb3B0aW1pemUgZm9yIHRoZSBjb21tb24gdXNlLWNhc2VcbiAgICAgIC8vIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vY2FsbC1hcHBseS1zZWd1XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCk7XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IGlkcyBmcm9tIGxlYWtpbmdcbiAgICAgIGV4cG9ydHMuY2xlYXJJbW1lZGlhdGUoaWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlkO1xufTtcblxuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IHR5cGVvZiBjbGVhckltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY2xlYXJJbW1lZGlhdGUgOiBmdW5jdGlvbihpZCkge1xuICBkZWxldGUgaW1tZWRpYXRlSWRzW2lkXTtcbn07IiwiLyoqIVxuKiB0aXBweS5qcyB2Ni4yLjZcbiogKGMpIDIwMTctMjAyMCBhdG9taWtzXG4qIE1JVCBMaWNlbnNlXG4qL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29yZSA9IHJlcXVpcmUoJ0Bwb3BwZXJqcy9jb3JlJyk7XG5cbnZhciBST1VORF9BUlJPVyA9ICc8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCI2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHpcIj48L3N2Zz4nO1xudmFyIEJPWF9DTEFTUyA9IFwidGlwcHktYm94XCI7XG52YXIgQ09OVEVOVF9DTEFTUyA9IFwidGlwcHktY29udGVudFwiO1xudmFyIEJBQ0tEUk9QX0NMQVNTID0gXCJ0aXBweS1iYWNrZHJvcFwiO1xudmFyIEFSUk9XX0NMQVNTID0gXCJ0aXBweS1hcnJvd1wiO1xudmFyIFNWR19BUlJPV19DTEFTUyA9IFwidGlwcHktc3ZnLWFycm93XCI7XG52YXIgVE9VQ0hfT1BUSU9OUyA9IHtcbiAgcGFzc2l2ZTogdHJ1ZSxcbiAgY2FwdHVyZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBrZXkpIHtcbiAgcmV0dXJuIHt9Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVBdEluZGV4T3JSZXR1cm4odmFsdWUsIGluZGV4LCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIHYgPSB2YWx1ZVtpbmRleF07XG4gICAgcmV0dXJuIHYgPT0gbnVsbCA/IEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZVtpbmRleF0gOiBkZWZhdWx0VmFsdWUgOiB2O1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gaXNUeXBlKHZhbHVlLCB0eXBlKSB7XG4gIHZhciBzdHIgPSB7fS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5pbmRleE9mKCdbb2JqZWN0JykgPT09IDAgJiYgc3RyLmluZGV4T2YodHlwZSArIFwiXVwiKSA+IC0xO1xufVxuZnVuY3Rpb24gaW52b2tlV2l0aEFyZ3NPclJldHVybih2YWx1ZSwgYXJncykge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYXBwbHkodm9pZCAwLCBhcmdzKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoZm4sIG1zKSB7XG4gIC8vIEF2b2lkIHdyYXBwaW5nIGluIGBzZXRUaW1lb3V0YCBpZiBtcyBpcyAwIGFueXdheVxuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgdGltZW91dDtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZm4oYXJnKTtcbiAgICB9LCBtcyk7XG4gIH07XG59XG5mdW5jdGlvbiByZW1vdmVQcm9wZXJ0aWVzKG9iaiwga2V5cykge1xuICB2YXIgY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGRlbGV0ZSBjbG9uZVtrZXldO1xuICB9KTtcbiAgcmV0dXJuIGNsb25lO1xufVxuZnVuY3Rpb24gc3BsaXRCeVNwYWNlcyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG59XG5mdW5jdGlvbiBub3JtYWxpemVUb0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiBbXS5jb25jYXQodmFsdWUpO1xufVxuZnVuY3Rpb24gcHVzaElmVW5pcXVlKGFyciwgdmFsdWUpIHtcbiAgaWYgKGFyci5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBhcnIucHVzaCh2YWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgcmV0dXJuIGFyci5pbmRleE9mKGl0ZW0pID09PSBpbmRleDtcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59XG5mdW5jdGlvbiBhcnJheUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIFtdLnNsaWNlLmNhbGwodmFsdWUpO1xufVxuZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcHMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBpZiAob2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWNjW2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGRpdigpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiBbJ0VsZW1lbnQnLCAnRnJhZ21lbnQnXS5zb21lKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIGlzVHlwZSh2YWx1ZSwgdHlwZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNOb2RlTGlzdCh2YWx1ZSkge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTm9kZUxpc3QnKTtcbn1cbmZ1bmN0aW9uIGlzTW91c2VFdmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTW91c2VFdmVudCcpO1xufVxuZnVuY3Rpb24gaXNSZWZlcmVuY2VFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fdGlwcHkgJiYgdmFsdWUuX3RpcHB5LnJlZmVyZW5jZSA9PT0gdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0QXJyYXlPZkVsZW1lbnRzKHZhbHVlKSB7XG4gIGlmIChpc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgcmV0dXJuIFt2YWx1ZV07XG4gIH1cblxuICBpZiAoaXNOb2RlTGlzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gYXJyYXlGcm9tKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBhcnJheUZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh2YWx1ZSkpO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkR1cmF0aW9uKGVscywgdmFsdWUpIHtcbiAgZWxzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSB2YWx1ZSArIFwibXNcIjtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0VmlzaWJpbGl0eVN0YXRlKGVscywgc3RhdGUpIHtcbiAgZWxzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCBzdGF0ZSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnQoZWxlbWVudE9yRWxlbWVudHMpIHtcbiAgdmFyIF9ub3JtYWxpemVUb0FycmF5ID0gbm9ybWFsaXplVG9BcnJheShlbGVtZW50T3JFbGVtZW50cyksXG4gICAgICBlbGVtZW50ID0gX25vcm1hbGl6ZVRvQXJyYXlbMF07XG5cbiAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgOiBkb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGlzQ3Vyc29yT3V0c2lkZUludGVyYWN0aXZlQm9yZGVyKHBvcHBlclRyZWVEYXRhLCBldmVudCkge1xuICB2YXIgY2xpZW50WCA9IGV2ZW50LmNsaWVudFgsXG4gICAgICBjbGllbnRZID0gZXZlbnQuY2xpZW50WTtcbiAgcmV0dXJuIHBvcHBlclRyZWVEYXRhLmV2ZXJ5KGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHBvcHBlclJlY3QgPSBfcmVmLnBvcHBlclJlY3QsXG4gICAgICAgIHBvcHBlclN0YXRlID0gX3JlZi5wb3BwZXJTdGF0ZSxcbiAgICAgICAgcHJvcHMgPSBfcmVmLnByb3BzO1xuICAgIHZhciBpbnRlcmFjdGl2ZUJvcmRlciA9IHByb3BzLmludGVyYWN0aXZlQm9yZGVyO1xuICAgIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwb3BwZXJTdGF0ZS5wbGFjZW1lbnQpO1xuICAgIHZhciBvZmZzZXREYXRhID0gcG9wcGVyU3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7XG5cbiAgICBpZiAoIW9mZnNldERhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciB0b3BEaXN0YW5jZSA9IGJhc2VQbGFjZW1lbnQgPT09ICdib3R0b20nID8gb2Zmc2V0RGF0YS50b3AueSA6IDA7XG4gICAgdmFyIGJvdHRvbURpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ3RvcCcgPyBvZmZzZXREYXRhLmJvdHRvbS55IDogMDtcbiAgICB2YXIgbGVmdERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/IG9mZnNldERhdGEubGVmdC54IDogMDtcbiAgICB2YXIgcmlnaHREaXN0YW5jZSA9IGJhc2VQbGFjZW1lbnQgPT09ICdsZWZ0JyA/IG9mZnNldERhdGEucmlnaHQueCA6IDA7XG4gICAgdmFyIGV4Y2VlZHNUb3AgPSBwb3BwZXJSZWN0LnRvcCAtIGNsaWVudFkgKyB0b3BEaXN0YW5jZSA+IGludGVyYWN0aXZlQm9yZGVyO1xuICAgIHZhciBleGNlZWRzQm90dG9tID0gY2xpZW50WSAtIHBvcHBlclJlY3QuYm90dG9tIC0gYm90dG9tRGlzdGFuY2UgPiBpbnRlcmFjdGl2ZUJvcmRlcjtcbiAgICB2YXIgZXhjZWVkc0xlZnQgPSBwb3BwZXJSZWN0LmxlZnQgLSBjbGllbnRYICsgbGVmdERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgdmFyIGV4Y2VlZHNSaWdodCA9IGNsaWVudFggLSBwb3BwZXJSZWN0LnJpZ2h0IC0gcmlnaHREaXN0YW5jZSA+IGludGVyYWN0aXZlQm9yZGVyO1xuICAgIHJldHVybiBleGNlZWRzVG9wIHx8IGV4Y2VlZHNCb3R0b20gfHwgZXhjZWVkc0xlZnQgfHwgZXhjZWVkc1JpZ2h0O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lcihib3gsIGFjdGlvbiwgbGlzdGVuZXIpIHtcbiAgdmFyIG1ldGhvZCA9IGFjdGlvbiArIFwiRXZlbnRMaXN0ZW5lclwiOyAvLyBzb21lIGJyb3dzZXJzIGFwcGFyZW50bHkgc3VwcG9ydCBgdHJhbnNpdGlvbmAgKHVucHJlZml4ZWQpIGJ1dCBvbmx5IGZpcmVcbiAgLy8gYHdlYmtpdFRyYW5zaXRpb25FbmRgLi4uXG5cbiAgWyd0cmFuc2l0aW9uZW5kJywgJ3dlYmtpdFRyYW5zaXRpb25FbmQnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGJveFttZXRob2RdKGV2ZW50LCBsaXN0ZW5lcik7XG4gIH0pO1xufVxuXG52YXIgY3VycmVudElucHV0ID0ge1xuICBpc1RvdWNoOiBmYWxzZVxufTtcbnZhciBsYXN0TW91c2VNb3ZlVGltZSA9IDA7XG4vKipcbiAqIFdoZW4gYSBgdG91Y2hzdGFydGAgZXZlbnQgaXMgZmlyZWQsIGl0J3MgYXNzdW1lZCB0aGUgdXNlciBpcyB1c2luZyB0b3VjaFxuICogaW5wdXQuIFdlJ2xsIGJpbmQgYSBgbW91c2Vtb3ZlYCBldmVudCBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIG1vdXNlIGlucHV0IGluXG4gKiB0aGUgZnV0dXJlLiBUaGlzIHdheSwgdGhlIGBpc1RvdWNoYCBwcm9wZXJ0eSBpcyBmdWxseSBkeW5hbWljIGFuZCB3aWxsIGhhbmRsZVxuICogaHlicmlkIGRldmljZXMgdGhhdCB1c2UgYSBtaXggb2YgdG91Y2ggKyBtb3VzZSBpbnB1dC5cbiAqL1xuXG5mdW5jdGlvbiBvbkRvY3VtZW50VG91Y2hTdGFydCgpIHtcbiAgaWYgKGN1cnJlbnRJbnB1dC5pc1RvdWNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3VycmVudElucHV0LmlzVG91Y2ggPSB0cnVlO1xuXG4gIGlmICh3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbkRvY3VtZW50TW91c2VNb3ZlKTtcbiAgfVxufVxuLyoqXG4gKiBXaGVuIHR3byBgbW91c2Vtb3ZlYCBldmVudCBhcmUgZmlyZWQgY29uc2VjdXRpdmVseSB3aXRoaW4gMjBtcywgaXQncyBhc3N1bWVkXG4gKiB0aGUgdXNlciBpcyB1c2luZyBtb3VzZSBpbnB1dCBhZ2Fpbi4gYG1vdXNlbW92ZWAgY2FuIGZpcmUgb24gdG91Y2ggZGV2aWNlcyBhc1xuICogd2VsbCwgYnV0IHZlcnkgcmFyZWx5IHRoYXQgcXVpY2tseS5cbiAqL1xuXG5mdW5jdGlvbiBvbkRvY3VtZW50TW91c2VNb3ZlKCkge1xuICB2YXIgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgaWYgKG5vdyAtIGxhc3RNb3VzZU1vdmVUaW1lIDwgMjApIHtcbiAgICBjdXJyZW50SW5wdXQuaXNUb3VjaCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uRG9jdW1lbnRNb3VzZU1vdmUpO1xuICB9XG5cbiAgbGFzdE1vdXNlTW92ZVRpbWUgPSBub3c7XG59XG4vKipcbiAqIFdoZW4gYW4gZWxlbWVudCBpcyBpbiBmb2N1cyBhbmQgaGFzIGEgdGlwcHksIGxlYXZpbmcgdGhlIHRhYi93aW5kb3cgYW5kXG4gKiByZXR1cm5pbmcgY2F1c2VzIGl0IHRvIHNob3cgYWdhaW4uIEZvciBtb3VzZSB1c2VycyB0aGlzIGlzIHVuZXhwZWN0ZWQsIGJ1dFxuICogZm9yIGtleWJvYXJkIHVzZSBpdCBtYWtlcyBzZW5zZS5cbiAqIFRPRE86IGZpbmQgYSBiZXR0ZXIgdGVjaG5pcXVlIHRvIHNvbHZlIHRoaXMgcHJvYmxlbVxuICovXG5cbmZ1bmN0aW9uIG9uV2luZG93Qmx1cigpIHtcbiAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gIGlmIChpc1JlZmVyZW5jZUVsZW1lbnQoYWN0aXZlRWxlbWVudCkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBhY3RpdmVFbGVtZW50Ll90aXBweTtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50LmJsdXIgJiYgIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBiaW5kR2xvYmFsRXZlbnRMaXN0ZW5lcnMoKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkRvY3VtZW50VG91Y2hTdGFydCwgVE9VQ0hfT1BUSU9OUyk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25XaW5kb3dCbHVyKTtcbn1cblxudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgdWEgPSBpc0Jyb3dzZXIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogJyc7XG52YXIgaXNJRSA9IC9NU0lFIHxUcmlkZW50XFwvLy50ZXN0KHVhKTtcblxuZnVuY3Rpb24gY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcobWV0aG9kKSB7XG4gIHZhciB0eHQgPSBtZXRob2QgPT09ICdkZXN0cm95JyA/ICduIGFscmVhZHktJyA6ICcgJztcbiAgcmV0dXJuIFttZXRob2QgKyBcIigpIHdhcyBjYWxsZWQgb24gYVwiICsgdHh0ICsgXCJkZXN0cm95ZWQgaW5zdGFuY2UuIFRoaXMgaXMgYSBuby1vcCBidXRcIiwgJ2luZGljYXRlcyBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4nXS5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBjbGVhbih2YWx1ZSkge1xuICB2YXIgc3BhY2VzQW5kVGFicyA9IC9bIFxcdF17Mix9L2c7XG4gIHZhciBsaW5lU3RhcnRXaXRoU3BhY2VzID0gL15bIFxcdF0qL2dtO1xuICByZXR1cm4gdmFsdWUucmVwbGFjZShzcGFjZXNBbmRUYWJzLCAnICcpLnJlcGxhY2UobGluZVN0YXJ0V2l0aFNwYWNlcywgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGV2TWVzc2FnZShtZXNzYWdlKSB7XG4gIHJldHVybiBjbGVhbihcIlxcbiAgJWN0aXBweS5qc1xcblxcbiAgJWNcIiArIGNsZWFuKG1lc3NhZ2UpICsgXCJcXG5cXG4gICVjXFx1RDgzRFxcdURDNzdcXHUyMDBEIFRoaXMgaXMgYSBkZXZlbG9wbWVudC1vbmx5IG1lc3NhZ2UuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBwcm9kdWN0aW9uLlxcbiAgXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWRNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIFtnZXREZXZNZXNzYWdlKG1lc3NhZ2UpLCAvLyB0aXRsZVxuICAnY29sb3I6ICMwMEM1ODQ7IGZvbnQtc2l6ZTogMS4zZW07IGZvbnQtd2VpZ2h0OiBib2xkOycsIC8vIG1lc3NhZ2VcbiAgJ2xpbmUtaGVpZ2h0OiAxLjUnLCAvLyBmb290ZXJcbiAgJ2NvbG9yOiAjYTZhMDk1OyddO1xufSAvLyBBc3N1bWUgd2FybmluZ3MgYW5kIGVycm9ycyBuZXZlciBoYXZlIHRoZSBzYW1lIG1lc3NhZ2VcblxudmFyIHZpc2l0ZWRNZXNzYWdlcztcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgcmVzZXRWaXNpdGVkTWVzc2FnZXMoKTtcbn1cblxuZnVuY3Rpb24gcmVzZXRWaXNpdGVkTWVzc2FnZXMoKSB7XG4gIHZpc2l0ZWRNZXNzYWdlcyA9IG5ldyBTZXQoKTtcbn1cbmZ1bmN0aW9uIHdhcm5XaGVuKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoY29uZGl0aW9uICYmICF2aXNpdGVkTWVzc2FnZXMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgdmFyIF9jb25zb2xlO1xuXG4gICAgdmlzaXRlZE1lc3NhZ2VzLmFkZChtZXNzYWdlKTtcblxuICAgIChfY29uc29sZSA9IGNvbnNvbGUpLndhcm4uYXBwbHkoX2NvbnNvbGUsIGdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcldoZW4oY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmIChjb25kaXRpb24gJiYgIXZpc2l0ZWRNZXNzYWdlcy5oYXMobWVzc2FnZSkpIHtcbiAgICB2YXIgX2NvbnNvbGUyO1xuXG4gICAgdmlzaXRlZE1lc3NhZ2VzLmFkZChtZXNzYWdlKTtcblxuICAgIChfY29uc29sZTIgPSBjb25zb2xlKS5lcnJvci5hcHBseShfY29uc29sZTIsIGdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVRhcmdldHModGFyZ2V0cykge1xuICB2YXIgZGlkUGFzc0ZhbHN5VmFsdWUgPSAhdGFyZ2V0cztcbiAgdmFyIGRpZFBhc3NQbGFpbk9iamVjdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0YXJnZXRzKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgJiYgIXRhcmdldHMuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgZXJyb3JXaGVuKGRpZFBhc3NGYWxzeVZhbHVlLCBbJ3RpcHB5KCkgd2FzIHBhc3NlZCcsICdgJyArIFN0cmluZyh0YXJnZXRzKSArICdgJywgJ2FzIGl0cyB0YXJnZXRzIChmaXJzdCkgYXJndW1lbnQuIFZhbGlkIHR5cGVzIGFyZTogU3RyaW5nLCBFbGVtZW50LCcsICdFbGVtZW50W10sIG9yIE5vZGVMaXN0LiddLmpvaW4oJyAnKSk7XG4gIGVycm9yV2hlbihkaWRQYXNzUGxhaW5PYmplY3QsIFsndGlwcHkoKSB3YXMgcGFzc2VkIGEgcGxhaW4gb2JqZWN0IHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYW4gYXJndW1lbnQnLCAnZm9yIHZpcnR1YWwgcG9zaXRpb25pbmcuIFVzZSBwcm9wcy5nZXRSZWZlcmVuY2VDbGllbnRSZWN0IGluc3RlYWQuJ10uam9pbignICcpKTtcbn1cblxudmFyIHBsdWdpblByb3BzID0ge1xuICBhbmltYXRlRmlsbDogZmFsc2UsXG4gIGZvbGxvd0N1cnNvcjogZmFsc2UsXG4gIGlubGluZVBvc2l0aW9uaW5nOiBmYWxzZSxcbiAgc3RpY2t5OiBmYWxzZVxufTtcbnZhciByZW5kZXJQcm9wcyA9IHtcbiAgYWxsb3dIVE1MOiBmYWxzZSxcbiAgYW5pbWF0aW9uOiAnZmFkZScsXG4gIGFycm93OiB0cnVlLFxuICBjb250ZW50OiAnJyxcbiAgaW5lcnRpYTogZmFsc2UsXG4gIG1heFdpZHRoOiAzNTAsXG4gIHJvbGU6ICd0b29sdGlwJyxcbiAgdGhlbWU6ICcnLFxuICB6SW5kZXg6IDk5OTlcbn07XG52YXIgZGVmYXVsdFByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gIGFwcGVuZFRvOiBmdW5jdGlvbiBhcHBlbmRUbygpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgfSxcbiAgYXJpYToge1xuICAgIGNvbnRlbnQ6ICdhdXRvJyxcbiAgICBleHBhbmRlZDogJ2F1dG8nXG4gIH0sXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogWzMwMCwgMjUwXSxcbiAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogbnVsbCxcbiAgaGlkZU9uQ2xpY2s6IHRydWUsXG4gIGlnbm9yZUF0dHJpYnV0ZXM6IGZhbHNlLFxuICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gIGludGVyYWN0aXZlQm9yZGVyOiAyLFxuICBpbnRlcmFjdGl2ZURlYm91bmNlOiAwLFxuICBtb3ZlVHJhbnNpdGlvbjogJycsXG4gIG9mZnNldDogWzAsIDEwXSxcbiAgb25BZnRlclVwZGF0ZTogZnVuY3Rpb24gb25BZnRlclVwZGF0ZSgpIHt9LFxuICBvbkJlZm9yZVVwZGF0ZTogZnVuY3Rpb24gb25CZWZvcmVVcGRhdGUoKSB7fSxcbiAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge30sXG4gIG9uRGVzdHJveTogZnVuY3Rpb24gb25EZXN0cm95KCkge30sXG4gIG9uSGlkZGVuOiBmdW5jdGlvbiBvbkhpZGRlbigpIHt9LFxuICBvbkhpZGU6IGZ1bmN0aW9uIG9uSGlkZSgpIHt9LFxuICBvbk1vdW50OiBmdW5jdGlvbiBvbk1vdW50KCkge30sXG4gIG9uU2hvdzogZnVuY3Rpb24gb25TaG93KCkge30sXG4gIG9uU2hvd246IGZ1bmN0aW9uIG9uU2hvd24oKSB7fSxcbiAgb25UcmlnZ2VyOiBmdW5jdGlvbiBvblRyaWdnZXIoKSB7fSxcbiAgb25VbnRyaWdnZXI6IGZ1bmN0aW9uIG9uVW50cmlnZ2VyKCkge30sXG4gIG9uQ2xpY2tPdXRzaWRlOiBmdW5jdGlvbiBvbkNsaWNrT3V0c2lkZSgpIHt9LFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwbHVnaW5zOiBbXSxcbiAgcG9wcGVyT3B0aW9uczoge30sXG4gIHJlbmRlcjogbnVsbCxcbiAgc2hvd09uQ3JlYXRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHRyaWdnZXI6ICdtb3VzZWVudGVyIGZvY3VzJyxcbiAgdHJpZ2dlclRhcmdldDogbnVsbFxufSwgcGx1Z2luUHJvcHMsIHt9LCByZW5kZXJQcm9wcyk7XG52YXIgZGVmYXVsdEtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0UHJvcHMpO1xudmFyIHNldERlZmF1bHRQcm9wcyA9IGZ1bmN0aW9uIHNldERlZmF1bHRQcm9wcyhwYXJ0aWFsUHJvcHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHBhcnRpYWxQcm9wcywgW10pO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsUHJvcHMpO1xuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGRlZmF1bHRQcm9wc1trZXldID0gcGFydGlhbFByb3BzW2tleV07XG4gIH0pO1xufTtcbmZ1bmN0aW9uIGdldEV4dGVuZGVkUGFzc2VkUHJvcHMocGFzc2VkUHJvcHMpIHtcbiAgdmFyIHBsdWdpbnMgPSBwYXNzZWRQcm9wcy5wbHVnaW5zIHx8IFtdO1xuICB2YXIgcGx1Z2luUHJvcHMgPSBwbHVnaW5zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbHVnaW4pIHtcbiAgICB2YXIgbmFtZSA9IHBsdWdpbi5uYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwbHVnaW4uZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGFjY1tuYW1lXSA9IHBhc3NlZFByb3BzW25hbWVdICE9PSB1bmRlZmluZWQgPyBwYXNzZWRQcm9wc1tuYW1lXSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBwYXNzZWRQcm9wcywge30sIHBsdWdpblByb3BzKTtcbn1cbmZ1bmN0aW9uIGdldERhdGFBdHRyaWJ1dGVQcm9wcyhyZWZlcmVuY2UsIHBsdWdpbnMpIHtcbiAgdmFyIHByb3BLZXlzID0gcGx1Z2lucyA/IE9iamVjdC5rZXlzKGdldEV4dGVuZGVkUGFzc2VkUHJvcHMoT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFByb3BzLCB7XG4gICAgcGx1Z2luczogcGx1Z2luc1xuICB9KSkpIDogZGVmYXVsdEtleXM7XG4gIHZhciBwcm9wcyA9IHByb3BLZXlzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICB2YXIgdmFsdWVBc1N0cmluZyA9IChyZWZlcmVuY2UuZ2V0QXR0cmlidXRlKFwiZGF0YS10aXBweS1cIiArIGtleSkgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmICghdmFsdWVBc1N0cmluZykge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnY29udGVudCcpIHtcbiAgICAgIGFjY1trZXldID0gdmFsdWVBc1N0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlQXNTdHJpbmcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlQXNTdHJpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gcHJvcHM7XG59XG5mdW5jdGlvbiBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwgcHJvcHMpIHtcbiAgdmFyIG91dCA9IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgY29udGVudDogaW52b2tlV2l0aEFyZ3NPclJldHVybihwcm9wcy5jb250ZW50LCBbcmVmZXJlbmNlXSlcbiAgfSwgcHJvcHMuaWdub3JlQXR0cmlidXRlcyA/IHt9IDogZ2V0RGF0YUF0dHJpYnV0ZVByb3BzKHJlZmVyZW5jZSwgcHJvcHMucGx1Z2lucykpO1xuICBvdXQuYXJpYSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQcm9wcy5hcmlhLCB7fSwgb3V0LmFyaWEpO1xuICBvdXQuYXJpYSA9IHtcbiAgICBleHBhbmRlZDogb3V0LmFyaWEuZXhwYW5kZWQgPT09ICdhdXRvJyA/IHByb3BzLmludGVyYWN0aXZlIDogb3V0LmFyaWEuZXhwYW5kZWQsXG4gICAgY29udGVudDogb3V0LmFyaWEuY29udGVudCA9PT0gJ2F1dG8nID8gcHJvcHMuaW50ZXJhY3RpdmUgPyBudWxsIDogJ2Rlc2NyaWJlZGJ5JyA6IG91dC5hcmlhLmNvbnRlbnRcbiAgfTtcbiAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMocGFydGlhbFByb3BzLCBwbHVnaW5zKSB7XG4gIGlmIChwYXJ0aWFsUHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHBhcnRpYWxQcm9wcyA9IHt9O1xuICB9XG5cbiAgaWYgKHBsdWdpbnMgPT09IHZvaWQgMCkge1xuICAgIHBsdWdpbnMgPSBbXTtcbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMocGFydGlhbFByb3BzKTtcbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgdmFyIG5vblBsdWdpblByb3BzID0gcmVtb3ZlUHJvcGVydGllcyhkZWZhdWx0UHJvcHMsIE9iamVjdC5rZXlzKHBsdWdpblByb3BzKSk7XG4gICAgdmFyIGRpZFBhc3NVbmtub3duUHJvcCA9ICFoYXNPd25Qcm9wZXJ0eShub25QbHVnaW5Qcm9wcywgcHJvcCk7IC8vIENoZWNrIGlmIHRoZSBwcm9wIGV4aXN0cyBpbiBgcGx1Z2luc2BcblxuICAgIGlmIChkaWRQYXNzVW5rbm93blByb3ApIHtcbiAgICAgIGRpZFBhc3NVbmtub3duUHJvcCA9IHBsdWdpbnMuZmlsdGVyKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbi5uYW1lID09PSBwcm9wO1xuICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHdhcm5XaGVuKGRpZFBhc3NVbmtub3duUHJvcCwgW1wiYFwiICsgcHJvcCArIFwiYFwiLCBcImlzIG5vdCBhIHZhbGlkIHByb3AuIFlvdSBtYXkgaGF2ZSBzcGVsbGVkIGl0IGluY29ycmVjdGx5LCBvciBpZiBpdCdzXCIsICdhIHBsdWdpbiwgZm9yZ290IHRvIHBhc3MgaXQgaW4gYW4gYXJyYXkgYXMgcHJvcHMucGx1Z2lucy4nLCAnXFxuXFxuJywgJ0FsbCBwcm9wczogaHR0cHM6Ly9hdG9taWtzLmdpdGh1Yi5pby90aXBweWpzL3Y2L2FsbC1wcm9wcy9cXG4nLCAnUGx1Z2luczogaHR0cHM6Ly9hdG9taWtzLmdpdGh1Yi5pby90aXBweWpzL3Y2L3BsdWdpbnMvJ10uam9pbignICcpKTtcbiAgfSk7XG59XG5cbnZhciBpbm5lckhUTUwgPSBmdW5jdGlvbiBpbm5lckhUTUwoKSB7XG4gIHJldHVybiAnaW5uZXJIVE1MJztcbn07XG5cbmZ1bmN0aW9uIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKGVsZW1lbnQsIGh0bWwpIHtcbiAgZWxlbWVudFtpbm5lckhUTUwoKV0gPSBodG1sO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcnJvd0VsZW1lbnQodmFsdWUpIHtcbiAgdmFyIGFycm93ID0gZGl2KCk7XG5cbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgYXJyb3cuY2xhc3NOYW1lID0gQVJST1dfQ0xBU1M7XG4gIH0gZWxzZSB7XG4gICAgYXJyb3cuY2xhc3NOYW1lID0gU1ZHX0FSUk9XX0NMQVNTO1xuXG4gICAgaWYgKGlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgIGFycm93LmFwcGVuZENoaWxkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoYXJyb3csIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyb3c7XG59XG5cbmZ1bmN0aW9uIHNldENvbnRlbnQoY29udGVudCwgcHJvcHMpIHtcbiAgaWYgKGlzRWxlbWVudChwcm9wcy5jb250ZW50KSkge1xuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKGNvbnRlbnQsICcnKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKHByb3BzLmNvbnRlbnQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5jb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb3BzLmFsbG93SFRNTCkge1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoY29udGVudCwgcHJvcHMuY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQudGV4dENvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocG9wcGVyKSB7XG4gIHZhciBib3ggPSBwb3BwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIHZhciBib3hDaGlsZHJlbiA9IGFycmF5RnJvbShib3guY2hpbGRyZW4pO1xuICByZXR1cm4ge1xuICAgIGJveDogYm94LFxuICAgIGNvbnRlbnQ6IGJveENoaWxkcmVuLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhDT05URU5UX0NMQVNTKTtcbiAgICB9KSxcbiAgICBhcnJvdzogYm94Q2hpbGRyZW4uZmluZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKEFSUk9XX0NMQVNTKSB8fCBub2RlLmNsYXNzTGlzdC5jb250YWlucyhTVkdfQVJST1dfQ0xBU1MpO1xuICAgIH0pLFxuICAgIGJhY2tkcm9wOiBib3hDaGlsZHJlbi5maW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQkFDS0RST1BfQ0xBU1MpO1xuICAgIH0pXG4gIH07XG59XG5mdW5jdGlvbiByZW5kZXIoaW5zdGFuY2UpIHtcbiAgdmFyIHBvcHBlciA9IGRpdigpO1xuICB2YXIgYm94ID0gZGl2KCk7XG4gIGJveC5jbGFzc05hbWUgPSBCT1hfQ0xBU1M7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIHZhciBjb250ZW50ID0gZGl2KCk7XG4gIGNvbnRlbnQuY2xhc3NOYW1lID0gQ09OVEVOVF9DTEFTUztcbiAgY29udGVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XG4gIHNldENvbnRlbnQoY29udGVudCwgaW5zdGFuY2UucHJvcHMpO1xuICBwb3BwZXIuYXBwZW5kQ2hpbGQoYm94KTtcbiAgYm94LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICBvblVwZGF0ZShpbnN0YW5jZS5wcm9wcywgaW5zdGFuY2UucHJvcHMpO1xuXG4gIGZ1bmN0aW9uIG9uVXBkYXRlKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgdmFyIF9nZXRDaGlsZHJlbiA9IGdldENoaWxkcmVuKHBvcHBlciksXG4gICAgICAgIGJveCA9IF9nZXRDaGlsZHJlbi5ib3gsXG4gICAgICAgIGNvbnRlbnQgPSBfZ2V0Q2hpbGRyZW4uY29udGVudCxcbiAgICAgICAgYXJyb3cgPSBfZ2V0Q2hpbGRyZW4uYXJyb3c7XG5cbiAgICBpZiAobmV4dFByb3BzLnRoZW1lKSB7XG4gICAgICBib3guc2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJywgbmV4dFByb3BzLnRoZW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10aGVtZScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV4dFByb3BzLmFuaW1hdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJywgbmV4dFByb3BzLmFuaW1hdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRQcm9wcy5pbmVydGlhKSB7XG4gICAgICBib3guc2V0QXR0cmlidXRlKCdkYXRhLWluZXJ0aWEnLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaW5lcnRpYScpO1xuICAgIH1cblxuICAgIGJveC5zdHlsZS5tYXhXaWR0aCA9IHR5cGVvZiBuZXh0UHJvcHMubWF4V2lkdGggPT09ICdudW1iZXInID8gbmV4dFByb3BzLm1heFdpZHRoICsgXCJweFwiIDogbmV4dFByb3BzLm1heFdpZHRoO1xuXG4gICAgaWYgKG5leHRQcm9wcy5yb2xlKSB7XG4gICAgICBib3guc2V0QXR0cmlidXRlKCdyb2xlJywgbmV4dFByb3BzLnJvbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3gucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5jb250ZW50ICE9PSBuZXh0UHJvcHMuY29udGVudCB8fCBwcmV2UHJvcHMuYWxsb3dIVE1MICE9PSBuZXh0UHJvcHMuYWxsb3dIVE1MKSB7XG4gICAgICBzZXRDb250ZW50KGNvbnRlbnQsIGluc3RhbmNlLnByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFByb3BzLmFycm93KSB7XG4gICAgICBpZiAoIWFycm93KSB7XG4gICAgICAgIGJveC5hcHBlbmRDaGlsZChjcmVhdGVBcnJvd0VsZW1lbnQobmV4dFByb3BzLmFycm93KSk7XG4gICAgICB9IGVsc2UgaWYgKHByZXZQcm9wcy5hcnJvdyAhPT0gbmV4dFByb3BzLmFycm93KSB7XG4gICAgICAgIGJveC5yZW1vdmVDaGlsZChhcnJvdyk7XG4gICAgICAgIGJveC5hcHBlbmRDaGlsZChjcmVhdGVBcnJvd0VsZW1lbnQobmV4dFByb3BzLmFycm93KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcnJvdykge1xuICAgICAgYm94LnJlbW92ZUNoaWxkKGFycm93KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBvcHBlcjogcG9wcGVyLFxuICAgIG9uVXBkYXRlOiBvblVwZGF0ZVxuICB9O1xufSAvLyBSdW50aW1lIGNoZWNrIHRvIGlkZW50aWZ5IGlmIHRoZSByZW5kZXIgZnVuY3Rpb24gaXMgdGhlIGRlZmF1bHQgb25lOyB0aGlzXG4vLyB3YXkgd2UgY2FuIGFwcGx5IGRlZmF1bHQgQ1NTIHRyYW5zaXRpb25zIGxvZ2ljIGFuZCBpdCBjYW4gYmUgdHJlZS1zaGFrZW4gYXdheVxuXG5yZW5kZXIuJCR0aXBweSA9IHRydWU7XG5cbnZhciBpZENvdW50ZXIgPSAxO1xudmFyIG1vdXNlTW92ZUxpc3RlbmVycyA9IFtdOyAvLyBVc2VkIGJ5IGBoaWRlQWxsKClgXG5cbnZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG5mdW5jdGlvbiBjcmVhdGVUaXBweShyZWZlcmVuY2UsIHBhc3NlZFByb3BzKSB7XG4gIHZhciBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocmVmZXJlbmNlLCBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMsIHt9LCBnZXRFeHRlbmRlZFBhc3NlZFByb3BzKHJlbW92ZVVuZGVmaW5lZFByb3BzKHBhc3NlZFByb3BzKSkpKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJIgUHJpdmF0ZSBtZW1iZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBzaG93VGltZW91dDtcbiAgdmFyIGhpZGVUaW1lb3V0O1xuICB2YXIgc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWU7XG4gIHZhciBpc1Zpc2libGVGcm9tQ2xpY2sgPSBmYWxzZTtcbiAgdmFyIGRpZEhpZGVEdWVUb0RvY3VtZW50TW91c2VEb3duID0gZmFsc2U7XG4gIHZhciBkaWRUb3VjaE1vdmUgPSBmYWxzZTtcbiAgdmFyIGlnbm9yZU9uRmlyc3RVcGRhdGUgPSBmYWxzZTtcbiAgdmFyIGxhc3RUcmlnZ2VyRXZlbnQ7XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbkVuZExpc3RlbmVyO1xuICB2YXIgb25GaXJzdFVwZGF0ZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgZGVib3VuY2VkT25Nb3VzZU1vdmUgPSBkZWJvdW5jZShvbk1vdXNlTW92ZSwgcHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZSk7XG4gIHZhciBjdXJyZW50VGFyZ2V0O1xuICB2YXIgZG9jID0gZ2V0T3duZXJEb2N1bWVudChwcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IHJlZmVyZW5jZSk7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SRIFB1YmxpYyBtZW1iZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHZhciBpZCA9IGlkQ291bnRlcisrO1xuICB2YXIgcG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICB2YXIgcGx1Z2lucyA9IHVuaXF1ZShwcm9wcy5wbHVnaW5zKTtcbiAgdmFyIHN0YXRlID0ge1xuICAgIC8vIElzIHRoZSBpbnN0YW5jZSBjdXJyZW50bHkgZW5hYmxlZD9cbiAgICBpc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gSXMgdGhlIHRpcHB5IGN1cnJlbnRseSBzaG93aW5nIGFuZCBub3QgdHJhbnNpdGlvbmluZyBvdXQ/XG4gICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAvLyBIYXMgdGhlIGluc3RhbmNlIGJlZW4gZGVzdHJveWVkP1xuICAgIGlzRGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyBJcyB0aGUgdGlwcHkgY3VycmVudGx5IG1vdW50ZWQgdG8gdGhlIERPTT9cbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIC8vIEhhcyB0aGUgdGlwcHkgZmluaXNoZWQgdHJhbnNpdGlvbmluZyBpbj9cbiAgICBpc1Nob3duOiBmYWxzZVxuICB9O1xuICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIGlkOiBpZCxcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICBwb3BwZXI6IGRpdigpLFxuICAgIHBvcHBlckluc3RhbmNlOiBwb3BwZXJJbnN0YW5jZSxcbiAgICBwcm9wczogcHJvcHMsXG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgLy8gbWV0aG9kc1xuICAgIGNsZWFyRGVsYXlUaW1lb3V0czogY2xlYXJEZWxheVRpbWVvdXRzLFxuICAgIHNldFByb3BzOiBzZXRQcm9wcyxcbiAgICBzZXRDb250ZW50OiBzZXRDb250ZW50LFxuICAgIHNob3c6IHNob3csXG4gICAgaGlkZTogaGlkZSxcbiAgICBoaWRlV2l0aEludGVyYWN0aXZpdHk6IGhpZGVXaXRoSW50ZXJhY3Rpdml0eSxcbiAgICBlbmFibGU6IGVuYWJsZSxcbiAgICBkaXNhYmxlOiBkaXNhYmxlLFxuICAgIHVubW91bnQ6IHVubW91bnQsXG4gICAgZGVzdHJveTogZGVzdHJveVxuICB9OyAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB3aHkgdGhpcyBlYXJseSByZXR1cm4gY2F1c2VzIGEgVERaIGVycm9yIGluIHRoZSB0ZXN0cyDigJRcbiAgLy8gaXQgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiBpbiB0aGUgYnJvd3NlclxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gIGlmICghcHJvcHMucmVuZGVyKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGVycm9yV2hlbih0cnVlLCAncmVuZGVyKCkgZnVuY3Rpb24gaGFzIG5vdCBiZWVuIHN1cHBsaWVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbCBtdXRhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICB2YXIgX3Byb3BzJHJlbmRlciA9IHByb3BzLnJlbmRlcihpbnN0YW5jZSksXG4gICAgICBwb3BwZXIgPSBfcHJvcHMkcmVuZGVyLnBvcHBlcixcbiAgICAgIG9uVXBkYXRlID0gX3Byb3BzJHJlbmRlci5vblVwZGF0ZTtcblxuICBwb3BwZXIuc2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LXJvb3QnLCAnJyk7XG4gIHBvcHBlci5pZCA9IFwidGlwcHktXCIgKyBpbnN0YW5jZS5pZDtcbiAgaW5zdGFuY2UucG9wcGVyID0gcG9wcGVyO1xuICByZWZlcmVuY2UuX3RpcHB5ID0gaW5zdGFuY2U7XG4gIHBvcHBlci5fdGlwcHkgPSBpbnN0YW5jZTtcbiAgdmFyIHBsdWdpbnNIb29rcyA9IHBsdWdpbnMubWFwKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICByZXR1cm4gcGx1Z2luLmZuKGluc3RhbmNlKTtcbiAgfSk7XG4gIHZhciBoYXNBcmlhRXhwYW5kZWQgPSByZWZlcmVuY2UuaGFzQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gIGFkZExpc3RlbmVycygpO1xuICBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTtcbiAgaGFuZGxlU3R5bGVzKCk7XG4gIGludm9rZUhvb2soJ29uQ3JlYXRlJywgW2luc3RhbmNlXSk7XG5cbiAgaWYgKHByb3BzLnNob3dPbkNyZWF0ZSkge1xuICAgIHNjaGVkdWxlU2hvdygpO1xuICB9IC8vIFByZXZlbnQgYSB0aXBweSB3aXRoIGEgZGVsYXkgZnJvbSBoaWRpbmcgaWYgdGhlIGN1cnNvciBsZWZ0IHRoZW4gcmV0dXJuZWRcbiAgLy8gYmVmb3JlIGl0IHN0YXJ0ZWQgaGlkaW5nXG5cblxuICBwb3BwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiYgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICB9XG4gIH0pO1xuICBwb3BwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ21vdXNlZW50ZXInKSA+PSAwKSB7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZGVib3VuY2VkT25Nb3VzZU1vdmUpO1xuICAgICAgZGVib3VuY2VkT25Nb3VzZU1vdmUoZXZlbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBpbnN0YW5jZTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJIgUHJpdmF0ZSBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGZ1bmN0aW9uIGdldE5vcm1hbGl6ZWRUb3VjaFNldHRpbmdzKCkge1xuICAgIHZhciB0b3VjaCA9IGluc3RhbmNlLnByb3BzLnRvdWNoO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRvdWNoKSA/IHRvdWNoIDogW3RvdWNoLCAwXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpIHtcbiAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZFRvdWNoU2V0dGluZ3MoKVswXSA9PT0gJ2hvbGQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSB7XG4gICAgdmFyIF9pbnN0YW5jZSRwcm9wcyRyZW5kZTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gISEoKF9pbnN0YW5jZSRwcm9wcyRyZW5kZSA9IGluc3RhbmNlLnByb3BzLnJlbmRlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9pbnN0YW5jZSRwcm9wcyRyZW5kZS4kJHRpcHB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRUYXJnZXQoKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQgfHwgcmVmZXJlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIGdldENoaWxkcmVuKHBvcHBlcik7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREZWxheShpc1Nob3cpIHtcbiAgICAvLyBGb3IgdG91Y2ggb3Iga2V5Ym9hcmQgaW5wdXQsIGZvcmNlIGAwYCBkZWxheSBmb3IgVVggcmVhc29uc1xuICAgIC8vIEFsc28gaWYgdGhlIGluc3RhbmNlIGlzIG1vdW50ZWQgYnV0IG5vdCB2aXNpYmxlICh0cmFuc2l0aW9uaW5nIG91dCksXG4gICAgLy8gaWdub3JlIGRlbGF5XG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCAmJiAhaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlIHx8IGN1cnJlbnRJbnB1dC5pc1RvdWNoIHx8IGxhc3RUcmlnZ2VyRXZlbnQgJiYgbGFzdFRyaWdnZXJFdmVudC50eXBlID09PSAnZm9jdXMnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0VmFsdWVBdEluZGV4T3JSZXR1cm4oaW5zdGFuY2UucHJvcHMuZGVsYXksIGlzU2hvdyA/IDAgOiAxLCBkZWZhdWx0UHJvcHMuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3R5bGVzKCkge1xuICAgIHBvcHBlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiYgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgcG9wcGVyLnN0eWxlLnpJbmRleCA9IFwiXCIgKyBpbnN0YW5jZS5wcm9wcy56SW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VIb29rKGhvb2ssIGFyZ3MsIHNob3VsZEludm9rZVByb3BzSG9vaykge1xuICAgIGlmIChzaG91bGRJbnZva2VQcm9wc0hvb2sgPT09IHZvaWQgMCkge1xuICAgICAgc2hvdWxkSW52b2tlUHJvcHNIb29rID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwbHVnaW5zSG9va3MuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luSG9va3MpIHtcbiAgICAgIGlmIChwbHVnaW5Ib29rc1tob29rXSkge1xuICAgICAgICBwbHVnaW5Ib29rc1tob29rXS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHNob3VsZEludm9rZVByb3BzSG9vaykge1xuICAgICAgdmFyIF9pbnN0YW5jZSRwcm9wcztcblxuICAgICAgKF9pbnN0YW5jZSRwcm9wcyA9IGluc3RhbmNlLnByb3BzKVtob29rXS5hcHBseShfaW5zdGFuY2UkcHJvcHMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUFyaWFDb250ZW50QXR0cmlidXRlKCkge1xuICAgIHZhciBhcmlhID0gaW5zdGFuY2UucHJvcHMuYXJpYTtcblxuICAgIGlmICghYXJpYS5jb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGF0dHIgPSBcImFyaWEtXCIgKyBhcmlhLmNvbnRlbnQ7XG4gICAgdmFyIGlkID0gcG9wcGVyLmlkO1xuICAgIHZhciBub2RlcyA9IG5vcm1hbGl6ZVRvQXJyYXkoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyKTtcblxuICAgICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCBjdXJyZW50VmFsdWUgPyBjdXJyZW50VmFsdWUgKyBcIiBcIiArIGlkIDogaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5leHRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUucmVwbGFjZShpZCwgJycpLnRyaW0oKTtcblxuICAgICAgICBpZiAobmV4dFZhbHVlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV4dFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCkge1xuICAgIGlmIChoYXNBcmlhRXhwYW5kZWQgfHwgIWluc3RhbmNlLnByb3BzLmFyaWEuZXhwYW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgJiYgbm9kZSA9PT0gZ2V0Q3VycmVudFRhcmdldCgpID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKSB7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBtb3VzZU1vdmVMaXN0ZW5lcnMgPSBtb3VzZU1vdmVMaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGxpc3RlbmVyICE9PSBkZWJvdW5jZWRPbk1vdXNlTW92ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRG9jdW1lbnRQcmVzcyhldmVudCkge1xuICAgIC8vIE1vdmVkIGZpbmdlciB0byBzY3JvbGwgaW5zdGVhZCBvZiBhbiBpbnRlbnRpb25hbCB0YXAgb3V0c2lkZVxuICAgIGlmIChjdXJyZW50SW5wdXQuaXNUb3VjaCkge1xuICAgICAgaWYgKGRpZFRvdWNoTW92ZSB8fCBldmVudC50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSAvLyBDbGlja2VkIG9uIGludGVyYWN0aXZlIHBvcHBlclxuXG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiYgcG9wcGVyLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIENsaWNrZWQgb24gdGhlIGV2ZW50IGxpc3RlbmVycyB0YXJnZXRcblxuXG4gICAgaWYgKGdldEN1cnJlbnRUYXJnZXQoKS5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICBpZiAoY3VycmVudElucHV0LmlzVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlICYmIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignY2xpY2snKSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW52b2tlSG9vaygnb25DbGlja091dHNpZGUnLCBbaW5zdGFuY2UsIGV2ZW50XSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmhpZGVPbkNsaWNrID09PSB0cnVlKSB7XG4gICAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTsgLy8gYG1vdXNlZG93bmAgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYmVmb3JlIGBmb2N1c2AgaWYgcHJlc3NpbmcgdGhlXG4gICAgICAvLyBjdXJyZW50VGFyZ2V0LiBUaGlzIGxldHMgYSB0aXBweSB3aXRoIGBmb2N1c2AgdHJpZ2dlciBrbm93IHRoYXQgaXRcbiAgICAgIC8vIHNob3VsZCBub3Qgc2hvd1xuXG4gICAgICBkaWRIaWRlRHVlVG9Eb2N1bWVudE1vdXNlRG93biA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIH0pOyAvLyBUaGUgbGlzdGVuZXIgZ2V0cyBhZGRlZCBpbiBgc2NoZWR1bGVTaG93KClgLCBidXQgdGhpcyBtYXkgYmUgaGlkaW5nIGl0XG4gICAgICAvLyBiZWZvcmUgaXQgc2hvd3MsIGFuZCBoaWRlKCkncyBlYXJseSBiYWlsLW91dCBiZWhhdmlvciBjYW4gcHJldmVudCBpdFxuICAgICAgLy8gZnJvbSBiZWluZyBjbGVhbmVkIHVwXG5cbiAgICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIHJlbW92ZURvY3VtZW50UHJlc3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvblRvdWNoTW92ZSgpIHtcbiAgICBkaWRUb3VjaE1vdmUgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCkge1xuICAgIGRpZFRvdWNoTW92ZSA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkRG9jdW1lbnRQcmVzcygpIHtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Eb2N1bWVudFByZXNzLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbkRvY3VtZW50UHJlc3MsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIFRPVUNIX09QVElPTlMpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlRG9jdW1lbnRQcmVzcygpIHtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Eb2N1bWVudFByZXNzLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbkRvY3VtZW50UHJlc3MsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIFRPVUNIX09QVElPTlMpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UcmFuc2l0aW9uZWRPdXQoZHVyYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgb25UcmFuc2l0aW9uRW5kKGR1cmF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBwb3BwZXIucGFyZW50Tm9kZSAmJiBwb3BwZXIucGFyZW50Tm9kZS5jb250YWlucyhwb3BwZXIpKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvblRyYW5zaXRpb25lZEluKGR1cmF0aW9uLCBjYWxsYmFjaykge1xuICAgIG9uVHJhbnNpdGlvbkVuZChkdXJhdGlvbiwgY2FsbGJhY2spO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKGR1cmF0aW9uLCBjYWxsYmFjaykge1xuICAgIHZhciBib3ggPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpLmJveDtcblxuICAgIGZ1bmN0aW9uIGxpc3RlbmVyKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBib3gpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyKGJveCwgJ3JlbW92ZScsIGxpc3RlbmVyKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9IC8vIE1ha2UgY2FsbGJhY2sgc3luY2hyb25vdXMgaWYgZHVyYXRpb24gaXMgMFxuICAgIC8vIGB0cmFuc2l0aW9uZW5kYCB3b24ndCBmaXJlIG90aGVyd2lzZVxuXG5cbiAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lcihib3gsICdyZW1vdmUnLCBjdXJyZW50VHJhbnNpdGlvbkVuZExpc3RlbmVyKTtcbiAgICB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoYm94LCAnYWRkJywgbGlzdGVuZXIpO1xuICAgIGN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUsXG4gICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkTGlzdGVuZXJzKCkge1xuICAgIGlmIChnZXRJc0N1c3RvbVRvdWNoQmVoYXZpb3IoKSkge1xuICAgICAgb24oJ3RvdWNoc3RhcnQnLCBvblRyaWdnZXIsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBvbigndG91Y2hlbmQnLCBvbk1vdXNlTGVhdmUsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3BsaXRCeVNwYWNlcyhpbnN0YW5jZS5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudFR5cGUpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09ICdtYW51YWwnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb24oZXZlbnRUeXBlLCBvblRyaWdnZXIpO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICAgICAgICBvbignbW91c2VsZWF2ZScsIG9uTW91c2VMZWF2ZSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZm9jdXMnOlxuICAgICAgICAgIG9uKGlzSUUgPyAnZm9jdXNvdXQnIDogJ2JsdXInLCBvbkJsdXJPckZvY3VzT3V0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgICAgICBvbignZm9jdXNvdXQnLCBvbkJsdXJPckZvY3VzT3V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycygpIHtcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGUsXG4gICAgICAgICAgZXZlbnRUeXBlID0gX3JlZi5ldmVudFR5cGUsXG4gICAgICAgICAgaGFuZGxlciA9IF9yZWYuaGFuZGxlcixcbiAgICAgICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBvblRyaWdnZXIoZXZlbnQpIHtcbiAgICB2YXIgX2xhc3RUcmlnZ2VyRXZlbnQ7XG5cbiAgICB2YXIgc2hvdWxkU2NoZWR1bGVDbGlja0hpZGUgPSBmYWxzZTtcblxuICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkIHx8IGlzRXZlbnRMaXN0ZW5lclN0b3BwZWQoZXZlbnQpIHx8IGRpZEhpZGVEdWVUb0RvY3VtZW50TW91c2VEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhc0ZvY3VzZWQgPSAoKF9sYXN0VHJpZ2dlckV2ZW50ID0gbGFzdFRyaWdnZXJFdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9sYXN0VHJpZ2dlckV2ZW50LnR5cGUpID09PSAnZm9jdXMnO1xuICAgIGxhc3RUcmlnZ2VyRXZlbnQgPSBldmVudDtcbiAgICBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTtcblxuICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlICYmIGlzTW91c2VFdmVudChldmVudCkpIHtcbiAgICAgIC8vIElmIHNjcm9sbGluZywgYG1vdXNlZW50ZXJgIGV2ZW50cyBjYW4gYmUgZmlyZWQgaWYgdGhlIGN1cnNvciBsYW5kc1xuICAgICAgLy8gb3ZlciBhIG5ldyB0YXJnZXQsIGJ1dCBgbW91c2Vtb3ZlYCBldmVudHMgZG9uJ3QgZ2V0IGZpcmVkLiBUaGlzXG4gICAgICAvLyBjYXVzZXMgaW50ZXJhY3RpdmUgdG9vbHRpcHMgdG8gZ2V0IHN0dWNrIG9wZW4gdW50aWwgdGhlIGN1cnNvciBpc1xuICAgICAgLy8gbW92ZWRcbiAgICAgIG1vdXNlTW92ZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfSAvLyBUb2dnbGUgc2hvdy9oaWRlIHdoZW4gY2xpY2tpbmcgY2xpY2stdHJpZ2dlcmVkIHRvb2x0aXBzXG5cblxuICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snICYmIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ21vdXNlZW50ZXInKSA8IDAgfHwgaXNWaXNpYmxlRnJvbUNsaWNrKSAmJiBpbnN0YW5jZS5wcm9wcy5oaWRlT25DbGljayAhPT0gZmFsc2UgJiYgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlU2hvdyhldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlzVmlzaWJsZUZyb21DbGljayA9ICFzaG91bGRTY2hlZHVsZUNsaWNrSGlkZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkU2NoZWR1bGVDbGlja0hpZGUgJiYgIXdhc0ZvY3VzZWQpIHtcbiAgICAgIHNjaGVkdWxlSGlkZShldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciBpc0N1cnNvck92ZXJSZWZlcmVuY2VPclBvcHBlciA9IGdldEN1cnJlbnRUYXJnZXQoKS5jb250YWlucyh0YXJnZXQpIHx8IHBvcHBlci5jb250YWlucyh0YXJnZXQpO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnICYmIGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBvcHBlclRyZWVEYXRhID0gZ2V0TmVzdGVkUG9wcGVyVHJlZSgpLmNvbmNhdChwb3BwZXIpLm1hcChmdW5jdGlvbiAocG9wcGVyKSB7XG4gICAgICB2YXIgX2luc3RhbmNlJHBvcHBlckluc3RhO1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSBwb3BwZXIuX3RpcHB5O1xuICAgICAgdmFyIHN0YXRlID0gKF9pbnN0YW5jZSRwb3BwZXJJbnN0YSA9IGluc3RhbmNlLnBvcHBlckluc3RhbmNlKSA9PSBudWxsID8gdm9pZCAwIDogX2luc3RhbmNlJHBvcHBlckluc3RhLnN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwb3BwZXJSZWN0OiBwb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgcG9wcGVyU3RhdGU6IHN0YXRlLFxuICAgICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAoaXNDdXJzb3JPdXRzaWRlSW50ZXJhY3RpdmVCb3JkZXIocG9wcGVyVHJlZURhdGEsIGV2ZW50KSkge1xuICAgICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICAgIHNjaGVkdWxlSGlkZShldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJhaWwgPSBpc0V2ZW50TGlzdGVuZXJTdG9wcGVkKGV2ZW50KSB8fCBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2NsaWNrJykgPj0gMCAmJiBpc1Zpc2libGVGcm9tQ2xpY2s7XG5cbiAgICBpZiAoc2hvdWxkQmFpbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgaW5zdGFuY2UuaGlkZVdpdGhJbnRlcmFjdGl2aXR5KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlZHVsZUhpZGUoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25CbHVyT3JGb2N1c091dChldmVudCkge1xuICAgIGlmIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2ZvY3VzaW4nKSA8IDAgJiYgZXZlbnQudGFyZ2V0ICE9PSBnZXRDdXJyZW50VGFyZ2V0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIGZvY3VzIHdhcyBtb3ZlZCB0byB3aXRoaW4gdGhlIHBvcHBlclxuXG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiYgZXZlbnQucmVsYXRlZFRhcmdldCAmJiBwb3BwZXIuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlZHVsZUhpZGUoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNFdmVudExpc3RlbmVyU3RvcHBlZChldmVudCkge1xuICAgIHJldHVybiBjdXJyZW50SW5wdXQuaXNUb3VjaCA/IGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpICE9PSBldmVudC50eXBlLmluZGV4T2YoJ3RvdWNoJykgPj0gMCA6IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUG9wcGVySW5zdGFuY2UoKSB7XG4gICAgZGVzdHJveVBvcHBlckluc3RhbmNlKCk7XG4gICAgdmFyIF9pbnN0YW5jZSRwcm9wczIgPSBpbnN0YW5jZS5wcm9wcyxcbiAgICAgICAgcG9wcGVyT3B0aW9ucyA9IF9pbnN0YW5jZSRwcm9wczIucG9wcGVyT3B0aW9ucyxcbiAgICAgICAgcGxhY2VtZW50ID0gX2luc3RhbmNlJHByb3BzMi5wbGFjZW1lbnQsXG4gICAgICAgIG9mZnNldCA9IF9pbnN0YW5jZSRwcm9wczIub2Zmc2V0LFxuICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0ID0gX2luc3RhbmNlJHByb3BzMi5nZXRSZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgICAgICBtb3ZlVHJhbnNpdGlvbiA9IF9pbnN0YW5jZSRwcm9wczIubW92ZVRyYW5zaXRpb247XG4gICAgdmFyIGFycm93ID0gZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSA/IGdldENoaWxkcmVuKHBvcHBlcikuYXJyb3cgOiBudWxsO1xuICAgIHZhciBjb21wdXRlZFJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZUNsaWVudFJlY3QgPyB7XG4gICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6IGdldFJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgICBjb250ZXh0RWxlbWVudDogZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdC5jb250ZXh0RWxlbWVudCB8fCBnZXRDdXJyZW50VGFyZ2V0KClcbiAgICB9IDogcmVmZXJlbmNlO1xuICAgIHZhciB0aXBweU1vZGlmaWVyID0ge1xuICAgICAgbmFtZTogJyQkdGlwcHknLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICAgICAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddLFxuICAgICAgZm46IGZ1bmN0aW9uIGZuKF9yZWYyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuXG4gICAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgICAgdmFyIF9nZXREZWZhdWx0VGVtcGxhdGVDaCA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCksXG4gICAgICAgICAgICAgIGJveCA9IF9nZXREZWZhdWx0VGVtcGxhdGVDaC5ib3g7XG5cbiAgICAgICAgICBbJ3BsYWNlbWVudCcsICdyZWZlcmVuY2UtaGlkZGVuJywgJ2VzY2FwZWQnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgICBpZiAoYXR0ciA9PT0gJ3BsYWNlbWVudCcpIHtcbiAgICAgICAgICAgICAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZW1lbnQnLCBzdGF0ZS5wbGFjZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyW1wiZGF0YS1wb3BwZXItXCIgKyBhdHRyXSkge1xuICAgICAgICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoXCJkYXRhLVwiICsgYXR0ciwgJycpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLVwiICsgYXR0cik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbW9kaWZpZXJzID0gW3tcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgdG9wOiAyLFxuICAgICAgICAgIGJvdHRvbTogMixcbiAgICAgICAgICBsZWZ0OiA1LFxuICAgICAgICAgIHJpZ2h0OiA1XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZGRpbmc6IDVcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGFkYXB0aXZlOiAhbW92ZVRyYW5zaXRpb25cbiAgICAgIH1cbiAgICB9LCB0aXBweU1vZGlmaWVyXTtcblxuICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpICYmIGFycm93KSB7XG4gICAgICBtb2RpZmllcnMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdhcnJvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbGVtZW50OiBhcnJvdyxcbiAgICAgICAgICBwYWRkaW5nOiAzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGlmaWVycy5wdXNoLmFwcGx5KG1vZGlmaWVycywgKHBvcHBlck9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcHBlck9wdGlvbnMubW9kaWZpZXJzKSB8fCBbXSk7XG4gICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UgPSBjb3JlLmNyZWF0ZVBvcHBlcihjb21wdXRlZFJlZmVyZW5jZSwgcG9wcGVyLCBPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJPcHRpb25zLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIG9uRmlyc3RVcGRhdGU6IG9uRmlyc3RVcGRhdGUsXG4gICAgICBtb2RpZmllcnM6IG1vZGlmaWVyc1xuICAgIH0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lQb3BwZXJJbnN0YW5jZSgpIHtcbiAgICBpZiAoaW5zdGFuY2UucG9wcGVySW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VudCgpIHtcbiAgICB2YXIgYXBwZW5kVG8gPSBpbnN0YW5jZS5wcm9wcy5hcHBlbmRUbztcbiAgICB2YXIgcGFyZW50Tm9kZTsgLy8gQnkgZGVmYXVsdCwgd2UnbGwgYXBwZW5kIHRoZSBwb3BwZXIgdG8gdGhlIHRyaWdnZXJUYXJnZXRzJ3MgcGFyZW50Tm9kZSBzb1xuICAgIC8vIGl0J3MgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50IHNvIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlXG4gICAgLy8gdGlwcHkgY2FuIGJlIHRhYmJlZCB0b1xuICAgIC8vIElmIHRoZXJlIGFyZSBjbGlwcGluZyBpc3N1ZXMsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IGFwcGVuZFRvXG4gICAgLy8gYW5kIGVuc3VyZSBmb2N1cyBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgY29ycmVjdGx5IG1hbnVhbGx5XG5cbiAgICB2YXIgbm9kZSA9IGdldEN1cnJlbnRUYXJnZXQoKTtcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBhcHBlbmRUbyA9PT0gZGVmYXVsdFByb3BzLmFwcGVuZFRvIHx8IGFwcGVuZFRvID09PSAncGFyZW50Jykge1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZSA9IGludm9rZVdpdGhBcmdzT3JSZXR1cm4oYXBwZW5kVG8sIFtub2RlXSk7XG4gICAgfSAvLyBUaGUgcG9wcGVyIGVsZW1lbnQgbmVlZHMgdG8gZXhpc3Qgb24gdGhlIERPTSBiZWZvcmUgaXRzIHBvc2l0aW9uIGNhbiBiZVxuICAgIC8vIHVwZGF0ZWQgYXMgUG9wcGVyIG5lZWRzIHRvIHJlYWQgaXRzIGRpbWVuc2lvbnNcblxuXG4gICAgaWYgKCFwYXJlbnROb2RlLmNvbnRhaW5zKHBvcHBlcikpIHtcbiAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocG9wcGVyKTtcbiAgICB9XG5cbiAgICBjcmVhdGVQb3BwZXJJbnN0YW5jZSgpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgLy8gQWNjZXNzaWJpbGl0eSBjaGVja1xuICAgICAgd2FybldoZW4oaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiYgYXBwZW5kVG8gPT09IGRlZmF1bHRQcm9wcy5hcHBlbmRUbyAmJiBub2RlLm5leHRFbGVtZW50U2libGluZyAhPT0gcG9wcGVyLCBbJ0ludGVyYWN0aXZlIHRpcHB5IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHZpYSBrZXlib2FyZCcsICduYXZpZ2F0aW9uIGJlY2F1c2UgaXQgaXMgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSByZWZlcmVuY2UgZWxlbWVudCcsICdpbiB0aGUgRE9NIHNvdXJjZSBvcmRlci4nLCAnXFxuXFxuJywgJ1VzaW5nIGEgd3JhcHBlciA8ZGl2PiBvciA8c3Bhbj4gdGFnIGFyb3VuZCB0aGUgcmVmZXJlbmNlIGVsZW1lbnQnLCAnc29sdmVzIHRoaXMgYnkgY3JlYXRpbmcgYSBuZXcgcGFyZW50Tm9kZSBjb250ZXh0LicsICdcXG5cXG4nLCAnU3BlY2lmeWluZyBgYXBwZW5kVG86IGRvY3VtZW50LmJvZHlgIHNpbGVuY2VzIHRoaXMgd2FybmluZywgYnV0IGl0JywgJ2Fzc3VtZXMgeW91IGFyZSB1c2luZyBhIGZvY3VzIG1hbmFnZW1lbnQgc29sdXRpb24gdG8gaGFuZGxlJywgJ2tleWJvYXJkIG5hdmlnYXRpb24uJywgJ1xcblxcbicsICdTZWU6IGh0dHBzOi8vYXRvbWlrcy5naXRodWIuaW8vdGlwcHlqcy92Ni9hY2Nlc3NpYmlsaXR5LyNpbnRlcmFjdGl2aXR5J10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXROZXN0ZWRQb3BwZXJUcmVlKCkge1xuICAgIHJldHVybiBhcnJheUZyb20ocG9wcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRpcHB5LXJvb3RdJykpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVTaG93KGV2ZW50KSB7XG4gICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGludm9rZUhvb2soJ29uVHJpZ2dlcicsIFtpbnN0YW5jZSwgZXZlbnRdKTtcbiAgICB9XG5cbiAgICBhZGREb2N1bWVudFByZXNzKCk7XG4gICAgdmFyIGRlbGF5ID0gZ2V0RGVsYXkodHJ1ZSk7XG5cbiAgICB2YXIgX2dldE5vcm1hbGl6ZWRUb3VjaFNlID0gZ2V0Tm9ybWFsaXplZFRvdWNoU2V0dGluZ3MoKSxcbiAgICAgICAgdG91Y2hWYWx1ZSA9IF9nZXROb3JtYWxpemVkVG91Y2hTZVswXSxcbiAgICAgICAgdG91Y2hEZWxheSA9IF9nZXROb3JtYWxpemVkVG91Y2hTZVsxXTtcblxuICAgIGlmIChjdXJyZW50SW5wdXQuaXNUb3VjaCAmJiB0b3VjaFZhbHVlID09PSAnaG9sZCcgJiYgdG91Y2hEZWxheSkge1xuICAgICAgZGVsYXkgPSB0b3VjaERlbGF5O1xuICAgIH1cblxuICAgIGlmIChkZWxheSkge1xuICAgICAgc2hvd1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVIaWRlKGV2ZW50KSB7XG4gICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG4gICAgaW52b2tlSG9vaygnb25VbnRyaWdnZXInLCBbaW5zdGFuY2UsIGV2ZW50XSk7XG5cbiAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgcmVtb3ZlRG9jdW1lbnRQcmVzcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRm9yIGludGVyYWN0aXZlIHRpcHBpZXMsIHNjaGVkdWxlSGlkZSBpcyBhZGRlZCB0byBhIGRvY3VtZW50LmJvZHkgaGFuZGxlclxuICAgIC8vIGZyb20gb25Nb3VzZUxlYXZlIHNvIG11c3QgaW50ZXJjZXB0IHNjaGVkdWxlZCBoaWRlcyBmcm9tIG1vdXNlbW92ZS9sZWF2ZVxuICAgIC8vIGV2ZW50cyB3aGVuIHRyaWdnZXIgY29udGFpbnMgbW91c2VlbnRlciBhbmQgY2xpY2ssIGFuZCB0aGUgdGlwIGlzXG4gICAgLy8gY3VycmVudGx5IHNob3duIGFzIGEgcmVzdWx0IG9mIGEgY2xpY2suXG5cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ21vdXNlZW50ZXInKSA+PSAwICYmIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignY2xpY2snKSA+PSAwICYmIFsnbW91c2VsZWF2ZScsICdtb3VzZW1vdmUnXS5pbmRleE9mKGV2ZW50LnR5cGUpID49IDAgJiYgaXNWaXNpYmxlRnJvbUNsaWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGF5ID0gZ2V0RGVsYXkoZmFsc2UpO1xuXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpeGVzIGEgYHRyYW5zaXRpb25lbmRgIHByb2JsZW0gd2hlbiBpdCBmaXJlcyAxIGZyYW1lIHRvb1xuICAgICAgLy8gbGF0ZSBzb21ldGltZXMsIHdlIGRvbid0IHdhbnQgaGlkZSgpIHRvIGJlIGNhbGxlZC5cbiAgICAgIHNjaGVkdWxlSGlkZUFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5zdGFuY2UuaGlkZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SRIFB1YmxpYyBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbiAgZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgIGluc3RhbmNlLnN0YXRlLmlzRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgIC8vIERpc2FibGluZyB0aGUgaW5zdGFuY2Ugc2hvdWxkIGFsc28gaGlkZSBpdFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5LmpzLXJlYWN0L2lzc3Vlcy8xMDZcbiAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckRlbGF5VGltZW91dHMoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHNob3dUaW1lb3V0KTtcbiAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjaGVkdWxlSGlkZUFuaW1hdGlvbkZyYW1lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFByb3BzKHBhcnRpYWxQcm9wcykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnc2V0UHJvcHMnKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25CZWZvcmVVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgIHZhciBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gZXZhbHVhdGVQcm9wcyhyZWZlcmVuY2UsIE9iamVjdC5hc3NpZ24oe30sIGluc3RhbmNlLnByb3BzLCB7fSwgcGFydGlhbFByb3BzLCB7XG4gICAgICBpZ25vcmVBdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSkpO1xuICAgIGluc3RhbmNlLnByb3BzID0gbmV4dFByb3BzO1xuICAgIGFkZExpc3RlbmVycygpO1xuXG4gICAgaWYgKHByZXZQcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlICE9PSBuZXh0UHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZSkge1xuICAgICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICAgIGRlYm91bmNlZE9uTW91c2VNb3ZlID0gZGVib3VuY2Uob25Nb3VzZU1vdmUsIG5leHRQcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlKTtcbiAgICB9IC8vIEVuc3VyZSBzdGFsZSBhcmlhLWV4cGFuZGVkIGF0dHJpYnV0ZXMgYXJlIHJlbW92ZWRcblxuXG4gICAgaWYgKHByZXZQcm9wcy50cmlnZ2VyVGFyZ2V0ICYmICFuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgbm9ybWFsaXplVG9BcnJheShwcmV2UHJvcHMudHJpZ2dlclRhcmdldCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgcmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgIH1cblxuICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuICAgIGhhbmRsZVN0eWxlcygpO1xuXG4gICAgaWYgKG9uVXBkYXRlKSB7XG4gICAgICBvblVwZGF0ZShwcmV2UHJvcHMsIG5leHRQcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnBvcHBlckluc3RhbmNlKSB7XG4gICAgICBjcmVhdGVQb3BwZXJJbnN0YW5jZSgpOyAvLyBGaXhlcyBhbiBpc3N1ZSB3aXRoIG5lc3RlZCB0aXBwaWVzIGlmIHRoZXkgYXJlIGFsbCBnZXR0aW5nIHJlLXJlbmRlcmVkLFxuICAgICAgLy8gYW5kIHRoZSBuZXN0ZWQgb25lcyBnZXQgcmUtcmVuZGVyZWQgZmlyc3QuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXRvbWlrcy90aXBweWpzLXJlYWN0L2lzc3Vlcy8xNzdcbiAgICAgIC8vIFRPRE86IGZpbmQgYSBjbGVhbmVyIC8gbW9yZSBlZmZpY2llbnQgc29sdXRpb24oISlcblxuICAgICAgZ2V0TmVzdGVkUG9wcGVyVHJlZSgpLmZvckVhY2goZnVuY3Rpb24gKG5lc3RlZFBvcHBlcikge1xuICAgICAgICAvLyBSZWFjdCAoYW5kIG90aGVyIFVJIGxpYnMgbGlrZWx5KSByZXF1aXJlcyBhIHJBRiB3cmFwcGVyIGFzIGl0IGZsdXNoZXNcbiAgICAgICAgLy8gaXRzIHdvcmsgaW4gb25lXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShuZXN0ZWRQb3BwZXIuX3RpcHB5LnBvcHBlckluc3RhbmNlLmZvcmNlVXBkYXRlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGludm9rZUhvb2soJ29uQWZ0ZXJVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgY29udGVudDogY29udGVudFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdygpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ3Nob3cnKSk7XG4gICAgfSAvLyBFYXJseSBiYWlsLW91dFxuXG5cbiAgICB2YXIgaXNBbHJlYWR5VmlzaWJsZSA9IGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZDtcbiAgICB2YXIgaXNEaXNhYmxlZCA9ICFpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQ7XG4gICAgdmFyIGlzVG91Y2hBbmRUb3VjaERpc2FibGVkID0gY3VycmVudElucHV0LmlzVG91Y2ggJiYgIWluc3RhbmNlLnByb3BzLnRvdWNoO1xuICAgIHZhciBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKGluc3RhbmNlLnByb3BzLmR1cmF0aW9uLCAwLCBkZWZhdWx0UHJvcHMuZHVyYXRpb24pO1xuXG4gICAgaWYgKGlzQWxyZWFkeVZpc2libGUgfHwgaXNEZXN0cm95ZWQgfHwgaXNEaXNhYmxlZCB8fCBpc1RvdWNoQW5kVG91Y2hEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gTm9ybWFsaXplIGBkaXNhYmxlZGAgYmVoYXZpb3IgYWNyb3NzIGJyb3dzZXJzLlxuICAgIC8vIEZpcmVmb3ggYWxsb3dzIGV2ZW50cyBvbiBkaXNhYmxlZCBlbGVtZW50cywgYnV0IENocm9tZSBkb2Vzbid0LlxuICAgIC8vIFVzaW5nIGEgd3JhcHBlciBlbGVtZW50IChpLmUuIDxzcGFuPikgaXMgcmVjb21tZW5kZWQuXG5cblxuICAgIGlmIChnZXRDdXJyZW50VGFyZ2V0KCkuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25TaG93JywgW2luc3RhbmNlXSwgZmFsc2UpO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLm9uU2hvdyhpbnN0YW5jZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlID0gdHJ1ZTtcblxuICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICBwb3BwZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBoYW5kbGVTdHlsZXMoKTtcbiAgICBhZGREb2N1bWVudFByZXNzKCk7XG5cbiAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgcG9wcGVyLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgfSAvLyBJZiBmbGlwcGluZyB0byB0aGUgb3Bwb3NpdGUgc2lkZSBhZnRlciBoaWRpbmcgYXQgbGVhc3Qgb25jZSwgdGhlXG4gICAgLy8gYW5pbWF0aW9uIHdpbGwgdXNlIHRoZSB3cm9uZyBwbGFjZW1lbnQgd2l0aG91dCByZXNldHRpbmcgdGhlIGR1cmF0aW9uXG5cblxuICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICB2YXIgX2dldERlZmF1bHRUZW1wbGF0ZUNoMiA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCksXG4gICAgICAgICAgYm94ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoMi5ib3gsXG4gICAgICAgICAgY29udGVudCA9IF9nZXREZWZhdWx0VGVtcGxhdGVDaDIuY29udGVudDtcblxuICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCAwKTtcbiAgICB9XG5cbiAgICBvbkZpcnN0VXBkYXRlID0gZnVuY3Rpb24gb25GaXJzdFVwZGF0ZSgpIHtcbiAgICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlIHx8IGlnbm9yZU9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZ25vcmVPbkZpcnN0VXBkYXRlID0gdHJ1ZTsgLy8gcmVmbG93XG5cbiAgICAgIHZvaWQgcG9wcGVyLm9mZnNldEhlaWdodDtcbiAgICAgIHBvcHBlci5zdHlsZS50cmFuc2l0aW9uID0gaW5zdGFuY2UucHJvcHMubW92ZVRyYW5zaXRpb247XG5cbiAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpICYmIGluc3RhbmNlLnByb3BzLmFuaW1hdGlvbikge1xuICAgICAgICB2YXIgX2dldERlZmF1bHRUZW1wbGF0ZUNoMyA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCksXG4gICAgICAgICAgICBfYm94ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoMy5ib3gsXG4gICAgICAgICAgICBfY29udGVudCA9IF9nZXREZWZhdWx0VGVtcGxhdGVDaDMuY29udGVudDtcblxuICAgICAgICBzZXRUcmFuc2l0aW9uRHVyYXRpb24oW19ib3gsIF9jb250ZW50XSwgZHVyYXRpb24pO1xuICAgICAgICBzZXRWaXNpYmlsaXR5U3RhdGUoW19ib3gsIF9jb250ZW50XSwgJ3Zpc2libGUnKTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKTtcbiAgICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuICAgICAgcHVzaElmVW5pcXVlKG1vdW50ZWRJbnN0YW5jZXMsIGluc3RhbmNlKTtcbiAgICAgIGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICBpbnZva2VIb29rKCdvbk1vdW50JywgW2luc3RhbmNlXSk7XG5cbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5hbmltYXRpb24gJiYgZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgICBvblRyYW5zaXRpb25lZEluKGR1cmF0aW9uLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdGFuY2Uuc3RhdGUuaXNTaG93biA9IHRydWU7XG4gICAgICAgICAgaW52b2tlSG9vaygnb25TaG93bicsIFtpbnN0YW5jZV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbW91bnQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdoaWRlJykpO1xuICAgIH0gLy8gRWFybHkgYmFpbC1vdXRcblxuXG4gICAgdmFyIGlzQWxyZWFkeUhpZGRlbiA9ICFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGU7XG4gICAgdmFyIGlzRGVzdHJveWVkID0gaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQ7XG4gICAgdmFyIGlzRGlzYWJsZWQgPSAhaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkO1xuICAgIHZhciBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKGluc3RhbmNlLnByb3BzLmR1cmF0aW9uLCAxLCBkZWZhdWx0UHJvcHMuZHVyYXRpb24pO1xuXG4gICAgaWYgKGlzQWxyZWFkeUhpZGRlbiB8fCBpc0Rlc3Ryb3llZCB8fCBpc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25IaWRlJywgW2luc3RhbmNlXSwgZmFsc2UpO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLm9uSGlkZShpbnN0YW5jZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNTaG93biA9IGZhbHNlO1xuICAgIGlnbm9yZU9uRmlyc3RVcGRhdGUgPSBmYWxzZTtcbiAgICBpc1Zpc2libGVGcm9tQ2xpY2sgPSBmYWxzZTtcblxuICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICBwb3BwZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnRlcmFjdGl2ZU1vdXNlTGlzdGVuZXJzKCk7XG4gICAgcmVtb3ZlRG9jdW1lbnRQcmVzcygpO1xuICAgIGhhbmRsZVN0eWxlcygpO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHZhciBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2g0ID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKSxcbiAgICAgICAgICBib3ggPSBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2g0LmJveCxcbiAgICAgICAgICBjb250ZW50ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoNC5jb250ZW50O1xuXG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgIHNldFRyYW5zaXRpb25EdXJhdGlvbihbYm94LCBjb250ZW50XSwgZHVyYXRpb24pO1xuICAgICAgICBzZXRWaXNpYmlsaXR5U3RhdGUoW2JveCwgY29udGVudF0sICdoaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVBcmlhQ29udGVudEF0dHJpYnV0ZSgpO1xuICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmFuaW1hdGlvbikge1xuICAgICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgICAgb25UcmFuc2l0aW9uZWRPdXQoZHVyYXRpb24sIGluc3RhbmNlLnVubW91bnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS51bm1vdW50KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVdpdGhJbnRlcmFjdGl2aXR5KGV2ZW50KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdoaWRlV2l0aEludGVyYWN0aXZpdHknKSk7XG4gICAgfVxuXG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBwdXNoSWZVbmlxdWUobW91c2VNb3ZlTGlzdGVuZXJzLCBkZWJvdW5jZWRPbk1vdXNlTW92ZSk7XG4gICAgZGVib3VuY2VkT25Nb3VzZU1vdmUoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ3VubW91bnQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgaW5zdGFuY2UuaGlkZSgpO1xuICAgIH1cblxuICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVzdHJveVBvcHBlckluc3RhbmNlKCk7IC8vIElmIGEgcG9wcGVyIGlzIG5vdCBpbnRlcmFjdGl2ZSwgaXQgd2lsbCBiZSBhcHBlbmRlZCBvdXRzaWRlIHRoZSBwb3BwZXJcbiAgICAvLyB0cmVlIGJ5IGRlZmF1bHQuIFRoaXMgc2VlbXMgbWFpbmx5IGZvciBpbnRlcmFjdGl2ZSB0aXBwaWVzLCBidXQgd2Ugc2hvdWxkXG4gICAgLy8gZmluZCBhIHdvcmthcm91bmQgaWYgcG9zc2libGVcblxuICAgIGdldE5lc3RlZFBvcHBlclRyZWUoKS5mb3JFYWNoKGZ1bmN0aW9uIChuZXN0ZWRQb3BwZXIpIHtcbiAgICAgIG5lc3RlZFBvcHBlci5fdGlwcHkudW5tb3VudCgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHBvcHBlci5wYXJlbnROb2RlKSB7XG4gICAgICBwb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwb3BwZXIpO1xuICAgIH1cblxuICAgIG1vdW50ZWRJbnN0YW5jZXMgPSBtb3VudGVkSW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkgIT09IGluc3RhbmNlO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGludm9rZUhvb2soJ29uSGlkZGVuJywgW2luc3RhbmNlXSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnZGVzdHJveScpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICBpbnN0YW5jZS51bm1vdW50KCk7XG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgZGVsZXRlIHJlZmVyZW5jZS5fdGlwcHk7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIGludm9rZUhvb2soJ29uRGVzdHJveScsIFtpbnN0YW5jZV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRpcHB5KHRhcmdldHMsIG9wdGlvbmFsUHJvcHMpIHtcbiAgaWYgKG9wdGlvbmFsUHJvcHMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbmFsUHJvcHMgPSB7fTtcbiAgfVxuXG4gIHZhciBwbHVnaW5zID0gZGVmYXVsdFByb3BzLnBsdWdpbnMuY29uY2F0KG9wdGlvbmFsUHJvcHMucGx1Z2lucyB8fCBbXSk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YWxpZGF0ZVRhcmdldHModGFyZ2V0cyk7XG4gICAgdmFsaWRhdGVQcm9wcyhvcHRpb25hbFByb3BzLCBwbHVnaW5zKTtcbiAgfVxuXG4gIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpO1xuICB2YXIgcGFzc2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25hbFByb3BzLCB7XG4gICAgcGx1Z2luczogcGx1Z2luc1xuICB9KTtcbiAgdmFyIGVsZW1lbnRzID0gZ2V0QXJyYXlPZkVsZW1lbnRzKHRhcmdldHMpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmFyIGlzU2luZ2xlQ29udGVudEVsZW1lbnQgPSBpc0VsZW1lbnQocGFzc2VkUHJvcHMuY29udGVudCk7XG4gICAgdmFyIGlzTW9yZVRoYW5PbmVSZWZlcmVuY2VFbGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMTtcbiAgICB3YXJuV2hlbihpc1NpbmdsZUNvbnRlbnRFbGVtZW50ICYmIGlzTW9yZVRoYW5PbmVSZWZlcmVuY2VFbGVtZW50LCBbJ3RpcHB5KCkgd2FzIHBhc3NlZCBhbiBFbGVtZW50IGFzIHRoZSBgY29udGVudGAgcHJvcCwgYnV0IG1vcmUgdGhhbicsICdvbmUgdGlwcHkgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgYnkgdGhpcyBpbnZvY2F0aW9uLiBUaGlzIG1lYW5zIHRoZScsICdjb250ZW50IGVsZW1lbnQgd2lsbCBvbmx5IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IHRpcHB5IGluc3RhbmNlLicsICdcXG5cXG4nLCAnSW5zdGVhZCwgcGFzcyB0aGUgLmlubmVySFRNTCBvZiB0aGUgZWxlbWVudCwgb3IgdXNlIGEgZnVuY3Rpb24gdGhhdCcsICdyZXR1cm5zIGEgY2xvbmVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgaW5zdGVhZC4nLCAnXFxuXFxuJywgJzEpIGNvbnRlbnQ6IGVsZW1lbnQuaW5uZXJIVE1MXFxuJywgJzIpIGNvbnRlbnQ6ICgpID0+IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpJ10uam9pbignICcpKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZXMgPSBlbGVtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcmVmZXJlbmNlKSB7XG4gICAgdmFyIGluc3RhbmNlID0gcmVmZXJlbmNlICYmIGNyZWF0ZVRpcHB5KHJlZmVyZW5jZSwgcGFzc2VkUHJvcHMpO1xuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBhY2MucHVzaChpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xuICByZXR1cm4gaXNFbGVtZW50KHRhcmdldHMpID8gaW5zdGFuY2VzWzBdIDogaW5zdGFuY2VzO1xufVxuXG50aXBweS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG50aXBweS5zZXREZWZhdWx0UHJvcHMgPSBzZXREZWZhdWx0UHJvcHM7XG50aXBweS5jdXJyZW50SW5wdXQgPSBjdXJyZW50SW5wdXQ7XG52YXIgaGlkZUFsbCA9IGZ1bmN0aW9uIGhpZGVBbGwoX3RlbXApIHtcbiAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgIGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSA9IF9yZWYuZXhjbHVkZSxcbiAgICAgIGR1cmF0aW9uID0gX3JlZi5kdXJhdGlvbjtcblxuICBtb3VudGVkSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgdmFyIGlzRXhjbHVkZWQgPSBmYWxzZTtcblxuICAgIGlmIChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UpIHtcbiAgICAgIGlzRXhjbHVkZWQgPSBpc1JlZmVyZW5jZUVsZW1lbnQoZXhjbHVkZWRSZWZlcmVuY2VPckluc3RhbmNlKSA/IGluc3RhbmNlLnJlZmVyZW5jZSA9PT0gZXhjbHVkZWRSZWZlcmVuY2VPckluc3RhbmNlIDogaW5zdGFuY2UucG9wcGVyID09PSBleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UucG9wcGVyO1xuICAgIH1cblxuICAgIGlmICghaXNFeGNsdWRlZCkge1xuICAgICAgdmFyIG9yaWdpbmFsRHVyYXRpb24gPSBpbnN0YW5jZS5wcm9wcy5kdXJhdGlvbjtcbiAgICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uXG4gICAgICB9KTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgZHVyYXRpb246IG9yaWdpbmFsRHVyYXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBjcmVhdGVTaW5nbGV0b24gPSBmdW5jdGlvbiBjcmVhdGVTaW5nbGV0b24odGlwcHlJbnN0YW5jZXMsIG9wdGlvbmFsUHJvcHMpIHtcbiAgaWYgKG9wdGlvbmFsUHJvcHMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbmFsUHJvcHMgPSB7fTtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgZXJyb3JXaGVuKCFBcnJheS5pc0FycmF5KHRpcHB5SW5zdGFuY2VzKSwgWydUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVNpbmdsZXRvbigpIG11c3QgYmUgYW4gYXJyYXkgb2YnLCAndGlwcHkgaW5zdGFuY2VzLiBUaGUgcGFzc2VkIHZhbHVlIHdhcycsIFN0cmluZyh0aXBweUluc3RhbmNlcyldLmpvaW4oJyAnKSk7XG4gIH1cblxuICB2YXIgbXV0VGlwcHlJbnN0YW5jZXMgPSB0aXBweUluc3RhbmNlcztcbiAgdmFyIHJlZmVyZW5jZXMgPSBbXTtcbiAgdmFyIGN1cnJlbnRUYXJnZXQ7XG4gIHZhciBvdmVycmlkZXMgPSBvcHRpb25hbFByb3BzLm92ZXJyaWRlcztcblxuICBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKCkge1xuICAgIHJlZmVyZW5jZXMgPSBtdXRUaXBweUluc3RhbmNlcy5tYXAoZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucmVmZXJlbmNlO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlSW5zdGFuY2VzKGlzRW5hYmxlZCkge1xuICAgIG11dFRpcHB5SW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgIGluc3RhbmNlLmVuYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlSW5zdGFuY2VzKGZhbHNlKTtcbiAgc2V0UmVmZXJlbmNlcygpO1xuICB2YXIgc2luZ2xldG9uID0ge1xuICAgIGZuOiBmdW5jdGlvbiBmbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uRGVzdHJveTogZnVuY3Rpb24gb25EZXN0cm95KCkge1xuICAgICAgICAgIGVuYWJsZUluc3RhbmNlcyh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UcmlnZ2VyOiBmdW5jdGlvbiBvblRyaWdnZXIoaW5zdGFuY2UsIGV2ZW50KSB7XG4gICAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgdmFyIGluZGV4ID0gcmVmZXJlbmNlcy5pbmRleE9mKHRhcmdldCk7IC8vIGJhaWwtb3V0XG5cbiAgICAgICAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICB2YXIgb3ZlcnJpZGVQcm9wcyA9IChvdmVycmlkZXMgfHwgW10pLmNvbmNhdCgnY29udGVudCcpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wKSB7XG4gICAgICAgICAgICBhY2NbcHJvcF0gPSBtdXRUaXBweUluc3RhbmNlc1tpbmRleF0ucHJvcHNbcHJvcF07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyhPYmplY3QuYXNzaWduKHt9LCBvdmVycmlkZVByb3BzLCB7XG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBmdW5jdGlvbiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0KCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHZhciBpbnN0YW5jZSA9IHRpcHB5KGRpdigpLCBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVQcm9wZXJ0aWVzKG9wdGlvbmFsUHJvcHMsIFsnb3ZlcnJpZGVzJ10pLCB7XG4gICAgcGx1Z2luczogW3NpbmdsZXRvbl0uY29uY2F0KG9wdGlvbmFsUHJvcHMucGx1Z2lucyB8fCBbXSksXG4gICAgdHJpZ2dlclRhcmdldDogcmVmZXJlbmNlc1xuICB9KSk7XG4gIHZhciBvcmlnaW5hbFNldFByb3BzID0gaW5zdGFuY2Uuc2V0UHJvcHM7XG5cbiAgaW5zdGFuY2Uuc2V0UHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBvdmVycmlkZXMgPSBwcm9wcy5vdmVycmlkZXMgfHwgb3ZlcnJpZGVzO1xuICAgIG9yaWdpbmFsU2V0UHJvcHMocHJvcHMpO1xuICB9O1xuXG4gIGluc3RhbmNlLnNldEluc3RhbmNlcyA9IGZ1bmN0aW9uIChuZXh0SW5zdGFuY2VzKSB7XG4gICAgZW5hYmxlSW5zdGFuY2VzKHRydWUpO1xuICAgIG11dFRpcHB5SW5zdGFuY2VzID0gbmV4dEluc3RhbmNlcztcbiAgICBlbmFibGVJbnN0YW5jZXMoZmFsc2UpO1xuICAgIHNldFJlZmVyZW5jZXMoKTtcbiAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICB0cmlnZ2VyVGFyZ2V0OiByZWZlcmVuY2VzXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufTtcblxudmFyIEJVQkJMSU5HX0VWRU5UU19NQVAgPSB7XG4gIG1vdXNlb3ZlcjogJ21vdXNlZW50ZXInLFxuICBmb2N1c2luOiAnZm9jdXMnLFxuICBjbGljazogJ2NsaWNrJ1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIGRlbGVnYXRlIGluc3RhbmNlIHRoYXQgY29udHJvbHMgdGhlIGNyZWF0aW9uIG9mIHRpcHB5IGluc3RhbmNlc1xuICogZm9yIGNoaWxkIGVsZW1lbnRzIChgdGFyZ2V0YCBDU1Mgc2VsZWN0b3IpLlxuICovXG5cbmZ1bmN0aW9uIGRlbGVnYXRlKHRhcmdldHMsIHByb3BzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgZXJyb3JXaGVuKCEocHJvcHMgJiYgcHJvcHMudGFyZ2V0KSwgWydZb3UgbXVzdCBzcGVjaXR5IGEgYHRhcmdldGAgcHJvcCBpbmRpY2F0aW5nIGEgQ1NTIHNlbGVjdG9yIHN0cmluZyBtYXRjaGluZycsICd0aGUgdGFyZ2V0IGVsZW1lbnRzIHRoYXQgc2hvdWxkIHJlY2VpdmUgYSB0aXBweS4nXS5qb2luKCcgJykpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgY2hpbGRUaXBweUluc3RhbmNlcyA9IFtdO1xuICB2YXIgdGFyZ2V0ID0gcHJvcHMudGFyZ2V0O1xuICB2YXIgbmF0aXZlUHJvcHMgPSByZW1vdmVQcm9wZXJ0aWVzKHByb3BzLCBbJ3RhcmdldCddKTtcbiAgdmFyIHBhcmVudFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbmF0aXZlUHJvcHMsIHtcbiAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICB0b3VjaDogZmFsc2VcbiAgfSk7XG4gIHZhciBjaGlsZFByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgbmF0aXZlUHJvcHMsIHtcbiAgICBzaG93T25DcmVhdGU6IHRydWVcbiAgfSk7XG4gIHZhciByZXR1cm5WYWx1ZSA9IHRpcHB5KHRhcmdldHMsIHBhcmVudFByb3BzKTtcbiAgdmFyIG5vcm1hbGl6ZWRSZXR1cm5WYWx1ZSA9IG5vcm1hbGl6ZVRvQXJyYXkocmV0dXJuVmFsdWUpO1xuXG4gIGZ1bmN0aW9uIG9uVHJpZ2dlcihldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldE5vZGUgPSBldmVudC50YXJnZXQuY2xvc2VzdCh0YXJnZXQpO1xuXG4gICAgaWYgKCF0YXJnZXROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBHZXQgcmVsZXZhbnQgdHJpZ2dlciB3aXRoIGZhbGxiYWNrczpcbiAgICAvLyAxLiBDaGVjayBgZGF0YS10aXBweS10cmlnZ2VyYCBhdHRyaWJ1dGUgb24gdGFyZ2V0IG5vZGVcbiAgICAvLyAyLiBGYWxsYmFjayB0byBgdHJpZ2dlcmAgcGFzc2VkIHRvIGBkZWxlZ2F0ZSgpYFxuICAgIC8vIDMuIEZhbGxiYWNrIHRvIGBkZWZhdWx0UHJvcHMudHJpZ2dlcmBcblxuXG4gICAgdmFyIHRyaWdnZXIgPSB0YXJnZXROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS10aXBweS10cmlnZ2VyJykgfHwgcHJvcHMudHJpZ2dlciB8fCBkZWZhdWx0UHJvcHMudHJpZ2dlcjsgLy8gQHRzLWlnbm9yZVxuXG4gICAgaWYgKHRhcmdldE5vZGUuX3RpcHB5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiB0eXBlb2YgY2hpbGRQcm9wcy50b3VjaCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICd0b3VjaHN0YXJ0JyAmJiB0cmlnZ2VyLmluZGV4T2YoQlVCQkxJTkdfRVZFTlRTX01BUFtldmVudC50eXBlXSkgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluc3RhbmNlID0gdGlwcHkodGFyZ2V0Tm9kZSwgY2hpbGRQcm9wcyk7XG5cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGNoaWxkVGlwcHlJbnN0YW5jZXMgPSBjaGlsZFRpcHB5SW5zdGFuY2VzLmNvbmNhdChpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb24obm9kZSwgZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIGxpc3RlbmVycy5wdXNoKHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyhpbnN0YW5jZSkge1xuICAgIHZhciByZWZlcmVuY2UgPSBpbnN0YW5jZS5yZWZlcmVuY2U7XG4gICAgb24ocmVmZXJlbmNlLCAndG91Y2hzdGFydCcsIG9uVHJpZ2dlcik7XG4gICAgb24ocmVmZXJlbmNlLCAnbW91c2VvdmVyJywgb25UcmlnZ2VyKTtcbiAgICBvbihyZWZlcmVuY2UsICdmb2N1c2luJywgb25UcmlnZ2VyKTtcbiAgICBvbihyZWZlcmVuY2UsICdjbGljaycsIG9uVHJpZ2dlcik7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGUsXG4gICAgICAgICAgZXZlbnRUeXBlID0gX3JlZi5ldmVudFR5cGUsXG4gICAgICAgICAgaGFuZGxlciA9IF9yZWYuaGFuZGxlcixcbiAgICAgICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseU11dGF0aW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBvcmlnaW5hbERlc3Ryb3kgPSBpbnN0YW5jZS5kZXN0cm95O1xuXG4gICAgaW5zdGFuY2UuZGVzdHJveSA9IGZ1bmN0aW9uIChzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMpIHtcbiAgICAgIGlmIChzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMgPT09IHZvaWQgMCkge1xuICAgICAgICBzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkRGVzdHJveUNoaWxkSW5zdGFuY2VzKSB7XG4gICAgICAgIGNoaWxkVGlwcHlJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICBpbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZFRpcHB5SW5zdGFuY2VzID0gW107XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgfTtcblxuICAgIGFkZEV2ZW50TGlzdGVuZXJzKGluc3RhbmNlKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZWRSZXR1cm5WYWx1ZS5mb3JFYWNoKGFwcGx5TXV0YXRpb25zKTtcbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG52YXIgYW5pbWF0ZUZpbGwgPSB7XG4gIG5hbWU6ICdhbmltYXRlRmlsbCcsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuOiBmdW5jdGlvbiBmbihpbnN0YW5jZSkge1xuICAgIHZhciBfaW5zdGFuY2UkcHJvcHMkcmVuZGU7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCEoKF9pbnN0YW5jZSRwcm9wcyRyZW5kZSA9IGluc3RhbmNlLnByb3BzLnJlbmRlcikgPT0gbnVsbCA/IHZvaWQgMCA6IF9pbnN0YW5jZSRwcm9wcyRyZW5kZS4kJHRpcHB5KSkge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgZXJyb3JXaGVuKGluc3RhbmNlLnByb3BzLmFuaW1hdGVGaWxsLCAnVGhlIGBhbmltYXRlRmlsbGAgcGx1Z2luIHJlcXVpcmVzIHRoZSBkZWZhdWx0IHJlbmRlciBmdW5jdGlvbi4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHZhciBfZ2V0Q2hpbGRyZW4gPSBnZXRDaGlsZHJlbihpbnN0YW5jZS5wb3BwZXIpLFxuICAgICAgICBib3ggPSBfZ2V0Q2hpbGRyZW4uYm94LFxuICAgICAgICBjb250ZW50ID0gX2dldENoaWxkcmVuLmNvbnRlbnQ7XG5cbiAgICB2YXIgYmFja2Ryb3AgPSBpbnN0YW5jZS5wcm9wcy5hbmltYXRlRmlsbCA/IGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpIDogbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgb25DcmVhdGU6IGZ1bmN0aW9uIG9uQ3JlYXRlKCkge1xuICAgICAgICBpZiAoYmFja2Ryb3ApIHtcbiAgICAgICAgICBib3guaW5zZXJ0QmVmb3JlKGJhY2tkcm9wLCBib3guZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0ZWZpbGwnLCAnJyk7XG4gICAgICAgICAgYm94LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICAgICAgYXJyb3c6IGZhbHNlLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiAnc2hpZnQtYXdheSdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uTW91bnQ6IGZ1bmN0aW9uIG9uTW91bnQoKSB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIHZhciB0cmFuc2l0aW9uRHVyYXRpb24gPSBib3guc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IE51bWJlcih0cmFuc2l0aW9uRHVyYXRpb24ucmVwbGFjZSgnbXMnLCAnJykpOyAvLyBUaGUgY29udGVudCBzaG91bGQgZmFkZSBpbiBhZnRlciB0aGUgYmFja2Ryb3AgaGFzIG1vc3RseSBmaWxsZWQgdGhlXG4gICAgICAgICAgLy8gdG9vbHRpcCBlbGVtZW50LiBgY2xpcC1wYXRoYCBpcyB0aGUgb3RoZXIgYWx0ZXJuYXRpdmUgYnV0IGlzIG5vdFxuICAgICAgICAgIC8vIHdlbGwtc3VwcG9ydGVkIGFuZCBpcyBidWdneSBvbiBzb21lIGRldmljZXMuXG5cbiAgICAgICAgICBjb250ZW50LnN0eWxlLnRyYW5zaXRpb25EZWxheSA9IE1hdGgucm91bmQoZHVyYXRpb24gLyAxMCkgKyBcIm1zXCI7XG4gICAgICAgICAgYmFja2Ryb3Auc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYmFja2Ryb3BdLCAndmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TaG93OiBmdW5jdGlvbiBvblNob3coKSB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIGJhY2tkcm9wLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcwbXMnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25IaWRlOiBmdW5jdGlvbiBvbkhpZGUoKSB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYmFja2Ryb3BdLCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCYWNrZHJvcEVsZW1lbnQoKSB7XG4gIHZhciBiYWNrZHJvcCA9IGRpdigpO1xuICBiYWNrZHJvcC5jbGFzc05hbWUgPSBCQUNLRFJPUF9DTEFTUztcbiAgc2V0VmlzaWJpbGl0eVN0YXRlKFtiYWNrZHJvcF0sICdoaWRkZW4nKTtcbiAgcmV0dXJuIGJhY2tkcm9wO1xufVxuXG52YXIgbW91c2VDb29yZHMgPSB7XG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDBcbn07XG52YXIgYWN0aXZlSW5zdGFuY2VzID0gW107XG5cbmZ1bmN0aW9uIHN0b3JlTW91c2VDb29yZHMoX3JlZikge1xuICB2YXIgY2xpZW50WCA9IF9yZWYuY2xpZW50WCxcbiAgICAgIGNsaWVudFkgPSBfcmVmLmNsaWVudFk7XG4gIG1vdXNlQ29vcmRzID0ge1xuICAgIGNsaWVudFg6IGNsaWVudFgsXG4gICAgY2xpZW50WTogY2xpZW50WVxuICB9O1xufVxuXG5mdW5jdGlvbiBhZGRNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYykge1xuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc3RvcmVNb3VzZUNvb3Jkcyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1vdXNlQ29vcmRzTGlzdGVuZXIoZG9jKSB7XG4gIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBzdG9yZU1vdXNlQ29vcmRzKTtcbn1cblxudmFyIGZvbGxvd0N1cnNvciA9IHtcbiAgbmFtZTogJ2ZvbGxvd0N1cnNvcicsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuOiBmdW5jdGlvbiBmbihpbnN0YW5jZSkge1xuICAgIHZhciByZWZlcmVuY2UgPSBpbnN0YW5jZS5yZWZlcmVuY2U7XG4gICAgdmFyIGRvYyA9IGdldE93bmVyRG9jdW1lbnQoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuICAgIHZhciBpc0ludGVybmFsVXBkYXRlID0gZmFsc2U7XG4gICAgdmFyIHdhc0ZvY3VzRXZlbnQgPSBmYWxzZTtcbiAgICB2YXIgaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcblxuICAgIGZ1bmN0aW9uIGdldElzSW5pdGlhbEJlaGF2aW9yKCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLnByb3BzLmZvbGxvd0N1cnNvciA9PT0gJ2luaXRpYWwnICYmIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRMaXN0ZW5lcigpIHtcbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoKSB7XG4gICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuc2V0R2V0UmVmZXJlbmNlQ2xpZW50UmVjdCgpIHtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSB0cnVlO1xuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsXG4gICAgICB9KTtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgLy8gSWYgdGhlIGluc3RhbmNlIGlzIGludGVyYWN0aXZlLCBhdm9pZCB1cGRhdGluZyB0aGUgcG9zaXRpb24gdW5sZXNzIGl0J3NcbiAgICAgIC8vIG92ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50XG4gICAgICB2YXIgaXNDdXJzb3JPdmVyUmVmZXJlbmNlID0gZXZlbnQudGFyZ2V0ID8gcmVmZXJlbmNlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgOiB0cnVlO1xuICAgICAgdmFyIGZvbGxvd0N1cnNvciA9IGluc3RhbmNlLnByb3BzLmZvbGxvd0N1cnNvcjtcbiAgICAgIHZhciBjbGllbnRYID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHZhciByZWN0ID0gcmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHJlbGF0aXZlWCA9IGNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgICB2YXIgcmVsYXRpdmVZID0gY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgICBpZiAoaXNDdXJzb3JPdmVyUmVmZXJlbmNlIHx8ICFpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogZnVuY3Rpb24gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCgpIHtcbiAgICAgICAgICAgIHZhciByZWN0ID0gcmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIHggPSBjbGllbnRYO1xuICAgICAgICAgICAgdmFyIHkgPSBjbGllbnRZO1xuXG4gICAgICAgICAgICBpZiAoZm9sbG93Q3Vyc29yID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgICAgeCA9IHJlY3QubGVmdCArIHJlbGF0aXZlWDtcbiAgICAgICAgICAgICAgeSA9IHJlY3QudG9wICsgcmVsYXRpdmVZO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG9wID0gZm9sbG93Q3Vyc29yID09PSAnaG9yaXpvbnRhbCcgPyByZWN0LnRvcCA6IHk7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSBmb2xsb3dDdXJzb3IgPT09ICd2ZXJ0aWNhbCcgPyByZWN0LnJpZ2h0IDogeDtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSBmb2xsb3dDdXJzb3IgPT09ICdob3Jpem9udGFsJyA/IHJlY3QuYm90dG9tIDogeTtcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gZm9sbG93Q3Vyc29yID09PSAndmVydGljYWwnID8gcmVjdC5sZWZ0IDogeDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHdpZHRoOiByaWdodCAtIGxlZnQsXG4gICAgICAgICAgICAgIGhlaWdodDogYm90dG9tIC0gdG9wLFxuICAgICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICAgICAgICBib3R0b206IGJvdHRvbSxcbiAgICAgICAgICAgICAgbGVmdDogbGVmdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgYWN0aXZlSW5zdGFuY2VzLnB1c2goe1xuICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICBkb2M6IGRvY1xuICAgICAgICB9KTtcbiAgICAgICAgYWRkTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZXMgPSBhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhLmluc3RhbmNlICE9PSBpbnN0YW5jZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYWN0aXZlSW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YS5kb2MgPT09IGRvYztcbiAgICAgIH0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZW1vdmVNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQ3JlYXRlOiBjcmVhdGUsXG4gICAgICBvbkRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgICBvbkJlZm9yZVVwZGF0ZTogZnVuY3Rpb24gb25CZWZvcmVVcGRhdGUoKSB7XG4gICAgICAgIHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuICAgICAgfSxcbiAgICAgIG9uQWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uIG9uQWZ0ZXJVcGRhdGUoXywgX3JlZjIpIHtcbiAgICAgICAgdmFyIGZvbGxvd0N1cnNvciA9IF9yZWYyLmZvbGxvd0N1cnNvcjtcblxuICAgICAgICBpZiAoaXNJbnRlcm5hbFVwZGF0ZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb2xsb3dDdXJzb3IgIT09IHVuZGVmaW5lZCAmJiBwcmV2UHJvcHMuZm9sbG93Q3Vyc29yICE9PSBmb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgICBkZXN0cm95KCk7XG5cbiAgICAgICAgICBpZiAoZm9sbG93Q3Vyc29yKSB7XG4gICAgICAgICAgICBjcmVhdGUoKTtcblxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCAmJiAhd2FzRm9jdXNFdmVudCAmJiAhZ2V0SXNJbml0aWFsQmVoYXZpb3IoKSkge1xuICAgICAgICAgICAgICBhZGRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcigpO1xuICAgICAgICAgICAgdW5zZXRHZXRSZWZlcmVuY2VDbGllbnRSZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Nb3VudDogZnVuY3Rpb24gb25Nb3VudCgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmZvbGxvd0N1cnNvciAmJiAhd2FzRm9jdXNFdmVudCkge1xuICAgICAgICAgIGlmIChpc1VubW91bnRlZCkge1xuICAgICAgICAgICAgb25Nb3VzZU1vdmUobW91c2VDb29yZHMpO1xuICAgICAgICAgICAgaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWdldElzSW5pdGlhbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25UcmlnZ2VyOiBmdW5jdGlvbiBvblRyaWdnZXIoXywgZXZlbnQpIHtcbiAgICAgICAgaWYgKGlzTW91c2VFdmVudChldmVudCkpIHtcbiAgICAgICAgICBtb3VzZUNvb3JkcyA9IHtcbiAgICAgICAgICAgIGNsaWVudFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICBjbGllbnRZOiBldmVudC5jbGllbnRZXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhc0ZvY3VzRXZlbnQgPSBldmVudC50eXBlID09PSAnZm9jdXMnO1xuICAgICAgfSxcbiAgICAgIG9uSGlkZGVuOiBmdW5jdGlvbiBvbkhpZGRlbigpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmZvbGxvd0N1cnNvcikge1xuICAgICAgICAgIHVuc2V0R2V0UmVmZXJlbmNlQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKCk7XG4gICAgICAgICAgaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0UHJvcHMocHJvcHMsIG1vZGlmaWVyKSB7XG4gIHZhciBfcHJvcHMkcG9wcGVyT3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIHBvcHBlck9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLnBvcHBlck9wdGlvbnMsIHtcbiAgICAgIG1vZGlmaWVyczogW10uY29uY2F0KCgoKF9wcm9wcyRwb3BwZXJPcHRpb25zID0gcHJvcHMucG9wcGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9wcm9wcyRwb3BwZXJPcHRpb25zLm1vZGlmaWVycykgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgIT09IG1vZGlmaWVyLm5hbWU7XG4gICAgICB9KSwgW21vZGlmaWVyXSlcbiAgICB9KVxuICB9O1xufVxuXG52YXIgaW5saW5lUG9zaXRpb25pbmcgPSB7XG4gIG5hbWU6ICdpbmxpbmVQb3NpdGlvbmluZycsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuOiBmdW5jdGlvbiBmbihpbnN0YW5jZSkge1xuICAgIHZhciByZWZlcmVuY2UgPSBpbnN0YW5jZS5yZWZlcmVuY2U7XG5cbiAgICBmdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gICAgICByZXR1cm4gISFpbnN0YW5jZS5wcm9wcy5pbmxpbmVQb3NpdGlvbmluZztcbiAgICB9XG5cbiAgICB2YXIgcGxhY2VtZW50O1xuICAgIHZhciBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICB2YXIgaXNJbnRlcm5hbFVwZGF0ZSA9IGZhbHNlO1xuICAgIHZhciBtb2RpZmllciA9IHtcbiAgICAgIG5hbWU6ICd0aXBweUlubGluZVBvc2l0aW9uaW5nJyxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2FmdGVyV3JpdGUnLFxuICAgICAgZm46IGZ1bmN0aW9uIGZuKF9yZWYyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuXG4gICAgICAgIGlmIChpc0VuYWJsZWQoKSkge1xuICAgICAgICAgIGlmIChwbGFjZW1lbnQgIT09IHN0YXRlLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBmdW5jdGlvbiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdChzdGF0ZS5wbGFjZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwbGFjZW1lbnQgPSBzdGF0ZS5wbGFjZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gX2dldFJlZmVyZW5jZUNsaWVudFJlY3QocGxhY2VtZW50KSB7XG4gICAgICByZXR1cm4gZ2V0SW5saW5lQm91bmRpbmdDbGllbnRSZWN0KGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSwgcmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBhcnJheUZyb20ocmVmZXJlbmNlLmdldENsaWVudFJlY3RzKCkpLCBjdXJzb3JSZWN0SW5kZXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEludGVybmFsUHJvcHMocGFydGlhbFByb3BzKSB7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGluc3RhbmNlLnNldFByb3BzKHBhcnRpYWxQcm9wcyk7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTW9kaWZpZXIoKSB7XG4gICAgICBpZiAoIWlzSW50ZXJuYWxVcGRhdGUpIHtcbiAgICAgICAgc2V0SW50ZXJuYWxQcm9wcyhnZXRQcm9wcyhpbnN0YW5jZS5wcm9wcywgbW9kaWZpZXIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb25DcmVhdGU6IGFkZE1vZGlmaWVyLFxuICAgICAgb25BZnRlclVwZGF0ZTogYWRkTW9kaWZpZXIsXG4gICAgICBvblRyaWdnZXI6IGZ1bmN0aW9uIG9uVHJpZ2dlcihfLCBldmVudCkge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgIHZhciByZWN0cyA9IGFycmF5RnJvbShpbnN0YW5jZS5yZWZlcmVuY2UuZ2V0Q2xpZW50UmVjdHMoKSk7XG4gICAgICAgICAgdmFyIGN1cnNvclJlY3QgPSByZWN0cy5maW5kKGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdC5sZWZ0IC0gMiA8PSBldmVudC5jbGllbnRYICYmIHJlY3QucmlnaHQgKyAyID49IGV2ZW50LmNsaWVudFggJiYgcmVjdC50b3AgLSAyIDw9IGV2ZW50LmNsaWVudFkgJiYgcmVjdC5ib3R0b20gKyAyID49IGV2ZW50LmNsaWVudFk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3Vyc29yUmVjdEluZGV4ID0gcmVjdHMuaW5kZXhPZihjdXJzb3JSZWN0KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uVW50cmlnZ2VyOiBmdW5jdGlvbiBvblVudHJpZ2dlcigpIHtcbiAgICAgICAgY3Vyc29yUmVjdEluZGV4ID0gLTE7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIGdldElubGluZUJvdW5kaW5nQ2xpZW50UmVjdChjdXJyZW50QmFzZVBsYWNlbWVudCwgYm91bmRpbmdSZWN0LCBjbGllbnRSZWN0cywgY3Vyc29yUmVjdEluZGV4KSB7XG4gIC8vIE5vdCBhbiBpbmxpbmUgZWxlbWVudCwgb3IgcGxhY2VtZW50IGlzIG5vdCB5ZXQga25vd25cbiAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA8IDIgfHwgY3VycmVudEJhc2VQbGFjZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gYm91bmRpbmdSZWN0O1xuICB9IC8vIFRoZXJlIGFyZSB0d28gcmVjdHMgYW5kIHRoZXkgYXJlIGRpc2pvaW5lZFxuXG5cbiAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA9PT0gMiAmJiBjdXJzb3JSZWN0SW5kZXggPj0gMCAmJiBjbGllbnRSZWN0c1swXS5sZWZ0ID4gY2xpZW50UmVjdHNbMV0ucmlnaHQpIHtcbiAgICByZXR1cm4gY2xpZW50UmVjdHNbY3Vyc29yUmVjdEluZGV4XSB8fCBib3VuZGluZ1JlY3Q7XG4gIH1cblxuICBzd2l0Y2ggKGN1cnJlbnRCYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAge1xuICAgICAgICB2YXIgZmlyc3RSZWN0ID0gY2xpZW50UmVjdHNbMF07XG4gICAgICAgIHZhciBsYXN0UmVjdCA9IGNsaWVudFJlY3RzW2NsaWVudFJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgaXNUb3AgPSBjdXJyZW50QmFzZVBsYWNlbWVudCA9PT0gJ3RvcCc7XG4gICAgICAgIHZhciB0b3AgPSBmaXJzdFJlY3QudG9wO1xuICAgICAgICB2YXIgYm90dG9tID0gbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICB2YXIgbGVmdCA9IGlzVG9wID8gZmlyc3RSZWN0LmxlZnQgOiBsYXN0UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgcmlnaHQgPSBpc1RvcCA/IGZpcnN0UmVjdC5yaWdodCA6IGxhc3RSZWN0LnJpZ2h0O1xuICAgICAgICB2YXIgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9wOiB0b3AsXG4gICAgICAgICAgYm90dG9tOiBib3R0b20sXG4gICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICB7XG4gICAgICAgIHZhciBtaW5MZWZ0ID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgY2xpZW50UmVjdHMubWFwKGZ1bmN0aW9uIChyZWN0cykge1xuICAgICAgICAgIHJldHVybiByZWN0cy5sZWZ0O1xuICAgICAgICB9KSk7XG4gICAgICAgIHZhciBtYXhSaWdodCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGNsaWVudFJlY3RzLm1hcChmdW5jdGlvbiAocmVjdHMpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdHMucmlnaHQ7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdmFyIG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcihmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50QmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnID8gcmVjdC5sZWZ0ID09PSBtaW5MZWZ0IDogcmVjdC5yaWdodCA9PT0gbWF4UmlnaHQ7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX3RvcCA9IG1lYXN1cmVSZWN0c1swXS50b3A7XG4gICAgICAgIHZhciBfYm90dG9tID0gbWVhc3VyZVJlY3RzW21lYXN1cmVSZWN0cy5sZW5ndGggLSAxXS5ib3R0b207XG4gICAgICAgIHZhciBfbGVmdCA9IG1pbkxlZnQ7XG4gICAgICAgIHZhciBfcmlnaHQgPSBtYXhSaWdodDtcblxuICAgICAgICB2YXIgX3dpZHRoID0gX3JpZ2h0IC0gX2xlZnQ7XG5cbiAgICAgICAgdmFyIF9oZWlnaHQgPSBfYm90dG9tIC0gX3RvcDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvcDogX3RvcCxcbiAgICAgICAgICBib3R0b206IF9ib3R0b20sXG4gICAgICAgICAgbGVmdDogX2xlZnQsXG4gICAgICAgICAgcmlnaHQ6IF9yaWdodCxcbiAgICAgICAgICB3aWR0aDogX3dpZHRoLFxuICAgICAgICAgIGhlaWdodDogX2hlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbiAgICAgIH1cbiAgfVxufVxuXG52YXIgc3RpY2t5ID0ge1xuICBuYW1lOiAnc3RpY2t5JyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm46IGZ1bmN0aW9uIGZuKGluc3RhbmNlKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IGluc3RhbmNlLnJlZmVyZW5jZSxcbiAgICAgICAgcG9wcGVyID0gaW5zdGFuY2UucG9wcGVyO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLnBvcHBlckluc3RhbmNlID8gaW5zdGFuY2UucG9wcGVySW5zdGFuY2Uuc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlIDogcmVmZXJlbmNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZENoZWNrKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHMuc3RpY2t5ID09PSB0cnVlIHx8IGluc3RhbmNlLnByb3BzLnN0aWNreSA9PT0gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHByZXZSZWZSZWN0ID0gbnVsbDtcbiAgICB2YXIgcHJldlBvcFJlY3QgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICB2YXIgY3VycmVudFJlZlJlY3QgPSBzaG91bGRDaGVjaygncmVmZXJlbmNlJykgPyBnZXRSZWZlcmVuY2UoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICB2YXIgY3VycmVudFBvcFJlY3QgPSBzaG91bGRDaGVjaygncG9wcGVyJykgPyBwb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBudWxsO1xuXG4gICAgICBpZiAoY3VycmVudFJlZlJlY3QgJiYgYXJlUmVjdHNEaWZmZXJlbnQocHJldlJlZlJlY3QsIGN1cnJlbnRSZWZSZWN0KSB8fCBjdXJyZW50UG9wUmVjdCAmJiBhcmVSZWN0c0RpZmZlcmVudChwcmV2UG9wUmVjdCwgY3VycmVudFBvcFJlY3QpKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZSZWZSZWN0ID0gY3VycmVudFJlZlJlY3Q7XG4gICAgICBwcmV2UG9wUmVjdCA9IGN1cnJlbnRQb3BSZWN0O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVQb3NpdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uTW91bnQ6IGZ1bmN0aW9uIG9uTW91bnQoKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5zdGlja3kpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYXJlUmVjdHNEaWZmZXJlbnQocmVjdEEsIHJlY3RCKSB7XG4gIGlmIChyZWN0QSAmJiByZWN0Qikge1xuICAgIHJldHVybiByZWN0QS50b3AgIT09IHJlY3RCLnRvcCB8fCByZWN0QS5yaWdodCAhPT0gcmVjdEIucmlnaHQgfHwgcmVjdEEuYm90dG9tICE9PSByZWN0Qi5ib3R0b20gfHwgcmVjdEEubGVmdCAhPT0gcmVjdEIubGVmdDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG50aXBweS5zZXREZWZhdWx0UHJvcHMoe1xuICByZW5kZXI6IHJlbmRlclxufSk7XG5cbmV4cG9ydHMuYW5pbWF0ZUZpbGwgPSBhbmltYXRlRmlsbDtcbmV4cG9ydHMuY3JlYXRlU2luZ2xldG9uID0gY3JlYXRlU2luZ2xldG9uO1xuZXhwb3J0cy5kZWZhdWx0ID0gdGlwcHk7XG5leHBvcnRzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG5leHBvcnRzLmZvbGxvd0N1cnNvciA9IGZvbGxvd0N1cnNvcjtcbmV4cG9ydHMuaGlkZUFsbCA9IGhpZGVBbGw7XG5leHBvcnRzLmlubGluZVBvc2l0aW9uaW5nID0gaW5saW5lUG9zaXRpb25pbmc7XG5leHBvcnRzLnJvdW5kQXJyb3cgPSBST1VORF9BUlJPVztcbmV4cG9ydHMuc3RpY2t5ID0gc3RpY2t5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGlwcHkuY2pzLmpzLm1hcFxuIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcInZ1ZS1qcy1tb2RhbFwiXT1lKCk6dFtcInZ1ZS1qcy1tb2RhbFwiXT1lKCl9KHdpbmRvdyxmdW5jdGlvbigpe3JldHVybiBpPXt9LG8ubT1uPVtmdW5jdGlvbih0LGUsbil7dmFyIGk9big3KTtcInN0cmluZ1wiPT10eXBlb2YgaSYmKGk9W1t0LmksaSxcIlwiXV0pLGkubG9jYWxzJiYodC5leHBvcnRzPWkubG9jYWxzKTsoMCxuKDQpLmRlZmF1bHQpKFwiZDc2MzY3OWNcIixpLCExLHt9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciBpPW4oMTApO1wic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT1bW3QuaSxpLFwiXCJdXSksaS5sb2NhbHMmJih0LmV4cG9ydHM9aS5sb2NhbHMpOygwLG4oNCkuZGVmYXVsdCkoXCI2YjljYzBlMFwiLGksITEse30pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMik7XCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPVtbdC5pLGksXCJcIl1dKSxpLmxvY2FscyYmKHQuZXhwb3J0cz1pLmxvY2Fscyk7KDAsbig0KS5kZWZhdWx0KShcIjY2M2MwMDRlXCIsaSwhMSx7fSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKG4pe3ZhciBhPVtdO3JldHVybiBhLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dFsxXXx8XCJcIixpPXRbM107aWYoIWkpcmV0dXJuIG47aWYoZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgYnRvYSl7dmFyIG89ZnVuY3Rpb24odCl7cmV0dXJuXCIvKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodCkpKSkrXCIgKi9cIn0oaSkscj1pLnNvdXJjZXMubWFwKGZ1bmN0aW9uKHQpe3JldHVyblwiLyojIHNvdXJjZVVSTD1cIitpLnNvdXJjZVJvb3QrdCtcIiAqL1wifSk7cmV0dXJuW25dLmNvbmNhdChyKS5jb25jYXQoW29dKS5qb2luKFwiXFxuXCIpfXJldHVybltuXS5qb2luKFwiXFxuXCIpfSh0LG4pO3JldHVybiB0WzJdP1wiQG1lZGlhIFwiK3RbMl0rXCJ7XCIrZStcIn1cIjplfSkuam9pbihcIlwiKX0sYS5pPWZ1bmN0aW9uKHQsZSl7XCJzdHJpbmdcIj09dHlwZW9mIHQmJih0PVtbbnVsbCx0LFwiXCJdXSk7Zm9yKHZhciBuPXt9LGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIG89dGhpc1tpXVswXTtcIm51bWJlclwiPT10eXBlb2YgbyYmKG5bb109ITApfWZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciByPXRbaV07XCJudW1iZXJcIj09dHlwZW9mIHJbMF0mJm5bclswXV18fChlJiYhclsyXT9yWzJdPWU6ZSYmKHJbMl09XCIoXCIrclsyXStcIikgYW5kIChcIitlK1wiKVwiKSxhLnB1c2gocikpfX0sYX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPVtdLGk9e30sbz0wO288ZS5sZW5ndGg7bysrKXt2YXIgcj1lW29dLGE9clswXSxzPXtpZDp0K1wiOlwiK28sY3NzOnJbMV0sbWVkaWE6clsyXSxzb3VyY2VNYXA6clszXX07aVthXT9pW2FdLnBhcnRzLnB1c2gocyk6bi5wdXNoKGlbYV09e2lkOmEscGFydHM6W3NdfSl9cmV0dXJuIG59bi5yKGUpLG4uZChlLFwiZGVmYXVsdFwiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQ7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIERFQlVHJiZERUJVRyYmIWkpdGhyb3cgbmV3IEVycm9yKFwidnVlLXN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LiBVc2UgeyB0YXJnZXQ6ICdub2RlJyB9IGluIHlvdXIgV2VicGFjayBjb25maWcgdG8gaW5kaWNhdGUgYSBzZXJ2ZXItcmVuZGVyaW5nIGVudmlyb25tZW50LlwiKTt2YXIgdT17fSxvPWkmJihkb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0pLHI9bnVsbCxhPTAsYz0hMSxzPWZ1bmN0aW9uKCl7fSxkPW51bGwsaD1cImRhdGEtdnVlLXNzci1pZFwiLGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmL21zaWUgWzYtOV1cXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtmdW5jdGlvbiBwKGEsdCxlLG4pe2M9ZSxkPW58fHt9O3ZhciBzPWwoYSx0KTtyZXR1cm4gdihzKSxmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248cy5sZW5ndGg7bisrKXt2YXIgaT1zW25dOyhvPXVbaS5pZF0pLnJlZnMtLSxlLnB1c2gobyl9dD92KHM9bChhLHQpKTpzPVtdO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvO2lmKDA9PT0obz1lW25dKS5yZWZzKXtmb3IodmFyIHI9MDtyPG8ucGFydHMubGVuZ3RoO3IrKylvLnBhcnRzW3JdKCk7ZGVsZXRlIHVbby5pZF19fX19ZnVuY3Rpb24gdih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxpPXVbbi5pZF07aWYoaSl7aS5yZWZzKys7Zm9yKHZhciBvPTA7bzxpLnBhcnRzLmxlbmd0aDtvKyspaS5wYXJ0c1tvXShuLnBhcnRzW29dKTtmb3IoO288bi5wYXJ0cy5sZW5ndGg7bysrKWkucGFydHMucHVzaChiKG4ucGFydHNbb10pKTtpLnBhcnRzLmxlbmd0aD5uLnBhcnRzLmxlbmd0aCYmKGkucGFydHMubGVuZ3RoPW4ucGFydHMubGVuZ3RoKX1lbHNle3ZhciByPVtdO2ZvcihvPTA7bzxuLnBhcnRzLmxlbmd0aDtvKyspci5wdXNoKGIobi5wYXJ0c1tvXSkpO3Vbbi5pZF09e2lkOm4uaWQscmVmczoxLHBhcnRzOnJ9fX19ZnVuY3Rpb24gbSgpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtyZXR1cm4gdC50eXBlPVwidGV4dC9jc3NcIixvLmFwcGVuZENoaWxkKHQpLHR9ZnVuY3Rpb24gYihlKXt2YXIgbixpLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcInN0eWxlW1wiK2grJ349XCInK2UuaWQrJ1wiXScpO2lmKHQpe2lmKGMpcmV0dXJuIHM7dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWlmKGYpe3ZhciBvPWErKzt0PXI9cnx8bSgpLG49dy5iaW5kKG51bGwsdCxvLCExKSxpPXcuYmluZChudWxsLHQsbywhMCl9ZWxzZSB0PW0oKSxuPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5jc3MsaT1lLm1lZGlhLG89ZS5zb3VyY2VNYXA7aSYmdC5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLGkpO2Quc3NySWQmJnQuc2V0QXR0cmlidXRlKGgsZS5pZCk7byYmKG4rPVwiXFxuLyojIHNvdXJjZVVSTD1cIitvLnNvdXJjZXNbMF0rXCIgKi9cIixuKz1cIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkobykpKSkrXCIgKi9cIik7aWYodC5zdHlsZVNoZWV0KXQuc3R5bGVTaGVldC5jc3NUZXh0PW47ZWxzZXtmb3IoO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpO3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobikpfX0uYmluZChudWxsLHQpLGk9ZnVuY3Rpb24oKXt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9O3JldHVybiBuKGUpLGZ1bmN0aW9uKHQpe2lmKHQpe2lmKHQuY3NzPT09ZS5jc3MmJnQubWVkaWE9PT1lLm1lZGlhJiZ0LnNvdXJjZU1hcD09PWUuc291cmNlTWFwKXJldHVybjtuKGU9dCl9ZWxzZSBpKCl9fXZhciB5LGc9KHk9W10sZnVuY3Rpb24odCxlKXtyZXR1cm4geVt0XT1lLHkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCJcXG5cIil9KTtmdW5jdGlvbiB3KHQsZSxuLGkpe3ZhciBvPW4/XCJcIjppLmNzcztpZih0LnN0eWxlU2hlZXQpdC5zdHlsZVNoZWV0LmNzc1RleHQ9ZyhlLG8pO2Vsc2V7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobyksYT10LmNoaWxkTm9kZXM7YVtlXSYmdC5yZW1vdmVDaGlsZChhW2VdKSxhLmxlbmd0aD90Lmluc2VydEJlZm9yZShyLGFbZV0pOnQuYXBwZW5kQ2hpbGQocil9fX0sZnVuY3Rpb24odCxNLGUpe1widXNlIHN0cmljdFwiOyhmdW5jdGlvbih0KXt2YXIgaT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBNYXApcmV0dXJuIE1hcDtmdW5jdGlvbiBpKHQsbil7dmFyIGk9LTE7cmV0dXJuIHQuc29tZShmdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09biYmKGk9ZSwhMCl9KSxpfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsXCJzaXplXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW50cmllc19fLmxlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzLl9fZW50cmllc19fLHQpLG49dGhpcy5fX2VudHJpZXNfX1tlXTtyZXR1cm4gbiYmblsxXX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0aGlzLl9fZW50cmllc19fLHQpO35uP3RoaXMuX19lbnRyaWVzX19bbl1bMV09ZTp0aGlzLl9fZW50cmllc19fLnB1c2goW3QsZV0pfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2VudHJpZXNfXyxuPWkoZSx0KTt+biYmZS5zcGxpY2UobiwxKX0sdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiEhfmkodGhpcy5fX2VudHJpZXNfXyx0KX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZW50cmllc19fLnNwbGljZSgwKX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPW51bGwpO2Zvcih2YXIgbj0wLGk9dGhpcy5fX2VudHJpZXNfXztuPGkubGVuZ3RoO24rKyl7dmFyIG89aVtuXTt0LmNhbGwoZSxvWzFdLG9bMF0pfX0sdDtmdW5jdGlvbiB0KCl7dGhpcy5fX2VudHJpZXNfXz1bXX19KCksbj1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQmJndpbmRvdy5kb2N1bWVudD09PWRvY3VtZW50LGU9dm9pZCAwIT09dCYmdC5NYXRoPT09TWF0aD90OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PT1NYXRoP3NlbGY6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PT1NYXRoP3dpbmRvdzpGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCksbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/cmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQoZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdChEYXRlLm5vdygpKX0sMWUzLzYwKX0sdT0yO3ZhciBvPVtcInRvcFwiLFwicmlnaHRcIixcImJvdHRvbVwiLFwibGVmdFwiLFwid2lkdGhcIixcImhlaWdodFwiLFwic2l6ZVwiLFwid2VpZ2h0XCJdLHI9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIsYT0ocy5wcm90b3R5cGUuYWRkT2JzZXJ2ZXI9ZnVuY3Rpb24odCl7fnRoaXMub2JzZXJ2ZXJzXy5pbmRleE9mKHQpfHx0aGlzLm9ic2VydmVyc18ucHVzaCh0KSx0aGlzLmNvbm5lY3RlZF98fHRoaXMuY29ubmVjdF8oKX0scy5wcm90b3R5cGUucmVtb3ZlT2JzZXJ2ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vYnNlcnZlcnNfLG49ZS5pbmRleE9mKHQpO35uJiZlLnNwbGljZShuLDEpLCFlLmxlbmd0aCYmdGhpcy5jb25uZWN0ZWRfJiZ0aGlzLmRpc2Nvbm5lY3RfKCl9LHMucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZU9ic2VydmVyc18oKSYmdGhpcy5yZWZyZXNoKCl9LHMucHJvdG90eXBlLnVwZGF0ZU9ic2VydmVyc189ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9ic2VydmVyc18uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdhdGhlckFjdGl2ZSgpLHQuaGFzQWN0aXZlKCl9KTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJyb2FkY2FzdEFjdGl2ZSgpfSksMDx0Lmxlbmd0aH0scy5wcm90b3R5cGUuY29ubmVjdF89ZnVuY3Rpb24oKXtuJiYhdGhpcy5jb25uZWN0ZWRfJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIix0aGlzLm9uVHJhbnNpdGlvbkVuZF8pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5yZWZyZXNoKSxyPyh0aGlzLm11dGF0aW9uc09ic2VydmVyXz1uZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLnJlZnJlc2gpLHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLm9ic2VydmUoZG9jdW1lbnQse2F0dHJpYnV0ZXM6ITAsY2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pKTooZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTVN1YnRyZWVNb2RpZmllZFwiLHRoaXMucmVmcmVzaCksdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXz0hMCksdGhpcy5jb25uZWN0ZWRfPSEwKX0scy5wcm90b3R5cGUuZGlzY29ubmVjdF89ZnVuY3Rpb24oKXtuJiZ0aGlzLmNvbm5lY3RlZF8mJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLHRoaXMub25UcmFuc2l0aW9uRW5kXyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0aGlzLnJlZnJlc2gpLHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfJiZ0aGlzLm11dGF0aW9uc09ic2VydmVyXy5kaXNjb25uZWN0KCksdGhpcy5tdXRhdGlvbkV2ZW50c0FkZGVkXyYmZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTVN1YnRyZWVNb2RpZmllZFwiLHRoaXMucmVmcmVzaCksdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl89bnVsbCx0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfPSExLHRoaXMuY29ubmVjdGVkXz0hMSl9LHMucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZF89ZnVuY3Rpb24odCl7dmFyIGU9dC5wcm9wZXJ0eU5hbWUsbj12b2lkIDA9PT1lP1wiXCI6ZTtvLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuISF+bi5pbmRleE9mKHQpfSkmJnRoaXMucmVmcmVzaCgpfSxzLmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2VffHwodGhpcy5pbnN0YW5jZV89bmV3IHMpLHRoaXMuaW5zdGFuY2VffSxzLmluc3RhbmNlXz1udWxsLHMpO2Z1bmN0aW9uIHMoKXtmdW5jdGlvbiB0KCl7ciYmKHI9ITEsaSgpKSxhJiZuKCl9ZnVuY3Rpb24gZSgpe2wodCl9ZnVuY3Rpb24gbigpe3ZhciB0PURhdGUubm93KCk7aWYocil7aWYodC1zPHUpcmV0dXJuO2E9ITB9ZWxzZSBhPSEocj0hMCksc2V0VGltZW91dChlLG8pO3M9dH12YXIgaSxvLHIsYSxzO3RoaXMuY29ubmVjdGVkXz0hMSx0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfPSExLHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfPW51bGwsdGhpcy5vYnNlcnZlcnNfPVtdLHRoaXMub25UcmFuc2l0aW9uRW5kXz10aGlzLm9uVHJhbnNpdGlvbkVuZF8uYmluZCh0aGlzKSx0aGlzLnJlZnJlc2g9KGk9dGhpcy5yZWZyZXNoLmJpbmQodGhpcyksYT1yPSEobz0yMCkscz0wLG4pfXZhciBjPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAsaT1PYmplY3Qua2V5cyhlKTtuPGkubGVuZ3RoO24rKyl7dmFyIG89aVtuXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxvLHt2YWx1ZTplW29dLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSl9cmV0dXJuIHR9LGg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHxlfSxmPXkoMCwwLDAsMCk7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KXx8MH1mdW5jdGlvbiB2KG4pe2Zvcih2YXIgdD1bXSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2UtMV09YXJndW1lbnRzW2VdO3JldHVybiB0LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K3AobltcImJvcmRlci1cIitlK1wiLXdpZHRoXCJdKX0sMCl9ZnVuY3Rpb24gZCh0KXt2YXIgZT10LmNsaWVudFdpZHRoLG49dC5jbGllbnRIZWlnaHQ7aWYoIWUmJiFuKXJldHVybiBmO3ZhciBpLG89aCh0KS5nZXRDb21wdXRlZFN0eWxlKHQpLHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LG49MCxpPVtcInRvcFwiLFwicmlnaHRcIixcImJvdHRvbVwiLFwibGVmdFwiXTtuPGkubGVuZ3RoO24rKyl7dmFyIG89aVtuXSxyPXRbXCJwYWRkaW5nLVwiK29dO2Vbb109cChyKX1yZXR1cm4gZX0obyksYT1yLmxlZnQrci5yaWdodCxzPXIudG9wK3IuYm90dG9tLGw9cChvLndpZHRoKSx1PXAoby5oZWlnaHQpO2lmKFwiYm9yZGVyLWJveFwiPT09by5ib3hTaXppbmcmJihNYXRoLnJvdW5kKGwrYSkhPT1lJiYobC09dihvLFwibGVmdFwiLFwicmlnaHRcIikrYSksTWF0aC5yb3VuZCh1K3MpIT09biYmKHUtPXYobyxcInRvcFwiLFwiYm90dG9tXCIpK3MpKSwoaT10KSE9PWgoaSkuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KXt2YXIgYz1NYXRoLnJvdW5kKGwrYSktZSxkPU1hdGgucm91bmQodStzKS1uOzEhPT1NYXRoLmFicyhjKSYmKGwtPWMpLDEhPT1NYXRoLmFicyhkKSYmKHUtPWQpfXJldHVybiB5KHIubGVmdCxyLnRvcCxsLHUpfXZhciBtPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTVkdHcmFwaGljc0VsZW1lbnQ/ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBoKHQpLlNWR0dyYXBoaWNzRWxlbWVudH06ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBoKHQpLlNWR0VsZW1lbnQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZ2V0QkJveH07ZnVuY3Rpb24gYih0KXtyZXR1cm4gbj9tKHQpP3koMCwwLChlPXQuZ2V0QkJveCgpKS53aWR0aCxlLmhlaWdodCk6ZCh0KTpmO3ZhciBlfWZ1bmN0aW9uIHkodCxlLG4saSl7cmV0dXJue3g6dCx5OmUsd2lkdGg6bixoZWlnaHQ6aX19dmFyIGc9KHcucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7dmFyIHQ9Yih0aGlzLnRhcmdldCk7cmV0dXJuKHRoaXMuY29udGVudFJlY3RfPXQpLndpZHRoIT09dGhpcy5icm9hZGNhc3RXaWR0aHx8dC5oZWlnaHQhPT10aGlzLmJyb2FkY2FzdEhlaWdodH0sdy5wcm90b3R5cGUuYnJvYWRjYXN0UmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGVudFJlY3RfO3JldHVybiB0aGlzLmJyb2FkY2FzdFdpZHRoPXQud2lkdGgsdGhpcy5icm9hZGNhc3RIZWlnaHQ9dC5oZWlnaHQsdH0sdyk7ZnVuY3Rpb24gdyh0KXt0aGlzLmJyb2FkY2FzdFdpZHRoPTAsdGhpcy5icm9hZGNhc3RIZWlnaHQ9MCx0aGlzLmNvbnRlbnRSZWN0Xz15KDAsMCwwLDApLHRoaXMudGFyZ2V0PXR9dmFyIF89ZnVuY3Rpb24odCxlKXt2YXIgbixpLG8scixhLHMsbCx1PShpPShuPWUpLngsbz1uLnkscj1uLndpZHRoLGE9bi5oZWlnaHQscz1cInVuZGVmaW5lZFwiIT10eXBlb2YgRE9NUmVjdFJlYWRPbmx5P0RPTVJlY3RSZWFkT25seTpPYmplY3QsbD1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSxjKGwse3g6aSx5Om8sd2lkdGg6cixoZWlnaHQ6YSx0b3A6byxyaWdodDppK3IsYm90dG9tOmErbyxsZWZ0Oml9KSxsKTtjKHRoaXMse3RhcmdldDp0LGNvbnRlbnRSZWN0OnV9KX0sRT0oeC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgRWxlbWVudCYmRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCl7aWYoISh0IGluc3RhbmNlb2YgaCh0KS5FbGVtZW50KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTt2YXIgZT10aGlzLm9ic2VydmF0aW9uc187ZS5oYXModCl8fChlLnNldCh0LG5ldyBnKHQpKSx0aGlzLmNvbnRyb2xsZXJfLmFkZE9ic2VydmVyKHRoaXMpLHRoaXMuY29udHJvbGxlcl8ucmVmcmVzaCgpKX19LHgucHJvdG90eXBlLnVub2JzZXJ2ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgRWxlbWVudCYmRWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdCl7aWYoISh0IGluc3RhbmNlb2YgaCh0KS5FbGVtZW50KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcIkVsZW1lbnRcIi4nKTt2YXIgZT10aGlzLm9ic2VydmF0aW9uc187ZS5oYXModCkmJihlLmRlbGV0ZSh0KSxlLnNpemV8fHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcykpfX0seC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe3RoaXMuY2xlYXJBY3RpdmUoKSx0aGlzLm9ic2VydmF0aW9uc18uY2xlYXIoKSx0aGlzLmNvbnRyb2xsZXJfLnJlbW92ZU9ic2VydmVyKHRoaXMpfSx4LnByb3RvdHlwZS5nYXRoZXJBY3RpdmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuY2xlYXJBY3RpdmUoKSx0aGlzLm9ic2VydmF0aW9uc18uZm9yRWFjaChmdW5jdGlvbih0KXt0LmlzQWN0aXZlKCkmJmUuYWN0aXZlT2JzZXJ2YXRpb25zXy5wdXNoKHQpfSl9LHgucHJvdG90eXBlLmJyb2FkY2FzdEFjdGl2ZT1mdW5jdGlvbigpe2lmKHRoaXMuaGFzQWN0aXZlKCkpe3ZhciB0PXRoaXMuY2FsbGJhY2tDdHhfLGU9dGhpcy5hY3RpdmVPYnNlcnZhdGlvbnNfLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IF8odC50YXJnZXQsdC5icm9hZGNhc3RSZWN0KCkpfSk7dGhpcy5jYWxsYmFja18uY2FsbCh0LGUsdCksdGhpcy5jbGVhckFjdGl2ZSgpfX0seC5wcm90b3R5cGUuY2xlYXJBY3RpdmU9ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18uc3BsaWNlKDApfSx4LnByb3RvdHlwZS5oYXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubGVuZ3RofSx4KTtmdW5jdGlvbiB4KHQsZSxuKXtpZih0aGlzLmFjdGl2ZU9ic2VydmF0aW9uc189W10sdGhpcy5vYnNlcnZhdGlvbnNfPW5ldyBpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBjYWxsYmFjayBwcm92aWRlZCBhcyBwYXJhbWV0ZXIgMSBpcyBub3QgYSBmdW5jdGlvbi5cIik7dGhpcy5jYWxsYmFja189dCx0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy5jYWxsYmFja0N0eF89bn12YXIgVD1uZXcoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFdlYWtNYXA/V2Vha01hcDppKSxPPWZ1bmN0aW9uIHQoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbi5cIik7aWYoIWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcihcIjEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cIik7dmFyIG49YS5nZXRJbnN0YW5jZSgpLGk9bmV3IEUoZSxuLHRoaXMpO1Quc2V0KHRoaXMsaSl9O1tcIm9ic2VydmVcIixcInVub2JzZXJ2ZVwiLFwiZGlzY29ubmVjdFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe08ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuKHQ9VC5nZXQodGhpcykpW2VdLmFwcGx5KHQsYXJndW1lbnRzKX19KTt2YXIgUz12b2lkIDAhPT1lLlJlc2l6ZU9ic2VydmVyP2UuUmVzaXplT2JzZXJ2ZXI6TztNLmE9U30pLmNhbGwodGhpcyxlKDgpKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpPW4oMCk7bi5uKGkpLmF9LGZ1bmN0aW9uKHQsZSxuKXsodC5leHBvcnRzPW4oMykoITEpKS5wdXNoKFt0LmksXCJcXG4udnVlLW1vZGFsLXJlc2l6ZXIge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDEycHg7XFxuICBoZWlnaHQ6IDEycHg7XFxuICByaWdodDogMDtcXG4gIGJvdHRvbTogMDtcXG4gIHotaW5kZXg6IDk5OTk5OTk7XFxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gIGN1cnNvcjogc2UtcmVzaXplO1xcbn1cXG4udnVlLW1vZGFsLXJlc2l6ZXI6OmFmdGVyIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY29udGVudDogJyc7XFxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICB3aWR0aDogMDtcXG4gIGhlaWdodDogMDtcXG4gIGJvcmRlci1ib3R0b206IDEwcHggc29saWQgI2RkZDtcXG4gIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbn1cXG4udnVlLW1vZGFsLXJlc2l6ZXIuY2xpY2tlZDo6YWZ0ZXIge1xcbiAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCAjMzY5YmU5O1xcbn1cXG5cIixcIlwiXSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCl9Y2F0Y2godCl7XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX10LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpPW4oMSk7bi5uKGkpLmF9LGZ1bmN0aW9uKHQsZSxuKXsodC5leHBvcnRzPW4oMykoITEpKS5wdXNoKFt0LmksXCJcXG4udm0tLWJsb2NrLXNjcm9sbCB7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgd2lkdGg6IDEwMHZ3O1xcbn1cXG4udm0tLWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDB2aDtcXG4gIHotaW5kZXg6IDk5OTtcXG59XFxuLnZtLS1vdmVybGF5IHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMHZoO1xcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xcbiAgLyogei1pbmRleDogOTk5OyAqL1xcbiAgb3BhY2l0eTogMTtcXG59XFxuLnZtLS1jb250YWluZXIuc2Nyb2xsYWJsZSB7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAxMDB2aDtcXG4gIG92ZXJmbG93LXk6IGF1dG87XFxuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XFxufVxcbi52bS0tbW9kYWwge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gIGJveC1zaGFkb3c6IDAgMjBweCA2MHB4IC0ycHggcmdiYSgyNywgMzMsIDU4LCAwLjQpO1xcbn1cXG4udm0tLWNvbnRhaW5lci5zY3JvbGxhYmxlIC52bS0tbW9kYWwge1xcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xcbn1cXG4udm0tLXRvcC1yaWdodC1zbG90IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDA7XFxuICB0b3A6IDA7XFxufVxcbi52bS10cmFuc2l0aW9uLS1vdmVybGF5LWVudGVyLWFjdGl2ZSxcXG4udm0tdHJhbnNpdGlvbi0tb3ZlcmxheS1sZWF2ZS1hY3RpdmUge1xcbiAgdHJhbnNpdGlvbjogYWxsIDUwbXM7XFxufVxcbi52bS10cmFuc2l0aW9uLS1vdmVybGF5LWVudGVyLFxcbi52bS10cmFuc2l0aW9uLS1vdmVybGF5LWxlYXZlLWFjdGl2ZSB7XFxuICBvcGFjaXR5OiAwO1xcbn1cXG4udm0tdHJhbnNpdGlvbi0tbW9kYWwtZW50ZXItYWN0aXZlLFxcbi52bS10cmFuc2l0aW9uLS1tb2RhbC1sZWF2ZS1hY3RpdmUge1xcbiAgdHJhbnNpdGlvbjogYWxsIDQwMG1zO1xcbn1cXG4udm0tdHJhbnNpdGlvbi0tbW9kYWwtZW50ZXIsXFxuLnZtLXRyYW5zaXRpb24tLW1vZGFsLWxlYXZlLWFjdGl2ZSB7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMHB4KTtcXG59XFxuLnZtLXRyYW5zaXRpb24tLWRlZmF1bHQtZW50ZXItYWN0aXZlLFxcbi52bS10cmFuc2l0aW9uLS1kZWZhdWx0LWxlYXZlLWFjdGl2ZSB7XFxuICB0cmFuc2l0aW9uOiBhbGwgMm1zO1xcbn1cXG4udm0tdHJhbnNpdGlvbi0tZGVmYXVsdC1lbnRlcixcXG4udm0tdHJhbnNpdGlvbi0tZGVmYXVsdC1sZWF2ZS1hY3RpdmUge1xcbiAgb3BhY2l0eTogMDtcXG59XFxuXCIsXCJcIl0pfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9bigyKTtuLm4oaSkuYX0sZnVuY3Rpb24odCxlLG4peyh0LmV4cG9ydHM9bigzKSghMSkpLnB1c2goW3QuaSxcIlxcbi52dWUtZGlhbG9nIHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuLnZ1ZS1kaWFsb2cgZGl2IHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi52dWUtZGlhbG9nLWNvbnRlbnQge1xcbiAgZmxleDogMSAwIGF1dG87XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6IDE0cHg7XFxufVxcbi52dWUtZGlhbG9nLWNvbnRlbnQtdGl0bGUge1xcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXG4gIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbn1cXG4udnVlLWRpYWxvZy1idXR0b25zIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4OiAwIDEgYXV0bztcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7XFxufVxcbi52dWUtZGlhbG9nLWJ1dHRvbnMtbm9uZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbn1cXG4udnVlLWRpYWxvZy1idXR0b24ge1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICBwYWRkaW5nOiAwO1xcbiAgbWFyZ2luOiAwO1xcbiAgYm9yZGVyOiAwO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xcbiAgaGVpZ2h0OiA0MHB4O1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBmb250OiBpbmhlcml0O1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuLnZ1ZS1kaWFsb2ctYnV0dG9uOmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6ICNmOWY5Zjk7XFxufVxcbi52dWUtZGlhbG9nLWJ1dHRvbjphY3RpdmUge1xcbiAgYmFja2dyb3VuZDogI2YzZjNmMztcXG59XFxuLnZ1ZS1kaWFsb2ctYnV0dG9uOm5vdCg6Zmlyc3Qtb2YtdHlwZSkge1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWVlO1xcbn1cXG5cIixcIlwiXSl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtuLnIoZSksbi5kKGUsXCJNb2RhbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIFd9KSxuLmQoZSxcIkRpYWxvZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuIFV9KSxuLmQoZSxcInZlcnNpb25cIixmdW5jdGlvbigpe3JldHVybiBKfSk7ZnVuY3Rpb24gaSgpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gZS52aXNpYmxlP24oXCJkaXZcIix7Y2xhc3M6ZS5jb250YWluZXJDbGFzc30sW24oXCJ0cmFuc2l0aW9uXCIse2F0dHJzOntuYW1lOmUuZ3VhcmFudGVlZE92ZXJsYXlUcmFuc2l0aW9ufSxvbjp7XCJiZWZvcmUtZW50ZXJcIjplLmJlZm9yZU92ZXJsYXlUcmFuc2l0aW9uRW50ZXIsXCJhZnRlci1lbnRlclwiOmUuYWZ0ZXJPdmVybGF5VHJhbnNpdGlvbkVudGVyLFwiYmVmb3JlLWxlYXZlXCI6ZS5iZWZvcmVPdmVybGF5VHJhbnNpdGlvbkxlYXZlLFwiYWZ0ZXItbGVhdmVcIjplLmFmdGVyT3ZlcmxheVRyYW5zaXRpb25MZWF2ZX19LFtlLnZpc2liaWxpdHkub3ZlcmxheT9uKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidm0tLW92ZXJsYXlcIixhdHRyczp7XCJkYXRhLW1vZGFsXCI6ZS5uYW1lLFwiYXJpYS1leHBhbmRlZFwiOmUudmlzaWJpbGl0eS5vdmVybGF5LnRvU3RyaW5nKCl9LG9uOntjbGljazpmdW5jdGlvbih0KXtyZXR1cm4gdC50YXJnZXQhPT10LmN1cnJlbnRUYXJnZXQ/bnVsbDoodC5zdG9wUHJvcGFnYXRpb24oKSxlLm9uT3ZlcmxheUNsaWNrKHQpKX19fSxbbihcImRpdlwiLHtzdGF0aWNDbGFzczpcInZtLS10b3AtcmlnaHQtc2xvdFwifSxbZS5fdChcInRvcC1yaWdodFwiKV0sMildKTplLl9lKCldKSxlLl92KFwiIFwiKSxuKFwidHJhbnNpdGlvblwiLHthdHRyczp7bmFtZTplLmd1YXJhbnRlZWRNb2RhbFRyYW5zaXRpb259LG9uOntcImJlZm9yZS1lbnRlclwiOmUuYmVmb3JlTW9kYWxUcmFuc2l0aW9uRW50ZXIsXCJhZnRlci1lbnRlclwiOmUuYWZ0ZXJNb2RhbFRyYW5zaXRpb25FbnRlcixcImJlZm9yZS1sZWF2ZVwiOmUuYmVmb3JlTW9kYWxUcmFuc2l0aW9uTGVhdmUsXCJhZnRlci1sZWF2ZVwiOmUuYWZ0ZXJNb2RhbFRyYW5zaXRpb25MZWF2ZX19LFtlLnZpc2liaWxpdHkubW9kYWw/bihcImRpdlwiLHtyZWY6XCJtb2RhbFwiLGNsYXNzOmUubW9kYWxDbGFzcyxzdHlsZTplLm1vZGFsU3R5bGUsYXR0cnM6e1wiYXJpYS1leHBhbmRlZFwiOmUudmlzaWJpbGl0eS5tb2RhbC50b1N0cmluZygpLHJvbGU6XCJkaWFsb2dcIixcImFyaWEtbW9kYWxcIjpcInRydWVcIn19LFtlLl90KFwiZGVmYXVsdFwiKSxlLl92KFwiIFwiKSxlLnJlc2l6YWJsZSYmIWUuaXNBdXRvSGVpZ2h0P24oXCJyZXNpemVyXCIse2F0dHJzOntcIm1pbi13aWR0aFwiOmUubWluV2lkdGgsXCJtaW4taGVpZ2h0XCI6ZS5taW5IZWlnaHQsXCJtYXgtd2lkdGhcIjplLm1heFdpZHRoLFwibWF4LWhlaWdodFwiOmUubWF4SGVpZ2h0fSxvbjp7cmVzaXplOmUub25Nb2RhbFJlc2l6ZX19KTplLl9lKCldLDIpOmUuX2UoKV0pXSwxKTplLl9lKCl9ZnVuY3Rpb24gbygpe3ZhciB0PXRoaXMuJGNyZWF0ZUVsZW1lbnQ7cmV0dXJuKHRoaXMuX3NlbGYuX2N8fHQpKFwiZGl2XCIse2NsYXNzOnRoaXMuY2xhc3NOYW1lfSl9by5fd2l0aFN0cmlwcGVkPWkuX3dpdGhTdHJpcHBlZD0hMDtmdW5jdGlvbiBoKHQsZSxuKXtyZXR1cm4gbjx0P3Q6ZTxuP2U6bn1mdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbih0LGUpe3ZhciBuPVtdLGk9ITAsbz0hMSxyPXZvaWQgMDt0cnl7Zm9yKHZhciBhLHM9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShpPShhPXMubmV4dCgpKS5kb25lKSYmKG4ucHVzaChhLnZhbHVlKSwhZXx8bi5sZW5ndGghPT1lKTtpPSEwKTt9Y2F0Y2godCl7bz0hMCxyPXR9ZmluYWxseXt0cnl7aXx8bnVsbD09cy5yZXR1cm58fHMucmV0dXJuKCl9ZmluYWxseXtpZihvKXRocm93IHJ9fXJldHVybiBufSh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpfSgpfWZ1bmN0aW9uIHMoKXt2YXIgdD13aW5kb3cuaW5uZXJXaWR0aCxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtyZXR1cm4gdCYmZT9NYXRoLm1pbih0LGUpOmV8fHR9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gdC5zcGxpdChcIjtcIikubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pLmZpbHRlcihCb29sZWFuKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoXCI6XCIpfSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7dmFyIG49YShlLDIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGk9T2JqZWN0LmtleXMobik7XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKGk9aS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxpLmZvckVhY2goZnVuY3Rpb24odCl7cihlLHQsblt0XSl9KX1yZXR1cm4gZX0oe30sdCxyKHt9LG5bMF0sblsxXSkpfSx7fSl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gdC50b3VjaGVzJiYwPHQudG91Y2hlcy5sZW5ndGg/dC50b3VjaGVzWzBdOnR9dmFyIHA9W1wiSU5QVVRcIixcIlRFWFRBUkVBXCIsXCJTRUxFQ1RcIl0sYz1mdW5jdGlvbih0KXt2YXIgZT0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PXQ/dDowO3JldHVybiBmdW5jdGlvbigpe3JldHVybihlKyspLnRvU3RyaW5nKCl9fSgpLHU9e25hbWU6XCJWdWVKc01vZGFsUmVzaXplclwiLHByb3BzOnttaW5IZWlnaHQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sbWluV2lkdGg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MH0sbWF4V2lkdGg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9LG1heEhlaWdodDp7dHlwZTpOdW1iZXIsZGVmYXVsdDpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y2xpY2tlZDohMSxzaXplOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuJGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLnN0YXJ0LCExKX0sY29tcHV0ZWQ6e2NsYXNzTmFtZTpmdW5jdGlvbigpe3JldHVybltcInZ1ZS1tb2RhbC1yZXNpemVyXCIse2NsaWNrZWQ6dGhpcy5jbGlja2VkfV19fSxtZXRob2RzOntzdGFydDpmdW5jdGlvbih0KXt0aGlzLmNsaWNrZWQ9ITAsd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLm1vdXNlbW92ZSwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5zdG9wLCExKSx0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuY2xpY2tlZD0hMSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMubW91c2Vtb3ZlLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLnN0b3AsITEpLHRoaXMuJGVtaXQoXCJyZXNpemUtc3RvcFwiLHtlbGVtZW50OnRoaXMuJGVsLnBhcmVudEVsZW1lbnQsc2l6ZTp0aGlzLnNpemV9KX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKHQpe3RoaXMucmVzaXplKHQpfSxyZXNpemU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kZWwucGFyZW50RWxlbWVudDtpZihlKXt2YXIgbj10LmNsaWVudFgtZS5vZmZzZXRMZWZ0LGk9dC5jbGllbnRZLWUub2Zmc2V0VG9wLG89TWF0aC5taW4ocygpLHRoaXMubWF4V2lkdGgpLHI9TWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LHRoaXMubWF4SGVpZ2h0KTtuPWgodGhpcy5taW5XaWR0aCxvLG4pLGk9aCh0aGlzLm1pbkhlaWdodCxyLGkpLHRoaXMuc2l6ZT17d2lkdGg6bixoZWlnaHQ6aX0sZS5zdHlsZS53aWR0aD1uK1wicHhcIixlLnN0eWxlLmhlaWdodD1pK1wicHhcIix0aGlzLiRlbWl0KFwicmVzaXplXCIse2VsZW1lbnQ6ZSxzaXplOnRoaXMuc2l6ZX0pfX19fTtuKDYpO2Z1bmN0aW9uIGQodCxlLG4saSxvLHIsYSxzKXt2YXIgbCx1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5vcHRpb25zOnQ7aWYoZSYmKHUucmVuZGVyPWUsdS5zdGF0aWNSZW5kZXJGbnM9bix1Ll9jb21waWxlZD0hMCksaSYmKHUuZnVuY3Rpb25hbD0hMCksciYmKHUuX3Njb3BlSWQ9XCJkYXRhLXYtXCIrciksYT8obD1mdW5jdGlvbih0KXsodD10fHx0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dHx8dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiR2bm9kZSYmdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfX3x8KHQ9X19WVUVfU1NSX0NPTlRFWFRfXyksbyYmby5jYWxsKHRoaXMsdCksdCYmdC5fcmVnaXN0ZXJlZENvbXBvbmVudHMmJnQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChhKX0sdS5fc3NyUmVnaXN0ZXI9bCk6byYmKGw9cz9mdW5jdGlvbigpe28uY2FsbCh0aGlzLHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCl9Om8pLGwpaWYodS5mdW5jdGlvbmFsKXt1Ll9pbmplY3RTdHlsZXM9bDt2YXIgYz11LnJlbmRlcjt1LnJlbmRlcj1mdW5jdGlvbih0LGUpe3JldHVybiBsLmNhbGwoZSksYyh0LGUpfX1lbHNle3ZhciBkPXUuYmVmb3JlQ3JlYXRlO3UuYmVmb3JlQ3JlYXRlPWQ/W10uY29uY2F0KGQsbCk6W2xdfXJldHVybntleHBvcnRzOnQsb3B0aW9uczp1fX12YXIgdj1kKHUsbyxbXSwhMSxudWxsLG51bGwsbnVsbCk7di5vcHRpb25zLl9fZmlsZT1cInNyYy9jb21wb25lbnRzL1Jlc2l6ZXIudnVlXCI7dmFyIG09di5leHBvcnRzO2Z1bmN0aW9uIGIodCl7cmV0dXJuKGI9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIHkodCl7c3dpdGNoKGIodCkpe2Nhc2VcIm51bWJlclwiOnJldHVybnt0eXBlOlwicHhcIix2YWx1ZTp0fTtjYXNlXCJzdHJpbmdcIjpyZXR1cm4gZnVuY3Rpb24oZSl7aWYoXCJhdXRvXCI9PT1lKXJldHVybnt0eXBlOmUsdmFsdWU6MH07dmFyIHQ9Xy5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZ2V4cC50ZXN0KGUpfSk7cmV0dXJuIHQ/e3R5cGU6dC5uYW1lLHZhbHVlOnBhcnNlRmxvYXQoZSl9Ont0eXBlOlwiXCIsdmFsdWU6ZX19KHQpO2RlZmF1bHQ6cmV0dXJue3R5cGU6XCJcIix2YWx1ZTp0fX19ZnVuY3Rpb24gZyh0KXtpZihcInN0cmluZ1wiIT10eXBlb2YgdClyZXR1cm4gMDw9dDt2YXIgZT15KHQpO3JldHVybihcIiVcIj09PWUudHlwZXx8XCJweFwiPT09ZS50eXBlKSYmMDxlLnZhbHVlfXZhciB3PVwiWy0rXT9bMC05XSouP1swLTldK1wiLF89W3tuYW1lOlwicHhcIixyZWdleHA6bmV3IFJlZ0V4cChcIl5cIi5jb25jYXQodyxcInB4JFwiKSl9LHtuYW1lOlwiJVwiLHJlZ2V4cDpuZXcgUmVnRXhwKFwiXlwiLmNvbmNhdCh3LFwiJSRcIikpfSx7bmFtZTpcInB4XCIscmVnZXhwOm5ldyBSZWdFeHAoXCJeXCIuY29uY2F0KHcsXCIkXCIpKX1dLEU9big1KSx4PVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5SZXNpemVPYnNlcnZlcj9SZXNpemVPYnNlcnZlcjpFLmE7ZnVuY3Rpb24gVCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dO2kuZW51bWVyYWJsZT1pLmVudW1lcmFibGV8fCExLGkuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gTyh0KXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBlPTAsbj1uZXcgQXJyYXkodC5sZW5ndGgpO2U8dC5sZW5ndGg7ZSsrKW5bZV09dFtlXTtyZXR1cm4gbn19KHQpfHxmdW5jdGlvbih0KXtpZihTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpfHxcIltvYmplY3QgQXJndW1lbnRzXVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIil9KCl9ZnVuY3Rpb24gUyh0KXtyZXR1cm4gZT0nYnV0dG9uOm5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgYVtocmVmXTpub3QoW2Rpc2FibGVkXSksIGFyZWFbaHJlZl06bm90KFtkaXNhYmxlZF0pLCBbY29udGVudEVkaXRhYmxlPVwiXCJdOm5vdChbZGlzYWJsZWRdKSwgW2NvbnRlbnRFZGl0YWJsZT1cInRydWVcIl06bm90KFtkaXNhYmxlZF0pLCBbY29udGVudEVkaXRhYmxlPVwiVFJVRVwiXTpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgaWZyYW1lOm5vdChbZGlzYWJsZWRdKSwgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLCBzdW1tYXJ5Om5vdChbZGlzYWJsZWRdKSwgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxPKHQucXVlcnlTZWxlY3RvckFsbChlKXx8W10pO3ZhciBlfWZ1bmN0aW9uIE0odCl7cmV0dXJuIHQ9PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9dmFyIGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSx0aGlzLnJvb3Q9bnVsbCx0aGlzLmVsZW1lbnRzPVtdLHRoaXMub25LZXlEb3duPXRoaXMub25LZXlEb3duLmJpbmQodGhpcyksdGhpcy5lbmFibGU9dGhpcy5lbmFibGUuYmluZCh0aGlzKSx0aGlzLmRpc2FibGU9dGhpcy5kaXNhYmxlLmJpbmQodGhpcyksdGhpcy5maXJzdEVsZW1lbnQ9dGhpcy5maXJzdEVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLmxhc3RFbGVtZW50PXRoaXMubGFzdEVsZW1lbnQuYmluZCh0aGlzKX12YXIgZSxuLGk7cmV0dXJuIGU9dCwobj1be2tleTpcImxhc3RFbGVtZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50c1t0aGlzLmVsZW1lbnRzLmxlbmd0aC0xXXx8bnVsbH19LHtrZXk6XCJmaXJzdEVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzWzBdfHxudWxsfX0se2tleTpcIm9uS2V5RG93blwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO2lmKFwiVGFiXCI9PT0oZT10KS5rZXl8fDk9PT1lLmtleUNvZGUpcmV0dXJuIHQuc2hpZnRLZXkmJk0odGhpcy5maXJzdEVsZW1lbnQoKSk/KHRoaXMubGFzdEVsZW1lbnQoKS5mb2N1cygpLHZvaWQgdC5wcmV2ZW50RGVmYXVsdCgpKTohZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8TSh0aGlzLmxhc3RFbGVtZW50KCkpPyh0aGlzLmZpcnN0RWxlbWVudCgpLmZvY3VzKCksdm9pZCB0LnByZXZlbnREZWZhdWx0KCkpOnZvaWQgMH19LHtrZXk6XCJlbmFibGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucm9vdH19LHtrZXk6XCJlbmFibGVcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0KXt0aGlzLnJvb3Q9dCx0aGlzLmVsZW1lbnRzPVModGhpcy5yb290KTt2YXIgZT10aGlzLmZpcnN0RWxlbWVudCgpO2UmJmUuZm9jdXMoKSx0aGlzLnJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0aGlzLm9uS2V5RG93bil9fX0se2tleTpcImRpc2FibGVcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMub25LZXlEb3duKSx0aGlzLnJvb3Q9bnVsbH19XSkmJlQoZS5wcm90b3R5cGUsbiksaSYmVChlLGkpLHR9KCk7ZnVuY3Rpb24gTCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24geih0LGUpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCxlKXt2YXIgbj1bXSxpPSEwLG89ITEscj12b2lkIDA7dHJ5e2Zvcih2YXIgYSxzPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEoaT0oYT1zLm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIWV8fG4ubGVuZ3RoIT09ZSk7aT0hMCk7fWNhdGNoKHQpe289ITAscj10fWZpbmFsbHl7dHJ5e2l8fG51bGw9PXMucmV0dXJufHxzLnJldHVybigpfWZpbmFsbHl7aWYobyl0aHJvdyByfX1yZXR1cm4gbn0odCxlKXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKX0oKX12YXIgJD1cInZtLXRyYW5zaXRpb24tLWRlZmF1bHRcIixBPVwiZW50ZXJcIixDPVwiZW50ZXJpbmdcIixqPVwibGVhdmVcIixSPVwibGVhdm5nXCIsSD17bmFtZTpcIlZ1ZUpzTW9kYWxcIixwcm9wczp7bmFtZTp7cmVxdWlyZWQ6ITAsdHlwZTpTdHJpbmd9LHJlc2l6YWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGFkYXB0aXZlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZHJhZ2dhYmxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2Nyb2xsYWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGZvY3VzVHJhcDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHJlc2V0Ont0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sb3ZlcmxheVRyYW5zaXRpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJ2bS10cmFuc2l0aW9uLS1vdmVybGF5XCJ9LHRyYW5zaXRpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6XCJ2bS10cmFuc2l0aW9uLS1tb2RhbFwifSxjbGlja1RvQ2xvc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxjbGFzc2VzOnt0eXBlOltTdHJpbmcsQXJyYXldLGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHN0eWxlczp7dHlwZTpbU3RyaW5nLEFycmF5LE9iamVjdF19LG1pbldpZHRoOnt0eXBlOk51bWJlcixkZWZhdWx0OjAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiAwPD10fX0sbWluSGVpZ2h0Ont0eXBlOk51bWJlcixkZWZhdWx0OjAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiAwPD10fX0sbWF4V2lkdGg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9LG1heEhlaWdodDp7dHlwZTpOdW1iZXIsZGVmYXVsdDpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0sd2lkdGg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NjAwLHZhbGlkYXRvcjpnfSxoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MzAwLHZhbGlkYXRvcjpmdW5jdGlvbih0KXtyZXR1cm5cImF1dG9cIj09PXR8fGcodCl9fSxzaGlmdFg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6LjUsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiAwPD10JiZ0PD0xfX0sc2hpZnRZOnt0eXBlOk51bWJlcixkZWZhdWx0Oi41LHZhbGlkYXRvcjpmdW5jdGlvbih0KXtyZXR1cm4gMDw9dCYmdDw9MX19fSxjb21wb25lbnRzOntSZXNpemVyOm19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57dmlzaWJsZTohMSx2aXNpYmlsaXR5Onttb2RhbDohMSxvdmVybGF5OiExfSxvdmVybGF5VHJhbnNpdGlvblN0YXRlOm51bGwsbW9kYWxUcmFuc2l0aW9uU3RhdGU6bnVsbCxzaGlmdExlZnQ6MCxzaGlmdFRvcDowLG1vZGFsOnt3aWR0aDowLHdpZHRoVHlwZTpcInB4XCIsaGVpZ2h0OjAsaGVpZ2h0VHlwZTpcInB4XCIscmVuZGVyZWRIZWlnaHQ6MH0sdmlld3BvcnRIZWlnaHQ6MCx2aWV3cG9ydFdpZHRoOjB9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXRJbml0aWFsU2l6ZSgpfSxiZWZvcmVNb3VudDpmdW5jdGlvbigpe3RoaXMuJG1vZGFsLnN1YnNjcmlwdGlvbi4kb24oXCJ0b2dnbGVcIix0aGlzLm9uVG9nZ2xlKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMub25XaW5kb3dSZXNpemUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib3JpZW50YXRpb25jaGFuZ2VcIix0aGlzLm9uV2luZG93UmVzaXplKSx0aGlzLm9uV2luZG93UmVzaXplKCksdGhpcy5zY3JvbGxhYmxlJiYhdGhpcy5pc0F1dG9IZWlnaHQmJmNvbnNvbGUud2FybignTW9kYWwgXCInLmNvbmNhdCh0aGlzLm5hbWUsJ1wiIGhhcyBzY3JvbGxhYmxlIGZsYWcgc2V0IHRvIHRydWUgJykrJ2J1dCBoZWlnaHQgaXMgbm90IFwiYXV0b1wiICgnLmNvbmNhdCh0aGlzLmhlaWdodCxcIilcIikpLHRoaXMuY2xpY2tUb0Nsb3NlJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsdGhpcy5vbkVzY2FwZUtleVVwKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5yZXNpemVPYnNlcnZlcj1uZXcgeChmdW5jdGlvbih0KXtpZigwPHQubGVuZ3RoKXt2YXIgZT16KHQsMSlbMF07bi5tb2RhbC5yZW5kZXJlZEhlaWdodD1lLmNvbnRlbnRSZWN0LmhlaWdodH19KSx0aGlzLiRmb2N1c1RyYXA9bmV3IGt9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRtb2RhbC5zdWJzY3JpcHRpb24uJG9mZihcInRvZ2dsZVwiLHRoaXMub25Ub2dnbGUpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5vbldpbmRvd1Jlc2l6ZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvcmllbnRhdGlvbmNoYW5nZVwiLHRoaXMub25XaW5kb3dSZXNpemUpLHRoaXMuY2xpY2tUb0Nsb3NlJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsdGhpcy5vbkVzY2FwZUtleVVwKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJ2bS0tYmxvY2stc2Nyb2xsXCIpfSxjb21wdXRlZDp7Z3VhcmFudGVlZE92ZXJsYXlUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxheVRyYW5zaXRpb258fCR9LGd1YXJhbnRlZWRNb2RhbFRyYW5zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2l0aW9ufHwkfSxpc0F1dG9IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm5cImF1dG9cIj09PXRoaXMubW9kYWwuaGVpZ2h0VHlwZX0scG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXdwb3J0SGVpZ2h0LGU9dGhpcy52aWV3cG9ydFdpZHRoLG49dGhpcy5zaGlmdExlZnQsaT10aGlzLnNoaWZ0VG9wLG89dGhpcy5zaGlmdFgscj10aGlzLnNoaWZ0WSxhPXRoaXMudHJ1ZU1vZGFsV2lkdGgscz10aGlzLnRydWVNb2RhbEhlaWdodCxsPWUtYSx1PU1hdGgubWF4KHQtcywwKSxjPWkrcip1O3JldHVybntsZWZ0OnBhcnNlSW50KGgoMCxsLG4rbypsKSksdG9wOiFzJiZ0aGlzLmlzQXV0b0hlaWdodD92b2lkIDA6cGFyc2VJbnQoaCgwLHUsYykpfX0sdHJ1ZU1vZGFsV2lkdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXdwb3J0V2lkdGgsZT10aGlzLm1vZGFsLG49dGhpcy5hZGFwdGl2ZSxpPXRoaXMubWluV2lkdGgsbz10aGlzLm1heFdpZHRoLHI9XCIlXCI9PT1lLndpZHRoVHlwZT90LzEwMCplLndpZHRoOmUud2lkdGg7aWYobil7dmFyIGE9TWF0aC5tYXgoaSxNYXRoLm1pbih0LG8pKTtyZXR1cm4gaChpLGEscil9cmV0dXJuIHJ9LHRydWVNb2RhbEhlaWdodDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlld3BvcnRIZWlnaHQsZT10aGlzLm1vZGFsLG49dGhpcy5pc0F1dG9IZWlnaHQsaT10aGlzLmFkYXB0aXZlLG89dGhpcy5taW5IZWlnaHQscj10aGlzLm1heEhlaWdodCxhPVwiJVwiPT09ZS5oZWlnaHRUeXBlP3QvMTAwKmUuaGVpZ2h0OmUuaGVpZ2h0O2lmKG4pcmV0dXJuIHRoaXMubW9kYWwucmVuZGVyZWRIZWlnaHQ7aWYoaSl7dmFyIHM9TWF0aC5tYXgobyxNYXRoLm1pbih0LHIpKTtyZXR1cm4gaChvLHMsYSl9cmV0dXJuIGF9LGF1dG9IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGFwdGl2ZSYmdGhpcy5tb2RhbC5yZW5kZXJlZEhlaWdodD49dGhpcy52aWV3cG9ydEhlaWdodD9NYXRoLm1heCh0aGlzLm1pbkhlaWdodCx0aGlzLnZpZXdwb3J0SGVpZ2h0KStcInB4XCI6XCJhdXRvXCJ9LGNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuW1widm0tLWNvbnRhaW5lclwiLHRoaXMuc2Nyb2xsYWJsZSYmdGhpcy5pc0F1dG9IZWlnaHQmJlwic2Nyb2xsYWJsZVwiXX0sbW9kYWxDbGFzczpmdW5jdGlvbigpe3JldHVybltcInZtLS1tb2RhbFwiLHRoaXMuY2xhc3Nlc119LHN0eWxlc1Byb3A6ZnVuY3Rpb24oKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdGhpcy5zdHlsZXM/bCh0aGlzLnN0eWxlcyk6dGhpcy5zdHlsZXN9LG1vZGFsU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5zdHlsZXNQcm9wLHt0b3A6dGhpcy5wb3NpdGlvbi50b3ArXCJweFwiLGxlZnQ6dGhpcy5wb3NpdGlvbi5sZWZ0K1wicHhcIix3aWR0aDp0aGlzLnRydWVNb2RhbFdpZHRoK1wicHhcIixoZWlnaHQ6dGhpcy5pc0F1dG9IZWlnaHQ/dGhpcy5hdXRvSGVpZ2h0OnRoaXMudHJ1ZU1vZGFsSGVpZ2h0K1wicHhcIn1dfSxpc0NvbXBvbmVudFJlYWR5VG9CZURlc3Ryb3llZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJsYXlUcmFuc2l0aW9uU3RhdGU9PT1qJiZ0aGlzLm1vZGFsVHJhbnNpdGlvblN0YXRlPT09an19LHdhdGNoOntpc0NvbXBvbmVudFJlYWR5VG9CZURlc3Ryb3llZDpmdW5jdGlvbih0KXt0JiYodGhpcy52aXNpYmxlPSExKX19LG1ldGhvZHM6e3N0YXJ0VHJhbnNpdGlvbkVudGVyOmZ1bmN0aW9uKCl7dGhpcy52aXNpYmlsaXR5Lm92ZXJsYXk9ITAsdGhpcy52aXNpYmlsaXR5Lm1vZGFsPSEwfSxzdGFydFRyYW5zaXRpb25MZWF2ZTpmdW5jdGlvbigpe3RoaXMudmlzaWJpbGl0eS5vdmVybGF5PSExLHRoaXMudmlzaWJpbGl0eS5tb2RhbD0hMX0sYmVmb3JlT3ZlcmxheVRyYW5zaXRpb25FbnRlcjpmdW5jdGlvbigpe3RoaXMub3ZlcmxheVRyYW5zaXRpb25TdGF0ZT1DfSxhZnRlck92ZXJsYXlUcmFuc2l0aW9uRW50ZXI6ZnVuY3Rpb24oKXt0aGlzLm92ZXJsYXlUcmFuc2l0aW9uU3RhdGU9QX0sYmVmb3JlT3ZlcmxheVRyYW5zaXRpb25MZWF2ZTpmdW5jdGlvbigpe3RoaXMub3ZlcmxheVRyYW5zaXRpb25TdGF0ZT1SfSxhZnRlck92ZXJsYXlUcmFuc2l0aW9uTGVhdmU6ZnVuY3Rpb24oKXt0aGlzLm92ZXJsYXlUcmFuc2l0aW9uU3RhdGU9an0sYmVmb3JlTW9kYWxUcmFuc2l0aW9uRW50ZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMubW9kYWxUcmFuc2l0aW9uU3RhdGU9Qyx0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe3QucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0LiRyZWZzLm1vZGFsKX0pfSxhZnRlck1vZGFsVHJhbnNpdGlvbkVudGVyOmZ1bmN0aW9uKCl7dGhpcy5tb2RhbFRyYW5zaXRpb25TdGF0ZT1BLHRoaXMuZHJhZ2dhYmxlJiZ0aGlzLmFkZERyYWdnYWJsZUxpc3RlbmVycygpLHRoaXMuZm9jdXNUcmFwJiZ0aGlzLiRmb2N1c1RyYXAuZW5hYmxlKHRoaXMuJHJlZnMubW9kYWwpO3ZhciB0PXRoaXMuY3JlYXRlTW9kYWxFdmVudCh7c3RhdGU6XCJvcGVuZWRcIn0pO3RoaXMuJGVtaXQoXCJvcGVuZWRcIix0KX0sYmVmb3JlTW9kYWxUcmFuc2l0aW9uTGVhdmU6ZnVuY3Rpb24oKXt0aGlzLm1vZGFsVHJhbnNpdGlvblN0YXRlPVIsdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy4kcmVmcy5tb2RhbCksdGhpcy4kZm9jdXNUcmFwLmVuYWJsZWQoKSYmdGhpcy4kZm9jdXNUcmFwLmRpc2FibGUoKX0sYWZ0ZXJNb2RhbFRyYW5zaXRpb25MZWF2ZTpmdW5jdGlvbigpe3RoaXMubW9kYWxUcmFuc2l0aW9uU3RhdGU9ajt2YXIgdD10aGlzLmNyZWF0ZU1vZGFsRXZlbnQoe3N0YXRlOlwiY2xvc2VkXCJ9KTt0aGlzLiRlbWl0KFwiY2xvc2VkXCIsdCl9LG9uVG9nZ2xlOmZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLm5hbWU9PT10KXt2YXIgaT12b2lkIDA9PT1lPyF0aGlzLnZpc2libGU6ZTt0aGlzLnRvZ2dsZShpLG4pfX0sc2V0SW5pdGlhbFNpemU6ZnVuY3Rpb24oKXt2YXIgdD15KHRoaXMud2lkdGgpLGU9eSh0aGlzLmhlaWdodCk7dGhpcy5tb2RhbC53aWR0aD10LnZhbHVlLHRoaXMubW9kYWwud2lkdGhUeXBlPXQudHlwZSx0aGlzLm1vZGFsLmhlaWdodD1lLnZhbHVlLHRoaXMubW9kYWwuaGVpZ2h0VHlwZT1lLnR5cGV9LG9uRXNjYXBlS2V5VXA6ZnVuY3Rpb24odCl7Mjc9PT10LndoaWNoJiZ0aGlzLnZpc2libGUmJnRoaXMuJG1vZGFsLmhpZGUodGhpcy5uYW1lKX0sb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLnZpZXdwb3J0V2lkdGg9cygpLHRoaXMudmlld3BvcnRIZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0LHRoaXMuZW5zdXJlU2hpZnRJbldpbmRvd0JvdW5kcygpfSxjcmVhdGVNb2RhbEV2ZW50OmZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90Ont9O3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGk9T2JqZWN0LmtleXMobik7XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKGk9aS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxpLmZvckVhY2goZnVuY3Rpb24odCl7TChlLHQsblt0XSl9KX1yZXR1cm4gZX0oe25hbWU6dGhpcy5uYW1lLHJlZjp0aGlzLiRyZWZzLm1vZGFsfHxudWxsfSxlKX0sb25Nb2RhbFJlc2l6ZTpmdW5jdGlvbih0KXt0aGlzLm1vZGFsLndpZHRoVHlwZT1cInB4XCIsdGhpcy5tb2RhbC53aWR0aD10LnNpemUud2lkdGgsdGhpcy5tb2RhbC5oZWlnaHRUeXBlPVwicHhcIix0aGlzLm1vZGFsLmhlaWdodD10LnNpemUuaGVpZ2h0O3ZhciBlPXRoaXMubW9kYWwuc2l6ZTt0aGlzLiRlbWl0KFwicmVzaXplXCIsdGhpcy5jcmVhdGVNb2RhbEV2ZW50KHtzaXplOmV9KSl9LG9wZW46ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLnJlc2V0JiYodGhpcy5zZXRJbml0aWFsU2l6ZSgpLHRoaXMuc2hpZnRMZWZ0PTAsdGhpcy5zaGlmdFRvcD0wKSx0aGlzLnNjcm9sbGFibGUmJmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcInZtLS1ibG9jay1zY3JvbGxcIik7dmFyIG49ITEsaT10aGlzLmNyZWF0ZU1vZGFsRXZlbnQoe2NhbmNlbDpmdW5jdGlvbigpe249ITB9LHN0YXRlOlwiYmVmb3JlLW9wZW5cIixwYXJhbXM6dH0pO3RoaXMuJGVtaXQoXCJiZWZvcmUtb3BlblwiLGkpLG4/dGhpcy5zY3JvbGxhYmxlJiZkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJ2bS0tYmxvY2stc2Nyb2xsXCIpOihcInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJlwiQk9EWVwiIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpLHRoaXMudmlzaWJsZT0hMCx0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe2Uuc3RhcnRUcmFuc2l0aW9uRW50ZXIoKX0pKX0sY2xvc2U6ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxhYmxlJiZkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJ2bS0tYmxvY2stc2Nyb2xsXCIpO3ZhciBlPSExLG49dGhpcy5jcmVhdGVNb2RhbEV2ZW50KHtjYW5jZWw6ZnVuY3Rpb24oKXtlPSEwfSxzdGF0ZTpcImJlZm9yZS1jbG9zZVwiLHBhcmFtczp0fSk7dGhpcy4kZW1pdChcImJlZm9yZS1jbG9zZVwiLG4pLGV8fHRoaXMuc3RhcnRUcmFuc2l0aW9uTGVhdmUoKX0sdG9nZ2xlOmZ1bmN0aW9uKHQsZSl7dGhpcy52aXNpYmxlIT09dCYmKHQ/dGhpcy5vcGVuKGUpOnRoaXMuY2xvc2UoZSkpfSxnZXREcmFnZ2FibGVFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuITA9PT10aGlzLmRyYWdnYWJsZT90aGlzLiRyZWZzLm1vZGFsOlwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLmRyYWdnYWJsZT90aGlzLiRyZWZzLm1vZGFsLnF1ZXJ5U2VsZWN0b3IodGhpcy5kcmFnZ2FibGUpOm51bGx9LG9uT3ZlcmxheUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5jbGlja1RvQ2xvc2UmJnRoaXMudG9nZ2xlKCExKX0sYWRkRHJhZ2dhYmxlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyx0PXRoaXMuZ2V0RHJhZ2dhYmxlRWxlbWVudCgpO2lmKHQpe3ZhciBzPTAsbD0wLHU9MCxjPTAsZT1mdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtpZighKG49ZSl8fC0xPT09cC5pbmRleE9mKG4ubm9kZU5hbWUpKXt2YXIgbixpPWYodCksbz1pLmNsaWVudFgscj1pLmNsaWVudFk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLGQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixkKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLGgpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGgpLHM9byxsPXIsdT1hLnNoaWZ0TGVmdCxjPWEuc2hpZnRUb3B9fSxkPWZ1bmN0aW9uKHQpe3ZhciBlPWYodCksbj1lLmNsaWVudFgsaT1lLmNsaWVudFk7YS5zaGlmdExlZnQ9dStuLXMsYS5zaGlmdFRvcD1jK2ktbCx0LnByZXZlbnREZWZhdWx0KCl9LGg9ZnVuY3Rpb24gdChlKXthLmVuc3VyZVNoaWZ0SW5XaW5kb3dCb3VuZHMoKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsZCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLGQpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdCksZS5wcmV2ZW50RGVmYXVsdCgpfTt0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIixlKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsZSl9fSxlbnN1cmVTaGlmdEluV2luZG93Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3cG9ydEhlaWdodCxlPXRoaXMudmlld3BvcnRXaWR0aCxuPXRoaXMuc2hpZnRMZWZ0LGk9dGhpcy5zaGlmdFRvcCxvPXRoaXMuc2hpZnRYLHI9dGhpcy5zaGlmdFksYT10aGlzLnRydWVNb2RhbFdpZHRoLHM9dGhpcy50cnVlTW9kYWxIZWlnaHQsbD1lLWEsdT1NYXRoLm1heCh0LXMsMCksYz1uK28qbCxkPWkrcip1O3RoaXMuc2hpZnRMZWZ0LT1jLWgoMCxsLGMpLHRoaXMuc2hpZnRUb3AtPWQtaCgwLHUsZCl9fX0sTj0obig5KSxkKEgsaSxbXSwhMSxudWxsLG51bGwsbnVsbCkpO04ub3B0aW9ucy5fX2ZpbGU9XCJzcmMvY29tcG9uZW50cy9Nb2RhbC52dWVcIjtmdW5jdGlvbiBEKCl7dmFyIG49dGhpcyx0PW4uJGNyZWF0ZUVsZW1lbnQsaT1uLl9zZWxmLl9jfHx0O3JldHVybiBpKG4uJG1vZGFsLmNvbnRleHQuY29tcG9uZW50TmFtZSx7dGFnOlwiY29tcG9uZW50XCIsYXR0cnM6e25hbWU6XCJkaWFsb2dcIixoZWlnaHQ6XCJhdXRvXCIsY2xhc3NlczpbXCJ2dWUtZGlhbG9nXCIsdGhpcy5wYXJhbXMuY2xhc3NdLHdpZHRoOm4ud2lkdGgsXCJzaGlmdC15XCI6LjMsYWRhcHRpdmU6ITAsXCJmb2N1cy10cmFwXCI6ITAsY2xpY2tUb0Nsb3NlOm4uY2xpY2tUb0Nsb3NlLHRyYW5zaXRpb246bi50cmFuc2l0aW9ufSxvbjp7XCJiZWZvcmUtb3BlblwiOm4uYmVmb3JlT3BlbmVkLFwiYmVmb3JlLWNsb3NlXCI6bi5iZWZvcmVDbG9zZWQsb3BlbmVkOmZ1bmN0aW9uKHQpe3JldHVybiBuLiRlbWl0KFwib3BlbmVkXCIsdCl9LGNsb3NlZDpmdW5jdGlvbih0KXtyZXR1cm4gbi4kZW1pdChcImNsb3NlZFwiLHQpfX19LFtpKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidnVlLWRpYWxvZy1jb250ZW50XCJ9LFtuLnBhcmFtcy50aXRsZT9pKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidnVlLWRpYWxvZy1jb250ZW50LXRpdGxlXCIsZG9tUHJvcHM6e2lubmVySFRNTDpuLl9zKG4ucGFyYW1zLnRpdGxlfHxcIlwiKX19KTpuLl9lKCksbi5fdihcIiBcIiksbi5wYXJhbXMuY29tcG9uZW50P2kobi5wYXJhbXMuY29tcG9uZW50LG4uX2Ioe3RhZzpcImNvbXBvbmVudFwifSxcImNvbXBvbmVudFwiLG4ucGFyYW1zLnByb3BzLCExKSk6aShcImRpdlwiLHtkb21Qcm9wczp7aW5uZXJIVE1MOm4uX3Mobi5wYXJhbXMudGV4dHx8XCJcIil9fSldLDEpLG4uX3YoXCIgXCIpLG4uYnV0dG9ucz9pKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidnVlLWRpYWxvZy1idXR0b25zXCJ9LG4uX2wobi5idXR0b25zLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkoXCJidXR0b25cIix7a2V5OmUsY2xhc3M6dC5jbGFzc3x8XCJ2dWUtZGlhbG9nLWJ1dHRvblwiLHN0eWxlOm4uYnV0dG9uU3R5bGUsYXR0cnM6e3R5cGU6XCJidXR0b25cIix0YWJpbmRleDpcIjBcIn0sZG9tUHJvcHM6e2lubmVySFRNTDpuLl9zKHQudGl0bGUpfSxvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RvcFByb3BhZ2F0aW9uKCksbi5jbGljayhlLHQpfX19LFtuLl92KG4uX3ModC50aXRsZSkpXSl9KSwwKTppKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidnVlLWRpYWxvZy1idXR0b25zLW5vbmVcIn0pXSl9dmFyIFc9Ti5leHBvcnRzO0QuX3dpdGhTdHJpcHBlZD0hMDt2YXIgUD17bmFtZTpcIlZ1ZUpzRGlhbG9nXCIscHJvcHM6e3dpZHRoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjQwMH0sY2xpY2tUb0Nsb3NlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH0sdHJhbnNpdGlvbjp7dHlwZTpTdHJpbmd9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3BhcmFtczp7fX19LGNvbXB1dGVkOntidXR0b25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyYW1zLmJ1dHRvbnN8fFtdfSxidXR0b25TdHlsZTpmdW5jdGlvbigpe3JldHVybntmbGV4OlwiMSAxIFwiLmNvbmNhdCgxMDAvdGhpcy5idXR0b25zLmxlbmd0aCxcIiVcIil9fX0sbWV0aG9kczp7YmVmb3JlT3BlbmVkOmZ1bmN0aW9uKHQpe3RoaXMucGFyYW1zPXQucGFyYW1zfHx7fSx0aGlzLiRlbWl0KFwiYmVmb3JlLW9wZW5lZFwiLHQpfSxiZWZvcmVDbG9zZWQ6ZnVuY3Rpb24odCl7dGhpcy5wYXJhbXM9e30sdGhpcy4kZW1pdChcImJlZm9yZS1jbG9zZWRcIix0KX0sY2xpY2s6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09bj9uOlwiY2xpY2tcIixvPXRoaXMuYnV0dG9uc1t0XSxyPW51bGw9PW8/dm9pZCAwOm8uaGFuZGxlcjtcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZyKHQsZSx7c291cmNlOml9KX19fSxCPShuKDExKSxkKFAsRCxbXSwhMSxudWxsLG51bGwsbnVsbCkpO0Iub3B0aW9ucy5fX2ZpbGU9XCJzcmMvY29tcG9uZW50cy9EaWFsb2cudnVlXCI7ZnVuY3Rpb24gSSgpe3ZhciBuPXRoaXMsdD1uLiRjcmVhdGVFbGVtZW50LGk9bi5fc2VsZi5fY3x8dDtyZXR1cm4gaShcImRpdlwiLHthdHRyczp7aWQ6XCJtb2RhbHMtY29udGFpbmVyXCJ9fSxuLl9sKG4ubW9kYWxzLGZ1bmN0aW9uKGUpe3JldHVybiBpKFwibW9kYWxcIixuLl9nKG4uX2Ioe2tleTplLmlkLG9uOntjbG9zZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4ucmVtb3ZlKGUuaWQpfX19LFwibW9kYWxcIixlLm1vZGFsQXR0cnMsITEpLGUubW9kYWxMaXN0ZW5lcnMpLFtpKGUuY29tcG9uZW50LG4uX2cobi5fYih7dGFnOlwiY29tcG9uZW50XCIsb246e2Nsb3NlOmZ1bmN0aW9uKHQpe3JldHVybiBuLiRtb2RhbC5oaWRlKGUubW9kYWxBdHRycy5uYW1lLHQpfX19LFwiY29tcG9uZW50XCIsZS5jb21wb25lbnRBdHRycywhMSksbi4kbGlzdGVuZXJzKSldLDEpfSksMSl9dmFyIFU9Qi5leHBvcnRzO2Z1bmN0aW9uIFgodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fUkuX3dpdGhTdHJpcHBlZD0hMDt2YXIgRj1kKHtkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue21vZGFsczpbXX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRyb290Ll9fbW9kYWxDb250YWluZXI9dGhpc30sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy4kbW9kYWwuc3Vic2NyaXB0aW9uLiRvbihcImhpZGUtYWxsXCIsZnVuY3Rpb24oKXt0Lm1vZGFscz1bXX0pfSxtZXRob2RzOnthZGQ6ZnVuY3Rpb24odCxlLG4saSl7dmFyIG89dGhpcyxyPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09ZT9lOnt9LGE9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1uP246e30scz0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWk/aTp7fSxsPWMoKSx1PWEubmFtZXx8XCJkeW5hbWljX21vZGFsX1wiK2w7dGhpcy5tb2RhbHMucHVzaCh7aWQ6bCxtb2RhbEF0dHJzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1t0XT9hcmd1bWVudHNbdF06e30saT1PYmplY3Qua2V5cyhuKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYoaT1pLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG4pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpLmVudW1lcmFibGV9KSkpLGkuZm9yRWFjaChmdW5jdGlvbih0KXtYKGUsdCxuW3RdKX0pfXJldHVybiBlfSh7fSxhLHtuYW1lOnV9KSxtb2RhbExpc3RlbmVyczpzLGNvbXBvbmVudDp0LGNvbXBvbmVudEF0dHJzOnJ9KSx0aGlzLiRuZXh0VGljayhmdW5jdGlvbigpe28uJG1vZGFsLnNob3codSl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubW9kYWxzLmZpbmRJbmRleChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZD09PWV9KTstMSE9PXQmJnRoaXMubW9kYWxzLnNwbGljZSh0LDEpfX19LEksW10sITEsbnVsbCxudWxsLG51bGwpO0Yub3B0aW9ucy5fX2ZpbGU9XCJzcmMvY29tcG9uZW50cy9Nb2RhbHNDb250YWluZXIudnVlXCI7dmFyIEc9Ri5leHBvcnRzO2Z1bmN0aW9uIFYodCl7cmV0dXJuKFY9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIHEodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciBLPWZ1bmN0aW9uKGksdCl7ZnVuY3Rpb24gbyh0LGUsbixpKXt2YXIgbyxyPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09bj9uOnt9LGE9Mzxhcmd1bWVudHMubGVuZ3RoP2k6dm9pZCAwLHM9bnVsbD09PShvPWMucm9vdCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uX19tb2RhbENvbnRhaW5lcixsPXUuZHluYW1pY0RlZmF1bHRzfHx7fTtudWxsIT1zJiZzLmFkZCh0LGUsZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fSxpPU9iamVjdC5rZXlzKG4pO1wiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihpPWkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3EoZSx0LG5bdF0pfSl9cmV0dXJuIGV9KHt9LGwsciksYSl9dmFyIHU9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10P3Q6e30scj1uZXcgaSxjPXtyb290Om51bGwsY29tcG9uZW50TmFtZTp1LmNvbXBvbmVudE5hbWV8fFwiTW9kYWxcIn07cmV0dXJue2NvbnRleHQ6YyxzdWJzY3JpcHRpb246cixzaG93OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07dmFyIGk9ZVswXTtzd2l0Y2goVihpKSl7Y2FzZVwic3RyaW5nXCI6KGZ1bmN0aW9uKHQsZSl7ci4kZW1pdChcInRvZ2dsZVwiLHQsITAsZSl9KS5hcHBseSh2b2lkIDAsZSk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6Y2FzZVwiZnVuY3Rpb25cIjpvLmFwcGx5KHZvaWQgMCxlKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihcIlt2dWUtanMtbW9kYWxdICRtb2RhbCgpIHJlY2VpdmVkIGFuIHVuc3VwcG9ydGVkIGFyZ3VtZW50IGFzIGEgZmlyc3QgYXJndW1lbnQuXCIsaSl9fSxoaWRlOmZ1bmN0aW9uKHQsZSl7ci4kZW1pdChcInRvZ2dsZVwiLHQsITEsZSl9LGhpZGVBbGw6ZnVuY3Rpb24oKXtyLiRlbWl0KFwiaGlkZS1hbGxcIil9LHRvZ2dsZTpmdW5jdGlvbih0LGUpe3IuJGVtaXQoXCJ0b2dnbGVcIix0LHZvaWQgMCxlKX0sc2V0RHluYW1pY01vZGFsQ29udGFpbmVyOmZ1bmN0aW9uKHQpe2Mucm9vdD10O3ZhciBlLG49KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGUpO25ldyBpKHtwYXJlbnQ6dCxyZW5kZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQoRyl9fSkuJG1vdW50KG4pfX19LFk9e2luc3RhbGw6ZnVuY3Rpb24oZSx0KXt2YXIgbj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PXQ/dDp7fTtpZighZS5wcm90b3R5cGUuJG1vZGFsKXt2YXIgaT1uZXcgSyhlLG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIiRtb2RhbFwiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIHQ9dGhpcy4kcm9vdDtpLmNvbnRleHQucm9vdHx8aS5zZXREeW5hbWljTW9kYWxDb250YWluZXIodCl9cmV0dXJuIGl9fSksZS5jb21wb25lbnQoaS5jb250ZXh0LmNvbXBvbmVudE5hbWUsVyksbi5kaWFsb2cmJmUuY29tcG9uZW50KFwiVkRpYWxvZ1wiLFUpfX19LEo9XCJfX1ZFUlNJT05fX1wiO2UuZGVmYXVsdD1ZfV0sby5jPWksby5kPWZ1bmN0aW9uKHQsZSxuKXtvLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6bn0pfSxvLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sby50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1vKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoby5yKG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJlwic3RyaW5nXCIhPXR5cGVvZiBlKWZvcih2YXIgaSBpbiBlKW8uZChuLGksZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG59LG8ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gby5kKGUsXCJhXCIsZSksZX0sby5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxvLnA9XCIvZGlzdC9cIixvKG8ucz0xMyk7ZnVuY3Rpb24gbyh0KXtpZihpW3RdKXJldHVybiBpW3RdLmV4cG9ydHM7dmFyIGU9aVt0XT17aTp0LGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIG5bdF0uY2FsbChlLmV4cG9ydHMsZSxlLmV4cG9ydHMsbyksZS5sPSEwLGUuZXhwb3J0c312YXIgbixpfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKiFcbiAqIFZ1ZS5qcyB2Mi42LjExXG4gKiAoYykgMjAxNC0yMDE5IEV2YW4gWW91XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cbiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOihlPWV8fHNlbGYpLlZ1ZT10KCl9KHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGV8fFwic3ltYm9sXCI9PXR5cGVvZiBlfHxcImJvb2xlYW5cIj09dHlwZW9mIGV9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gbnVsbCE9PWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlfXZhciBhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gcyhlKXtyZXR1cm5cIltvYmplY3QgT2JqZWN0XVwiPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS50aGVuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmNhdGNofWZ1bmN0aW9uIGwoZSl7cmV0dXJuIG51bGw9PWU/XCJcIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoXCIsXCIpLGk9MDtpPHIubGVuZ3RoO2krKyluW3JbaV1dPSEwO3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV19OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfX12YXIgZD1wKFwic2xvdCxjb21wb25lbnRcIiwhMCksdj1wKFwia2V5LHJlZixzbG90LHNsb3Qtc2NvcGUsaXNcIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcXHcpL2csYj1nKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoXyxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKTpcIlwifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xcQihbQS1aXSkvZyxDPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh3LFwiLSQxXCIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIE4oZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gTihlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gTihlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihOKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPVwiZGF0YS1zZXJ2ZXItcmVuZGVyZWRcIixNPVtcImNvbXBvbmVudFwiLFwiZGlyZWN0aXZlXCIsXCJmaWx0ZXJcIl0sST1bXCJiZWZvcmVDcmVhdGVcIixcImNyZWF0ZWRcIixcImJlZm9yZU1vdW50XCIsXCJtb3VudGVkXCIsXCJiZWZvcmVVcGRhdGVcIixcInVwZGF0ZWRcIixcImJlZm9yZURlc3Ryb3lcIixcImRlc3Ryb3llZFwiLFwiYWN0aXZhdGVkXCIsXCJkZWFjdGl2YXRlZFwiLFwiZXJyb3JDYXB0dXJlZFwiLFwic2VydmVyUHJlZmV0Y2hcIl0sRj17b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOk9iamVjdC5jcmVhdGUobnVsbCksc2lsZW50OiExLHByb2R1Y3Rpb25UaXA6ITEsZGV2dG9vbHM6ITEscGVyZm9ybWFuY2U6ITEsZXJyb3JIYW5kbGVyOm51bGwsd2FybkhhbmRsZXI6bnVsbCxpZ25vcmVkRWxlbWVudHM6W10sa2V5Q29kZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxpc1Jlc2VydmVkVGFnOlQsaXNSZXNlcnZlZEF0dHI6VCxpc1Vua25vd25FbGVtZW50OlQsZ2V0VGFnTmFtZXNwYWNlOlMscGFyc2VQbGF0Zm9ybVRhZ05hbWU6RSxtdXN0VXNlUHJvcDpULGFzeW5jOiEwLF9saWZlY3ljbGVIb29rczpJfSxQPS9hLXpBLVpcXHUwMEI3XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjAzRi1cXHUyMDQwXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZELztmdW5jdGlvbiBSKGUsdCxuLHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohIXIsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9dmFyIEg9bmV3IFJlZ0V4cChcIlteXCIrUC5zb3VyY2UrXCIuJF9cXFxcZF1cIik7dmFyIEIsVT1cIl9fcHJvdG9fX1wiaW57fSx6PVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3csVj1cInVuZGVmaW5lZFwiIT10eXBlb2YgV1hFbnZpcm9ubWVudCYmISFXWEVudmlyb25tZW50LnBsYXRmb3JtLEs9ViYmV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpLEo9eiYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxxPUomJi9tc2llfHRyaWRlbnQvLnRlc3QoSiksVz1KJiZKLmluZGV4T2YoXCJtc2llIDkuMFwiKT4wLFo9SiYmSi5pbmRleE9mKFwiZWRnZS9cIik+MCxHPShKJiZKLmluZGV4T2YoXCJhbmRyb2lkXCIpLEomJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChKKXx8XCJpb3NcIj09PUspLFg9KEomJi9jaHJvbWVcXC9cXGQrLy50ZXN0KEopLEomJi9waGFudG9tanMvLnRlc3QoSiksSiYmSi5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pKSxZPXt9LndhdGNoLFE9ITE7aWYoeil0cnl7dmFyIGVlPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlZSxcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3QtcGFzc2l2ZVwiLG51bGwsZWUpfWNhdGNoKGUpe312YXIgdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09QiYmKEI9IXomJiFWJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJlwic2VydmVyXCI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPXomJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfXZhciBpZSxvZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZyZShTeW1ib2wpJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgU2V0JiZyZShTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIGFlPVMsc2U9MCxjZT1mdW5jdGlvbigpe3RoaXMuaWQ9c2UrKyx0aGlzLnN1YnM9W119O2NlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGNlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7aCh0aGlzLnN1YnMsZSl9LGNlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtjZS50YXJnZXQmJmNlLnRhcmdldC5hZGREZXAodGhpcyl9LGNlLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxjZS50YXJnZXQ9bnVsbDt2YXIgdWU9W107ZnVuY3Rpb24gbGUoZSl7dWUucHVzaChlKSxjZS50YXJnZXQ9ZX1mdW5jdGlvbiBmZSgpe3VlLnBvcCgpLGNlLnRhcmdldD11ZVt1ZS5sZW5ndGgtMV19dmFyIHBlPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyl7dGhpcy50YWc9ZSx0aGlzLmRhdGE9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy50ZXh0PXIsdGhpcy5lbG09aSx0aGlzLm5zPXZvaWQgMCx0aGlzLmNvbnRleHQ9byx0aGlzLmZuQ29udGV4dD12b2lkIDAsdGhpcy5mbk9wdGlvbnM9dm9pZCAwLHRoaXMuZm5TY29wZUlkPXZvaWQgMCx0aGlzLmtleT10JiZ0LmtleSx0aGlzLmNvbXBvbmVudE9wdGlvbnM9YSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPXZvaWQgMCx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5yYXc9ITEsdGhpcy5pc1N0YXRpYz0hMSx0aGlzLmlzUm9vdEluc2VydD0hMCx0aGlzLmlzQ29tbWVudD0hMSx0aGlzLmlzQ2xvbmVkPSExLHRoaXMuaXNPbmNlPSExLHRoaXMuYXN5bmNGYWN0b3J5PXMsdGhpcy5hc3luY01ldGE9dm9pZCAwLHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyPSExfSxkZT17Y2hpbGQ6e2NvbmZpZ3VyYWJsZTohMH19O2RlLmNoaWxkLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwZS5wcm90b3R5cGUsZGUpO3ZhciB2ZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT1cIlwiKTt2YXIgdD1uZXcgcGU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGhlKGUpe3JldHVybiBuZXcgcGUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBtZShlKXt2YXIgdD1uZXcgcGUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciB5ZT1BcnJheS5wcm90b3R5cGUsZ2U9T2JqZWN0LmNyZWF0ZSh5ZSk7W1wicHVzaFwiLFwicG9wXCIsXCJzaGlmdFwiLFwidW5zaGlmdFwiLFwic3BsaWNlXCIsXCJzb3J0XCIsXCJyZXZlcnNlXCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2VcInB1c2hcIjpjYXNlXCJ1bnNoaWZ0XCI6aT1uO2JyZWFrO2Nhc2VcInNwbGljZVwiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSxcIl9fb2JfX1wiLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KFU/KHQ9Z2UsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtSKGUsbyx0W29dKX19KGUsZ2UsX2UpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIENlKGUsdCl7dmFyIG47aWYobyhlKSYmIShlIGluc3RhbmNlb2YgcGUpKXJldHVybiB5KGUsXCJfX29iX19cIikmJmUuX19vYl9fIGluc3RhbmNlb2Ygd2U/bj1lLl9fb2JfXzpiZSYmIXRlKCkmJihBcnJheS5pc0FycmF5KGUpfHxzKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgd2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24geGUoZSx0LG4scixpKXt2YXIgbz1uZXcgY2UsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0LGM9YSYmYS5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwobj1lW3RdKTt2YXIgdT0haSYmQ2Uobik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9cz9zLmNhbGwoZSk6bjtyZXR1cm4gY2UudGFyZ2V0JiYoby5kZXBlbmQoKSx1JiYodS5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheSh0KSYmZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49dm9pZCAwLHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspKG49dFtyXSkmJm4uX19vYl9fJiZuLl9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheShuKSYmZShuKX0odCkpKSx0fSxzZXQ6ZnVuY3Rpb24odCl7dmFyIHI9cz9zLmNhbGwoZSk6bjt0PT09cnx8dCE9dCYmciE9cnx8cyYmIWN8fChjP2MuY2FsbChlLHQpOm49dCx1PSFpJiZDZSh0KSxvLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24ga2UoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmModCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW4sbjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KHhlKHIudmFsdWUsdCxuKSxyLmRlcC5ub3RpZnkoKSxuKTooZVt0XT1uLG4pfWZ1bmN0aW9uIEFlKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudHx8eShlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX13ZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKXhlKGUsdFtuXSl9LHdlLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKUNlKGVbdF0pfTt2YXIgT2U9Ri5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gU2UoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89b2U/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKylcIl9fb2JfX1wiIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5jYWxsKG4sbik6dCxpPVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZS5jYWxsKG4sbik6ZTtyZXR1cm4gcj9TZShyLGkpOml9OnQ/ZT9mdW5jdGlvbigpe3JldHVybiBTZShcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsXCJmdW5jdGlvblwiPT10eXBlb2YgZT9lLmNhbGwodGhpcyx0aGlzKTplKX06dDplfWZ1bmN0aW9uIEVlKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KG4pOm59ZnVuY3Rpb24gTmUoZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShlfHxudWxsKTtyZXR1cm4gdD9BKGksdCk6aX1PZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9UZShlLHQsbik6dCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdD9lOlRlKGUsdCl9LEkuZm9yRWFjaChmdW5jdGlvbihlKXtPZVtlXT1FZX0pLE0uZm9yRWFjaChmdW5jdGlvbihlKXtPZVtlK1wic1wiXT1OZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10Lm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KVwic3RyaW5nXCI9PXR5cGVvZihpPW5bcl0pJiYob1tiKGkpXT17dHlwZTpudWxsfSk7ZWxzZSBpZihzKG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2IoYSldPXMoaSk/aTp7dHlwZTppfTtlLnByb3BzPW99fSh0KSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKHMobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT1zKGEpP0Eoe2Zyb206b30sYSk6e2Zyb206YX19fX0odCksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07XCJmdW5jdGlvblwiPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBuKXt2YXIgaT1lW3RdO2lmKHkoaSxuKSlyZXR1cm4gaVtuXTt2YXIgbz1iKG4pO2lmKHkoaSxvKSlyZXR1cm4gaVtvXTt2YXIgYT0kKG8pO3JldHVybiB5KGksYSk/aVthXTppW25dfHxpW29dfHxpW2FdfX1mdW5jdGlvbiBNZShlLHQsbixyKXt2YXIgaT10W2VdLG89IXkobixlKSxhPW5bZV0scz1QZShCb29sZWFuLGkudHlwZSk7aWYocz4tMSlpZihvJiYheShpLFwiZGVmYXVsdFwiKSlhPSExO2Vsc2UgaWYoXCJcIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1QZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCxcImRlZmF1bHRcIikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDtpZihlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dKXJldHVybiBlLl9wcm9wc1tuXTtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZcIkZ1bmN0aW9uXCIhPT1JZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfWZ1bmN0aW9uIEllKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxccypmdW5jdGlvbiAoXFx3KykvKTtyZXR1cm4gdD90WzFdOlwiXCJ9ZnVuY3Rpb24gRmUoZSx0KXtyZXR1cm4gSWUoZSk9PT1JZSh0KX1mdW5jdGlvbiBQZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBGZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKEZlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gUmUoZSx0LG4pe2xlKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe0JlKGUscixcImVycm9yQ2FwdHVyZWQgaG9va1wiKX19QmUoZSx0LG4pfWZpbmFsbHl7ZmUoKX19ZnVuY3Rpb24gSGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ1KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIFJlKGUscixpK1wiIChQcm9taXNlL2FzeW5jKVwiKX0pLG8uX2hhbmRsZWQ9ITApfWNhdGNoKGUpe1JlKGUscixpKX1yZXR1cm4gb31mdW5jdGlvbiBCZShlLHQsbil7aWYoRi5lcnJvckhhbmRsZXIpdHJ5e3JldHVybiBGLmVycm9ySGFuZGxlci5jYWxsKG51bGwsZSx0LG4pfWNhdGNoKHQpe3QhPT1lJiZVZSh0LG51bGwsXCJjb25maWcuZXJyb3JIYW5kbGVyXCIpfVVlKGUsdCxuKX1mdW5jdGlvbiBVZShlLHQsbil7aWYoIXomJiFWfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIHplLFZlPSExLEtlPVtdLEplPSExO2Z1bmN0aW9uIHFlKCl7SmU9ITE7dmFyIGU9S2Uuc2xpY2UoMCk7S2UubGVuZ3RoPTA7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBQcm9taXNlJiZyZShQcm9taXNlKSl7dmFyIFdlPVByb21pc2UucmVzb2x2ZSgpO3plPWZ1bmN0aW9uKCl7V2UudGhlbihxZSksRyYmc2V0VGltZW91dChTKX0sVmU9ITB9ZWxzZSBpZihxfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgTXV0YXRpb25PYnNlcnZlcnx8IXJlKE11dGF0aW9uT2JzZXJ2ZXIpJiZcIltvYmplY3QgTXV0YXRpb25PYnNlcnZlckNvbnN0cnVjdG9yXVwiIT09TXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpKXplPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZXRJbW1lZGlhdGUmJnJlKHNldEltbWVkaWF0ZSk/ZnVuY3Rpb24oKXtzZXRJbW1lZGlhdGUocWUpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQocWUsMCl9O2Vsc2V7dmFyIFplPTEsR2U9bmV3IE11dGF0aW9uT2JzZXJ2ZXIocWUpLFhlPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhaZSkpO0dlLm9ic2VydmUoWGUse2NoYXJhY3RlckRhdGE6ITB9KSx6ZT1mdW5jdGlvbigpe1plPShaZSsxKSUyLFhlLmRhdGE9U3RyaW5nKFplKX0sVmU9ITB9ZnVuY3Rpb24gWWUoZSx0KXt2YXIgbjtpZihLZS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe1JlKGUsdCxcIm5leHRUaWNrXCIpfWVsc2UgbiYmbih0KX0pLEplfHwoSmU9ITAsemUoKSksIWUmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgUWU9bmV3IGllO2Z1bmN0aW9uIGV0KGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgYT1BcnJheS5pc0FycmF5KHQpO2lmKCFhJiYhbyh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgcGUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgcz10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMocykpcmV0dXJuO24uYWRkKHMpfWlmKGEpZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFFlKSxRZS5jbGVhcigpfXZhciB0dD1nKGZ1bmN0aW9uKGUpe3ZhciB0PVwiJlwiPT09ZS5jaGFyQXQoMCksbj1cIn5cIj09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj1cIiFcIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBudChlLHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT1hcmd1bWVudHMscj1uLmZucztpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4gSGUocixudWxsLGFyZ3VtZW50cyx0LFwidi1vbiBoYW5kbGVyXCIpO2Zvcih2YXIgaT1yLnNsaWNlKCksbz0wO288aS5sZW5ndGg7bysrKUhlKGlbb10sbnVsbCxlLHQsXCJ2LW9uIGhhbmRsZXJcIil9cmV0dXJuIG4uZm5zPWUsbn1mdW5jdGlvbiBydChlLG4saSxvLGEscyl7dmFyIGMsdSxsLGY7Zm9yKGMgaW4gZSl1PWVbY10sbD1uW2NdLGY9dHQoYyksdCh1KXx8KHQobCk/KHQodS5mbnMpJiYodT1lW2NdPW50KHUscykpLHIoZi5vbmNlKSYmKHU9ZVtjXT1hKGYubmFtZSx1LGYuY2FwdHVyZSkpLGkoZi5uYW1lLHUsZi5jYXB0dXJlLGYucGFzc2l2ZSxmLnBhcmFtcykpOnUhPT1sJiYobC5mbnM9dSxlW2NdPWwpKTtmb3IoYyBpbiBuKXQoZVtjXSkmJm8oKGY9dHQoYykpLm5hbWUsbltjXSxmLmNhcHR1cmUpfWZ1bmN0aW9uIGl0KGUsaSxvKXt2YXIgYTtlIGluc3RhbmNlb2YgcGUmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgcz1lW2ldO2Z1bmN0aW9uIGMoKXtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoKGEuZm5zLGMpfXQocyk/YT1udChbY10pOm4ocy5mbnMpJiZyKHMubWVyZ2VkKT8oYT1zKS5mbnMucHVzaChjKTphPW50KFtzLGNdKSxhLm1lcmdlZD0hMCxlW2ldPWF9ZnVuY3Rpb24gb3QoZSx0LHIsaSxvKXtpZihuKHQpKXtpZih5KHQscikpcmV0dXJuIGVbcl09dFtyXSxvfHxkZWxldGUgdFtyXSwhMDtpZih5KHQsaSkpcmV0dXJuIGVbcl09dFtpXSxvfHxkZWxldGUgdFtpXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBhdChlKXtyZXR1cm4gaShlKT9baGUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZShvLGEpe3ZhciBzPVtdO3ZhciBjLHUsbCxmO2ZvcihjPTA7YzxvLmxlbmd0aDtjKyspdCh1PW9bY10pfHxcImJvb2xlYW5cIj09dHlwZW9mIHV8fChsPXMubGVuZ3RoLTEsZj1zW2xdLEFycmF5LmlzQXJyYXkodSk/dS5sZW5ndGg+MCYmKHN0KCh1PWUodSwoYXx8XCJcIikrXCJfXCIrYykpWzBdKSYmc3QoZikmJihzW2xdPWhlKGYudGV4dCt1WzBdLnRleHQpLHUuc2hpZnQoKSkscy5wdXNoLmFwcGx5KHMsdSkpOmkodSk/c3QoZik/c1tsXT1oZShmLnRleHQrdSk6XCJcIiE9PXUmJnMucHVzaChoZSh1KSk6c3QodSkmJnN0KGYpP3NbbF09aGUoZi50ZXh0K3UudGV4dCk6KHIoby5faXNWTGlzdCkmJm4odS50YWcpJiZ0KHUua2V5KSYmbihhKSYmKHUua2V5PVwiX192bGlzdFwiK2ErXCJfXCIrYytcIl9fXCIpLHMucHVzaCh1KSkpO3JldHVybiBzfShlKTp2b2lkIDB9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIG4oZSkmJm4oZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBjdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9b2U/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZihcIl9fb2JfX1wiIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZ5KHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiZcImRlZmF1bHRcImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPVwiZnVuY3Rpb25cIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gdXQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7XCJ0ZW1wbGF0ZVwiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeShsdCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIGx0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHxcIiBcIj09PWUudGV4dH1mdW5jdGlvbiBmdCh0LG4scil7dmFyIGksbz1PYmplY3Qua2V5cyhuKS5sZW5ndGg+MCxhPXQ/ISF0LiRzdGFibGU6IW8scz10JiZ0LiRrZXk7aWYodCl7aWYodC5fbm9ybWFsaXplZClyZXR1cm4gdC5fbm9ybWFsaXplZDtpZihhJiZyJiZyIT09ZSYmcz09PXIuJGtleSYmIW8mJiFyLiRoYXNOb3JtYWwpcmV0dXJuIHI7Zm9yKHZhciBjIGluIGk9e30sdCl0W2NdJiZcIiRcIiE9PWNbMF0mJihpW2NdPXB0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09ZHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSxcIiRzdGFibGVcIixhKSxSKGksXCIka2V5XCIscyksUihpLFwiJGhhc05vcm1hbFwiLG8pLGl9ZnVuY3Rpb24gcHQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOmF0KGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gZHQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gdnQoZSx0KXt2YXIgcixpLGEscyxjO2lmKEFycmF5LmlzQXJyYXkoZSl8fFwic3RyaW5nXCI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlLmxlbmd0aCksaT0wLGE9ZS5sZW5ndGg7aTxhO2krKylyW2ldPXQoZVtpXSxpKTtlbHNlIGlmKFwibnVtYmVyXCI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24gaHQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHx0KTppPXRoaXMuJHNsb3RzW2VdfHx0O3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIG10KGUpe3JldHVybiBMZSh0aGlzLiRvcHRpb25zLFwiZmlsdGVyc1wiLGUpfHxFfWZ1bmN0aW9uIHl0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gZ3QoZSx0LG4scixpKXt2YXIgbz1GLmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhRi5rZXlDb2Rlc1t0XT95dChpLHIpOm8/eXQobyxlKTpyP0MocikhPT10OnZvaWQgMH1mdW5jdGlvbiBfdChlLHQsbixyLGkpe2lmKG4paWYobyhuKSl7dmFyIGE7QXJyYXkuaXNBcnJheShuKSYmKG49TyhuKSk7dmFyIHM9ZnVuY3Rpb24obyl7aWYoXCJjbGFzc1wiPT09b3x8XCJzdHlsZVwiPT09b3x8dihvKSlhPWU7ZWxzZXt2YXIgcz1lLmF0dHJzJiZlLmF0dHJzLnR5cGU7YT1yfHxGLm11c3RVc2VQcm9wKHQscyxvKT9lLmRvbVByb3BzfHwoZS5kb21Qcm9wcz17fSk6ZS5hdHRyc3x8KGUuYXR0cnM9e30pfXZhciBjPWIobyksdT1DKG8pO2MgaW4gYXx8dSBpbiBhfHwoYVtvXT1uW29dLGkmJigoZS5vbnx8KGUub249e30pKVtcInVwZGF0ZTpcIitvXT1mdW5jdGlvbihlKXtuW29dPWV9KSl9O2Zvcih2YXIgYyBpbiBuKXMoYyl9ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBidChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXQ/cjood3Qocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSxcIl9fc3RhdGljX19cIitlLCExKSxyKX1mdW5jdGlvbiAkdChlLHQsbil7cmV0dXJuIHd0KGUsXCJfX29uY2VfX1wiK3QrKG4/XCJfXCIrbjpcIlwiKSwhMCksZX1mdW5jdGlvbiB3dChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiZcInN0cmluZ1wiIT10eXBlb2YgZVtyXSYmQ3QoZVtyXSx0K1wiX1wiK3Isbik7ZWxzZSBDdChlLHQsbil9ZnVuY3Rpb24gQ3QoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHh0KGUsdCl7aWYodClpZihzKHQpKXt2YXIgbj1lLm9uPWUub24/QSh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24ga3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9rdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIEF0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dO1wic3RyaW5nXCI9PXR5cGVvZiByJiZyJiYoZVt0W25dXT10W24rMV0pfXJldHVybiBlfWZ1bmN0aW9uIE90KGUsdCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gU3QoZSl7ZS5fbz0kdCxlLl9uPWYsZS5fcz1sLGUuX2w9dnQsZS5fdD1odCxlLl9xPU4sZS5faT1qLGUuX209YnQsZS5fZj1tdCxlLl9rPWd0LGUuX2I9X3QsZS5fdj1oZSxlLl9lPXZlLGUuX3U9a3QsZS5fZz14dCxlLl9kPUF0LGUuX3A9T3R9ZnVuY3Rpb24gVHQodCxuLGksbyxhKXt2YXIgcyxjPXRoaXMsdT1hLm9wdGlvbnM7eShvLFwiX3VpZFwiKT8ocz1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzoocz1vLG89by5fb3JpZ2luYWwpO3ZhciBsPXIodS5fY29tcGlsZWQpLGY9IWw7dGhpcy5kYXRhPXQsdGhpcy5wcm9wcz1uLHRoaXMuY2hpbGRyZW49aSx0aGlzLnBhcmVudD1vLHRoaXMubGlzdGVuZXJzPXQub258fGUsdGhpcy5pbmplY3Rpb25zPWN0KHUuaW5qZWN0LG8pLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gYy4kc2xvdHN8fGZ0KHQuc2NvcGVkU2xvdHMsYy4kc2xvdHM9dXQoaSxvKSksYy4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic2NvcGVkU2xvdHNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnQodC5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGwmJih0aGlzLiRvcHRpb25zPXUsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPWZ0KHQuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSx1Ll9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9UHQocyxlLHQsbixyLGYpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXUuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gUHQocyxlLHQsbixyLGYpfX1mdW5jdGlvbiBFdChlLHQsbixyLGkpe3ZhciBvPW1lKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIE50KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtiKG4pXT10W25dfVN0KFR0LnByb3RvdHlwZSk7dmFyIGp0PXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgcj1lO2p0LnByZXBhdGNoKHIscil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciByPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnR9LGk9ZS5kYXRhLmlubGluZVRlbXBsYXRlO24oaSkmJihyLnJlbmRlcj1pLnJlbmRlcixyLnN0YXRpY1JlbmRlckZucz1pLnN0YXRpY1JlbmRlckZucyk7cmV0dXJuIG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihyKX0oZSxXdCkpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKHQsbil7dmFyIHI9bi5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbih0LG4scixpLG8pe3ZhciBhPWkuZGF0YS5zY29wZWRTbG90cyxzPXQuJHNjb3BlZFNsb3RzLGM9ISEoYSYmIWEuJHN0YWJsZXx8cyE9PWUmJiFzLiRzdGFibGV8fGEmJnQuJHNjb3BlZFNsb3RzLiRrZXkhPT1hLiRrZXkpLHU9ISEob3x8dC4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fGMpO3QuJG9wdGlvbnMuX3BhcmVudFZub2RlPWksdC4kdm5vZGU9aSx0Ll92bm9kZSYmKHQuX3Zub2RlLnBhcmVudD1pKTtpZih0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbj1vLHQuJGF0dHJzPWkuZGF0YS5hdHRyc3x8ZSx0LiRsaXN0ZW5lcnM9cnx8ZSxuJiZ0LiRvcHRpb25zLnByb3BzKXskZSghMSk7Zm9yKHZhciBsPXQuX3Byb3BzLGY9dC4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLHA9MDtwPGYubGVuZ3RoO3ArKyl7dmFyIGQ9ZltwXSx2PXQuJG9wdGlvbnMucHJvcHM7bFtkXT1NZShkLHYsbix0KX0kZSghMCksdC4kb3B0aW9ucy5wcm9wc0RhdGE9bn1yPXJ8fGU7dmFyIGg9dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1yLHF0KHQscixoKSx1JiYodC4kc2xvdHM9dXQobyxpLmNvbnRleHQpLHQuJGZvcmNlVXBkYXRlKCkpfShuLmNvbXBvbmVudEluc3RhbmNlPXQuY29tcG9uZW50SW5zdGFuY2Usci5wcm9wc0RhdGEsci5saXN0ZW5lcnMsbixyLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsWXQocixcIm1vdW50ZWRcIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSxlbi5wdXNoKHQpKTpYdChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxHdCh0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO1l0KHQsXCJkZWFjdGl2YXRlZFwiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxEdD1PYmplY3Qua2V5cyhqdCk7ZnVuY3Rpb24gTHQoaSxhLHMsYyxsKXtpZighdChpKSl7dmFyIGY9cy4kb3B0aW9ucy5fYmFzZTtpZihvKGkpJiYoaT1mLmV4dGVuZChpKSksXCJmdW5jdGlvblwiPT10eXBlb2YgaSl7dmFyIHA7aWYodChpLmNpZCkmJnZvaWQgMD09PShpPWZ1bmN0aW9uKGUsaSl7aWYocihlLmVycm9yKSYmbihlLmVycm9yQ29tcCkpcmV0dXJuIGUuZXJyb3JDb21wO2lmKG4oZS5yZXNvbHZlZCkpcmV0dXJuIGUucmVzb2x2ZWQ7dmFyIGE9SHQ7YSYmbihlLm93bmVycykmJi0xPT09ZS5vd25lcnMuaW5kZXhPZihhKSYmZS5vd25lcnMucHVzaChhKTtpZihyKGUubG9hZGluZykmJm4oZS5sb2FkaW5nQ29tcCkpcmV0dXJuIGUubG9hZGluZ0NvbXA7aWYoYSYmIW4oZS5vd25lcnMpKXt2YXIgcz1lLm93bmVycz1bYV0sYz0hMCxsPW51bGwsZj1udWxsO2EuJG9uKFwiaG9vazpkZXN0cm95ZWRcIixmdW5jdGlvbigpe3JldHVybiBoKHMsYSl9KTt2YXIgcD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXMubGVuZ3RoO3Q8bjt0Kyspc1t0XS4kZm9yY2VVcGRhdGUoKTtlJiYocy5sZW5ndGg9MCxudWxsIT09bCYmKGNsZWFyVGltZW91dChsKSxsPW51bGwpLG51bGwhPT1mJiYoY2xlYXJUaW1lb3V0KGYpLGY9bnVsbCkpfSxkPUQoZnVuY3Rpb24odCl7ZS5yZXNvbHZlZD1CdCh0LGkpLGM/cy5sZW5ndGg9MDpwKCEwKX0pLHY9RChmdW5jdGlvbih0KXtuKGUuZXJyb3JDb21wKSYmKGUuZXJyb3I9ITAscCghMCkpfSksbT1lKGQsdik7cmV0dXJuIG8obSkmJih1KG0pP3QoZS5yZXNvbHZlZCkmJm0udGhlbihkLHYpOnUobS5jb21wb25lbnQpJiYobS5jb21wb25lbnQudGhlbihkLHYpLG4obS5lcnJvcikmJihlLmVycm9yQ29tcD1CdChtLmVycm9yLGkpKSxuKG0ubG9hZGluZykmJihlLmxvYWRpbmdDb21wPUJ0KG0ubG9hZGluZyxpKSwwPT09bS5kZWxheT9lLmxvYWRpbmc9ITA6bD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bD1udWxsLHQoZS5yZXNvbHZlZCkmJnQoZS5lcnJvcikmJihlLmxvYWRpbmc9ITAscCghMSkpfSxtLmRlbGF5fHwyMDApKSxuKG0udGltZW91dCkmJihmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGwsdChlLnJlc29sdmVkKSYmdihudWxsKX0sbS50aW1lb3V0KSkpKSxjPSExLGUubG9hZGluZz9lLmxvYWRpbmdDb21wOmUucmVzb2x2ZWR9fShwPWksZikpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXZlKCk7cmV0dXJuIG8uYXN5bmNGYWN0b3J5PWUsby5hc3luY01ldGE9e2RhdGE6dCxjb250ZXh0Om4sY2hpbGRyZW46cix0YWc6aX0sb30ocCxhLHMsYyxsKTthPWF8fHt9LCRuKGkpLG4oYS5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHxcInZhbHVlXCIsaT1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHxcImlucHV0XCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbcl09dC5tb2RlbC52YWx1ZTt2YXIgbz10Lm9ufHwodC5vbj17fSksYT1vW2ldLHM9dC5tb2RlbC5jYWxsYmFjaztuKGEpPyhBcnJheS5pc0FycmF5KGEpPy0xPT09YS5pbmRleE9mKHMpOmEhPT1zKSYmKG9baV09W3NdLmNvbmNhdChhKSk6b1tpXT1zfShpLm9wdGlvbnMsYSk7dmFyIGQ9ZnVuY3Rpb24oZSxyLGkpe3ZhciBvPXIub3B0aW9ucy5wcm9wcztpZighdChvKSl7dmFyIGE9e30scz1lLmF0dHJzLGM9ZS5wcm9wcztpZihuKHMpfHxuKGMpKWZvcih2YXIgdSBpbiBvKXt2YXIgbD1DKHUpO290KGEsYyx1LGwsITApfHxvdChhLHMsdSxsLCExKX1yZXR1cm4gYX19KGEsaSk7aWYocihpLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKHQscixpLG8sYSl7dmFyIHM9dC5vcHRpb25zLGM9e30sdT1zLnByb3BzO2lmKG4odSkpZm9yKHZhciBsIGluIHUpY1tsXT1NZShsLHUscnx8ZSk7ZWxzZSBuKGkuYXR0cnMpJiZOdChjLGkuYXR0cnMpLG4oaS5wcm9wcykmJk50KGMsaS5wcm9wcyk7dmFyIGY9bmV3IFR0KGksYyxhLG8sdCkscD1zLnJlbmRlci5jYWxsKG51bGwsZi5fYyxmKTtpZihwIGluc3RhbmNlb2YgcGUpcmV0dXJuIEV0KHAsaSxmLnBhcmVudCxzKTtpZihBcnJheS5pc0FycmF5KHApKXtmb3IodmFyIGQ9YXQocCl8fFtdLHY9bmV3IEFycmF5KGQubGVuZ3RoKSxoPTA7aDxkLmxlbmd0aDtoKyspdltoXT1FdChkW2hdLGksZi5wYXJlbnQscyk7cmV0dXJuIHZ9fShpLGQsYSxzLGMpO3ZhciB2PWEub247aWYoYS5vbj1hLm5hdGl2ZU9uLHIoaS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIG09YS5zbG90O2E9e30sbSYmKGEuc2xvdD1tKX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248RHQubGVuZ3RoO24rKyl7dmFyIHI9RHRbbl0saT10W3JdLG89anRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9NdChvLGkpOm8pfX0oYSk7dmFyIHk9aS5vcHRpb25zLm5hbWV8fGw7cmV0dXJuIG5ldyBwZShcInZ1ZS1jb21wb25lbnQtXCIraS5jaWQrKHk/XCItXCIreTpcIlwiKSxhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHMse0N0b3I6aSxwcm9wc0RhdGE6ZCxsaXN0ZW5lcnM6dix0YWc6bCxjaGlsZHJlbjpjfSxwKX19fWZ1bmN0aW9uIE10KGUsdCl7dmFyIG49ZnVuY3Rpb24obixyKXtlKG4sciksdChuLHIpfTtyZXR1cm4gbi5fbWVyZ2VkPSEwLG59dmFyIEl0PTEsRnQ9MjtmdW5jdGlvbiBQdChlLGEscyxjLHUsbCl7cmV0dXJuKEFycmF5LmlzQXJyYXkocyl8fGkocykpJiYodT1jLGM9cyxzPXZvaWQgMCkscihsKSYmKHU9RnQpLGZ1bmN0aW9uKGUsaSxhLHMsYyl7aWYobihhKSYmbihhLl9fb2JfXykpcmV0dXJuIHZlKCk7bihhKSYmbihhLmlzKSYmKGk9YS5pcyk7aWYoIWkpcmV0dXJuIHZlKCk7QXJyYXkuaXNBcnJheShzKSYmXCJmdW5jdGlvblwiPT10eXBlb2Ygc1swXSYmKChhPWF8fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpzWzBdfSxzLmxlbmd0aD0wKTtjPT09RnQ/cz1hdChzKTpjPT09SXQmJihzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHMpKTt2YXIgdSxsO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpKXt2YXIgZjtsPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8Ri5nZXRUYWdOYW1lc3BhY2UoaSksdT1GLmlzUmVzZXJ2ZWRUYWcoaSk/bmV3IHBlKEYucGFyc2VQbGF0Zm9ybVRhZ05hbWUoaSksYSxzLHZvaWQgMCx2b2lkIDAsZSk6YSYmYS5wcmV8fCFuKGY9TGUoZS4kb3B0aW9ucyxcImNvbXBvbmVudHNcIixpKSk/bmV3IHBlKGksYSxzLHZvaWQgMCx2b2lkIDAsZSk6THQoZixhLGUscyxpKX1lbHNlIHU9THQoaSxhLGUscyk7cmV0dXJuIEFycmF5LmlzQXJyYXkodSk/dTpuKHUpPyhuKGwpJiZmdW5jdGlvbiBlKGksbyxhKXtpLm5zPW87XCJmb3JlaWduT2JqZWN0XCI9PT1pLnRhZyYmKG89dm9pZCAwLGE9ITApO2lmKG4oaS5jaGlsZHJlbikpZm9yKHZhciBzPTAsYz1pLmNoaWxkcmVuLmxlbmd0aDtzPGM7cysrKXt2YXIgdT1pLmNoaWxkcmVuW3NdO24odS50YWcpJiYodCh1Lm5zKXx8cihhKSYmXCJzdmdcIiE9PXUudGFnKSYmZSh1LG8sYSl9fSh1LGwpLG4oYSkmJmZ1bmN0aW9uKGUpe28oZS5zdHlsZSkmJmV0KGUuc3R5bGUpO28oZS5jbGFzcykmJmV0KGUuY2xhc3MpfShhKSx1KTp2ZSgpfShlLGEscyxjLHUpfXZhciBSdCxIdD1udWxsO2Z1bmN0aW9uIEJ0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8b2UmJlwiTW9kdWxlXCI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLG8oZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBVdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8VXQocikpKXJldHVybiByfX1mdW5jdGlvbiBWdChlLHQpe1J0LiRvbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7UnQuJG9mZihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7dmFyIG49UnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBxdChlLHQsbil7UnQ9ZSxydCh0LG58fHt9LFZ0LEt0LEp0LGUpLFJ0PXZvaWQgMH12YXIgV3Q9bnVsbDtmdW5jdGlvbiBadChlKXt2YXIgdD1XdDtyZXR1cm4gV3Q9ZSxmdW5jdGlvbigpe1d0PXR9fWZ1bmN0aW9uIEd0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWHQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxHdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVh0KGUuJGNoaWxkcmVuW25dKTtZdChlLFwiYWN0aXZhdGVkXCIpfX1mdW5jdGlvbiBZdChlLHQpe2xlKCk7dmFyIG49ZS4kb3B0aW9uc1t0XSxyPXQrXCIgaG9va1wiO2lmKG4pZm9yKHZhciBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKUhlKG5baV0sZSxudWxsLGUscik7ZS5faGFzSG9va0V2ZW50JiZlLiRlbWl0KFwiaG9vazpcIit0KSxmZSgpfXZhciBRdD1bXSxlbj1bXSx0bj17fSxubj0hMSxybj0hMSxvbj0wO3ZhciBhbj0wLHNuPURhdGUubm93O2lmKHomJiFxKXt2YXIgY249d2luZG93LnBlcmZvcm1hbmNlO2NuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBjbi5ub3cmJnNuKCk+ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKS50aW1lU3RhbXAmJihzbj1mdW5jdGlvbigpe3JldHVybiBjbi5ub3coKX0pfWZ1bmN0aW9uIHVuKCl7dmFyIGUsdDtmb3IoYW49c24oKSxybj0hMCxRdC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLG9uPTA7b248UXQubGVuZ3RoO29uKyspKGU9UXRbb25dKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLHRuW3RdPW51bGwsZS5ydW4oKTt2YXIgbj1lbi5zbGljZSgpLHI9UXQuc2xpY2UoKTtvbj1RdC5sZW5ndGg9ZW4ubGVuZ3RoPTAsdG49e30sbm49cm49ITEsZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsWHQoZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiZZdChyLFwidXBkYXRlZFwiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KFwiZmx1c2hcIil9dmFyIGxuPTAsZm49ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLnZtPWUsaSYmKGUuX3dhdGNoZXI9dGhpcyksZS5fd2F0Y2hlcnMucHVzaCh0aGlzKSxyPyh0aGlzLmRlZXA9ISFyLmRlZXAsdGhpcy51c2VyPSEhci51c2VyLHRoaXMubGF6eT0hIXIubGF6eSx0aGlzLnN5bmM9ISFyLnN5bmMsdGhpcy5iZWZvcmU9ci5iZWZvcmUpOnRoaXMuZGVlcD10aGlzLnVzZXI9dGhpcy5sYXp5PXRoaXMuc3luYz0hMSx0aGlzLmNiPW4sdGhpcy5pZD0rK2xuLHRoaXMuYWN0aXZlPSEwLHRoaXMuZGlydHk9dGhpcy5sYXp5LHRoaXMuZGVwcz1bXSx0aGlzLm5ld0RlcHM9W10sdGhpcy5kZXBJZHM9bmV3IGllLHRoaXMubmV3RGVwSWRzPW5ldyBpZSx0aGlzLmV4cHJlc3Npb249XCJcIixcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoXCIuXCIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7aWYoIWUpcmV0dXJuO2U9ZVt0W25dXX1yZXR1cm4gZX19fSh0KSx0aGlzLmdldHRlcnx8KHRoaXMuZ2V0dGVyPVMpKSx0aGlzLnZhbHVlPXRoaXMubGF6eT92b2lkIDA6dGhpcy5nZXQoKX07Zm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3ZhciBlO2xlKHRoaXMpO3ZhciB0PXRoaXMudm07dHJ5e2U9dGhpcy5nZXR0ZXIuY2FsbCh0LHQpfWNhdGNoKGUpe2lmKCF0aGlzLnVzZXIpdGhyb3cgZTtSZShlLHQsJ2dldHRlciBmb3Igd2F0Y2hlciBcIicrdGhpcy5leHByZXNzaW9uKydcIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZldChlKSxmZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sZm4ucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sZm4ucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxmbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT10blt0XSl7aWYodG5bdF09ITAscm4pe2Zvcih2YXIgbj1RdC5sZW5ndGgtMTtuPm9uJiZRdFtuXS5pZD5lLmlkOyluLS07UXQuc3BsaWNlKG4rMSwwLGUpfWVsc2UgUXQucHVzaChlKTtubnx8KG5uPSEwLFllKHVuKSl9fSh0aGlzKX0sZm4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHxvKGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtSZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyIFwiJyt0aGlzLmV4cHJlc3Npb24rJ1wiJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LGZuLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxmbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LGZuLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxoKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBwbj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlMsc2V0OlN9O2Z1bmN0aW9uIGRuKGUsdCxuKXtwbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0scG4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixwbil9ZnVuY3Rpb24gdm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxyPWUuX3Byb3BzPXt9LGk9ZS4kb3B0aW9ucy5fcHJvcEtleXM9W107ZS4kcGFyZW50JiYkZSghMSk7dmFyIG89ZnVuY3Rpb24obyl7aS5wdXNoKG8pO3ZhciBhPU1lKG8sdCxuLGUpO3hlKHIsbyxhKSxvIGluIGV8fGRuKGUsXCJfcHJvcHNcIixvKX07Zm9yKHZhciBhIGluIHQpbyhhKTskZSghMCl9KGUsdC5wcm9wcyksdC5tZXRob2RzJiZmdW5jdGlvbihlLHQpe2UuJG9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpZVtuXT1cImZ1bmN0aW9uXCIhPXR5cGVvZiB0W25dP1M6eCh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTtzKHQ9ZS5fZGF0YT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7bGUoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBSZShlLHQsXCJkYXRhKClcIikse319ZmluYWxseXtmZSgpfX0odCxlKTp0fHx7fSl8fCh0PXt9KTt2YXIgbj1PYmplY3Qua2V5cyh0KSxyPWUuJG9wdGlvbnMucHJvcHMsaT0oZS4kb3B0aW9ucy5tZXRob2RzLG4ubGVuZ3RoKTtmb3IoO2ktLTspe3ZhciBvPW5baV07ciYmeShyLG8pfHwoYT12b2lkIDAsMzYhPT0oYT0obytcIlwiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZkbihlLFwiX2RhdGFcIixvKSl9dmFyIGE7Q2UodCwhMCl9KGUpOkNlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGUoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8/bzpvLmdldDtyfHwobltpXT1uZXcgZm4oZSxhfHxTLFMsaG4pKSxpIGluIGV8fG1uKGUsaSxvKX19KGUsdC5jb21wdXRlZCksdC53YXRjaCYmdC53YXRjaCE9PVkmJmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylfbihlLG4scltpXSk7ZWxzZSBfbihlLG4scil9fShlLHQud2F0Y2gpfXZhciBobj17bGF6eTohMH07ZnVuY3Rpb24gbW4oZSx0LG4pe3ZhciByPSF0ZSgpO1wiZnVuY3Rpb25cIj09dHlwZW9mIG4/KHBuLmdldD1yP3luKHQpOmduKG4pLHBuLnNldD1TKToocG4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT95bih0KTpnbihuLmdldCk6Uyxwbi5zZXQ9bi5zZXR8fFMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQscG4pfWZ1bmN0aW9uIHluKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbZV07aWYodClyZXR1cm4gdC5kaXJ0eSYmdC5ldmFsdWF0ZSgpLGNlLnRhcmdldCYmdC5kZXBlbmQoKSx0LnZhbHVlfX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIF9uKGUsdCxuLHIpe3JldHVybiBzKG4pJiYocj1uLG49bi5oYW5kbGVyKSxcInN0cmluZ1wiPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBibj0wO2Z1bmN0aW9uICRuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj0kbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmQShlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPURlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIENuKGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxpPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihpW3JdKXJldHVybiBpW3JdO3ZhciBvPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWEsYS5jaWQ9dCsrLGEub3B0aW9ucz1EZShuLm9wdGlvbnMsZSksYS5zdXBlcj1uLGEub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWRuKGUucHJvdG90eXBlLFwiX3Byb3BzXCIsbil9KGEpLGEub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KW1uKGUucHJvdG90eXBlLG4sdFtuXSl9KGEpLGEuZXh0ZW5kPW4uZXh0ZW5kLGEubWl4aW49bi5taXhpbixhLnVzZT1uLnVzZSxNLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlXT1uW2VdfSksbyYmKGEub3B0aW9ucy5jb21wb25lbnRzW29dPWEpLGEuc3VwZXJPcHRpb25zPW4ub3B0aW9ucyxhLmV4dGVuZE9wdGlvbnM9ZSxhLnNlYWxlZE9wdGlvbnM9QSh7fSxhLm9wdGlvbnMpLGlbcl09YSxhfX1mdW5jdGlvbiB4bihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBrbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuaW5kZXhPZih0KT4tMTpcInN0cmluZ1wiPT10eXBlb2YgZT9lLnNwbGl0KFwiLFwiKS5pbmRleE9mKHQpPi0xOihuPWUsXCJbb2JqZWN0IFJlZ0V4cF1cIj09PWEuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBBbihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz14bihhLmNvbXBvbmVudE9wdGlvbnMpO3MmJiF0KHMpJiZPbihuLG8scixpKX19fWZ1bmN0aW9uIE9uKGUsdCxuLHIpe3ZhciBpPWVbdF07IWl8fHImJmkudGFnPT09ci50YWd8fGkuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKSxlW3RdPW51bGwsaChuLHQpfSFmdW5jdGlvbih0KXt0LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO24uX3VpZD1ibisrLG4uX2lzVnVlPSEwLHQmJnQuX2lzQ29tcG9uZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucz1PYmplY3QuY3JlYXRlKGUuY29uc3RydWN0b3Iub3B0aW9ucykscj10Ll9wYXJlbnRWbm9kZTtuLnBhcmVudD10LnBhcmVudCxuLl9wYXJlbnRWbm9kZT1yO3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9KG4sdCk6bi4kb3B0aW9ucz1EZSgkbihuLmNvbnN0cnVjdG9yKSx0fHx7fSxuKSxuLl9yZW5kZXJQcm94eT1uLG4uX3NlbGY9bixmdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLG49dC5wYXJlbnQ7aWYobiYmIXQuYWJzdHJhY3Qpe2Zvcig7bi4kb3B0aW9ucy5hYnN0cmFjdCYmbi4kcGFyZW50OyluPW4uJHBhcmVudDtuLiRjaGlsZHJlbi5wdXNoKGUpfWUuJHBhcmVudD1uLGUuJHJvb3Q9bj9uLiRyb290OmUsZS4kY2hpbGRyZW49W10sZS4kcmVmcz17fSxlLl93YXRjaGVyPW51bGwsZS5faW5hY3RpdmU9bnVsbCxlLl9kaXJlY3RJbmFjdGl2ZT0hMSxlLl9pc01vdW50ZWQ9ITEsZS5faXNEZXN0cm95ZWQ9ITEsZS5faXNCZWluZ0Rlc3Ryb3llZD0hMX0obiksZnVuY3Rpb24oZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZxdChlLHQpfShuKSxmdW5jdGlvbih0KXt0Ll92bm9kZT1udWxsLHQuX3N0YXRpY1RyZWVzPW51bGw7dmFyIG49dC4kb3B0aW9ucyxyPXQuJHZub2RlPW4uX3BhcmVudFZub2RlLGk9ciYmci5jb250ZXh0O3QuJHNsb3RzPXV0KG4uX3JlbmRlckNoaWxkcmVuLGkpLHQuJHNjb3BlZFNsb3RzPWUsdC5fYz1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gUHQodCxlLG4scixpLCExKX0sdC4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4gUHQodCxlLG4scixpLCEwKX07dmFyIG89ciYmci5kYXRhO3hlKHQsXCIkYXR0cnNcIixvJiZvLmF0dHJzfHxlLG51bGwsITApLHhlKHQsXCIkbGlzdGVuZXJzXCIsbi5fcGFyZW50TGlzdGVuZXJzfHxlLG51bGwsITApfShuKSxZdChuLFwiYmVmb3JlQ3JlYXRlXCIpLGZ1bmN0aW9uKGUpe3ZhciB0PWN0KGUuJG9wdGlvbnMuaW5qZWN0LGUpO3QmJigkZSghMSksT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt4ZShlLG4sdFtuXSl9KSwkZSghMCkpfShuKSx2bihuKSxmdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLnByb3ZpZGU7dCYmKGUuX3Byb3ZpZGVkPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfShuKSxZdChuLFwiY3JlYXRlZFwiKSxuLiRvcHRpb25zLmVsJiZuLiRtb3VudChuLiRvcHRpb25zLmVsKX19KHduKSxmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCIkZGF0YVwiLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIiRwcm9wc1wiLG4pLGUucHJvdG90eXBlLiRzZXQ9a2UsZS5wcm90b3R5cGUuJGRlbGV0ZT1BZSxlLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe2lmKHModCkpcmV0dXJuIF9uKHRoaXMsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciByPW5ldyBmbih0aGlzLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl0cnl7dC5jYWxsKHRoaXMsci52YWx1ZSl9Y2F0Y2goZSl7UmUoZSx0aGlzLCdjYWxsYmFjayBmb3IgaW1tZWRpYXRlIHdhdGNoZXIgXCInK3IuZXhwcmVzc2lvbisnXCInKX1yZXR1cm4gZnVuY3Rpb24oKXtyLnRlYXJkb3duKCl9fX0od24pLGZ1bmN0aW9uKGUpe3ZhciB0PS9eaG9vazovO2UucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGk9MCxvPWUubGVuZ3RoO2k8bztpKyspci4kb24oZVtpXSxuKTtlbHNlKHIuX2V2ZW50c1tlXXx8KHIuX2V2ZW50c1tlXT1bXSkpLnB1c2gobiksdC50ZXN0KGUpJiYoci5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sZS5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG4uX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLG47aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKW4uJG9mZihlW3JdLHQpO3JldHVybiBufXZhciBvLGE9bi5fZXZlbnRzW2VdO2lmKCFhKXJldHVybiBuO2lmKCF0KXJldHVybiBuLl9ldmVudHNbZV09bnVsbCxuO2Zvcih2YXIgcz1hLmxlbmd0aDtzLS07KWlmKChvPWFbc10pPT09dHx8by5mbj09PXQpe2Euc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIG59LGUucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PXQubGVuZ3RoPjE/ayh0KTp0O2Zvcih2YXIgbj1rKGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciBcIicrZSsnXCInLGk9MCxvPXQubGVuZ3RoO2k8bztpKyspSGUodFtpXSx0aGlzLG4sdGhpcyxyKX1yZXR1cm4gdGhpc319KHduKSxmdW5jdGlvbihlKXtlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPW4uJGVsLGk9bi5fdm5vZGUsbz1adChuKTtuLl92bm9kZT1lLG4uJGVsPWk/bi5fX3BhdGNoX18oaSxlKTpuLl9fcGF0Y2hfXyhuLiRlbCxlLHQsITEpLG8oKSxyJiYoci5fX3Z1ZV9fPW51bGwpLG4uJGVsJiYobi4kZWwuX192dWVfXz1uKSxuLiR2bm9kZSYmbi4kcGFyZW50JiZuLiR2bm9kZT09PW4uJHBhcmVudC5fdm5vZGUmJihuLiRwYXJlbnQuJGVsPW4uJGVsKX0sZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sZS5wcm90b3R5cGUuJGRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCFlLl9pc0JlaW5nRGVzdHJveWVkKXtZdChlLFwiYmVmb3JlRGVzdHJveVwiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8aCh0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxZdChlLFwiZGVzdHJveWVkXCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19fSh3biksZnVuY3Rpb24oZSl7U3QoZS5wcm90b3R5cGUpLGUucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gWWUoZSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxuPXQuJG9wdGlvbnMscj1uLnJlbmRlcixpPW4uX3BhcmVudFZub2RlO2kmJih0LiRzY29wZWRTbG90cz1mdChpLmRhdGEuc2NvcGVkU2xvdHMsdC4kc2xvdHMsdC4kc2NvcGVkU2xvdHMpKSx0LiR2bm9kZT1pO3RyeXtIdD10LGU9ci5jYWxsKHQuX3JlbmRlclByb3h5LHQuJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKG4pe1JlKG4sdCxcInJlbmRlclwiKSxlPXQuX3Zub2RlfWZpbmFsbHl7SHQ9bnVsbH1yZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmMT09PWUubGVuZ3RoJiYoZT1lWzBdKSxlIGluc3RhbmNlb2YgcGV8fChlPXZlKCkpLGUucGFyZW50PWksZX19KHduKTt2YXIgU249W1N0cmluZyxSZWdFeHAsQXJyYXldLFRuPXtLZWVwQWxpdmU6e25hbWU6XCJrZWVwLWFsaXZlXCIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6U24sZXhjbHVkZTpTbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpT24odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKFwiaW5jbHVkZVwiLGZ1bmN0aW9uKHQpe0FuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGtuKHQsZSl9KX0pLHRoaXMuJHdhdGNoKFwiZXhjbHVkZVwiLGZ1bmN0aW9uKHQpe0FuKGUsZnVuY3Rpb24oZSl7cmV0dXJuIWtuKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9enQoZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9eG4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwha24oaSxyKSl8fG8mJnImJmtuKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnP1wiOjpcIituLnRhZzpcIlwiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmT24oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19OyFmdW5jdGlvbihlKXt2YXIgdD17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEZ9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcImNvbmZpZ1wiLHQpLGUudXRpbD17d2FybjphZSxleHRlbmQ6QSxtZXJnZU9wdGlvbnM6RGUsZGVmaW5lUmVhY3RpdmU6eGV9LGUuc2V0PWtlLGUuZGVsZXRlPUFlLGUubmV4dFRpY2s9WWUsZS5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBDZShlKSxlfSxlLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxNLmZvckVhY2goZnVuY3Rpb24odCl7ZS5vcHRpb25zW3QrXCJzXCJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSxlLm9wdGlvbnMuX2Jhc2U9ZSxBKGUub3B0aW9ucy5jb21wb25lbnRzLFRuKSxmdW5jdGlvbihlKXtlLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYodC5pbmRleE9mKGUpPi0xKXJldHVybiB0aGlzO3ZhciBuPWsoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksXCJmdW5jdGlvblwiPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOlwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc319KGUpLGZ1bmN0aW9uKGUpe2UubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1EZSh0aGlzLm9wdGlvbnMsZSksdGhpc319KGUpLENuKGUpLGZ1bmN0aW9uKGUpe00uZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KFwiY29tcG9uZW50XCI9PT10JiZzKG4pJiYobi5uYW1lPW4ubmFtZXx8ZSxuPXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQobikpLFwiZGlyZWN0aXZlXCI9PT10JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiYobj17YmluZDpuLHVwZGF0ZTpufSksdGhpcy5vcHRpb25zW3QrXCJzXCJdW2VdPW4sbik6dGhpcy5vcHRpb25zW3QrXCJzXCJdW2VdfX0pfShlKX0od24pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bi5wcm90b3R5cGUsXCIkaXNTZXJ2ZXJcIix7Z2V0OnRlfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHduLnByb3RvdHlwZSxcIiRzc3JDb250ZXh0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkod24sXCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dFwiLHt2YWx1ZTpUdH0pLHduLnZlcnNpb249XCIyLjYuMTFcIjt2YXIgRW49cChcInN0eWxlLGNsYXNzXCIpLE5uPXAoXCJpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzXCIpLGpuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5cInZhbHVlXCI9PT1uJiZObihlKSYmXCJidXR0b25cIiE9PXR8fFwic2VsZWN0ZWRcIj09PW4mJlwib3B0aW9uXCI9PT1lfHxcImNoZWNrZWRcIj09PW4mJlwiaW5wdXRcIj09PWV8fFwibXV0ZWRcIj09PW4mJlwidmlkZW9cIj09PWV9LERuPXAoXCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2tcIiksTG49cChcImV2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHlcIiksTW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSG4odCl8fFwiZmFsc2VcIj09PXQ/XCJmYWxzZVwiOlwiY29udGVudGVkaXRhYmxlXCI9PT1lJiZMbih0KT90OlwidHJ1ZVwifSxJbj1wKFwiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZVwiKSxGbj1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixQbj1mdW5jdGlvbihlKXtyZXR1cm5cIjpcIj09PWUuY2hhckF0KDUpJiZcInhsaW5rXCI9PT1lLnNsaWNlKDAsNSl9LFJuPWZ1bmN0aW9uKGUpe3JldHVybiBQbihlKT9lLnNsaWNlKDYsZS5sZW5ndGgpOlwiXCJ9LEhuPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfHwhMT09PWV9O2Z1bmN0aW9uIEJuKGUpe2Zvcih2YXIgdD1lLmRhdGEscj1lLGk9ZTtuKGkuY29tcG9uZW50SW5zdGFuY2UpOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKHQ9VW4oaS5kYXRhLHQpKTtmb3IoO24ocj1yLnBhcmVudCk7KXImJnIuZGF0YSYmKHQ9VW4odCxyLmRhdGEpKTtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihuKGUpfHxuKHQpKXJldHVybiB6bihlLFZuKHQpKTtyZXR1cm5cIlwifSh0LnN0YXRpY0NsYXNzLHQuY2xhc3MpfWZ1bmN0aW9uIFVuKGUsdCl7cmV0dXJue3N0YXRpY0NsYXNzOnpuKGUuc3RhdGljQ2xhc3MsdC5zdGF0aWNDbGFzcyksY2xhc3M6bihlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB6bihlLHQpe3JldHVybiBlP3Q/ZStcIiBcIit0OmU6dHx8XCJcIn1mdW5jdGlvbiBWbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbihlKXtmb3IodmFyIHQscj1cIlwiLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspbih0PVZuKGVbaV0pKSYmXCJcIiE9PXQmJihyJiYocis9XCIgXCIpLHIrPXQpO3JldHVybiByfShlKTpvKGUpP2Z1bmN0aW9uKGUpe3ZhciB0PVwiXCI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz1cIiBcIiksdCs9bik7cmV0dXJuIHR9KGUpOlwic3RyaW5nXCI9PXR5cGVvZiBlP2U6XCJcIn12YXIgS249e3N2ZzpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsbWF0aDpcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIn0sSm49cChcImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290XCIpLHFuPXAoXCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2Usdmlld1wiLCEwKSxXbj1mdW5jdGlvbihlKXtyZXR1cm4gSm4oZSl8fHFuKGUpfTtmdW5jdGlvbiBabihlKXtyZXR1cm4gcW4oZSk/XCJzdmdcIjpcIm1hdGhcIj09PWU/XCJtYXRoXCI6dm9pZCAwfXZhciBHbj1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBYbj1wKFwidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmxcIik7ZnVuY3Rpb24gWW4oZSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk7cmV0dXJuIHR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIil9cmV0dXJuIGV9dmFyIFFuPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVyblwic2VsZWN0XCIhPT1lP246KHQuZGF0YSYmdC5kYXRhLmF0dHJzJiZ2b2lkIDAhPT10LmRhdGEuYXR0cnMubXVsdGlwbGUmJm4uc2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIixcIm11bHRpcGxlXCIpLG4pfSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKEtuW2VdLHQpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSl9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnRleHRDb250ZW50PXR9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZSh0LFwiXCIpfX0pLGVyPXtjcmVhdGU6ZnVuY3Rpb24oZSx0KXt0cih0KX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhLnJlZiE9PXQuZGF0YS5yZWYmJih0cihlLCEwKSx0cih0KSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dHIoZSwhMCl9fTtmdW5jdGlvbiB0cihlLHQpe3ZhciByPWUuZGF0YS5yZWY7aWYobihyKSl7dmFyIGk9ZS5jb250ZXh0LG89ZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5lbG0sYT1pLiRyZWZzO3Q/QXJyYXkuaXNBcnJheShhW3JdKT9oKGFbcl0sbyk6YVtyXT09PW8mJihhW3JdPXZvaWQgMCk6ZS5kYXRhLnJlZkluRm9yP0FycmF5LmlzQXJyYXkoYVtyXSk/YVtyXS5pbmRleE9mKG8pPDAmJmFbcl0ucHVzaChvKTphW3JdPVtvXTphW3JdPW99fXZhciBucj1uZXcgcGUoXCJcIix7fSxbXSkscnI9W1wiY3JlYXRlXCIsXCJhY3RpdmF0ZVwiLFwidXBkYXRlXCIsXCJyZW1vdmVcIixcImRlc3Ryb3lcIl07ZnVuY3Rpb24gaXIoZSxpKXtyZXR1cm4gZS5rZXk9PT1pLmtleSYmKGUudGFnPT09aS50YWcmJmUuaXNDb21tZW50PT09aS5pc0NvbW1lbnQmJm4oZS5kYXRhKT09PW4oaS5kYXRhKSYmZnVuY3Rpb24oZSx0KXtpZihcImlucHV0XCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgcixpPW4ocj1lLmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZSxvPW4ocj10LmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZTtyZXR1cm4gaT09PW98fFhuKGkpJiZYbihvKX0oZSxpKXx8cihlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09aS5hc3luY0ZhY3RvcnkmJnQoaS5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBvcihlLHQscil7dmFyIGksbyxhPXt9O2ZvcihpPXQ7aTw9cjsrK2kpbihvPWVbaV0ua2V5KSYmKGFbb109aSk7cmV0dXJuIGF9dmFyIGFyPXtjcmVhdGU6c3IsdXBkYXRlOnNyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7c3IoZSxucil9fTtmdW5jdGlvbiBzcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPWU9PT1ucixhPXQ9PT1ucixzPXVyKGUuZGF0YS5kaXJlY3RpdmVzLGUuY29udGV4dCksYz11cih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLHU9W10sbD1bXTtmb3IobiBpbiBjKXI9c1tuXSxpPWNbbl0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLGZyKGksXCJ1cGRhdGVcIix0LGUpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOihmcihpLFwiYmluZFwiLHQsZSksaS5kZWYmJmkuZGVmLmluc2VydGVkJiZ1LnB1c2goaSkpO2lmKHUubGVuZ3RoKXt2YXIgZj1mdW5jdGlvbigpe2Zvcih2YXIgbj0wO248dS5sZW5ndGg7bisrKWZyKHVbbl0sXCJpbnNlcnRlZFwiLHQsZSl9O28/aXQodCxcImluc2VydFwiLGYpOmYoKX1sLmxlbmd0aCYmaXQodCxcInBvc3RwYXRjaFwiLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTA7bjxsLmxlbmd0aDtuKyspZnIobFtuXSxcImNvbXBvbmVudFVwZGF0ZWRcIix0LGUpfSk7aWYoIW8pZm9yKG4gaW4gcyljW25dfHxmcihzW25dLFwidW5iaW5kXCIsZSxlLGEpfShlLHQpfXZhciBjcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHVyKGUsdCl7dmFyIG4scixpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIGk7Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1jciksaVtscihyKV09cixyLmRlZj1MZSh0LiRvcHRpb25zLFwiZGlyZWN0aXZlc1wiLHIubmFtZSk7cmV0dXJuIGl9ZnVuY3Rpb24gbHIoZSl7cmV0dXJuIGUucmF3TmFtZXx8ZS5uYW1lK1wiLlwiK09iamVjdC5rZXlzKGUubW9kaWZpZXJzfHx7fSkuam9pbihcIi5cIil9ZnVuY3Rpb24gZnIoZSx0LG4scixpKXt2YXIgbz1lLmRlZiYmZS5kZWZbdF07aWYobyl0cnl7byhuLmVsbSxlLG4scixpKX1jYXRjaChyKXtSZShyLG4uY29udGV4dCxcImRpcmVjdGl2ZSBcIitlLm5hbWUrXCIgXCIrdCtcIiBob29rXCIpfX12YXIgcHI9W2VyLGFyXTtmdW5jdGlvbiBkcihlLHIpe3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztpZighKG4oaSkmJiExPT09aS5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHx0KGUuZGF0YS5hdHRycykmJnQoci5kYXRhLmF0dHJzKSkpe3ZhciBvLGEscz1yLmVsbSxjPWUuZGF0YS5hdHRyc3x8e30sdT1yLmRhdGEuYXR0cnN8fHt9O2ZvcihvIGluIG4odS5fX29iX18pJiYodT1yLmRhdGEuYXR0cnM9QSh7fSx1KSksdSlhPXVbb10sY1tvXSE9PWEmJnZyKHMsbyxhKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJnZyKHMsXCJ2YWx1ZVwiLHUudmFsdWUpLGMpdCh1W29dKSYmKFBuKG8pP3MucmVtb3ZlQXR0cmlidXRlTlMoRm4sUm4obykpOkRuKG8pfHxzLnJlbW92ZUF0dHJpYnV0ZShvKSl9fWZ1bmN0aW9uIHZyKGUsdCxuKXtlLnRhZ05hbWUuaW5kZXhPZihcIi1cIik+LTE/aHIoZSx0LG4pOkluKHQpP0huKG4pP2UucmVtb3ZlQXR0cmlidXRlKHQpOihuPVwiYWxsb3dmdWxsc2NyZWVuXCI9PT10JiZcIkVNQkVEXCI9PT1lLnRhZ05hbWU/XCJ0cnVlXCI6dCxlLnNldEF0dHJpYnV0ZSh0LG4pKTpEbih0KT9lLnNldEF0dHJpYnV0ZSh0LE1uKHQsbikpOlBuKHQpP0huKG4pP2UucmVtb3ZlQXR0cmlidXRlTlMoRm4sUm4odCkpOmUuc2V0QXR0cmlidXRlTlMoRm4sdCxuKTpocihlLHQsbil9ZnVuY3Rpb24gaHIoZSx0LG4pe2lmKEhuKG4pKWUucmVtb3ZlQXR0cmlidXRlKHQpO2Vsc2V7aWYocSYmIVcmJlwiVEVYVEFSRUFcIj09PWUudGFnTmFtZSYmXCJwbGFjZWhvbGRlclwiPT09dCYmXCJcIiE9PW4mJiFlLl9faWVwaCl7dmFyIHI9ZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLHIpLGUuX19pZXBoPSEwfWUuc2V0QXR0cmlidXRlKHQsbil9fXZhciBtcj17Y3JlYXRlOmRyLHVwZGF0ZTpkcn07ZnVuY3Rpb24geXIoZSxyKXt2YXIgaT1yLmVsbSxvPXIuZGF0YSxhPWUuZGF0YTtpZighKHQoby5zdGF0aWNDbGFzcykmJnQoby5jbGFzcykmJih0KGEpfHx0KGEuc3RhdGljQ2xhc3MpJiZ0KGEuY2xhc3MpKSkpe3ZhciBzPUJuKHIpLGM9aS5fdHJhbnNpdGlvbkNsYXNzZXM7bihjKSYmKHM9em4ocyxWbihjKSkpLHMhPT1pLl9wcmV2Q2xhc3MmJihpLnNldEF0dHJpYnV0ZShcImNsYXNzXCIscyksaS5fcHJldkNsYXNzPXMpfX12YXIgZ3IsX3IsYnIsJHIsd3IsQ3IseHI9e2NyZWF0ZTp5cix1cGRhdGU6eXJ9LGtyPS9bXFx3KS4rXFwtXyRcXF1dLztmdW5jdGlvbiBBcihlKXt2YXIgdCxuLHIsaSxvLGE9ITEscz0hMSxjPSExLHU9ITEsbD0wLGY9MCxwPTAsZD0wO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspaWYobj10LHQ9ZS5jaGFyQ29kZUF0KHIpLGEpMzk9PT10JiY5MiE9PW4mJihhPSExKTtlbHNlIGlmKHMpMzQ9PT10JiY5MiE9PW4mJihzPSExKTtlbHNlIGlmKGMpOTY9PT10JiY5MiE9PW4mJihjPSExKTtlbHNlIGlmKHUpNDc9PT10JiY5MiE9PW4mJih1PSExKTtlbHNlIGlmKDEyNCE9PXR8fDEyND09PWUuY2hhckNvZGVBdChyKzEpfHwxMjQ9PT1lLmNoYXJDb2RlQXQoci0xKXx8bHx8Znx8cCl7c3dpdGNoKHQpe2Nhc2UgMzQ6cz0hMDticmVhaztjYXNlIDM5OmE9ITA7YnJlYWs7Y2FzZSA5NjpjPSEwO2JyZWFrO2Nhc2UgNDA6cCsrO2JyZWFrO2Nhc2UgNDE6cC0tO2JyZWFrO2Nhc2UgOTE6ZisrO2JyZWFrO2Nhc2UgOTM6Zi0tO2JyZWFrO2Nhc2UgMTIzOmwrKzticmVhaztjYXNlIDEyNTpsLS19aWYoNDc9PT10KXtmb3IodmFyIHY9ci0xLGg9dm9pZCAwO3Y+PTAmJlwiIFwiPT09KGg9ZS5jaGFyQXQodikpO3YtLSk7aCYma3IudGVzdChoKXx8KHU9ITApfX1lbHNlIHZvaWQgMD09PWk/KGQ9cisxLGk9ZS5zbGljZSgwLHIpLnRyaW0oKSk6bSgpO2Z1bmN0aW9uIG0oKXsob3x8KG89W10pKS5wdXNoKGUuc2xpY2UoZCxyKS50cmltKCkpLGQ9cisxfWlmKHZvaWQgMD09PWk/aT1lLnNsaWNlKDAscikudHJpbSgpOjAhPT1kJiZtKCksbylmb3Iocj0wO3I8by5sZW5ndGg7cisrKWk9T3IoaSxvW3JdKTtyZXR1cm4gaX1mdW5jdGlvbiBPcihlLHQpe3ZhciBuPXQuaW5kZXhPZihcIihcIik7aWYobjwwKXJldHVybidfZihcIicrdCsnXCIpKCcrZStcIilcIjt2YXIgcj10LnNsaWNlKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuJ19mKFwiJytyKydcIikoJytlKyhcIilcIiE9PWk/XCIsXCIraTppKX1mdW5jdGlvbiBTcihlLHQpe2NvbnNvbGUuZXJyb3IoXCJbVnVlIGNvbXBpbGVyXTogXCIrZSl9ZnVuY3Rpb24gVHIoZSx0KXtyZXR1cm4gZT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pOltdfWZ1bmN0aW9uIEVyKGUsdCxuLHIsaSl7KGUucHJvcHN8fChlLnByb3BzPVtdKSkucHVzaChScih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBOcihlLHQsbixyLGkpeyhpP2UuZHluYW1pY0F0dHJzfHwoZS5keW5hbWljQXR0cnM9W10pOmUuYXR0cnN8fChlLmF0dHJzPVtdKSkucHVzaChScih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBqcihlLHQsbixyKXtlLmF0dHJzTWFwW3RdPW4sZS5hdHRyc0xpc3QucHVzaChScih7bmFtZTp0LHZhbHVlOm59LHIpKX1mdW5jdGlvbiBEcihlLHQsbixyLGksbyxhLHMpeyhlLmRpcmVjdGl2ZXN8fChlLmRpcmVjdGl2ZXM9W10pKS5wdXNoKFJyKHtuYW1lOnQscmF3TmFtZTpuLHZhbHVlOnIsYXJnOmksaXNEeW5hbWljQXJnOm8sbW9kaWZpZXJzOmF9LHMpKSxlLnBsYWluPSExfWZ1bmN0aW9uIExyKGUsdCxuKXtyZXR1cm4gbj9cIl9wKFwiK3QrJyxcIicrZSsnXCIpJzplK3R9ZnVuY3Rpb24gTXIodCxuLHIsaSxvLGEscyxjKXt2YXIgdTsoaT1pfHxlKS5yaWdodD9jP249XCIoXCIrbitcIik9PT0nY2xpY2snPydjb250ZXh0bWVudSc6KFwiK24rXCIpXCI6XCJjbGlja1wiPT09biYmKG49XCJjb250ZXh0bWVudVwiLGRlbGV0ZSBpLnJpZ2h0KTppLm1pZGRsZSYmKGM/bj1cIihcIituK1wiKT09PSdjbGljayc/J21vdXNldXAnOihcIituK1wiKVwiOlwiY2xpY2tcIj09PW4mJihuPVwibW91c2V1cFwiKSksaS5jYXB0dXJlJiYoZGVsZXRlIGkuY2FwdHVyZSxuPUxyKFwiIVwiLG4sYykpLGkub25jZSYmKGRlbGV0ZSBpLm9uY2Usbj1McihcIn5cIixuLGMpKSxpLnBhc3NpdmUmJihkZWxldGUgaS5wYXNzaXZlLG49THIoXCImXCIsbixjKSksaS5uYXRpdmU/KGRlbGV0ZSBpLm5hdGl2ZSx1PXQubmF0aXZlRXZlbnRzfHwodC5uYXRpdmVFdmVudHM9e30pKTp1PXQuZXZlbnRzfHwodC5ldmVudHM9e30pO3ZhciBsPVJyKHt2YWx1ZTpyLnRyaW0oKSxkeW5hbWljOmN9LHMpO2khPT1lJiYobC5tb2RpZmllcnM9aSk7dmFyIGY9dVtuXTtBcnJheS5pc0FycmF5KGYpP28/Zi51bnNoaWZ0KGwpOmYucHVzaChsKTp1W25dPWY/bz9bbCxmXTpbZixsXTpsLHQucGxhaW49ITF9ZnVuY3Rpb24gSXIoZSx0LG4pe3ZhciByPUZyKGUsXCI6XCIrdCl8fEZyKGUsXCJ2LWJpbmQ6XCIrdCk7aWYobnVsbCE9cilyZXR1cm4gQXIocik7aWYoITEhPT1uKXt2YXIgaT1GcihlLHQpO2lmKG51bGwhPWkpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGkpfX1mdW5jdGlvbiBGcihlLHQsbil7dmFyIHI7aWYobnVsbCE9KHI9ZS5hdHRyc01hcFt0XSkpZm9yKHZhciBpPWUuYXR0cnNMaXN0LG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYoaVtvXS5uYW1lPT09dCl7aS5zcGxpY2UobywxKTticmVha31yZXR1cm4gbiYmZGVsZXRlIGUuYXR0cnNNYXBbdF0scn1mdW5jdGlvbiBQcihlLHQpe2Zvcih2YXIgbj1lLmF0dHJzTGlzdCxyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO2lmKHQudGVzdChvLm5hbWUpKXJldHVybiBuLnNwbGljZShyLDEpLG99fWZ1bmN0aW9uIFJyKGUsdCl7cmV0dXJuIHQmJihudWxsIT10LnN0YXJ0JiYoZS5zdGFydD10LnN0YXJ0KSxudWxsIT10LmVuZCYmKGUuZW5kPXQuZW5kKSksZX1mdW5jdGlvbiBIcihlLHQsbil7dmFyIHI9bnx8e30saT1yLm51bWJlcixvPVwiJCR2XCI7ci50cmltJiYobz1cIih0eXBlb2YgJCR2ID09PSAnc3RyaW5nJz8gJCR2LnRyaW0oKTogJCR2KVwiKSxpJiYobz1cIl9uKFwiK28rXCIpXCIpO3ZhciBhPUJyKHQsbyk7ZS5tb2RlbD17dmFsdWU6XCIoXCIrdCtcIilcIixleHByZXNzaW9uOkpTT04uc3RyaW5naWZ5KHQpLGNhbGxiYWNrOlwiZnVuY3Rpb24gKCQkdikge1wiK2ErXCJ9XCJ9fWZ1bmN0aW9uIEJyKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7aWYoZT1lLnRyaW0oKSxncj1lLmxlbmd0aCxlLmluZGV4T2YoXCJbXCIpPDB8fGUubGFzdEluZGV4T2YoXCJdXCIpPGdyLTEpcmV0dXJuKCRyPWUubGFzdEluZGV4T2YoXCIuXCIpKT4tMT97ZXhwOmUuc2xpY2UoMCwkciksa2V5OidcIicrZS5zbGljZSgkcisxKSsnXCInfTp7ZXhwOmUsa2V5Om51bGx9O19yPWUsJHI9d3I9Q3I9MDtmb3IoOyF6cigpOylWcihicj1VcigpKT9Kcihicik6OTE9PT1iciYmS3IoYnIpO3JldHVybntleHA6ZS5zbGljZSgwLHdyKSxrZXk6ZS5zbGljZSh3cisxLENyKX19KGUpO3JldHVybiBudWxsPT09bi5rZXk/ZStcIj1cIit0OlwiJHNldChcIituLmV4cCtcIiwgXCIrbi5rZXkrXCIsIFwiK3QrXCIpXCJ9ZnVuY3Rpb24gVXIoKXtyZXR1cm4gX3IuY2hhckNvZGVBdCgrKyRyKX1mdW5jdGlvbiB6cigpe3JldHVybiAkcj49Z3J9ZnVuY3Rpb24gVnIoZSl7cmV0dXJuIDM0PT09ZXx8Mzk9PT1lfWZ1bmN0aW9uIEtyKGUpe3ZhciB0PTE7Zm9yKHdyPSRyOyF6cigpOylpZihWcihlPVVyKCkpKUpyKGUpO2Vsc2UgaWYoOTE9PT1lJiZ0KyssOTM9PT1lJiZ0LS0sMD09PXQpe0NyPSRyO2JyZWFrfX1mdW5jdGlvbiBKcihlKXtmb3IodmFyIHQ9ZTshenIoKSYmKGU9VXIoKSkhPT10Oyk7fXZhciBxcixXcj1cIl9fclwiLFpyPVwiX19jXCI7ZnVuY3Rpb24gR3IoZSx0LG4pe3ZhciByPXFyO3JldHVybiBmdW5jdGlvbiBpKCl7bnVsbCE9PXQuYXBwbHkobnVsbCxhcmd1bWVudHMpJiZRcihlLGksbixyKX19dmFyIFhyPVZlJiYhKFgmJk51bWJlcihYWzFdKTw9NTMpO2Z1bmN0aW9uIFlyKGUsdCxuLHIpe2lmKFhyKXt2YXIgaT1hbixvPXQ7dD1vLl93cmFwcGVyPWZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09ZS5jdXJyZW50VGFyZ2V0fHxlLnRpbWVTdGFtcD49aXx8ZS50aW1lU3RhbXA8PTB8fGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudClyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fXFyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LFE/e2NhcHR1cmU6bixwYXNzaXZlOnJ9Om4pfWZ1bmN0aW9uIFFyKGUsdCxuLHIpeyhyfHxxcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQsbil9ZnVuY3Rpb24gZWkoZSxyKXtpZighdChlLmRhdGEub24pfHwhdChyLmRhdGEub24pKXt2YXIgaT1yLmRhdGEub258fHt9LG89ZS5kYXRhLm9ufHx7fTtxcj1yLmVsbSxmdW5jdGlvbihlKXtpZihuKGVbV3JdKSl7dmFyIHQ9cT9cImNoYW5nZVwiOlwiaW5wdXRcIjtlW3RdPVtdLmNvbmNhdChlW1dyXSxlW3RdfHxbXSksZGVsZXRlIGVbV3JdfW4oZVtacl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbWnJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbWnJdKX0oaSkscnQoaSxvLFlyLFFyLEdyLHIuY29udGV4dCkscXI9dm9pZCAwfX12YXIgdGksbmk9e2NyZWF0ZTplaSx1cGRhdGU6ZWl9O2Z1bmN0aW9uIHJpKGUscil7aWYoIXQoZS5kYXRhLmRvbVByb3BzKXx8IXQoci5kYXRhLmRvbVByb3BzKSl7dmFyIGksbyxhPXIuZWxtLHM9ZS5kYXRhLmRvbVByb3BzfHx7fSxjPXIuZGF0YS5kb21Qcm9wc3x8e307Zm9yKGkgaW4gbihjLl9fb2JfXykmJihjPXIuZGF0YS5kb21Qcm9wcz1BKHt9LGMpKSxzKWkgaW4gY3x8KGFbaV09XCJcIik7Zm9yKGkgaW4gYyl7aWYobz1jW2ldLFwidGV4dENvbnRlbnRcIj09PWl8fFwiaW5uZXJIVE1MXCI9PT1pKXtpZihyLmNoaWxkcmVuJiYoci5jaGlsZHJlbi5sZW5ndGg9MCksbz09PXNbaV0pY29udGludWU7MT09PWEuY2hpbGROb2Rlcy5sZW5ndGgmJmEucmVtb3ZlQ2hpbGQoYS5jaGlsZE5vZGVzWzBdKX1pZihcInZhbHVlXCI9PT1pJiZcIlBST0dSRVNTXCIhPT1hLnRhZ05hbWUpe2EuX3ZhbHVlPW87dmFyIHU9dChvKT9cIlwiOlN0cmluZyhvKTtpaShhLHUpJiYoYS52YWx1ZT11KX1lbHNlIGlmKFwiaW5uZXJIVE1MXCI9PT1pJiZxbihhLnRhZ05hbWUpJiZ0KGEuaW5uZXJIVE1MKSl7KHRpPXRpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5pbm5lckhUTUw9XCI8c3ZnPlwiK28rXCI8L3N2Zz5cIjtmb3IodmFyIGw9dGkuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2wuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChsLmZpcnN0Q2hpbGQpfWVsc2UgaWYobyE9PXNbaV0pdHJ5e2FbaV09b31jYXRjaChlKXt9fX19ZnVuY3Rpb24gaWkoZSx0KXtyZXR1cm4hZS5jb21wb3NpbmcmJihcIk9QVElPTlwiPT09ZS50YWdOYW1lfHxmdW5jdGlvbihlLHQpe3ZhciBuPSEwO3RyeXtuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1lfWNhdGNoKGUpe31yZXR1cm4gbiYmZS52YWx1ZSE9PXR9KGUsdCl8fGZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS52YWx1ZSxpPWUuX3ZNb2RpZmllcnM7aWYobihpKSl7aWYoaS5udW1iZXIpcmV0dXJuIGYocikhPT1mKHQpO2lmKGkudHJpbSlyZXR1cm4gci50cmltKCkhPT10LnRyaW0oKX1yZXR1cm4gciE9PXR9KGUsdCkpfXZhciBvaT17Y3JlYXRlOnJpLHVwZGF0ZTpyaX0sYWk9ZyhmdW5jdGlvbihlKXt2YXIgdD17fSxuPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlxcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgcj1lLnNwbGl0KG4pO3IubGVuZ3RoPjEmJih0W3JbMF0udHJpbSgpXT1yWzFdLnRyaW0oKSl9fSksdH0pO2Z1bmN0aW9uIHNpKGUpe3ZhciB0PWNpKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP0EoZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIGNpKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP08oZSk6XCJzdHJpbmdcIj09dHlwZW9mIGU/YWkoZSk6ZX12YXIgdWksbGk9L14tLS8sZmk9L1xccyohaW1wb3J0YW50JC8scGk9ZnVuY3Rpb24oZSx0LG4pe2lmKGxpLnRlc3QodCkpZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4pO2Vsc2UgaWYoZmkudGVzdChuKSllLnN0eWxlLnNldFByb3BlcnR5KEModCksbi5yZXBsYWNlKGZpLFwiXCIpLFwiaW1wb3J0YW50XCIpO2Vsc2V7dmFyIHI9dmkodCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspZS5zdHlsZVtyXT1uW2ldO2Vsc2UgZS5zdHlsZVtyXT1ufX0sZGk9W1wiV2Via2l0XCIsXCJNb3pcIixcIm1zXCJdLHZpPWcoZnVuY3Rpb24oZSl7aWYodWk9dWl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJmaWx0ZXJcIiE9PShlPWIoZSkpJiZlIGluIHVpKXJldHVybiBlO2Zvcih2YXIgdD1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj0wO248ZGkubGVuZ3RoO24rKyl7dmFyIHI9ZGlbbl0rdDtpZihyIGluIHVpKXJldHVybiByfX0pO2Z1bmN0aW9uIGhpKGUscil7dmFyIGk9ci5kYXRhLG89ZS5kYXRhO2lmKCEodChpLnN0YXRpY1N0eWxlKSYmdChpLnN0eWxlKSYmdChvLnN0YXRpY1N0eWxlKSYmdChvLnN0eWxlKSkpe3ZhciBhLHMsYz1yLmVsbSx1PW8uc3RhdGljU3R5bGUsbD1vLm5vcm1hbGl6ZWRTdHlsZXx8by5zdHlsZXx8e30sZj11fHxsLHA9Y2koci5kYXRhLnN0eWxlKXx8e307ci5kYXRhLm5vcm1hbGl6ZWRTdHlsZT1uKHAuX19vYl9fKT9BKHt9LHApOnA7dmFyIGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXt9O2lmKHQpZm9yKHZhciBpPWU7aS5jb21wb25lbnRJbnN0YW5jZTspKGk9aS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZpLmRhdGEmJihuPXNpKGkuZGF0YSkpJiZBKHIsbik7KG49c2koZS5kYXRhKSkmJkEocixuKTtmb3IodmFyIG89ZTtvPW8ucGFyZW50OylvLmRhdGEmJihuPXNpKG8uZGF0YSkpJiZBKHIsbik7cmV0dXJuIHJ9KHIsITApO2ZvcihzIGluIGYpdChkW3NdKSYmcGkoYyxzLFwiXCIpO2ZvcihzIGluIGQpKGE9ZFtzXSkhPT1mW3NdJiZwaShjLHMsbnVsbD09YT9cIlwiOmEpfX12YXIgbWk9e2NyZWF0ZTpoaSx1cGRhdGU6aGl9LHlpPS9cXHMrLztmdW5jdGlvbiBnaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoXCIgXCIpPi0xP3Quc3BsaXQoeWkpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuY2xhc3NMaXN0LmFkZCh0KX0pOmUuY2xhc3NMaXN0LmFkZCh0KTtlbHNle3ZhciBuPVwiIFwiKyhlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKStcIiBcIjtuLmluZGV4T2YoXCIgXCIrdCtcIiBcIik8MCYmZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLChuK3QpLnRyaW0oKSl9fWZ1bmN0aW9uIF9pKGUsdCl7aWYodCYmKHQ9dC50cmltKCkpKWlmKGUuY2xhc3NMaXN0KXQuaW5kZXhPZihcIiBcIik+LTE/dC5zcGxpdCh5aSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpLGUuY2xhc3NMaXN0Lmxlbmd0aHx8ZS5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKTtlbHNle2Zvcih2YXIgbj1cIiBcIisoZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIikrXCIgXCIscj1cIiBcIit0K1wiIFwiO24uaW5kZXhPZihyKT49MDspbj1uLnJlcGxhY2UocixcIiBcIik7KG49bi50cmltKCkpP2Uuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixuKTplLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpfX1mdW5jdGlvbiBiaShlKXtpZihlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZSl7dmFyIHQ9e307cmV0dXJuITEhPT1lLmNzcyYmQSh0LCRpKGUubmFtZXx8XCJ2XCIpKSxBKHQsZSksdH1yZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZT8kaShlKTp2b2lkIDB9fXZhciAkaT1nKGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrXCItZW50ZXJcIixlbnRlclRvQ2xhc3M6ZStcIi1lbnRlci10b1wiLGVudGVyQWN0aXZlQ2xhc3M6ZStcIi1lbnRlci1hY3RpdmVcIixsZWF2ZUNsYXNzOmUrXCItbGVhdmVcIixsZWF2ZVRvQ2xhc3M6ZStcIi1sZWF2ZS10b1wiLGxlYXZlQWN0aXZlQ2xhc3M6ZStcIi1sZWF2ZS1hY3RpdmVcIn19KSx3aT16JiYhVyxDaT1cInRyYW5zaXRpb25cIix4aT1cImFuaW1hdGlvblwiLGtpPVwidHJhbnNpdGlvblwiLEFpPVwidHJhbnNpdGlvbmVuZFwiLE9pPVwiYW5pbWF0aW9uXCIsU2k9XCJhbmltYXRpb25lbmRcIjt3aSYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQmJihraT1cIldlYmtpdFRyYW5zaXRpb25cIixBaT1cIndlYmtpdFRyYW5zaXRpb25FbmRcIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihPaT1cIldlYmtpdEFuaW1hdGlvblwiLFNpPVwid2Via2l0QW5pbWF0aW9uRW5kXCIpKTt2YXIgVGk9ej93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOnNldFRpbWVvdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX07ZnVuY3Rpb24gRWkoZSl7VGkoZnVuY3Rpb24oKXtUaShlKX0pfWZ1bmN0aW9uIE5pKGUsdCl7dmFyIG49ZS5fdHJhbnNpdGlvbkNsYXNzZXN8fChlLl90cmFuc2l0aW9uQ2xhc3Nlcz1bXSk7bi5pbmRleE9mKHQpPDAmJihuLnB1c2godCksZ2koZSx0KSl9ZnVuY3Rpb24gamkoZSx0KXtlLl90cmFuc2l0aW9uQ2xhc3NlcyYmaChlLl90cmFuc2l0aW9uQ2xhc3Nlcyx0KSxfaShlLHQpfWZ1bmN0aW9uIERpKGUsdCxuKXt2YXIgcj1NaShlLHQpLGk9ci50eXBlLG89ci50aW1lb3V0LGE9ci5wcm9wQ291bnQ7aWYoIWkpcmV0dXJuIG4oKTt2YXIgcz1pPT09Q2k/QWk6U2ksYz0wLHU9ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIocyxsKSxuKCl9LGw9ZnVuY3Rpb24odCl7dC50YXJnZXQ9PT1lJiYrK2M+PWEmJnUoKX07c2V0VGltZW91dChmdW5jdGlvbigpe2M8YSYmdSgpfSxvKzEpLGUuYWRkRXZlbnRMaXN0ZW5lcihzLGwpfXZhciBMaT0vXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvO2Z1bmN0aW9uIE1pKGUsdCl7dmFyIG4scj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxpPShyW2tpK1wiRGVsYXlcIl18fFwiXCIpLnNwbGl0KFwiLCBcIiksbz0ocltraStcIkR1cmF0aW9uXCJdfHxcIlwiKS5zcGxpdChcIiwgXCIpLGE9SWkoaSxvKSxzPShyW09pK1wiRGVsYXlcIl18fFwiXCIpLnNwbGl0KFwiLCBcIiksYz0ocltPaStcIkR1cmF0aW9uXCJdfHxcIlwiKS5zcGxpdChcIiwgXCIpLHU9SWkocyxjKSxsPTAsZj0wO3JldHVybiB0PT09Q2k/YT4wJiYobj1DaSxsPWEsZj1vLmxlbmd0aCk6dD09PXhpP3U+MCYmKG49eGksbD11LGY9Yy5sZW5ndGgpOmY9KG49KGw9TWF0aC5tYXgoYSx1KSk+MD9hPnU/Q2k6eGk6bnVsbCk/bj09PUNpP28ubGVuZ3RoOmMubGVuZ3RoOjAse3R5cGU6bix0aW1lb3V0OmwscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOm49PT1DaSYmTGkudGVzdChyW2tpK1wiUHJvcGVydHlcIl0pfX1mdW5jdGlvbiBJaShlLHQpe2Zvcig7ZS5sZW5ndGg8dC5sZW5ndGg7KWU9ZS5jb25jYXQoZSk7cmV0dXJuIE1hdGgubWF4LmFwcGx5KG51bGwsdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gRmkodCkrRmkoZVtuXSl9KSl9ZnVuY3Rpb24gRmkoZSl7cmV0dXJuIDFlMypOdW1iZXIoZS5zbGljZSgwLC0xKS5yZXBsYWNlKFwiLFwiLFwiLlwiKSl9ZnVuY3Rpb24gUGkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2xlYXZlQ2IpJiYoaS5fbGVhdmVDYi5jYW5jZWxsZWQ9ITAsaS5fbGVhdmVDYigpKTt2YXIgYT1iaShlLmRhdGEudHJhbnNpdGlvbik7aWYoIXQoYSkmJiFuKGkuX2VudGVyQ2IpJiYxPT09aS5ub2RlVHlwZSl7Zm9yKHZhciBzPWEuY3NzLGM9YS50eXBlLHU9YS5lbnRlckNsYXNzLGw9YS5lbnRlclRvQ2xhc3MscD1hLmVudGVyQWN0aXZlQ2xhc3MsZD1hLmFwcGVhckNsYXNzLHY9YS5hcHBlYXJUb0NsYXNzLGg9YS5hcHBlYXJBY3RpdmVDbGFzcyxtPWEuYmVmb3JlRW50ZXIseT1hLmVudGVyLGc9YS5hZnRlckVudGVyLF89YS5lbnRlckNhbmNlbGxlZCxiPWEuYmVmb3JlQXBwZWFyLCQ9YS5hcHBlYXIsdz1hLmFmdGVyQXBwZWFyLEM9YS5hcHBlYXJDYW5jZWxsZWQseD1hLmR1cmF0aW9uLGs9V3QsQT1XdC4kdm5vZGU7QSYmQS5wYXJlbnQ7KWs9QS5jb250ZXh0LEE9QS5wYXJlbnQ7dmFyIE89IWsuX2lzTW91bnRlZHx8IWUuaXNSb290SW5zZXJ0O2lmKCFPfHwkfHxcIlwiPT09JCl7dmFyIFM9TyYmZD9kOnUsVD1PJiZoP2g6cCxFPU8mJnY/djpsLE49TyYmYnx8bSxqPU8mJlwiZnVuY3Rpb25cIj09dHlwZW9mICQ/JDp5LEw9TyYmd3x8ZyxNPU8mJkN8fF8sST1mKG8oeCk/eC5lbnRlcjp4KSxGPSExIT09cyYmIVcsUD1CaShqKSxSPWkuX2VudGVyQ2I9RChmdW5jdGlvbigpe0YmJihqaShpLEUpLGppKGksVCkpLFIuY2FuY2VsbGVkPyhGJiZqaShpLFMpLE0mJk0oaSkpOkwmJkwoaSksaS5fZW50ZXJDYj1udWxsfSk7ZS5kYXRhLnNob3d8fGl0KGUsXCJpbnNlcnRcIixmdW5jdGlvbigpe3ZhciB0PWkucGFyZW50Tm9kZSxuPXQmJnQuX3BlbmRpbmcmJnQuX3BlbmRpbmdbZS5rZXldO24mJm4udGFnPT09ZS50YWcmJm4uZWxtLl9sZWF2ZUNiJiZuLmVsbS5fbGVhdmVDYigpLGomJmooaSxSKX0pLE4mJk4oaSksRiYmKE5pKGksUyksTmkoaSxUKSxFaShmdW5jdGlvbigpe2ppKGksUyksUi5jYW5jZWxsZWR8fChOaShpLEUpLFB8fChIaShJKT9zZXRUaW1lb3V0KFIsSSk6RGkoaSxjLFIpKSl9KSksZS5kYXRhLnNob3cmJihyJiZyKCksaiYmaihpLFIpKSxGfHxQfHxSKCl9fX1mdW5jdGlvbiBSaShlLHIpe3ZhciBpPWUuZWxtO24oaS5fZW50ZXJDYikmJihpLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxpLl9lbnRlckNiKCkpO3ZhciBhPWJpKGUuZGF0YS50cmFuc2l0aW9uKTtpZih0KGEpfHwxIT09aS5ub2RlVHlwZSlyZXR1cm4gcigpO2lmKCFuKGkuX2xlYXZlQ2IpKXt2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEubGVhdmVDbGFzcyxsPWEubGVhdmVUb0NsYXNzLHA9YS5sZWF2ZUFjdGl2ZUNsYXNzLGQ9YS5iZWZvcmVMZWF2ZSx2PWEubGVhdmUsaD1hLmFmdGVyTGVhdmUsbT1hLmxlYXZlQ2FuY2VsbGVkLHk9YS5kZWxheUxlYXZlLGc9YS5kdXJhdGlvbixfPSExIT09cyYmIVcsYj1CaSh2KSwkPWYobyhnKT9nLmxlYXZlOmcpLHc9aS5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuX3BlbmRpbmcmJihpLnBhcmVudE5vZGUuX3BlbmRpbmdbZS5rZXldPW51bGwpLF8mJihqaShpLGwpLGppKGkscCkpLHcuY2FuY2VsbGVkPyhfJiZqaShpLHUpLG0mJm0oaSkpOihyKCksaCYmaChpKSksaS5fbGVhdmVDYj1udWxsfSk7eT95KEMpOkMoKX1mdW5jdGlvbiBDKCl7dy5jYW5jZWxsZWR8fCghZS5kYXRhLnNob3cmJmkucGFyZW50Tm9kZSYmKChpLnBhcmVudE5vZGUuX3BlbmRpbmd8fChpLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtlLmtleV09ZSksZCYmZChpKSxfJiYoTmkoaSx1KSxOaShpLHApLEVpKGZ1bmN0aW9uKCl7amkoaSx1KSx3LmNhbmNlbGxlZHx8KE5pKGksbCksYnx8KEhpKCQpP3NldFRpbWVvdXQodywkKTpEaShpLGMsdykpKX0pKSx2JiZ2KGksdyksX3x8Ynx8dygpKX19ZnVuY3Rpb24gSGkoZSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGUmJiFpc05hTihlKX1mdW5jdGlvbiBCaShlKXtpZih0KGUpKXJldHVybiExO3ZhciByPWUuZm5zO3JldHVybiBuKHIpP0JpKEFycmF5LmlzQXJyYXkocik/clswXTpyKTooZS5fbGVuZ3RofHxlLmxlbmd0aCk+MX1mdW5jdGlvbiBVaShlLHQpeyEwIT09dC5kYXRhLnNob3cmJlBpKHQpfXZhciB6aT1mdW5jdGlvbihlKXt2YXIgbyxhLHM9e30sYz1lLm1vZHVsZXMsdT1lLm5vZGVPcHM7Zm9yKG89MDtvPHJyLmxlbmd0aDsrK28pZm9yKHNbcnJbb11dPVtdLGE9MDthPGMubGVuZ3RoOysrYSluKGNbYV1bcnJbb11dKSYmc1tycltvXV0ucHVzaChjW2FdW3JyW29dXSk7ZnVuY3Rpb24gbChlKXt2YXIgdD11LnBhcmVudE5vZGUoZSk7bih0KSYmdS5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGYoZSx0LGksbyxhLGMsbCl7aWYobihlLmVsbSkmJm4oYykmJihlPWNbbF09bWUoZSkpLGUuaXNSb290SW5zZXJ0PSFhLCFmdW5jdGlvbihlLHQsaSxvKXt2YXIgYT1lLmRhdGE7aWYobihhKSl7dmFyIGM9bihlLmNvbXBvbmVudEluc3RhbmNlKSYmYS5rZWVwQWxpdmU7aWYobihhPWEuaG9vaykmJm4oYT1hLmluaXQpJiZhKGUsITEpLG4oZS5jb21wb25lbnRJbnN0YW5jZSkpcmV0dXJuIGQoZSx0KSx2KGksZS5lbG0sbykscihjKSYmZnVuY3Rpb24oZSx0LHIsaSl7Zm9yKHZhciBvLGE9ZTthLmNvbXBvbmVudEluc3RhbmNlOylpZihhPWEuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLG4obz1hLmRhdGEpJiZuKG89by50cmFuc2l0aW9uKSl7Zm9yKG89MDtvPHMuYWN0aXZhdGUubGVuZ3RoOysrbylzLmFjdGl2YXRlW29dKG5yLGEpO3QucHVzaChhKTticmVha312KHIsZS5lbG0saSl9KGUsdCxpLG8pLCEwfX0oZSx0LGksbykpe3ZhciBmPWUuZGF0YSxwPWUuY2hpbGRyZW4sbT1lLnRhZztuKG0pPyhlLmVsbT1lLm5zP3UuY3JlYXRlRWxlbWVudE5TKGUubnMsbSk6dS5jcmVhdGVFbGVtZW50KG0sZSksZyhlKSxoKGUscCx0KSxuKGYpJiZ5KGUsdCksdihpLGUuZWxtLG8pKTpyKGUuaXNDb21tZW50KT8oZS5lbG09dS5jcmVhdGVDb21tZW50KGUudGV4dCksdihpLGUuZWxtLG8pKTooZS5lbG09dS5jcmVhdGVUZXh0Tm9kZShlLnRleHQpLHYoaSxlLmVsbSxvKSl9fWZ1bmN0aW9uIGQoZSx0KXtuKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCxtKGUpPyh5KGUsdCksZyhlKSk6KHRyKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gdihlLHQscil7bihlKSYmKG4ocik/dS5wYXJlbnROb2RlKHIpPT09ZSYmdS5pbnNlcnRCZWZvcmUoZSx0LHIpOnUuYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcilmKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSBpKGUudGV4dCkmJnUuYXBwZW5kQ2hpbGQoZS5lbG0sdS5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIG0oZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBuKGUudGFnKX1mdW5jdGlvbiB5KGUsdCl7Zm9yKHZhciByPTA7cjxzLmNyZWF0ZS5sZW5ndGg7KytyKXMuY3JlYXRlW3JdKG5yLGUpO24obz1lLmRhdGEuaG9vaykmJihuKG8uY3JlYXRlKSYmby5jcmVhdGUobnIsZSksbihvLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZyhlKXt2YXIgdDtpZihuKHQ9ZS5mblNjb3BlSWQpKXUuc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgcj1lO3I7KW4odD1yLmNvbnRleHQpJiZuKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJnUuc2V0U3R5bGVTY29wZShlLmVsbSx0KSxyPXIucGFyZW50O24odD1XdCkmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmbih0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZ1LnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gXyhlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrcilmKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiBiKGUpe3ZhciB0LHIsaT1lLmRhdGE7aWYobihpKSlmb3Iobih0PWkuaG9vaykmJm4odD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PHMuZGVzdHJveS5sZW5ndGg7Kyt0KXMuZGVzdHJveVt0XShlKTtpZihuKHQ9ZS5jaGlsZHJlbikpZm9yKHI9MDtyPGUuY2hpbGRyZW4ubGVuZ3RoOysrciliKGUuY2hpbGRyZW5bcl0pfWZ1bmN0aW9uICQoZSx0LHIpe2Zvcig7dDw9cjsrK3Qpe3ZhciBpPWVbdF07bihpKSYmKG4oaS50YWcpPyh3KGkpLGIoaSkpOmwoaS5lbG0pKX19ZnVuY3Rpb24gdyhlLHQpe2lmKG4odCl8fG4oZS5kYXRhKSl7dmFyIHIsaT1zLnJlbW92ZS5sZW5ndGgrMTtmb3Iobih0KT90Lmxpc3RlbmVycys9aTp0PWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpezA9PS0tbi5saXN0ZW5lcnMmJmwoZSl9cmV0dXJuIG4ubGlzdGVuZXJzPXQsbn0oZS5lbG0saSksbihyPWUuY29tcG9uZW50SW5zdGFuY2UpJiZuKHI9ci5fdm5vZGUpJiZuKHIuZGF0YSkmJncocix0KSxyPTA7cjxzLnJlbW92ZS5sZW5ndGg7KytyKXMucmVtb3ZlW3JdKGUsdCk7bihyPWUuZGF0YS5ob29rKSYmbihyPXIucmVtb3ZlKT9yKGUsdCk6dCgpfWVsc2UgbChlLmVsbSl9ZnVuY3Rpb24gQyhlLHQscixpKXtmb3IodmFyIG89cjtvPGk7bysrKXt2YXIgYT10W29dO2lmKG4oYSkmJmlyKGUsYSkpcmV0dXJuIG99fWZ1bmN0aW9uIHgoZSxpLG8sYSxjLGwpe2lmKGUhPT1pKXtuKGkuZWxtKSYmbihhKSYmKGk9YVtjXT1tZShpKSk7dmFyIHA9aS5lbG09ZS5lbG07aWYocihlLmlzQXN5bmNQbGFjZWhvbGRlcikpbihpLmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TyhlLmVsbSxpLG8pOmkuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYocihpLmlzU3RhdGljKSYmcihlLmlzU3RhdGljKSYmaS5rZXk9PT1lLmtleSYmKHIoaS5pc0Nsb25lZCl8fHIoaS5pc09uY2UpKSlpLmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgZCx2PWkuZGF0YTtuKHYpJiZuKGQ9di5ob29rKSYmbihkPWQucHJlcGF0Y2gpJiZkKGUsaSk7dmFyIGg9ZS5jaGlsZHJlbix5PWkuY2hpbGRyZW47aWYobih2KSYmbShpKSl7Zm9yKGQ9MDtkPHMudXBkYXRlLmxlbmd0aDsrK2Qpcy51cGRhdGVbZF0oZSxpKTtuKGQ9di5ob29rKSYmbihkPWQudXBkYXRlKSYmZChlLGkpfXQoaS50ZXh0KT9uKGgpJiZuKHkpP2ghPT15JiZmdW5jdGlvbihlLHIsaSxvLGEpe2Zvcih2YXIgcyxjLGwscD0wLGQ9MCx2PXIubGVuZ3RoLTEsaD1yWzBdLG09clt2XSx5PWkubGVuZ3RoLTEsZz1pWzBdLGI9aVt5XSx3PSFhO3A8PXYmJmQ8PXk7KXQoaCk/aD1yWysrcF06dChtKT9tPXJbLS12XTppcihoLGcpPyh4KGgsZyxvLGksZCksaD1yWysrcF0sZz1pWysrZF0pOmlyKG0sYik/KHgobSxiLG8saSx5KSxtPXJbLS12XSxiPWlbLS15XSk6aXIoaCxiKT8oeChoLGIsbyxpLHkpLHcmJnUuaW5zZXJ0QmVmb3JlKGUsaC5lbG0sdS5uZXh0U2libGluZyhtLmVsbSkpLGg9clsrK3BdLGI9aVstLXldKTppcihtLGcpPyh4KG0sZyxvLGksZCksdyYmdS5pbnNlcnRCZWZvcmUoZSxtLmVsbSxoLmVsbSksbT1yWy0tdl0sZz1pWysrZF0pOih0KHMpJiYocz1vcihyLHAsdikpLHQoYz1uKGcua2V5KT9zW2cua2V5XTpDKGcscixwLHYpKT9mKGcsbyxlLGguZWxtLCExLGksZCk6aXIobD1yW2NdLGcpPyh4KGwsZyxvLGksZCkscltjXT12b2lkIDAsdyYmdS5pbnNlcnRCZWZvcmUoZSxsLmVsbSxoLmVsbSkpOmYoZyxvLGUsaC5lbG0sITEsaSxkKSxnPWlbKytkXSk7cD52P18oZSx0KGlbeSsxXSk/bnVsbDppW3krMV0uZWxtLGksZCx5LG8pOmQ+eSYmJChyLHAsdil9KHAsaCx5LG8sbCk6bih5KT8obihlLnRleHQpJiZ1LnNldFRleHRDb250ZW50KHAsXCJcIiksXyhwLG51bGwseSwwLHkubGVuZ3RoLTEsbykpOm4oaCk/JChoLDAsaC5sZW5ndGgtMSk6bihlLnRleHQpJiZ1LnNldFRleHRDb250ZW50KHAsXCJcIik6ZS50ZXh0IT09aS50ZXh0JiZ1LnNldFRleHRDb250ZW50KHAsaS50ZXh0KSxuKHYpJiZuKGQ9di5ob29rKSYmbihkPWQucG9zdHBhdGNoKSYmZChlLGkpfX19ZnVuY3Rpb24gayhlLHQsaSl7aWYocihpKSYmbihlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIG89MDtvPHQubGVuZ3RoOysrbyl0W29dLmRhdGEuaG9vay5pbnNlcnQodFtvXSl9dmFyIEE9cChcImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleVwiKTtmdW5jdGlvbiBPKGUsdCxpLG8pe3ZhciBhLHM9dC50YWcsYz10LmRhdGEsdT10LmNoaWxkcmVuO2lmKG89b3x8YyYmYy5wcmUsdC5lbG09ZSxyKHQuaXNDb21tZW50KSYmbih0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwLCEwO2lmKG4oYykmJihuKGE9Yy5ob29rKSYmbihhPWEuaW5pdCkmJmEodCwhMCksbihhPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gZCh0LGkpLCEwO2lmKG4ocykpe2lmKG4odSkpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYobihhPWMpJiZuKGE9YS5kb21Qcm9wcykmJm4oYT1hLmlubmVySFRNTCkpe2lmKGEhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgbD0hMCxmPWUuZmlyc3RDaGlsZCxwPTA7cDx1Lmxlbmd0aDtwKyspe2lmKCFmfHwhTyhmLHVbcF0saSxvKSl7bD0hMTticmVha31mPWYubmV4dFNpYmxpbmd9aWYoIWx8fGYpcmV0dXJuITF9ZWxzZSBoKHQsdSxpKTtpZihuKGMpKXt2YXIgdj0hMTtmb3IodmFyIG0gaW4gYylpZighQShtKSl7dj0hMCx5KHQsaSk7YnJlYWt9IXYmJmMuY2xhc3MmJmV0KGMuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLGksbyxhKXtpZighdChpKSl7dmFyIGMsbD0hMSxwPVtdO2lmKHQoZSkpbD0hMCxmKGkscCk7ZWxzZXt2YXIgZD1uKGUubm9kZVR5cGUpO2lmKCFkJiZpcihlLGkpKXgoZSxpLHAsbnVsbCxudWxsLGEpO2Vsc2V7aWYoZCl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEwpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTCksbz0hMCkscihvKSYmTyhlLGkscCkpcmV0dXJuIGsoaSxwLCEwKSxlO2M9ZSxlPW5ldyBwZSh1LnRhZ05hbWUoYykudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsYyl9dmFyIHY9ZS5lbG0saD11LnBhcmVudE5vZGUodik7aWYoZihpLHAsdi5fbGVhdmVDYj9udWxsOmgsdS5uZXh0U2libGluZyh2KSksbihpLnBhcmVudCkpZm9yKHZhciB5PWkucGFyZW50LGc9bShpKTt5Oyl7Zm9yKHZhciBfPTA7XzxzLmRlc3Ryb3kubGVuZ3RoOysrXylzLmRlc3Ryb3lbX10oeSk7aWYoeS5lbG09aS5lbG0sZyl7Zm9yKHZhciB3PTA7dzxzLmNyZWF0ZS5sZW5ndGg7Kyt3KXMuY3JlYXRlW3ddKG5yLHkpO3ZhciBDPXkuZGF0YS5ob29rLmluc2VydDtpZihDLm1lcmdlZClmb3IodmFyIEE9MTtBPEMuZm5zLmxlbmd0aDtBKyspQy5mbnNbQV0oKX1lbHNlIHRyKHkpO3k9eS5wYXJlbnR9bihoKT8kKFtlXSwwLDApOm4oZS50YWcpJiZiKGUpfX1yZXR1cm4gayhpLHAsbCksaS5lbG19bihlKSYmYihlKX19KHtub2RlT3BzOlFuLG1vZHVsZXM6W21yLHhyLG5pLG9pLG1pLHo/e2NyZWF0ZTpVaSxhY3RpdmF0ZTpVaSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXshMCE9PWUuZGF0YS5zaG93P1JpKGUsdCk6dCgpfX06e31dLmNvbmNhdChwcil9KTtXJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2UmJmUudm1vZGVsJiZYaShlLFwiaW5wdXRcIil9KTt2YXIgVmk9e2luc2VydGVkOmZ1bmN0aW9uKGUsdCxuLHIpe1wic2VsZWN0XCI9PT1uLnRhZz8oci5lbG0mJiFyLmVsbS5fdk9wdGlvbnM/aXQobixcInBvc3RwYXRjaFwiLGZ1bmN0aW9uKCl7VmkuY29tcG9uZW50VXBkYXRlZChlLHQsbil9KTpLaShlLHQsbi5jb250ZXh0KSxlLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpKTooXCJ0ZXh0YXJlYVwiPT09bi50YWd8fFhuKGUudHlwZSkpJiYoZS5fdk1vZGlmaWVycz10Lm1vZGlmaWVycyx0Lm1vZGlmaWVycy5sYXp5fHwoZS5hZGRFdmVudExpc3RlbmVyKFwiY29tcG9zaXRpb25zdGFydFwiLFppKSxlLmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbmVuZFwiLEdpKSxlLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIixHaSksVyYmKGUudm1vZGVsPSEwKSkpfSxjb21wb25lbnRVcGRhdGVkOmZ1bmN0aW9uKGUsdCxuKXtpZihcInNlbGVjdFwiPT09bi50YWcpe0tpKGUsdCxuLmNvbnRleHQpO3ZhciByPWUuX3ZPcHRpb25zLGk9ZS5fdk9wdGlvbnM9W10ubWFwLmNhbGwoZS5vcHRpb25zLFdpKTtpZihpLnNvbWUoZnVuY3Rpb24oZSx0KXtyZXR1cm4hTihlLHJbdF0pfSkpKGUubXVsdGlwbGU/dC52YWx1ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBxaShlLGkpfSk6dC52YWx1ZSE9PXQub2xkVmFsdWUmJnFpKHQudmFsdWUsaSkpJiZYaShlLFwiY2hhbmdlXCIpfX19O2Z1bmN0aW9uIEtpKGUsdCxuKXtKaShlLHQsbiksKHF8fFopJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SmkoZSx0LG4pfSwwKX1mdW5jdGlvbiBKaShlLHQsbil7dmFyIHI9dC52YWx1ZSxpPWUubXVsdGlwbGU7aWYoIWl8fEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgbyxhLHM9MCxjPWUub3B0aW9ucy5sZW5ndGg7czxjO3MrKylpZihhPWUub3B0aW9uc1tzXSxpKW89aihyLFdpKGEpKT4tMSxhLnNlbGVjdGVkIT09byYmKGEuc2VsZWN0ZWQ9byk7ZWxzZSBpZihOKFdpKGEpLHIpKXJldHVybiB2b2lkKGUuc2VsZWN0ZWRJbmRleCE9PXMmJihlLnNlbGVjdGVkSW5kZXg9cykpO2l8fChlLnNlbGVjdGVkSW5kZXg9LTEpfX1mdW5jdGlvbiBxaShlLHQpe3JldHVybiB0LmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiFOKHQsZSl9KX1mdW5jdGlvbiBXaShlKXtyZXR1cm5cIl92YWx1ZVwiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIFppKGUpe2UudGFyZ2V0LmNvbXBvc2luZz0hMH1mdW5jdGlvbiBHaShlKXtlLnRhcmdldC5jb21wb3NpbmcmJihlLnRhcmdldC5jb21wb3Npbmc9ITEsWGkoZS50YXJnZXQsXCJpbnB1dFwiKSl9ZnVuY3Rpb24gWGkoZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFdmVudChcIkhUTUxFdmVudHNcIik7bi5pbml0RXZlbnQodCwhMCwhMCksZS5kaXNwYXRjaEV2ZW50KG4pfWZ1bmN0aW9uIFlpKGUpe3JldHVybiFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmRhdGEmJmUuZGF0YS50cmFuc2l0aW9uP2U6WWkoZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpfXZhciBRaT17bW9kZWw6Vmksc2hvdzp7YmluZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZSxpPShuPVlpKG4pKS5kYXRhJiZuLmRhdGEudHJhbnNpdGlvbixvPWUuX192T3JpZ2luYWxEaXNwbGF5PVwibm9uZVwiPT09ZS5zdHlsZS5kaXNwbGF5P1wiXCI6ZS5zdHlsZS5kaXNwbGF5O3ImJmk/KG4uZGF0YS5zaG93PSEwLFBpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9b30pKTplLnN0eWxlLmRpc3BsYXk9cj9vOlwibm9uZVwifSx1cGRhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQudmFsdWU7IXIhPSF0Lm9sZFZhbHVlJiYoKG49WWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uPyhuLmRhdGEuc2hvdz0hMCxyP1BpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXl9KTpSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwifSkpOmUuc3R5bGUuZGlzcGxheT1yP2UuX192T3JpZ2luYWxEaXNwbGF5Olwibm9uZVwiKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCxuLHIsaSl7aXx8KGUuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheSl9fX0sZW89e25hbWU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLGNzczpCb29sZWFuLG1vZGU6U3RyaW5nLHR5cGU6U3RyaW5nLGVudGVyQ2xhc3M6U3RyaW5nLGxlYXZlQ2xhc3M6U3RyaW5nLGVudGVyVG9DbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJDbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGR1cmF0aW9uOltOdW1iZXIsU3RyaW5nLE9iamVjdF19O2Z1bmN0aW9uIHRvKGUpe3ZhciB0PWUmJmUuY29tcG9uZW50T3B0aW9ucztyZXR1cm4gdCYmdC5DdG9yLm9wdGlvbnMuYWJzdHJhY3Q/dG8oenQodC5jaGlsZHJlbikpOmV9ZnVuY3Rpb24gbm8oZSl7dmFyIHQ9e30sbj1lLiRvcHRpb25zO2Zvcih2YXIgciBpbiBuLnByb3BzRGF0YSl0W3JdPWVbcl07dmFyIGk9bi5fcGFyZW50TGlzdGVuZXJzO2Zvcih2YXIgbyBpbiBpKXRbYihvKV09aVtvXTtyZXR1cm4gdH1mdW5jdGlvbiBybyhlLHQpe2lmKC9cXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKFwia2VlcC1hbGl2ZVwiLHtwcm9wczp0LmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhfSl9dmFyIGlvPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ3x8VXQoZSl9LG9vPWZ1bmN0aW9uKGUpe3JldHVyblwic2hvd1wiPT09ZS5uYW1lfSxhbz17bmFtZTpcInRyYW5zaXRpb25cIixwcm9wczplbyxhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIoaW8pKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxvPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBvO3ZhciBhPXRvKG8pO2lmKCFhKXJldHVybiBvO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIHJvKGUsbyk7dmFyIHM9XCJfX3RyYW5zaXRpb24tXCIrdGhpcy5fdWlkK1wiLVwiO2Eua2V5PW51bGw9PWEua2V5P2EuaXNDb21tZW50P3MrXCJjb21tZW50XCI6cythLnRhZzppKGEua2V5KT8wPT09U3RyaW5nKGEua2V5KS5pbmRleE9mKHMpP2Eua2V5OnMrYS5rZXk6YS5rZXk7dmFyIGM9KGEuZGF0YXx8KGEuZGF0YT17fSkpLnRyYW5zaXRpb249bm8odGhpcyksdT10aGlzLl92bm9kZSxsPXRvKHUpO2lmKGEuZGF0YS5kaXJlY3RpdmVzJiZhLmRhdGEuZGlyZWN0aXZlcy5zb21lKG9vKSYmKGEuZGF0YS5zaG93PSEwKSxsJiZsLmRhdGEmJiFmdW5jdGlvbihlLHQpe3JldHVybiB0LmtleT09PWUua2V5JiZ0LnRhZz09PWUudGFnfShhLGwpJiYhVXQobCkmJighbC5jb21wb25lbnRJbnN0YW5jZXx8IWwuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkpe3ZhciBmPWwuZGF0YS50cmFuc2l0aW9uPUEoe30sYyk7aWYoXCJvdXQtaW5cIj09PXIpcmV0dXJuIHRoaXMuX2xlYXZpbmc9ITAsaXQoZixcImFmdGVyTGVhdmVcIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLHJvKGUsbyk7aWYoXCJpbi1vdXRcIj09PXIpe2lmKFV0KGEpKXJldHVybiB1O3ZhciBwLGQ9ZnVuY3Rpb24oKXtwKCl9O2l0KGMsXCJhZnRlckVudGVyXCIsZCksaXQoYyxcImVudGVyQ2FuY2VsbGVkXCIsZCksaXQoZixcImRlbGF5TGVhdmVcIixmdW5jdGlvbihlKXtwPWV9KX19cmV0dXJuIG99fX0sc289QSh7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSxlbyk7ZnVuY3Rpb24gY28oZSl7ZS5lbG0uX21vdmVDYiYmZS5lbG0uX21vdmVDYigpLGUuZWxtLl9lbnRlckNiJiZlLmVsbS5fZW50ZXJDYigpfWZ1bmN0aW9uIHVvKGUpe2UuZGF0YS5uZXdQb3M9ZS5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZnVuY3Rpb24gbG8oZSl7dmFyIHQ9ZS5kYXRhLnBvcyxuPWUuZGF0YS5uZXdQb3Mscj10LmxlZnQtbi5sZWZ0LGk9dC50b3Atbi50b3A7aWYocnx8aSl7ZS5kYXRhLm1vdmVkPSEwO3ZhciBvPWUuZWxtLnN0eWxlO28udHJhbnNmb3JtPW8uV2Via2l0VHJhbnNmb3JtPVwidHJhbnNsYXRlKFwiK3IrXCJweCxcIitpK1wicHgpXCIsby50cmFuc2l0aW9uRHVyYXRpb249XCIwc1wifX1kZWxldGUgc28ubW9kZTt2YXIgZm89e1RyYW5zaXRpb246YW8sVHJhbnNpdGlvbkdyb3VwOntwcm9wczpzbyxiZWZvcmVNb3VudDpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLl91cGRhdGU7dGhpcy5fdXBkYXRlPWZ1bmN0aW9uKG4scil7dmFyIGk9WnQoZSk7ZS5fX3BhdGNoX18oZS5fdm5vZGUsZS5rZXB0LCExLCEwKSxlLl92bm9kZT1lLmtlcHQsaSgpLHQuY2FsbChlLG4scil9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudGFnfHx0aGlzLiR2bm9kZS5kYXRhLnRhZ3x8XCJzcGFuXCIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPW5vKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoXCJfX3ZsaXN0XCIpJiYoby5wdXNoKGMpLG5bYy5rZXldPWMsKGMuZGF0YXx8KGMuZGF0YT17fSkpLnRyYW5zaXRpb249YSl9aWYocil7Zm9yKHZhciB1PVtdLGw9W10sZj0wO2Y8ci5sZW5ndGg7ZisrKXt2YXIgcD1yW2ZdO3AuZGF0YS50cmFuc2l0aW9uPWEscC5kYXRhLnBvcz1wLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuW3Aua2V5XT91LnB1c2gocCk6bC5wdXNoKHApfXRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByZXZDaGlsZHJlbix0PXRoaXMubW92ZUNsYXNzfHwodGhpcy5uYW1lfHxcInZcIikrXCItbW92ZVwiO2UubGVuZ3RoJiZ0aGlzLmhhc01vdmUoZVswXS5lbG0sdCkmJihlLmZvckVhY2goY28pLGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSx0aGlzLl9yZWZsb3c9ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZGF0YS5tb3ZlZCl7dmFyIG49ZS5lbG0scj1uLnN0eWxlO05pKG4sdCksci50cmFuc2Zvcm09ci5XZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249XCJcIixuLmFkZEV2ZW50TGlzdGVuZXIoQWksbi5fbW92ZUNiPWZ1bmN0aW9uIGUocil7ciYmci50YXJnZXQhPT1ufHxyJiYhL3RyYW5zZm9ybSQvLnRlc3Qoci5wcm9wZXJ0eU5hbWUpfHwobi5yZW1vdmVFdmVudExpc3RlbmVyKEFpLGUpLG4uX21vdmVDYj1udWxsLGppKG4sdCkpfSl9fSkpfSxtZXRob2RzOntoYXNNb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoIXdpKXJldHVybiExO2lmKHRoaXMuX2hhc01vdmUpcmV0dXJuIHRoaXMuX2hhc01vdmU7dmFyIG49ZS5jbG9uZU5vZGUoKTtlLl90cmFuc2l0aW9uQ2xhc3NlcyYmZS5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXtfaShuLGUpfSksZ2kobix0KSxuLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsdGhpcy4kZWwuYXBwZW5kQ2hpbGQobik7dmFyIHI9TWkobik7cmV0dXJuIHRoaXMuJGVsLnJlbW92ZUNoaWxkKG4pLHRoaXMuX2hhc01vdmU9ci5oYXNUcmFuc2Zvcm19fX19O3duLmNvbmZpZy5tdXN0VXNlUHJvcD1qbix3bi5jb25maWcuaXNSZXNlcnZlZFRhZz1Xbix3bi5jb25maWcuaXNSZXNlcnZlZEF0dHI9RW4sd24uY29uZmlnLmdldFRhZ05hbWVzcGFjZT1abix3bi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbihlKXtpZigheilyZXR1cm4hMDtpZihXbihlKSlyZXR1cm4hMTtpZihlPWUudG9Mb3dlckNhc2UoKSxudWxsIT1HbltlXSlyZXR1cm4gR25bZV07dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4gZS5pbmRleE9mKFwiLVwiKT4tMT9HbltlXT10LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxVbmtub3duRWxlbWVudHx8dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MRWxlbWVudDpHbltlXT0vSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KHQudG9TdHJpbmcoKSl9LEEod24ub3B0aW9ucy5kaXJlY3RpdmVzLFFpKSxBKHduLm9wdGlvbnMuY29tcG9uZW50cyxmbyksd24ucHJvdG90eXBlLl9fcGF0Y2hfXz16P3ppOlMsd24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGUuJGVsPXQsZS4kb3B0aW9ucy5yZW5kZXJ8fChlLiRvcHRpb25zLnJlbmRlcj12ZSksWXQoZSxcImJlZm9yZU1vdW50XCIpLHI9ZnVuY3Rpb24oKXtlLl91cGRhdGUoZS5fcmVuZGVyKCksbil9LG5ldyBmbihlLHIsUyx7YmVmb3JlOmZ1bmN0aW9uKCl7ZS5faXNNb3VudGVkJiYhZS5faXNEZXN0cm95ZWQmJll0KGUsXCJiZWZvcmVVcGRhdGVcIil9fSwhMCksbj0hMSxudWxsPT1lLiR2bm9kZSYmKGUuX2lzTW91bnRlZD0hMCxZdChlLFwibW91bnRlZFwiKSksZX0odGhpcyxlPWUmJno/WW4oZSk6dm9pZCAwLHQpfSx6JiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ri5kZXZ0b29scyYmbmUmJm5lLmVtaXQoXCJpbml0XCIsd24pfSwwKTt2YXIgcG89L1xce1xceygoPzoufFxccj9cXG4pKz8pXFx9XFx9L2csdm89L1stLiorP14ke30oKXxbXFxdXFwvXFxcXF0vZyxobz1nKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0ucmVwbGFjZSh2byxcIlxcXFwkJlwiKSxuPWVbMV0ucmVwbGFjZSh2byxcIlxcXFwkJlwiKTtyZXR1cm4gbmV3IFJlZ0V4cCh0K1wiKCg/Oi58XFxcXG4pKz8pXCIrbixcImdcIil9KTt2YXIgbW89e3N0YXRpY0tleXM6W1wic3RhdGljQ2xhc3NcIl0sdHJhbnNmb3JtTm9kZTpmdW5jdGlvbihlLHQpe3Qud2Fybjt2YXIgbj1GcihlLFwiY2xhc3NcIik7biYmKGUuc3RhdGljQ2xhc3M9SlNPTi5zdHJpbmdpZnkobikpO3ZhciByPUlyKGUsXCJjbGFzc1wiLCExKTtyJiYoZS5jbGFzc0JpbmRpbmc9cil9LGdlbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIjtyZXR1cm4gZS5zdGF0aWNDbGFzcyYmKHQrPVwic3RhdGljQ2xhc3M6XCIrZS5zdGF0aWNDbGFzcytcIixcIiksZS5jbGFzc0JpbmRpbmcmJih0Kz1cImNsYXNzOlwiK2UuY2xhc3NCaW5kaW5nK1wiLFwiKSx0fX07dmFyIHlvLGdvPXtzdGF0aWNLZXlzOltcInN0YXRpY1N0eWxlXCJdLHRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXt0Lndhcm47dmFyIG49RnIoZSxcInN0eWxlXCIpO24mJihlLnN0YXRpY1N0eWxlPUpTT04uc3RyaW5naWZ5KGFpKG4pKSk7dmFyIHI9SXIoZSxcInN0eWxlXCIsITEpO3ImJihlLnN0eWxlQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1cIlwiO3JldHVybiBlLnN0YXRpY1N0eWxlJiYodCs9XCJzdGF0aWNTdHlsZTpcIitlLnN0YXRpY1N0eWxlK1wiLFwiKSxlLnN0eWxlQmluZGluZyYmKHQrPVwic3R5bGU6KFwiK2Uuc3R5bGVCaW5kaW5nK1wiKSxcIiksdH19LF9vPWZ1bmN0aW9uKGUpe3JldHVybih5bz15b3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuaW5uZXJIVE1MPWUseW8udGV4dENvbnRlbnR9LGJvPXAoXCJhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGZyYW1lLGhyLGltZyxpbnB1dCxpc2luZGV4LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdiclwiKSwkbz1wKFwiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZVwiKSx3bz1wKFwiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLGRldGFpbHMsZGlhbG9nLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxoMSxoMixoMyxoNCxoNSxoNixoZWFkLGhlYWRlcixoZ3JvdXAsaHIsaHRtbCxsZWdlbmQsbGksbWVudWl0ZW0sbWV0YSxvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdGl0bGUsdHIsdHJhY2tcIiksQ289L15cXHMqKFteXFxzXCInPD5cXC89XSspKD86XFxzKig9KVxccyooPzpcIihbXlwiXSopXCIrfCcoW14nXSopJyt8KFteXFxzXCInPTw+YF0rKSkpPy8seG89L15cXHMqKCg/OnYtW1xcdy1dKzp8QHw6fCMpXFxbW149XStcXF1bXlxcc1wiJzw+XFwvPV0qKSg/OlxccyooPSlcXHMqKD86XCIoW15cIl0qKVwiK3wnKFteJ10qKScrfChbXlxcc1wiJz08PmBdKykpKT8vLGtvPVwiW2EtekEtWl9dW1xcXFwtXFxcXC4wLTlfYS16QS1aXCIrUC5zb3VyY2UrXCJdKlwiLEFvPVwiKCg/OlwiK2tvK1wiXFxcXDopP1wiK2tvK1wiKVwiLE9vPW5ldyBSZWdFeHAoXCJePFwiK0FvKSxTbz0vXlxccyooXFwvPyk+LyxUbz1uZXcgUmVnRXhwKFwiXjxcXFxcL1wiK0FvK1wiW14+XSo+XCIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLE5vPS9ePCFcXC0tLyxqbz0vXjwhXFxbLyxEbz1wKFwic2NyaXB0LHN0eWxlLHRleHRhcmVhXCIsITApLExvPXt9LE1vPXtcIiZsdDtcIjpcIjxcIixcIiZndDtcIjpcIj5cIixcIiZxdW90O1wiOidcIicsXCImYW1wO1wiOlwiJlwiLFwiJiMxMDtcIjpcIlxcblwiLFwiJiM5O1wiOlwiXFx0XCIsXCImIzM5O1wiOlwiJ1wifSxJbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csRm89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxQbz1wKFwicHJlLHRleHRhcmVhXCIsITApLFJvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJlBvKGUpJiZcIlxcblwiPT09dFswXX07ZnVuY3Rpb24gSG8oZSx0KXt2YXIgbj10P0ZvOklvO3JldHVybiBlLnJlcGxhY2UobixmdW5jdGlvbihlKXtyZXR1cm4gTW9bZV19KX12YXIgQm8sVW8sem8sVm8sS28sSm8scW8sV28sWm89L15AfF52LW9uOi8sR289L152LXxeQHxeOnxeIy8sWG89LyhbXFxzXFxTXSo/KVxccysoPzppbnxvZilcXHMrKFtcXHNcXFNdKikvLFlvPS8sKFteLFxcfVxcXV0qKSg/OiwoW14sXFx9XFxdXSopKT8kLyxRbz0vXlxcKHxcXCkkL2csZWE9L15cXFsuKlxcXSQvLHRhPS86KC4qKSQvLG5hPS9eOnxeXFwufF52LWJpbmQ6LyxyYT0vXFwuW14uXFxdXSsoPz1bXlxcXV0qJCkvZyxpYT0vXnYtc2xvdCg6fCQpfF4jLyxvYT0vW1xcclxcbl0vLGFhPS9cXHMrL2csc2E9ZyhfbyksY2E9XCJfZW1wdHlfXCI7ZnVuY3Rpb24gdWEoZSx0LG4pe3JldHVybnt0eXBlOjEsdGFnOmUsYXR0cnNMaXN0OnQsYXR0cnNNYXA6bWEodCkscmF3QXR0cnNNYXA6e30scGFyZW50Om4sY2hpbGRyZW46W119fWZ1bmN0aW9uIGxhKGUsdCl7Qm89dC53YXJufHxTcixKbz10LmlzUHJlVGFnfHxULHFvPXQubXVzdFVzZVByb3B8fFQsV289dC5nZXRUYWdOYW1lc3BhY2V8fFQ7dC5pc1Jlc2VydmVkVGFnO3pvPVRyKHQubW9kdWxlcyxcInRyYW5zZm9ybU5vZGVcIiksVm89VHIodC5tb2R1bGVzLFwicHJlVHJhbnNmb3JtTm9kZVwiKSxLbz1Ucih0Lm1vZHVsZXMsXCJwb3N0VHJhbnNmb3JtTm9kZVwiKSxVbz10LmRlbGltaXRlcnM7dmFyIG4scixpPVtdLG89ITEhPT10LnByZXNlcnZlV2hpdGVzcGFjZSxhPXQud2hpdGVzcGFjZSxzPSExLGM9ITE7ZnVuY3Rpb24gdShlKXtpZihsKGUpLHN8fGUucHJvY2Vzc2VkfHwoZT1mYShlLHQpKSxpLmxlbmd0aHx8ZT09PW58fG4uaWYmJihlLmVsc2VpZnx8ZS5lbHNlKSYmZGEobix7ZXhwOmUuZWxzZWlmLGJsb2NrOmV9KSxyJiYhZS5mb3JiaWRkZW4paWYoZS5lbHNlaWZ8fGUuZWxzZSlhPWUsKHU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXtpZigxPT09ZVt0XS50eXBlKXJldHVybiBlW3RdO2UucG9wKCl9fShyLmNoaWxkcmVuKSkmJnUuaWYmJmRhKHUse2V4cDphLmVsc2VpZixibG9jazphfSk7ZWxzZXtpZihlLnNsb3RTY29wZSl7dmFyIG89ZS5zbG90VGFyZ2V0fHwnXCJkZWZhdWx0XCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxKbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEtvLmxlbmd0aDtmKyspS29bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmXCIgXCI9PT10LnRleHQ7KWUuY2hpbGRyZW4ucG9wKCl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaT1bXSxvPXQuZXhwZWN0SFRNTCxhPXQuaXNVbmFyeVRhZ3x8VCxzPXQuY2FuQmVMZWZ0T3BlblRhZ3x8VCxjPTA7ZTspe2lmKG49ZSxyJiZEbyhyKSl7dmFyIHU9MCxsPXIudG9Mb3dlckNhc2UoKSxmPUxvW2xdfHwoTG9bbF09bmV3IFJlZ0V4cChcIihbXFxcXHNcXFxcU10qPykoPC9cIitsK1wiW14+XSo+KVwiLFwiaVwiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsRG8obCl8fFwibm9zY3JpcHRcIj09PWx8fChuPW4ucmVwbGFjZSgvPCFcXC0tKFtcXHNcXFNdKj8pLS0+L2csXCIkMVwiKS5yZXBsYWNlKC88IVxcW0NEQVRBXFxbKFtcXHNcXFNdKj8pXV0+L2csXCIkMVwiKSksUm8obCxuKSYmKG49bi5zbGljZSgxKSksdC5jaGFycyYmdC5jaGFycyhuKSxcIlwifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoXCI8XCIpO2lmKDA9PT1kKXtpZihOby50ZXN0KGUpKXt2YXIgdj1lLmluZGV4T2YoXCItLVxceDNlXCIpO2lmKHY+PTApe3Quc2hvdWxkS2VlcENvbW1lbnQmJnQuY29tbWVudChlLnN1YnN0cmluZyg0LHYpLGMsYyt2KzMpLEModiszKTtjb250aW51ZX19aWYoam8udGVzdChlKSl7dmFyIGg9ZS5pbmRleE9mKFwiXT5cIik7aWYoaD49MCl7QyhoKzIpO2NvbnRpbnVlfX12YXIgbT1lLm1hdGNoKEVvKTtpZihtKXtDKG1bMF0ubGVuZ3RoKTtjb250aW51ZX12YXIgeT1lLm1hdGNoKFRvKTtpZih5KXt2YXIgZz1jO0MoeVswXS5sZW5ndGgpLEEoeVsxXSxnLGMpO2NvbnRpbnVlfXZhciBfPXgoKTtpZihfKXtrKF8pLFJvKF8udGFnTmFtZSxlKSYmQygxKTtjb250aW51ZX19dmFyIGI9dm9pZCAwLCQ9dm9pZCAwLHc9dm9pZCAwO2lmKGQ+PTApe2ZvcigkPWUuc2xpY2UoZCk7IShUby50ZXN0KCQpfHxPby50ZXN0KCQpfHxOby50ZXN0KCQpfHxqby50ZXN0KCQpfHwodz0kLmluZGV4T2YoXCI8XCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goT28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChTbykpJiYocj1lLm1hdGNoKHhvKXx8ZS5tYXRjaChDbykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoXCJwXCI9PT1yJiZ3byhuKSYmQShyKSxzKG4pJiZyPT09biYmQShuKSk7Zm9yKHZhciB1PWEobil8fCEhYyxsPWUuYXR0cnMubGVuZ3RoLGY9bmV3IEFycmF5KGwpLHA9MDtwPGw7cCsrKXt2YXIgZD1lLmF0dHJzW3BdLHY9ZFszXXx8ZFs0XXx8ZFs1XXx8XCJcIixoPVwiYVwiPT09biYmXCJocmVmXCI9PT1kWzFdP3Quc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOnQuc2hvdWxkRGVjb2RlTmV3bGluZXM7ZltwXT17bmFtZTpkWzFdLHZhbHVlOkhvKHYsaCl9fXV8fChpLnB1c2goe3RhZzpuLGxvd2VyQ2FzZWRUYWc6bi50b0xvd2VyQ2FzZSgpLGF0dHJzOmYsc3RhcnQ6ZS5zdGFydCxlbmQ6ZS5lbmR9KSxyPW4pLHQuc3RhcnQmJnQuc3RhcnQobixmLHUsZS5zdGFydCxlLmVuZCl9ZnVuY3Rpb24gQShlLG4sbyl7dmFyIGEscztpZihudWxsPT1uJiYobj1jKSxudWxsPT1vJiYobz1jKSxlKWZvcihzPWUudG9Mb3dlckNhc2UoKSxhPWkubGVuZ3RoLTE7YT49MCYmaVthXS5sb3dlckNhc2VkVGFnIT09czthLS0pO2Vsc2UgYT0wO2lmKGE+PTApe2Zvcih2YXIgdT1pLmxlbmd0aC0xO3U+PWE7dS0tKXQuZW5kJiZ0LmVuZChpW3VdLnRhZyxuLG8pO2kubGVuZ3RoPWEscj1hJiZpW2EtMV0udGFnfWVsc2VcImJyXCI9PT1zP3Quc3RhcnQmJnQuc3RhcnQoZSxbXSwhMCxuLG8pOlwicFwiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpCbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxXbyhlKTtxJiZcInN2Z1wiPT09cCYmKG89ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTt5YS50ZXN0KHIubmFtZSl8fChyLm5hbWU9ci5uYW1lLnJlcGxhY2UoZ2EsXCJcIiksdC5wdXNoKHIpKX1yZXR1cm4gdH0obykpO3ZhciBkLHY9dWEoZSxvLHIpO3AmJih2Lm5zPXApLFwic3R5bGVcIiE9PShkPXYpLnRhZyYmKFwic2NyaXB0XCIhPT1kLnRhZ3x8ZC5hdHRyc01hcC50eXBlJiZcInRleHQvamF2YXNjcmlwdFwiIT09ZC5hdHRyc01hcC50eXBlKXx8dGUoKXx8KHYuZm9yYmlkZGVuPSEwKTtmb3IodmFyIGg9MDtoPFZvLmxlbmd0aDtoKyspdj1Wb1toXSh2LHQpfHx2O3N8fCghZnVuY3Rpb24oZSl7bnVsbCE9RnIoZSxcInYtcHJlXCIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxKbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChwYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1GcihlLFwidi1pZlwiKTtpZih0KWUuaWY9dCxkYShlLHtleHA6dCxibG9jazplfSk7ZWxzZXtudWxsIT1GcihlLFwidi1lbHNlXCIpJiYoZS5lbHNlPSEwKTt2YXIgbj1GcihlLFwidi1lbHNlLWlmXCIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPUZyKGUsXCJ2LW9uY2VcIikmJihlLm9uY2U9ITApfSh2KSksbnx8KG49diksYT91KHYpOihyPXYsaS5wdXNoKHYpKX0sZW5kOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1pW2kubGVuZ3RoLTFdO2kubGVuZ3RoLT0xLHI9aVtpLmxlbmd0aC0xXSx1KG8pfSxjaGFyczpmdW5jdGlvbihlLHQsbil7aWYociYmKCFxfHxcInRleHRhcmVhXCIhPT1yLnRhZ3x8ci5hdHRyc01hcC5wbGFjZWhvbGRlciE9PWUpKXt2YXIgaSx1LGwsZj1yLmNoaWxkcmVuO2lmKGU9Y3x8ZS50cmltKCk/XCJzY3JpcHRcIj09PShpPXIpLnRhZ3x8XCJzdHlsZVwiPT09aS50YWc/ZTpzYShlKTpmLmxlbmd0aD9hP1wiY29uZGVuc2VcIj09PWEmJm9hLnRlc3QoZSk/XCJcIjpcIiBcIjpvP1wiIFwiOlwiXCI6XCJcIiljfHxcImNvbmRlbnNlXCIhPT1hfHwoZT1lLnJlcGxhY2UoYWEsXCIgXCIpKSwhcyYmXCIgXCIhPT1lJiYodT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/aG8odCk6cG87aWYobi50ZXN0KGUpKXtmb3IodmFyIHIsaSxvLGE9W10scz1bXSxjPW4ubGFzdEluZGV4PTA7cj1uLmV4ZWMoZSk7KXsoaT1yLmluZGV4KT5jJiYocy5wdXNoKG89ZS5zbGljZShjLGkpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKTt2YXIgdT1BcihyWzFdLnRyaW0oKSk7YS5wdXNoKFwiX3MoXCIrdStcIilcIikscy5wdXNoKHtcIkBiaW5kaW5nXCI6dX0pLGM9aStyWzBdLmxlbmd0aH1yZXR1cm4gYzxlLmxlbmd0aCYmKHMucHVzaChvPWUuc2xpY2UoYykpLGEucHVzaChKU09OLnN0cmluZ2lmeShvKSkpLHtleHByZXNzaW9uOmEuam9pbihcIitcIiksdG9rZW5zOnN9fX0oZSxVbykpP2w9e3R5cGU6MixleHByZXNzaW9uOnUuZXhwcmVzc2lvbix0b2tlbnM6dS50b2tlbnMsdGV4dDplfTpcIiBcIj09PWUmJmYubGVuZ3RoJiZcIiBcIj09PWZbZi5sZW5ndGgtMV0udGV4dHx8KGw9e3R5cGU6Myx0ZXh0OmV9KSxsJiZmLnB1c2gobCl9fSxjb21tZW50OmZ1bmN0aW9uKGUsdCxuKXtpZihyKXt2YXIgaT17dHlwZTozLHRleHQ6ZSxpc0NvbW1lbnQ6ITB9O3IuY2hpbGRyZW4ucHVzaChpKX19fSksbn1mdW5jdGlvbiBmYShlLHQpe3ZhciBuLHI7KHI9SXIobj1lLFwia2V5XCIpKSYmKG4ua2V5PXIpLGUucGxhaW49IWUua2V5JiYhZS5zY29wZWRTbG90cyYmIWUuYXR0cnNMaXN0Lmxlbmd0aCxmdW5jdGlvbihlKXt2YXIgdD1JcihlLFwicmVmXCIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0O1widGVtcGxhdGVcIj09PWUudGFnPyh0PUZyKGUsXCJzY29wZVwiKSxlLnNsb3RTY29wZT10fHxGcihlLFwic2xvdC1zY29wZVwiKSk6KHQ9RnIoZSxcInNsb3Qtc2NvcGVcIikpJiYoZS5zbG90U2NvcGU9dCk7dmFyIG49SXIoZSxcInNsb3RcIik7biYmKGUuc2xvdFRhcmdldD0nXCJcIic9PT1uPydcImRlZmF1bHRcIic6bixlLnNsb3RUYXJnZXREeW5hbWljPSEoIWUuYXR0cnNNYXBbXCI6c2xvdFwiXSYmIWUuYXR0cnNNYXBbXCJ2LWJpbmQ6c2xvdFwiXSksXCJ0ZW1wbGF0ZVwiPT09ZS50YWd8fGUuc2xvdFNjb3BlfHxOcihlLFwic2xvdFwiLG4sZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yYXdBdHRyc01hcFtcIjpcIit0XXx8ZS5yYXdBdHRyc01hcFtcInYtYmluZDpcIit0XXx8ZS5yYXdBdHRyc01hcFt0XX0oZSxcInNsb3RcIikpKTtpZihcInRlbXBsYXRlXCI9PT1lLnRhZyl7dmFyIHI9UHIoZSxpYSk7aWYocil7dmFyIGk9dmEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fGNhfX1lbHNle3ZhciBzPVByKGUsaWEpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PXZhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT11YShcInRlbXBsYXRlXCIsW10sZSk7cC5zbG90VGFyZ2V0PWwscC5zbG90VGFyZ2V0RHluYW1pYz1mLHAuY2hpbGRyZW49ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oZSl7aWYoIWUuc2xvdFNjb3BlKXJldHVybiBlLnBhcmVudD1wLCEwfSkscC5zbG90U2NvcGU9cy52YWx1ZXx8Y2EsZS5jaGlsZHJlbj1bXSxlLnBsYWluPSExfX19KGUpLGZ1bmN0aW9uKGUpe1wic2xvdFwiPT09ZS50YWcmJihlLnNsb3ROYW1lPUlyKGUsXCJuYW1lXCIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9SXIoZSxcImlzXCIpKSYmKGUuY29tcG9uZW50PXQpO251bGwhPUZyKGUsXCJpbmxpbmUtdGVtcGxhdGVcIikmJihlLmlubGluZVRlbXBsYXRlPSEwKX0oZSk7Zm9yKHZhciBpPTA7aTx6by5sZW5ndGg7aSsrKWU9em9baV0oZSx0KXx8ZTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsYyx1PWUuYXR0cnNMaXN0O2Zvcih0PTAsbj11Lmxlbmd0aDt0PG47dCsrKWlmKHI9aT11W3RdLm5hbWUsbz11W3RdLnZhbHVlLEdvLnRlc3QocikpaWYoZS5oYXNCaW5kaW5ncz0hMCwoYT1oYShyLnJlcGxhY2UoR28sXCJcIikpKSYmKHI9ci5yZXBsYWNlKHJhLFwiXCIpKSxuYS50ZXN0KHIpKXI9ci5yZXBsYWNlKG5hLFwiXCIpLG89QXIobyksKGM9ZWEudGVzdChyKSkmJihyPXIuc2xpY2UoMSwtMSkpLGEmJihhLnByb3AmJiFjJiZcImlubmVySHRtbFwiPT09KHI9YihyKSkmJihyPVwiaW5uZXJIVE1MXCIpLGEuY2FtZWwmJiFjJiYocj1iKHIpKSxhLnN5bmMmJihzPUJyKG8sXCIkZXZlbnRcIiksYz9NcihlLCdcInVwZGF0ZTpcIisoJytyK1wiKVwiLHMsbnVsbCwhMSwwLHVbdF0sITApOihNcihlLFwidXBkYXRlOlwiK2IocikscyxudWxsLCExLDAsdVt0XSksQyhyKSE9PWIocikmJk1yKGUsXCJ1cGRhdGU6XCIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmcW8oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6TnIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKFpvLnRlc3Qocikpcj1yLnJlcGxhY2UoWm8sXCJcIiksKGM9ZWEudGVzdChyKSkmJihyPXIuc2xpY2UoMSwtMSkpLE1yKGUscixvLGEsITEsMCx1W3RdLGMpO2Vsc2V7dmFyIGw9KHI9ci5yZXBsYWNlKEdvLFwiXCIpKS5tYXRjaCh0YSksZj1sJiZsWzFdO2M9ITEsZiYmKHI9ci5zbGljZSgwLC0oZi5sZW5ndGgrMSkpLGVhLnRlc3QoZikmJihmPWYuc2xpY2UoMSwtMSksYz0hMCkpLERyKGUscixpLG8sZixjLGEsdVt0XSl9ZWxzZSBOcihlLHIsSlNPTi5zdHJpbmdpZnkobyksdVt0XSksIWUuY29tcG9uZW50JiZcIm11dGVkXCI9PT1yJiZxbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUscixcInRydWVcIix1W3RdKX0oZSksZX1mdW5jdGlvbiBwYShlKXt2YXIgdDtpZih0PUZyKGUsXCJ2LWZvclwiKSl7dmFyIG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaChYbyk7aWYoIXQpcmV0dXJuO3ZhciBuPXt9O24uZm9yPXRbMl0udHJpbSgpO3ZhciByPXRbMV0udHJpbSgpLnJlcGxhY2UoUW8sXCJcIiksaT1yLm1hdGNoKFlvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShZbyxcIlwiKS50cmltKCksbi5pdGVyYXRvcjE9aVsxXS50cmltKCksaVsyXSYmKG4uaXRlcmF0b3IyPWlbMl0udHJpbSgpKSk6bi5hbGlhcz1yO3JldHVybiBufSh0KTtuJiZBKGUsbil9fWZ1bmN0aW9uIGRhKGUsdCl7ZS5pZkNvbmRpdGlvbnN8fChlLmlmQ29uZGl0aW9ucz1bXSksZS5pZkNvbmRpdGlvbnMucHVzaCh0KX1mdW5jdGlvbiB2YShlKXt2YXIgdD1lLm5hbWUucmVwbGFjZShpYSxcIlwiKTtyZXR1cm4gdHx8XCIjXCIhPT1lLm5hbWVbMF0mJih0PVwiZGVmYXVsdFwiKSxlYS50ZXN0KHQpP3tuYW1lOnQuc2xpY2UoMSwtMSksZHluYW1pYzohMH06e25hbWU6J1wiJyt0KydcIicsZHluYW1pYzohMX19ZnVuY3Rpb24gaGEoZSl7dmFyIHQ9ZS5tYXRjaChyYSk7aWYodCl7dmFyIG49e307cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihlKXtuW2Uuc2xpY2UoMSldPSEwfSksbn19ZnVuY3Rpb24gbWEoZSl7Zm9yKHZhciB0PXt9LG49MCxyPWUubGVuZ3RoO248cjtuKyspdFtlW25dLm5hbWVdPWVbbl0udmFsdWU7cmV0dXJuIHR9dmFyIHlhPS9eeG1sbnM6TlNcXGQrLyxnYT0vXk5TXFxkKzovO2Z1bmN0aW9uIF9hKGUpe3JldHVybiB1YShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgYmE9W21vLGdvLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoXCJpbnB1dFwiPT09ZS50YWcpe3ZhciBuLHI9ZS5hdHRyc01hcDtpZighcltcInYtbW9kZWxcIl0pcmV0dXJuO2lmKChyW1wiOnR5cGVcIl18fHJbXCJ2LWJpbmQ6dHlwZVwiXSkmJihuPUlyKGUsXCJ0eXBlXCIpKSxyLnR5cGV8fG58fCFyW1widi1iaW5kXCJdfHwobj1cIihcIityW1widi1iaW5kXCJdK1wiKS50eXBlXCIpLG4pe3ZhciBpPUZyKGUsXCJ2LWlmXCIsITApLG89aT9cIiYmKFwiK2krXCIpXCI6XCJcIixhPW51bGwhPUZyKGUsXCJ2LWVsc2VcIiwhMCkscz1GcihlLFwidi1lbHNlLWlmXCIsITApLGM9X2EoZSk7cGEoYyksanIoYyxcInR5cGVcIixcImNoZWNrYm94XCIpLGZhKGMsdCksYy5wcm9jZXNzZWQ9ITAsYy5pZj1cIihcIituK1wiKT09PSdjaGVja2JveCdcIitvLGRhKGMse2V4cDpjLmlmLGJsb2NrOmN9KTt2YXIgdT1fYShlKTtGcih1LFwidi1mb3JcIiwhMCksanIodSxcInR5cGVcIixcInJhZGlvXCIpLGZhKHUsdCksZGEoYyx7ZXhwOlwiKFwiK24rXCIpPT09J3JhZGlvJ1wiK28sYmxvY2s6dX0pO3ZhciBsPV9hKGUpO3JldHVybiBGcihsLFwidi1mb3JcIiwhMCksanIobCxcIjp0eXBlXCIsbiksZmEobCx0KSxkYShjLHtleHA6aSxibG9jazpsfSksYT9jLmVsc2U9ITA6cyYmKGMuZWxzZWlmPXMpLGN9fX19XTt2YXIgJGEsd2EsQ2E9e2V4cGVjdEhUTUw6ITAsbW9kdWxlczpiYSxkaXJlY3RpdmVzOnttb2RlbDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZSxpPXQubW9kaWZpZXJzLG89ZS50YWcsYT1lLmF0dHJzTWFwLnR5cGU7aWYoZS5jb21wb25lbnQpcmV0dXJuIEhyKGUscixpKSwhMTtpZihcInNlbGVjdFwiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtyZXR1cm4gJysobiYmbi5udW1iZXI/XCJfbih2YWwpXCI6XCJ2YWxcIikrXCJ9KTtcIjtyPXIrXCIgXCIrQnIodCxcIiRldmVudC50YXJnZXQubXVsdGlwbGUgPyAkJHNlbGVjdGVkVmFsIDogJCRzZWxlY3RlZFZhbFswXVwiKSxNcihlLFwiY2hhbmdlXCIscixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoXCJpbnB1dFwiPT09byYmXCJjaGVja2JveFwiPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9SXIoZSxcInZhbHVlXCIpfHxcIm51bGxcIixvPUlyKGUsXCJ0cnVlLXZhbHVlXCIpfHxcInRydWVcIixhPUlyKGUsXCJmYWxzZS12YWx1ZVwiKXx8XCJmYWxzZVwiO0VyKGUsXCJjaGVja2VkXCIsXCJBcnJheS5pc0FycmF5KFwiK3QrXCIpP19pKFwiK3QrXCIsXCIraStcIik+LTFcIisoXCJ0cnVlXCI9PT1vP1wiOihcIit0K1wiKVwiOlwiOl9xKFwiK3QrXCIsXCIrbytcIilcIikpLE1yKGUsXCJjaGFuZ2VcIixcInZhciAkJGE9XCIrdCtcIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oXCIrbytcIik6KFwiK2ErXCIpO2lmKEFycmF5LmlzQXJyYXkoJCRhKSl7dmFyICQkdj1cIisocj9cIl9uKFwiK2krXCIpXCI6aSkrXCIsJCRpPV9pKCQkYSwkJHYpO2lmKCQkZWwuY2hlY2tlZCl7JCRpPDAmJihcIitCcih0LFwiJCRhLmNvbmNhdChbJCR2XSlcIikrXCIpfWVsc2V7JCRpPi0xJiYoXCIrQnIodCxcIiQkYS5zbGljZSgwLCQkaSkuY29uY2F0KCQkYS5zbGljZSgkJGkrMSkpXCIpK1wiKX19ZWxzZXtcIitCcih0LFwiJCRjXCIpK1wifVwiLG51bGwsITApfShlLHIsaSk7ZWxzZSBpZihcImlucHV0XCI9PT1vJiZcInJhZGlvXCI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1JcihlLFwidmFsdWVcIil8fFwibnVsbFwiO0VyKGUsXCJjaGVja2VkXCIsXCJfcShcIit0K1wiLFwiKyhpPXI/XCJfbihcIitpK1wiKVwiOmkpK1wiKVwiKSxNcihlLFwiY2hhbmdlXCIsQnIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoXCJpbnB1dFwiPT09b3x8XCJ0ZXh0YXJlYVwiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuYXR0cnNNYXAudHlwZSxpPW58fHt9LG89aS5sYXp5LGE9aS5udW1iZXIscz1pLnRyaW0sYz0hbyYmXCJyYW5nZVwiIT09cix1PW8/XCJjaGFuZ2VcIjpcInJhbmdlXCI9PT1yP1dyOlwiaW5wdXRcIixsPVwiJGV2ZW50LnRhcmdldC52YWx1ZVwiO3MmJihsPVwiJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKClcIiksYSYmKGw9XCJfbihcIitsK1wiKVwiKTt2YXIgZj1Ccih0LGwpO2MmJihmPVwiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuO1wiK2YpLEVyKGUsXCJ2YWx1ZVwiLFwiKFwiK3QrXCIpXCIpLE1yKGUsdSxmLG51bGwsITApLChzfHxhKSYmTXIoZSxcImJsdXJcIixcIiRmb3JjZVVwZGF0ZSgpXCIpfShlLHIsaSk7ZWxzZSBpZighRi5pc1Jlc2VydmVkVGFnKG8pKXJldHVybiBIcihlLHIsaSksITE7cmV0dXJuITB9LHRleHQ6ZnVuY3Rpb24oZSx0KXt0LnZhbHVlJiZFcihlLFwidGV4dENvbnRlbnRcIixcIl9zKFwiK3QudmFsdWUrXCIpXCIsdCl9LGh0bWw6ZnVuY3Rpb24oZSx0KXt0LnZhbHVlJiZFcihlLFwiaW5uZXJIVE1MXCIsXCJfcyhcIit0LnZhbHVlK1wiKVwiLHQpfX0saXNQcmVUYWc6ZnVuY3Rpb24oZSl7cmV0dXJuXCJwcmVcIj09PWV9LGlzVW5hcnlUYWc6Ym8sbXVzdFVzZVByb3A6am4sY2FuQmVMZWZ0T3BlblRhZzokbyxpc1Jlc2VydmVkVGFnOlduLGdldFRhZ05hbWVzcGFjZTpabixzdGF0aWNLZXlzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdCh0LnN0YXRpY0tleXN8fFtdKX0sW10pLmpvaW4oXCIsXCIpfShiYSl9LHhhPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoXCJ0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzLHN0YXJ0LGVuZCxyYXdBdHRyc01hcFwiKyhlP1wiLFwiK2U6XCJcIikpfSk7ZnVuY3Rpb24ga2EoZSx0KXtlJiYoJGE9eGEodC5zdGF0aWNLZXlzfHxcIlwiKSx3YT10LmlzUmVzZXJ2ZWRUYWd8fFQsZnVuY3Rpb24gZSh0KXt0LnN0YXRpYz1mdW5jdGlvbihlKXtpZigyPT09ZS50eXBlKXJldHVybiExO2lmKDM9PT1lLnR5cGUpcmV0dXJuITA7cmV0dXJuISghZS5wcmUmJihlLmhhc0JpbmRpbmdzfHxlLmlmfHxlLmZvcnx8ZChlLnRhZyl8fCF3YShlLnRhZyl8fGZ1bmN0aW9uKGUpe2Zvcig7ZS5wYXJlbnQ7KXtpZihcInRlbXBsYXRlXCIhPT0oZT1lLnBhcmVudCkudGFnKXJldHVybiExO2lmKGUuZm9yKXJldHVybiEwfXJldHVybiExfShlKXx8IU9iamVjdC5rZXlzKGUpLmV2ZXJ5KCRhKSkpfSh0KTtpZigxPT09dC50eXBlKXtpZighd2EodC50YWcpJiZcInNsb3RcIiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwW1wiaW5saW5lLXRlbXBsYXRlXCJdKXJldHVybjtmb3IodmFyIG49MCxyPXQuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe3ZhciBpPXQuY2hpbGRyZW5bbl07ZShpKSxpLnN0YXRpY3x8KHQuc3RhdGljPSExKX1pZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKXt2YXIgcz10LmlmQ29uZGl0aW9uc1tvXS5ibG9jaztlKHMpLHMuc3RhdGljfHwodC5zdGF0aWM9ITEpfX19KGUpLGZ1bmN0aW9uIGUodCxuKXtpZigxPT09dC50eXBlKXtpZigodC5zdGF0aWN8fHQub25jZSkmJih0LnN0YXRpY0luRm9yPW4pLHQuc3RhdGljJiZ0LmNoaWxkcmVuLmxlbmd0aCYmKDEhPT10LmNoaWxkcmVuLmxlbmd0aHx8MyE9PXQuY2hpbGRyZW5bMF0udHlwZSkpcmV0dXJuIHZvaWQodC5zdGF0aWNSb290PSEwKTtpZih0LnN0YXRpY1Jvb3Q9ITEsdC5jaGlsZHJlbilmb3IodmFyIHI9MCxpPXQuY2hpbGRyZW4ubGVuZ3RoO3I8aTtyKyspZSh0LmNoaWxkcmVuW3JdLG58fCEhdC5mb3IpO2lmKHQuaWZDb25kaXRpb25zKWZvcih2YXIgbz0xLGE9dC5pZkNvbmRpdGlvbnMubGVuZ3RoO288YTtvKyspZSh0LmlmQ29uZGl0aW9uc1tvXS5ibG9jayxuKX19KGUsITEpKX12YXIgQWE9L14oW1xcdyRfXSt8XFwoW14pXSo/XFwpKVxccyo9PnxeZnVuY3Rpb24oPzpcXHMrW1xcdyRdKyk/XFxzKlxcKC8sT2E9L1xcKFteKV0qP1xcKTsqJC8sU2E9L15bQS1aYS16XyRdW1xcdyRdKig/OlxcLltBLVphLXpfJF1bXFx3JF0qfFxcWydbXiddKj8nXXxcXFtcIlteXCJdKj9cIl18XFxbXFxkK118XFxbW0EtWmEtel8kXVtcXHckXSpdKSokLyxUYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOltcIkVzY1wiLFwiRXNjYXBlXCJdLHRhYjpcIlRhYlwiLGVudGVyOlwiRW50ZXJcIixzcGFjZTpbXCIgXCIsXCJTcGFjZWJhclwiXSx1cDpbXCJVcFwiLFwiQXJyb3dVcFwiXSxsZWZ0OltcIkxlZnRcIixcIkFycm93TGVmdFwiXSxyaWdodDpbXCJSaWdodFwiLFwiQXJyb3dSaWdodFwiXSxkb3duOltcIkRvd25cIixcIkFycm93RG93blwiXSxkZWxldGU6W1wiQmFja3NwYWNlXCIsXCJEZWxldGVcIixcIkRlbFwiXX0sTmE9ZnVuY3Rpb24oZSl7cmV0dXJuXCJpZihcIitlK1wiKXJldHVybiBudWxsO1wifSxqYT17c3RvcDpcIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIixwcmV2ZW50OlwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCIsc2VsZjpOYShcIiRldmVudC50YXJnZXQgIT09ICRldmVudC5jdXJyZW50VGFyZ2V0XCIpLGN0cmw6TmEoXCIhJGV2ZW50LmN0cmxLZXlcIiksc2hpZnQ6TmEoXCIhJGV2ZW50LnNoaWZ0S2V5XCIpLGFsdDpOYShcIiEkZXZlbnQuYWx0S2V5XCIpLG1ldGE6TmEoXCIhJGV2ZW50Lm1ldGFLZXlcIiksbGVmdDpOYShcIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwXCIpLG1pZGRsZTpOYShcIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAxXCIpLHJpZ2h0Ok5hKFwiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDJcIil9O2Z1bmN0aW9uIERhKGUsdCl7dmFyIG49dD9cIm5hdGl2ZU9uOlwiOlwib246XCIscj1cIlwiLGk9XCJcIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9TGEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rXCIsXCIrYStcIixcIjpyKz0nXCInK28rJ1wiOicrYStcIixcIn1yZXR1cm4gcj1cIntcIityLnNsaWNlKDAsLTEpK1wifVwiLGk/bitcIl9kKFwiK3IrXCIsW1wiK2kuc2xpY2UoMCwtMSkrXCJdKVwiOm4rcn1mdW5jdGlvbiBMYShlKXtpZighZSlyZXR1cm5cImZ1bmN0aW9uKCl7fVwiO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuXCJbXCIrZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIExhKGUpfSkuam9pbihcIixcIikrXCJdXCI7dmFyIHQ9U2EudGVzdChlLnZhbHVlKSxuPUFhLnRlc3QoZS52YWx1ZSkscj1TYS50ZXN0KGUudmFsdWUucmVwbGFjZShPYSxcIlwiKSk7aWYoZS5tb2RpZmllcnMpe3ZhciBpPVwiXCIsbz1cIlwiLGE9W107Zm9yKHZhciBzIGluIGUubW9kaWZpZXJzKWlmKGphW3NdKW8rPWphW3NdLFRhW3NdJiZhLnB1c2gocyk7ZWxzZSBpZihcImV4YWN0XCI9PT1zKXt2YXIgYz1lLm1vZGlmaWVycztvKz1OYShbXCJjdHJsXCIsXCJzaGlmdFwiLFwiYWx0XCIsXCJtZXRhXCJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIiRldmVudC5cIitlK1wiS2V5XCJ9KS5qb2luKFwifHxcIikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVyblwiaWYoISRldmVudC50eXBlLmluZGV4T2YoJ2tleScpJiZcIitlLm1hcChNYSkuam9pbihcIiYmXCIpK1wiKXJldHVybiBudWxsO1wifShhKSksbyYmKGkrPW8pLFwiZnVuY3Rpb24oJGV2ZW50KXtcIitpKyh0P1wicmV0dXJuIFwiK2UudmFsdWUrXCIoJGV2ZW50KVwiOm4/XCJyZXR1cm4gKFwiK2UudmFsdWUrXCIpKCRldmVudClcIjpyP1wicmV0dXJuIFwiK2UudmFsdWU6ZS52YWx1ZSkrXCJ9XCJ9cmV0dXJuIHR8fG4/ZS52YWx1ZTpcImZ1bmN0aW9uKCRldmVudCl7XCIrKHI/XCJyZXR1cm4gXCIrZS52YWx1ZTplLnZhbHVlKStcIn1cIn1mdW5jdGlvbiBNYShlKXt2YXIgdD1wYXJzZUludChlLDEwKTtpZih0KXJldHVyblwiJGV2ZW50LmtleUNvZGUhPT1cIit0O3ZhciBuPVRhW2VdLHI9RWFbZV07cmV0dXJuXCJfaygkZXZlbnQua2V5Q29kZSxcIitKU09OLnN0cmluZ2lmeShlKStcIixcIitKU09OLnN0cmluZ2lmeShuKStcIiwkZXZlbnQua2V5LFwiK0pTT04uc3RyaW5naWZ5KHIpK1wiKVwifXZhciBJYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuXCJfZyhcIitlK1wiLFwiK3QudmFsdWUrXCIpXCJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm5cIl9iKFwiK24rXCIsJ1wiK2UudGFnK1wiJyxcIit0LnZhbHVlK1wiLFwiKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMucHJvcD9cInRydWVcIjpcImZhbHNlXCIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz9cIix0cnVlXCI6XCJcIikrXCIpXCJ9fSxjbG9hazpTfSxGYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxTcix0aGlzLnRyYW5zZm9ybXM9VHIoZS5tb2R1bGVzLFwidHJhbnNmb3JtQ29kZVwiKSx0aGlzLmRhdGFHZW5GbnM9VHIoZS5tb2R1bGVzLFwiZ2VuRGF0YVwiKSx0aGlzLmRpcmVjdGl2ZXM9QShBKHt9LElhKSxlLmRpcmVjdGl2ZXMpO3ZhciB0PWUuaXNSZXNlcnZlZFRhZ3x8VDt0aGlzLm1heWJlQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiEhZS5jb21wb25lbnR8fCF0KGUudGFnKX0sdGhpcy5vbmNlSWQ9MCx0aGlzLnN0YXRpY1JlbmRlckZucz1bXSx0aGlzLnByZT0hMX07ZnVuY3Rpb24gUGEoZSx0KXt2YXIgbj1uZXcgRmEodCk7cmV0dXJue3JlbmRlcjpcIndpdGgodGhpcyl7cmV0dXJuIFwiKyhlP1JhKGUsbik6J19jKFwiZGl2XCIpJykrXCJ9XCIsc3RhdGljUmVuZGVyRm5zOm4uc3RhdGljUmVuZGVyRm5zfX1mdW5jdGlvbiBSYShlLHQpe2lmKGUucGFyZW50JiYoZS5wcmU9ZS5wcmV8fGUucGFyZW50LnByZSksZS5zdGF0aWNSb290JiYhZS5zdGF0aWNQcm9jZXNzZWQpcmV0dXJuIEhhKGUsdCk7aWYoZS5vbmNlJiYhZS5vbmNlUHJvY2Vzc2VkKXJldHVybiBCYShlLHQpO2lmKGUuZm9yJiYhZS5mb3JQcm9jZXNzZWQpcmV0dXJuIHphKGUsdCk7aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQpcmV0dXJuIFVhKGUsdCk7aWYoXCJ0ZW1wbGF0ZVwiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKFwic2xvdFwiPT09ZS50YWcpcmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zbG90TmFtZXx8J1wiZGVmYXVsdFwiJyxyPXFhKGUsdCksaT1cIl90KFwiK24rKHI/XCIsXCIrcjpcIlwiKSxvPWUuYXR0cnN8fGUuZHluYW1pY0F0dHJzP0dhKChlLmF0dHJzfHxbXSkuY29uY2F0KGUuZHluYW1pY0F0dHJzfHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmIoZS5uYW1lKSx2YWx1ZTplLnZhbHVlLGR5bmFtaWM6ZS5keW5hbWljfX0pKTpudWxsLGE9ZS5hdHRyc01hcFtcInYtYmluZFwiXTshbyYmIWF8fHJ8fChpKz1cIixudWxsXCIpO28mJihpKz1cIixcIitvKTthJiYoaSs9KG8/XCJcIjpcIixudWxsXCIpK1wiLFwiK2EpO3JldHVybiBpK1wiKVwifShlLHQpO3ZhciBuO2lmKGUuY29tcG9uZW50KW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuaW5saW5lVGVtcGxhdGU/bnVsbDpxYSh0LG4sITApO3JldHVyblwiX2MoXCIrZStcIixcIitWYSh0LG4pKyhyP1wiLFwiK3I6XCJcIikrXCIpXCJ9KGUuY29tcG9uZW50LGUsdCk7ZWxzZXt2YXIgcjsoIWUucGxhaW58fGUucHJlJiZ0Lm1heWJlQ29tcG9uZW50KGUpKSYmKHI9VmEoZSx0KSk7dmFyIGk9ZS5pbmxpbmVUZW1wbGF0ZT9udWxsOnFhKGUsdCwhMCk7bj1cIl9jKCdcIitlLnRhZytcIidcIisocj9cIixcIityOlwiXCIpKyhpP1wiLFwiK2k6XCJcIikrXCIpXCJ9Zm9yKHZhciBvPTA7bzx0LnRyYW5zZm9ybXMubGVuZ3RoO28rKyluPXQudHJhbnNmb3Jtc1tvXShlLG4pO3JldHVybiBufXJldHVybiBxYShlLHQpfHxcInZvaWQgMFwifWZ1bmN0aW9uIEhhKGUsdCl7ZS5zdGF0aWNQcm9jZXNzZWQ9ITA7dmFyIG49dC5wcmU7cmV0dXJuIGUucHJlJiYodC5wcmU9ZS5wcmUpLHQuc3RhdGljUmVuZGVyRm5zLnB1c2goXCJ3aXRoKHRoaXMpe3JldHVybiBcIitSYShlLHQpK1wifVwiKSx0LnByZT1uLFwiX20oXCIrKHQuc3RhdGljUmVuZGVyRm5zLmxlbmd0aC0xKSsoZS5zdGF0aWNJbkZvcj9cIix0cnVlXCI6XCJcIikrXCIpXCJ9ZnVuY3Rpb24gQmEoZSx0KXtpZihlLm9uY2VQcm9jZXNzZWQ9ITAsZS5pZiYmIWUuaWZQcm9jZXNzZWQpcmV0dXJuIFVhKGUsdCk7aWYoZS5zdGF0aWNJbkZvcil7Zm9yKHZhciBuPVwiXCIscj1lLnBhcmVudDtyOyl7aWYoci5mb3Ipe249ci5rZXk7YnJlYWt9cj1yLnBhcmVudH1yZXR1cm4gbj9cIl9vKFwiK1JhKGUsdCkrXCIsXCIrdC5vbmNlSWQrKytcIixcIituK1wiKVwiOlJhKGUsdCl9cmV0dXJuIEhhKGUsdCl9ZnVuY3Rpb24gVWEoZSx0LG4scil7cmV0dXJuIGUuaWZQcm9jZXNzZWQ9ITAsZnVuY3Rpb24gZSh0LG4scixpKXtpZighdC5sZW5ndGgpcmV0dXJuIGl8fFwiX2UoKVwiO3ZhciBvPXQuc2hpZnQoKTtyZXR1cm4gby5leHA/XCIoXCIrby5leHArXCIpP1wiK2Eoby5ibG9jaykrXCI6XCIrZSh0LG4scixpKTpcIlwiK2Eoby5ibG9jayk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gcj9yKGUsbik6ZS5vbmNlP0JhKGUsbik6UmEoZSxuKX19KGUuaWZDb25kaXRpb25zLnNsaWNlKCksdCxuLHIpfWZ1bmN0aW9uIHphKGUsdCxuLHIpe3ZhciBpPWUuZm9yLG89ZS5hbGlhcyxhPWUuaXRlcmF0b3IxP1wiLFwiK2UuaXRlcmF0b3IxOlwiXCIscz1lLml0ZXJhdG9yMj9cIixcIitlLml0ZXJhdG9yMjpcIlwiO3JldHVybiBlLmZvclByb2Nlc3NlZD0hMCwocnx8XCJfbFwiKStcIigoXCIraStcIiksZnVuY3Rpb24oXCIrbythK3MrXCIpe3JldHVybiBcIisobnx8UmEpKGUsdCkrXCJ9KVwifWZ1bmN0aW9uIFZhKGUsdCl7dmFyIG49XCJ7XCIscj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlyZWN0aXZlcztpZighbilyZXR1cm47dmFyIHIsaSxvLGEscz1cImRpcmVjdGl2ZXM6W1wiLGM9ITE7Zm9yKHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe289bltyXSxhPSEwO3ZhciB1PXQuZGlyZWN0aXZlc1tvLm5hbWVdO3UmJihhPSEhdShlLG8sdC53YXJuKSksYSYmKGM9ITAscys9J3tuYW1lOlwiJytvLm5hbWUrJ1wiLHJhd05hbWU6XCInK28ucmF3TmFtZSsnXCInKyhvLnZhbHVlP1wiLHZhbHVlOihcIitvLnZhbHVlK1wiKSxleHByZXNzaW9uOlwiK0pTT04uc3RyaW5naWZ5KG8udmFsdWUpOlwiXCIpKyhvLmFyZz9cIixhcmc6XCIrKG8uaXNEeW5hbWljQXJnP28uYXJnOidcIicrby5hcmcrJ1wiJyk6XCJcIikrKG8ubW9kaWZpZXJzP1wiLG1vZGlmaWVyczpcIitKU09OLnN0cmluZ2lmeShvLm1vZGlmaWVycyk6XCJcIikrXCJ9LFwiKX1pZihjKXJldHVybiBzLnNsaWNlKDAsLTEpK1wiXVwifShlLHQpO3ImJihuKz1yK1wiLFwiKSxlLmtleSYmKG4rPVwia2V5OlwiK2Uua2V5K1wiLFwiKSxlLnJlZiYmKG4rPVwicmVmOlwiK2UucmVmK1wiLFwiKSxlLnJlZkluRm9yJiYobis9XCJyZWZJbkZvcjp0cnVlLFwiKSxlLnByZSYmKG4rPVwicHJlOnRydWUsXCIpLGUuY29tcG9uZW50JiYobis9J3RhZzpcIicrZS50YWcrJ1wiLCcpO2Zvcih2YXIgaT0wO2k8dC5kYXRhR2VuRm5zLmxlbmd0aDtpKyspbis9dC5kYXRhR2VuRm5zW2ldKGUpO2lmKGUuYXR0cnMmJihuKz1cImF0dHJzOlwiK0dhKGUuYXR0cnMpK1wiLFwiKSxlLnByb3BzJiYobis9XCJkb21Qcm9wczpcIitHYShlLnByb3BzKStcIixcIiksZS5ldmVudHMmJihuKz1EYShlLmV2ZW50cywhMSkrXCIsXCIpLGUubmF0aXZlRXZlbnRzJiYobis9RGEoZS5uYXRpdmVFdmVudHMsITApK1wiLFwiKSxlLnNsb3RUYXJnZXQmJiFlLnNsb3RTY29wZSYmKG4rPVwic2xvdDpcIitlLnNsb3RUYXJnZXQrXCIsXCIpLGUuc2NvcGVkU2xvdHMmJihuKz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5mb3J8fE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtyZXR1cm4gbi5zbG90VGFyZ2V0RHluYW1pY3x8bi5pZnx8bi5mb3J8fEthKG4pfSksaT0hIWUuaWY7aWYoIXIpZm9yKHZhciBvPWUucGFyZW50O287KXtpZihvLnNsb3RTY29wZSYmby5zbG90U2NvcGUhPT1jYXx8by5mb3Ipe3I9ITA7YnJlYWt9by5pZiYmKGk9ITApLG89by5wYXJlbnR9dmFyIGE9T2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBKYSh0W2VdLG4pfSkuam9pbihcIixcIik7cmV0dXJuXCJzY29wZWRTbG90czpfdShbXCIrYStcIl1cIisocj9cIixudWxsLHRydWVcIjpcIlwiKSsoIXImJmk/XCIsbnVsbCxmYWxzZSxcIitmdW5jdGlvbihlKXt2YXIgdD01MzgxLG49ZS5sZW5ndGg7Zm9yKDtuOyl0PTMzKnReZS5jaGFyQ29kZUF0KC0tbik7cmV0dXJuIHQ+Pj4wfShhKTpcIlwiKStcIilcIn0oZSxlLnNjb3BlZFNsb3RzLHQpK1wiLFwiKSxlLm1vZGVsJiYobis9XCJtb2RlbDp7dmFsdWU6XCIrZS5tb2RlbC52YWx1ZStcIixjYWxsYmFjazpcIitlLm1vZGVsLmNhbGxiYWNrK1wiLGV4cHJlc3Npb246XCIrZS5tb2RlbC5leHByZXNzaW9uK1wifSxcIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuWzBdO2lmKG4mJjE9PT1uLnR5cGUpe3ZhciByPVBhKG4sdC5vcHRpb25zKTtyZXR1cm5cImlubGluZVRlbXBsYXRlOntyZW5kZXI6ZnVuY3Rpb24oKXtcIityLnJlbmRlcitcIn0sc3RhdGljUmVuZGVyRm5zOltcIityLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuXCJmdW5jdGlvbigpe1wiK2UrXCJ9XCJ9KS5qb2luKFwiLFwiKStcIl19XCJ9fShlLHQpO28mJihuKz1vK1wiLFwiKX1yZXR1cm4gbj1uLnJlcGxhY2UoLywkLyxcIlwiKStcIn1cIixlLmR5bmFtaWNBdHRycyYmKG49XCJfYihcIituKycsXCInK2UudGFnKydcIiwnK0dhKGUuZHluYW1pY0F0dHJzKStcIilcIiksZS53cmFwRGF0YSYmKG49ZS53cmFwRGF0YShuKSksZS53cmFwTGlzdGVuZXJzJiYobj1lLndyYXBMaXN0ZW5lcnMobikpLG59ZnVuY3Rpb24gS2EoZSl7cmV0dXJuIDE9PT1lLnR5cGUmJihcInNsb3RcIj09PWUudGFnfHxlLmNoaWxkcmVuLnNvbWUoS2EpKX1mdW5jdGlvbiBKYShlLHQpe3ZhciBuPWUuYXR0cnNNYXBbXCJzbG90LXNjb3BlXCJdO2lmKGUuaWYmJiFlLmlmUHJvY2Vzc2VkJiYhbilyZXR1cm4gVWEoZSx0LEphLFwibnVsbFwiKTtpZihlLmZvciYmIWUuZm9yUHJvY2Vzc2VkKXJldHVybiB6YShlLHQsSmEpO3ZhciByPWUuc2xvdFNjb3BlPT09Y2E/XCJcIjpTdHJpbmcoZS5zbG90U2NvcGUpLGk9XCJmdW5jdGlvbihcIityK1wiKXtyZXR1cm4gXCIrKFwidGVtcGxhdGVcIj09PWUudGFnP2UuaWYmJm4/XCIoXCIrZS5pZitcIik/XCIrKHFhKGUsdCl8fFwidW5kZWZpbmVkXCIpK1wiOnVuZGVmaW5lZFwiOnFhKGUsdCl8fFwidW5kZWZpbmVkXCI6UmEoZSx0KSkrXCJ9XCIsbz1yP1wiXCI6XCIscHJveHk6dHJ1ZVwiO3JldHVyblwie2tleTpcIisoZS5zbG90VGFyZ2V0fHwnXCJkZWZhdWx0XCInKStcIixmbjpcIitpK28rXCJ9XCJ9ZnVuY3Rpb24gcWEoZSx0LG4scixpKXt2YXIgbz1lLmNoaWxkcmVuO2lmKG8ubGVuZ3RoKXt2YXIgYT1vWzBdO2lmKDE9PT1vLmxlbmd0aCYmYS5mb3ImJlwidGVtcGxhdGVcIiE9PWEudGFnJiZcInNsb3RcIiE9PWEudGFnKXt2YXIgcz1uP3QubWF5YmVDb21wb25lbnQoYSk/XCIsMVwiOlwiLDBcIjpcIlwiO3JldHVyblwiXCIrKHJ8fFJhKShhLHQpK3N9dmFyIGM9bj9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtpZigxPT09aS50eXBlKXtpZihXYShpKXx8aS5pZkNvbmRpdGlvbnMmJmkuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIFdhKGUuYmxvY2spfSkpe249MjticmVha30odChpKXx8aS5pZkNvbmRpdGlvbnMmJmkuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5ibG9jayl9KSkmJihuPTEpfX1yZXR1cm4gbn0obyx0Lm1heWJlQ29tcG9uZW50KTowLHU9aXx8WmE7cmV0dXJuXCJbXCIrby5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSx0KX0pLmpvaW4oXCIsXCIpK1wiXVwiKyhjP1wiLFwiK2M6XCJcIil9fWZ1bmN0aW9uIFdhKGUpe3JldHVybiB2b2lkIDAhPT1lLmZvcnx8XCJ0ZW1wbGF0ZVwiPT09ZS50YWd8fFwic2xvdFwiPT09ZS50YWd9ZnVuY3Rpb24gWmEoZSx0KXtyZXR1cm4gMT09PWUudHlwZT9SYShlLHQpOjM9PT1lLnR5cGUmJmUuaXNDb21tZW50PyhyPWUsXCJfZShcIitKU09OLnN0cmluZ2lmeShyLnRleHQpK1wiKVwiKTpcIl92KFwiKygyPT09KG49ZSkudHlwZT9uLmV4cHJlc3Npb246WGEoSlNPTi5zdHJpbmdpZnkobi50ZXh0KSkpK1wiKVwiO3ZhciBuLHJ9ZnVuY3Rpb24gR2EoZSl7Zm9yKHZhciB0PVwiXCIsbj1cIlwiLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPVhhKGkudmFsdWUpO2kuZHluYW1pYz9uKz1pLm5hbWUrXCIsXCIrbytcIixcIjp0Kz0nXCInK2kubmFtZSsnXCI6JytvK1wiLFwifXJldHVybiB0PVwie1wiK3Quc2xpY2UoMCwtMSkrXCJ9XCIsbj9cIl9kKFwiK3QrXCIsW1wiK24uc2xpY2UoMCwtMSkrXCJdKVwiOnR9ZnVuY3Rpb24gWGEoZSl7cmV0dXJuIGUucmVwbGFjZSgvXFx1MjAyOC9nLFwiXFxcXHUyMDI4XCIpLnJlcGxhY2UoL1xcdTIwMjkvZyxcIlxcXFx1MjAyOVwiKX1uZXcgUmVnRXhwKFwiXFxcXGJcIitcImRvLGlmLGZvcixsZXQsbmV3LHRyeSx2YXIsY2FzZSxlbHNlLHdpdGgsYXdhaXQsYnJlYWssY2F0Y2gsY2xhc3MsY29uc3Qsc3VwZXIsdGhyb3csd2hpbGUseWllbGQsZGVsZXRlLGV4cG9ydCxpbXBvcnQscmV0dXJuLHN3aXRjaCxkZWZhdWx0LGV4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHNcIi5zcGxpdChcIixcIikuam9pbihcIlxcXFxifFxcXFxiXCIpK1wiXFxcXGJcIik7ZnVuY3Rpb24gWWEoZSx0KXt0cnl7cmV0dXJuIG5ldyBGdW5jdGlvbihlKX1jYXRjaChuKXtyZXR1cm4gdC5wdXNoKHtlcnI6bixjb2RlOmV9KSxTfX1mdW5jdGlvbiBRYShlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihuLHIsaSl7KHI9QSh7fSxyKSkud2FybjtkZWxldGUgci53YXJuO3ZhciBvPXIuZGVsaW1pdGVycz9TdHJpbmcoci5kZWxpbWl0ZXJzKStuOm47aWYodFtvXSlyZXR1cm4gdFtvXTt2YXIgYT1lKG4scikscz17fSxjPVtdO3JldHVybiBzLnJlbmRlcj1ZYShhLnJlbmRlcixjKSxzLnN0YXRpY1JlbmRlckZucz1hLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFlhKGUsYyl9KSx0W29dPXN9fXZhciBlcyx0cyxucz0oZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1sYShlLnRyaW0oKSx0KTshMSE9PXQub3B0aW1pemUmJmthKG4sdCk7dmFyIHI9UGEobix0KTtyZXR1cm57YXN0Om4scmVuZGVyOnIucmVuZGVyLHN0YXRpY1JlbmRlckZuczpyLnN0YXRpY1JlbmRlckZuc319LGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXt2YXIgcj1PYmplY3QuY3JlYXRlKGUpLGk9W10sbz1bXTtpZihuKWZvcih2YXIgYSBpbiBuLm1vZHVsZXMmJihyLm1vZHVsZXM9KGUubW9kdWxlc3x8W10pLmNvbmNhdChuLm1vZHVsZXMpKSxuLmRpcmVjdGl2ZXMmJihyLmRpcmVjdGl2ZXM9QShPYmplY3QuY3JlYXRlKGUuZGlyZWN0aXZlc3x8bnVsbCksbi5kaXJlY3RpdmVzKSksbilcIm1vZHVsZXNcIiE9PWEmJlwiZGlyZWN0aXZlc1wiIT09YSYmKHJbYV09blthXSk7ci53YXJuPWZ1bmN0aW9uKGUsdCxuKXsobj9vOmkpLnB1c2goZSl9O3ZhciBzPWVzKHQudHJpbSgpLHIpO3JldHVybiBzLmVycm9ycz1pLHMudGlwcz1vLHN9cmV0dXJue2NvbXBpbGU6dCxjb21waWxlVG9GdW5jdGlvbnM6UWEodCl9fSkoQ2EpLHJzPShucy5jb21waWxlLG5zLmNvbXBpbGVUb0Z1bmN0aW9ucyk7ZnVuY3Rpb24gaXMoZSl7cmV0dXJuKHRzPXRzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5pbm5lckhUTUw9ZT8nPGEgaHJlZj1cIlxcblwiLz4nOic8ZGl2IGE9XCJcXG5cIi8+Jyx0cy5pbm5lckhUTUwuaW5kZXhPZihcIiYjMTA7XCIpPjB9dmFyIG9zPSEheiYmaXMoITEpLGFzPSEheiYmaXMoITApLHNzPWcoZnVuY3Rpb24oZSl7dmFyIHQ9WW4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksY3M9d24ucHJvdG90eXBlLiRtb3VudDtyZXR1cm4gd24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKChlPWUmJlluKGUpKT09PWRvY3VtZW50LmJvZHl8fGU9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy4kb3B0aW9ucztpZighbi5yZW5kZXIpe3ZhciByPW4udGVtcGxhdGU7aWYocilpZihcInN0cmluZ1wiPT10eXBlb2YgcilcIiNcIj09PXIuY2hhckF0KDApJiYocj1zcyhyKSk7ZWxzZXtpZighci5ub2RlVHlwZSlyZXR1cm4gdGhpcztyPXIuaW5uZXJIVE1MfWVsc2UgZSYmKHI9ZnVuY3Rpb24oZSl7aWYoZS5vdXRlckhUTUwpcmV0dXJuIGUub3V0ZXJIVE1MO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKSx0LmlubmVySFRNTH0oZSkpO2lmKHIpe3ZhciBpPXJzKHIse291dHB1dFNvdXJjZVJhbmdlOiExLHNob3VsZERlY29kZU5ld2xpbmVzOm9zLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjphcyxkZWxpbWl0ZXJzOm4uZGVsaW1pdGVycyxjb21tZW50czpuLmNvbW1lbnRzfSx0aGlzKSxvPWkucmVuZGVyLGE9aS5zdGF0aWNSZW5kZXJGbnM7bi5yZW5kZXI9byxuLnN0YXRpY1JlbmRlckZucz1hfX1yZXR1cm4gY3MuY2FsbCh0aGlzLGUsdCl9LHduLmNvbXBpbGU9cnMsd259KTsiLCIvKiFcbiAqIHZ1ZXggdjMuNC4wXG4gKiAoYykgMjAyMCBFdmFuIFlvdVxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYXBwbHlNaXhpbiAoVnVlKSB7XG4gIHZhciB2ZXJzaW9uID0gTnVtYmVyKFZ1ZS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuXG4gIGlmICh2ZXJzaW9uID49IDIpIHtcbiAgICBWdWUubWl4aW4oeyBiZWZvcmVDcmVhdGU6IHZ1ZXhJbml0IH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG92ZXJyaWRlIGluaXQgYW5kIGluamVjdCB2dWV4IGluaXQgcHJvY2VkdXJlXG4gICAgLy8gZm9yIDEueCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICB2YXIgX2luaXQgPSBWdWUucHJvdG90eXBlLl9pbml0O1xuICAgIFZ1ZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgICAgIG9wdGlvbnMuaW5pdCA9IG9wdGlvbnMuaW5pdFxuICAgICAgICA/IFt2dWV4SW5pdF0uY29uY2F0KG9wdGlvbnMuaW5pdClcbiAgICAgICAgOiB2dWV4SW5pdDtcbiAgICAgIF9pbml0LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWdWV4IGluaXQgaG9vaywgaW5qZWN0ZWQgaW50byBlYWNoIGluc3RhbmNlcyBpbml0IGhvb2tzIGxpc3QuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIHZ1ZXhJbml0ICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7XG4gICAgLy8gc3RvcmUgaW5qZWN0aW9uXG4gICAgaWYgKG9wdGlvbnMuc3RvcmUpIHtcbiAgICAgIHRoaXMuJHN0b3JlID0gdHlwZW9mIG9wdGlvbnMuc3RvcmUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLnN0b3JlKClcbiAgICAgICAgOiBvcHRpb25zLnN0b3JlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJlbnQgJiYgb3B0aW9ucy5wYXJlbnQuJHN0b3JlKSB7XG4gICAgICB0aGlzLiRzdG9yZSA9IG9wdGlvbnMucGFyZW50LiRzdG9yZTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHRhcmdldCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gID8gd2luZG93XG4gIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGdsb2JhbFxuICAgIDoge307XG52YXIgZGV2dG9vbEhvb2sgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuZnVuY3Rpb24gZGV2dG9vbFBsdWdpbiAoc3RvcmUpIHtcbiAgaWYgKCFkZXZ0b29sSG9vaykgeyByZXR1cm4gfVxuXG4gIHN0b3JlLl9kZXZ0b29sSG9vayA9IGRldnRvb2xIb29rO1xuXG4gIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6aW5pdCcsIHN0b3JlKTtcblxuICBkZXZ0b29sSG9vay5vbigndnVleDp0cmF2ZWwtdG8tc3RhdGUnLCBmdW5jdGlvbiAodGFyZ2V0U3RhdGUpIHtcbiAgICBzdG9yZS5yZXBsYWNlU3RhdGUodGFyZ2V0U3RhdGUpO1xuICB9KTtcblxuICBzdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG11dGF0aW9uLCBzdGF0ZSkge1xuICAgIGRldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6bXV0YXRpb24nLCBtdXRhdGlvbiwgc3RhdGUpO1xuICB9LCB7IHByZXBlbmQ6IHRydWUgfSk7XG5cbiAgc3RvcmUuc3Vic2NyaWJlQWN0aW9uKGZ1bmN0aW9uIChhY3Rpb24sIHN0YXRlKSB7XG4gICAgZGV2dG9vbEhvb2suZW1pdCgndnVleDphY3Rpb24nLCBhY3Rpb24sIHN0YXRlKTtcbiAgfSwgeyBwcmVwZW5kOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZmlyc3QgaXRlbSB0aGF0IHBhc3MgdGhlIHRlc3RcbiAqIGJ5IHNlY29uZCBhcmd1bWVudCBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEByZXR1cm4geyp9XG4gKi9cblxuLyoqXG4gKiBmb3JFYWNoIGZvciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gZm9yRWFjaFZhbHVlIChvYmosIGZuKSB7XG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBmbihvYmpba2V5XSwga2V5KTsgfSk7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gdmFsICYmIHR5cGVvZiB2YWwudGhlbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5mdW5jdGlvbiBhc3NlcnQgKGNvbmRpdGlvbiwgbXNnKSB7XG4gIGlmICghY29uZGl0aW9uKSB7IHRocm93IG5ldyBFcnJvcigoXCJbdnVleF0gXCIgKyBtc2cpKSB9XG59XG5cbmZ1bmN0aW9uIHBhcnRpYWwgKGZuLCBhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZm4oYXJnKVxuICB9XG59XG5cbi8vIEJhc2UgZGF0YSBzdHJ1Y3QgZm9yIHN0b3JlJ3MgbW9kdWxlLCBwYWNrYWdlIHdpdGggc29tZSBhdHRyaWJ1dGUgYW5kIG1ldGhvZFxudmFyIE1vZHVsZSA9IGZ1bmN0aW9uIE1vZHVsZSAocmF3TW9kdWxlLCBydW50aW1lKSB7XG4gIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7XG4gIC8vIFN0b3JlIHNvbWUgY2hpbGRyZW4gaXRlbVxuICB0aGlzLl9jaGlsZHJlbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIC8vIFN0b3JlIHRoZSBvcmlnaW4gbW9kdWxlIG9iamVjdCB3aGljaCBwYXNzZWQgYnkgcHJvZ3JhbW1lclxuICB0aGlzLl9yYXdNb2R1bGUgPSByYXdNb2R1bGU7XG4gIHZhciByYXdTdGF0ZSA9IHJhd01vZHVsZS5zdGF0ZTtcblxuICAvLyBTdG9yZSB0aGUgb3JpZ2luIG1vZHVsZSdzIHN0YXRlXG4gIHRoaXMuc3RhdGUgPSAodHlwZW9mIHJhd1N0YXRlID09PSAnZnVuY3Rpb24nID8gcmF3U3RhdGUoKSA6IHJhd1N0YXRlKSB8fCB7fTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IG5hbWVzcGFjZWQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLm5hbWVzcGFjZWQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gISF0aGlzLl9yYXdNb2R1bGUubmFtZXNwYWNlZFxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5hZGRDaGlsZCA9IGZ1bmN0aW9uIGFkZENoaWxkIChrZXksIG1vZHVsZSkge1xuICB0aGlzLl9jaGlsZHJlbltrZXldID0gbW9kdWxlO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIHJlbW92ZUNoaWxkIChrZXkpIHtcbiAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW2tleV07XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gZ2V0Q2hpbGQgKGtleSkge1xuICByZXR1cm4gdGhpcy5fY2hpbGRyZW5ba2V5XVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5oYXNDaGlsZCA9IGZ1bmN0aW9uIGhhc0NoaWxkIChrZXkpIHtcbiAgcmV0dXJuIGtleSBpbiB0aGlzLl9jaGlsZHJlblxufTtcblxuTW9kdWxlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUgKHJhd01vZHVsZSkge1xuICB0aGlzLl9yYXdNb2R1bGUubmFtZXNwYWNlZCA9IHJhd01vZHVsZS5uYW1lc3BhY2VkO1xuICBpZiAocmF3TW9kdWxlLmFjdGlvbnMpIHtcbiAgICB0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucyA9IHJhd01vZHVsZS5hY3Rpb25zO1xuICB9XG4gIGlmIChyYXdNb2R1bGUubXV0YXRpb25zKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucyA9IHJhd01vZHVsZS5tdXRhdGlvbnM7XG4gIH1cbiAgaWYgKHJhd01vZHVsZS5nZXR0ZXJzKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLmdldHRlcnMgPSByYXdNb2R1bGUuZ2V0dGVycztcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoQ2hpbGQgPSBmdW5jdGlvbiBmb3JFYWNoQ2hpbGQgKGZuKSB7XG4gIGZvckVhY2hWYWx1ZSh0aGlzLl9jaGlsZHJlbiwgZm4pO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoR2V0dGVyID0gZnVuY3Rpb24gZm9yRWFjaEdldHRlciAoZm4pIHtcbiAgaWYgKHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzLCBmbik7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaEFjdGlvbiA9IGZ1bmN0aW9uIGZvckVhY2hBY3Rpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUuYWN0aW9ucywgZm4pO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hNdXRhdGlvbiA9IGZ1bmN0aW9uIGZvckVhY2hNdXRhdGlvbiAoZm4pIHtcbiAgaWYgKHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucywgZm4pO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTW9kdWxlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbnZhciBNb2R1bGVDb2xsZWN0aW9uID0gZnVuY3Rpb24gTW9kdWxlQ29sbGVjdGlvbiAocmF3Um9vdE1vZHVsZSkge1xuICAvLyByZWdpc3RlciByb290IG1vZHVsZSAoVnVleC5TdG9yZSBvcHRpb25zKVxuICB0aGlzLnJlZ2lzdGVyKFtdLCByYXdSb290TW9kdWxlLCBmYWxzZSk7XG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGgucmVkdWNlKGZ1bmN0aW9uIChtb2R1bGUsIGtleSkge1xuICAgIHJldHVybiBtb2R1bGUuZ2V0Q2hpbGQoa2V5KVxuICB9LCB0aGlzLnJvb3QpXG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS5nZXROYW1lc3BhY2UgPSBmdW5jdGlvbiBnZXROYW1lc3BhY2UgKHBhdGgpIHtcbiAgdmFyIG1vZHVsZSA9IHRoaXMucm9vdDtcbiAgcmV0dXJuIHBhdGgucmVkdWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIGtleSkge1xuICAgIG1vZHVsZSA9IG1vZHVsZS5nZXRDaGlsZChrZXkpO1xuICAgIHJldHVybiBuYW1lc3BhY2UgKyAobW9kdWxlLm5hbWVzcGFjZWQgPyBrZXkgKyAnLycgOiAnJylcbiAgfSwgJycpXG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUkMSAocmF3Um9vdE1vZHVsZSkge1xuICB1cGRhdGUoW10sIHRoaXMucm9vdCwgcmF3Um9vdE1vZHVsZSk7XG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyIChwYXRoLCByYXdNb2R1bGUsIHJ1bnRpbWUpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICBpZiAoIHJ1bnRpbWUgPT09IHZvaWQgMCApIHJ1bnRpbWUgPSB0cnVlO1xuXG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0UmF3TW9kdWxlKHBhdGgsIHJhd01vZHVsZSk7XG4gIH1cblxuICB2YXIgbmV3TW9kdWxlID0gbmV3IE1vZHVsZShyYXdNb2R1bGUsIHJ1bnRpbWUpO1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLnJvb3QgPSBuZXdNb2R1bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBwYXJlbnQuYWRkQ2hpbGQocGF0aFtwYXRoLmxlbmd0aCAtIDFdLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXIgbmVzdGVkIG1vZHVsZXNcbiAgaWYgKHJhd01vZHVsZS5tb2R1bGVzKSB7XG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZS5tb2R1bGVzLCBmdW5jdGlvbiAocmF3Q2hpbGRNb2R1bGUsIGtleSkge1xuICAgICAgdGhpcyQxLnJlZ2lzdGVyKHBhdGguY29uY2F0KGtleSksIHJhd0NoaWxkTW9kdWxlLCBydW50aW1lKTtcbiAgICB9KTtcbiAgfVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIHVucmVnaXN0ZXIgKHBhdGgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgdmFyIGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgaWYgKCFwYXJlbnQuZ2V0Q2hpbGQoa2V5KS5ydW50aW1lKSB7IHJldHVybiB9XG5cbiAgcGFyZW50LnJlbW92ZUNoaWxkKGtleSk7XG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS5pc1JlZ2lzdGVyZWQgPSBmdW5jdGlvbiBpc1JlZ2lzdGVyZWQgKHBhdGgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgdmFyIGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcblxuICByZXR1cm4gcGFyZW50Lmhhc0NoaWxkKGtleSlcbn07XG5cbmZ1bmN0aW9uIHVwZGF0ZSAocGF0aCwgdGFyZ2V0TW9kdWxlLCBuZXdNb2R1bGUpIHtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnRSYXdNb2R1bGUocGF0aCwgbmV3TW9kdWxlKTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSB0YXJnZXQgbW9kdWxlXG4gIHRhcmdldE1vZHVsZS51cGRhdGUobmV3TW9kdWxlKTtcblxuICAvLyB1cGRhdGUgbmVzdGVkIG1vZHVsZXNcbiAgaWYgKG5ld01vZHVsZS5tb2R1bGVzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIG5ld01vZHVsZS5tb2R1bGVzKSB7XG4gICAgICBpZiAoIXRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpKSB7XG4gICAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbdnVleF0gdHJ5aW5nIHRvIGFkZCBhIG5ldyBtb2R1bGUgJ1wiICsga2V5ICsgXCInIG9uIGhvdCByZWxvYWRpbmcsIFwiICtcbiAgICAgICAgICAgICdtYW51YWwgcmVsb2FkIGlzIG5lZWRlZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdXBkYXRlKFxuICAgICAgICBwYXRoLmNvbmNhdChrZXkpLFxuICAgICAgICB0YXJnZXRNb2R1bGUuZ2V0Q2hpbGQoa2V5KSxcbiAgICAgICAgbmV3TW9kdWxlLm1vZHVsZXNba2V5XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGZ1bmN0aW9uQXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uJ1xufTtcblxudmFyIG9iamVjdEFzc2VydCA9IHtcbiAgYXNzZXJ0OiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5oYW5kbGVyID09PSAnZnVuY3Rpb24nKTsgfSxcbiAgZXhwZWN0ZWQ6ICdmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBcImhhbmRsZXJcIiBmdW5jdGlvbidcbn07XG5cbnZhciBhc3NlcnRUeXBlcyA9IHtcbiAgZ2V0dGVyczogZnVuY3Rpb25Bc3NlcnQsXG4gIG11dGF0aW9uczogZnVuY3Rpb25Bc3NlcnQsXG4gIGFjdGlvbnM6IG9iamVjdEFzc2VydFxufTtcblxuZnVuY3Rpb24gYXNzZXJ0UmF3TW9kdWxlIChwYXRoLCByYXdNb2R1bGUpIHtcbiAgT2JqZWN0LmtleXMoYXNzZXJ0VHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghcmF3TW9kdWxlW2tleV0pIHsgcmV0dXJuIH1cblxuICAgIHZhciBhc3NlcnRPcHRpb25zID0gYXNzZXJ0VHlwZXNba2V5XTtcblxuICAgIGZvckVhY2hWYWx1ZShyYXdNb2R1bGVba2V5XSwgZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFzc2VydE9wdGlvbnMuYXNzZXJ0KHZhbHVlKSxcbiAgICAgICAgbWFrZUFzc2VydGlvbk1lc3NhZ2UocGF0aCwga2V5LCB0eXBlLCB2YWx1ZSwgYXNzZXJ0T3B0aW9ucy5leHBlY3RlZClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlQXNzZXJ0aW9uTWVzc2FnZSAocGF0aCwga2V5LCB0eXBlLCB2YWx1ZSwgZXhwZWN0ZWQpIHtcbiAgdmFyIGJ1ZiA9IGtleSArIFwiIHNob3VsZCBiZSBcIiArIGV4cGVjdGVkICsgXCIgYnV0IFxcXCJcIiArIGtleSArIFwiLlwiICsgdHlwZSArIFwiXFxcIlwiO1xuICBpZiAocGF0aC5sZW5ndGggPiAwKSB7XG4gICAgYnVmICs9IFwiIGluIG1vZHVsZSBcXFwiXCIgKyAocGF0aC5qb2luKCcuJykpICsgXCJcXFwiXCI7XG4gIH1cbiAgYnVmICs9IFwiIGlzIFwiICsgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgKyBcIi5cIjtcbiAgcmV0dXJuIGJ1ZlxufVxuXG52YXIgVnVlOyAvLyBiaW5kIG9uIGluc3RhbGxcblxudmFyIFN0b3JlID0gZnVuY3Rpb24gU3RvcmUgKG9wdGlvbnMpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEF1dG8gaW5zdGFsbCBpZiBpdCBpcyBub3QgZG9uZSB5ZXQgYW5kIGB3aW5kb3dgIGhhcyBgVnVlYC5cbiAgLy8gVG8gYWxsb3cgdXNlcnMgdG8gYXZvaWQgYXV0by1pbnN0YWxsYXRpb24gaW4gc29tZSBjYXNlcyxcbiAgLy8gdGhpcyBjb2RlIHNob3VsZCBiZSBwbGFjZWQgaGVyZS4gU2VlICM3MzFcbiAgaWYgKCFWdWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZ1ZSkge1xuICAgIGluc3RhbGwod2luZG93LlZ1ZSk7XG4gIH1cblxuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChWdWUsIFwibXVzdCBjYWxsIFZ1ZS51c2UoVnVleCkgYmVmb3JlIGNyZWF0aW5nIGEgc3RvcmUgaW5zdGFuY2UuXCIpO1xuICAgIGFzc2VydCh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcsIFwidnVleCByZXF1aXJlcyBhIFByb21pc2UgcG9seWZpbGwgaW4gdGhpcyBicm93c2VyLlwiKTtcbiAgICBhc3NlcnQodGhpcyBpbnN0YW5jZW9mIFN0b3JlLCBcInN0b3JlIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvci5cIik7XG4gIH1cblxuICB2YXIgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2luczsgaWYgKCBwbHVnaW5zID09PSB2b2lkIDAgKSBwbHVnaW5zID0gW107XG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDsgaWYgKCBzdHJpY3QgPT09IHZvaWQgMCApIHN0cmljdCA9IGZhbHNlO1xuXG4gIC8vIHN0b3JlIGludGVybmFsIHN0YXRlXG4gIHRoaXMuX2NvbW1pdHRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzID0gW107XG4gIHRoaXMuX211dGF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX3dyYXBwZWRHZXR0ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fbW9kdWxlcyA9IG5ldyBNb2R1bGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICB0aGlzLl9tb2R1bGVzTmFtZXNwYWNlTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fd2F0Y2hlclZNID0gbmV3IFZ1ZSgpO1xuICB0aGlzLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIGJpbmQgY29tbWl0IGFuZCBkaXNwYXRjaCB0byBzZWxmXG4gIHZhciBzdG9yZSA9IHRoaXM7XG4gIHZhciByZWYgPSB0aGlzO1xuICB2YXIgZGlzcGF0Y2ggPSByZWYuZGlzcGF0Y2g7XG4gIHZhciBjb21taXQgPSByZWYuY29tbWl0O1xuICB0aGlzLmRpc3BhdGNoID0gZnVuY3Rpb24gYm91bmREaXNwYXRjaCAodHlwZSwgcGF5bG9hZCkge1xuICAgIHJldHVybiBkaXNwYXRjaC5jYWxsKHN0b3JlLCB0eXBlLCBwYXlsb2FkKVxuICB9O1xuICB0aGlzLmNvbW1pdCA9IGZ1bmN0aW9uIGJvdW5kQ29tbWl0ICh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNvbW1pdC5jYWxsKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBvcHRpb25zKVxuICB9O1xuXG4gIC8vIHN0cmljdCBtb2RlXG4gIHRoaXMuc3RyaWN0ID0gc3RyaWN0O1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX21vZHVsZXMucm9vdC5zdGF0ZTtcblxuICAvLyBpbml0IHJvb3QgbW9kdWxlLlxuICAvLyB0aGlzIGFsc28gcmVjdXJzaXZlbHkgcmVnaXN0ZXJzIGFsbCBzdWItbW9kdWxlc1xuICAvLyBhbmQgY29sbGVjdHMgYWxsIG1vZHVsZSBnZXR0ZXJzIGluc2lkZSB0aGlzLl93cmFwcGVkR2V0dGVyc1xuICBpbnN0YWxsTW9kdWxlKHRoaXMsIHN0YXRlLCBbXSwgdGhpcy5fbW9kdWxlcy5yb290KTtcblxuICAvLyBpbml0aWFsaXplIHRoZSBzdG9yZSB2bSwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHRoZSByZWFjdGl2aXR5XG4gIC8vIChhbHNvIHJlZ2lzdGVycyBfd3JhcHBlZEdldHRlcnMgYXMgY29tcHV0ZWQgcHJvcGVydGllcylcbiAgcmVzZXRTdG9yZVZNKHRoaXMsIHN0YXRlKTtcblxuICAvLyBhcHBseSBwbHVnaW5zXG4gIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7IHJldHVybiBwbHVnaW4odGhpcyQxKTsgfSk7XG5cbiAgdmFyIHVzZURldnRvb2xzID0gb3B0aW9ucy5kZXZ0b29scyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXZ0b29scyA6IFZ1ZS5jb25maWcuZGV2dG9vbHM7XG4gIGlmICh1c2VEZXZ0b29scykge1xuICAgIGRldnRvb2xQbHVnaW4odGhpcyk7XG4gIH1cbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMkMSA9IHsgc3RhdGU6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDEuc3RhdGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fdm0uX2RhdGEuJCRzdGF0ZVxufTtcblxucHJvdG90eXBlQWNjZXNzb3JzJDEuc3RhdGUuc2V0ID0gZnVuY3Rpb24gKHYpIHtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQoZmFsc2UsIFwidXNlIHN0b3JlLnJlcGxhY2VTdGF0ZSgpIHRvIGV4cGxpY2l0IHJlcGxhY2Ugc3RvcmUgc3RhdGUuXCIpO1xuICB9XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuY29tbWl0ID0gZnVuY3Rpb24gY29tbWl0IChfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gY2hlY2sgb2JqZWN0LXN0eWxlIGNvbW1pdFxuICB2YXIgcmVmID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKTtcbiAgICB2YXIgdHlwZSA9IHJlZi50eXBlO1xuICAgIHZhciBwYXlsb2FkID0gcmVmLnBheWxvYWQ7XG4gICAgdmFyIG9wdGlvbnMgPSByZWYub3B0aW9ucztcblxuICB2YXIgbXV0YXRpb24gPSB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQgfTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fbXV0YXRpb25zW3R5cGVdO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIGVudHJ5LmZvckVhY2goZnVuY3Rpb24gY29tbWl0SXRlcmF0b3IgKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIocGF5bG9hZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuX3N1YnNjcmliZXJzXG4gICAgLnNsaWNlKCkgLy8gc2hhbGxvdyBjb3B5IHRvIHByZXZlbnQgaXRlcmF0b3IgaW52YWxpZGF0aW9uIGlmIHN1YnNjcmliZXIgc3luY2hyb25vdXNseSBjYWxscyB1bnN1YnNjcmliZVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1YihtdXRhdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG5cbiAgaWYgKFxuICAgIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiZcbiAgICBvcHRpb25zICYmIG9wdGlvbnMuc2lsZW50XG4gICkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW3Z1ZXhdIG11dGF0aW9uIHR5cGU6IFwiICsgdHlwZSArIFwiLiBTaWxlbnQgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIFwiICtcbiAgICAgICdVc2UgdGhlIGZpbHRlciBmdW5jdGlvbmFsaXR5IGluIHRoZSB2dWUtZGV2dG9vbHMnXG4gICAgKTtcbiAgfVxufTtcblxuU3RvcmUucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2ggKF90eXBlLCBfcGF5bG9hZCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIC8vIGNoZWNrIG9iamVjdC1zdHlsZSBkaXNwYXRjaFxuICB2YXIgcmVmID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQpO1xuICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gICAgdmFyIHBheWxvYWQgPSByZWYucGF5bG9hZDtcblxuICB2YXIgYWN0aW9uID0geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkIH07XG4gIHZhciBlbnRyeSA9IHRoaXMuX2FjdGlvbnNbdHlwZV07XG4gIGlmICghZW50cnkpIHtcbiAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBhY3Rpb24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLl9hY3Rpb25TdWJzY3JpYmVyc1xuICAgICAgLnNsaWNlKCkgLy8gc2hhbGxvdyBjb3B5IHRvIHByZXZlbnQgaXRlcmF0b3IgaW52YWxpZGF0aW9uIGlmIHN1YnNjcmliZXIgc3luY2hyb25vdXNseSBjYWxscyB1bnN1YnNjcmliZVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYmVmb3JlOyB9KVxuICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmJlZm9yZShhY3Rpb24sIHRoaXMkMS5zdGF0ZSk7IH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlt2dWV4XSBlcnJvciBpbiBiZWZvcmUgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSBlbnRyeS5sZW5ndGggPiAxXG4gICAgPyBQcm9taXNlLmFsbChlbnRyeS5tYXAoZnVuY3Rpb24gKGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIocGF5bG9hZCk7IH0pKVxuICAgIDogZW50cnlbMF0ocGF5bG9hZCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXN1bHQudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzJDEuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXI7IH0pXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmFmdGVyKGFjdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGFmdGVyIGFjdGlvbiBzdWJzY3JpYmVyczogXCIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc29sdmUocmVzKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMkMS5fYWN0aW9uU3Vic2NyaWJlcnNcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5lcnJvcjsgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuZXJyb3IoYWN0aW9uLCB0aGlzJDEuc3RhdGUsIGVycm9yKTsgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGVycm9yIGFjdGlvbiBzdWJzY3JpYmVyczogXCIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH0pXG59O1xuXG5TdG9yZS5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gc3Vic2NyaWJlIChmbiwgb3B0aW9ucykge1xuICByZXR1cm4gZ2VuZXJpY1N1YnNjcmliZShmbiwgdGhpcy5fc3Vic2NyaWJlcnMsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUuc3Vic2NyaWJlQWN0aW9uID0gZnVuY3Rpb24gc3Vic2NyaWJlQWN0aW9uIChmbiwgb3B0aW9ucykge1xuICB2YXIgc3VicyA9IHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyA/IHsgYmVmb3JlOiBmbiB9IDogZm47XG4gIHJldHVybiBnZW5lcmljU3Vic2NyaWJlKHN1YnMsIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzLCBvcHRpb25zKVxufTtcblxuU3RvcmUucHJvdG90eXBlLndhdGNoID0gZnVuY3Rpb24gd2F0Y2ggKGdldHRlciwgY2IsIG9wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgZ2V0dGVyID09PSAnZnVuY3Rpb24nLCBcInN0b3JlLndhdGNoIG9ubHkgYWNjZXB0cyBhIGZ1bmN0aW9uLlwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fd2F0Y2hlclZNLiR3YXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBnZXR0ZXIodGhpcyQxLnN0YXRlLCB0aGlzJDEuZ2V0dGVycyk7IH0sIGNiLCBvcHRpb25zKVxufTtcblxuU3RvcmUucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzJDEuX3ZtLl9kYXRhLiQkc3RhdGUgPSBzdGF0ZTtcbiAgfSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVnaXN0ZXJNb2R1bGUgPSBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZSAocGF0aCwgcmF3TW9kdWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeyBwYXRoID0gW3BhdGhdOyB9XG5cbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShwYXRoKSwgXCJtb2R1bGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5LlwiKTtcbiAgICBhc3NlcnQocGF0aC5sZW5ndGggPiAwLCAnY2Fubm90IHJlZ2lzdGVyIHRoZSByb290IG1vZHVsZSBieSB1c2luZyByZWdpc3Rlck1vZHVsZS4nKTtcbiAgfVxuXG4gIHRoaXMuX21vZHVsZXMucmVnaXN0ZXIocGF0aCwgcmF3TW9kdWxlKTtcbiAgaW5zdGFsbE1vZHVsZSh0aGlzLCB0aGlzLnN0YXRlLCBwYXRoLCB0aGlzLl9tb2R1bGVzLmdldChwYXRoKSwgb3B0aW9ucy5wcmVzZXJ2ZVN0YXRlKTtcbiAgLy8gcmVzZXQgc3RvcmUgdG8gdXBkYXRlIGdldHRlcnMuLi5cbiAgcmVzZXRTdG9yZVZNKHRoaXMsIHRoaXMuc3RhdGUpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnVucmVnaXN0ZXJNb2R1bGUgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyTW9kdWxlIChwYXRoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeyBwYXRoID0gW3BhdGhdOyB9XG5cbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShwYXRoKSwgXCJtb2R1bGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5LlwiKTtcbiAgfVxuXG4gIHRoaXMuX21vZHVsZXMudW5yZWdpc3RlcihwYXRoKTtcbiAgdGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudFN0YXRlID0gZ2V0TmVzdGVkU3RhdGUodGhpcyQxLnN0YXRlLCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgVnVlLmRlbGV0ZShwYXJlbnRTdGF0ZSwgcGF0aFtwYXRoLmxlbmd0aCAtIDFdKTtcbiAgfSk7XG4gIHJlc2V0U3RvcmUodGhpcyk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuaGFzTW9kdWxlID0gZnVuY3Rpb24gaGFzTW9kdWxlIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHsgcGF0aCA9IFtwYXRoXTsgfVxuXG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGF0aCksIFwibW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBBcnJheS5cIik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbW9kdWxlcy5pc1JlZ2lzdGVyZWQocGF0aClcbn07XG5cblN0b3JlLnByb3RvdHlwZS5ob3RVcGRhdGUgPSBmdW5jdGlvbiBob3RVcGRhdGUgKG5ld09wdGlvbnMpIHtcbiAgdGhpcy5fbW9kdWxlcy51cGRhdGUobmV3T3B0aW9ucyk7XG4gIHJlc2V0U3RvcmUodGhpcywgdHJ1ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuX3dpdGhDb21taXQgPSBmdW5jdGlvbiBfd2l0aENvbW1pdCAoZm4pIHtcbiAgdmFyIGNvbW1pdHRpbmcgPSB0aGlzLl9jb21taXR0aW5nO1xuICB0aGlzLl9jb21taXR0aW5nID0gdHJ1ZTtcbiAgZm4oKTtcbiAgdGhpcy5fY29tbWl0dGluZyA9IGNvbW1pdHRpbmc7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU3RvcmUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMkMSApO1xuXG5mdW5jdGlvbiBnZW5lcmljU3Vic2NyaWJlIChmbiwgc3Vicywgb3B0aW9ucykge1xuICBpZiAoc3Vicy5pbmRleE9mKGZuKSA8IDApIHtcbiAgICBvcHRpb25zICYmIG9wdGlvbnMucHJlcGVuZFxuICAgICAgPyBzdWJzLnVuc2hpZnQoZm4pXG4gICAgICA6IHN1YnMucHVzaChmbik7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaSA9IHN1YnMuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgc3Vicy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RvcmUgKHN0b3JlLCBob3QpIHtcbiAgc3RvcmUuX2FjdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzdG9yZS5fbXV0YXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc3RvcmUuX3dyYXBwZWRHZXR0ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgc3RhdGUgPSBzdG9yZS5zdGF0ZTtcbiAgLy8gaW5pdCBhbGwgbW9kdWxlc1xuICBpbnN0YWxsTW9kdWxlKHN0b3JlLCBzdGF0ZSwgW10sIHN0b3JlLl9tb2R1bGVzLnJvb3QsIHRydWUpO1xuICAvLyByZXNldCB2bVxuICByZXNldFN0b3JlVk0oc3RvcmUsIHN0YXRlLCBob3QpO1xufVxuXG5mdW5jdGlvbiByZXNldFN0b3JlVk0gKHN0b3JlLCBzdGF0ZSwgaG90KSB7XG4gIHZhciBvbGRWbSA9IHN0b3JlLl92bTtcblxuICAvLyBiaW5kIHN0b3JlIHB1YmxpYyBnZXR0ZXJzXG4gIHN0b3JlLmdldHRlcnMgPSB7fTtcbiAgLy8gcmVzZXQgbG9jYWwgZ2V0dGVycyBjYWNoZVxuICBzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIHdyYXBwZWRHZXR0ZXJzID0gc3RvcmUuX3dyYXBwZWRHZXR0ZXJzO1xuICB2YXIgY29tcHV0ZWQgPSB7fTtcbiAgZm9yRWFjaFZhbHVlKHdyYXBwZWRHZXR0ZXJzLCBmdW5jdGlvbiAoZm4sIGtleSkge1xuICAgIC8vIHVzZSBjb21wdXRlZCB0byBsZXZlcmFnZSBpdHMgbGF6eS1jYWNoaW5nIG1lY2hhbmlzbVxuICAgIC8vIGRpcmVjdCBpbmxpbmUgZnVuY3Rpb24gdXNlIHdpbGwgbGVhZCB0byBjbG9zdXJlIHByZXNlcnZpbmcgb2xkVm0uXG4gICAgLy8gdXNpbmcgcGFydGlhbCB0byByZXR1cm4gZnVuY3Rpb24gd2l0aCBvbmx5IGFyZ3VtZW50cyBwcmVzZXJ2ZWQgaW4gY2xvc3VyZSBlbnZpcm9ubWVudC5cbiAgICBjb21wdXRlZFtrZXldID0gcGFydGlhbChmbiwgc3RvcmUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdG9yZS5nZXR0ZXJzLCBrZXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuX3ZtW2tleV07IH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlIC8vIGZvciBsb2NhbCBnZXR0ZXJzXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIHVzZSBhIFZ1ZSBpbnN0YW5jZSB0byBzdG9yZSB0aGUgc3RhdGUgdHJlZVxuICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgaGFzIGFkZGVkXG4gIC8vIHNvbWUgZnVua3kgZ2xvYmFsIG1peGluc1xuICB2YXIgc2lsZW50ID0gVnVlLmNvbmZpZy5zaWxlbnQ7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gdHJ1ZTtcbiAgc3RvcmUuX3ZtID0gbmV3IFZ1ZSh7XG4gICAgZGF0YToge1xuICAgICAgJCRzdGF0ZTogc3RhdGVcbiAgICB9LFxuICAgIGNvbXB1dGVkOiBjb21wdXRlZFxuICB9KTtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSBzaWxlbnQ7XG5cbiAgLy8gZW5hYmxlIHN0cmljdCBtb2RlIGZvciBuZXcgdm1cbiAgaWYgKHN0b3JlLnN0cmljdCkge1xuICAgIGVuYWJsZVN0cmljdE1vZGUoc3RvcmUpO1xuICB9XG5cbiAgaWYgKG9sZFZtKSB7XG4gICAgaWYgKGhvdCkge1xuICAgICAgLy8gZGlzcGF0Y2ggY2hhbmdlcyBpbiBhbGwgc3Vic2NyaWJlZCB3YXRjaGVyc1xuICAgICAgLy8gdG8gZm9yY2UgZ2V0dGVyIHJlLWV2YWx1YXRpb24gZm9yIGhvdCByZWxvYWRpbmcuXG4gICAgICBzdG9yZS5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9sZFZtLl9kYXRhLiQkc3RhdGUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFZ1ZS5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJldHVybiBvbGRWbS4kZGVzdHJveSgpOyB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsTW9kdWxlIChzdG9yZSwgcm9vdFN0YXRlLCBwYXRoLCBtb2R1bGUsIGhvdCkge1xuICB2YXIgaXNSb290ID0gIXBhdGgubGVuZ3RoO1xuICB2YXIgbmFtZXNwYWNlID0gc3RvcmUuX21vZHVsZXMuZ2V0TmFtZXNwYWNlKHBhdGgpO1xuXG4gIC8vIHJlZ2lzdGVyIGluIG5hbWVzcGFjZSBtYXBcbiAgaWYgKG1vZHVsZS5uYW1lc3BhY2VkKSB7XG4gICAgaWYgKHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV0gJiYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gZHVwbGljYXRlIG5hbWVzcGFjZSBcIiArIG5hbWVzcGFjZSArIFwiIGZvciB0aGUgbmFtZXNwYWNlZCBtb2R1bGUgXCIgKyAocGF0aC5qb2luKCcvJykpKSk7XG4gICAgfVxuICAgIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV0gPSBtb2R1bGU7XG4gIH1cblxuICAvLyBzZXQgc3RhdGVcbiAgaWYgKCFpc1Jvb3QgJiYgIWhvdCkge1xuICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldE5lc3RlZFN0YXRlKHJvb3RTdGF0ZSwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIHZhciBtb2R1bGVOYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIHN0b3JlLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgIGlmIChtb2R1bGVOYW1lIGluIHBhcmVudFN0YXRlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgKFwiW3Z1ZXhdIHN0YXRlIGZpZWxkIFxcXCJcIiArIG1vZHVsZU5hbWUgKyBcIlxcXCIgd2FzIG92ZXJyaWRkZW4gYnkgYSBtb2R1bGUgd2l0aCB0aGUgc2FtZSBuYW1lIGF0IFxcXCJcIiArIChwYXRoLmpvaW4oJy4nKSkgKyBcIlxcXCJcIilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBWdWUuc2V0KHBhcmVudFN0YXRlLCBtb2R1bGVOYW1lLCBtb2R1bGUuc3RhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGxvY2FsID0gbW9kdWxlLmNvbnRleHQgPSBtYWtlTG9jYWxDb250ZXh0KHN0b3JlLCBuYW1lc3BhY2UsIHBhdGgpO1xuXG4gIG1vZHVsZS5mb3JFYWNoTXV0YXRpb24oZnVuY3Rpb24gKG11dGF0aW9uLCBrZXkpIHtcbiAgICB2YXIgbmFtZXNwYWNlZFR5cGUgPSBuYW1lc3BhY2UgKyBrZXk7XG4gICAgcmVnaXN0ZXJNdXRhdGlvbihzdG9yZSwgbmFtZXNwYWNlZFR5cGUsIG11dGF0aW9uLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoQWN0aW9uKGZ1bmN0aW9uIChhY3Rpb24sIGtleSkge1xuICAgIHZhciB0eXBlID0gYWN0aW9uLnJvb3QgPyBrZXkgOiBuYW1lc3BhY2UgKyBrZXk7XG4gICAgdmFyIGhhbmRsZXIgPSBhY3Rpb24uaGFuZGxlciB8fCBhY3Rpb247XG4gICAgcmVnaXN0ZXJBY3Rpb24oc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hHZXR0ZXIoZnVuY3Rpb24gKGdldHRlciwga2V5KSB7XG4gICAgdmFyIG5hbWVzcGFjZWRUeXBlID0gbmFtZXNwYWNlICsga2V5O1xuICAgIHJlZ2lzdGVyR2V0dGVyKHN0b3JlLCBuYW1lc3BhY2VkVHlwZSwgZ2V0dGVyLCBsb2NhbCk7XG4gIH0pO1xuXG4gIG1vZHVsZS5mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNoaWxkLCBrZXkpIHtcbiAgICBpbnN0YWxsTW9kdWxlKHN0b3JlLCByb290U3RhdGUsIHBhdGguY29uY2F0KGtleSksIGNoaWxkLCBob3QpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBtYWtlIGxvY2FsaXplZCBkaXNwYXRjaCwgY29tbWl0LCBnZXR0ZXJzIGFuZCBzdGF0ZVxuICogaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlLCBqdXN0IHVzZSByb290IG9uZXNcbiAqL1xuZnVuY3Rpb24gbWFrZUxvY2FsQ29udGV4dCAoc3RvcmUsIG5hbWVzcGFjZSwgcGF0aCkge1xuICB2YXIgbm9OYW1lc3BhY2UgPSBuYW1lc3BhY2UgPT09ICcnO1xuXG4gIHZhciBsb2NhbCA9IHtcbiAgICBkaXNwYXRjaDogbm9OYW1lc3BhY2UgPyBzdG9yZS5kaXNwYXRjaCA6IGZ1bmN0aW9uIChfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKSB7XG4gICAgICB2YXIgYXJncyA9IHVuaWZ5T2JqZWN0U3R5bGUoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucyk7XG4gICAgICB2YXIgcGF5bG9hZCA9IGFyZ3MucGF5bG9hZDtcbiAgICAgIHZhciBvcHRpb25zID0gYXJncy5vcHRpb25zO1xuICAgICAgdmFyIHR5cGUgPSBhcmdzLnR5cGU7XG5cbiAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5yb290KSB7XG4gICAgICAgIHR5cGUgPSBuYW1lc3BhY2UgKyB0eXBlO1xuICAgICAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhc3RvcmUuX2FjdGlvbnNbdHlwZV0pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGxvY2FsIGFjdGlvbiB0eXBlOiBcIiArIChhcmdzLnR5cGUpICsgXCIsIGdsb2JhbCB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2godHlwZSwgcGF5bG9hZClcbiAgICB9LFxuXG4gICAgY29tbWl0OiBub05hbWVzcGFjZSA/IHN0b3JlLmNvbW1pdCA6IGZ1bmN0aW9uIChfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKSB7XG4gICAgICB2YXIgYXJncyA9IHVuaWZ5T2JqZWN0U3R5bGUoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucyk7XG4gICAgICB2YXIgcGF5bG9hZCA9IGFyZ3MucGF5bG9hZDtcbiAgICAgIHZhciBvcHRpb25zID0gYXJncy5vcHRpb25zO1xuICAgICAgdmFyIHR5cGUgPSBhcmdzLnR5cGU7XG5cbiAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5yb290KSB7XG4gICAgICAgIHR5cGUgPSBuYW1lc3BhY2UgKyB0eXBlO1xuICAgICAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhc3RvcmUuX211dGF0aW9uc1t0eXBlXSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbG9jYWwgbXV0YXRpb24gdHlwZTogXCIgKyAoYXJncy50eXBlKSArIFwiLCBnbG9iYWwgdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RvcmUuY29tbWl0KHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICAvLyBnZXR0ZXJzIGFuZCBzdGF0ZSBvYmplY3QgbXVzdCBiZSBnb3R0ZW4gbGF6aWx5XG4gIC8vIGJlY2F1c2UgdGhleSB3aWxsIGJlIGNoYW5nZWQgYnkgdm0gdXBkYXRlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxvY2FsLCB7XG4gICAgZ2V0dGVyczoge1xuICAgICAgZ2V0OiBub05hbWVzcGFjZVxuICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0b3JlLmdldHRlcnM7IH1cbiAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBtYWtlTG9jYWxHZXR0ZXJzKHN0b3JlLCBuYW1lc3BhY2UpOyB9XG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXROZXN0ZWRTdGF0ZShzdG9yZS5zdGF0ZSwgcGF0aCk7IH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBsb2NhbFxufVxuXG5mdW5jdGlvbiBtYWtlTG9jYWxHZXR0ZXJzIChzdG9yZSwgbmFtZXNwYWNlKSB7XG4gIGlmICghc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtuYW1lc3BhY2VdKSB7XG4gICAgdmFyIGdldHRlcnNQcm94eSA9IHt9O1xuICAgIHZhciBzcGxpdFBvcyA9IG5hbWVzcGFjZS5sZW5ndGg7XG4gICAgT2JqZWN0LmtleXMoc3RvcmUuZ2V0dGVycykuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgLy8gc2tpcCBpZiB0aGUgdGFyZ2V0IGdldHRlciBpcyBub3QgbWF0Y2ggdGhpcyBuYW1lc3BhY2VcbiAgICAgIGlmICh0eXBlLnNsaWNlKDAsIHNwbGl0UG9zKSAhPT0gbmFtZXNwYWNlKSB7IHJldHVybiB9XG5cbiAgICAgIC8vIGV4dHJhY3QgbG9jYWwgZ2V0dGVyIHR5cGVcbiAgICAgIHZhciBsb2NhbFR5cGUgPSB0eXBlLnNsaWNlKHNwbGl0UG9zKTtcblxuICAgICAgLy8gQWRkIGEgcG9ydCB0byB0aGUgZ2V0dGVycyBwcm94eS5cbiAgICAgIC8vIERlZmluZSBhcyBnZXR0ZXIgcHJvcGVydHkgYmVjYXVzZVxuICAgICAgLy8gd2UgZG8gbm90IHdhbnQgdG8gZXZhbHVhdGUgdGhlIGdldHRlcnMgaW4gdGhpcyB0aW1lLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdldHRlcnNQcm94eSwgbG9jYWxUeXBlLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuZ2V0dGVyc1t0eXBlXTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtuYW1lc3BhY2VdID0gZ2V0dGVyc1Byb3h5O1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbbmFtZXNwYWNlXVxufVxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGF0aW9uIChzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpIHtcbiAgdmFyIGVudHJ5ID0gc3RvcmUuX211dGF0aW9uc1t0eXBlXSB8fCAoc3RvcmUuX211dGF0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkTXV0YXRpb25IYW5kbGVyIChwYXlsb2FkKSB7XG4gICAgaGFuZGxlci5jYWxsKHN0b3JlLCBsb2NhbC5zdGF0ZSwgcGF5bG9hZCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckFjdGlvbiAoc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKSB7XG4gIHZhciBlbnRyeSA9IHN0b3JlLl9hY3Rpb25zW3R5cGVdIHx8IChzdG9yZS5fYWN0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkQWN0aW9uSGFuZGxlciAocGF5bG9hZCkge1xuICAgIHZhciByZXMgPSBoYW5kbGVyLmNhbGwoc3RvcmUsIHtcbiAgICAgIGRpc3BhdGNoOiBsb2NhbC5kaXNwYXRjaCxcbiAgICAgIGNvbW1pdDogbG9jYWwuY29tbWl0LFxuICAgICAgZ2V0dGVyczogbG9jYWwuZ2V0dGVycyxcbiAgICAgIHN0YXRlOiBsb2NhbC5zdGF0ZSxcbiAgICAgIHJvb3RHZXR0ZXJzOiBzdG9yZS5nZXR0ZXJzLFxuICAgICAgcm9vdFN0YXRlOiBzdG9yZS5zdGF0ZVxuICAgIH0sIHBheWxvYWQpO1xuICAgIGlmICghaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcyA9IFByb21pc2UucmVzb2x2ZShyZXMpO1xuICAgIH1cbiAgICBpZiAoc3RvcmUuX2RldnRvb2xIb29rKSB7XG4gICAgICByZXR1cm4gcmVzLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgc3RvcmUuX2RldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6ZXJyb3InLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckdldHRlciAoc3RvcmUsIHR5cGUsIHJhd0dldHRlciwgbG9jYWwpIHtcbiAgaWYgKHN0b3JlLl93cmFwcGVkR2V0dGVyc1t0eXBlXSkge1xuICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBkdXBsaWNhdGUgZ2V0dGVyIGtleTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIHN0b3JlLl93cmFwcGVkR2V0dGVyc1t0eXBlXSA9IGZ1bmN0aW9uIHdyYXBwZWRHZXR0ZXIgKHN0b3JlKSB7XG4gICAgcmV0dXJuIHJhd0dldHRlcihcbiAgICAgIGxvY2FsLnN0YXRlLCAvLyBsb2NhbCBzdGF0ZVxuICAgICAgbG9jYWwuZ2V0dGVycywgLy8gbG9jYWwgZ2V0dGVyc1xuICAgICAgc3RvcmUuc3RhdGUsIC8vIHJvb3Qgc3RhdGVcbiAgICAgIHN0b3JlLmdldHRlcnMgLy8gcm9vdCBnZXR0ZXJzXG4gICAgKVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbmFibGVTdHJpY3RNb2RlIChzdG9yZSkge1xuICBzdG9yZS5fdm0uJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RhdGEuJCRzdGF0ZSB9LCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGFzc2VydChzdG9yZS5fY29tbWl0dGluZywgXCJkbyBub3QgbXV0YXRlIHZ1ZXggc3RvcmUgc3RhdGUgb3V0c2lkZSBtdXRhdGlvbiBoYW5kbGVycy5cIik7XG4gICAgfVxuICB9LCB7IGRlZXA6IHRydWUsIHN5bmM6IHRydWUgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZFN0YXRlIChzdGF0ZSwgcGF0aCkge1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCBrZXkpIHsgcmV0dXJuIHN0YXRlW2tleV07IH0sIHN0YXRlKVxufVxuXG5mdW5jdGlvbiB1bmlmeU9iamVjdFN0eWxlICh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKSB7XG4gIGlmIChpc09iamVjdCh0eXBlKSAmJiB0eXBlLnR5cGUpIHtcbiAgICBvcHRpb25zID0gcGF5bG9hZDtcbiAgICBwYXlsb2FkID0gdHlwZTtcbiAgICB0eXBlID0gdHlwZS50eXBlO1xuICB9XG5cbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnLCAoXCJleHBlY3RzIHN0cmluZyBhcyB0aGUgdHlwZSwgYnV0IGZvdW5kIFwiICsgKHR5cGVvZiB0eXBlKSArIFwiLlwiKSk7XG4gIH1cblxuICByZXR1cm4geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkLCBvcHRpb25zOiBvcHRpb25zIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoX1Z1ZSkge1xuICBpZiAoVnVlICYmIF9WdWUgPT09IFZ1ZSkge1xuICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3Z1ZXhdIGFscmVhZHkgaW5zdGFsbGVkLiBWdWUudXNlKFZ1ZXgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIFZ1ZSA9IF9WdWU7XG4gIGFwcGx5TWl4aW4oVnVlKTtcbn1cblxuLyoqXG4gKiBSZWR1Y2UgdGhlIGNvZGUgd2hpY2ggd3JpdHRlbiBpbiBWdWUuanMgZm9yIGdldHRpbmcgdGhlIHN0YXRlLlxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gc3RhdGVzICMgT2JqZWN0J3MgaXRlbSBjYW4gYmUgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHQgc3RhdGUgYW5kIGdldHRlcnMgZm9yIHBhcmFtLCB5b3UgY2FuIGRvIHNvbWV0aGluZyBmb3Igc3RhdGUgYW5kIGdldHRlcnMgaW4gaXQuXG4gKiBAcGFyYW0ge09iamVjdH1cbiAqL1xudmFyIG1hcFN0YXRlID0gbm9ybWFsaXplTmFtZXNwYWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIHN0YXRlcykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFpc1ZhbGlkTWFwKHN0YXRlcykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbdnVleF0gbWFwU3RhdGU6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKHN0YXRlcykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZFN0YXRlICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IHRoaXMuJHN0b3JlLnN0YXRlO1xuICAgICAgdmFyIGdldHRlcnMgPSB0aGlzLiRzdG9yZS5nZXR0ZXJzO1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgbW9kdWxlID0gZ2V0TW9kdWxlQnlOYW1lc3BhY2UodGhpcy4kc3RvcmUsICdtYXBTdGF0ZScsIG5hbWVzcGFjZSk7XG4gICAgICAgIGlmICghbW9kdWxlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUgPSBtb2R1bGUuY29udGV4dC5zdGF0ZTtcbiAgICAgICAgZ2V0dGVycyA9IG1vZHVsZS5jb250ZXh0LmdldHRlcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5jYWxsKHRoaXMsIHN0YXRlLCBnZXR0ZXJzKVxuICAgICAgICA6IHN0YXRlW3ZhbF1cbiAgICB9O1xuICAgIC8vIG1hcmsgdnVleCBnZXR0ZXIgZm9yIGRldnRvb2xzXG4gICAgcmVzW2tleV0udnVleCA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLyoqXG4gKiBSZWR1Y2UgdGhlIGNvZGUgd2hpY2ggd3JpdHRlbiBpbiBWdWUuanMgZm9yIGNvbW1pdHRpbmcgdGhlIG11dGF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBtdXRhdGlvbnMgIyBPYmplY3QncyBpdGVtIGNhbiBiZSBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdCBgY29tbWl0YCBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgcGFyYW0sIGl0IGNhbiBhY2NlcHQgYW50aG9yIHBhcmFtcy4gWW91IGNhbiBjb21taXQgbXV0YXRpb24gYW5kIGRvIGFueSBvdGhlciB0aGluZ3MgaW4gdGhpcyBmdW5jdGlvbi4gc3BlY2lhbGx5LCBZb3UgbmVlZCB0byBwYXNzIGFudGhvciBwYXJhbXMgZnJvbSB0aGUgbWFwcGVkIGZ1bmN0aW9uLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwTXV0YXRpb25zID0gbm9ybWFsaXplTmFtZXNwYWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIG11dGF0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFpc1ZhbGlkTWFwKG11dGF0aW9ucykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbdnVleF0gbWFwTXV0YXRpb25zOiBtYXBwZXIgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCcpO1xuICB9XG4gIG5vcm1hbGl6ZU1hcChtdXRhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbiBtYXBwZWRNdXRhdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgLy8gR2V0IHRoZSBjb21taXQgbWV0aG9kIGZyb20gc3RvcmVcbiAgICAgIHZhciBjb21taXQgPSB0aGlzLiRzdG9yZS5jb21taXQ7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcE11dGF0aW9ucycsIG5hbWVzcGFjZSk7XG4gICAgICAgIGlmICghbW9kdWxlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0ID0gbW9kdWxlLmNvbnRleHQuY29tbWl0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB2YWwuYXBwbHkodGhpcywgW2NvbW1pdF0uY29uY2F0KGFyZ3MpKVxuICAgICAgICA6IGNvbW1pdC5hcHBseSh0aGlzLiRzdG9yZSwgW3ZhbF0uY29uY2F0KGFyZ3MpKVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLyoqXG4gKiBSZWR1Y2UgdGhlIGNvZGUgd2hpY2ggd3JpdHRlbiBpbiBWdWUuanMgZm9yIGdldHRpbmcgdGhlIGdldHRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGdldHRlcnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIG1hcEdldHRlcnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgZ2V0dGVycykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFpc1ZhbGlkTWFwKGdldHRlcnMpKSB7XG4gICAgY29uc29sZS5lcnJvcignW3Z1ZXhdIG1hcEdldHRlcnM6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKGdldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgLy8gVGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBtdXRhdGVkIGJ5IG5vcm1hbGl6ZU5hbWVzcGFjZVxuICAgIHZhbCA9IG5hbWVzcGFjZSArIHZhbDtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEdldHRlciAoKSB7XG4gICAgICBpZiAobmFtZXNwYWNlICYmICFnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEdldHRlcnMnLCBuYW1lc3BhY2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgISh2YWwgaW4gdGhpcy4kc3RvcmUuZ2V0dGVycykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBnZXR0ZXI6IFwiICsgdmFsKSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuJHN0b3JlLmdldHRlcnNbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZGlzcGF0Y2ggdGhlIGFjdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gYWN0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBkaXNwYXRjaGAgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtLCBpdCBjYW4gYWNjZXB0IGFudGhvciBwYXJhbXMuIFlvdSBjYW4gZGlzcGF0Y2ggYWN0aW9uIGFuZCBkbyBhbnkgb3RoZXIgdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24uIHNwZWNpYWxseSwgWW91IG5lZWQgdG8gcGFzcyBhbnRob3IgcGFyYW1zIGZyb20gdGhlIG1hcHBlZCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIG1hcEFjdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgYWN0aW9ucykge1xuICB2YXIgcmVzID0ge307XG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFpc1ZhbGlkTWFwKGFjdGlvbnMpKSB7XG4gICAgY29uc29sZS5lcnJvcignW3Z1ZXhdIG1hcEFjdGlvbnM6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKGFjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbiBtYXBwZWRBY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIC8vIGdldCBkaXNwYXRjaCBmdW5jdGlvbiBmcm9tIHN0b3JlXG4gICAgICB2YXIgZGlzcGF0Y2ggPSB0aGlzLiRzdG9yZS5kaXNwYXRjaDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwQWN0aW9ucycsIG5hbWVzcGFjZSk7XG4gICAgICAgIGlmICghbW9kdWxlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2ggPSBtb2R1bGUuY29udGV4dC5kaXNwYXRjaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmFwcGx5KHRoaXMsIFtkaXNwYXRjaF0uY29uY2F0KGFyZ3MpKVxuICAgICAgICA6IGRpc3BhdGNoLmFwcGx5KHRoaXMuJHN0b3JlLCBbdmFsXS5jb25jYXQoYXJncykpXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlYmluZGluZyBuYW1lc3BhY2UgcGFyYW0gZm9yIG1hcFhYWCBmdW5jdGlvbiBpbiBzcGVjaWFsIHNjb3BlZCwgYW5kIHJldHVybiB0aGVtIGJ5IHNpbXBsZSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudmFyIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSkgeyByZXR1cm4gKHtcbiAgbWFwU3RhdGU6IG1hcFN0YXRlLmJpbmQobnVsbCwgbmFtZXNwYWNlKSxcbiAgbWFwR2V0dGVyczogbWFwR2V0dGVycy5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcE11dGF0aW9uczogbWFwTXV0YXRpb25zLmJpbmQobnVsbCwgbmFtZXNwYWNlKSxcbiAgbWFwQWN0aW9uczogbWFwQWN0aW9ucy5iaW5kKG51bGwsIG5hbWVzcGFjZSlcbn0pOyB9O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgbWFwXG4gKiBub3JtYWxpemVNYXAoWzEsIDIsIDNdKSA9PiBbIHsga2V5OiAxLCB2YWw6IDEgfSwgeyBrZXk6IDIsIHZhbDogMiB9LCB7IGtleTogMywgdmFsOiAzIH0gXVxuICogbm9ybWFsaXplTWFwKHthOiAxLCBiOiAyLCBjOiAzfSkgPT4gWyB7IGtleTogJ2EnLCB2YWw6IDEgfSwgeyBrZXk6ICdiJywgdmFsOiAyIH0sIHsga2V5OiAnYycsIHZhbDogMyB9IF1cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBtYXBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWFwIChtYXApIHtcbiAgaWYgKCFpc1ZhbGlkTWFwKG1hcCkpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShtYXApXG4gICAgPyBtYXAubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuICh7IGtleToga2V5LCB2YWw6IGtleSB9KTsgfSlcbiAgICA6IE9iamVjdC5rZXlzKG1hcCkubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuICh7IGtleToga2V5LCB2YWw6IG1hcFtrZXldIH0pOyB9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHdoZXRoZXIgZ2l2ZW4gbWFwIGlzIHZhbGlkIG9yIG5vdFxuICogQHBhcmFtIHsqfSBtYXBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRNYXAgKG1hcCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShtYXApIHx8IGlzT2JqZWN0KG1hcClcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiBleHBlY3QgdHdvIHBhcmFtIGNvbnRhaW5zIG5hbWVzcGFjZSBhbmQgbWFwLiBpdCB3aWxsIG5vcm1hbGl6ZSB0aGUgbmFtZXNwYWNlIGFuZCB0aGVuIHRoZSBwYXJhbSdzIGZ1bmN0aW9uIHdpbGwgaGFuZGxlIHRoZSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgbWFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lc3BhY2UgKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobmFtZXNwYWNlLCBtYXApIHtcbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG1hcCA9IG5hbWVzcGFjZTtcbiAgICAgIG5hbWVzcGFjZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlLmNoYXJBdChuYW1lc3BhY2UubGVuZ3RoIC0gMSkgIT09ICcvJykge1xuICAgICAgbmFtZXNwYWNlICs9ICcvJztcbiAgICB9XG4gICAgcmV0dXJuIGZuKG5hbWVzcGFjZSwgbWFwKVxuICB9XG59XG5cbi8qKlxuICogU2VhcmNoIGEgc3BlY2lhbCBtb2R1bGUgZnJvbSBzdG9yZSBieSBuYW1lc3BhY2UuIGlmIG1vZHVsZSBub3QgZXhpc3QsIHByaW50IGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RvcmVcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWxwZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlQnlOYW1lc3BhY2UgKHN0b3JlLCBoZWxwZXIsIG5hbWVzcGFjZSkge1xuICB2YXIgbW9kdWxlID0gc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXBbbmFtZXNwYWNlXTtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgIW1vZHVsZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIG1vZHVsZSBuYW1lc3BhY2Ugbm90IGZvdW5kIGluIFwiICsgaGVscGVyICsgXCIoKTogXCIgKyBuYW1lc3BhY2UpKTtcbiAgfVxuICByZXR1cm4gbW9kdWxlXG59XG5cbnZhciBpbmRleF9janMgPSB7XG4gIFN0b3JlOiBTdG9yZSxcbiAgaW5zdGFsbDogaW5zdGFsbCxcbiAgdmVyc2lvbjogJzMuNC4wJyxcbiAgbWFwU3RhdGU6IG1hcFN0YXRlLFxuICBtYXBNdXRhdGlvbnM6IG1hcE11dGF0aW9ucyxcbiAgbWFwR2V0dGVyczogbWFwR2V0dGVycyxcbiAgbWFwQWN0aW9uczogbWFwQWN0aW9ucyxcbiAgY3JlYXRlTmFtZXNwYWNlZEhlbHBlcnM6IGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluZGV4X2NqcztcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPW1zLWJ1dHRvbi1zZXQgOmNsYXNzPVxcXCJ7J21zLWJ1dHRvbi1zZXQtLW92YWwnOiBvdmFsQnV0dG9ufVxcXCI+PGRpdiB2LWZvcj1cXFwiKGIsIGkpIGluIGJ1dHRvbnNcXFwiIGNsYXNzPW1zLWJ1dHRvbi1zZXRfYnV0dG9uLWNvbnRhaW5lciA6Y2xhc3M9XFxcInsnbXMtYnV0dG9uLXNldF9idXR0b24tY29udGFpbmVyLS1pY29uJzogYi5pY29ufVxcXCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24tY2hlY2tib3ggdi1tb2RlbD12YWx1ZXNbaV0gQGNoYW5nZT1jaGFuZ2UoaSkgOmRpc2FibGVkPWIuZGlzYWJsZWQ+PGRpdiBjbGFzcz1tcy1idXR0b24tc2V0X2J1dHRvbi1jb250ZW50PjxzcGFuIHYtaWY9Yi5pY29uIGNsYXNzPW1zLWJ1dHRvbi1zZXRfYnV0dG9uLWljb24gOmNsYXNzPVxcXCInbXMtYnV0dG9uLXNldF9idXR0b24taWNvbi0tJytiLmljb25cXFwiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24tdGV4dD57e2IubGFiZWx9fTwvc3Bhbj4gPHNwYW4gdi1pZj1iLm1vYmlsZUxhYmVsIGNsYXNzPW1zLWJ1dHRvbi1zZXRfYnV0dG9uLW1vYmlsZS10ZXh0Pnt7Yi5tb2JpbGVMYWJlbH19PC9zcGFuPjxkaXYgdi1pZj1iLmRpc2FibGVkIGNsYXNzPW1zLWJ1dHRvbi1zZXRfYnV0dG9uLW5vdGljZT57e2Rpc2FibGVkTWVzc2FnZX19PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiB2LWlmPWRhdGEubG9hZGluZ01lc3NhZ2UgY2xhc3M9bXMtbG9hZGluZ19jb250YWluZXI+PGRpdiBjbGFzcz1tcy1sb2FkaW5nX3RleHQ+e3tkYXRhLmxvYWRpbmdNZXNzYWdlfX08L2Rpdj48L2Rpdj48ZGl2IHYtZWxzZS1pZj1kYXRhLnNlYXJjaFJlc3VsdHM+PGNvbXBvbmVudCA6aXM9Y29tcG9uZW50IHYtZm9yPVxcXCJpdGVtIGluIGRhdGEuc2VhcmNoUmVzdWx0cy5SZXN1bHRzXFxcIiA6aXRlbT1pdGVtIDpzZWxlY3RlZC11bml0PXNlbGVjdGVkVW5pdCA6a2V5PWl0ZW0uaWQgOnZpZXctcHJvZHVjdC1sYWJlbD12aWV3UHJvZHVjdExhYmVsPjwvZGl2PlwiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXY+PG1zLWZyYW1lLXNlcGFyYXRvciB2LWlmPXNob3dUaXRsZSA6dGl0bGU9b3B0aW9ucy5xdWVzdGlvbj48L21zLWZyYW1lLXNlcGFyYXRvcj48bXMtYnV0dG9uLXNldCB2LWlmPW9wdGlvbnMuYnV0dG9uIDprZXk9a2V5IDpidXR0b25zPW9wdGlvbnMuYnV0dG9uIDptdWx0aXBsZT1vcHRpb25zLm11bHRpcGxlIDpvdmFsLWJ1dHRvbj1vcHRpb25zLm92YWxCdXR0b24gOmRpc2FibGVkLW1lc3NhZ2U9b3B0aW9ucy5kaXNhYmxlZE1lc3NhZ2UgOm9uLWNoYW5nZT1vbkNoYW5nZSA6ZGVmYXVsdC12YWx1ZT1kZWZhdWx0VmFsdWVzIDpvbi10cmlnZ2VyLWV2ZW50PW9uVHJpZ2dlckFuc3dlckV2ZW50PjwvbXMtYnV0dG9uLXNldD48bXMtaW5wdXQtYm94IHYtZWxzZSA6a2V5PWtleSA6dGl0bGU9b3B0aW9ucy5maWx0ZXJOYW1lIDpkZXNjcmlwdGlvbj1vcHRpb25zLnF1ZXN0aW9uIDpzd2l0Y2hlcj1vcHRpb25zLm9wdGlvbnMgOmRyb3Bkb3duLW9wdGlvbnM9ZHJvcGRvd25PcHRpb25zIDppbnB1dD1pbnB1dCA6b24tY2hhbmdlPW9uQ2hhbmdlIDpkZWZhdWx0LXZhbHVlPWRlZmF1bHRWYWx1ZXMgOm9uLXRyaWdnZXItZXZlbnQ9b25UcmlnZ2VyQW5zd2VyRXZlbnQ+PC9tcy1pbnB1dC1ib3g+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1tcy1mcmFtZV9zZXBhcmF0b3I+PGRpdiB2LWlmPXRpdGxlIGNsYXNzPW1zLWZyYW1lX3NlcGFyYXRvci10aXRsZS1jb250YWluZXI+PGgzIGNsYXNzPW1zLWZyYW1lX3NlcGFyYXRvci10aXRsZT57e3RpdGxlfX08L2gzPjwvZGl2PjwvZGl2PlwiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9bXMtZnJhbWUgOmNsYXNzPVxcXCJ7J21zLWZyYW1lLS1sYXRlcmFsLWJhcic6IGlzTGF0ZXJhbEJhciwgJ21zLWZyYW1lLS10cmFuc3BhcmVudCc6IHRyYW5zcGFyZW50fVxcXCI+PGRpdiB2LWlmPWlzTGF0ZXJhbEJhciBjbGFzcz1tcy1mcmFtZV9tb2JpbGUtaGVhZGVyPjxhIGNsYXNzPW1zLWZyYW1lX21vYmlsZS1jbG9zZS1idXR0b24gQGNsaWNrPW9wZW4+e3ttb2JpbGVCdXR0b25MYWJlbH19PC9hPjwvZGl2PjxkaXYgdi1pZj10aXRsZSBjbGFzcz1tcy1mcmFtZV90aXRsZS1jb250YWluZXI+PGg0IGNsYXNzPW1zLWZyYW1lX3RpdGxlPnt7dGl0bGV9fTwvaDQ+PC9kaXY+PGRpdiBjbGFzcz1tcy1mcmFtZV9jb250YWluZXI+PGRpdiB2LWlmPW1lc3NhZ2Ugdi1odG1sPW1lc3NhZ2UgY2xhc3M9bXMtZnJhbWVfbWVzc2FnZT48L2Rpdj48ZGl2IHYtZWxzZSBjbGFzcz1tcy1mcmFtZV9jb250ZW50PjxzbG90Pjwvc2xvdD48L2Rpdj48ZGl2IHYtaWY9bm90aWNlIHYtaHRtbD1ub3RpY2UgY2xhc3M9bXMtZnJhbWVfbm90aWNlPjwvZGl2PjxkaXYgdi1pZj1oYXNCdXR0b25zIGNsYXNzPW1zLWZyYW1lX2J1dHRvbi1jb250YWluZXI+PGEgdi1pZj1oYXNDb250YWN0QnV0dG9uIGhyZWY9I21ldGVyc2VsZWN0b3IgY2xhc3M9XFxcIm1zLWZyYW1lX2J1dHRvbiBtcy1mcmFtZV9idXR0b24tLWNvbnRhY3RcXFwiPnt7Y29udGFjdEJ1dHRvbi5sYWJlbH19PC9hPiA8YnV0dG9uIHYtaWY9aGFzQnV0dG9uIGNsYXNzPW1zLWZyYW1lX2J1dHRvbiA6Y2xhc3M9XFxcInsnbXMtZnJhbWVfYnV0dG9uLS1wYXJhbWV0ZXJzJzogaGFzUGFyYW1ldGVyc0J1dHRvbn1cXFwiIDpkaXNhYmxlZD1kaXNhYmxlQnV0dG9uIEBjbGljaz1jbGlja0J1dHRvbj57e2J1dHRvbkxhYmVsfX08L2J1dHRvbj48L2Rpdj48L2Rpdj48YSB2LWlmPWNhbmNlbEJ1dHRvbkxhYmVsIGNsYXNzPW1zLWZyYW1lX2NhbmNlbC1idXR0b24gQGNsaWNrPWNhbmNlbD57e2NhbmNlbEJ1dHRvbkxhYmVsfX08L2E+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1tcy1pbnB1dC1ib3g+PGRpdiBjbGFzcz1tcy1pbnB1dC1ib3hfdG9wLWNvbnRlbnQ+PGRpdiBjbGFzcz1tcy1pbnB1dC1ib3hfdGl0bGUtY29udGFpbmVyPjxoNCBjbGFzcz1tcy1pbnB1dC1ib3hfdGl0bGU+e3t0aXRsZX19PC9oND48L2Rpdj48ZGl2IHYtaWY9c3dpdGNoZXJGaWVsZCBjbGFzcz1tcy1pbnB1dC1ib3hfc3dpdGNoZXItY29udGFpbmVyPjxpbnB1dCB2LW1vZGVsPXN3aXRjaGVyVmFsdWUgdHlwZT1jaGVja2JveCBjbGFzcz1tcy1pbnB1dC1ib3hfc3dpdGNoZXItaW5wdXQ+PGRpdiBjbGFzcz1tcy1pbnB1dC1ib3hfc3dpdGNoZXItbGFiZWwtY29udGFpbmVyPjxzcGFuPnt7c3dpdGNoZXJGaWVsZC5sZWZ0LmxhYmVsfX08L3NwYW4+IDxzcGFuPnt7c3dpdGNoZXJGaWVsZC5yaWdodC5sYWJlbH19PC9zcGFuPjwvZGl2PjwvZGl2PjxkaXYgdi1pZj1kZXNjcmlwdGlvbiBjbGFzcz1tcy1pbnB1dC1ib3hfZGVzY3JpcHRpb24tY29udGFpbmVyPnt7ZGVzY3JpcHRpb259fTwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9bXMtaW5wdXQtYm94X2JvdHRvbS1jb250ZW50PjxkaXYgdi1pZj1kcm9wZG93bkZpZWxkIGNsYXNzPW1zLWlucHV0LWJveF9kcm9wZG93bi1jb250YWluZXI+PHNlbGVjdCB2LW1vZGVsPWRyb3Bkb3duVmFsdWU+PG9wdGlvbiB2LWZvcj1cXFwibyBpbiBkcm9wZG93bkZpZWxkLm9wdGlvbnNcXFwiIDp2YWx1ZT1vLnZhbHVlPnt7IG8ubGFiZWwgfX08L29wdGlvbj48L3NlbGVjdD48L2Rpdj48ZGl2IHYtaWY9aW5wdXRGaWVsZCBjbGFzcz1tcy1pbnB1dC1ib3hfaW5wdXQtY29udGFpbmVyPjxkaXYgY2xhc3M9bXMtaW5wdXQtYm94X2lucHV0LXRpdGxlPjxzcGFuIDppcz1pbnB1dFRpdGxlIDpvcHRpb249b3B0aW9uPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPW1zLWlucHV0LWJveF90ZXh0LWlucHV0LWNvbnRhaW5lciA6Y2xhc3M9XFxcInsgJ21zLWlucHV0LWJveF90ZXh0LWlucHV0LWNvbnRhaW5lci0tZXJyb3InOiBpbnB1dEVycm9yTWVzc2FnZSB9XFxcIj48aW5wdXQgdi1tb2RlbD1pbnB1dFZhbHVlIHR5cGU9dGV4dCBjbGFzcz1tcy1pbnB1dC1ib3hfdGV4dC1pbnB1dCA6cGxhY2Vob2xkZXI9aW5wdXRGaWVsZC5wbGFjZWhvbGRlciBAYmx1cj1vbkJsdXJJbnB1dD48L2Rpdj48ZGl2IHYtaWY9aW5wdXRFcnJvck1lc3NhZ2UgY2xhc3M9bXMtaW5wdXQtYm94X3RleHQtaW5wdXQtZXJyb3I+e3tpbnB1dEVycm9yTWVzc2FnZX19PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiB2LWlmPVxcXCIoZGF0YS5maXJzdExvYWQgJiYgaXNTaG93KSB8fCBkYXRhLm5leHRQYWdlXFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwicHJvZHVjdC1jYXJkLWhvciBtZXRlci1zZWxlY3Rvcl9fcHJvZHVjdC1jYXJkLWhvclxcXCI+PGRpdiBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX193cmFwcGVyPjxkaXYgY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fcm93PjxkaXYgY2xhc3M9XFxcInByb2R1Y3QtY2FyZC1ob3JfX2FyZWEgcHJvZHVjdC1jYXJkLWhvcl9fYXJlYS11dGlsc1xcXCI+PGJvb2ttYXJrIGlubGluZS10ZW1wbGF0ZSA6aXRlbT1pdGVtPjxkaXYgY2xhc3M9XFxcInByb2R1Y3QtY2FyZC1ob3JfX3V0aWwgcHJvZHVjdC1jYXJkLWhvcl9fdXRpbC1ib29rbWFya1xcXCIgdi1vbjpjbGljaz1oYW5kbGVCb29rbWFyaygpPjxzcGFuIGNsYXNzPXByb2R1Y3QtY2FyZC1ob3JfX2Jvb2ttYXJrIDpkYXRhLXByb2R1Y3QtaWQ9aXRlbS5pZCByZWY9Ym9va21hcmsgOmNsYXNzPVxcXCJ7YWN0aXZlOiBpc0Jvb2ttYXJrZWR9XFxcIj48L3NwYW4+PC9kaXY+PC9ib29rbWFyaz48L2Rpdj48ZGl2IGNsYXNzPVxcXCJwcm9kdWN0LWNhcmQtaG9yX19hcmVhIHByb2R1Y3QtY2FyZC1ob3JfX2FyZWEtaW1hZ2VcXFwiPjxkaXYgY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9faW1hZ2UtY29udGFpbmVyIDpzdHlsZT1cXFwieydiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgnK2l0ZW0ucHJvZHVjdEltYWdlVXJsKycpJ31cXFwiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XFxcInByb2R1Y3QtY2FyZC1ob3JfX2FyZWEgcHJvZHVjdC1jYXJkLWhvcl9fYXJlYS1jb250ZW50XFxcIj48ZGl2PjxzcGFuIGNsYXNzPXByb2R1Y3QtY2FyZC1ob3JfX2V5ZWJyb3c+PGltZyA6c3JjPWl0ZW0uYnJhbmRJbWFnZVVybCA6YWx0PWl0ZW0uYnJhbmRJbWFnZVVybEFsdFRleHQgY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fZXllYnJvdy1pbWFnZT48L3NwYW4+PHAgY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fdGl0bGUgdi1odG1sPWl0ZW0ucHJvZHVjdE5hbWU+PC9wPjxkaXYgY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fY29weSB2LWh0bWw9aXRlbS5wcm9kdWN0RGVzY3JpcHRpb24+PC9kaXY+PGRpdiBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX19jdGE+PGEgOmhyZWY9aXRlbS51cmwgY2xhc3M9XFxcImJ1dHRvbiB0ZXJ0aWFyeS1idXR0b25cXFwiPjxzcGFuIGNsYXNzPWJ1dHRvbi10ZXh0Pnt7dmlld1Byb2R1Y3RMYWJlbH19PC9zcGFuPiA8c3BhbiBjbGFzcz1idXR0b24taWNvbj48L3NwYW4+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PlwiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkPjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkX19yb3c+PGRpdiBjbGFzcz1cXFwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS11dGlsXFxcIj48Ym9va21hcmsgaW5saW5lLXRlbXBsYXRlIDppdGVtPWl0ZW0+PGRpdiBjbGFzcz1jYXRhbG9nLWNhcmRfX3V0aWwtYm9va21hcms+PHNwYW4gY2xhc3M9Y2F0YWxvZy1jYXJkX19ib29rbWFyayA6ZGF0YS1wcm9kdWN0LWlkPWl0ZW0uaWQgcmVmPWJvb2ttYXJrIHYtb246Y2xpY2s9aGFuZGxlQm9va21hcmsoKSA6Y2xhc3M9XFxcInthY3RpdmU6IGlzQm9va21hcmtlZH1cXFwiPjwvc3Bhbj48L2Rpdj48L2Jvb2ttYXJrPjwvZGl2PjxkaXYgY2xhc3M9XFxcImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtaGVhZGVyXFxcIj48ZGl2IGNsYXNzPWNhdGFsb2ctY2FyZF9faW1hZ2UtY29udGFpbmVyPjxhIDpocmVmPWl0ZW0udXJsIGNsYXNzPWNhdGFsb2ctY2FyZF9faW1hZ2UtbGluaz48aW1nIGNsYXNzPWNhdGFsb2ctY2FyZF9faW1hZ2UgOnNyYz1pdGVtLnByb2R1Y3RJbWFnZVVybCA6YWx0PWl0ZW0ucHJvZHVjdEltYWdlVXJsQWx0VGV4dD48L2E+PC9kaXY+PGltZyA6c3JjPWl0ZW0uYnJhbmRJbWFnZVVybCA6YWx0PWl0ZW0uYnJhbmRJbWFnZVVybEFsdFRleHQgY2xhc3M9Y2F0YWxvZy1jYXJkX19sb2dvPjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkX190aXRsZSB2LWh0bWw9aXRlbS5wcm9kdWN0TmFtZT48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPVxcXCJjYXRhbG9nLWNhcmRfX2FyZWEgY2F0YWxvZy1jYXJkX19hcmVhLXN0YXRzXFxcIj48ZGl2IHYtZm9yPVxcXCJzdGF0IGluIGl0ZW0uc3RhdHNcXFwiIGNsYXNzPWNhdGFsb2ctY2FyZF9fc3RhdD48ZGl2IGNsYXNzPWNhdGFsb2ctY2FyZF9fc3RhdC1sYWJlbCB2LWh0bWw9c3RhdC5sYWJlbD48L2Rpdj48ZGl2IGNsYXNzPWNhdGFsb2ctY2FyZF9fc3RhdC12YWx1ZT48ZGl2IGNsYXNzPXVuaXQtbWV0cmljIHYtaWY9XFxcInNlbGVjdGVkVW5pdCA9PT0gJ21ldHJpYydcXFwiIHYtaHRtbD1zdGF0LnZhbHVlTWV0cmljPjwvZGl2PjxkaXYgY2xhc3M9dW5pdC11cyB2LWlmPVxcXCJzZWxlY3RlZFVuaXQgPT09ICd1cydcXFwiIHYtaHRtbD1zdGF0LnZhbHVlSW1wZXJpYWw+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cXFwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS1jdGFcXFwiPjxhIDpocmVmPWl0ZW0udXJsIGNsYXNzPVxcXCJidXR0b24gdGVydGlhcnktYnV0dG9uXFxcIj48c3BhbiBjbGFzcz1idXR0b24tdGV4dD57e3ZpZXdQcm9kdWN0TGFiZWx9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9YnV0dG9uLWljb24+PC9zcGFuPjwvYT48L2Rpdj48L2Rpdj48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPW1zLXN0ZXAtYmFyIDpjbGFzcz1yb290Q2xhc3Nlcz48dWwgcmVmPWxpc3QgY2xhc3M9bXMtc3RlcC1iYXJfc3RlcC1saXN0PjxsaSB2LWZvcj1cXFwiKHMsIGkpIGluIGdldFN0ZXBzXFxcIiA6Y2xhc3M9cy5jbGFzc2VzIEBjbGljaz1vbkNsaWNrU3RlcChpKT48ZGl2IGNsYXNzPW1zLXN0ZXAtYmFyX2l0ZW0tY29udGVudD48c3Bhbj57e3MubGFiZWx9fTwvc3Bhbj48c3BhbiBjbGFzcz1tcy1zdGVwLWJhcl9pdGVtLXNlbGVjdGVkLXZhbHVlIHYtaWY9cy5zZWxlY3RlZFZhbHVlPnt7cy5zZWxlY3RlZFZhbHVlfX08L3NwYW4+PC9kaXY+PC9saT48L3VsPjwvZGl2PlwiO1xuIl19"}