{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/animejs/lib/anime.js","node_modules/core-js/modules/_a-function.js","node_modules/core-js/modules/_advance-string-index.js","node_modules/core-js/modules/_an-object.js","node_modules/core-js/modules/_classof.js","node_modules/core-js/modules/_cof.js","node_modules/core-js/modules/_core.js","node_modules/core-js/modules/_ctx.js","node_modules/core-js/modules/_defined.js","node_modules/core-js/modules/_descriptors.js","node_modules/core-js/modules/_dom-create.js","node_modules/core-js/modules/_export.js","node_modules/core-js/modules/_fails.js","node_modules/core-js/modules/_fix-re-wks.js","node_modules/core-js/modules/_flags.js","node_modules/core-js/modules/_function-to-string.js","node_modules/core-js/modules/_global.js","node_modules/core-js/modules/_has.js","node_modules/core-js/modules/_hide.js","node_modules/core-js/modules/_ie8-dom-define.js","node_modules/core-js/modules/_is-object.js","node_modules/core-js/modules/_is-regexp.js","node_modules/core-js/modules/_library.js","node_modules/core-js/modules/_object-dp.js","node_modules/core-js/modules/_property-desc.js","node_modules/core-js/modules/_redefine.js","node_modules/core-js/modules/_regexp-exec-abstract.js","node_modules/core-js/modules/_regexp-exec.js","node_modules/core-js/modules/_shared.js","node_modules/core-js/modules/_species-constructor.js","node_modules/core-js/modules/_string-at.js","node_modules/core-js/modules/_string-html.js","node_modules/core-js/modules/_to-integer.js","node_modules/core-js/modules/_to-length.js","node_modules/core-js/modules/_to-object.js","node_modules/core-js/modules/_to-primitive.js","node_modules/core-js/modules/_uid.js","node_modules/core-js/modules/_wks.js","node_modules/core-js/modules/es6.regexp.exec.js","node_modules/core-js/modules/es6.regexp.match.js","node_modules/core-js/modules/es6.regexp.replace.js","node_modules/core-js/modules/es6.regexp.split.js","node_modules/core-js/modules/es6.string.link.js","node_modules/js-cookie/src/js.cookie.js","node_modules/throttle-debounce/dist/index.cjs.js","src/dev/js/_alert-banner.js","src/dev/js/_animations.js","src/dev/js/_annuities-table.js","src/dev/js/_cloudinary-video-modal.js","src/dev/js/_cloudinary.js","src/dev/js/_daily-market.js","src/dev/js/_form-validate.js","src/dev/js/_investment-types.js","src/dev/js/_login-modal.js","src/dev/js/_nav.js","src/dev/js/_phone-slider.js","src/dev/js/_quotemedia.js","src/dev/js/_subnav.js","src/dev/js/_tabs-2col.js","src/dev/js/_video-modal.js","src/dev/js/main.js","src/dev/js/polyfills/NodeList.forEach.js"],"names":[],"mappings":"AAAA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClwCA;AACA;AACA;AACA;AACA;;ACJA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;;ACFA;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;;ACLA;AACA;AACA;AACA;AACA;;ACJA;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;AACA;AACA;;AC3CA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;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;;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;;AC/BA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;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;;ACnBA;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;;ACZA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"main.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 -1;\n}\n\nfunction applyArguments(func, args) {\n return func.apply(null, args);\n}\n\nvar is = {\n arr: function (a) { return Array.isArray(a); },\n obj: function (a) { return stringContains(Object.prototype.toString.call(a), 'Object'); },\n pth: function (a) { return is.obj(a) && a.hasOwnProperty('totalLength'); },\n svg: function (a) { return a instanceof SVGElement; },\n inp: function (a) { return a instanceof HTMLInputElement; },\n dom: function (a) { return a.nodeType || is.svg(a); },\n str: function (a) { return typeof a === 'string'; },\n fnc: function (a) { return typeof a === 'function'; },\n und: function (a) { return typeof a === 'undefined'; },\n hex: function (a) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a); },\n rgb: function (a) { return /^rgb/.test(a); },\n hsl: function (a) { return /^hsl/.test(a); },\n col: function (a) { return (is.hex(a) || is.rgb(a) || is.hsl(a)); },\n key: function (a) { return !defaultInstanceSettings.hasOwnProperty(a) && !defaultTweenSettings.hasOwnProperty(a) && a !== 'targets' && a !== 'keyframes'; }\n};\n\n// Easings\n\nfunction parseEasingParameters(string) {\n var match = /\\(([^)]+)\\)/.exec(string);\n return match ? match[1].split(',').map(function (p) { return parseFloat(p); }) : [];\n}\n\n// Spring solver inspired by Webkit Copyright © 2016 Apple Inc. All rights reserved. https://webkit.org/demos/spring/spring.js\n\nfunction spring(string, duration) {\n\n var params = parseEasingParameters(string);\n var mass = minMax(is.und(params[0]) ? 1 : params[0], .1, 100);\n var stiffness = minMax(is.und(params[1]) ? 100 : params[1], .1, 100);\n var damping = minMax(is.und(params[2]) ? 10 : params[2], .1, 100);\n var velocity = minMax(is.und(params[3]) ? 0 : params[3], .1, 100);\n var w0 = Math.sqrt(stiffness / mass);\n var zeta = damping / (2 * Math.sqrt(stiffness * mass));\n var wd = zeta < 1 ? w0 * Math.sqrt(1 - zeta * zeta) : 0;\n var a = 1;\n var b = zeta < 1 ? (zeta * w0 + -velocity) / wd : -velocity + w0;\n\n function solver(t) {\n var progress = duration ? (duration * t) / 1000 : t;\n if (zeta < 1) {\n progress = Math.exp(-progress * zeta * w0) * (a * Math.cos(wd * progress) + b * Math.sin(wd * progress));\n } else {\n progress = (a + b * progress) * Math.exp(-progress * w0);\n }\n if (t === 0 || t === 1) { return t; }\n return 1 - progress;\n }\n\n function getDuration() {\n var cached = cache.springs[string];\n if (cached) { return cached; }\n var frame = 1/6;\n var elapsed = 0;\n var rest = 0;\n while(true) {\n elapsed += frame;\n if (solver(elapsed) === 1) {\n rest++;\n if (rest >= 16) { break; }\n } else {\n rest = 0;\n }\n }\n var duration = elapsed * frame * 1000;\n cache.springs[string] = duration;\n return duration;\n }\n\n return duration ? solver : getDuration;\n\n}\n\n// Basic steps easing implementation https://developer.mozilla.org/fr/docs/Web/CSS/transition-timing-function\n\nfunction steps(steps) {\n if ( steps === void 0 ) steps = 10;\n\n return function (t) { return Math.round(t * steps) * (1 / steps); };\n}\n\n// BezierEasing https://github.com/gre/bezier-easing\n\nvar bezier = (function () {\n\n var kSplineTableSize = 11;\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\n function A(aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1 }\n function B(aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1 }\n function C(aA1) { return 3.0 * aA1 }\n\n function calcBezier(aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT }\n function getSlope(aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1) }\n\n function binarySubdivide(aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) { aB = currentT; } else { aA = currentT; }\n } while (Math.abs(currentX) > 0.0000001 && ++i < 10);\n return currentT;\n }\n\n function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < 4; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) { return aGuessT; }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n }\n\n function bezier(mX1, mY1, mX2, mY2) {\n\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { return; }\n var sampleValues = new Float32Array(kSplineTableSize);\n\n if (mX1 !== mY1 || mX2 !== mY2) {\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n }\n\n function getTForX(aX) {\n\n var intervalStart = 0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n\n --currentSample;\n\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n var initialSlope = getSlope(guessForT, mX1, mX2);\n\n if (initialSlope >= 0.001) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n\n }\n\n return function (x) {\n if (mX1 === mY1 && mX2 === mY2) { return x; }\n if (x === 0 || x === 1) { return x; }\n return calcBezier(getTForX(x), mY1, mY2);\n }\n\n }\n\n return bezier;\n\n})();\n\nvar penner = (function () {\n\n // Based on jQuery UI's implemenation of easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\n var eases = { linear: function () { return function (t) { return t; }; } };\n\n var functionEasings = {\n Sine: function () { return function (t) { return 1 - Math.cos(t * Math.PI / 2); }; },\n Circ: function () { return function (t) { return 1 - Math.sqrt(1 - t * t); }; },\n Back: function () { return function (t) { return t * t * (3 * t - 2); }; },\n Bounce: function () { return function (t) {\n var pow2, b = 4;\n while (t < (( pow2 = Math.pow(2, --b)) - 1) / 11) {}\n return 1 / Math.pow(4, 3 - b) - 7.5625 * Math.pow(( pow2 * 3 - 2 ) / 22 - t, 2)\n }; },\n Elastic: function (amplitude, period) {\n if ( amplitude === void 0 ) amplitude = 1;\n if ( period === void 0 ) period = .5;\n\n var a = minMax(amplitude, 1, 10);\n var p = minMax(period, .1, 2);\n return function (t) {\n return (t === 0 || t === 1) ? t : \n -a * Math.pow(2, 10 * (t - 1)) * Math.sin((((t - 1) - (p / (Math.PI * 2) * Math.asin(1 / a))) * (Math.PI * 2)) / p);\n }\n }\n };\n\n var baseEasings = ['Quad', 'Cubic', 'Quart', 'Quint', 'Expo'];\n\n baseEasings.forEach(function (name, i) {\n functionEasings[name] = function () { return function (t) { return Math.pow(t, i + 2); }; };\n });\n\n Object.keys(functionEasings).forEach(function (name) {\n var easeIn = functionEasings[name];\n eases['easeIn' + name] = easeIn;\n eases['easeOut' + name] = function (a, b) { return function (t) { return 1 - easeIn(a, b)(1 - t); }; };\n eases['easeInOut' + name] = function (a, b) { return function (t) { return t < 0.5 ? easeIn(a, b)(t * 2) / 2 : \n 1 - easeIn(a, b)(t * -2 + 2) / 2; }; };\n });\n\n return eases;\n\n})();\n\nfunction parseEasings(easing, duration) {\n if (is.fnc(easing)) { return easing; }\n var name = easing.split('(')[0];\n var ease = penner[name];\n var args = parseEasingParameters(easing);\n switch (name) {\n case 'spring' : return spring(easing, duration);\n case 'cubicBezier' : return applyArguments(bezier, args);\n case 'steps' : return applyArguments(steps, args);\n default : return applyArguments(ease, args);\n }\n}\n\n// Strings\n\nfunction selectString(str) {\n try {\n var nodes = document.querySelectorAll(str);\n return nodes;\n } catch(e) {\n return;\n }\n}\n\n// Arrays\n\nfunction filterArray(arr, callback) {\n var len = arr.length;\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n var result = [];\n for (var i = 0; i < len; i++) {\n if (i in arr) {\n var val = arr[i];\n if (callback.call(thisArg, val, i, arr)) {\n result.push(val);\n }\n }\n }\n return result;\n}\n\nfunction flattenArray(arr) {\n return arr.reduce(function (a, b) { return a.concat(is.arr(b) ? flattenArray(b) : b); }, []);\n}\n\nfunction toArray(o) {\n if (is.arr(o)) { return o; }\n if (is.str(o)) { o = selectString(o) || o; }\n if (o instanceof NodeList || o instanceof HTMLCollection) { return [].slice.call(o); }\n return [o];\n}\n\nfunction arrayContains(arr, val) {\n return arr.some(function (a) { return a === val; });\n}\n\n// Objects\n\nfunction cloneObject(o) {\n var clone = {};\n for (var p in o) { clone[p] = o[p]; }\n return clone;\n}\n\nfunction replaceObjectProps(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o1) { o[p] = o2.hasOwnProperty(p) ? o2[p] : o1[p]; }\n return o;\n}\n\nfunction mergeObjects(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o2) { o[p] = is.und(o1[p]) ? o2[p] : o1[p]; }\n return o;\n}\n\n// Colors\n\nfunction rgbToRgba(rgbValue) {\n var rgb = /rgb\\((\\d+,\\s*[\\d]+,\\s*[\\d]+)\\)/g.exec(rgbValue);\n return rgb ? (\"rgba(\" + (rgb[1]) + \",1)\") : rgbValue;\n}\n\nfunction hexToRgba(hexValue) {\n var rgx = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n var hex = hexValue.replace(rgx, function (m, r, g, b) { return r + r + g + g + b + b; } );\n var rgb = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n var r = parseInt(rgb[1], 16);\n var g = parseInt(rgb[2], 16);\n var b = parseInt(rgb[3], 16);\n return (\"rgba(\" + r + \",\" + g + \",\" + b + \",1)\");\n}\n\nfunction hslToRgba(hslValue) {\n var hsl = /hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(hslValue) || /hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(hslValue);\n var h = parseInt(hsl[1], 10) / 360;\n var s = parseInt(hsl[2], 10) / 100;\n var l = parseInt(hsl[3], 10) / 100;\n var a = hsl[4] || 1;\n function hue2rgb(p, q, t) {\n if (t < 0) { t += 1; }\n if (t > 1) { t -= 1; }\n if (t < 1/6) { return p + (q - p) * 6 * t; }\n if (t < 1/2) { return q; }\n if (t < 2/3) { return p + (q - p) * (2/3 - t) * 6; }\n return p;\n }\n var r, g, b;\n if (s == 0) {\n r = g = b = l;\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n return (\"rgba(\" + (r * 255) + \",\" + (g * 255) + \",\" + (b * 255) + \",\" + a + \")\");\n}\n\nfunction colorToRgb(val) {\n if (is.rgb(val)) { return rgbToRgba(val); }\n if (is.hex(val)) { return hexToRgba(val); }\n if (is.hsl(val)) { return hslToRgba(val); }\n}\n\n// Units\n\nfunction getUnit(val) {\n var split = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(val);\n if (split) { return split[1]; }\n}\n\nfunction getTransformUnit(propName) {\n if (stringContains(propName, 'translate') || propName === 'perspective') { return 'px'; }\n if (stringContains(propName, 'rotate') || stringContains(propName, 'skew')) { return 'deg'; }\n}\n\n// Values\n\nfunction getFunctionValue(val, animatable) {\n if (!is.fnc(val)) { return val; }\n return val(animatable.target, animatable.id, animatable.total);\n}\n\nfunction getAttribute(el, prop) {\n return el.getAttribute(prop);\n}\n\nfunction convertPxToUnit(el, value, unit) {\n var valueUnit = getUnit(value);\n if (arrayContains([unit, 'deg', 'rad', 'turn'], valueUnit)) { return value; }\n var cached = cache.CSS[value + unit];\n if (!is.und(cached)) { return cached; }\n var baseline = 100;\n var tempEl = document.createElement(el.tagName);\n var parentEl = (el.parentNode && (el.parentNode !== document)) ? el.parentNode : document.body;\n parentEl.appendChild(tempEl);\n tempEl.style.position = 'absolute';\n tempEl.style.width = baseline + unit;\n var factor = baseline / tempEl.offsetWidth;\n parentEl.removeChild(tempEl);\n var convertedUnit = factor * parseFloat(value);\n cache.CSS[value + unit] = convertedUnit;\n return convertedUnit;\n}\n\nfunction getCSSValue(el, prop, unit) {\n if (prop in el.style) {\n var uppercasePropName = prop.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n var value = el.style[prop] || getComputedStyle(el).getPropertyValue(uppercasePropName) || '0';\n return unit ? convertPxToUnit(el, value, unit) : value;\n }\n}\n\nfunction getAnimationType(el, prop) {\n if (is.dom(el) && !is.inp(el) && (getAttribute(el, prop) || (is.svg(el) && el[prop]))) { return 'attribute'; }\n if (is.dom(el) && arrayContains(validTransforms, prop)) { return 'transform'; }\n if (is.dom(el) && (prop !== 'transform' && getCSSValue(el, prop))) { return 'css'; }\n if (el[prop] != null) { return 'object'; }\n}\n\nfunction getElementTransforms(el) {\n if (!is.dom(el)) { return; }\n var str = el.style.transform || '';\n var reg = /(\\w+)\\(([^)]*)\\)/g;\n var transforms = new Map();\n var m; while (m = reg.exec(str)) { transforms.set(m[1], m[2]); }\n return transforms;\n}\n\nfunction getTransformValue(el, propName, animatable, unit) {\n var defaultVal = stringContains(propName, 'scale') ? 1 : 0 + getTransformUnit(propName);\n var value = getElementTransforms(el).get(propName) || defaultVal;\n if (animatable) {\n animatable.transforms.list.set(propName, value);\n animatable.transforms['last'] = propName;\n }\n return unit ? convertPxToUnit(el, value, unit) : value;\n}\n\nfunction getOriginalTargetValue(target, propName, unit, animatable) {\n switch (getAnimationType(target, propName)) {\n case 'transform': return getTransformValue(target, propName, animatable, unit);\n case 'css': return getCSSValue(target, propName, unit);\n case 'attribute': return getAttribute(target, propName);\n default: return target[propName] || 0;\n }\n}\n\nfunction getRelativeValue(to, from) {\n var operator = /^(\\*=|\\+=|-=)/.exec(to);\n if (!operator) { return to; }\n var u = getUnit(to) || 0;\n var x = parseFloat(from);\n var y = parseFloat(to.replace(operator[0], ''));\n switch (operator[0][0]) {\n case '+': return x + y + u;\n case '-': return x - y + u;\n case '*': return x * y + u;\n }\n}\n\nfunction validateValue(val, unit) {\n if (is.col(val)) { return colorToRgb(val); }\n if (/\\s/g.test(val)) { return val; }\n var originalUnit = getUnit(val);\n var unitLess = originalUnit ? val.substr(0, val.length - originalUnit.length) : val;\n if (unit) { return unitLess + unit; }\n return unitLess;\n}\n\n// getTotalLength() equivalent for circle, rect, polyline, polygon and line shapes\n// adapted from https://gist.github.com/SebLambla/3e0550c496c236709744\n\nfunction getDistance(p1, p2) {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\nfunction getCircleLength(el) {\n return Math.PI * 2 * getAttribute(el, 'r');\n}\n\nfunction getRectLength(el) {\n return (getAttribute(el, 'width') * 2) + (getAttribute(el, 'height') * 2);\n}\n\nfunction getLineLength(el) {\n return getDistance(\n {x: getAttribute(el, 'x1'), y: getAttribute(el, 'y1')}, \n {x: getAttribute(el, 'x2'), y: getAttribute(el, 'y2')}\n );\n}\n\nfunction getPolylineLength(el) {\n var points = el.points;\n var totalLength = 0;\n var previousPos;\n for (var i = 0 ; i < points.numberOfItems; i++) {\n var currentPos = points.getItem(i);\n if (i > 0) { totalLength += getDistance(previousPos, currentPos); }\n previousPos = currentPos;\n }\n return totalLength;\n}\n\nfunction getPolygonLength(el) {\n var points = el.points;\n return getPolylineLength(el) + getDistance(points.getItem(points.numberOfItems - 1), points.getItem(0));\n}\n\n// Path animation\n\nfunction getTotalLength(el) {\n if (el.getTotalLength) { return el.getTotalLength(); }\n switch(el.tagName.toLowerCase()) {\n case 'circle': return getCircleLength(el);\n case 'rect': return getRectLength(el);\n case 'line': return getLineLength(el);\n case 'polyline': return getPolylineLength(el);\n case 'polygon': return getPolygonLength(el);\n }\n}\n\nfunction setDashoffset(el) {\n var pathLength = getTotalLength(el);\n el.setAttribute('stroke-dasharray', pathLength);\n return pathLength;\n}\n\n// Motion path\n\nfunction getParentSvgEl(el) {\n var parentEl = el.parentNode;\n while (is.svg(parentEl)) {\n if (!is.svg(parentEl.parentNode)) { break; }\n parentEl = parentEl.parentNode;\n }\n return parentEl;\n}\n\nfunction getParentSvg(pathEl, svgData) {\n var svg = svgData || {};\n var parentSvgEl = svg.el || getParentSvgEl(pathEl);\n var rect = parentSvgEl.getBoundingClientRect();\n var viewBoxAttr = getAttribute(parentSvgEl, 'viewBox');\n var width = rect.width;\n var height = rect.height;\n var viewBox = svg.viewBox || (viewBoxAttr ? viewBoxAttr.split(' ') : [0, 0, width, height]);\n return {\n el: parentSvgEl,\n viewBox: viewBox,\n x: viewBox[0] / 1,\n y: viewBox[1] / 1,\n w: width / viewBox[2],\n h: height / viewBox[3]\n }\n}\n\nfunction getPath(path, percent) {\n var pathEl = is.str(path) ? selectString(path)[0] : path;\n var p = percent || 100;\n return function(property) {\n return {\n property: property,\n el: pathEl,\n svg: getParentSvg(pathEl),\n totalLength: getTotalLength(pathEl) * (p / 100)\n }\n }\n}\n\nfunction getPathProgress(path, progress) {\n function point(offset) {\n if ( offset === void 0 ) offset = 0;\n\n var l = progress + offset >= 1 ? progress + offset : 0;\n return path.el.getPointAtLength(l);\n }\n var svg = getParentSvg(path.el, path.svg);\n var p = point();\n var p0 = point(-1);\n var p1 = point(+1);\n switch (path.property) {\n case 'x': return (p.x - svg.x) * svg.w;\n case 'y': return (p.y - svg.y) * svg.h;\n case 'angle': return Math.atan2(p1.y - p0.y, p1.x - p0.x) * 180 / Math.PI;\n }\n}\n\n// Decompose value\n\nfunction decomposeValue(val, unit) {\n // const rgx = /-?\\d*\\.?\\d+/g; // handles basic numbers\n // const rgx = /[+-]?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var rgx = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var value = validateValue((is.pth(val) ? val.totalLength : val), unit) + '';\n return {\n original: value,\n numbers: value.match(rgx) ? value.match(rgx).map(Number) : [0],\n strings: (is.str(val) || unit) ? value.split(rgx) : []\n }\n}\n\n// Animatables\n\nfunction parseTargets(targets) {\n var targetsArray = targets ? (flattenArray(is.arr(targets) ? targets.map(toArray) : toArray(targets))) : [];\n return filterArray(targetsArray, function (item, pos, self) { return self.indexOf(item) === pos; });\n}\n\nfunction getAnimatables(targets) {\n var parsed = parseTargets(targets);\n return parsed.map(function (t, i) {\n return {target: t, id: i, total: parsed.length, transforms: { list: getElementTransforms(t) } };\n });\n}\n\n// Properties\n\nfunction normalizePropertyTweens(prop, tweenSettings) {\n var settings = cloneObject(tweenSettings);\n // Override duration if easing is a spring\n if (/^spring/.test(settings.easing)) { settings.duration = spring(settings.easing); }\n if (is.arr(prop)) {\n var l = prop.length;\n var isFromTo = (l === 2 && !is.obj(prop[0]));\n if (!isFromTo) {\n // Duration divided by the number of tweens\n if (!is.fnc(tweenSettings.duration)) { settings.duration = tweenSettings.duration / l; }\n } else {\n // Transform [from, to] values shorthand to a valid tween value\n prop = {value: prop};\n }\n }\n var propArray = is.arr(prop) ? prop : [prop];\n return propArray.map(function (v, i) {\n var obj = (is.obj(v) && !is.pth(v)) ? v : {value: v};\n // Default delay value should only be applied to the first tween\n if (is.und(obj.delay)) { obj.delay = !i ? tweenSettings.delay : 0; }\n // Default endDelay value should only be applied to the last tween\n if (is.und(obj.endDelay)) { obj.endDelay = i === propArray.length - 1 ? tweenSettings.endDelay : 0; }\n return obj;\n }).map(function (k) { return mergeObjects(k, settings); });\n}\n\n\nfunction flattenKeyframes(keyframes) {\n var propertyNames = filterArray(flattenArray(keyframes.map(function (key) { return Object.keys(key); })), function (p) { return is.key(p); })\n .reduce(function (a,b) { if (a.indexOf(b) < 0) { a.push(b); } return a; }, []);\n var properties = {};\n var loop = function ( i ) {\n var propName = propertyNames[i];\n properties[propName] = keyframes.map(function (key) {\n var newKey = {};\n for (var p in key) {\n if (is.key(p)) {\n if (p == propName) { newKey.value = key[p]; }\n } else {\n newKey[p] = key[p];\n }\n }\n return newKey;\n });\n };\n\n for (var i = 0; i < propertyNames.length; i++) loop( i );\n return properties;\n}\n\nfunction getProperties(tweenSettings, params) {\n var properties = [];\n var keyframes = params.keyframes;\n if (keyframes) { params = mergeObjects(flattenKeyframes(keyframes), params); }\n for (var p in params) {\n if (is.key(p)) {\n properties.push({\n name: p,\n tweens: normalizePropertyTweens(params[p], tweenSettings)\n });\n }\n }\n return properties;\n}\n\n// Tweens\n\nfunction normalizeTweenValues(tween, animatable) {\n var t = {};\n for (var p in tween) {\n var value = getFunctionValue(tween[p], animatable);\n if (is.arr(value)) {\n value = value.map(function (v) { return getFunctionValue(v, animatable); });\n if (value.length === 1) { value = value[0]; }\n }\n t[p] = value;\n }\n t.duration = parseFloat(t.duration);\n t.delay = parseFloat(t.delay);\n return t;\n}\n\nfunction normalizeTweens(prop, animatable) {\n var previousTween;\n return prop.tweens.map(function (t) {\n var tween = normalizeTweenValues(t, animatable);\n var tweenValue = tween.value;\n var to = is.arr(tweenValue) ? tweenValue[1] : tweenValue;\n var toUnit = getUnit(to);\n var originalValue = getOriginalTargetValue(animatable.target, prop.name, toUnit, animatable);\n var previousValue = previousTween ? previousTween.to.original : originalValue;\n var from = is.arr(tweenValue) ? tweenValue[0] : previousValue;\n var fromUnit = getUnit(from) || getUnit(originalValue);\n var unit = toUnit || fromUnit;\n if (is.und(to)) { to = previousValue; }\n tween.from = decomposeValue(from, unit);\n tween.to = decomposeValue(getRelativeValue(to, from), unit);\n tween.start = previousTween ? previousTween.end : 0;\n tween.end = tween.start + tween.delay + tween.duration + tween.endDelay;\n tween.easing = parseEasings(tween.easing, tween.duration);\n tween.isPath = is.pth(tweenValue);\n tween.isColor = is.col(tween.from.original);\n if (tween.isColor) { tween.round = 1; }\n previousTween = tween;\n return tween;\n });\n}\n\n// Tween progress\n\nvar setProgressValue = {\n css: function (t, p, v) { return t.style[p] = v; },\n attribute: function (t, p, v) { return t.setAttribute(p, v); },\n object: function (t, p, v) { return t[p] = v; },\n transform: function (t, p, v, transforms, manual) {\n transforms.list.set(p, v);\n if (p === transforms.last || manual) {\n var str = '';\n transforms.list.forEach(function (value, prop) { str += prop + \"(\" + value + \") \"; });\n t.style.transform = str;\n }\n }\n};\n\n// Set Value helper\n\nfunction setTargetsValue(targets, properties) {\n var animatables = getAnimatables(targets);\n animatables.forEach(function (animatable) {\n for (var property in properties) {\n var value = getFunctionValue(properties[property], animatable);\n var target = animatable.target;\n var valueUnit = getUnit(value);\n var originalValue = getOriginalTargetValue(target, property, valueUnit, animatable);\n var unit = valueUnit || getUnit(originalValue);\n var to = getRelativeValue(validateValue(value, unit), originalValue);\n var animType = getAnimationType(target, property);\n setProgressValue[animType](target, property, to, animatable.transforms, true);\n }\n });\n}\n\n// Animations\n\nfunction createAnimation(animatable, prop) {\n var animType = getAnimationType(animatable.target, prop.name);\n if (animType) {\n var tweens = normalizeTweens(prop, animatable);\n var lastTween = tweens[tweens.length - 1];\n return {\n type: animType,\n property: prop.name,\n animatable: animatable,\n tweens: tweens,\n duration: lastTween.end,\n delay: tweens[0].delay,\n endDelay: lastTween.endDelay\n }\n }\n}\n\nfunction getAnimations(animatables, properties) {\n return filterArray(flattenArray(animatables.map(function (animatable) {\n return properties.map(function (prop) {\n return createAnimation(animatable, prop);\n });\n })), function (a) { return !is.und(a); });\n}\n\n// Create Instance\n\nfunction getInstanceTimings(animations, tweenSettings) {\n var animLength = animations.length;\n var getTlOffset = function (anim) { return anim.timelineOffset ? anim.timelineOffset : 0; };\n var timings = {};\n timings.duration = animLength ? Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration; })) : tweenSettings.duration;\n timings.delay = animLength ? Math.min.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.delay; })) : tweenSettings.delay;\n timings.endDelay = animLength ? timings.duration - Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration - anim.endDelay; })) : tweenSettings.endDelay;\n return timings;\n}\n\nvar instanceID = 0;\n\nfunction createNewInstance(params) {\n var instanceSettings = replaceObjectProps(defaultInstanceSettings, params);\n var tweenSettings = replaceObjectProps(defaultTweenSettings, params);\n var properties = getProperties(tweenSettings, params);\n var animatables = getAnimatables(params.targets);\n var animations = getAnimations(animatables, properties);\n var timings = getInstanceTimings(animations, tweenSettings);\n var id = instanceID;\n instanceID++;\n return mergeObjects(instanceSettings, {\n id: id,\n children: [],\n animatables: animatables,\n animations: animations,\n duration: timings.duration,\n delay: timings.delay,\n endDelay: timings.endDelay\n });\n}\n\n// Core\n\nvar activeInstances = [];\nvar pausedInstances = [];\nvar raf;\n\nvar engine = (function () {\n function play() { \n raf = requestAnimationFrame(step);\n }\n function step(t) {\n var activeInstancesLength = activeInstances.length;\n if (activeInstancesLength) {\n var i = 0;\n while (i < activeInstancesLength) {\n var activeInstance = activeInstances[i];\n if (!activeInstance.paused) {\n activeInstance.tick(t);\n } else {\n var instanceIndex = activeInstances.indexOf(activeInstance);\n if (instanceIndex > -1) {\n activeInstances.splice(instanceIndex, 1);\n activeInstancesLength = activeInstances.length;\n }\n }\n i++;\n }\n play();\n } else {\n raf = cancelAnimationFrame(raf);\n }\n }\n return play;\n})();\n\nfunction handleVisibilityChange() {\n if (document.hidden) {\n activeInstances.forEach(function (ins) { return ins.pause(); });\n pausedInstances = activeInstances.slice(0);\n anime.running = activeInstances = [];\n } else {\n pausedInstances.forEach(function (ins) { return ins.play(); });\n }\n}\n\nif (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n}\n\n// Public Instance\n\nfunction anime(params) {\n if ( params === void 0 ) params = {};\n\n\n var startTime = 0, lastTime = 0, now = 0;\n var children, childrenLength = 0;\n var resolve = null;\n\n function makePromise(instance) {\n var promise = window.Promise && new Promise(function (_resolve) { return resolve = _resolve; });\n instance.finished = promise;\n return promise;\n }\n\n var instance = createNewInstance(params);\n var promise = makePromise(instance);\n\n function toggleInstanceDirection() {\n var direction = instance.direction;\n if (direction !== 'alternate') {\n instance.direction = direction !== 'normal' ? 'normal' : 'reverse';\n }\n instance.reversed = !instance.reversed;\n children.forEach(function (child) { return child.reversed = instance.reversed; });\n }\n\n function adjustTime(time) {\n return instance.reversed ? instance.duration - time : time;\n }\n\n function resetTime() {\n startTime = 0;\n lastTime = adjustTime(instance.currentTime) * (1 / anime.speed);\n }\n\n function seekChild(time, child) {\n if (child) { child.seek(time - child.timelineOffset); }\n }\n\n function syncInstanceChildren(time) {\n if (!instance.reversePlayback) {\n for (var i = 0; i < childrenLength; i++) { seekChild(time, children[i]); }\n } else {\n for (var i$1 = childrenLength; i$1--;) { seekChild(time, children[i$1]); }\n }\n }\n\n function setAnimationsProgress(insTime) {\n var i = 0;\n var animations = instance.animations;\n var animationsLength = animations.length;\n while (i < animationsLength) {\n var anim = animations[i];\n var animatable = anim.animatable;\n var tweens = anim.tweens;\n var tweenLength = tweens.length - 1;\n var tween = tweens[tweenLength];\n // Only check for keyframes if there is more than one tween\n if (tweenLength) { tween = filterArray(tweens, function (t) { return (insTime < t.end); })[0] || tween; }\n var elapsed = minMax(insTime - tween.start - tween.delay, 0, tween.duration) / tween.duration;\n var eased = isNaN(elapsed) ? 1 : tween.easing(elapsed);\n var strings = tween.to.strings;\n var round = tween.round;\n var numbers = [];\n var toNumbersLength = tween.to.numbers.length;\n var progress = (void 0);\n for (var n = 0; n < toNumbersLength; n++) {\n var value = (void 0);\n var toNumber = tween.to.numbers[n];\n var fromNumber = tween.from.numbers[n] || 0;\n if (!tween.isPath) {\n value = fromNumber + (eased * (toNumber - fromNumber));\n } else {\n value = getPathProgress(tween.value, eased * toNumber);\n }\n if (round) {\n if (!(tween.isColor && n > 2)) {\n value = Math.round(value * round) / round;\n }\n }\n numbers.push(value);\n }\n // Manual Array.reduce for better performances\n var stringsLength = strings.length;\n if (!stringsLength) {\n progress = numbers[0];\n } else {\n progress = strings[0];\n for (var s = 0; s < stringsLength; s++) {\n var a = strings[s];\n var b = strings[s + 1];\n var n$1 = numbers[s];\n if (!isNaN(n$1)) {\n if (!b) {\n progress += n$1 + ' ';\n } else {\n progress += n$1 + b;\n }\n }\n }\n }\n setProgressValue[anim.type](animatable.target, anim.property, progress, animatable.transforms);\n anim.currentValue = progress;\n i++;\n }\n }\n\n function setCallback(cb) {\n if (instance[cb] && !instance.passThrough) { instance[cb](instance); }\n }\n\n function countIteration() {\n if (instance.remaining && instance.remaining !== true) {\n instance.remaining--;\n }\n }\n\n function setInstanceProgress(engineTime) {\n var insDuration = instance.duration;\n var insDelay = instance.delay;\n var insEndDelay = insDuration - instance.endDelay;\n var insTime = adjustTime(engineTime);\n instance.progress = minMax((insTime / insDuration) * 100, 0, 100);\n instance.reversePlayback = insTime < instance.currentTime;\n if (children) { syncInstanceChildren(insTime); }\n if (!instance.began && instance.currentTime > 0) {\n instance.began = true;\n setCallback('begin');\n }\n if (!instance.loopBegan && instance.currentTime > 0) {\n instance.loopBegan = true;\n setCallback('loopBegin');\n }\n if (insTime <= insDelay && instance.currentTime !== 0) {\n setAnimationsProgress(0);\n }\n if ((insTime >= insEndDelay && instance.currentTime !== insDuration) || !insDuration) {\n setAnimationsProgress(insDuration);\n }\n if (insTime > insDelay && insTime < insEndDelay) {\n if (!instance.changeBegan) {\n instance.changeBegan = true;\n instance.changeCompleted = false;\n setCallback('changeBegin');\n }\n setCallback('change');\n setAnimationsProgress(insTime);\n } else {\n if (instance.changeBegan) {\n instance.changeCompleted = true;\n instance.changeBegan = false;\n setCallback('changeComplete');\n }\n }\n instance.currentTime = minMax(insTime, 0, insDuration);\n if (instance.began) { setCallback('update'); }\n if (engineTime >= insDuration) {\n lastTime = 0;\n countIteration();\n if (!instance.remaining) {\n instance.paused = true;\n if (!instance.completed) {\n instance.completed = true;\n setCallback('loopComplete');\n setCallback('complete');\n if (!instance.passThrough && 'Promise' in window) {\n resolve();\n promise = makePromise(instance);\n }\n }\n } else {\n startTime = now;\n setCallback('loopComplete');\n instance.loopBegan = false;\n if (instance.direction === 'alternate') {\n toggleInstanceDirection();\n }\n }\n }\n }\n\n instance.reset = function() {\n var direction = instance.direction;\n instance.passThrough = false;\n instance.currentTime = 0;\n instance.progress = 0;\n instance.paused = true;\n instance.began = false;\n instance.loopBegan = false;\n instance.changeBegan = false;\n instance.completed = false;\n instance.changeCompleted = false;\n instance.reversePlayback = false;\n instance.reversed = direction === 'reverse';\n instance.remaining = instance.loop;\n children = instance.children;\n childrenLength = children.length;\n for (var i = childrenLength; i--;) { instance.children[i].reset(); }\n if (instance.reversed && instance.loop !== true || (direction === 'alternate' && instance.loop === 1)) { instance.remaining++; }\n setAnimationsProgress(instance.reversed ? instance.duration : 0);\n };\n\n // Set Value helper\n\n instance.set = function(targets, properties) {\n setTargetsValue(targets, properties);\n return instance;\n };\n\n instance.tick = function(t) {\n now = t;\n if (!startTime) { startTime = now; }\n setInstanceProgress((now + (lastTime - startTime)) * anime.speed);\n };\n\n instance.seek = function(time) {\n setInstanceProgress(adjustTime(time));\n };\n\n instance.pause = function() {\n instance.paused = true;\n resetTime();\n };\n\n instance.play = function() {\n if (!instance.paused) { return; }\n if (instance.completed) { instance.reset(); }\n instance.paused = false;\n activeInstances.push(instance);\n resetTime();\n if (!raf) { engine(); }\n };\n\n instance.reverse = function() {\n toggleInstanceDirection();\n resetTime();\n };\n\n instance.restart = function() {\n instance.reset();\n instance.play();\n };\n\n instance.reset();\n\n if (instance.autoplay) { instance.play(); }\n\n return instance;\n\n}\n\n// Remove targets from animation\n\nfunction removeTargetsFromAnimations(targetsArray, animations) {\n for (var a = animations.length; a--;) {\n if (arrayContains(targetsArray, animations[a].animatable.target)) {\n animations.splice(a, 1);\n }\n }\n}\n\nfunction removeTargets(targets) {\n var targetsArray = parseTargets(targets);\n for (var i = activeInstances.length; i--;) {\n var instance = activeInstances[i];\n var animations = instance.animations;\n var children = instance.children;\n removeTargetsFromAnimations(targetsArray, animations);\n for (var c = children.length; c--;) {\n var child = children[c];\n var childAnimations = child.animations;\n removeTargetsFromAnimations(targetsArray, childAnimations);\n if (!childAnimations.length && !child.children.length) { children.splice(c, 1); }\n }\n if (!animations.length && !children.length) { instance.pause(); }\n }\n}\n\n// Stagger helpers\n\nfunction stagger(val, params) {\n if ( params === void 0 ) params = {};\n\n var direction = params.direction || 'normal';\n var easing = params.easing ? parseEasings(params.easing) : null;\n var grid = params.grid;\n var axis = params.axis;\n var fromIndex = params.from || 0;\n var fromFirst = fromIndex === 'first';\n var fromCenter = fromIndex === 'center';\n var fromLast = fromIndex === 'last';\n var isRange = is.arr(val);\n var val1 = isRange ? parseFloat(val[0]) : parseFloat(val);\n var val2 = isRange ? parseFloat(val[1]) : 0;\n var unit = getUnit(isRange ? val[1] : val) || 0;\n var start = params.start || 0 + (isRange ? val1 : 0);\n var values = [];\n var maxValue = 0;\n return function (el, i, t) {\n if (fromFirst) { fromIndex = 0; }\n if (fromCenter) { fromIndex = (t - 1) / 2; }\n if (fromLast) { fromIndex = t - 1; }\n if (!values.length) {\n for (var index = 0; index < t; index++) {\n if (!grid) {\n values.push(Math.abs(fromIndex - index));\n } else {\n var fromX = !fromCenter ? fromIndex%grid[0] : (grid[0]-1)/2;\n var fromY = !fromCenter ? Math.floor(fromIndex/grid[0]) : (grid[1]-1)/2;\n var toX = index%grid[0];\n var toY = Math.floor(index/grid[0]);\n var distanceX = fromX - toX;\n var distanceY = fromY - toY;\n var value = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n if (axis === 'x') { value = -distanceX; }\n if (axis === 'y') { value = -distanceY; }\n values.push(value);\n }\n maxValue = Math.max.apply(Math, values);\n }\n if (easing) { values = values.map(function (val) { return easing(val / maxValue) * maxValue; }); }\n if (direction === 'reverse') { values = values.map(function (val) { return axis ? (val < 0) ? val * -1 : -val : Math.abs(maxValue - val); }); }\n }\n var spacing = isRange ? (val2 - val1) / maxValue : val1;\n return start + (spacing * (Math.round(values[i] * 100) / 100)) + unit;\n }\n}\n\n// Timeline\n\nfunction timeline(params) {\n if ( params === void 0 ) params = {};\n\n var tl = anime(params);\n tl.duration = 0;\n tl.add = function(instanceParams, timelineOffset) {\n var tlIndex = activeInstances.indexOf(tl);\n var children = tl.children;\n if (tlIndex > -1) { activeInstances.splice(tlIndex, 1); }\n function passThrough(ins) { ins.passThrough = true; }\n for (var i = 0; i < children.length; i++) { passThrough(children[i]); }\n var insParams = mergeObjects(instanceParams, replaceObjectProps(defaultTweenSettings, params));\n insParams.targets = insParams.targets || params.targets;\n var tlDuration = tl.duration;\n insParams.autoplay = false;\n insParams.direction = tl.direction;\n insParams.timelineOffset = is.und(timelineOffset) ? tlDuration : getRelativeValue(timelineOffset, tlDuration);\n passThrough(tl);\n tl.seek(insParams.timelineOffset);\n var ins = anime(insParams);\n passThrough(ins);\n children.push(ins);\n var timings = getInstanceTimings(children, params);\n tl.delay = timings.delay;\n tl.endDelay = timings.endDelay;\n tl.duration = timings.duration;\n tl.seek(0);\n tl.reset();\n if (tl.autoplay) { tl.play(); }\n return tl;\n };\n return tl;\n}\n\nanime.version = '3.1.0';\nanime.speed = 1;\nanime.running = activeInstances;\nanime.remove = removeTargets;\nanime.get = getOriginalTargetValue;\nanime.set = setTargetsValue;\nanime.convertPx = convertPxToUnit;\nanime.path = getPath;\nanime.setDashoffset = setDashoffset;\nanime.stagger = stagger;\nanime.timeline = timeline;\nanime.easing = parseEasings;\nanime.penner = penner;\nanime.random = function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; };\n\nmodule.exports = anime;\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(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 (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var core = module.exports = { version: '2.6.9' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\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","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","module.exports = false;\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* 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","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","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","var $export = require('./_export');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\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 px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","'use strict';\n// B.2.3.10 String.prototype.link(url)\nrequire('./_string-html')('link', function (createHTML) {\n return function link(url) {\n return createHTML(this, 'a', 'href', url);\n };\n});\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Boolean} [noTrailing] Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds while the\n * throttled-function is being called. If noTrailing is false or unspecified, callback will be executed one final time\n * after the last throttled-function call. (After the throttled-function has not been called for `delay` milliseconds,\n * the internal counter is reset)\n * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the throttled-function is executed.\n * @param {Boolean} [debounceMode] If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is false (at end),\n * schedule `callback` to execute after `delay` ms.\n *\n * @return {Function} A new, throttled, function.\n */\nfunction throttle (delay, noTrailing, callback, debounceMode) {\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n var timeoutID;\n var cancelled = false; // Keep track of the last time `callback` was executed.\n\n var lastExec = 0; // Function to clear existing timeout\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID);\n }\n } // Function to cancel next exec\n\n\n function cancel() {\n clearExistingTimeout();\n cancelled = true;\n } // `noTrailing` defaults to falsy.\n\n\n if (typeof noTrailing !== 'boolean') {\n debounceMode = callback;\n callback = noTrailing;\n noTrailing = undefined;\n }\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n\n\n function wrapper() {\n var self = this;\n var elapsed = Date.now() - lastExec;\n var args = arguments;\n\n if (cancelled) {\n return;\n } // Execute `callback` and update the `lastExec` timestamp.\n\n\n function exec() {\n lastExec = Date.now();\n callback.apply(self, args);\n }\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n\n\n function clear() {\n timeoutID = undefined;\n }\n\n if (debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`.\n */\n exec();\n }\n\n clearExistingTimeout();\n\n if (debounceMode === undefined && elapsed > delay) {\n /*\n * In throttle mode, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec();\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\n }\n }\n\n wrapper.cancel = cancel; // Return the wrapper function.\n\n return wrapper;\n}\n\n/* eslint-disable no-undefined */\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {Number} delay A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Boolean} [atBegin] Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n * @param {Function} callback A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n *\n * @return {Function} A new, debounced function.\n */\n\nfunction debounce (delay, atBegin, callback) {\n return callback === undefined ? throttle(delay, atBegin, false) : throttle(delay, callback, atBegin !== false);\n}\n\nexports.throttle = throttle;\nexports.debounce = debounce;\n","export default function alertBanners() {\n\tvar banners = document.querySelectorAll('.alert-banner')\n\n\tbanners.forEach(banner => {\n\t\tvar bannerId = ''\n\t\tfor (var i = 0; i < banner.classList.length; i++) {\n\t\t\tbannerId += banner.classList[i]\n\t\t}\n\n\t\tif (sessionStorage['closedAlerts'] && JSON.parse(sessionStorage['closedAlerts']).indexOf(bannerId) !== -1) {\n\t\t\tbanner.style.display = 'none'\n }\n \n var closeButton = banner.querySelector('.alert-banner__close');\n\n if (closeButton) {\n closeButton.addEventListener('click', () => {\n var h = banner.getBoundingClientRect().height\n \n banner.style.height = h + 'px'\n banner.style.transition = 'all 450ms ease 0s'\n \n setTimeout(() => {\n banner.style.height = '0px'\n banner.style.padding = '0px'\n \n if (sessionStorage['closedAlerts']) {\n sessionStorage['closedAlerts'] = JSON.stringify(JSON.parse(sessionStorage['closedAlerts']).push(bannerId))\n } else {\n sessionStorage['closedAlerts'] = JSON.stringify([bannerId])\n }\n }, 0)\n })\n }\n\t\t\n\t})\n}","\n\nfunction initAnimations() {\n //console.log('init animations')\n\n var controller = new ScrollMagic.Controller();\n\n /*\n var tl = new TimelineLite({delay: 1}),\n firstBg = document.querySelectorAll('.animate-reveal__first-bg'),\n secBg = document.querySelectorAll('.animate-reveal__second-bg'),\n word = document.querySelectorAll('.animate-reveal__word'),\n text = document.querySelectorAll('.animate-reveal__summary');\n\n tl\n .to(firstBg, 0.2, {scaleX:1})\n .to(secBg, 0.2, {scaleX:1})\n .to(word, 0.1, {opacity:1}, \"-=0.1\")\n .to(firstBg, 0.2, {scaleX:0})\n .to(secBg, 0.2, {scaleX:0})\n .to(text, 0.5, {opacity: 1, y:0});*/\n\n //document.querySelector('.restart').onclick = function() {tl.restart()};\n\n var toAnimate = document.querySelectorAll('.animate');\n\n for (var i = 0; i < toAnimate.length; i++) {\n var curr = toAnimate[i];\n var activeClass = curr.dataset.activeClass;\n //console.log(curr.id);\n\n /*var toggleClasses = TweenMax.set(\n '#' + curr.id , { className : 'animated ' + animation }\n );*/\n\n new ScrollMagic.Scene({\n \t\ttriggerElement: '#' + curr.id,\n \t\ttriggerHook: 0.8, // show, when scrolled 10% into view\n \t\t//duration: \"80%\", // hide 10% before exiting view (80% + 10% from bottom)\n \t\t//offset: 50 // move trigger to center of element\n \t})\n \t.setClassToggle('#' + curr.id, activeClass) // add class to reveal\n //.setTween(toggleClasses)\n .reverse(false)\n \t.addTo(controller);\n }\n\n\n var toAnimate = document.querySelectorAll('.animate-parallax');\n\n for (var i = 0; i < toAnimate.length; i++) {\n var curr = toAnimate[i];\n //console.log(curr);\n\n new ScrollMagic.Scene({\n \t\ttriggerElement: '#' + curr.id,\n duration: \"200%\",\n triggerHook: 1\n \t})\n \t.setClassToggle('#' + curr.id, 'animate-parallax--active') // add class to reveal\n .setTween('#' + curr.id + ' > .animate-parallax__image', {y: \"80%\", ease: Linear.easeNone})\n \t.addTo(controller);\n\n var image = document.querySelector('#' + curr.id + ' > div');\n image.addEventListener('transitionend', function() {\n //console.log('Transition ended');\n\n //image.style.transition = 'none';\n });\n }\n\n\n\n /*\n var scene = new ScrollMagic.Scene({\n \t\ttriggerElement: \"#home-intro\"\n \t})\n \t.setTween(\"#home-intro .lead-in\", 0.5, {top: \"0\", opacity: \"1\", delay: 1.75}) // trigger a TweenMax.to tween\n \t//.addIndicators({name: \"1 (duration: 0)\"}) // add indicators (requires plugin)\n \t.addTo(controller);\n */\n\n\n/*\n new ScrollMagic.Scene({triggerElement: \"#parallax1\"})\n\t\t\t.setTween(\"#parallax1 > div\", {y: \"80%\", ease: Linear.easeNone})\n\t\t\t.addTo(controller);*/\n\n\n\n/*\n var setMultipleClasses = TweenMax.set(document.querySelector(\"#home-intro .lead-in\"), {\n className: \"lead-in animated fadeInDown delay-2s \"\n });\n\n\tnew ScrollMagic.Scene({\n\t\ttriggerElement: \"#home-intro\",\n\t\ttriggerHook: 0.5, // show, when scrolled 10% into view\n\t\t//duration: \"80%\", // hide 10% before exiting view (80% + 10% from bottom)\n\t\toffset: 50 // move trigger to center of element\n\t})\n //.setTween(\"#home-intro\", 0.5, {backgroundColor: \"green\", scale: 2.5, delay: 2})\n\t//.setClassToggle(document.querySelector(\"#home-intro .lead-in\"), \"animated\") // add class to reveal\n .setTween(setMultipleClasses)\n\t.addTo(controller);*/\n\n/*\n new ScrollMagic.Scene({\n\t\ttriggerElement: \".animate-in\",\n\t\ttriggerHook: 0.7, // show, when scrolled 10% into view\n\t//\tduration: \"80%\", // hide 10% before exiting view (80% + 10% from bottom)\n\t\toffset: 50 // move trigger to center of element\n\t})\n\t.setClassToggle(\".animate-in\", \"animate-in--active\") // add class to reveal\n\t.addTo(controller);*/\n\n\n /*\n new ScrollMagic.Scene({\n\t\ttriggerElement: \".animate-text-image\",\n\t\ttriggerHook: 0.7, // show, when scrolled 10% into view\n\t//\tduration: \"80%\", // hide 10% before exiting view (80% + 10% from bottom)\n\t\toffset: 50 // move trigger to center of element\n\t})\n\t.setClassToggle(\".animate-text-image\", \"animate-text-image--active\") // add class to reveal\n\t.addTo(controller);*/\n\n /*new ScrollMagic.Scene({\n\t\ttriggerElement: \".animate-css\",\n\t\ttriggerHook: 0.7, // show, when scrolled 10% into view\n\t\tduration: \"80%\", // hide 10% before exiting view (80% + 10% from bottom)\n\t\toffset: 50 // move trigger to center of element\n\t})\n .on('start', function () {\n console.log('start');\n\n var elem = this.triggerElement();\n var animation = elem.dataset.animation;\n\n elem.classList.add('animated', animation);\n })\n .on('end', function () {\n console.log('stop');\n\n var elem = this.triggerElement();\n var animation = elem.dataset.animation;\n\n elem.classList.remove('animated', animation);\n })\n\t//.setClassToggle(\".animate\", \"animated\") // add class to reveal\n\t.addTo(controller);*/\n\n}\n\n\nexport default function animations() {\n\n initAnimations();\n\n\n //if (page == 'animation-test') {\n //console.log(page);\n\n //}\n}\n","\n\nfunction prevTabFunc() {\n var currTab = document.querySelectorAll(\".annuities-types__table-mobile-nav ul .active\")[0];\n var prevTab = currTab.previousElementSibling;\n\n if (prevTab) {\n currTab.classList.remove(\"active\");\n prevTab.classList.add(\"active\");\n\n var actives = document.querySelectorAll(\".annuities-types__table-mobile .active\");\n actives.forEach(el => {\n var next = el.previousElementSibling;\n next.classList.add(\"active\");\n el.classList.remove(\"active\");\n \t});\n }\n}\n\nfunction nextTabFunc() {\n var currTab = document.querySelectorAll(\".annuities-types__table-mobile-nav ul .active\")[0];\n var nextTab = currTab.nextElementSibling;\n\n if (nextTab) {\n currTab.classList.remove(\"active\");\n nextTab.classList.add(\"active\");\n\n var actives = document.querySelectorAll(\".annuities-types__table-mobile .active\");\n actives.forEach(el => {\n var next = el.nextElementSibling;\n next.classList.add(\"active\");\n el.classList.remove(\"active\");\n \t});\n }\n}\n\nexport default function annuitiesTable() {\n\n var prevTab = document.querySelectorAll('.annuities-types__table-mobile-nav .tab-nav.prev');\n prevTab.forEach(el => {\n\t\tel.addEventListener('click', prevTabFunc);\n\t});\n\n var nextTab = document.querySelectorAll('.annuities-types__table-mobile-nav .tab-nav.next');\n nextTab.forEach(el => {\n\t\tel.addEventListener('click', nextTabFunc);\n\t});\n\n\n}\n","\nexport default function cloudinaryVideoModal() {\n\n document.querySelectorAll('.launch-cloudinary-video').forEach(el => {\n\n el.addEventListener('click', function (e) {\n console.log('cloudinary video click');\n\n e.preventDefault();\n\n\n var player = document.getElementById('cloudinary-video-player');\n player.setAttribute('src', this.href);\n\n\n document.getElementById('cloudinaryModal').classList.add('open');\n\n document.querySelectorAll('body').forEach(el => {\n el.classList.add('modal-open');\n });\n });\n });\n\n\n document.querySelectorAll('.cloudinary-video-modal__content-wrap').forEach(el => {\n el.addEventListener('click', function (e) {\n e.stopPropagation();\n });\n });\n\n\n\n document.querySelectorAll('.cloudinary-video-modal').forEach(el => {\n el.addEventListener('click', function (e) {\n e.stopPropagation();\n\n el.classList.remove('open');\n el.classList.add('fade-out');\n\n var player = document.getElementById('cloudinary-video-player');\n player.setAttribute('src', '');\n\n document.querySelectorAll('body').forEach(el => {\n el.classList.remove('modal-open');\n });\n });\n });\n\n\n\n\n}\n","\nfunction setBgImage() {\n //console.log('set bg image');\n\n var clBg = document.querySelectorAll('.cld-bg');\n\tclBg.forEach(el => {\n\t\t//console.log('el', el);\n\n var elements = el.dataset.class ? document.querySelectorAll('.' + el.dataset.class) : [el.parentNode];\n\t\telements.forEach(item => {\n\t\t\t//console.log('item', item);\n\n if (el.dataset.size) {\n const vw = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n //console.log('vw', vw);\n\n if (vw <= el.dataset.size) {\n item.style.backgroundImage = \"url('\"+el.src+\"')\";\n }\n }\n else {\n item.style.backgroundImage = \"url('\"+el.src+\"')\";\n }\n\n\t\t});\n\t});\n}\n\n\nexport default function cloudImages() {\n\n var cl = cloudinary.Cloudinary.new({cloud_name: \"dmh15ov9z\"});\n cl.responsive();\n\n\tsetBgImage();\n\n window.addEventListener('resize', _.debounce(() => {\n setBgImage();\n }, 400));\n}\n","\nfunction getOrdinalNum(n) {\n return n + (n > 0 ? ['th', 'st', 'nd', 'rd'][(n > 3 && n < 21) || n % 10 > 3 ? 0 : n % 10] : '');\n}\n\nfunction getMonth(n) {\n\tconst monthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n\treturn monthNames[n];\n}\n\nexport default function dailyMarket() {\n\n if (!document.querySelector('.daily-market')) {\n return;\n }\n\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('GET', '/api/getblog');\n\n\t\txhr.onload = function() {\n\t\t if (xhr.status === 200) {\n\t\t //console.log(xhr.responseText);\n\n\t\t\t\t\t\tvar json = JSON.parse(xhr.responseText);\n\t\t\t\t\t\t//console.log(json);\n\n\t\t\t\t\t\tif (json.length) {\n\t\t\t\t\t\t\tvar container = document.querySelector('.daily-market__hidden');\n\t\t\t\t\t\t\tcontainer.classList.remove(\"daily-market__hidden\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (var i = 0; i < json.length; i++) {\n\t\t\t\t\t\t\tvar curr = json[i];\n\t\t\t\t\t\t\t//console.log('title', curr.title.rendered);\n\t\t\t\t\t\t\t//console.log('date', curr.date);\n\t\t\t\t\t\t\t//console.log('content', curr.excerpt.rendered);\n\t\t\t\t\t\t\t//console.log('link', curr.link);\n\n\t\t\t\t\t\t\tvar elem = document.querySelector('.daily-market__posts-' + (i + 1));\n\t\t\t\t\t\t\telem.href = curr.link;\n\t\t\t\t\t\t\telem.target = \"_blank\";\n\n\t\t\t\t\t\t\tvar title = elem.querySelector('.daily-market__posts-title');\n\t\t\t\t\t\t\ttitle.innerHTML = curr.title.rendered;\n\n\t\t\t\t\t\t\tvar d = elem.querySelector('.daily-market__posts-date');\n\n\t\t\t\t\t\t\tvar r = /\\d+/g;\n\t\t\t\t\t\t\tvar time = curr.date.match(r);\n\t\t\t\t\t\t\t//console.log(time);\n\n\t\t\t\t\t\t\tvar dateObj = new Date();\n\t\t\t\t\t\t\tdateObj.setTime(time[0]);\n\t\t\t\t\t\t\t//console.log ( getOrdinalNum(dateObj.getDate()) );\n\n\t\t\t\t\t\t\td.innerHTML = getMonth(dateObj.getMonth()) + \" \" + getOrdinalNum(dateObj.getDate()) + \", \" + dateObj.getFullYear();\n\n\t\t\t\t\t\t\tvar body = elem.querySelector('.daily-market__posts-content-body');\n\n\t\t\t\t\t\t\tvar div = document.createElement(\"div\");\n\t\t\t\t\t\t\tdiv.innerHTML = curr.excerpt.rendered;\n\t\t\t\t\t\t\tvar bodyText = div.textContent || div.innerText || \"\";\n\t\t\t\t\t\t\t//console.log('text', bodyText);\n\n\t\t\t\t\t\t\tvar trimmedString = bodyText.length > 180 ?\n bodyText.substring(0, 180 - 3) + \"... \" :\n bodyText;\n\n\t\t\t\t\t\t\tbody.innerHTML = trimmedString.replace(/\\s\\s+/g, ' ');\n\t\t\t\t\t\t}\n\t\t }\n\t\t else {\n\t\t console.log('Request failed with status: ' + xhr.status);\n\t\t }\n\t\t};\n\t\txhr.send();\n}\n","\nexport default function formValidate() {\n //console.log('form validate');\n\n var returnUrl = document.getElementById('insurance-plans__quote-form-return');\n if (returnUrl) {\n var domain = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');\n returnUrl.setAttribute('value', domain + returnUrl.value);\n //console.log(returnUrl.value, domain);\n }\n\n var returnUrl = document.getElementById('contact-form__form-return');\n if (returnUrl) {\n var domain = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');\n returnUrl.setAttribute('value', domain + returnUrl.value);\n //console.log(returnUrl.value, domain);\n }\n\n document.querySelectorAll('.insurance-plans__quote-form input').forEach(el => {\n el.addEventListener('input', function (e) {\n //console.log('input', el.nextElementSibling);\n\n var form = document.querySelector('.insurance-plans__quote-form form');\n var formError = el.nextElementSibling;\n formError.innerHTML = '';\n formError.classList.remove('has-error');\n });\n\t});\n\n // quote form\n document.querySelectorAll('.insurance-plans__quote-form-btn input').forEach(el => {\n el.addEventListener('click', function (e) {\n\n e.preventDefault();\n\n var form = document.querySelector('.insurance-plans__quote-form form');\n //console.log(form);\n\n\n var formError = form.querySelectorAll('.input-group__error').forEach(error => {\n error.innerHTML = '';\n error.classList.remove('has-error');\n });\n\n\n \t\tvar constraints = {\n \t 'name': {\n \t presence: true\n \t },\n 'email': {\n \t presence: true,\n email: true\n \t },\n 'phone': {\n \t presence: true\n \t }\n \t\t};\n\n var errors = validate(form, constraints);\n \t\t//console.log('errors', errors);\n\n \t\tif (errors) {\n //console.log('has error');\n for (var constraint in constraints) {\n if (constraints.hasOwnProperty(constraint)) {\n //console.log(key + \" -> \" + p[key]);\n if (errors[constraint]) {\n var formError = form.querySelector('.input-group__error.' + constraint);\n //console.log('.input-group__error .' + constraint);\n formError.innerHTML = errors[constraint][0];\n \t\t\tformError.classList.add('has-error');\n }\n }\n }\n \t\t}\n \t\telse {\n form.submit();\n \t\t}\n\n });\n\t});\n\n document.querySelectorAll('.contact-form__form input').forEach(el => {\n el.addEventListener('input', function (e) {\n //console.log('input', el.nextElementSibling);\n\n var form = document.querySelector('.contact-form__form form');\n var formError = el.nextElementSibling;\n formError.innerHTML = '';\n formError.classList.remove('has-error');\n });\n\t});\n\n // contact form\n document.querySelectorAll('.contact-form__form-btn input').forEach(el => {\n el.addEventListener('click', function (e) {\n\n e.preventDefault();\n\n var form = document.querySelector('.contact-form__form form');\n //console.log(form);\n\n\n var formError = form.querySelectorAll('.input-group__error').forEach(error => {\n error.innerHTML = '';\n error.classList.remove('has-error');\n });\n\n\n \t\tvar constraints = {\n \t 'name': {\n \t presence: true\n \t },\n 'email': {\n \t presence: true,\n email: true\n \t },\n 'phone': {\n \t presence: true\n \t }\n \t\t};\n\n var errors = validate(form, constraints);\n \t\t//console.log('errors', errors);\n\n \t\tif (errors) {\n //console.log('has error');\n for (var constraint in constraints) {\n if (constraints.hasOwnProperty(constraint)) {\n //console.log(key + \" -> \" + p[key]);\n if (errors[constraint]) {\n var formError = form.querySelector('.input-group__error.' + constraint);\n //console.log('.input-group__error .' + constraint);\n formError.innerHTML = errors[constraint][0];\n \t\t\tformError.classList.add('has-error');\n }\n }\n }\n \t\t}\n \t\telse {\n form.submit();\n \t\t}\n\n });\n\t});\n\n\n}\n","\nfunction setOffset() {\n\n document.querySelectorAll('.investment-types').forEach(el => {\n var p = el.querySelectorAll('.investment-types__tab-content-text--active p')[0];\n //console.log('p', p.offsetTop);\n\n var chat = el.querySelectorAll('.investment-types__chat')[0];\n if (chat) {\n chat.style.marginTop = p.offsetTop + 'px';\n }\n\n\t});\n\n}\n\nfunction updateContent(parent, index) {\n\n var activeText = parent.getElementsByClassName('investment-types__tab-content-text--active')[0];\n //console.log('active', activeText);\n activeText.classList.remove(\"investment-types__tab-content-text--active\");\n\n //var nextText = document.getElementsByClassName('investment-types__tab-content-' + index)[0];\n //nextText.classList.add(\"investment-types__tab-content-text--active\");\n\n var nextText = parent.querySelector('#investment-types__tab-content-' + index);\n nextText.classList.add(\"investment-types__tab-content-text--active\");\n}\n\nexport default function investmentTypes() {\n\n if (document.querySelectorAll('.investment-types__chat').length) {\n setOffset();\n\n window.addEventListener('resize', _.debounce(() => {\n setOffset();\n }, 400));\n }\n\n document.querySelectorAll('.investment-types').forEach(el => {\n\n var select = el.querySelectorAll('.investment-types select');\n\n if (select.length) {\n select[0].addEventListener('change', function(e) {\n //console.log('select', this.value)\n\n var activeTab = el.getElementsByClassName('investment-types__tabs--active')[0];\n if (activeTab) {\n activeTab.classList.remove(\"investment-types__tabs--active\");\n }\n\n updateContent(el, this.value);\n });\n }\n\n\n var links = el.querySelectorAll('.investment-types__tabs a');\n\n links.forEach(link => {\n \t\tlink.addEventListener('click', function(event) {\n\n event.preventDefault();\n\n\n // update tabs\n var activeTab = el.getElementsByClassName('investment-types__tabs--active')[0];\n //console.log('active', activeTab);\n if (activeTab) {\n activeTab.classList.remove(\"investment-types__tabs--active\");\n }\n\n this.classList.add(\"investment-types__tabs--active\");\n\n // update content\n\n updateContent(el, link.dataset.tab);\n\n\n setOffset();\n\n\n \t\t});\n \t});\n\n });\n\n\n if (window.location.hash) {\n //console.log('hash', window.location.hash)\n\n var hashSplit = window.location.hash.split('-');\n //console.log(hashSplit);\n\n if (hashSplit.length == 2) {\n\n var tabId = parseInt(hashSplit[1]);\n //console.log(tabId);\n\n var links = document.querySelectorAll('.investment-types__tabs a');\n links[tabId-1].click();\n }\n\n }\n}\n","import Cookies from \"js-cookie\";\n\nexport default function loginModal() {\n // show modal\n document.querySelectorAll(\".show-login\").forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n e.preventDefault();\n\n document.querySelectorAll(\".login-modal\").forEach((el) => {\n el.classList.add(\"open\");\n });\n\n document.querySelectorAll(\"body\").forEach((el) => {\n el.classList.add(\"modal-open\");\n });\n\n const uId = Cookies.get(\"savedUserName\");\n if (uId) {\n document.querySelector(\"#login-user-id\").value = uId;\n document.querySelector(\"#login-remember-me\").checked = true;\n document.querySelector(\".login-modal__blocks\").classList.add(\"open\");\n }\n\n MicroModal.show(\"modal-1\");\n });\n });\n\n // close modal\n document\n .querySelectorAll(\".login-modal, .login-modal__content-close\")\n .forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n e.preventDefault();\n\n document.querySelectorAll(\".login-modal\").forEach((el) => {\n el.classList.remove(\"open\");\n el.classList.add(\"fade-out\");\n });\n\n document.querySelectorAll(\"body\").forEach((el) => {\n el.classList.remove(\"modal-open\");\n });\n\n document\n .querySelectorAll(\".login-modal__blocks\")[0]\n .classList.remove(\"open\");\n\n var errorMsg = document.querySelector(\".login-modal__block-form-error\");\n errorMsg.style.display = \"none\";\n document.querySelector(\"#login-user-id\").value = \"\";\n\n MicroModal.close(\"modal-1\");\n });\n });\n\n document.querySelectorAll(\".login-modal__content\").forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n });\n });\n\n document.querySelectorAll(\".login-modal__block a\").forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n\n if (el.classList.contains('redirect-link')) {\n window.location.href = el.href;\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n var formContainer = el.nextElementSibling;\n var form = document.getElementById('login-form');\n formContainer.appendChild(form);\n\n el.parentNode.parentNode.parentNode.classList.remove(\"open\");\n \n document.querySelectorAll('.login-modal__block.open').forEach((el) => {\n el.classList.remove('open');\n });\n\n setTimeout(function() {\n el.parentNode.parentNode.parentNode.classList.add(\"open\");\n el.parentNode.parentNode.classList.add(\"open\");\n document.querySelector(\"#login-user-id\").focus();\n }, 50);\n \n\n /*var parentOpen = Array.from(\n el.parentNode.parentNode.parentNode.classList\n ).indexOf(\"open\");\n\n if (parentOpen > -1) {\n el.parentNode.parentNode.parentNode.classList.remove(\"open\");\n document.querySelector(\"#login-user-id\").value = \"\";\n } else {\n el.parentNode.parentNode.parentNode.classList.add(\"open\");\n document.querySelector(\"#login-user-id\").focus();\n }*/\n });\n });\n\n document.querySelectorAll(\".login-modal__block-form input\").forEach((el) => {\n el.addEventListener(\"input\", function (e) {\n var form = document.getElementById('login-form');\n var formError = form.querySelector(\".input-group__error\");\n formError.innerHTML = \"\";\n formError.classList.remove(\"has-error\");\n\n var errorMsg = form.querySelector(\".login-modal__block-form-error\");\n errorMsg.style.display = \"none\";\n });\n });\n\n // form cancel\n document.querySelectorAll(\".login-modal__block-form-cancel\").forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n e.preventDefault();\n\n document.querySelectorAll(\".login-modal__blocks\").forEach((el) => {\n el.classList.remove(\"open\");\n document.querySelector(\"#login-user-id\").value = \"\";\n });\n\n document.querySelectorAll(\".login-modal__block\").forEach((el) => {\n el.classList.remove(\"open\");\n });\n });\n });\n\n // forget username if remember me is unchecked\n document\n .querySelector(\"#login-remember-me\")\n .addEventListener(\"change\", (e) => {\n if (!e.target.checked) {\n Cookies.remove(\"savedUserName\");\n }\n });\n\n // form continue\n document.querySelectorAll(\".login-modal__block-form-submit\").forEach((el) => {\n el.addEventListener(\"click\", function (e) {\n e.preventDefault();\n\n var form = document.getElementById('login-form');\n\n var constraints = {\n \"user-id\": {\n presence: {\n message: \"User ID cannot be blank.\",\n },\n },\n };\n\n var formError = form.querySelector(\".input-group__error\");\n var errors = validate(form, constraints, { fullMessages: false });\n //console.log('errors', errors);\n\n if (errors) {\n formError.innerHTML = errors[\"user-id\"][0];\n formError.classList.add(\"has-error\");\n\n var errorMsg = form.querySelector(\".login-modal__block-form-error\");\n errorMsg.style.display = \"none\";\n } else {\n formError.innerHTML = \"\";\n formError.classList.remove(\"has-error\");\n // submit\n\n var userId = document.getElementById(\"login-user-id\").value;\n doLogin(userId);\n }\n });\n });\n\n document\n .getElementById(\"login-user-id\")\n .addEventListener(\"keypress\", function (event) {\n if (event.keyCode === 13) {\n //console.log('enter');\n\n document.querySelectorAll(\".login-modal__block-form-submit\")[0].click();\n }\n });\n\n function doLogin(userId) {\n var httpRequest2 = new XMLHttpRequest();\n\n if (document.querySelector(\"#login-remember-me:checked\") !== null) {\n Cookies.set(\"savedUserName\", userId);\n }\n\n\n httpRequest2.onreadystatechange = function () {\n if (httpRequest2.readyState === XMLHttpRequest.DONE) {\n if (httpRequest2.status === 200) {\n console.log('success', httpRequest2.responseText);\n\n var data = JSON.parse(httpRequest2.responseText);\n var system = data.CallResults.System;\n\n if (system == \"nfs\") {\n window.location.href = \"https://investor.wealthscape.com/msiebert/investor-index.html\";\n }\n else if (system == \"esop\") {\n window.location.href = \"https://stocx.investor.trading2.fast-trade.com/siebertnet/login.do\";\n }\n else if (system == \"etna\" || system == \"aspire\") {\n //window.location.href = process.env.TRADER_URL;\n window.location.href = \"https://stocx.investor.trading2.fast-trade.com/siebertnet/login.do\";\n }\n else {\n //window.location.href = process.env.REGISTER_URL + \"?new\";\n window.location.href = \"https://stocx.investor.trading2.fast-trade.com/siebertnet/login.do\";\n }\n } else {\n console.log('login error', httpRequest2.responseText);\n }\n }\n };\n\n \n httpRequest2.open(\n \"GET\",\n \"/api/GetSiebertAccountLookup?id=\" + encodeURIComponent(userId),\n true\n );\n //httpRequest2.setRequestHeader (\"Authorization\", \"Basic \" + btoa(\"SiebertAccountLookupApiUser\" + \":\" + \"hA17I4$2Z!ekJ$SuT9SqTCjVyyKfpdCzIB&6ONgpI&\"));\n httpRequest2.send();\n\n /*\n var httpRequest = new XMLHttpRequest();\n\n httpRequest.onreadystatechange = function () {\n if (httpRequest.readyState === XMLHttpRequest.DONE) {\n if (httpRequest.status === 200) {\n //console.log(httpRequest.responseText);\n var data = JSON.parse(httpRequest.responseText);\n\n if (data.System == \"nfs\") {\n window.location.href =\n \"https://investor.wealthscape.com/msiebert/investor-index.html\";\n } else if (data.System == \"aspire\") {\n window.location.href =\n \"https://stocx.investor.trading2.fast-trade.com/siebertnet/\";\n } else {\n //window.location.href = 'https://www.siebertnet.com/not-recognized';\n\n var errorMsg = document.querySelector(\n \".login-modal__block-form-error\"\n );\n errorMsg.style.display = \"block\";\n }\n } else {\n //console.log('login error', httpRequest.responseText);\n\n var errorMsg = document.querySelector(\n \".login-modal__block-form-error\"\n );\n errorMsg.style.display = \"block\";\n }\n }\n };\n\n httpRequest.open(\n \"GET\",\n \"https://api.siebertnet.com/api/accountlookup/\" +\n encodeURIComponent(userId),\n true\n );\n httpRequest.send();*/\n }\n}\n","import anime from 'animejs'\r\nimport {debounce} from 'throttle-debounce'\r\n\r\nexport default function nav() {\r\n\tconst menu = document.querySelector('.main-nav__items'),\r\n\t\tmenuBtn = document.querySelector('.main-nav__mob-menu'),\r\n\t\tmenuList = document.querySelectorAll('.main-nav__item'),\r\n\t\tmenuLinks = document.querySelectorAll('.main-nav__item > .main-nav__link'),\r\n\t\tlastItemLinks = menuList[menuList.length - 1].querySelectorAll('a'),\r\n\t\tmenuEl = document.querySelector('.main-nav'),\r\n\t\tmenuAnim = mobileMenuTimline()\r\n\r\n\tclearAnimationStyles(menuAnim, true)\r\n\r\n\r\n\t// Deal with changing screen sizes\r\n\tconst resizeFunc = debounce(800, () => {\r\n\t\tif(!menuIsMobile()) {\r\n\t\t\ttoggleActive(menuEl, 'main-nav--expanded', false)\r\n\t\t\ttoggleActive(document.body, 'mobile-menu-active', false)\r\n\t\t\tclearAnimationStyles(menuAnim, true)\r\n\r\n\t\t\tmenuLinks.forEach((el) => {\r\n\t\t\t\ttoggleActive(el.parentNode, 'main-nav__item--active', false)\r\n\t\t\t\tel.nextElementSibling.removeAttribute('style')\r\n\t\t\t})\r\n\t\t}\r\n\t})\r\n\twindow.addEventListener('resize', (e) => {\r\n\t\tresizeFunc()\r\n\t}, true)\r\n\r\n\r\n\t// hamburger click\r\n\tmenuBtn.addEventListener('click', function (event) {\r\n\t\twindow.scrollTo(0,0)\r\n\t\ttoggleActive(menuEl, 'main-nav--expanded')\r\n\t\ttoggleActive(document.body, 'mobile-menu-active')\r\n\r\n\t\tanime.remove(menu)\r\n\r\n\t\tif(document.body.classList.contains('mobile-menu-active')) {\r\n\t\t\tmenu.style.display = 'flex'\r\n\t\t\tmenuAnim.restart()\r\n\t\t} else {\r\n\t\t\tmenuAnim.reverse()\r\n\t\t\t// prevent blink\r\n\t\t\tmenuAnim.completed = false\r\n\t\t\tmenuAnim.play()\r\n\t\t}\r\n\t})\r\n\r\n\tmenuList.forEach(el => {\r\n\t\tel.addEventListener('mouseenter', function (event) {\r\n\t\t\tif (!menuIsMobile()) {\r\n\t\t\t\ttoggleActive(el, 'main-nav__item--active', true)\r\n\t\t\t}\r\n\t\t})\r\n\t\tel.addEventListener('mouseleave', function (event) {\r\n\t\t\tif (!menuIsMobile()) toggleActive(el, 'main-nav__item--active', false)\r\n\t\t})\r\n\t})\r\n\r\n\tmenuLinks.forEach((el, index) => {\r\n\t\tel.addEventListener('focus', function (event) {\r\n\t\t\tif (!menuIsMobile()) {\r\n\t\t\t\tmenuList.forEach(el => {\r\n\t\t\t\t\ttoggleActive(el, 'main-nav__item--active', false)\r\n\t\t\t\t})\r\n\r\n\t\t\t\ttoggleActive(el.parentNode, 'main-nav__item--active', true)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\t// Mobile menu\r\n\t\tel.addEventListener('click', function (event) {\r\n\t\t\tif (menuIsMobile()) {\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tconst dropdown = el.nextElementSibling\r\n\t\t\t\tlet storeHeight = 0\r\n\r\n\t\t\t\tdropdown.style.height = 'auto'\r\n\t\t\t\tstoreHeight = dropdown.offsetHeight\r\n\r\n\t\t\t\tif(toggleActive(el.parentNode, 'main-nav__item--active')) {\r\n\t\t\t\t\tanimHeight(dropdown, 0, storeHeight + 'px')\r\n\t\t\t\t} else {\r\n\t\t\t\t\tanimHeight(dropdown, storeHeight + 'px', 0)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t})\r\n\r\n\tlastItemLinks[lastItemLinks.length - 1].addEventListener('keydown', function (event) {\r\n\t\tif (event.keyCode == 9) {\r\n\t\t\ttoggleActive(menuList[menuList.length - 1], 'main-nav__item--active', false)\r\n\t\t}\r\n\t})\r\n\r\n\tfunction toggleActive(el, cls, show) {\r\n\t\tlet clsList = el.classList\r\n\r\n\t\tif (typeof show === 'undefined') {\r\n\t\t\tshow = clsList.contains(cls) ? false : true\r\n\t\t}\r\n\r\n\t\tif (show) {\r\n\t\t\tclsList.add(cls)\r\n\t\t} else {\r\n\t\t\tclsList.remove(cls)\r\n\t\t}\r\n\r\n\t\treturn show\r\n\t}\r\n\r\n\tfunction menuIsMobile() {\r\n\t\treturn window.innerWidth > 1024 ? false : true\r\n\t}\r\n\r\n\tfunction animHeight(el, start, end) {\r\n\t\tanime({\r\n\t\t\ttargets: el,\r\n\t\t\teasing: 'easeOutCubic',\r\n\t\t\theight: [start, end],\r\n\t\t\tduration: 250,\r\n\t\t\tcomplete: (a) => {\r\n\t\t\t\tanime.remove(el)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\tfunction mobileMenuTimline() {\r\n\t\tconst menuItems = document.querySelectorAll('.main-nav__items>.main-nav__item'),\r\n\t\t\tmenuSp = document.querySelector('.main-nav__items-special'),\r\n\t\t\ttl = anime.timeline({\r\n\t\t\t\teasing: 'easeInOutCubic',\r\n\t\t\t\tduration: 300,\r\n\t\t\t\tautoplay: false,\r\n\t\t\t\tcomplete: (a) => {\r\n\t\t\t\t\tif(a.reversed) {\r\n\t\t\t\t\t\tmenu.style.display = 'none'\r\n\t\t\t\t\t\ta.reverse()\r\n\t\t\t\t\t\tclearAnimationStyles(a, true)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\ttl.add({\r\n\t\t\ttargets: menu,\r\n\t\t\topacity: [0, 1]\r\n\t\t})\r\n\t\t.add({\r\n\t\t\ttargets: menuItems,\r\n\t\t\topacity: [0, 1],\r\n\t\t\ttranslateY: ['-10px', 0]\r\n\t\t})\r\n\t\t.add({\r\n\t\t\ttargets: menuSp,\r\n\t\t\topacity: [0,1],\r\n\t\t\ttranslateY: ['20px', 0]\r\n\t\t}, '-=100')\r\n\r\n\t\treturn tl\r\n\t}\r\n\r\n\tfunction clearAnimationStyles(a, timeline) {\r\n\t\tif(timeline) {\r\n\t\t\ta.children.forEach((obj) => {\r\n\t\t\t\tclearAnimatables(obj)\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tclearAnimatables(a)\r\n\t\t}\r\n\r\n\t\tfunction clearAnimatables(obj) {\r\n\t\t\tobj.animatables.forEach((el) => {\r\n\t\t\t\tel.target.removeAttribute('style')\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n}\r\n","export default function phoneSlider() {\r\n\r\n\tif (document.querySelector('.phone-slider__slider.glide')) {\r\n\t\tvar glide = new Glide('.phone-slider__slider.glide', {\r\n\t\t\ttype: 'carousel',\r\n\t\t\tperView: 1,\r\n\t\t\tfocusAt: 'center',\r\n\t\t\tgap: 0,\r\n\t\t\tautoplay: 5500\r\n\t\t})\r\n\r\n\t\tglide.mount()\r\n\t}\r\n\r\n}\r\n","\nfunction handleStory() {\n\n // quote media story\n var match = window.location.href.match(/investor-news\\?qmodStoryID=([0-9]+)/);\n if (match) {\n //console.log(match[1]);\n\n var qtool = document.querySelector('.qtool');\n\n qtool.setAttribute('data-qmod-tool', 'fullnewsstory');\n qtool.setAttribute('data-qmod-params', '{\"qmodStoryID\":\"'+match[1]+'\"}');\n\n qtool.innerHTML = '';\n\n\n document.querySelector('.investor-news-articles__heading').style.display = 'none';\n document.querySelector('.investor-news-articles').className += \" investor-news-articles__story\";\n\n window.qMod.loadTools();\n }\n}\n\nexport default function quoteMedia() {\n handleStory();\n\n //console.log('quote media');\n\n var qtools = document.querySelectorAll('.qtool');\n\n qtools.forEach(qtool => {\n var tool = qtool.dataset.qmodTool;\n //console.log(tool);\n\n if (tool == 'miniquotes' || tool =='filings' || tool == 'detailedquotetab' || tool == 'interactivechart' || tool == 'pricehistory') {\n qtool.setAttribute('data-qmod-params', '{\"symbol\":\"SIEB\"}');\n }\n else if (tool == 'fullnewssummary') {\n qtool.setAttribute('data-qmod-params', '{\"storyURL\":\"/investor-relations/investor-news?qmodStoryID=\", \"symbol\" : \"SIEB\", \"excludeTopics\" : \"NONCOMPANY\", \"src\" : \"bwi\", \"resultsPerPage\":4, \"dateHeadings\":false}');\n }\n\t});\n\n\n\n}\n","\nexport default function subnav() {\n\n function getHeight(el) {\n return el.offsetHeight + 'px';\n }\n\n function getDistance() {\n var topDist = h.offsetTop;\n return topDist;\n }\n\n var h = document.getElementById(\"sub-nav\");\n\n if (!h) {\n return;\n }\n\n var height = getHeight(h);\n var p = document.querySelector(\".sub-nav__sticky-placeholder\");\n var stuck = false;\n var stickPoint = getDistance();\n\n var scrollFn = function(e) {\n var distance = getDistance() - window.pageYOffset;\n var offset = window.pageYOffset;\n\n if ( (distance <= 0) && !stuck) {\n h.classList.add(\"sticky\");\n p.style.height = height;\n p.style.display = 'block';\n stuck = true;\n } else if (stuck && (offset <= stickPoint)){\n h.classList.remove(\"sticky\");\n height = getHeight(h);\n p.style.display = 'none';\n stuck = false;\n }\n }\n\n window.addEventListener(\"scroll\", _.throttle(scrollFn, 300));\n\n\n var subnavHeader = document.querySelector('.sub-nav__header');\n var subnavContent = document.querySelector('.sub-nav__content');\n\n subnavHeader.addEventListener('click', function(e) {\n\n if (subnavContent.classList.contains('sub-nav__content--visible')) {\n subnavHeader.classList.remove(\"sub-nav__header--open\");\n subnavContent.classList.remove(\"sub-nav__content--visible\");\n }\n else {\n subnavHeader.classList.add(\"sub-nav__header--open\");\n subnavContent.classList.add(\"sub-nav__content--visible\");\n }\n });\n\n}\n","\n\nfunction updateContent(index) {\n var activeText = document.getElementsByClassName('tabs-2col__tab-content-text--active')[0];\n activeText.classList.remove(\"tabs-2col__tab-content-text--active\");\n\n //var nextText = document.getElementsByClassName('tabs-2col__tab-content-' + index)[0];\n //nextText.classList.add(\"tabs-2col__tab-content-text--active\");\n\n var nextText = document.getElementById('tabs-2col__tab-content-' + index);\n nextText.classList.add(\"tabs-2col__tab-content-text--active\");\n}\n\nexport default function tabs2Col() {\n\n\n var select = document.querySelectorAll('.tabs-2col select');\n\n if (select.length) {\n select[0].addEventListener('change', function(e) {\n //console.log('select', this.value)\n\n var activeTab = document.getElementsByClassName('tabs-2col__tabs--active')[0];\n if (activeTab) {\n activeTab.classList.remove(\"tabs-2col__tabs--active\");\n }\n\n updateContent(this.value);\n });\n }\n\n var links = document.querySelectorAll('.tabs-2col__tabs a');\n\n links.forEach(el => {\n\t\tel.addEventListener('click', function(event) {\n\n event.preventDefault();\n\n // update tabs\n var activeTab = document.getElementsByClassName('tabs-2col__tabs--active')[0];\n if (activeTab) {\n activeTab.classList.remove(\"tabs-2col__tabs--active\");\n }\n\n this.classList.add(\"tabs-2col__tabs--active\");\n\n // update content\n updateContent(el.dataset.tab);\n\n\t\t});\n\t});\n\n\n}\n","\nexport default function videoModal() {\n\n document.querySelectorAll('.full-width-photo__video, .full-width-photo-bg__video').forEach(el => {\n el.addEventListener('click', function (e) {\n\n\n var player = document.getElementById('video-player');\n player.setAttribute('src', player.dataset.src);\n\n /*document.querySelectorAll('.yt_player_iframe').forEach(el => {\n el.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*')\n });*/\n\n /*var cld = cloudinary.Cloudinary.new({ cloud_name: 'dmh15ov9z' });\n var demoplayer = cld.videoPlayer('doc-player').width(600);\n demoplayer.source('stock%20plans/Stockcross_CorporateOffice-VideoC_wejnxd')*/\n\n /*var cld = cloudinary.Cloudinary.new({ cloud_name: 'demo' });\n var demoplayer = cld.videoPlayer('doc-player').width(600);\n demoplayer.source('race_road_car')*/\n\n\n document.getElementById(el.getAttribute('data-video')).classList.add('open');\n\n document.querySelectorAll('body').forEach(el => {\n el.classList.add('modal-open');\n });\n });\n\t});\n\n\n document.querySelectorAll('.full-width-photo__video-modal-content-wrap, .full-width-photo-bg__video-modal-content-wrap').forEach(el => {\n el.addEventListener('click', function (e) {\n e.stopPropagation();\n });\n });\n\n\n\n document.querySelectorAll('.full-width-photo__video-modal, .full-width-photo-bg__video-modal').forEach(el => {\n el.addEventListener('click', function (e) {\n e.stopPropagation();\n\n\n el.classList.remove('open');\n el.classList.add('fade-out');\n\n /*document.querySelectorAll('.yt_player_iframe').forEach(el => {\n el.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"stopVideo\",\"args\":\"\"}', '*')\n });*/\n\n var player = document.getElementById('video-player');\n player.setAttribute('src', '');\n\n document.querySelectorAll('body').forEach(el => {\n el.classList.remove('modal-open');\n });\n });\n\t});\n\n\n\n\n}\n","\r\n\r\n\r\nimport \"./polyfills/NodeList.forEach\";\r\n\r\nimport animations from \"./_animations\";\r\nimport cloudImages from \"./_cloudinary\";\r\nimport quoteMedia from \"./_quotemedia\";\r\nimport nav from \"./_nav\";\r\nimport subnav from \"./_subnav\";\r\nimport phoneSlider from \"./_phone-slider\";\r\nimport dailyMarket from \"./_daily-market\";\r\nimport investmentTypes from \"./_investment-types\";\r\nimport annuitiesTable from \"./_annuities-table\";\r\nimport videoModal from \"./_video-modal\";\r\nimport cloudinaryVideoModal from \"./_cloudinary-video-modal\";\r\nimport loginModal from \"./_login-modal\";\r\n// import salesforceModal from \"./_live-chat-modal\";\r\nimport tabs2Col from \"./_tabs-2col\";\r\nimport formValidate from \"./_form-validate\";\r\nimport alertBanners from \"./_alert-banner\";\r\n// import liveChat from \"./_live-chat\";\r\n\r\n\r\nconsole.log('NODE_ENV', process.env.NODE_ENV);\r\nconsole.log('TRADER_URL', process.env.TRADER_URL);\r\nconsole.log('REGISTER_URL', process.env.REGISTER_URL)\r\nconsole.log('API_URL', process.env.API_URL)\r\n\r\n// prevent menu cache on ios\r\nwindow.onpageshow = function (event) {\r\n if (event.persisted) {\r\n window.location.reload();\r\n }\r\n};\r\n\r\nwindow.addEventListener(\"load\", (event) => {\r\n animations();\r\n});\r\n\r\ndocument.addEventListener(\r\n \"DOMContentLoaded\",\r\n function () {\r\n\r\n formValidate();\r\n cloudImages();\r\n quoteMedia();\r\n \r\n if (document.querySelector('.main-nav') != null) {\r\n nav();\r\n }\r\n\r\n subnav();\r\n tabs2Col();\r\n phoneSlider();\r\n dailyMarket();\r\n investmentTypes();\r\n annuitiesTable();\r\n videoModal();\r\n cloudinaryVideoModal();\r\n\r\n if (document.querySelector('.login-modal') != null) {\r\n loginModal();\r\n }\r\n \r\n // salesforceModal();\r\n alertBanners();\r\n // liveChat();\r\n\r\n\r\n // setup hubspot form in footer area\r\n var myHubspot = document.querySelector('.footer__newsletter-form-hubspot');\r\n\r\n if (myHubspot != null) {\r\n var myScript = document.createElement(\"script\");\r\n myScript.innerHTML = 'hbspt.forms.create({region: \"na1\",portalId: \"21128494\",formId: \"8c7814de-486b-4a8e-9b36-db5030233062\"});';\r\n myHubspot.parentNode.replaceChild(myScript, myHubspot);\r\n }\r\n\r\n\r\n // animate fade out\r\n document.addEventListener(\"animationend\", function (e) {\r\n if (e.animationName === \"fadeOut\") {\r\n e.target.classList.remove(\"fade-out\");\r\n }\r\n });\r\n\r\n // smooth scroll anchors\r\n document.querySelectorAll('a[href^=\"#\"]').forEach((anchor) => {\r\n anchor.addEventListener(\"click\", function (e) {\r\n if (this.classList.contains(\"no-jump\")) {\r\n e.preventDefault();\r\n } else {\r\n if (!this.classList.contains(\"no-animate\")) {\r\n e.preventDefault();\r\n\r\n /*document.querySelector(this.getAttribute('href')).scrollIntoView({\r\n \t behavior: 'smooth'\r\n \t });*/\r\n\r\n const id = this.getAttribute(\"href\");\r\n const yOffset = -100;\r\n const element = document.querySelector(id);\r\n const y =\r\n element.getBoundingClientRect().top +\r\n window.pageYOffset +\r\n yOffset;\r\n\r\n window.scrollTo({ top: y, behavior: \"smooth\" });\r\n }\r\n }\r\n });\r\n });\r\n\r\n // back to top\r\n document.querySelectorAll(\".back-to-top > div\").forEach((anchor) => {\r\n anchor.addEventListener(\"click\", function (e) {\r\n window.scrollTo({\r\n top: 0,\r\n left: 0,\r\n behavior: \"smooth\",\r\n });\r\n });\r\n });\r\n\r\n // make hight of iframes 100%\r\n if (typeof iFrameResize !== \"undefined\") {\r\n iFrameResize({ log: false }, \".iframe-resize\");\r\n }\r\n\r\n // newsletter form\r\n var newsletterFormBtn = document.querySelector(\r\n \".footer__newsletter-form .btn\"\r\n );\r\n\r\n if (newsletterFormBtn != null) {\r\n newsletterFormBtn.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n\r\n var form = document.getElementsByClassName(\"footer__newsletter-form\")[0];\r\n\r\n var constraints = {\r\n email: {\r\n presence: true,\r\n email: true,\r\n },\r\n };\r\n\r\n var formError = form.querySelector(\".input-group__error\");\r\n var errors = validate(form, constraints);\r\n\r\n if (errors) {\r\n formError.innerHTML = errors.email[0];\r\n formError.classList.add(\"has-error\", \"input-group__error--dark\");\r\n } else {\r\n formError.innerHTML = \"\";\r\n formError.classList.remove(\"has-error\");\r\n // submit\r\n\r\n var email = document.getElementById(\"footer__newsletter-form-email\");\r\n\r\n var httpRequest = new XMLHttpRequest();\r\n\r\n httpRequest.onreadystatechange = function () {\r\n if (httpRequest.readyState === XMLHttpRequest.DONE) {\r\n // show success message\r\n if (httpRequest.status === 201) {\r\n // remove any previous error messages\r\n formError.innerHTML = \"\";\r\n formError.classList.remove(\"has-error\");\r\n\r\n // replace email field with success message\r\n var p = document.createElement(\"p\");\r\n p.innerHTML = \"Thanks for signing up!\";\r\n p.className = \"footer__newsletter-form-success\";\r\n\r\n // add success / error message to DOM\r\n email.parentNode.replaceChild(p, email);\r\n\r\n // disable submit button on success\r\n var btn = form.querySelector(\"button\");\r\n btn.disabled = true;\r\n } else if (httpRequest.status === 400) {\r\n var p = document.createElement(\"p\");\r\n if (httpRequest.statusText) {\r\n var json = JSON.parse(httpRequest.statusText);\r\n // error code for invalid email address\r\n if (json.Code && json.Code === 1) {\r\n formError.innerHTML = \"This is not a valid email address.\";\r\n } else if (json.Code && (json.Code === 204 || json.Code === 205 || json.Code === 206 || json.Code === 207 || json.Code === 208)) {\r\n /**\r\n * email address is on a list that makes it so it cannot sign\r\n * up for mailing list (deleted, unsubscribed, bounced, etc.)\r\n */\r\n formError.innerHTML = \"Sorry, you cannot sign up with this email address.\";\r\n } else {\r\n // default error message\r\n formError.innerHTML = \"Sorry there was an error, please try again later\";\r\n }\r\n }\r\n // set error css class for error message\r\n formError.classList.add(\"has-error\", \"input-group__error--dark\");\r\n } else {\r\n // generic default error\r\n formError.classList.add(\"has-error\", \"input-group__error--dark\");\r\n formError.innerHTML = \"Sorry there was an error, please try again later\";\r\n }\r\n }\r\n };\r\n\r\n httpRequest.open(\"POST\", \"/campaign/create\");\r\n httpRequest.setRequestHeader(\r\n \"Content-Type\",\r\n \"application/x-www-form-urlencoded\"\r\n );\r\n httpRequest.send(\"Email=\" + encodeURIComponent(email.value));\r\n }\r\n });\r\n }\r\n \r\n\r\n // investor relations shareholder updates\r\n var shareholderSignupBtn = document.querySelector(\"#shareholderUpdatesSignupBtn\");\r\n if (shareholderSignupBtn) {\r\n shareholderSignupBtn.addEventListener(\"click\", function (e) {\r\n console.log('signup click');\r\n e.preventDefault();\r\n var form = document.getElementsByClassName(\"investment-text-image__form\")[0];\r\n var constraints = {\r\n email: {\r\n presence: true,\r\n email: true\r\n }\r\n };\r\n var formError = form.querySelector(\".investment-text-image__form-error\");\r\n var errors = validate(form, constraints);\r\n\r\n\r\n if (errors) {\r\n formError.innerHTML = errors.email[0];\r\n formError.classList.add(\"has-error\");\r\n } else {\r\n formError.innerHTML = \"\";\r\n formError.classList.remove(\"has-error\");\r\n\r\n\r\n // submit\r\n console.log('subbmitting');\r\n\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/Campaign/ShareholderUpdates', true);\r\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\r\n\r\n xhr.onreadystatechange = function() { // Call a function when the state changes.\r\n if (this.readyState === XMLHttpRequest.DONE) {\r\n if (this.status === 201) {\r\n var p = document.createElement(\"p\");\r\n p.innerHTML = \"Thanks for signing up!\";\r\n\r\n var formFields = form.querySelector(\".investment-text-image__form-fields\");\r\n formFields.parentNode.replaceChild(p, formFields); // disable submit button on success\r\n }\r\n else {\r\n var p = document.createElement(\"p\");\r\n p.innerHTML = \"Sorry there was an error, please try again later\";\r\n\r\n var formFields = form.querySelector(\".investment-text-image__form-fields\");\r\n formFields.parentNode.replaceChild(p, formFields); // disable submit button on success\r\n }\r\n }\r\n }\r\n \r\n\r\n var name = document.getElementById(\"investment-text-image__form-name\");\r\n var email = document.getElementById(\"investment-text-image__form-email\");\r\n var account = document.getElementById(\"investment-text-image__form-account\");\r\n xhr.send(\"Name=\" + encodeURIComponent(name.value) + \"&Email=\" + encodeURIComponent(email.value) + \"&Account=\" + encodeURIComponent(account.value));\r\n }\r\n });\r\n }\r\n\r\n // investor news updates\r\n var investorNewsSignupBtn = document.querySelector(\"#investorNewsSignupBtn\");\r\n if (investorNewsSignupBtn) {\r\n investorNewsSignupBtn.addEventListener(\"click\", function (e) {\r\n console.log('signup click');\r\n e.preventDefault();\r\n var form = document.getElementsByClassName(\"investor-news-panel__form\")[0];\r\n var constraints = {\r\n email: {\r\n presence: true,\r\n email: true\r\n }\r\n };\r\n var formError = form.querySelector(\".investor-news-panel__form-error\");\r\n var errors = validate(form, constraints);\r\n\r\n\r\n if (errors) {\r\n formError.innerHTML = errors.email[0];\r\n formError.classList.add(\"has-error\");\r\n } else {\r\n formError.innerHTML = \"\";\r\n formError.classList.remove(\"has-error\");\r\n\r\n\r\n // submit\r\n console.log('subbmitting');\r\n\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", '/Campaign/ShareholderUpdates', true);\r\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\r\n\r\n xhr.onreadystatechange = function() { // Call a function when the state changes.\r\n if (this.readyState === XMLHttpRequest.DONE) {\r\n if (this.status === 201) {\r\n var p = document.createElement(\"p\");\r\n p.innerHTML = \"Thanks for signing up!\";\r\n\r\n var formFields = form.querySelector(\".investor-news-panel__form-fields\");\r\n formFields.parentNode.replaceChild(p, formFields); // disable submit button on success\r\n }\r\n else {\r\n var p = document.createElement(\"p\");\r\n p.innerHTML = \"Sorry there was an error, please try again later\";\r\n\r\n var formFields = form.querySelector(\".investor-news-panel__form-fields\");\r\n formFields.parentNode.replaceChild(p, formFields); // disable submit button on success\r\n }\r\n }\r\n }\r\n \r\n\r\n var name = document.getElementById(\"investor-news-panel__form-name\");\r\n var email = document.getElementById(\"investor-news-panel__form-email\");\r\n xhr.send(\"Name=\" + encodeURIComponent(name.value) + \"&Email=\" + encodeURIComponent(email.value));\r\n }\r\n });\r\n }\r\n\r\n // google map\r\n var mapContainer = document.querySelectorAll(\".google-map\");\r\n mapContainer.forEach((el) => {\r\n el.addEventListener(\"click\", function (event) {\r\n el.querySelector(\"iframe\").classList.add(\"clicked\");\r\n });\r\n el.addEventListener(\"mouseleave\", function (event) {\r\n el.querySelector(\"iframe\").classList.remove(\"clicked\");\r\n });\r\n });\r\n\r\n // 4 step accordion image block\r\n var imageBlockMenuItems = document.querySelectorAll(\r\n \".image-menu-block__content\"\r\n );\r\n imageBlockMenuItems.forEach((el) => {\r\n el.addEventListener(\"click\", function (event) {\r\n event.preventDefault();\r\n\r\n var visible = document.getElementsByClassName(\r\n \"image-menu-block__menu-item--visible\"\r\n )[0];\r\n visible.classList.remove(\"image-menu-block__menu-item--visible\");\r\n\r\n var visibleImage = document.getElementsByClassName(\r\n \"image-menu-block__image--visible\"\r\n )[0];\r\n visibleImage.classList.remove(\"image-menu-block__image--visible\");\r\n\r\n var parent = el.parentElement;\r\n parent.classList.add(\"image-menu-block__menu-item--visible\");\r\n\r\n var image = el.dataset.image;\r\n\r\n var imageElem = document.getElementsByClassName(\r\n \"image-menu-block__image-\" + image\r\n )[0];\r\n imageElem.classList.add(\"image-menu-block__image--visible\");\r\n });\r\n });\r\n },\r\n false\r\n);\r\n","if (window.NodeList && !NodeList.prototype.forEach) {\r\n\tNodeList.prototype.forEach = function (callback, thisArg) {\r\n\t\tthisArg = thisArg || window\r\n\t\tfor (var i = 0; i < this.length; i++) {\r\n\t\t\tcallback.call(thisArg, this[i], i, this)\r\n\t\t}\r\n\t}\r\n}"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYW5pbWVqcy9saWIvYW5pbWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYWR2YW5jZS1zdHJpbmctaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZpeC1yZS13a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hhcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy1hYnN0cmFjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZ2V4cC1leGVjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5leGVjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcubGluay5qcyIsIm5vZGVfbW9kdWxlcy9qcy1jb29raWUvc3JjL2pzLmNvb2tpZS5qcyIsIm5vZGVfbW9kdWxlcy90aHJvdHRsZS1kZWJvdW5jZS9kaXN0L2luZGV4LmNqcy5qcyIsInNyYy9kZXYvanMvX2FsZXJ0LWJhbm5lci5qcyIsInNyYy9kZXYvanMvX2FuaW1hdGlvbnMuanMiLCJzcmMvZGV2L2pzL19hbm51aXRpZXMtdGFibGUuanMiLCJzcmMvZGV2L2pzL19jbG91ZGluYXJ5LXZpZGVvLW1vZGFsLmpzIiwic3JjL2Rldi9qcy9fY2xvdWRpbmFyeS5qcyIsInNyYy9kZXYvanMvX2RhaWx5LW1hcmtldC5qcyIsInNyYy9kZXYvanMvX2Zvcm0tdmFsaWRhdGUuanMiLCJzcmMvZGV2L2pzL19pbnZlc3RtZW50LXR5cGVzLmpzIiwic3JjL2Rldi9qcy9fbG9naW4tbW9kYWwuanMiLCJzcmMvZGV2L2pzL19uYXYuanMiLCJzcmMvZGV2L2pzL19waG9uZS1zbGlkZXIuanMiLCJzcmMvZGV2L2pzL19xdW90ZW1lZGlhLmpzIiwic3JjL2Rldi9qcy9fc3VibmF2LmpzIiwic3JjL2Rldi9qcy9fdGFicy0yY29sLmpzIiwic3JjL2Rldi9qcy9fdmlkZW8tbW9kYWwuanMiLCJzcmMvZGV2L2pzL21haW4uanMiLCJzcmMvZGV2L2pzL3BvbHlmaWxscy9Ob2RlTGlzdC5mb3JFYWNoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsd0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QWxCLENBQXlCLHNDQUF6QjtBQUVBLFVBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxzQkFBVCxDQUNqQixrQ0FEaUIsRUFFakIsQ0FGaUIsQ0FBbkI7QUFHQSxNQUFBLFlBQVksQ0FBQyxTQUFiLENBQXVCLE1BQXZCLENBQThCLGtDQUE5QjtBQUVBLFVBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxhQUFoQjtBQUNBLE1BQUEsTUFBTSxDQUFDLFNBQVAsQ0FBaUIsR0FBakIsQ0FBcUIsc0NBQXJCO0FBRUEsVUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQUgsQ0FBVyxLQUF2QjtBQUVBLFVBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxzQkFBVCxDQUNkLDZCQUE2QixLQURmLEVBRWQsQ0FGYyxDQUFoQjtBQUdBLE1BQUEsU0FBUyxDQUFDLFNBQVYsQ0FBb0IsR0FBcEIsQ0FBd0Isa0NBQXhCO0FBQ0QsS0F0QkQ7QUF1QkQsR0F4QkQ7QUF5QkQsQ0FwVkgsRUFxVkUsS0FyVkY7Ozs7O0FDeENBLElBQUksTUFBTSxDQUFDLFFBQVAsSUFBbUIsQ0FBQyxRQUFRLENBQUMsU0FBVCxDQUFtQixPQUEzQyxFQUFvRDtBQUNuRCxFQUFBLFFBQVEsQ0FBQyxTQUFULENBQW1CLE9BQW5CLEdBQTZCLFVBQVUsUUFBVixFQUFvQixPQUFwQixFQUE2QjtBQUN6RCxJQUFBLE9BQU8sR0FBRyxPQUFPLElBQUksTUFBckI7O0FBQ0EsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFiLEVBQWdCLENBQUMsR0FBRyxLQUFLLE1BQXpCLEVBQWlDLENBQUMsRUFBbEMsRUFBc0M7QUFDckMsTUFBQSxRQUFRLENBQUMsSUFBVCxDQUFjLE9BQWQsRUFBdUIsS0FBSyxDQUFMLENBQXZCLEVBQWdDLENBQWhDLEVBQW1DLElBQW5DO0FBQ0E7QUFDRCxHQUxEO0FBTUEiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKlxuICogYW5pbWUuanMgdjMuMS4wXG4gKiAoYykgMjAxOSBKdWxpYW4gR2FybmllclxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBhbmltZWpzLmNvbVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gRGVmYXVsdHNcblxudmFyIGRlZmF1bHRJbnN0YW5jZVNldHRpbmdzID0ge1xuICB1cGRhdGU6IG51bGwsXG4gIGJlZ2luOiBudWxsLFxuICBsb29wQmVnaW46IG51bGwsXG4gIGNoYW5nZUJlZ2luOiBudWxsLFxuICBjaGFuZ2U6IG51bGwsXG4gIGNoYW5nZUNvbXBsZXRlOiBudWxsLFxuICBsb29wQ29tcGxldGU6IG51bGwsXG4gIGNvbXBsZXRlOiBudWxsLFxuICBsb29wOiAxLFxuICBkaXJlY3Rpb246ICdub3JtYWwnLFxuICBhdXRvcGxheTogdHJ1ZSxcbiAgdGltZWxpbmVPZmZzZXQ6IDBcbn07XG5cbnZhciBkZWZhdWx0VHdlZW5TZXR0aW5ncyA9IHtcbiAgZHVyYXRpb246IDEwMDAsXG4gIGRlbGF5OiAwLFxuICBlbmREZWxheTogMCxcbiAgZWFzaW5nOiAnZWFzZU91dEVsYXN0aWMoMSwgLjUpJyxcbiAgcm91bmQ6IDBcbn07XG5cbnZhciB2YWxpZFRyYW5zZm9ybXMgPSBbJ3RyYW5zbGF0ZVgnLCAndHJhbnNsYXRlWScsICd0cmFuc2xhdGVaJywgJ3JvdGF0ZScsICdyb3RhdGVYJywgJ3JvdGF0ZVknLCAncm90YXRlWicsICdzY2FsZScsICdzY2FsZVgnLCAnc2NhbGVZJywgJ3NjYWxlWicsICdza2V3JywgJ3NrZXdYJywgJ3NrZXdZJywgJ3BlcnNwZWN0aXZlJ107XG5cbi8vIENhY2hpbmdcblxudmFyIGNhY2hlID0ge1xuICBDU1M6IHt9LFxuICBzcHJpbmdzOiB7fVxufTtcblxuLy8gVXRpbHNcblxuZnVuY3Rpb24gbWluTWF4KHZhbCwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbCwgbWluKSwgbWF4KTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nQ29udGFpbnMoc3RyLCB0ZXh0KSB7XG4gIHJldHVybiBzdHIuaW5kZXhPZih0ZXh0KSA+IC0xO1xufVxuXG5mdW5jdGlvbiBhcHBseUFyZ3VtZW50cyhmdW5jLCBhcmdzKSB7XG4gIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG52YXIgaXMgPSB7XG4gIGFycjogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSk7IH0sXG4gIG9iajogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIHN0cmluZ0NvbnRhaW5zKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSwgJ09iamVjdCcpOyB9LFxuICBwdGg6IGZ1bmN0aW9uIChhKSB7IHJldHVybiBpcy5vYmooYSkgJiYgYS5oYXNPd25Qcm9wZXJ0eSgndG90YWxMZW5ndGgnKTsgfSxcbiAgc3ZnOiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7IH0sXG4gIGlucDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50OyB9LFxuICBkb206IGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLm5vZGVUeXBlIHx8IGlzLnN2ZyhhKTsgfSxcbiAgc3RyOiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gdHlwZW9mIGEgPT09ICdzdHJpbmcnOyB9LFxuICBmbmM6IGZ1bmN0aW9uIChhKSB7IHJldHVybiB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJzsgfSxcbiAgdW5kOiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gdHlwZW9mIGEgPT09ICd1bmRlZmluZWQnOyB9LFxuICBoZXg6IGZ1bmN0aW9uIChhKSB7IHJldHVybiAvKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kudGVzdChhKTsgfSxcbiAgcmdiOiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gL15yZ2IvLnRlc3QoYSk7IH0sXG4gIGhzbDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIC9eaHNsLy50ZXN0KGEpOyB9LFxuICBjb2w6IGZ1bmN0aW9uIChhKSB7IHJldHVybiAoaXMuaGV4KGEpIHx8IGlzLnJnYihhKSB8fCBpcy5oc2woYSkpOyB9LFxuICBrZXk6IGZ1bmN0aW9uIChhKSB7IHJldHVybiAhZGVmYXVsdEluc3RhbmNlU2V0dGluZ3MuaGFzT3duUHJvcGVydHkoYSkgJiYgIWRlZmF1bHRUd2VlblNldHRpbmdzLmhhc093blByb3BlcnR5KGEpICYmIGEgIT09ICd0YXJnZXRzJyAmJiBhICE9PSAna2V5ZnJhbWVzJzsgfVxufTtcblxuLy8gRWFzaW5nc1xuXG5mdW5jdGlvbiBwYXJzZUVhc2luZ1BhcmFtZXRlcnMoc3RyaW5nKSB7XG4gIHZhciBtYXRjaCA9IC9cXCgoW14pXSspXFwpLy5leGVjKHN0cmluZyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwYXJzZUZsb2F0KHApOyB9KSA6IFtdO1xufVxuXG4vLyBTcHJpbmcgc29sdmVyIGluc3BpcmVkIGJ5IFdlYmtpdCBDb3B5cmlnaHQgwqkgMjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIGh0dHBzOi8vd2Via2l0Lm9yZy9kZW1vcy9zcHJpbmcvc3ByaW5nLmpzXG5cbmZ1bmN0aW9uIHNwcmluZyhzdHJpbmcsIGR1cmF0aW9uKSB7XG5cbiAgdmFyIHBhcmFtcyA9IHBhcnNlRWFzaW5nUGFyYW1ldGVycyhzdHJpbmcpO1xuICB2YXIgbWFzcyA9IG1pbk1heChpcy51bmQocGFyYW1zWzBdKSA/IDEgOiBwYXJhbXNbMF0sIC4xLCAxMDApO1xuICB2YXIgc3RpZmZuZXNzID0gbWluTWF4KGlzLnVuZChwYXJhbXNbMV0pID8gMTAwIDogcGFyYW1zWzFdLCAuMSwgMTAwKTtcbiAgdmFyIGRhbXBpbmcgPSBtaW5NYXgoaXMudW5kKHBhcmFtc1syXSkgPyAxMCA6IHBhcmFtc1syXSwgLjEsIDEwMCk7XG4gIHZhciB2ZWxvY2l0eSA9ICBtaW5NYXgoaXMudW5kKHBhcmFtc1szXSkgPyAwIDogcGFyYW1zWzNdLCAuMSwgMTAwKTtcbiAgdmFyIHcwID0gTWF0aC5zcXJ0KHN0aWZmbmVzcyAvIG1hc3MpO1xuICB2YXIgemV0YSA9IGRhbXBpbmcgLyAoMiAqIE1hdGguc3FydChzdGlmZm5lc3MgKiBtYXNzKSk7XG4gIHZhciB3ZCA9IHpldGEgPCAxID8gdzAgKiBNYXRoLnNxcnQoMSAtIHpldGEgKiB6ZXRhKSA6IDA7XG4gIHZhciBhID0gMTtcbiAgdmFyIGIgPSB6ZXRhIDwgMSA/ICh6ZXRhICogdzAgKyAtdmVsb2NpdHkpIC8gd2QgOiAtdmVsb2NpdHkgKyB3MDtcblxuICBmdW5jdGlvbiBzb2x2ZXIodCkge1xuICAgIHZhciBwcm9ncmVzcyA9IGR1cmF0aW9uID8gKGR1cmF0aW9uICogdCkgLyAxMDAwIDogdDtcbiAgICBpZiAoemV0YSA8IDEpIHtcbiAgICAgIHByb2dyZXNzID0gTWF0aC5leHAoLXByb2dyZXNzICogemV0YSAqIHcwKSAqIChhICogTWF0aC5jb3Mod2QgKiBwcm9ncmVzcykgKyBiICogTWF0aC5zaW4od2QgKiBwcm9ncmVzcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmVzcyA9IChhICsgYiAqIHByb2dyZXNzKSAqIE1hdGguZXhwKC1wcm9ncmVzcyAqIHcwKTtcbiAgICB9XG4gICAgaWYgKHQgPT09IDAgfHwgdCA9PT0gMSkgeyByZXR1cm4gdDsgfVxuICAgIHJldHVybiAxIC0gcHJvZ3Jlc3M7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICB2YXIgY2FjaGVkID0gY2FjaGUuc3ByaW5nc1tzdHJpbmddO1xuICAgIGlmIChjYWNoZWQpIHsgcmV0dXJuIGNhY2hlZDsgfVxuICAgIHZhciBmcmFtZSA9IDEvNjtcbiAgICB2YXIgZWxhcHNlZCA9IDA7XG4gICAgdmFyIHJlc3QgPSAwO1xuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgIGVsYXBzZWQgKz0gZnJhbWU7XG4gICAgICBpZiAoc29sdmVyKGVsYXBzZWQpID09PSAxKSB7XG4gICAgICAgIHJlc3QrKztcbiAgICAgICAgaWYgKHJlc3QgPj0gMTYpIHsgYnJlYWs7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgZHVyYXRpb24gPSBlbGFwc2VkICogZnJhbWUgKiAxMDAwO1xuICAgIGNhY2hlLnNwcmluZ3Nbc3RyaW5nXSA9IGR1cmF0aW9uO1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxuXG4gIHJldHVybiBkdXJhdGlvbiA/IHNvbHZlciA6IGdldER1cmF0aW9uO1xuXG59XG5cbi8vIEJhc2ljIHN0ZXBzIGVhc2luZyBpbXBsZW1lbnRhdGlvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9mci9kb2NzL1dlYi9DU1MvdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb25cblxuZnVuY3Rpb24gc3RlcHMoc3RlcHMpIHtcbiAgaWYgKCBzdGVwcyA9PT0gdm9pZCAwICkgc3RlcHMgPSAxMDtcblxuICByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIE1hdGgucm91bmQodCAqIHN0ZXBzKSAqICgxIC8gc3RlcHMpOyB9O1xufVxuXG4vLyBCZXppZXJFYXNpbmcgaHR0cHM6Ly9naXRodWIuY29tL2dyZS9iZXppZXItZWFzaW5nXG5cbnZhciBiZXppZXIgPSAoZnVuY3Rpb24gKCkge1xuXG4gIHZhciBrU3BsaW5lVGFibGVTaXplID0gMTE7XG4gIHZhciBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCk7XG5cbiAgZnVuY3Rpb24gQShhQTEsIGFBMikgeyByZXR1cm4gMS4wIC0gMy4wICogYUEyICsgMy4wICogYUExIH1cbiAgZnVuY3Rpb24gQihhQTEsIGFBMikgeyByZXR1cm4gMy4wICogYUEyIC0gNi4wICogYUExIH1cbiAgZnVuY3Rpb24gQyhhQTEpICAgICAgeyByZXR1cm4gMy4wICogYUExIH1cblxuICBmdW5jdGlvbiBjYWxjQmV6aWVyKGFULCBhQTEsIGFBMikgeyByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQgfVxuICBmdW5jdGlvbiBnZXRTbG9wZShhVCwgYUExLCBhQTIpIHsgcmV0dXJuIDMuMCAqIEEoYUExLCBhQTIpICogYVQgKiBhVCArIDIuMCAqIEIoYUExLCBhQTIpICogYVQgKyBDKGFBMSkgfVxuXG4gIGZ1bmN0aW9uIGJpbmFyeVN1YmRpdmlkZShhWCwgYUEsIGFCLCBtWDEsIG1YMikge1xuICAgIHZhciBjdXJyZW50WCwgY3VycmVudFQsIGkgPSAwO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XG4gICAgICBjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7IGFCID0gY3VycmVudFQ7IH0gZWxzZSB7IGFBID0gY3VycmVudFQ7IH1cbiAgICB9IHdoaWxlIChNYXRoLmFicyhjdXJyZW50WCkgPiAwLjAwMDAwMDEgJiYgKytpIDwgMTApO1xuICAgIHJldHVybiBjdXJyZW50VDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld3RvblJhcGhzb25JdGVyYXRlKGFYLCBhR3Vlc3NULCBtWDEsIG1YMikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICB2YXIgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgbVgxLCBtWDIpO1xuICAgICAgaWYgKGN1cnJlbnRTbG9wZSA9PT0gMC4wKSB7IHJldHVybiBhR3Vlc3NUOyB9XG4gICAgICB2YXIgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgYUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcbiAgICB9XG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cblxuICBmdW5jdGlvbiBiZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG5cbiAgICBpZiAoISgwIDw9IG1YMSAmJiBtWDEgPD0gMSAmJiAwIDw9IG1YMiAmJiBtWDIgPD0gMSkpIHsgcmV0dXJuOyB9XG4gICAgdmFyIHNhbXBsZVZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSk7XG5cbiAgICBpZiAobVgxICE9PSBtWTEgfHwgbVgyICE9PSBtWTIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga1NwbGluZVRhYmxlU2l6ZTsgKytpKSB7XG4gICAgICAgIHNhbXBsZVZhbHVlc1tpXSA9IGNhbGNCZXppZXIoaSAqIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFRGb3JYKGFYKSB7XG5cbiAgICAgIHZhciBpbnRlcnZhbFN0YXJ0ID0gMDtcbiAgICAgIHZhciBjdXJyZW50U2FtcGxlID0gMTtcbiAgICAgIHZhciBsYXN0U2FtcGxlID0ga1NwbGluZVRhYmxlU2l6ZSAtIDE7XG5cbiAgICAgIGZvciAoOyBjdXJyZW50U2FtcGxlICE9PSBsYXN0U2FtcGxlICYmIHNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSA8PSBhWDsgKytjdXJyZW50U2FtcGxlKSB7XG4gICAgICAgIGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xuICAgICAgfVxuXG4gICAgICAtLWN1cnJlbnRTYW1wbGU7XG5cbiAgICAgIHZhciBkaXN0ID0gKGFYIC0gc2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChzYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZSArIDFdIC0gc2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKTtcbiAgICAgIHZhciBndWVzc0ZvclQgPSBpbnRlcnZhbFN0YXJ0ICsgZGlzdCAqIGtTYW1wbGVTdGVwU2l6ZTtcbiAgICAgIHZhciBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcblxuICAgICAgaWYgKGluaXRpYWxTbG9wZSA+PSAwLjAwMSkge1xuICAgICAgICByZXR1cm4gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGd1ZXNzRm9yVCwgbVgxLCBtWDIpO1xuICAgICAgfSBlbHNlIGlmIChpbml0aWFsU2xvcGUgPT09IDAuMCkge1xuICAgICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJpbmFyeVN1YmRpdmlkZShhWCwgaW50ZXJ2YWxTdGFydCwgaW50ZXJ2YWxTdGFydCArIGtTYW1wbGVTdGVwU2l6ZSwgbVgxLCBtWDIpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAobVgxID09PSBtWTEgJiYgbVgyID09PSBtWTIpIHsgcmV0dXJuIHg7IH1cbiAgICAgIGlmICh4ID09PSAwIHx8IHggPT09IDEpIHsgcmV0dXJuIHg7IH1cbiAgICAgIHJldHVybiBjYWxjQmV6aWVyKGdldFRGb3JYKHgpLCBtWTEsIG1ZMik7XG4gICAgfVxuXG4gIH1cblxuICByZXR1cm4gYmV6aWVyO1xuXG59KSgpO1xuXG52YXIgcGVubmVyID0gKGZ1bmN0aW9uICgpIHtcblxuICAvLyBCYXNlZCBvbiBqUXVlcnkgVUkncyBpbXBsZW1lbmF0aW9uIG9mIGVhc2luZyBlcXVhdGlvbnMgZnJvbSBSb2JlcnQgUGVubmVyIChodHRwOi8vd3d3LnJvYmVydHBlbm5lci5jb20vZWFzaW5nKVxuXG4gIHZhciBlYXNlcyA9IHsgbGluZWFyOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAodCkgeyByZXR1cm4gdDsgfTsgfSB9O1xuXG4gIHZhciBmdW5jdGlvbkVhc2luZ3MgPSB7XG4gICAgU2luZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDIpOyB9OyB9LFxuICAgIENpcmM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7IH07IH0sXG4gICAgQmFjazogZnVuY3Rpb24gKCkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQgKiB0ICogKDMgKiB0IC0gMik7IH07IH0sXG4gICAgQm91bmNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIHBvdzIsIGIgPSA0O1xuICAgICAgd2hpbGUgKHQgPCAoKCBwb3cyID0gTWF0aC5wb3coMiwgLS1iKSkgLSAxKSAvIDExKSB7fVxuICAgICAgcmV0dXJuIDEgLyBNYXRoLnBvdyg0LCAzIC0gYikgLSA3LjU2MjUgKiBNYXRoLnBvdygoIHBvdzIgKiAzIC0gMiApIC8gMjIgLSB0LCAyKVxuICAgIH07IH0sXG4gICAgRWxhc3RpYzogZnVuY3Rpb24gKGFtcGxpdHVkZSwgcGVyaW9kKSB7XG4gICAgICBpZiAoIGFtcGxpdHVkZSA9PT0gdm9pZCAwICkgYW1wbGl0dWRlID0gMTtcbiAgICAgIGlmICggcGVyaW9kID09PSB2b2lkIDAgKSBwZXJpb2QgPSAuNTtcblxuICAgICAgdmFyIGEgPSBtaW5NYXgoYW1wbGl0dWRlLCAxLCAxMCk7XG4gICAgICB2YXIgcCA9IG1pbk1heChwZXJpb2QsIC4xLCAyKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gKHQgPT09IDAgfHwgdCA9PT0gMSkgPyB0IDogXG4gICAgICAgICAgLWEgKiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpICogTWF0aC5zaW4oKCgodCAtIDEpIC0gKHAgLyAoTWF0aC5QSSAqIDIpICogTWF0aC5hc2luKDEgLyBhKSkpICogKE1hdGguUEkgKiAyKSkgLyBwKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGJhc2VFYXNpbmdzID0gWydRdWFkJywgJ0N1YmljJywgJ1F1YXJ0JywgJ1F1aW50JywgJ0V4cG8nXTtcblxuICBiYXNlRWFzaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lLCBpKSB7XG4gICAgZnVuY3Rpb25FYXNpbmdzW25hbWVdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIE1hdGgucG93KHQsIGkgKyAyKTsgfTsgfTtcbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMoZnVuY3Rpb25FYXNpbmdzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIGVhc2VJbiA9IGZ1bmN0aW9uRWFzaW5nc1tuYW1lXTtcbiAgICBlYXNlc1snZWFzZUluJyArIG5hbWVdID0gZWFzZUluO1xuICAgIGVhc2VzWydlYXNlT3V0JyArIG5hbWVdID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiAxIC0gZWFzZUluKGEsIGIpKDEgLSB0KTsgfTsgfTtcbiAgICBlYXNlc1snZWFzZUluT3V0JyArIG5hbWVdID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGZ1bmN0aW9uICh0KSB7IHJldHVybiB0IDwgMC41ID8gZWFzZUluKGEsIGIpKHQgKiAyKSAvIDIgOiBcbiAgICAgIDEgLSBlYXNlSW4oYSwgYikodCAqIC0yICsgMikgLyAyOyB9OyB9O1xuICB9KTtcblxuICByZXR1cm4gZWFzZXM7XG5cbn0pKCk7XG5cbmZ1bmN0aW9uIHBhcnNlRWFzaW5ncyhlYXNpbmcsIGR1cmF0aW9uKSB7XG4gIGlmIChpcy5mbmMoZWFzaW5nKSkgeyByZXR1cm4gZWFzaW5nOyB9XG4gIHZhciBuYW1lID0gZWFzaW5nLnNwbGl0KCcoJylbMF07XG4gIHZhciBlYXNlID0gcGVubmVyW25hbWVdO1xuICB2YXIgYXJncyA9IHBhcnNlRWFzaW5nUGFyYW1ldGVycyhlYXNpbmcpO1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdzcHJpbmcnIDogcmV0dXJuIHNwcmluZyhlYXNpbmcsIGR1cmF0aW9uKTtcbiAgICBjYXNlICdjdWJpY0JlemllcicgOiByZXR1cm4gYXBwbHlBcmd1bWVudHMoYmV6aWVyLCBhcmdzKTtcbiAgICBjYXNlICdzdGVwcycgOiByZXR1cm4gYXBwbHlBcmd1bWVudHMoc3RlcHMsIGFyZ3MpO1xuICAgIGRlZmF1bHQgOiByZXR1cm4gYXBwbHlBcmd1bWVudHMoZWFzZSwgYXJncyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nc1xuXG5mdW5jdGlvbiBzZWxlY3RTdHJpbmcoc3RyKSB7XG4gIHRyeSB7XG4gICAgdmFyIG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzdHIpO1xuICAgIHJldHVybiBub2RlcztcbiAgfSBjYXRjaChlKSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8vIEFycmF5c1xuXG5mdW5jdGlvbiBmaWx0ZXJBcnJheShhcnIsIGNhbGxiYWNrKSB7XG4gIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMiA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGkgaW4gYXJyKSB7XG4gICAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsLCBpLCBhcnIpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5BcnJheShhcnIpIHtcbiAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuY29uY2F0KGlzLmFycihiKSA/IGZsYXR0ZW5BcnJheShiKSA6IGIpOyB9LCBbXSk7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkobykge1xuICBpZiAoaXMuYXJyKG8pKSB7IHJldHVybiBvOyB9XG4gIGlmIChpcy5zdHIobykpIHsgbyA9IHNlbGVjdFN0cmluZyhvKSB8fCBvOyB9XG4gIGlmIChvIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgbyBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7IHJldHVybiBbXS5zbGljZS5jYWxsKG8pOyB9XG4gIHJldHVybiBbb107XG59XG5cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCB2YWwpIHtcbiAgcmV0dXJuIGFyci5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhID09PSB2YWw7IH0pO1xufVxuXG4vLyBPYmplY3RzXG5cbmZ1bmN0aW9uIGNsb25lT2JqZWN0KG8pIHtcbiAgdmFyIGNsb25lID0ge307XG4gIGZvciAodmFyIHAgaW4gbykgeyBjbG9uZVtwXSA9IG9bcF07IH1cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlT2JqZWN0UHJvcHMobzEsIG8yKSB7XG4gIHZhciBvID0gY2xvbmVPYmplY3QobzEpO1xuICBmb3IgKHZhciBwIGluIG8xKSB7IG9bcF0gPSBvMi5oYXNPd25Qcm9wZXJ0eShwKSA/IG8yW3BdIDogbzFbcF07IH1cbiAgcmV0dXJuIG87XG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvMSwgbzIpIHtcbiAgdmFyIG8gPSBjbG9uZU9iamVjdChvMSk7XG4gIGZvciAodmFyIHAgaW4gbzIpIHsgb1twXSA9IGlzLnVuZChvMVtwXSkgPyBvMltwXSA6IG8xW3BdOyB9XG4gIHJldHVybiBvO1xufVxuXG4vLyBDb2xvcnNcblxuZnVuY3Rpb24gcmdiVG9SZ2JhKHJnYlZhbHVlKSB7XG4gIHZhciByZ2IgPSAvcmdiXFwoKFxcZCssXFxzKltcXGRdKyxcXHMqW1xcZF0rKVxcKS9nLmV4ZWMocmdiVmFsdWUpO1xuICByZXR1cm4gcmdiID8gKFwicmdiYShcIiArIChyZ2JbMV0pICsgXCIsMSlcIikgOiByZ2JWYWx1ZTtcbn1cblxuZnVuY3Rpb24gaGV4VG9SZ2JhKGhleFZhbHVlKSB7XG4gIHZhciByZ3ggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICB2YXIgaGV4ID0gaGV4VmFsdWUucmVwbGFjZShyZ3gsIGZ1bmN0aW9uIChtLCByLCBnLCBiKSB7IHJldHVybiByICsgciArIGcgKyBnICsgYiArIGI7IH0gKTtcbiAgdmFyIHJnYiA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICB2YXIgciA9IHBhcnNlSW50KHJnYlsxXSwgMTYpO1xuICB2YXIgZyA9IHBhcnNlSW50KHJnYlsyXSwgMTYpO1xuICB2YXIgYiA9IHBhcnNlSW50KHJnYlszXSwgMTYpO1xuICByZXR1cm4gKFwicmdiYShcIiArIHIgKyBcIixcIiArIGcgKyBcIixcIiArIGIgKyBcIiwxKVwiKTtcbn1cblxuZnVuY3Rpb24gaHNsVG9SZ2JhKGhzbFZhbHVlKSB7XG4gIHZhciBoc2wgPSAvaHNsXFwoKFxcZCspLFxccyooW1xcZC5dKyklLFxccyooW1xcZC5dKyklXFwpL2cuZXhlYyhoc2xWYWx1ZSkgfHwgL2hzbGFcXCgoXFxkKyksXFxzKihbXFxkLl0rKSUsXFxzKihbXFxkLl0rKSUsXFxzKihbXFxkLl0rKVxcKS9nLmV4ZWMoaHNsVmFsdWUpO1xuICB2YXIgaCA9IHBhcnNlSW50KGhzbFsxXSwgMTApIC8gMzYwO1xuICB2YXIgcyA9IHBhcnNlSW50KGhzbFsyXSwgMTApIC8gMTAwO1xuICB2YXIgbCA9IHBhcnNlSW50KGhzbFszXSwgMTApIC8gMTAwO1xuICB2YXIgYSA9IGhzbFs0XSB8fCAxO1xuICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHsgdCArPSAxOyB9XG4gICAgaWYgKHQgPiAxKSB7IHQgLT0gMTsgfVxuICAgIGlmICh0IDwgMS82KSB7IHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0OyB9XG4gICAgaWYgKHQgPCAxLzIpIHsgcmV0dXJuIHE7IH1cbiAgICBpZiAodCA8IDIvMykgeyByZXR1cm4gcCArIChxIC0gcCkgKiAoMi8zIC0gdCkgKiA2OyB9XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgdmFyIHIsIGcsIGI7XG4gIGlmIChzID09IDApIHtcbiAgICByID0gZyA9IGIgPSBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICByID0gaHVlMnJnYihwLCBxLCBoICsgMS8zKTtcbiAgICBnID0gaHVlMnJnYihwLCBxLCBoKTtcbiAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTtcbiAgfVxuICByZXR1cm4gKFwicmdiYShcIiArIChyICogMjU1KSArIFwiLFwiICsgKGcgKiAyNTUpICsgXCIsXCIgKyAoYiAqIDI1NSkgKyBcIixcIiArIGEgKyBcIilcIik7XG59XG5cbmZ1bmN0aW9uIGNvbG9yVG9SZ2IodmFsKSB7XG4gIGlmIChpcy5yZ2IodmFsKSkgeyByZXR1cm4gcmdiVG9SZ2JhKHZhbCk7IH1cbiAgaWYgKGlzLmhleCh2YWwpKSB7IHJldHVybiBoZXhUb1JnYmEodmFsKTsgfVxuICBpZiAoaXMuaHNsKHZhbCkpIHsgcmV0dXJuIGhzbFRvUmdiYSh2YWwpOyB9XG59XG5cbi8vIFVuaXRzXG5cbmZ1bmN0aW9uIGdldFVuaXQodmFsKSB7XG4gIHZhciBzcGxpdCA9IC9bKy1dP1xcZCpcXC4/XFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspPyglfHB4fHB0fGVtfHJlbXxpbnxjbXxtbXxleHxjaHxwY3x2d3x2aHx2bWlufHZtYXh8ZGVnfHJhZHx0dXJuKT8kLy5leGVjKHZhbCk7XG4gIGlmIChzcGxpdCkgeyByZXR1cm4gc3BsaXRbMV07IH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtVW5pdChwcm9wTmFtZSkge1xuICBpZiAoc3RyaW5nQ29udGFpbnMocHJvcE5hbWUsICd0cmFuc2xhdGUnKSB8fCBwcm9wTmFtZSA9PT0gJ3BlcnNwZWN0aXZlJykgeyByZXR1cm4gJ3B4JzsgfVxuICBpZiAoc3RyaW5nQ29udGFpbnMocHJvcE5hbWUsICdyb3RhdGUnKSB8fCBzdHJpbmdDb250YWlucyhwcm9wTmFtZSwgJ3NrZXcnKSkgeyByZXR1cm4gJ2RlZyc7IH1cbn1cblxuLy8gVmFsdWVzXG5cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uVmFsdWUodmFsLCBhbmltYXRhYmxlKSB7XG4gIGlmICghaXMuZm5jKHZhbCkpIHsgcmV0dXJuIHZhbDsgfVxuICByZXR1cm4gdmFsKGFuaW1hdGFibGUudGFyZ2V0LCBhbmltYXRhYmxlLmlkLCBhbmltYXRhYmxlLnRvdGFsKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGVsLCBwcm9wKSB7XG4gIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUocHJvcCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQeFRvVW5pdChlbCwgdmFsdWUsIHVuaXQpIHtcbiAgdmFyIHZhbHVlVW5pdCA9IGdldFVuaXQodmFsdWUpO1xuICBpZiAoYXJyYXlDb250YWlucyhbdW5pdCwgJ2RlZycsICdyYWQnLCAndHVybiddLCB2YWx1ZVVuaXQpKSB7IHJldHVybiB2YWx1ZTsgfVxuICB2YXIgY2FjaGVkID0gY2FjaGUuQ1NTW3ZhbHVlICsgdW5pdF07XG4gIGlmICghaXMudW5kKGNhY2hlZCkpIHsgcmV0dXJuIGNhY2hlZDsgfVxuICB2YXIgYmFzZWxpbmUgPSAxMDA7XG4gIHZhciB0ZW1wRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsLnRhZ05hbWUpO1xuICB2YXIgcGFyZW50RWwgPSAoZWwucGFyZW50Tm9kZSAmJiAoZWwucGFyZW50Tm9kZSAhPT0gZG9jdW1lbnQpKSA/IGVsLnBhcmVudE5vZGUgOiBkb2N1bWVudC5ib2R5O1xuICBwYXJlbnRFbC5hcHBlbmRDaGlsZCh0ZW1wRWwpO1xuICB0ZW1wRWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICB0ZW1wRWwuc3R5bGUud2lkdGggPSBiYXNlbGluZSArIHVuaXQ7XG4gIHZhciBmYWN0b3IgPSBiYXNlbGluZSAvIHRlbXBFbC5vZmZzZXRXaWR0aDtcbiAgcGFyZW50RWwucmVtb3ZlQ2hpbGQodGVtcEVsKTtcbiAgdmFyIGNvbnZlcnRlZFVuaXQgPSBmYWN0b3IgKiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgY2FjaGUuQ1NTW3ZhbHVlICsgdW5pdF0gPSBjb252ZXJ0ZWRVbml0O1xuICByZXR1cm4gY29udmVydGVkVW5pdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q1NTVmFsdWUoZWwsIHByb3AsIHVuaXQpIHtcbiAgaWYgKHByb3AgaW4gZWwuc3R5bGUpIHtcbiAgICB2YXIgdXBwZXJjYXNlUHJvcE5hbWUgPSBwcm9wLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHZhbHVlID0gZWwuc3R5bGVbcHJvcF0gfHwgZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZSh1cHBlcmNhc2VQcm9wTmFtZSkgfHwgJzAnO1xuICAgIHJldHVybiB1bml0ID8gY29udmVydFB4VG9Vbml0KGVsLCB2YWx1ZSwgdW5pdCkgOiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbmltYXRpb25UeXBlKGVsLCBwcm9wKSB7XG4gIGlmIChpcy5kb20oZWwpICYmICFpcy5pbnAoZWwpICYmIChnZXRBdHRyaWJ1dGUoZWwsIHByb3ApIHx8IChpcy5zdmcoZWwpICYmIGVsW3Byb3BdKSkpIHsgcmV0dXJuICdhdHRyaWJ1dGUnOyB9XG4gIGlmIChpcy5kb20oZWwpICYmIGFycmF5Q29udGFpbnModmFsaWRUcmFuc2Zvcm1zLCBwcm9wKSkgeyByZXR1cm4gJ3RyYW5zZm9ybSc7IH1cbiAgaWYgKGlzLmRvbShlbCkgJiYgKHByb3AgIT09ICd0cmFuc2Zvcm0nICYmIGdldENTU1ZhbHVlKGVsLCBwcm9wKSkpIHsgcmV0dXJuICdjc3MnOyB9XG4gIGlmIChlbFtwcm9wXSAhPSBudWxsKSB7IHJldHVybiAnb2JqZWN0JzsgfVxufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50VHJhbnNmb3JtcyhlbCkge1xuICBpZiAoIWlzLmRvbShlbCkpIHsgcmV0dXJuOyB9XG4gIHZhciBzdHIgPSBlbC5zdHlsZS50cmFuc2Zvcm0gfHwgJyc7XG4gIHZhciByZWcgID0gLyhcXHcrKVxcKChbXildKilcXCkvZztcbiAgdmFyIHRyYW5zZm9ybXMgPSBuZXcgTWFwKCk7XG4gIHZhciBtOyB3aGlsZSAobSA9IHJlZy5leGVjKHN0cikpIHsgdHJhbnNmb3Jtcy5zZXQobVsxXSwgbVsyXSk7IH1cbiAgcmV0dXJuIHRyYW5zZm9ybXM7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybVZhbHVlKGVsLCBwcm9wTmFtZSwgYW5pbWF0YWJsZSwgdW5pdCkge1xuICB2YXIgZGVmYXVsdFZhbCA9IHN0cmluZ0NvbnRhaW5zKHByb3BOYW1lLCAnc2NhbGUnKSA/IDEgOiAwICsgZ2V0VHJhbnNmb3JtVW5pdChwcm9wTmFtZSk7XG4gIHZhciB2YWx1ZSA9IGdldEVsZW1lbnRUcmFuc2Zvcm1zKGVsKS5nZXQocHJvcE5hbWUpIHx8IGRlZmF1bHRWYWw7XG4gIGlmIChhbmltYXRhYmxlKSB7XG4gICAgYW5pbWF0YWJsZS50cmFuc2Zvcm1zLmxpc3Quc2V0KHByb3BOYW1lLCB2YWx1ZSk7XG4gICAgYW5pbWF0YWJsZS50cmFuc2Zvcm1zWydsYXN0J10gPSBwcm9wTmFtZTtcbiAgfVxuICByZXR1cm4gdW5pdCA/IGNvbnZlcnRQeFRvVW5pdChlbCwgdmFsdWUsIHVuaXQpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldE9yaWdpbmFsVGFyZ2V0VmFsdWUodGFyZ2V0LCBwcm9wTmFtZSwgdW5pdCwgYW5pbWF0YWJsZSkge1xuICBzd2l0Y2ggKGdldEFuaW1hdGlvblR5cGUodGFyZ2V0LCBwcm9wTmFtZSkpIHtcbiAgICBjYXNlICd0cmFuc2Zvcm0nOiByZXR1cm4gZ2V0VHJhbnNmb3JtVmFsdWUodGFyZ2V0LCBwcm9wTmFtZSwgYW5pbWF0YWJsZSwgdW5pdCk7XG4gICAgY2FzZSAnY3NzJzogcmV0dXJuIGdldENTU1ZhbHVlKHRhcmdldCwgcHJvcE5hbWUsIHVuaXQpO1xuICAgIGNhc2UgJ2F0dHJpYnV0ZSc6IHJldHVybiBnZXRBdHRyaWJ1dGUodGFyZ2V0LCBwcm9wTmFtZSk7XG4gICAgZGVmYXVsdDogcmV0dXJuIHRhcmdldFtwcm9wTmFtZV0gfHwgMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVZhbHVlKHRvLCBmcm9tKSB7XG4gIHZhciBvcGVyYXRvciA9IC9eKFxcKj18XFwrPXwtPSkvLmV4ZWModG8pO1xuICBpZiAoIW9wZXJhdG9yKSB7IHJldHVybiB0bzsgfVxuICB2YXIgdSA9IGdldFVuaXQodG8pIHx8IDA7XG4gIHZhciB4ID0gcGFyc2VGbG9hdChmcm9tKTtcbiAgdmFyIHkgPSBwYXJzZUZsb2F0KHRvLnJlcGxhY2Uob3BlcmF0b3JbMF0sICcnKSk7XG4gIHN3aXRjaCAob3BlcmF0b3JbMF1bMF0pIHtcbiAgICBjYXNlICcrJzogcmV0dXJuIHggKyB5ICsgdTtcbiAgICBjYXNlICctJzogcmV0dXJuIHggLSB5ICsgdTtcbiAgICBjYXNlICcqJzogcmV0dXJuIHggKiB5ICsgdTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbCwgdW5pdCkge1xuICBpZiAoaXMuY29sKHZhbCkpIHsgcmV0dXJuIGNvbG9yVG9SZ2IodmFsKTsgfVxuICBpZiAoL1xccy9nLnRlc3QodmFsKSkgeyByZXR1cm4gdmFsOyB9XG4gIHZhciBvcmlnaW5hbFVuaXQgPSBnZXRVbml0KHZhbCk7XG4gIHZhciB1bml0TGVzcyA9IG9yaWdpbmFsVW5pdCA/IHZhbC5zdWJzdHIoMCwgdmFsLmxlbmd0aCAtIG9yaWdpbmFsVW5pdC5sZW5ndGgpIDogdmFsO1xuICBpZiAodW5pdCkgeyByZXR1cm4gdW5pdExlc3MgKyB1bml0OyB9XG4gIHJldHVybiB1bml0TGVzcztcbn1cblxuLy8gZ2V0VG90YWxMZW5ndGgoKSBlcXVpdmFsZW50IGZvciBjaXJjbGUsIHJlY3QsIHBvbHlsaW5lLCBwb2x5Z29uIGFuZCBsaW5lIHNoYXBlc1xuLy8gYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1NlYkxhbWJsYS8zZTA1NTBjNDk2YzIzNjcwOTc0NFxuXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwMSwgcDIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwMi54IC0gcDEueCwgMikgKyBNYXRoLnBvdyhwMi55IC0gcDEueSwgMikpO1xufVxuXG5mdW5jdGlvbiBnZXRDaXJjbGVMZW5ndGgoZWwpIHtcbiAgcmV0dXJuIE1hdGguUEkgKiAyICogZ2V0QXR0cmlidXRlKGVsLCAncicpO1xufVxuXG5mdW5jdGlvbiBnZXRSZWN0TGVuZ3RoKGVsKSB7XG4gIHJldHVybiAoZ2V0QXR0cmlidXRlKGVsLCAnd2lkdGgnKSAqIDIpICsgKGdldEF0dHJpYnV0ZShlbCwgJ2hlaWdodCcpICogMik7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgoZWwpIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlKFxuICAgIHt4OiBnZXRBdHRyaWJ1dGUoZWwsICd4MScpLCB5OiBnZXRBdHRyaWJ1dGUoZWwsICd5MScpfSwgXG4gICAge3g6IGdldEF0dHJpYnV0ZShlbCwgJ3gyJyksIHk6IGdldEF0dHJpYnV0ZShlbCwgJ3kyJyl9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFBvbHlsaW5lTGVuZ3RoKGVsKSB7XG4gIHZhciBwb2ludHMgPSBlbC5wb2ludHM7XG4gIHZhciB0b3RhbExlbmd0aCA9IDA7XG4gIHZhciBwcmV2aW91c1BvcztcbiAgZm9yICh2YXIgaSA9IDAgOyBpIDwgcG9pbnRzLm51bWJlck9mSXRlbXM7IGkrKykge1xuICAgIHZhciBjdXJyZW50UG9zID0gcG9pbnRzLmdldEl0ZW0oaSk7XG4gICAgaWYgKGkgPiAwKSB7IHRvdGFsTGVuZ3RoICs9IGdldERpc3RhbmNlKHByZXZpb3VzUG9zLCBjdXJyZW50UG9zKTsgfVxuICAgIHByZXZpb3VzUG9zID0gY3VycmVudFBvcztcbiAgfVxuICByZXR1cm4gdG90YWxMZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGdldFBvbHlnb25MZW5ndGgoZWwpIHtcbiAgdmFyIHBvaW50cyA9IGVsLnBvaW50cztcbiAgcmV0dXJuIGdldFBvbHlsaW5lTGVuZ3RoKGVsKSArIGdldERpc3RhbmNlKHBvaW50cy5nZXRJdGVtKHBvaW50cy5udW1iZXJPZkl0ZW1zIC0gMSksIHBvaW50cy5nZXRJdGVtKDApKTtcbn1cblxuLy8gUGF0aCBhbmltYXRpb25cblxuZnVuY3Rpb24gZ2V0VG90YWxMZW5ndGgoZWwpIHtcbiAgaWYgKGVsLmdldFRvdGFsTGVuZ3RoKSB7IHJldHVybiBlbC5nZXRUb3RhbExlbmd0aCgpOyB9XG4gIHN3aXRjaChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdjaXJjbGUnOiByZXR1cm4gZ2V0Q2lyY2xlTGVuZ3RoKGVsKTtcbiAgICBjYXNlICdyZWN0JzogcmV0dXJuIGdldFJlY3RMZW5ndGgoZWwpO1xuICAgIGNhc2UgJ2xpbmUnOiByZXR1cm4gZ2V0TGluZUxlbmd0aChlbCk7XG4gICAgY2FzZSAncG9seWxpbmUnOiByZXR1cm4gZ2V0UG9seWxpbmVMZW5ndGgoZWwpO1xuICAgIGNhc2UgJ3BvbHlnb24nOiByZXR1cm4gZ2V0UG9seWdvbkxlbmd0aChlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RGFzaG9mZnNldChlbCkge1xuICB2YXIgcGF0aExlbmd0aCA9IGdldFRvdGFsTGVuZ3RoKGVsKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5JywgcGF0aExlbmd0aCk7XG4gIHJldHVybiBwYXRoTGVuZ3RoO1xufVxuXG4vLyBNb3Rpb24gcGF0aFxuXG5mdW5jdGlvbiBnZXRQYXJlbnRTdmdFbChlbCkge1xuICB2YXIgcGFyZW50RWwgPSBlbC5wYXJlbnROb2RlO1xuICB3aGlsZSAoaXMuc3ZnKHBhcmVudEVsKSkge1xuICAgIGlmICghaXMuc3ZnKHBhcmVudEVsLnBhcmVudE5vZGUpKSB7IGJyZWFrOyB9XG4gICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBwYXJlbnRFbDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3ZnKHBhdGhFbCwgc3ZnRGF0YSkge1xuICB2YXIgc3ZnID0gc3ZnRGF0YSB8fCB7fTtcbiAgdmFyIHBhcmVudFN2Z0VsID0gc3ZnLmVsIHx8IGdldFBhcmVudFN2Z0VsKHBhdGhFbCk7XG4gIHZhciByZWN0ID0gcGFyZW50U3ZnRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciB2aWV3Qm94QXR0ciA9IGdldEF0dHJpYnV0ZShwYXJlbnRTdmdFbCwgJ3ZpZXdCb3gnKTtcbiAgdmFyIHdpZHRoID0gcmVjdC53aWR0aDtcbiAgdmFyIGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB2YXIgdmlld0JveCA9IHN2Zy52aWV3Qm94IHx8ICh2aWV3Qm94QXR0ciA/IHZpZXdCb3hBdHRyLnNwbGl0KCcgJykgOiBbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuICByZXR1cm4ge1xuICAgIGVsOiBwYXJlbnRTdmdFbCxcbiAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgIHg6IHZpZXdCb3hbMF0gLyAxLFxuICAgIHk6IHZpZXdCb3hbMV0gLyAxLFxuICAgIHc6IHdpZHRoIC8gdmlld0JveFsyXSxcbiAgICBoOiBoZWlnaHQgLyB2aWV3Qm94WzNdXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGF0aChwYXRoLCBwZXJjZW50KSB7XG4gIHZhciBwYXRoRWwgPSBpcy5zdHIocGF0aCkgPyBzZWxlY3RTdHJpbmcocGF0aClbMF0gOiBwYXRoO1xuICB2YXIgcCA9IHBlcmNlbnQgfHwgMTAwO1xuICByZXR1cm4gZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgZWw6IHBhdGhFbCxcbiAgICAgIHN2ZzogZ2V0UGFyZW50U3ZnKHBhdGhFbCksXG4gICAgICB0b3RhbExlbmd0aDogZ2V0VG90YWxMZW5ndGgocGF0aEVsKSAqIChwIC8gMTAwKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYXRoUHJvZ3Jlc3MocGF0aCwgcHJvZ3Jlc3MpIHtcbiAgZnVuY3Rpb24gcG9pbnQob2Zmc2V0KSB7XG4gICAgaWYgKCBvZmZzZXQgPT09IHZvaWQgMCApIG9mZnNldCA9IDA7XG5cbiAgICB2YXIgbCA9IHByb2dyZXNzICsgb2Zmc2V0ID49IDEgPyBwcm9ncmVzcyArIG9mZnNldCA6IDA7XG4gICAgcmV0dXJuIHBhdGguZWwuZ2V0UG9pbnRBdExlbmd0aChsKTtcbiAgfVxuICB2YXIgc3ZnID0gZ2V0UGFyZW50U3ZnKHBhdGguZWwsIHBhdGguc3ZnKTtcbiAgdmFyIHAgPSBwb2ludCgpO1xuICB2YXIgcDAgPSBwb2ludCgtMSk7XG4gIHZhciBwMSA9IHBvaW50KCsxKTtcbiAgc3dpdGNoIChwYXRoLnByb3BlcnR5KSB7XG4gICAgY2FzZSAneCc6IHJldHVybiAocC54IC0gc3ZnLngpICogc3ZnLnc7XG4gICAgY2FzZSAneSc6IHJldHVybiAocC55IC0gc3ZnLnkpICogc3ZnLmg7XG4gICAgY2FzZSAnYW5nbGUnOiByZXR1cm4gTWF0aC5hdGFuMihwMS55IC0gcDAueSwgcDEueCAtIHAwLngpICogMTgwIC8gTWF0aC5QSTtcbiAgfVxufVxuXG4vLyBEZWNvbXBvc2UgdmFsdWVcblxuZnVuY3Rpb24gZGVjb21wb3NlVmFsdWUodmFsLCB1bml0KSB7XG4gIC8vIGNvbnN0IHJneCA9IC8tP1xcZCpcXC4/XFxkKy9nOyAvLyBoYW5kbGVzIGJhc2ljIG51bWJlcnNcbiAgLy8gY29uc3Qgcmd4ID0gL1srLV0/XFxkKyg/OlxcLlxcZCspPyg/OltlRV1bKy1dP1xcZCspPy9nOyAvLyBoYW5kbGVzIGV4cG9uZW50cyBub3RhdGlvblxuICB2YXIgcmd4ID0gL1srLV0/XFxkKlxcLj9cXGQrKD86XFwuXFxkKyk/KD86W2VFXVsrLV0/XFxkKyk/L2c7IC8vIGhhbmRsZXMgZXhwb25lbnRzIG5vdGF0aW9uXG4gIHZhciB2YWx1ZSA9IHZhbGlkYXRlVmFsdWUoKGlzLnB0aCh2YWwpID8gdmFsLnRvdGFsTGVuZ3RoIDogdmFsKSwgdW5pdCkgKyAnJztcbiAgcmV0dXJuIHtcbiAgICBvcmlnaW5hbDogdmFsdWUsXG4gICAgbnVtYmVyczogdmFsdWUubWF0Y2gocmd4KSA/IHZhbHVlLm1hdGNoKHJneCkubWFwKE51bWJlcikgOiBbMF0sXG4gICAgc3RyaW5nczogKGlzLnN0cih2YWwpIHx8IHVuaXQpID8gdmFsdWUuc3BsaXQocmd4KSA6IFtdXG4gIH1cbn1cblxuLy8gQW5pbWF0YWJsZXNcblxuZnVuY3Rpb24gcGFyc2VUYXJnZXRzKHRhcmdldHMpIHtcbiAgdmFyIHRhcmdldHNBcnJheSA9IHRhcmdldHMgPyAoZmxhdHRlbkFycmF5KGlzLmFycih0YXJnZXRzKSA/IHRhcmdldHMubWFwKHRvQXJyYXkpIDogdG9BcnJheSh0YXJnZXRzKSkpIDogW107XG4gIHJldHVybiBmaWx0ZXJBcnJheSh0YXJnZXRzQXJyYXksIGZ1bmN0aW9uIChpdGVtLCBwb3MsIHNlbGYpIHsgcmV0dXJuIHNlbGYuaW5kZXhPZihpdGVtKSA9PT0gcG9zOyB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QW5pbWF0YWJsZXModGFyZ2V0cykge1xuICB2YXIgcGFyc2VkID0gcGFyc2VUYXJnZXRzKHRhcmdldHMpO1xuICByZXR1cm4gcGFyc2VkLm1hcChmdW5jdGlvbiAodCwgaSkge1xuICAgIHJldHVybiB7dGFyZ2V0OiB0LCBpZDogaSwgdG90YWw6IHBhcnNlZC5sZW5ndGgsIHRyYW5zZm9ybXM6IHsgbGlzdDogZ2V0RWxlbWVudFRyYW5zZm9ybXModCkgfSB9O1xuICB9KTtcbn1cblxuLy8gUHJvcGVydGllc1xuXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eVR3ZWVucyhwcm9wLCB0d2VlblNldHRpbmdzKSB7XG4gIHZhciBzZXR0aW5ncyA9IGNsb25lT2JqZWN0KHR3ZWVuU2V0dGluZ3MpO1xuICAvLyBPdmVycmlkZSBkdXJhdGlvbiBpZiBlYXNpbmcgaXMgYSBzcHJpbmdcbiAgaWYgKC9ec3ByaW5nLy50ZXN0KHNldHRpbmdzLmVhc2luZykpIHsgc2V0dGluZ3MuZHVyYXRpb24gPSBzcHJpbmcoc2V0dGluZ3MuZWFzaW5nKTsgfVxuICBpZiAoaXMuYXJyKHByb3ApKSB7XG4gICAgdmFyIGwgPSBwcm9wLmxlbmd0aDtcbiAgICB2YXIgaXNGcm9tVG8gPSAobCA9PT0gMiAmJiAhaXMub2JqKHByb3BbMF0pKTtcbiAgICBpZiAoIWlzRnJvbVRvKSB7XG4gICAgICAvLyBEdXJhdGlvbiBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgdHdlZW5zXG4gICAgICBpZiAoIWlzLmZuYyh0d2VlblNldHRpbmdzLmR1cmF0aW9uKSkgeyBzZXR0aW5ncy5kdXJhdGlvbiA9IHR3ZWVuU2V0dGluZ3MuZHVyYXRpb24gLyBsOyB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYW5zZm9ybSBbZnJvbSwgdG9dIHZhbHVlcyBzaG9ydGhhbmQgdG8gYSB2YWxpZCB0d2VlbiB2YWx1ZVxuICAgICAgcHJvcCA9IHt2YWx1ZTogcHJvcH07XG4gICAgfVxuICB9XG4gIHZhciBwcm9wQXJyYXkgPSBpcy5hcnIocHJvcCkgPyBwcm9wIDogW3Byb3BdO1xuICByZXR1cm4gcHJvcEFycmF5Lm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgIHZhciBvYmogPSAoaXMub2JqKHYpICYmICFpcy5wdGgodikpID8gdiA6IHt2YWx1ZTogdn07XG4gICAgLy8gRGVmYXVsdCBkZWxheSB2YWx1ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBmaXJzdCB0d2VlblxuICAgIGlmIChpcy51bmQob2JqLmRlbGF5KSkgeyBvYmouZGVsYXkgPSAhaSA/IHR3ZWVuU2V0dGluZ3MuZGVsYXkgOiAwOyB9XG4gICAgLy8gRGVmYXVsdCBlbmREZWxheSB2YWx1ZSBzaG91bGQgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBsYXN0IHR3ZWVuXG4gICAgaWYgKGlzLnVuZChvYmouZW5kRGVsYXkpKSB7IG9iai5lbmREZWxheSA9IGkgPT09IHByb3BBcnJheS5sZW5ndGggLSAxID8gdHdlZW5TZXR0aW5ncy5lbmREZWxheSA6IDA7IH1cbiAgICByZXR1cm4gb2JqO1xuICB9KS5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIG1lcmdlT2JqZWN0cyhrLCBzZXR0aW5ncyk7IH0pO1xufVxuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5LZXlmcmFtZXMoa2V5ZnJhbWVzKSB7XG4gIHZhciBwcm9wZXJ0eU5hbWVzID0gZmlsdGVyQXJyYXkoZmxhdHRlbkFycmF5KGtleWZyYW1lcy5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gT2JqZWN0LmtleXMoa2V5KTsgfSkpLCBmdW5jdGlvbiAocCkgeyByZXR1cm4gaXMua2V5KHApOyB9KVxuICAucmVkdWNlKGZ1bmN0aW9uIChhLGIpIHsgaWYgKGEuaW5kZXhPZihiKSA8IDApIHsgYS5wdXNoKGIpOyB9IHJldHVybiBhOyB9LCBbXSk7XG4gIHZhciBwcm9wZXJ0aWVzID0ge307XG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuICAgIHZhciBwcm9wTmFtZSA9IHByb3BlcnR5TmFtZXNbaV07XG4gICAgcHJvcGVydGllc1twcm9wTmFtZV0gPSBrZXlmcmFtZXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBuZXdLZXkgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4ga2V5KSB7XG4gICAgICAgIGlmIChpcy5rZXkocCkpIHtcbiAgICAgICAgICBpZiAocCA9PSBwcm9wTmFtZSkgeyBuZXdLZXkudmFsdWUgPSBrZXlbcF07IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdLZXlbcF0gPSBrZXlbcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdLZXk7XG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSBsb29wKCBpICk7XG4gIHJldHVybiBwcm9wZXJ0aWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKHR3ZWVuU2V0dGluZ3MsIHBhcmFtcykge1xuICB2YXIgcHJvcGVydGllcyA9IFtdO1xuICB2YXIga2V5ZnJhbWVzID0gcGFyYW1zLmtleWZyYW1lcztcbiAgaWYgKGtleWZyYW1lcykgeyBwYXJhbXMgPSBtZXJnZU9iamVjdHMoZmxhdHRlbktleWZyYW1lcyhrZXlmcmFtZXMpLCBwYXJhbXMpOyB9XG4gIGZvciAodmFyIHAgaW4gcGFyYW1zKSB7XG4gICAgaWYgKGlzLmtleShwKSkge1xuICAgICAgcHJvcGVydGllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogcCxcbiAgICAgICAgdHdlZW5zOiBub3JtYWxpemVQcm9wZXJ0eVR3ZWVucyhwYXJhbXNbcF0sIHR3ZWVuU2V0dGluZ3MpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59XG5cbi8vIFR3ZWVuc1xuXG5mdW5jdGlvbiBub3JtYWxpemVUd2VlblZhbHVlcyh0d2VlbiwgYW5pbWF0YWJsZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHR3ZWVuKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0RnVuY3Rpb25WYWx1ZSh0d2VlbltwXSwgYW5pbWF0YWJsZSk7XG4gICAgaWYgKGlzLmFycih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBnZXRGdW5jdGlvblZhbHVlKHYsIGFuaW1hdGFibGUpOyB9KTtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsgdmFsdWUgPSB2YWx1ZVswXTsgfVxuICAgIH1cbiAgICB0W3BdID0gdmFsdWU7XG4gIH1cbiAgdC5kdXJhdGlvbiA9IHBhcnNlRmxvYXQodC5kdXJhdGlvbik7XG4gIHQuZGVsYXkgPSBwYXJzZUZsb2F0KHQuZGVsYXkpO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHdlZW5zKHByb3AsIGFuaW1hdGFibGUpIHtcbiAgdmFyIHByZXZpb3VzVHdlZW47XG4gIHJldHVybiBwcm9wLnR3ZWVucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICB2YXIgdHdlZW4gPSBub3JtYWxpemVUd2VlblZhbHVlcyh0LCBhbmltYXRhYmxlKTtcbiAgICB2YXIgdHdlZW5WYWx1ZSA9IHR3ZWVuLnZhbHVlO1xuICAgIHZhciB0byA9IGlzLmFycih0d2VlblZhbHVlKSA/IHR3ZWVuVmFsdWVbMV0gOiB0d2VlblZhbHVlO1xuICAgIHZhciB0b1VuaXQgPSBnZXRVbml0KHRvKTtcbiAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IGdldE9yaWdpbmFsVGFyZ2V0VmFsdWUoYW5pbWF0YWJsZS50YXJnZXQsIHByb3AubmFtZSwgdG9Vbml0LCBhbmltYXRhYmxlKTtcbiAgICB2YXIgcHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzVHdlZW4gPyBwcmV2aW91c1R3ZWVuLnRvLm9yaWdpbmFsIDogb3JpZ2luYWxWYWx1ZTtcbiAgICB2YXIgZnJvbSA9IGlzLmFycih0d2VlblZhbHVlKSA/IHR3ZWVuVmFsdWVbMF0gOiBwcmV2aW91c1ZhbHVlO1xuICAgIHZhciBmcm9tVW5pdCA9IGdldFVuaXQoZnJvbSkgfHwgZ2V0VW5pdChvcmlnaW5hbFZhbHVlKTtcbiAgICB2YXIgdW5pdCA9IHRvVW5pdCB8fCBmcm9tVW5pdDtcbiAgICBpZiAoaXMudW5kKHRvKSkgeyB0byA9IHByZXZpb3VzVmFsdWU7IH1cbiAgICB0d2Vlbi5mcm9tID0gZGVjb21wb3NlVmFsdWUoZnJvbSwgdW5pdCk7XG4gICAgdHdlZW4udG8gPSBkZWNvbXBvc2VWYWx1ZShnZXRSZWxhdGl2ZVZhbHVlKHRvLCBmcm9tKSwgdW5pdCk7XG4gICAgdHdlZW4uc3RhcnQgPSBwcmV2aW91c1R3ZWVuID8gcHJldmlvdXNUd2Vlbi5lbmQgOiAwO1xuICAgIHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0ICsgdHdlZW4uZGVsYXkgKyB0d2Vlbi5kdXJhdGlvbiArIHR3ZWVuLmVuZERlbGF5O1xuICAgIHR3ZWVuLmVhc2luZyA9IHBhcnNlRWFzaW5ncyh0d2Vlbi5lYXNpbmcsIHR3ZWVuLmR1cmF0aW9uKTtcbiAgICB0d2Vlbi5pc1BhdGggPSBpcy5wdGgodHdlZW5WYWx1ZSk7XG4gICAgdHdlZW4uaXNDb2xvciA9IGlzLmNvbCh0d2Vlbi5mcm9tLm9yaWdpbmFsKTtcbiAgICBpZiAodHdlZW4uaXNDb2xvcikgeyB0d2Vlbi5yb3VuZCA9IDE7IH1cbiAgICBwcmV2aW91c1R3ZWVuID0gdHdlZW47XG4gICAgcmV0dXJuIHR3ZWVuO1xuICB9KTtcbn1cblxuLy8gVHdlZW4gcHJvZ3Jlc3NcblxudmFyIHNldFByb2dyZXNzVmFsdWUgPSB7XG4gIGNzczogZnVuY3Rpb24gKHQsIHAsIHYpIHsgcmV0dXJuIHQuc3R5bGVbcF0gPSB2OyB9LFxuICBhdHRyaWJ1dGU6IGZ1bmN0aW9uICh0LCBwLCB2KSB7IHJldHVybiB0LnNldEF0dHJpYnV0ZShwLCB2KTsgfSxcbiAgb2JqZWN0OiBmdW5jdGlvbiAodCwgcCwgdikgeyByZXR1cm4gdFtwXSA9IHY7IH0sXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gKHQsIHAsIHYsIHRyYW5zZm9ybXMsIG1hbnVhbCkge1xuICAgIHRyYW5zZm9ybXMubGlzdC5zZXQocCwgdik7XG4gICAgaWYgKHAgPT09IHRyYW5zZm9ybXMubGFzdCB8fCBtYW51YWwpIHtcbiAgICAgIHZhciBzdHIgPSAnJztcbiAgICAgIHRyYW5zZm9ybXMubGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgeyBzdHIgKz0gcHJvcCArIFwiKFwiICsgdmFsdWUgKyBcIikgXCI7IH0pO1xuICAgICAgdC5zdHlsZS50cmFuc2Zvcm0gPSBzdHI7XG4gICAgfVxuICB9XG59O1xuXG4vLyBTZXQgVmFsdWUgaGVscGVyXG5cbmZ1bmN0aW9uIHNldFRhcmdldHNWYWx1ZSh0YXJnZXRzLCBwcm9wZXJ0aWVzKSB7XG4gIHZhciBhbmltYXRhYmxlcyA9IGdldEFuaW1hdGFibGVzKHRhcmdldHMpO1xuICBhbmltYXRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRhYmxlKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0RnVuY3Rpb25WYWx1ZShwcm9wZXJ0aWVzW3Byb3BlcnR5XSwgYW5pbWF0YWJsZSk7XG4gICAgICB2YXIgdGFyZ2V0ID0gYW5pbWF0YWJsZS50YXJnZXQ7XG4gICAgICB2YXIgdmFsdWVVbml0ID0gZ2V0VW5pdCh2YWx1ZSk7XG4gICAgICB2YXIgb3JpZ2luYWxWYWx1ZSA9IGdldE9yaWdpbmFsVGFyZ2V0VmFsdWUodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWVVbml0LCBhbmltYXRhYmxlKTtcbiAgICAgIHZhciB1bml0ID0gdmFsdWVVbml0IHx8IGdldFVuaXQob3JpZ2luYWxWYWx1ZSk7XG4gICAgICB2YXIgdG8gPSBnZXRSZWxhdGl2ZVZhbHVlKHZhbGlkYXRlVmFsdWUodmFsdWUsIHVuaXQpLCBvcmlnaW5hbFZhbHVlKTtcbiAgICAgIHZhciBhbmltVHlwZSA9IGdldEFuaW1hdGlvblR5cGUodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICBzZXRQcm9ncmVzc1ZhbHVlW2FuaW1UeXBlXSh0YXJnZXQsIHByb3BlcnR5LCB0bywgYW5pbWF0YWJsZS50cmFuc2Zvcm1zLCB0cnVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBBbmltYXRpb25zXG5cbmZ1bmN0aW9uIGNyZWF0ZUFuaW1hdGlvbihhbmltYXRhYmxlLCBwcm9wKSB7XG4gIHZhciBhbmltVHlwZSA9IGdldEFuaW1hdGlvblR5cGUoYW5pbWF0YWJsZS50YXJnZXQsIHByb3AubmFtZSk7XG4gIGlmIChhbmltVHlwZSkge1xuICAgIHZhciB0d2VlbnMgPSBub3JtYWxpemVUd2VlbnMocHJvcCwgYW5pbWF0YWJsZSk7XG4gICAgdmFyIGxhc3RUd2VlbiA9IHR3ZWVuc1t0d2VlbnMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IGFuaW1UeXBlLFxuICAgICAgcHJvcGVydHk6IHByb3AubmFtZSxcbiAgICAgIGFuaW1hdGFibGU6IGFuaW1hdGFibGUsXG4gICAgICB0d2VlbnM6IHR3ZWVucyxcbiAgICAgIGR1cmF0aW9uOiBsYXN0VHdlZW4uZW5kLFxuICAgICAgZGVsYXk6IHR3ZWVuc1swXS5kZWxheSxcbiAgICAgIGVuZERlbGF5OiBsYXN0VHdlZW4uZW5kRGVsYXlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9ucyhhbmltYXRhYmxlcywgcHJvcGVydGllcykge1xuICByZXR1cm4gZmlsdGVyQXJyYXkoZmxhdHRlbkFycmF5KGFuaW1hdGFibGVzLm1hcChmdW5jdGlvbiAoYW5pbWF0YWJsZSkge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbihhbmltYXRhYmxlLCBwcm9wKTtcbiAgICB9KTtcbiAgfSkpLCBmdW5jdGlvbiAoYSkgeyByZXR1cm4gIWlzLnVuZChhKTsgfSk7XG59XG5cbi8vIENyZWF0ZSBJbnN0YW5jZVxuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZVRpbWluZ3MoYW5pbWF0aW9ucywgdHdlZW5TZXR0aW5ncykge1xuICB2YXIgYW5pbUxlbmd0aCA9IGFuaW1hdGlvbnMubGVuZ3RoO1xuICB2YXIgZ2V0VGxPZmZzZXQgPSBmdW5jdGlvbiAoYW5pbSkgeyByZXR1cm4gYW5pbS50aW1lbGluZU9mZnNldCA/IGFuaW0udGltZWxpbmVPZmZzZXQgOiAwOyB9O1xuICB2YXIgdGltaW5ncyA9IHt9O1xuICB0aW1pbmdzLmR1cmF0aW9uID0gYW5pbUxlbmd0aCA/IE1hdGgubWF4LmFwcGx5KE1hdGgsIGFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmltKSB7IHJldHVybiBnZXRUbE9mZnNldChhbmltKSArIGFuaW0uZHVyYXRpb247IH0pKSA6IHR3ZWVuU2V0dGluZ3MuZHVyYXRpb247XG4gIHRpbWluZ3MuZGVsYXkgPSBhbmltTGVuZ3RoID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgYW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24gKGFuaW0pIHsgcmV0dXJuIGdldFRsT2Zmc2V0KGFuaW0pICsgYW5pbS5kZWxheTsgfSkpIDogdHdlZW5TZXR0aW5ncy5kZWxheTtcbiAgdGltaW5ncy5lbmREZWxheSA9IGFuaW1MZW5ndGggPyB0aW1pbmdzLmR1cmF0aW9uIC0gTWF0aC5tYXguYXBwbHkoTWF0aCwgYW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24gKGFuaW0pIHsgcmV0dXJuIGdldFRsT2Zmc2V0KGFuaW0pICsgYW5pbS5kdXJhdGlvbiAtIGFuaW0uZW5kRGVsYXk7IH0pKSA6IHR3ZWVuU2V0dGluZ3MuZW5kRGVsYXk7XG4gIHJldHVybiB0aW1pbmdzO1xufVxuXG52YXIgaW5zdGFuY2VJRCA9IDA7XG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld0luc3RhbmNlKHBhcmFtcykge1xuICB2YXIgaW5zdGFuY2VTZXR0aW5ncyA9IHJlcGxhY2VPYmplY3RQcm9wcyhkZWZhdWx0SW5zdGFuY2VTZXR0aW5ncywgcGFyYW1zKTtcbiAgdmFyIHR3ZWVuU2V0dGluZ3MgPSByZXBsYWNlT2JqZWN0UHJvcHMoZGVmYXVsdFR3ZWVuU2V0dGluZ3MsIHBhcmFtcyk7XG4gIHZhciBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyh0d2VlblNldHRpbmdzLCBwYXJhbXMpO1xuICB2YXIgYW5pbWF0YWJsZXMgPSBnZXRBbmltYXRhYmxlcyhwYXJhbXMudGFyZ2V0cyk7XG4gIHZhciBhbmltYXRpb25zID0gZ2V0QW5pbWF0aW9ucyhhbmltYXRhYmxlcywgcHJvcGVydGllcyk7XG4gIHZhciB0aW1pbmdzID0gZ2V0SW5zdGFuY2VUaW1pbmdzKGFuaW1hdGlvbnMsIHR3ZWVuU2V0dGluZ3MpO1xuICB2YXIgaWQgPSBpbnN0YW5jZUlEO1xuICBpbnN0YW5jZUlEKys7XG4gIHJldHVybiBtZXJnZU9iamVjdHMoaW5zdGFuY2VTZXR0aW5ncywge1xuICAgIGlkOiBpZCxcbiAgICBjaGlsZHJlbjogW10sXG4gICAgYW5pbWF0YWJsZXM6IGFuaW1hdGFibGVzLFxuICAgIGFuaW1hdGlvbnM6IGFuaW1hdGlvbnMsXG4gICAgZHVyYXRpb246IHRpbWluZ3MuZHVyYXRpb24sXG4gICAgZGVsYXk6IHRpbWluZ3MuZGVsYXksXG4gICAgZW5kRGVsYXk6IHRpbWluZ3MuZW5kRGVsYXlcbiAgfSk7XG59XG5cbi8vIENvcmVcblxudmFyIGFjdGl2ZUluc3RhbmNlcyA9IFtdO1xudmFyIHBhdXNlZEluc3RhbmNlcyA9IFtdO1xudmFyIHJhZjtcblxudmFyIGVuZ2luZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHBsYXkoKSB7IFxuICAgIHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgfVxuICBmdW5jdGlvbiBzdGVwKHQpIHtcbiAgICB2YXIgYWN0aXZlSW5zdGFuY2VzTGVuZ3RoID0gYWN0aXZlSW5zdGFuY2VzLmxlbmd0aDtcbiAgICBpZiAoYWN0aXZlSW5zdGFuY2VzTGVuZ3RoKSB7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IGFjdGl2ZUluc3RhbmNlc0xlbmd0aCkge1xuICAgICAgICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBhY3RpdmVJbnN0YW5jZXNbaV07XG4gICAgICAgIGlmICghYWN0aXZlSW5zdGFuY2UucGF1c2VkKSB7XG4gICAgICAgICAgYWN0aXZlSW5zdGFuY2UudGljayh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2VJbmRleCA9IGFjdGl2ZUluc3RhbmNlcy5pbmRleE9mKGFjdGl2ZUluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2VJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBhY3RpdmVJbnN0YW5jZXMuc3BsaWNlKGluc3RhbmNlSW5kZXgsIDEpO1xuICAgICAgICAgICAgYWN0aXZlSW5zdGFuY2VzTGVuZ3RoID0gYWN0aXZlSW5zdGFuY2VzLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcGxheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYWYgPSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGxheTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGhhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKSB7XG4gIGlmIChkb2N1bWVudC5oaWRkZW4pIHtcbiAgICBhY3RpdmVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zKSB7IHJldHVybiBpbnMucGF1c2UoKTsgfSk7XG4gICAgcGF1c2VkSW5zdGFuY2VzID0gYWN0aXZlSW5zdGFuY2VzLnNsaWNlKDApO1xuICAgIGFuaW1lLnJ1bm5pbmcgPSBhY3RpdmVJbnN0YW5jZXMgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBwYXVzZWRJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zKSB7IHJldHVybiBpbnMucGxheSgpOyB9KTtcbiAgfVxufVxuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgaGFuZGxlVmlzaWJpbGl0eUNoYW5nZSk7XG59XG5cbi8vIFB1YmxpYyBJbnN0YW5jZVxuXG5mdW5jdGlvbiBhbmltZShwYXJhbXMpIHtcbiAgaWYgKCBwYXJhbXMgPT09IHZvaWQgMCApIHBhcmFtcyA9IHt9O1xuXG5cbiAgdmFyIHN0YXJ0VGltZSA9IDAsIGxhc3RUaW1lID0gMCwgbm93ID0gMDtcbiAgdmFyIGNoaWxkcmVuLCBjaGlsZHJlbkxlbmd0aCA9IDA7XG4gIHZhciByZXNvbHZlID0gbnVsbDtcblxuICBmdW5jdGlvbiBtYWtlUHJvbWlzZShpbnN0YW5jZSkge1xuICAgIHZhciBwcm9taXNlID0gd2luZG93LlByb21pc2UgJiYgbmV3IFByb21pc2UoZnVuY3Rpb24gKF9yZXNvbHZlKSB7IHJldHVybiByZXNvbHZlID0gX3Jlc29sdmU7IH0pO1xuICAgIGluc3RhbmNlLmZpbmlzaGVkID0gcHJvbWlzZTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IGNyZWF0ZU5ld0luc3RhbmNlKHBhcmFtcyk7XG4gIHZhciBwcm9taXNlID0gbWFrZVByb21pc2UoaW5zdGFuY2UpO1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZUluc3RhbmNlRGlyZWN0aW9uKCkge1xuICAgIHZhciBkaXJlY3Rpb24gPSBpbnN0YW5jZS5kaXJlY3Rpb247XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ2FsdGVybmF0ZScpIHtcbiAgICAgIGluc3RhbmNlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiAhPT0gJ25vcm1hbCcgPyAnbm9ybWFsJyA6ICdyZXZlcnNlJztcbiAgICB9XG4gICAgaW5zdGFuY2UucmV2ZXJzZWQgPSAhaW5zdGFuY2UucmV2ZXJzZWQ7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLnJldmVyc2VkID0gaW5zdGFuY2UucmV2ZXJzZWQ7IH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRqdXN0VGltZSh0aW1lKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLnJldmVyc2VkID8gaW5zdGFuY2UuZHVyYXRpb24gLSB0aW1lIDogdGltZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VGltZSgpIHtcbiAgICBzdGFydFRpbWUgPSAwO1xuICAgIGxhc3RUaW1lID0gYWRqdXN0VGltZShpbnN0YW5jZS5jdXJyZW50VGltZSkgKiAoMSAvIGFuaW1lLnNwZWVkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlZWtDaGlsZCh0aW1lLCBjaGlsZCkge1xuICAgIGlmIChjaGlsZCkgeyBjaGlsZC5zZWVrKHRpbWUgLSBjaGlsZC50aW1lbGluZU9mZnNldCk7IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN5bmNJbnN0YW5jZUNoaWxkcmVuKHRpbWUpIHtcbiAgICBpZiAoIWluc3RhbmNlLnJldmVyc2VQbGF5YmFjaykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7IHNlZWtDaGlsZCh0aW1lLCBjaGlsZHJlbltpXSk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSQxID0gY2hpbGRyZW5MZW5ndGg7IGkkMS0tOykgeyBzZWVrQ2hpbGQodGltZSwgY2hpbGRyZW5baSQxXSk7IH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBbmltYXRpb25zUHJvZ3Jlc3MoaW5zVGltZSkge1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYW5pbWF0aW9ucyA9IGluc3RhbmNlLmFuaW1hdGlvbnM7XG4gICAgdmFyIGFuaW1hdGlvbnNMZW5ndGggPSBhbmltYXRpb25zLmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGFuaW1hdGlvbnNMZW5ndGgpIHtcbiAgICAgIHZhciBhbmltID0gYW5pbWF0aW9uc1tpXTtcbiAgICAgIHZhciBhbmltYXRhYmxlID0gYW5pbS5hbmltYXRhYmxlO1xuICAgICAgdmFyIHR3ZWVucyA9IGFuaW0udHdlZW5zO1xuICAgICAgdmFyIHR3ZWVuTGVuZ3RoID0gdHdlZW5zLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgdHdlZW4gPSB0d2VlbnNbdHdlZW5MZW5ndGhdO1xuICAgICAgLy8gT25seSBjaGVjayBmb3Iga2V5ZnJhbWVzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdHdlZW5cbiAgICAgIGlmICh0d2Vlbkxlbmd0aCkgeyB0d2VlbiA9IGZpbHRlckFycmF5KHR3ZWVucywgZnVuY3Rpb24gKHQpIHsgcmV0dXJuIChpbnNUaW1lIDwgdC5lbmQpOyB9KVswXSB8fCB0d2VlbjsgfVxuICAgICAgdmFyIGVsYXBzZWQgPSBtaW5NYXgoaW5zVGltZSAtIHR3ZWVuLnN0YXJ0IC0gdHdlZW4uZGVsYXksIDAsIHR3ZWVuLmR1cmF0aW9uKSAvIHR3ZWVuLmR1cmF0aW9uO1xuICAgICAgdmFyIGVhc2VkID0gaXNOYU4oZWxhcHNlZCkgPyAxIDogdHdlZW4uZWFzaW5nKGVsYXBzZWQpO1xuICAgICAgdmFyIHN0cmluZ3MgPSB0d2Vlbi50by5zdHJpbmdzO1xuICAgICAgdmFyIHJvdW5kID0gdHdlZW4ucm91bmQ7XG4gICAgICB2YXIgbnVtYmVycyA9IFtdO1xuICAgICAgdmFyIHRvTnVtYmVyc0xlbmd0aCA9IHR3ZWVuLnRvLm51bWJlcnMubGVuZ3RoO1xuICAgICAgdmFyIHByb2dyZXNzID0gKHZvaWQgMCk7XG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHRvTnVtYmVyc0xlbmd0aDsgbisrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICh2b2lkIDApO1xuICAgICAgICB2YXIgdG9OdW1iZXIgPSB0d2Vlbi50by5udW1iZXJzW25dO1xuICAgICAgICB2YXIgZnJvbU51bWJlciA9IHR3ZWVuLmZyb20ubnVtYmVyc1tuXSB8fCAwO1xuICAgICAgICBpZiAoIXR3ZWVuLmlzUGF0aCkge1xuICAgICAgICAgIHZhbHVlID0gZnJvbU51bWJlciArIChlYXNlZCAqICh0b051bWJlciAtIGZyb21OdW1iZXIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGdldFBhdGhQcm9ncmVzcyh0d2Vlbi52YWx1ZSwgZWFzZWQgKiB0b051bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdW5kKSB7XG4gICAgICAgICAgaWYgKCEodHdlZW4uaXNDb2xvciAmJiBuID4gMikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAqIHJvdW5kKSAvIHJvdW5kO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gTWFudWFsIEFycmF5LnJlZHVjZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlc1xuICAgICAgdmFyIHN0cmluZ3NMZW5ndGggPSBzdHJpbmdzLmxlbmd0aDtcbiAgICAgIGlmICghc3RyaW5nc0xlbmd0aCkge1xuICAgICAgICBwcm9ncmVzcyA9IG51bWJlcnNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmVzcyA9IHN0cmluZ3NbMF07XG4gICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3RyaW5nc0xlbmd0aDsgcysrKSB7XG4gICAgICAgICAgdmFyIGEgPSBzdHJpbmdzW3NdO1xuICAgICAgICAgIHZhciBiID0gc3RyaW5nc1tzICsgMV07XG4gICAgICAgICAgdmFyIG4kMSA9IG51bWJlcnNbc107XG4gICAgICAgICAgaWYgKCFpc05hTihuJDEpKSB7XG4gICAgICAgICAgICBpZiAoIWIpIHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MgKz0gbiQxICsgJyAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MgKz0gbiQxICsgYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFByb2dyZXNzVmFsdWVbYW5pbS50eXBlXShhbmltYXRhYmxlLnRhcmdldCwgYW5pbS5wcm9wZXJ0eSwgcHJvZ3Jlc3MsIGFuaW1hdGFibGUudHJhbnNmb3Jtcyk7XG4gICAgICBhbmltLmN1cnJlbnRWYWx1ZSA9IHByb2dyZXNzO1xuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENhbGxiYWNrKGNiKSB7XG4gICAgaWYgKGluc3RhbmNlW2NiXSAmJiAhaW5zdGFuY2UucGFzc1Rocm91Z2gpIHsgaW5zdGFuY2VbY2JdKGluc3RhbmNlKTsgfVxuICB9XG5cbiAgZnVuY3Rpb24gY291bnRJdGVyYXRpb24oKSB7XG4gICAgaWYgKGluc3RhbmNlLnJlbWFpbmluZyAmJiBpbnN0YW5jZS5yZW1haW5pbmcgIT09IHRydWUpIHtcbiAgICAgIGluc3RhbmNlLnJlbWFpbmluZy0tO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEluc3RhbmNlUHJvZ3Jlc3MoZW5naW5lVGltZSkge1xuICAgIHZhciBpbnNEdXJhdGlvbiA9IGluc3RhbmNlLmR1cmF0aW9uO1xuICAgIHZhciBpbnNEZWxheSA9IGluc3RhbmNlLmRlbGF5O1xuICAgIHZhciBpbnNFbmREZWxheSA9IGluc0R1cmF0aW9uIC0gaW5zdGFuY2UuZW5kRGVsYXk7XG4gICAgdmFyIGluc1RpbWUgPSBhZGp1c3RUaW1lKGVuZ2luZVRpbWUpO1xuICAgIGluc3RhbmNlLnByb2dyZXNzID0gbWluTWF4KChpbnNUaW1lIC8gaW5zRHVyYXRpb24pICogMTAwLCAwLCAxMDApO1xuICAgIGluc3RhbmNlLnJldmVyc2VQbGF5YmFjayA9IGluc1RpbWUgPCBpbnN0YW5jZS5jdXJyZW50VGltZTtcbiAgICBpZiAoY2hpbGRyZW4pIHsgc3luY0luc3RhbmNlQ2hpbGRyZW4oaW5zVGltZSk7IH1cbiAgICBpZiAoIWluc3RhbmNlLmJlZ2FuICYmIGluc3RhbmNlLmN1cnJlbnRUaW1lID4gMCkge1xuICAgICAgaW5zdGFuY2UuYmVnYW4gPSB0cnVlO1xuICAgICAgc2V0Q2FsbGJhY2soJ2JlZ2luJyk7XG4gICAgfVxuICAgIGlmICghaW5zdGFuY2UubG9vcEJlZ2FuICYmIGluc3RhbmNlLmN1cnJlbnRUaW1lID4gMCkge1xuICAgICAgaW5zdGFuY2UubG9vcEJlZ2FuID0gdHJ1ZTtcbiAgICAgIHNldENhbGxiYWNrKCdsb29wQmVnaW4nKTtcbiAgICB9XG4gICAgaWYgKGluc1RpbWUgPD0gaW5zRGVsYXkgJiYgaW5zdGFuY2UuY3VycmVudFRpbWUgIT09IDApIHtcbiAgICAgIHNldEFuaW1hdGlvbnNQcm9ncmVzcygwKTtcbiAgICB9XG4gICAgaWYgKChpbnNUaW1lID49IGluc0VuZERlbGF5ICYmIGluc3RhbmNlLmN1cnJlbnRUaW1lICE9PSBpbnNEdXJhdGlvbikgfHwgIWluc0R1cmF0aW9uKSB7XG4gICAgICBzZXRBbmltYXRpb25zUHJvZ3Jlc3MoaW5zRHVyYXRpb24pO1xuICAgIH1cbiAgICBpZiAoaW5zVGltZSA+IGluc0RlbGF5ICYmIGluc1RpbWUgPCBpbnNFbmREZWxheSkge1xuICAgICAgaWYgKCFpbnN0YW5jZS5jaGFuZ2VCZWdhbikge1xuICAgICAgICBpbnN0YW5jZS5jaGFuZ2VCZWdhbiA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLmNoYW5nZUNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICBzZXRDYWxsYmFjaygnY2hhbmdlQmVnaW4nKTtcbiAgICAgIH1cbiAgICAgIHNldENhbGxiYWNrKCdjaGFuZ2UnKTtcbiAgICAgIHNldEFuaW1hdGlvbnNQcm9ncmVzcyhpbnNUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGluc3RhbmNlLmNoYW5nZUJlZ2FuKSB7XG4gICAgICAgIGluc3RhbmNlLmNoYW5nZUNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLmNoYW5nZUJlZ2FuID0gZmFsc2U7XG4gICAgICAgIHNldENhbGxiYWNrKCdjaGFuZ2VDb21wbGV0ZScpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5jdXJyZW50VGltZSA9IG1pbk1heChpbnNUaW1lLCAwLCBpbnNEdXJhdGlvbik7XG4gICAgaWYgKGluc3RhbmNlLmJlZ2FuKSB7IHNldENhbGxiYWNrKCd1cGRhdGUnKTsgfVxuICAgIGlmIChlbmdpbmVUaW1lID49IGluc0R1cmF0aW9uKSB7XG4gICAgICBsYXN0VGltZSA9IDA7XG4gICAgICBjb3VudEl0ZXJhdGlvbigpO1xuICAgICAgaWYgKCFpbnN0YW5jZS5yZW1haW5pbmcpIHtcbiAgICAgICAgaW5zdGFuY2UucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZS5jb21wbGV0ZWQpIHtcbiAgICAgICAgICBpbnN0YW5jZS5jb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNldENhbGxiYWNrKCdsb29wQ29tcGxldGUnKTtcbiAgICAgICAgICBzZXRDYWxsYmFjaygnY29tcGxldGUnKTtcbiAgICAgICAgICBpZiAoIWluc3RhbmNlLnBhc3NUaHJvdWdoICYmICdQcm9taXNlJyBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIHByb21pc2UgPSBtYWtlUHJvbWlzZShpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFRpbWUgPSBub3c7XG4gICAgICAgIHNldENhbGxiYWNrKCdsb29wQ29tcGxldGUnKTtcbiAgICAgICAgaW5zdGFuY2UubG9vcEJlZ2FuID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZS5kaXJlY3Rpb24gPT09ICdhbHRlcm5hdGUnKSB7XG4gICAgICAgICAgdG9nZ2xlSW5zdGFuY2VEaXJlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGluc3RhbmNlLmRpcmVjdGlvbjtcbiAgICBpbnN0YW5jZS5wYXNzVGhyb3VnaCA9IGZhbHNlO1xuICAgIGluc3RhbmNlLmN1cnJlbnRUaW1lID0gMDtcbiAgICBpbnN0YW5jZS5wcm9ncmVzcyA9IDA7XG4gICAgaW5zdGFuY2UucGF1c2VkID0gdHJ1ZTtcbiAgICBpbnN0YW5jZS5iZWdhbiA9IGZhbHNlO1xuICAgIGluc3RhbmNlLmxvb3BCZWdhbiA9IGZhbHNlO1xuICAgIGluc3RhbmNlLmNoYW5nZUJlZ2FuID0gZmFsc2U7XG4gICAgaW5zdGFuY2UuY29tcGxldGVkID0gZmFsc2U7XG4gICAgaW5zdGFuY2UuY2hhbmdlQ29tcGxldGVkID0gZmFsc2U7XG4gICAgaW5zdGFuY2UucmV2ZXJzZVBsYXliYWNrID0gZmFsc2U7XG4gICAgaW5zdGFuY2UucmV2ZXJzZWQgPSBkaXJlY3Rpb24gPT09ICdyZXZlcnNlJztcbiAgICBpbnN0YW5jZS5yZW1haW5pbmcgPSBpbnN0YW5jZS5sb29wO1xuICAgIGNoaWxkcmVuID0gaW5zdGFuY2UuY2hpbGRyZW47XG4gICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuTGVuZ3RoOyBpLS07KSB7IGluc3RhbmNlLmNoaWxkcmVuW2ldLnJlc2V0KCk7IH1cbiAgICBpZiAoaW5zdGFuY2UucmV2ZXJzZWQgJiYgaW5zdGFuY2UubG9vcCAhPT0gdHJ1ZSB8fCAoZGlyZWN0aW9uID09PSAnYWx0ZXJuYXRlJyAmJiBpbnN0YW5jZS5sb29wID09PSAxKSkgeyBpbnN0YW5jZS5yZW1haW5pbmcrKzsgfVxuICAgIHNldEFuaW1hdGlvbnNQcm9ncmVzcyhpbnN0YW5jZS5yZXZlcnNlZCA/IGluc3RhbmNlLmR1cmF0aW9uIDogMCk7XG4gIH07XG5cbiAgLy8gU2V0IFZhbHVlIGhlbHBlclxuXG4gIGluc3RhbmNlLnNldCA9IGZ1bmN0aW9uKHRhcmdldHMsIHByb3BlcnRpZXMpIHtcbiAgICBzZXRUYXJnZXRzVmFsdWUodGFyZ2V0cywgcHJvcGVydGllcyk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuXG4gIGluc3RhbmNlLnRpY2sgPSBmdW5jdGlvbih0KSB7XG4gICAgbm93ID0gdDtcbiAgICBpZiAoIXN0YXJ0VGltZSkgeyBzdGFydFRpbWUgPSBub3c7IH1cbiAgICBzZXRJbnN0YW5jZVByb2dyZXNzKChub3cgKyAobGFzdFRpbWUgLSBzdGFydFRpbWUpKSAqIGFuaW1lLnNwZWVkKTtcbiAgfTtcblxuICBpbnN0YW5jZS5zZWVrID0gZnVuY3Rpb24odGltZSkge1xuICAgIHNldEluc3RhbmNlUHJvZ3Jlc3MoYWRqdXN0VGltZSh0aW1lKSk7XG4gIH07XG5cbiAgaW5zdGFuY2UucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICBpbnN0YW5jZS5wYXVzZWQgPSB0cnVlO1xuICAgIHJlc2V0VGltZSgpO1xuICB9O1xuXG4gIGluc3RhbmNlLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIWluc3RhbmNlLnBhdXNlZCkgeyByZXR1cm47IH1cbiAgICBpZiAoaW5zdGFuY2UuY29tcGxldGVkKSB7IGluc3RhbmNlLnJlc2V0KCk7IH1cbiAgICBpbnN0YW5jZS5wYXVzZWQgPSBmYWxzZTtcbiAgICBhY3RpdmVJbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgcmVzZXRUaW1lKCk7XG4gICAgaWYgKCFyYWYpIHsgZW5naW5lKCk7IH1cbiAgfTtcblxuICBpbnN0YW5jZS5yZXZlcnNlID0gZnVuY3Rpb24oKSB7XG4gICAgdG9nZ2xlSW5zdGFuY2VEaXJlY3Rpb24oKTtcbiAgICByZXNldFRpbWUoKTtcbiAgfTtcblxuICBpbnN0YW5jZS5yZXN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgaW5zdGFuY2UucmVzZXQoKTtcbiAgICBpbnN0YW5jZS5wbGF5KCk7XG4gIH07XG5cbiAgaW5zdGFuY2UucmVzZXQoKTtcblxuICBpZiAoaW5zdGFuY2UuYXV0b3BsYXkpIHsgaW5zdGFuY2UucGxheSgpOyB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xuXG59XG5cbi8vIFJlbW92ZSB0YXJnZXRzIGZyb20gYW5pbWF0aW9uXG5cbmZ1bmN0aW9uIHJlbW92ZVRhcmdldHNGcm9tQW5pbWF0aW9ucyh0YXJnZXRzQXJyYXksIGFuaW1hdGlvbnMpIHtcbiAgZm9yICh2YXIgYSA9IGFuaW1hdGlvbnMubGVuZ3RoOyBhLS07KSB7XG4gICAgaWYgKGFycmF5Q29udGFpbnModGFyZ2V0c0FycmF5LCBhbmltYXRpb25zW2FdLmFuaW1hdGFibGUudGFyZ2V0KSkge1xuICAgICAgYW5pbWF0aW9ucy5zcGxpY2UoYSwgMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRhcmdldHModGFyZ2V0cykge1xuICB2YXIgdGFyZ2V0c0FycmF5ID0gcGFyc2VUYXJnZXRzKHRhcmdldHMpO1xuICBmb3IgKHZhciBpID0gYWN0aXZlSW5zdGFuY2VzLmxlbmd0aDsgaS0tOykge1xuICAgIHZhciBpbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlc1tpXTtcbiAgICB2YXIgYW5pbWF0aW9ucyA9IGluc3RhbmNlLmFuaW1hdGlvbnM7XG4gICAgdmFyIGNoaWxkcmVuID0gaW5zdGFuY2UuY2hpbGRyZW47XG4gICAgcmVtb3ZlVGFyZ2V0c0Zyb21BbmltYXRpb25zKHRhcmdldHNBcnJheSwgYW5pbWF0aW9ucyk7XG4gICAgZm9yICh2YXIgYyA9IGNoaWxkcmVuLmxlbmd0aDsgYy0tOykge1xuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5bY107XG4gICAgICB2YXIgY2hpbGRBbmltYXRpb25zID0gY2hpbGQuYW5pbWF0aW9ucztcbiAgICAgIHJlbW92ZVRhcmdldHNGcm9tQW5pbWF0aW9ucyh0YXJnZXRzQXJyYXksIGNoaWxkQW5pbWF0aW9ucyk7XG4gICAgICBpZiAoIWNoaWxkQW5pbWF0aW9ucy5sZW5ndGggJiYgIWNoaWxkLmNoaWxkcmVuLmxlbmd0aCkgeyBjaGlsZHJlbi5zcGxpY2UoYywgMSk7IH1cbiAgICB9XG4gICAgaWYgKCFhbmltYXRpb25zLmxlbmd0aCAmJiAhY2hpbGRyZW4ubGVuZ3RoKSB7IGluc3RhbmNlLnBhdXNlKCk7IH1cbiAgfVxufVxuXG4vLyBTdGFnZ2VyIGhlbHBlcnNcblxuZnVuY3Rpb24gc3RhZ2dlcih2YWwsIHBhcmFtcykge1xuICBpZiAoIHBhcmFtcyA9PT0gdm9pZCAwICkgcGFyYW1zID0ge307XG5cbiAgdmFyIGRpcmVjdGlvbiA9IHBhcmFtcy5kaXJlY3Rpb24gfHwgJ25vcm1hbCc7XG4gIHZhciBlYXNpbmcgPSBwYXJhbXMuZWFzaW5nID8gcGFyc2VFYXNpbmdzKHBhcmFtcy5lYXNpbmcpIDogbnVsbDtcbiAgdmFyIGdyaWQgPSBwYXJhbXMuZ3JpZDtcbiAgdmFyIGF4aXMgPSBwYXJhbXMuYXhpcztcbiAgdmFyIGZyb21JbmRleCA9IHBhcmFtcy5mcm9tIHx8IDA7XG4gIHZhciBmcm9tRmlyc3QgPSBmcm9tSW5kZXggPT09ICdmaXJzdCc7XG4gIHZhciBmcm9tQ2VudGVyID0gZnJvbUluZGV4ID09PSAnY2VudGVyJztcbiAgdmFyIGZyb21MYXN0ID0gZnJvbUluZGV4ID09PSAnbGFzdCc7XG4gIHZhciBpc1JhbmdlID0gaXMuYXJyKHZhbCk7XG4gIHZhciB2YWwxID0gaXNSYW5nZSA/IHBhcnNlRmxvYXQodmFsWzBdKSA6IHBhcnNlRmxvYXQodmFsKTtcbiAgdmFyIHZhbDIgPSBpc1JhbmdlID8gcGFyc2VGbG9hdCh2YWxbMV0pIDogMDtcbiAgdmFyIHVuaXQgPSBnZXRVbml0KGlzUmFuZ2UgPyB2YWxbMV0gOiB2YWwpIHx8IDA7XG4gIHZhciBzdGFydCA9IHBhcmFtcy5zdGFydCB8fCAwICsgKGlzUmFuZ2UgPyB2YWwxIDogMCk7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgdmFyIG1heFZhbHVlID0gMDtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlbCwgaSwgdCkge1xuICAgIGlmIChmcm9tRmlyc3QpIHsgZnJvbUluZGV4ID0gMDsgfVxuICAgIGlmIChmcm9tQ2VudGVyKSB7IGZyb21JbmRleCA9ICh0IC0gMSkgLyAyOyB9XG4gICAgaWYgKGZyb21MYXN0KSB7IGZyb21JbmRleCA9IHQgLSAxOyB9XG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdDsgaW5kZXgrKykge1xuICAgICAgICBpZiAoIWdyaWQpIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChNYXRoLmFicyhmcm9tSW5kZXggLSBpbmRleCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBmcm9tWCA9ICFmcm9tQ2VudGVyID8gZnJvbUluZGV4JWdyaWRbMF0gOiAoZ3JpZFswXS0xKS8yO1xuICAgICAgICAgIHZhciBmcm9tWSA9ICFmcm9tQ2VudGVyID8gTWF0aC5mbG9vcihmcm9tSW5kZXgvZ3JpZFswXSkgOiAoZ3JpZFsxXS0xKS8yO1xuICAgICAgICAgIHZhciB0b1ggPSBpbmRleCVncmlkWzBdO1xuICAgICAgICAgIHZhciB0b1kgPSBNYXRoLmZsb29yKGluZGV4L2dyaWRbMF0pO1xuICAgICAgICAgIHZhciBkaXN0YW5jZVggPSBmcm9tWCAtIHRvWDtcbiAgICAgICAgICB2YXIgZGlzdGFuY2VZID0gZnJvbVkgLSB0b1k7XG4gICAgICAgICAgdmFyIHZhbHVlID0gTWF0aC5zcXJ0KGRpc3RhbmNlWCAqIGRpc3RhbmNlWCArIGRpc3RhbmNlWSAqIGRpc3RhbmNlWSk7XG4gICAgICAgICAgaWYgKGF4aXMgPT09ICd4JykgeyB2YWx1ZSA9IC1kaXN0YW5jZVg7IH1cbiAgICAgICAgICBpZiAoYXhpcyA9PT0gJ3knKSB7IHZhbHVlID0gLWRpc3RhbmNlWTsgfVxuICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhWYWx1ZSA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBpZiAoZWFzaW5nKSB7IHZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gZWFzaW5nKHZhbCAvIG1heFZhbHVlKSAqIG1heFZhbHVlOyB9KTsgfVxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3JldmVyc2UnKSB7IHZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gYXhpcyA/ICh2YWwgPCAwKSA/IHZhbCAqIC0xIDogLXZhbCA6IE1hdGguYWJzKG1heFZhbHVlIC0gdmFsKTsgfSk7IH1cbiAgICB9XG4gICAgdmFyIHNwYWNpbmcgPSBpc1JhbmdlID8gKHZhbDIgLSB2YWwxKSAvIG1heFZhbHVlIDogdmFsMTtcbiAgICByZXR1cm4gc3RhcnQgKyAoc3BhY2luZyAqIChNYXRoLnJvdW5kKHZhbHVlc1tpXSAqIDEwMCkgLyAxMDApKSArIHVuaXQ7XG4gIH1cbn1cblxuLy8gVGltZWxpbmVcblxuZnVuY3Rpb24gdGltZWxpbmUocGFyYW1zKSB7XG4gIGlmICggcGFyYW1zID09PSB2b2lkIDAgKSBwYXJhbXMgPSB7fTtcblxuICB2YXIgdGwgPSBhbmltZShwYXJhbXMpO1xuICB0bC5kdXJhdGlvbiA9IDA7XG4gIHRsLmFkZCA9IGZ1bmN0aW9uKGluc3RhbmNlUGFyYW1zLCB0aW1lbGluZU9mZnNldCkge1xuICAgIHZhciB0bEluZGV4ID0gYWN0aXZlSW5zdGFuY2VzLmluZGV4T2YodGwpO1xuICAgIHZhciBjaGlsZHJlbiA9IHRsLmNoaWxkcmVuO1xuICAgIGlmICh0bEluZGV4ID4gLTEpIHsgYWN0aXZlSW5zdGFuY2VzLnNwbGljZSh0bEluZGV4LCAxKTsgfVxuICAgIGZ1bmN0aW9uIHBhc3NUaHJvdWdoKGlucykgeyBpbnMucGFzc1Rocm91Z2ggPSB0cnVlOyB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeyBwYXNzVGhyb3VnaChjaGlsZHJlbltpXSk7IH1cbiAgICB2YXIgaW5zUGFyYW1zID0gbWVyZ2VPYmplY3RzKGluc3RhbmNlUGFyYW1zLCByZXBsYWNlT2JqZWN0UHJvcHMoZGVmYXVsdFR3ZWVuU2V0dGluZ3MsIHBhcmFtcykpO1xuICAgIGluc1BhcmFtcy50YXJnZXRzID0gaW5zUGFyYW1zLnRhcmdldHMgfHwgcGFyYW1zLnRhcmdldHM7XG4gICAgdmFyIHRsRHVyYXRpb24gPSB0bC5kdXJhdGlvbjtcbiAgICBpbnNQYXJhbXMuYXV0b3BsYXkgPSBmYWxzZTtcbiAgICBpbnNQYXJhbXMuZGlyZWN0aW9uID0gdGwuZGlyZWN0aW9uO1xuICAgIGluc1BhcmFtcy50aW1lbGluZU9mZnNldCA9IGlzLnVuZCh0aW1lbGluZU9mZnNldCkgPyB0bER1cmF0aW9uIDogZ2V0UmVsYXRpdmVWYWx1ZSh0aW1lbGluZU9mZnNldCwgdGxEdXJhdGlvbik7XG4gICAgcGFzc1Rocm91Z2godGwpO1xuICAgIHRsLnNlZWsoaW5zUGFyYW1zLnRpbWVsaW5lT2Zmc2V0KTtcbiAgICB2YXIgaW5zID0gYW5pbWUoaW5zUGFyYW1zKTtcbiAgICBwYXNzVGhyb3VnaChpbnMpO1xuICAgIGNoaWxkcmVuLnB1c2goaW5zKTtcbiAgICB2YXIgdGltaW5ncyA9IGdldEluc3RhbmNlVGltaW5ncyhjaGlsZHJlbiwgcGFyYW1zKTtcbiAgICB0bC5kZWxheSA9IHRpbWluZ3MuZGVsYXk7XG4gICAgdGwuZW5kRGVsYXkgPSB0aW1pbmdzLmVuZERlbGF5O1xuICAgIHRsLmR1cmF0aW9uID0gdGltaW5ncy5kdXJhdGlvbjtcbiAgICB0bC5zZWVrKDApO1xuICAgIHRsLnJlc2V0KCk7XG4gICAgaWYgKHRsLmF1dG9wbGF5KSB7IHRsLnBsYXkoKTsgfVxuICAgIHJldHVybiB0bDtcbiAgfTtcbiAgcmV0dXJuIHRsO1xufVxuXG5hbmltZS52ZXJzaW9uID0gJzMuMS4wJztcbmFuaW1lLnNwZWVkID0gMTtcbmFuaW1lLnJ1bm5pbmcgPSBhY3RpdmVJbnN0YW5jZXM7XG5hbmltZS5yZW1vdmUgPSByZW1vdmVUYXJnZXRzO1xuYW5pbWUuZ2V0ID0gZ2V0T3JpZ2luYWxUYXJnZXRWYWx1ZTtcbmFuaW1lLnNldCA9IHNldFRhcmdldHNWYWx1ZTtcbmFuaW1lLmNvbnZlcnRQeCA9IGNvbnZlcnRQeFRvVW5pdDtcbmFuaW1lLnBhdGggPSBnZXRQYXRoO1xuYW5pbWUuc2V0RGFzaG9mZnNldCA9IHNldERhc2hvZmZzZXQ7XG5hbmltZS5zdGFnZ2VyID0gc3RhZ2dlcjtcbmFuaW1lLnRpbWVsaW5lID0gdGltZWxpbmU7XG5hbmltZS5lYXNpbmcgPSBwYXJzZUVhc2luZ3M7XG5hbmltZS5wZW5uZXIgPSBwZW5uZXI7XG5hbmltZS5yYW5kb20gPSBmdW5jdGlvbiAobWluLCBtYXgpIHsgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47IH07XG5cbm1vZHVsZS5leHBvcnRzID0gYW5pbWU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXQgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuIC8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWR2YW5jZXN0cmluZ2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTLCBpbmRleCwgdW5pY29kZSkge1xuICByZXR1cm4gaW5kZXggKyAodW5pY29kZSA/IGF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi42LjknIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIHRhcmdldCA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSk7XG4gIHZhciBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmICh0YXJnZXQpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmIChleHBvcnRzW2tleV0gIT0gb3V0KSBoaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZiAoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpIGV4cFByb3RvW2tleV0gPSBvdXQ7XG4gIH1cbn07XG5nbG9iYWwuY29yZSA9IGNvcmU7XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuL2VzNi5yZWdleHAuZXhlYycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xuXG52YXIgU1BFQ0lFUyA9IHdrcygnc3BlY2llcycpO1xuXG52YXIgUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyAjcmVwbGFjZSBuZWVkcyBidWlsdC1pbiBzdXBwb3J0IGZvciBuYW1lZCBncm91cHMuXG4gIC8vICNtYXRjaCB3b3JrcyBmaW5lIGJlY2F1c2UgaXQganVzdCByZXR1cm4gdGhlIGV4ZWMgcmVzdWx0cywgZXZlbiBpZiBpdCBoYXNcbiAgLy8gYSBcImdyb3BzXCIgcHJvcGVydHkuXG4gIHZhciByZSA9IC8uLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgcmVzdWx0Lmdyb3VwcyA9IHsgYTogJzcnIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuICcnLnJlcGxhY2UocmUsICckPGE+JykgIT09ICc3Jztcbn0pO1xuXG52YXIgU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMiAmJiByZXN1bHRbMF0gPT09ICdhJyAmJiByZXN1bHRbMV0gPT09ICdiJztcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgbGVuZ3RoLCBleGVjKSB7XG4gIHZhciBTWU1CT0wgPSB3a3MoS0VZKTtcblxuICB2YXIgREVMRUdBVEVTX1RPX1NZTUJPTCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RyaW5nIG1ldGhvZHMgY2FsbCBzeW1ib2wtbmFtZWQgUmVnRXAgbWV0aG9kc1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KTtcblxuICB2YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBERUxFR0FURVNfVE9fU1lNQk9MID8gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuICAgIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IGV4ZWNDYWxsZWQgPSB0cnVlOyByZXR1cm4gbnVsbDsgfTtcbiAgICBpZiAoS0VZID09PSAnc3BsaXQnKSB7XG4gICAgICAvLyBSZWdFeHBbQEBzcGxpdF0gZG9lc24ndCBjYWxsIHRoZSByZWdleCdzIGV4ZWMgbWV0aG9kLCBidXQgZmlyc3QgY3JlYXRlc1xuICAgICAgLy8gYSBuZXcgb25lLiBXZSBuZWVkIHRvIHJldHVybiB0aGUgcGF0Y2hlZCByZWdleCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgb25lLlxuICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTtcbiAgICAgIHJlLmNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmU7IH07XG4gICAgfVxuICAgIHJlW1NZTUJPTF0oJycpO1xuICAgIHJldHVybiAhZXhlY0NhbGxlZDtcbiAgfSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKFxuICAgICFERUxFR0FURVNfVE9fU1lNQk9MIHx8XG4gICAgIURFTEVHQVRFU19UT19FWEVDIHx8XG4gICAgKEtFWSA9PT0gJ3JlcGxhY2UnICYmICFSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUykgfHxcbiAgICAoS0VZID09PSAnc3BsaXQnICYmICFTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMpXG4gICkge1xuICAgIHZhciBuYXRpdmVSZWdFeHBNZXRob2QgPSAvLi9bU1lNQk9MXTtcbiAgICB2YXIgZm5zID0gZXhlYyhcbiAgICAgIGRlZmluZWQsXG4gICAgICBTWU1CT0wsXG4gICAgICAnJ1tLRVldLFxuICAgICAgZnVuY3Rpb24gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1ldGhvZCwgcmVnZXhwLCBzdHIsIGFyZzIsIGZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgIGlmIChyZWdleHAuZXhlYyA9PT0gcmVnZXhwRXhlYykge1xuICAgICAgICAgIGlmIChERUxFR0FURVNfVE9fU1lNQk9MICYmICFmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgICAvLyBwb2x5ZmlsbGVkIGZ1bmN0aW9uKSwgbGVhc2luZyB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgICAgICAgICAvLyBXZSBhdm9pZCBpdCBieSBkaXJlY3RseSBjYWxsaW5nIHRoZSBuYXRpdmUgQEBtZXRob2QgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZVJlZ0V4cE1ldGhvZC5jYWxsKHJlZ2V4cCwgc3RyLCBhcmcyKSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlTWV0aG9kLmNhbGwoc3RyLCByZWdleHAsIGFyZzIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICAgIH1cbiAgICApO1xuICAgIHZhciBzdHJmbiA9IGZuc1swXTtcbiAgICB2YXIgcnhmbiA9IGZuc1sxXTtcblxuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgc3RyZm4pO1xuICAgIGhpZGUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzLCBhcmcpOyB9XG4gICAgICAvLyAyMS4yLjUuNiBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdKHN0cmluZylcbiAgICAgIC8vIDIxLjIuNS45IFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdKHN0cmluZylcbiAgICAgIDogZnVuY3Rpb24gKHN0cmluZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZiAodGhhdC5tdWx0aWxpbmUpIHJlc3VsdCArPSAnbSc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JztcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCduYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nJywgRnVuY3Rpb24udG9TdHJpbmcpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciAkdG9TdHJpbmcgPSByZXF1aXJlKCcuL19mdW5jdGlvbi10by1zdHJpbmcnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIGJ1aWx0aW5FeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuXG4gLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwZXhlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgaWYgKHR5cGVvZiBleGVjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc3VsdCA9IGV4ZWMuY2FsbChSLCBTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXInKTtcbiAgfVxuICByZXR1cm4gYnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLyxcbiAgICAgIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxW0xBU1RfSU5ERVhdICE9PSAwIHx8IHJlMltMQVNUX0lOREVYXSAhPT0gMDtcbn0pKCk7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEO1xuXG5pZiAoUEFUQ0gpIHtcbiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikge1xuICAgIHZhciByZSA9IHRoaXM7XG4gICAgdmFyIGxhc3RJbmRleCwgcmVDb3B5LCBtYXRjaCwgaTtcblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHJlLnNvdXJjZSArICckKD8hXFxcXHMpJywgcmVnZXhwRmxhZ3MuY2FsbChyZSkpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZVtMQVNUX0lOREVYXTtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmVbTEFTVF9JTkRFWF0gPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKE5QQ0dfSU5DTFVERUQgJiYgbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAgIC8vIGZvciBOUENHLCBsaWtlIElFOC4gTk9URTogVGhpcyBkb2Vzbicgd29yayBmb3IgLyguPyk/L1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgbmF0aXZlUmVwbGFjZS5jYWxsKG1hdGNoWzBdLCByZUNvcHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHF1b3QgPSAvXCIvZztcbi8vIEIuMi4zLjIuMSBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKVxudmFyIGNyZWF0ZUhUTUwgPSBmdW5jdGlvbiAoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgdmFyIFMgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgdmFyIHAxID0gJzwnICsgdGFnO1xuICBpZiAoYXR0cmlidXRlICE9PSAnJykgcDEgKz0gJyAnICsgYXR0cmlidXRlICsgJz1cIicgKyBTdHJpbmcodmFsdWUpLnJlcGxhY2UocXVvdCwgJyZxdW90OycpICsgJ1wiJztcbiAgcmV0dXJuIHAxICsgJz4nICsgUyArICc8LycgKyB0YWcgKyAnPic7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgZXhlYykge1xuICB2YXIgTyA9IHt9O1xuICBPW05BTUVdID0gZXhlYyhjcmVhdGVIVE1MKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSAnJ1tOQU1FXSgnXCInKTtcbiAgICByZXR1cm4gdGVzdCAhPT0gdGVzdC50b0xvd2VyQ2FzZSgpIHx8IHRlc3Quc3BsaXQoJ1wiJykubGVuZ3RoID4gMztcbiAgfSksICdTdHJpbmcnLCBPKTtcbn07XG4iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnJlcXVpcmUoJy4vX2V4cG9ydCcpKHtcbiAgdGFyZ2V0OiAnUmVnRXhwJyxcbiAgcHJvdG86IHRydWUsXG4gIGZvcmNlZDogcmVnZXhwRXhlYyAhPT0gLy4vLmV4ZWNcbn0sIHtcbiAgZXhlYzogcmVnZXhwRXhlY1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBNQVRDSCwgJG1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5tYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgIGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRtYXRjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmICghcnguZ2xvYmFsKSByZXR1cm4gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIEFbbl0gPSBtYXRjaFN0cjtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgICAgbisrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gPT09IDAgPyBudWxsIDogQTtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MUyA9IC9cXCQoWyQmYCddfFxcZFxcZD98PFtePl0qPikvZztcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCA9IC9cXCQoWyQmYCddfFxcZFxcZD8pL2c7XG5cbnZhciBtYXliZVRvU3RyaW5nID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxuLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2UsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZVxuICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGZuLmNhbGwoc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZVxuICAgIGZ1bmN0aW9uIChyZWdleHAsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkcmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgZnVuY3Rpb25hbFJlcGxhY2UgPSB0eXBlb2YgcmVwbGFjZVZhbHVlID09PSAnZnVuY3Rpb24nO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG4gICAgICB2YXIgZ2xvYmFsID0gcnguZ2xvYmFsO1xuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBpZiAoIWdsb2JhbCkgYnJlYWs7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgfVxuICAgICAgdmFyIGFjY3VtdWxhdGVkUmVzdWx0ID0gJyc7XG4gICAgICB2YXIgbmV4dFNvdXJjZVBvc2l0aW9uID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBtYXgobWluKHRvSW50ZWdlcihyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBjYXB0dXJlcy5wdXNoKG1heWJlVG9TdHJpbmcocmVzdWx0W2pdKSk7XG4gICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwcztcbiAgICAgICAgaWYgKGZ1bmN0aW9uYWxSZXBsYWNlKSB7XG4gICAgICAgICAgdmFyIHJlcGxhY2VyQXJncyA9IFttYXRjaGVkXS5jb25jYXQoY2FwdHVyZXMsIHBvc2l0aW9uLCBTKTtcbiAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBTdHJpbmcocmVwbGFjZVZhbHVlLmFwcGx5KHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgbmV4dFNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkUmVzdWx0ICsgUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24pO1xuICAgIH1cbiAgXTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldHN1YnN0aXR1dGlvblxuICBmdW5jdGlvbiBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgc3RyLCBwb3NpdGlvbiwgY2FwdHVyZXMsIG5hbWVkQ2FwdHVyZXMsIHJlcGxhY2VtZW50KSB7XG4gICAgdmFyIHRhaWxQb3MgPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoO1xuICAgIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICAgIHZhciBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQ7XG4gICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgICAgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTO1xuICAgIH1cbiAgICByZXR1cm4gJHJlcGxhY2UuY2FsbChyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgICAgdmFyIGNhcHR1cmU7XG4gICAgICBzd2l0Y2ggKGNoLmNoYXJBdCgwKSkge1xuICAgICAgICBjYXNlICckJzogcmV0dXJuICckJztcbiAgICAgICAgY2FzZSAnJic6IHJldHVybiBtYXRjaGVkO1xuICAgICAgICBjYXNlICdgJzogcmV0dXJuIHN0ci5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICAgIGNhc2UgXCInXCI6IHJldHVybiBzdHIuc2xpY2UodGFpbFBvcyk7XG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIFxcZFxcZD9cbiAgICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgIGlmIChuID4gbSkge1xuICAgICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgICAgaWYgKGYgPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICAgIGlmIChmIDw9IG0pIHJldHVybiBjYXB0dXJlc1tmIC0gMV0gPT09IHVuZGVmaW5lZCA/IGNoLmNoYXJBdCgxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoLmNoYXJBdCgxKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FwdHVyZSA9IGNhcHR1cmVzW24gLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyICRTUExJVCA9ICdzcGxpdCc7XG52YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xudmFyIE1BWF9VSU5UMzIgPSAweGZmZmZmZmZmO1xuXG4vLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ3gnLCAneScpIC0+IC94L3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyBSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0O1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuICRzcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6ICRzcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9ICRzcGxpdDtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc3BsaXRgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICAgIHJldHVybiBzcGxpdHRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gc3BsaXR0ZXIuY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KVxuICAgICAgICA6IGludGVybmFsU3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShpbnRlcm5hbFNwbGl0LCByZWdleHAsIHRoaXMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSAkc3BsaXQpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihyeCwgUmVnRXhwKTtcblxuICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7XG4gICAgICB2YXIgZmxhZ3MgPSAocnguaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChTVVBQT1JUU19ZID8gJ3knIDogJ2cnKTtcblxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG9cbiAgICAgIC8vIHNpbXVsYXRlIHRoZSAneScgZmxhZy5cbiAgICAgIHZhciBzcGxpdHRlciA9IG5ldyBDKFNVUFBPUlRTX1kgPyByeCA6ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJywgZmxhZ3MpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoUy5sZW5ndGggPT09IDApIHJldHVybiBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgUykgPT09IG51bGwgPyBbU10gOiBbXTtcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIHZhciBxID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB3aGlsZSAocSA8IFMubGVuZ3RoKSB7XG4gICAgICAgIHNwbGl0dGVyLmxhc3RJbmRleCA9IFNVUFBPUlRTX1kgPyBxIDogMDtcbiAgICAgICAgdmFyIHogPSBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgU1VQUE9SVFNfWSA/IFMgOiBTLnNsaWNlKHEpKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSAkbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTAgU3RyaW5nLnByb3RvdHlwZS5saW5rKHVybClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2xpbmsnLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gbGluayh1cmwpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYScsICdocmVmJywgdXJsKTtcbiAgfTtcbn0pO1xuIiwiLyohXG4gKiBKYXZhU2NyaXB0IENvb2tpZSB2Mi4yLjFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qcy1jb29raWUvanMtY29va2llXG4gKlxuICogQ29weXJpZ2h0IDIwMDYsIDIwMTUgS2xhdXMgSGFydGwgJiBGYWduZXIgQnJhY2tcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG47KGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdHZhciByZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXI7XG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdFx0cmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyID0gdHJ1ZTtcblx0fVxuXHRpZiAoIXJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcikge1xuXHRcdHZhciBPbGRDb29raWVzID0gd2luZG93LkNvb2tpZXM7XG5cdFx0dmFyIGFwaSA9IHdpbmRvdy5Db29raWVzID0gZmFjdG9yeSgpO1xuXHRcdGFwaS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0d2luZG93LkNvb2tpZXMgPSBPbGRDb29raWVzO1xuXHRcdFx0cmV0dXJuIGFwaTtcblx0XHR9O1xuXHR9XG59KGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gZXh0ZW5kICgpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdGZvciAoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXR0cmlidXRlcyA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0cmVzdWx0W2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGUgKHMpIHtcblx0XHRyZXR1cm4gcy5yZXBsYWNlKC8oJVswLTlBLVpdezJ9KSsvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGluaXQgKGNvbnZlcnRlcikge1xuXHRcdGZ1bmN0aW9uIGFwaSgpIHt9XG5cblx0XHRmdW5jdGlvbiBzZXQgKGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0YXR0cmlidXRlcyA9IGV4dGVuZCh7XG5cdFx0XHRcdHBhdGg6ICcvJ1xuXHRcdFx0fSwgYXBpLmRlZmF1bHRzLCBhdHRyaWJ1dGVzKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKG5ldyBEYXRlKCkgKiAxICsgYXR0cmlidXRlcy5leHBpcmVzICogODY0ZSs1KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UncmUgdXNpbmcgXCJleHBpcmVzXCIgYmVjYXVzZSBcIm1heC1hZ2VcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFXG5cdFx0XHRhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHRcdFx0XHRpZiAoL15bXFx7XFxbXS8udGVzdChyZXN1bHQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cblx0XHRcdHZhbHVlID0gY29udmVydGVyLndyaXRlID9cblx0XHRcdFx0Y29udmVydGVyLndyaXRlKHZhbHVlLCBrZXkpIDpcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7XG5cblx0XHRcdGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoa2V5KSlcblx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcblx0XHRcdFx0LnJlcGxhY2UoL1tcXChcXCldL2csIGVzY2FwZSk7XG5cblx0XHRcdHZhciBzdHJpbmdpZmllZEF0dHJpYnV0ZXMgPSAnJztcblx0XHRcdGZvciAodmFyIGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJzsgJyArIGF0dHJpYnV0ZU5hbWU7XG5cdFx0XHRcdGlmIChhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHQvLyAzLiAgSWYgdGhlIHJlbWFpbmluZyB1bnBhcnNlZC1hdHRyaWJ1dGVzIGNvbnRhaW5zIGEgJXgzQiAoXCI7XCIpXG5cdFx0XHRcdC8vICAgICBjaGFyYWN0ZXI6XG5cdFx0XHRcdC8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVucGFyc2VkLWF0dHJpYnV0ZXMgdXAgdG8sXG5cdFx0XHRcdC8vIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNCIChcIjtcIikgY2hhcmFjdGVyLlxuXHRcdFx0XHQvLyAuLi5cblx0XHRcdFx0c3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBrZXkgKyAnPScgKyB2YWx1ZSArIHN0cmluZ2lmaWVkQXR0cmlidXRlcyk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0IChrZXksIGpzb24pIHtcblx0XHRcdGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGphciA9IHt9O1xuXHRcdFx0Ly8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY29va2llcyBhdCBhbGwuXG5cdFx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRmb3IgKDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuXHRcdFx0XHR2YXIgY29va2llID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG5cdFx0XHRcdGlmICghanNvbiAmJiBjb29raWUuY2hhckF0KDApID09PSAnXCInKSB7XG5cdFx0XHRcdFx0Y29va2llID0gY29va2llLnNsaWNlKDEsIC0xKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dmFyIG5hbWUgPSBkZWNvZGUocGFydHNbMF0pO1xuXHRcdFx0XHRcdGNvb2tpZSA9IChjb252ZXJ0ZXIucmVhZCB8fCBjb252ZXJ0ZXIpKGNvb2tpZSwgbmFtZSkgfHxcblx0XHRcdFx0XHRcdGRlY29kZShjb29raWUpO1xuXG5cdFx0XHRcdFx0aWYgKGpzb24pIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZSA9IEpTT04ucGFyc2UoY29va2llKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0amFyW25hbWVdID0gY29va2llO1xuXG5cdFx0XHRcdFx0aWYgKGtleSA9PT0gbmFtZSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ga2V5ID8gamFyW2tleV0gOiBqYXI7XG5cdFx0fVxuXG5cdFx0YXBpLnNldCA9IHNldDtcblx0XHRhcGkuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIGZhbHNlIC8qIHJlYWQgYXMgcmF3ICovKTtcblx0XHR9O1xuXHRcdGFwaS5nZXRKU09OID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGdldChrZXksIHRydWUgLyogcmVhZCBhcyBqc29uICovKTtcblx0XHR9O1xuXHRcdGFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5LCBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRzZXQoa2V5LCAnJywgZXh0ZW5kKGF0dHJpYnV0ZXMsIHtcblx0XHRcdFx0ZXhwaXJlczogLTFcblx0XHRcdH0pKTtcblx0XHR9O1xuXG5cdFx0YXBpLmRlZmF1bHRzID0ge307XG5cblx0XHRhcGkud2l0aENvbnZlcnRlciA9IGluaXQ7XG5cblx0XHRyZXR1cm4gYXBpO1xuXHR9XG5cblx0cmV0dXJuIGluaXQoZnVuY3Rpb24gKCkge30pO1xufSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZmluZWQsbm8tcGFyYW0tcmVhc3NpZ24sbm8tc2hhZG93ICovXG5cbi8qKlxuICogVGhyb3R0bGUgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uIEVzcGVjaWFsbHkgdXNlZnVsIGZvciByYXRlIGxpbWl0aW5nXG4gKiBleGVjdXRpb24gb2YgaGFuZGxlcnMgb24gZXZlbnRzIGxpa2UgcmVzaXplIGFuZCBzY3JvbGwuXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfSAgICBkZWxheSAgICAgICAgICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiAqIEBwYXJhbSAge0Jvb2xlYW59ICAgW25vVHJhaWxpbmddICAgT3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLiBJZiBub1RyYWlsaW5nIGlzIHRydWUsIGNhbGxiYWNrIHdpbGwgb25seSBleGVjdXRlIGV2ZXJ5IGBkZWxheWAgbWlsbGlzZWNvbmRzIHdoaWxlIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZWQtZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLiBJZiBub1RyYWlsaW5nIGlzIGZhbHNlIG9yIHVuc3BlY2lmaWVkLCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIG9uZSBmaW5hbCB0aW1lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZC1mdW5jdGlvbiBjYWxsLiAoQWZ0ZXIgdGhlIHRocm90dGxlZC1mdW5jdGlvbiBoYXMgbm90IGJlZW4gY2FsbGVkIGZvciBgZGVsYXlgIG1pbGxpc2Vjb25kcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVybmFsIGNvdW50ZXIgaXMgcmVzZXQpXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzLiBUaGUgYHRoaXNgIGNvbnRleHQgYW5kIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoLCBhcy1pcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYGNhbGxiYWNrYCB3aGVuIHRoZSB0aHJvdHRsZWQtZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSAgIFtkZWJvdW5jZU1vZGVdIElmIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgc2NoZWR1bGUgYGNsZWFyYCB0byBleGVjdXRlIGFmdGVyIGBkZWxheWAgbXMuIElmIGBkZWJvdW5jZU1vZGVgIGlzIGZhbHNlIChhdCBlbmQpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSBgY2FsbGJhY2tgIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gIEEgbmV3LCB0aHJvdHRsZWQsIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aHJvdHRsZSAoZGVsYXksIG5vVHJhaWxpbmcsIGNhbGxiYWNrLCBkZWJvdW5jZU1vZGUpIHtcbiAgLypcbiAgICogQWZ0ZXIgd3JhcHBlciBoYXMgc3RvcHBlZCBiZWluZyBjYWxsZWQsIHRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXRcbiAgICogYGNhbGxiYWNrYCBpcyBleGVjdXRlZCBhdCB0aGUgcHJvcGVyIHRpbWVzIGluIGB0aHJvdHRsZWAgYW5kIGBlbmRgXG4gICAqIGRlYm91bmNlIG1vZGVzLlxuICAgKi9cbiAgdmFyIHRpbWVvdXRJRDtcbiAgdmFyIGNhbmNlbGxlZCA9IGZhbHNlOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHRpbWUgYGNhbGxiYWNrYCB3YXMgZXhlY3V0ZWQuXG5cbiAgdmFyIGxhc3RFeGVjID0gMDsgLy8gRnVuY3Rpb24gdG8gY2xlYXIgZXhpc3RpbmcgdGltZW91dFxuXG4gIGZ1bmN0aW9uIGNsZWFyRXhpc3RpbmdUaW1lb3V0KCkge1xuICAgIGlmICh0aW1lb3V0SUQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SUQpO1xuICAgIH1cbiAgfSAvLyBGdW5jdGlvbiB0byBjYW5jZWwgbmV4dCBleGVjXG5cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgY2xlYXJFeGlzdGluZ1RpbWVvdXQoKTtcbiAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICB9IC8vIGBub1RyYWlsaW5nYCBkZWZhdWx0cyB0byBmYWxzeS5cblxuXG4gIGlmICh0eXBlb2Ygbm9UcmFpbGluZyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVib3VuY2VNb2RlID0gY2FsbGJhY2s7XG4gICAgY2FsbGJhY2sgPSBub1RyYWlsaW5nO1xuICAgIG5vVHJhaWxpbmcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLypcbiAgICogVGhlIGB3cmFwcGVyYCBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSB0aHJvdHRsaW5nIC8gZGVib3VuY2luZ1xuICAgKiBmdW5jdGlvbmFsaXR5IGFuZCB3aGVuIGV4ZWN1dGVkIHdpbGwgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggYGNhbGxiYWNrYFxuICAgKiBpcyBleGVjdXRlZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZWxhcHNlZCA9IERhdGUubm93KCkgLSBsYXN0RXhlYztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEV4ZWN1dGUgYGNhbGxiYWNrYCBhbmQgdXBkYXRlIHRoZSBgbGFzdEV4ZWNgIHRpbWVzdGFtcC5cblxuXG4gICAgZnVuY3Rpb24gZXhlYygpIHtcbiAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcbiAgICAgIGNhbGxiYWNrLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIElmIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSB0aGlzIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGZsYWdcbiAgICAgKiB0byBhbGxvdyBmdXR1cmUgYGNhbGxiYWNrYCBleGVjdXRpb25zLlxuICAgICAqL1xuXG5cbiAgICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRpbWVvdXRJRCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZGVib3VuY2VNb2RlICYmICF0aW1lb3V0SUQpIHtcbiAgICAgIC8qXG4gICAgICAgKiBTaW5jZSBgd3JhcHBlcmAgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmRcbiAgICAgICAqIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgZXhlY3V0ZSBgY2FsbGJhY2tgLlxuICAgICAgICovXG4gICAgICBleGVjKCk7XG4gICAgfVxuXG4gICAgY2xlYXJFeGlzdGluZ1RpbWVvdXQoKTtcblxuICAgIGlmIChkZWJvdW5jZU1vZGUgPT09IHVuZGVmaW5lZCAmJiBlbGFwc2VkID4gZGVsYXkpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlLCBpZiBgZGVsYXlgIHRpbWUgaGFzIGJlZW4gZXhjZWVkZWQsIGV4ZWN1dGVcbiAgICAgICAqIGBjYWxsYmFja2AuXG4gICAgICAgKi9cbiAgICAgIGV4ZWMoKTtcbiAgICB9IGVsc2UgaWYgKG5vVHJhaWxpbmcgIT09IHRydWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0cmFpbGluZyB0aHJvdHRsZSBtb2RlLCBzaW5jZSBgZGVsYXlgIHRpbWUgaGFzIG5vdCBiZWVuXG4gICAgICAgKiBleGNlZWRlZCwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGBkZWxheWAgbXMgYWZ0ZXIgbW9zdFxuICAgICAgICogcmVjZW50IGV4ZWN1dGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbiksIHNjaGVkdWxlIGBjbGVhcmAgdG8gZXhlY3V0ZVxuICAgICAgICogYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0b1xuICAgICAgICogZXhlY3V0ZSBhZnRlciBgZGVsYXlgIG1zLlxuICAgICAgICovXG4gICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVib3VuY2VNb2RlID09PSB1bmRlZmluZWQgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlci5jYW5jZWwgPSBjYW5jZWw7IC8vIFJldHVybiB0aGUgd3JhcHBlciBmdW5jdGlvbi5cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkICovXG4vKipcbiAqIERlYm91bmNlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBEZWJvdW5jaW5nLCB1bmxpa2UgdGhyb3R0bGluZyxcbiAqIGd1YXJhbnRlZXMgdGhhdCBhIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgYSBzaW5nbGUgdGltZSwgZWl0aGVyIGF0IHRoZVxuICogdmVyeSBiZWdpbm5pbmcgb2YgYSBzZXJpZXMgb2YgY2FsbHMsIG9yIGF0IHRoZSB2ZXJ5IGVuZC5cbiAqXG4gKiBAcGFyYW0gIHtOdW1iZXJ9ICAgZGVsYXkgICAgICAgICBBIHplcm8tb3ItZ3JlYXRlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuIEZvciBldmVudCBjYWxsYmFja3MsIHZhbHVlcyBhcm91bmQgMTAwIG9yIDI1MCAob3IgZXZlbiBoaWdoZXIpIGFyZSBtb3N0IHVzZWZ1bC5cbiAqIEBwYXJhbSAge0Jvb2xlYW59ICBbYXRCZWdpbl0gICAgIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4gSWYgYXRCZWdpbiBpcyBmYWxzZSBvciB1bnNwZWNpZmllZCwgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGBkZWxheWAgbWlsbGlzZWNvbmRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgbGFzdCBkZWJvdW5jZWQtZnVuY3Rpb24gY2FsbC4gSWYgYXRCZWdpbiBpcyB0cnVlLCBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgYXQgdGhlIGZpcnN0IGRlYm91bmNlZC1mdW5jdGlvbiBjYWxsLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFmdGVyIHRoZSB0aHJvdHRsZWQtZnVuY3Rpb24gaGFzIG5vdCBiZWVuIGNhbGxlZCBmb3IgYGRlbGF5YCBtaWxsaXNlY29uZHMsIHRoZSBpbnRlcm5hbCBjb3VudGVyIGlzIHJlc2V0KS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAgICAgIEEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgZGVsYXkgbWlsbGlzZWNvbmRzLiBUaGUgYHRoaXNgIGNvbnRleHQgYW5kIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoLCBhcy1pcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGBjYWxsYmFja2Agd2hlbiB0aGUgZGVib3VuY2VkLWZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGRlYm91bmNlIChkZWxheSwgYXRCZWdpbiwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyB0aHJvdHRsZShkZWxheSwgYXRCZWdpbiwgZmFsc2UpIDogdGhyb3R0bGUoZGVsYXksIGNhbGxiYWNrLCBhdEJlZ2luICE9PSBmYWxzZSk7XG59XG5cbmV4cG9ydHMudGhyb3R0bGUgPSB0aHJvdHRsZTtcbmV4cG9ydHMuZGVib3VuY2UgPSBkZWJvdW5jZTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsZXJ0QmFubmVycygpIHtcblx0dmFyIGJhbm5lcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWxlcnQtYmFubmVyJylcblxuXHRiYW5uZXJzLmZvckVhY2goYmFubmVyID0+IHtcblx0XHR2YXIgYmFubmVySWQgPSAnJ1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmFubmVyLmNsYXNzTGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0YmFubmVySWQgKz0gYmFubmVyLmNsYXNzTGlzdFtpXVxuXHRcdH1cblxuXHRcdGlmIChzZXNzaW9uU3RvcmFnZVsnY2xvc2VkQWxlcnRzJ10gJiYgSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZVsnY2xvc2VkQWxlcnRzJ10pLmluZGV4T2YoYmFubmVySWQpICE9PSAtMSkge1xuXHRcdFx0YmFubmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIGNsb3NlQnV0dG9uID0gYmFubmVyLnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1iYW5uZXJfX2Nsb3NlJyk7XG5cbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGJhbm5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICBcbiAgICAgICAgICAgICAgICBiYW5uZXIuc3R5bGUuaGVpZ2h0ID0gaCArICdweCdcbiAgICAgICAgICAgICAgICBiYW5uZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgNDUwbXMgZWFzZSAwcydcbiAgICBcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYmFubmVyLnN0eWxlLmhlaWdodCA9ICcwcHgnXG4gICAgICAgICAgICAgICAgICAgIGJhbm5lci5zdHlsZS5wYWRkaW5nID0gJzBweCdcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlWydjbG9zZWRBbGVydHMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2VbJ2Nsb3NlZEFsZXJ0cyddID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZVsnY2xvc2VkQWxlcnRzJ10pLnB1c2goYmFubmVySWQpKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2VbJ2Nsb3NlZEFsZXJ0cyddID0gSlNPTi5zdHJpbmdpZnkoW2Jhbm5lcklkXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cdFx0XG5cdH0pXG59IiwiXG5cbmZ1bmN0aW9uIGluaXRBbmltYXRpb25zKCkge1xuICAvL2NvbnNvbGUubG9nKCdpbml0IGFuaW1hdGlvbnMnKVxuXG4gIHZhciBjb250cm9sbGVyID0gbmV3IFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIoKTtcblxuICAvKlxuICB2YXIgdGwgPSBuZXcgVGltZWxpbmVMaXRlKHtkZWxheTogMX0pLFxuICAgIGZpcnN0QmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZS1yZXZlYWxfX2ZpcnN0LWJnJyksXG4gICAgc2VjQmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZS1yZXZlYWxfX3NlY29uZC1iZycpLFxuICAgIHdvcmQgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFuaW1hdGUtcmV2ZWFsX193b3JkJyksXG4gICAgdGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbmltYXRlLXJldmVhbF9fc3VtbWFyeScpO1xuXG4gIHRsXG4gICAgLnRvKGZpcnN0QmcsIDAuMiwge3NjYWxlWDoxfSlcbiAgICAudG8oc2VjQmcsIDAuMiwge3NjYWxlWDoxfSlcbiAgICAudG8od29yZCwgMC4xLCB7b3BhY2l0eToxfSwgXCItPTAuMVwiKVxuICAgIC50byhmaXJzdEJnLCAwLjIsIHtzY2FsZVg6MH0pXG4gICAgLnRvKHNlY0JnLCAwLjIsIHtzY2FsZVg6MH0pXG4gICAgLnRvKHRleHQsIDAuNSwge29wYWNpdHk6IDEsIHk6MH0pOyovXG5cbiAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucmVzdGFydCcpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHt0bC5yZXN0YXJ0KCl9O1xuXG4gIHZhciB0b0FuaW1hdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZScpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BbmltYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnIgPSB0b0FuaW1hdGVbaV07XG4gICAgdmFyIGFjdGl2ZUNsYXNzID0gY3Vyci5kYXRhc2V0LmFjdGl2ZUNsYXNzO1xuICAgIC8vY29uc29sZS5sb2coY3Vyci5pZCk7XG5cbiAgICAvKnZhciB0b2dnbGVDbGFzc2VzID0gVHdlZW5NYXguc2V0KFxuICAgICAgJyMnICsgY3Vyci5pZCAsIHsgY2xhc3NOYW1lIDogJ2FuaW1hdGVkICcgKyBhbmltYXRpb24gfVxuICAgICk7Ki9cblxuICAgIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG4gIFx0XHR0cmlnZ2VyRWxlbWVudDogJyMnICsgY3Vyci5pZCxcbiAgXHRcdHRyaWdnZXJIb29rOiAwLjgsIC8vIHNob3csIHdoZW4gc2Nyb2xsZWQgMTAlIGludG8gdmlld1xuICBcdFx0Ly9kdXJhdGlvbjogXCI4MCVcIiwgLy8gaGlkZSAxMCUgYmVmb3JlIGV4aXRpbmcgdmlldyAoODAlICsgMTAlIGZyb20gYm90dG9tKVxuICBcdFx0Ly9vZmZzZXQ6IDUwIC8vIG1vdmUgdHJpZ2dlciB0byBjZW50ZXIgb2YgZWxlbWVudFxuICBcdH0pXG4gIFx0LnNldENsYXNzVG9nZ2xlKCcjJyArIGN1cnIuaWQsIGFjdGl2ZUNsYXNzKSAvLyBhZGQgY2xhc3MgdG8gcmV2ZWFsXG4gICAgLy8uc2V0VHdlZW4odG9nZ2xlQ2xhc3NlcylcbiAgICAucmV2ZXJzZShmYWxzZSlcbiAgXHQuYWRkVG8oY29udHJvbGxlcik7XG4gIH1cblxuXG4gIHZhciB0b0FuaW1hdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5pbWF0ZS1wYXJhbGxheCcpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BbmltYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnIgPSB0b0FuaW1hdGVbaV07XG4gICAgLy9jb25zb2xlLmxvZyhjdXJyKTtcblxuICAgIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG4gIFx0XHR0cmlnZ2VyRWxlbWVudDogJyMnICsgY3Vyci5pZCxcbiAgICAgIGR1cmF0aW9uOiBcIjIwMCVcIixcbiAgICAgIHRyaWdnZXJIb29rOiAxXG4gIFx0fSlcbiAgXHQuc2V0Q2xhc3NUb2dnbGUoJyMnICsgY3Vyci5pZCwgJ2FuaW1hdGUtcGFyYWxsYXgtLWFjdGl2ZScpIC8vIGFkZCBjbGFzcyB0byByZXZlYWxcbiAgICAuc2V0VHdlZW4oJyMnICsgY3Vyci5pZCArICcgPiAuYW5pbWF0ZS1wYXJhbGxheF9faW1hZ2UnLCB7eTogXCI4MCVcIiwgZWFzZTogTGluZWFyLmVhc2VOb25lfSlcbiAgXHQuYWRkVG8oY29udHJvbGxlcik7XG5cbiAgICB2YXIgaW1hZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGN1cnIuaWQgKyAnID4gZGl2Jyk7XG4gICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgLy9jb25zb2xlLmxvZygnVHJhbnNpdGlvbiBlbmRlZCcpO1xuXG4gICAgICAvL2ltYWdlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgLypcbiAgICB2YXIgc2NlbmUgPSBuZXcgU2Nyb2xsTWFnaWMuU2NlbmUoe1xuICBcdFx0dHJpZ2dlckVsZW1lbnQ6IFwiI2hvbWUtaW50cm9cIlxuICBcdH0pXG4gIFx0LnNldFR3ZWVuKFwiI2hvbWUtaW50cm8gLmxlYWQtaW5cIiwgMC41LCB7dG9wOiBcIjBcIiwgb3BhY2l0eTogXCIxXCIsIGRlbGF5OiAxLjc1fSkgLy8gdHJpZ2dlciBhIFR3ZWVuTWF4LnRvIHR3ZWVuXG4gIFx0Ly8uYWRkSW5kaWNhdG9ycyh7bmFtZTogXCIxIChkdXJhdGlvbjogMClcIn0pIC8vIGFkZCBpbmRpY2F0b3JzIChyZXF1aXJlcyBwbHVnaW4pXG4gIFx0LmFkZFRvKGNvbnRyb2xsZXIpO1xuICAqL1xuXG5cbi8qXG4gIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7dHJpZ2dlckVsZW1lbnQ6IFwiI3BhcmFsbGF4MVwifSlcblx0XHRcdC5zZXRUd2VlbihcIiNwYXJhbGxheDEgPiBkaXZcIiwge3k6IFwiODAlXCIsIGVhc2U6IExpbmVhci5lYXNlTm9uZX0pXG5cdFx0XHQuYWRkVG8oY29udHJvbGxlcik7Ki9cblxuXG5cbi8qXG4gIHZhciBzZXRNdWx0aXBsZUNsYXNzZXMgPSBUd2Vlbk1heC5zZXQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNob21lLWludHJvIC5sZWFkLWluXCIpLCB7XG4gICAgY2xhc3NOYW1lOiBcImxlYWQtaW4gYW5pbWF0ZWQgZmFkZUluRG93biBkZWxheS0ycyBcIlxuICB9KTtcblxuXHRuZXcgU2Nyb2xsTWFnaWMuU2NlbmUoe1xuXHRcdHRyaWdnZXJFbGVtZW50OiBcIiNob21lLWludHJvXCIsXG5cdFx0dHJpZ2dlckhvb2s6IDAuNSwgLy8gc2hvdywgd2hlbiBzY3JvbGxlZCAxMCUgaW50byB2aWV3XG5cdFx0Ly9kdXJhdGlvbjogXCI4MCVcIiwgLy8gaGlkZSAxMCUgYmVmb3JlIGV4aXRpbmcgdmlldyAoODAlICsgMTAlIGZyb20gYm90dG9tKVxuXHRcdG9mZnNldDogNTAgLy8gbW92ZSB0cmlnZ2VyIHRvIGNlbnRlciBvZiBlbGVtZW50XG5cdH0pXG4gIC8vLnNldFR3ZWVuKFwiI2hvbWUtaW50cm9cIiwgMC41LCB7YmFja2dyb3VuZENvbG9yOiBcImdyZWVuXCIsIHNjYWxlOiAyLjUsIGRlbGF5OiAyfSlcblx0Ly8uc2V0Q2xhc3NUb2dnbGUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNob21lLWludHJvIC5sZWFkLWluXCIpLCBcImFuaW1hdGVkXCIpIC8vIGFkZCBjbGFzcyB0byByZXZlYWxcbiAgLnNldFR3ZWVuKHNldE11bHRpcGxlQ2xhc3Nlcylcblx0LmFkZFRvKGNvbnRyb2xsZXIpOyovXG5cbi8qXG4gIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG5cdFx0dHJpZ2dlckVsZW1lbnQ6IFwiLmFuaW1hdGUtaW5cIixcblx0XHR0cmlnZ2VySG9vazogMC43LCAvLyBzaG93LCB3aGVuIHNjcm9sbGVkIDEwJSBpbnRvIHZpZXdcblx0Ly9cdGR1cmF0aW9uOiBcIjgwJVwiLCAvLyBoaWRlIDEwJSBiZWZvcmUgZXhpdGluZyB2aWV3ICg4MCUgKyAxMCUgZnJvbSBib3R0b20pXG5cdFx0b2Zmc2V0OiA1MCAvLyBtb3ZlIHRyaWdnZXIgdG8gY2VudGVyIG9mIGVsZW1lbnRcblx0fSlcblx0LnNldENsYXNzVG9nZ2xlKFwiLmFuaW1hdGUtaW5cIiwgXCJhbmltYXRlLWluLS1hY3RpdmVcIikgLy8gYWRkIGNsYXNzIHRvIHJldmVhbFxuXHQuYWRkVG8oY29udHJvbGxlcik7Ki9cblxuXG4gIC8qXG4gIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG5cdFx0dHJpZ2dlckVsZW1lbnQ6IFwiLmFuaW1hdGUtdGV4dC1pbWFnZVwiLFxuXHRcdHRyaWdnZXJIb29rOiAwLjcsIC8vIHNob3csIHdoZW4gc2Nyb2xsZWQgMTAlIGludG8gdmlld1xuXHQvL1x0ZHVyYXRpb246IFwiODAlXCIsIC8vIGhpZGUgMTAlIGJlZm9yZSBleGl0aW5nIHZpZXcgKDgwJSArIDEwJSBmcm9tIGJvdHRvbSlcblx0XHRvZmZzZXQ6IDUwIC8vIG1vdmUgdHJpZ2dlciB0byBjZW50ZXIgb2YgZWxlbWVudFxuXHR9KVxuXHQuc2V0Q2xhc3NUb2dnbGUoXCIuYW5pbWF0ZS10ZXh0LWltYWdlXCIsIFwiYW5pbWF0ZS10ZXh0LWltYWdlLS1hY3RpdmVcIikgLy8gYWRkIGNsYXNzIHRvIHJldmVhbFxuXHQuYWRkVG8oY29udHJvbGxlcik7Ki9cblxuICAvKm5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG5cdFx0dHJpZ2dlckVsZW1lbnQ6IFwiLmFuaW1hdGUtY3NzXCIsXG5cdFx0dHJpZ2dlckhvb2s6IDAuNywgLy8gc2hvdywgd2hlbiBzY3JvbGxlZCAxMCUgaW50byB2aWV3XG5cdFx0ZHVyYXRpb246IFwiODAlXCIsIC8vIGhpZGUgMTAlIGJlZm9yZSBleGl0aW5nIHZpZXcgKDgwJSArIDEwJSBmcm9tIGJvdHRvbSlcblx0XHRvZmZzZXQ6IDUwIC8vIG1vdmUgdHJpZ2dlciB0byBjZW50ZXIgb2YgZWxlbWVudFxuXHR9KVxuICAub24oJ3N0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc29sZS5sb2coJ3N0YXJ0Jyk7XG5cbiAgICAgIHZhciBlbGVtID0gdGhpcy50cmlnZ2VyRWxlbWVudCgpO1xuICAgICAgdmFyIGFuaW1hdGlvbiA9IGVsZW0uZGF0YXNldC5hbmltYXRpb247XG5cbiAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZWQnLCBhbmltYXRpb24pO1xuICB9KVxuICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzdG9wJyk7XG5cbiAgICAgIHZhciBlbGVtID0gdGhpcy50cmlnZ2VyRWxlbWVudCgpO1xuICAgICAgdmFyIGFuaW1hdGlvbiA9IGVsZW0uZGF0YXNldC5hbmltYXRpb247XG5cbiAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZWQnLCBhbmltYXRpb24pO1xuICB9KVxuXHQvLy5zZXRDbGFzc1RvZ2dsZShcIi5hbmltYXRlXCIsIFwiYW5pbWF0ZWRcIikgLy8gYWRkIGNsYXNzIHRvIHJldmVhbFxuXHQuYWRkVG8oY29udHJvbGxlcik7Ki9cblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFuaW1hdGlvbnMoKSB7XG5cbiAgaW5pdEFuaW1hdGlvbnMoKTtcblxuXG4gIC8vaWYgKHBhZ2UgPT0gJ2FuaW1hdGlvbi10ZXN0Jykge1xuICAgIC8vY29uc29sZS5sb2cocGFnZSk7XG5cbiAgLy99XG59XG4iLCJcblxuZnVuY3Rpb24gcHJldlRhYkZ1bmMoKSB7XG4gIHZhciBjdXJyVGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5hbm51aXRpZXMtdHlwZXNfX3RhYmxlLW1vYmlsZS1uYXYgdWwgLmFjdGl2ZVwiKVswXTtcbiAgdmFyIHByZXZUYWIgPSBjdXJyVGFiLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgaWYgKHByZXZUYWIpIHtcbiAgICBjdXJyVGFiLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgcHJldlRhYi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXG4gICAgdmFyIGFjdGl2ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmFubnVpdGllcy10eXBlc19fdGFibGUtbW9iaWxlIC5hY3RpdmVcIik7XG4gICAgYWN0aXZlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIHZhciBuZXh0ID0gZWwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIG5leHQuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gIFx0fSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbmV4dFRhYkZ1bmMoKSB7XG4gIHZhciBjdXJyVGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5hbm51aXRpZXMtdHlwZXNfX3RhYmxlLW1vYmlsZS1uYXYgdWwgLmFjdGl2ZVwiKVswXTtcbiAgdmFyIG5leHRUYWIgPSBjdXJyVGFiLm5leHRFbGVtZW50U2libGluZztcblxuICBpZiAobmV4dFRhYikge1xuICAgIGN1cnJUYWIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICBuZXh0VGFiLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICB2YXIgYWN0aXZlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYW5udWl0aWVzLXR5cGVzX190YWJsZS1tb2JpbGUgLmFjdGl2ZVwiKTtcbiAgICBhY3RpdmVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgdmFyIG5leHQgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICBuZXh0LmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICBcdH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFubnVpdGllc1RhYmxlKCkge1xuXG4gIHZhciBwcmV2VGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFubnVpdGllcy10eXBlc19fdGFibGUtbW9iaWxlLW5hdiAudGFiLW5hdi5wcmV2Jyk7XG4gIHByZXZUYWIuZm9yRWFjaChlbCA9PiB7XG5cdFx0ZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwcmV2VGFiRnVuYyk7XG5cdH0pO1xuXG4gIHZhciBuZXh0VGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFubnVpdGllcy10eXBlc19fdGFibGUtbW9iaWxlLW5hdiAudGFiLW5hdi5uZXh0Jyk7XG4gIG5leHRUYWIuZm9yRWFjaChlbCA9PiB7XG5cdFx0ZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBuZXh0VGFiRnVuYyk7XG5cdH0pO1xuXG5cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xvdWRpbmFyeVZpZGVvTW9kYWwoKSB7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxhdW5jaC1jbG91ZGluYXJ5LXZpZGVvJykuZm9yRWFjaChlbCA9PiB7XG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjb25zb2xlLmxvZygnY2xvdWRpbmFyeSB2aWRlbyBjbGljaycpO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cblxuICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG91ZGluYXJ5LXZpZGVvLXBsYXllcicpO1xuICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5ocmVmKTtcblxuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvdWRpbmFyeU1vZGFsJykuY2xhc3NMaXN0LmFkZCgnb3BlbicpO1xuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5JykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jbG91ZGluYXJ5LXZpZGVvLW1vZGFsX19jb250ZW50LXdyYXAnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICB9KTtcblxuXG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsb3VkaW5hcnktdmlkZW8tbW9kYWwnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdmYWRlLW91dCcpO1xuXG4gICAgICB2YXIgcGxheWVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb3VkaW5hcnktdmlkZW8tcGxheWVyJyk7XG4gICAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCdzcmMnLCAnJyk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHknKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG5cblxuXG59XG4iLCJcbmZ1bmN0aW9uIHNldEJnSW1hZ2UoKSB7XG4gIC8vY29uc29sZS5sb2coJ3NldCBiZyBpbWFnZScpO1xuXG4gIHZhciBjbEJnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsZC1iZycpO1xuXHRjbEJnLmZvckVhY2goZWwgPT4ge1xuXHRcdC8vY29uc29sZS5sb2coJ2VsJywgZWwpO1xuXG4gICAgdmFyIGVsZW1lbnRzID0gZWwuZGF0YXNldC5jbGFzcyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgZWwuZGF0YXNldC5jbGFzcykgOiBbZWwucGFyZW50Tm9kZV07XG5cdFx0ZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcblx0XHRcdC8vY29uc29sZS5sb2coJ2l0ZW0nLCBpdGVtKTtcblxuICAgICAgaWYgKGVsLmRhdGFzZXQuc2l6ZSkge1xuICAgICAgICBjb25zdCB2dyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3Z3JywgdncpO1xuXG4gICAgICAgIGlmICh2dyA8PSBlbC5kYXRhc2V0LnNpemUpIHtcbiAgICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IFwidXJsKCdcIitlbC5zcmMrXCInKVwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBcInVybCgnXCIrZWwuc3JjK1wiJylcIjtcbiAgICAgIH1cblxuXHRcdH0pO1xuXHR9KTtcbn1cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG91ZEltYWdlcygpIHtcblxuICB2YXIgY2wgPSBjbG91ZGluYXJ5LkNsb3VkaW5hcnkubmV3KHtjbG91ZF9uYW1lOiBcImRtaDE1b3Y5elwifSk7XG4gIGNsLnJlc3BvbnNpdmUoKTtcblxuXHRzZXRCZ0ltYWdlKCk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIF8uZGVib3VuY2UoKCkgPT4ge1xuICAgIHNldEJnSW1hZ2UoKTtcbiAgfSwgNDAwKSk7XG59XG4iLCJcbmZ1bmN0aW9uIGdldE9yZGluYWxOdW0obikge1xuICByZXR1cm4gbiArIChuID4gMCA/IFsndGgnLCAnc3QnLCAnbmQnLCAncmQnXVsobiA+IDMgJiYgbiA8IDIxKSB8fCBuICUgMTAgPiAzID8gMCA6IG4gJSAxMF0gOiAnJyk7XG59XG5cbmZ1bmN0aW9uIGdldE1vbnRoKG4pIHtcblx0Y29uc3QgbW9udGhOYW1lcyA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXTtcblxuXHRyZXR1cm4gbW9udGhOYW1lc1tuXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGFpbHlNYXJrZXQoKSB7XG5cbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kYWlseS1tYXJrZXQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXHRcdHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHR4aHIub3BlbignR0VUJywgJy9hcGkvZ2V0YmxvZycpO1xuXG5cdFx0eGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdCAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG5cdFx0ICAgICAgICAvL2NvbnNvbGUubG9nKHhoci5yZXNwb25zZVRleHQpO1xuXG5cdFx0XHRcdFx0XHR2YXIganNvbiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG5cdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKGpzb24pO1xuXG5cdFx0XHRcdFx0XHRpZiAoanNvbi5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kYWlseS1tYXJrZXRfX2hpZGRlbicpO1xuXHRcdFx0XHRcdFx0XHRjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImRhaWx5LW1hcmtldF9faGlkZGVuXCIpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0dmFyIGN1cnIgPSBqc29uW2ldO1xuXHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKCd0aXRsZScsIGN1cnIudGl0bGUucmVuZGVyZWQpO1xuXHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKCdkYXRlJywgY3Vyci5kYXRlKTtcblx0XHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY29udGVudCcsIGN1cnIuZXhjZXJwdC5yZW5kZXJlZCk7XG5cdFx0XHRcdFx0XHRcdC8vY29uc29sZS5sb2coJ2xpbmsnLCBjdXJyLmxpbmspO1xuXG5cdFx0XHRcdFx0XHRcdHZhciBlbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhaWx5LW1hcmtldF9fcG9zdHMtJyArIChpICsgMSkpO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmhyZWYgPSBjdXJyLmxpbms7XG5cdFx0XHRcdFx0XHRcdGVsZW0udGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJy5kYWlseS1tYXJrZXRfX3Bvc3RzLXRpdGxlJyk7XG5cdFx0XHRcdFx0XHRcdHRpdGxlLmlubmVySFRNTCA9IGN1cnIudGl0bGUucmVuZGVyZWQ7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGQgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJy5kYWlseS1tYXJrZXRfX3Bvc3RzLWRhdGUnKTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgciA9IC9cXGQrL2c7XG5cdFx0XHRcdFx0XHRcdHZhciB0aW1lID0gY3Vyci5kYXRlLm1hdGNoKHIpO1xuXHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKHRpbWUpO1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkYXRlT2JqID0gbmV3IERhdGUoKTtcblx0XHRcdFx0XHRcdFx0ZGF0ZU9iai5zZXRUaW1lKHRpbWVbMF0pO1xuXHRcdFx0XHRcdFx0XHQvL2NvbnNvbGUubG9nICggZ2V0T3JkaW5hbE51bShkYXRlT2JqLmdldERhdGUoKSkgKTtcblxuXHRcdFx0XHRcdFx0XHRkLmlubmVySFRNTCA9IGdldE1vbnRoKGRhdGVPYmouZ2V0TW9udGgoKSkgKyBcIiBcIiArIGdldE9yZGluYWxOdW0oZGF0ZU9iai5nZXREYXRlKCkpICsgXCIsIFwiICsgZGF0ZU9iai5nZXRGdWxsWWVhcigpO1xuXG5cdFx0XHRcdFx0XHRcdHZhciBib2R5ID0gZWxlbS5xdWVyeVNlbGVjdG9yKCcuZGFpbHktbWFya2V0X19wb3N0cy1jb250ZW50LWJvZHknKTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRcdFx0ZGl2LmlubmVySFRNTCA9IGN1cnIuZXhjZXJwdC5yZW5kZXJlZDtcblx0XHRcdFx0XHRcdFx0dmFyIGJvZHlUZXh0ID0gZGl2LnRleHRDb250ZW50IHx8IGRpdi5pbm5lclRleHQgfHwgXCJcIjtcblx0XHRcdFx0XHRcdFx0Ly9jb25zb2xlLmxvZygndGV4dCcsIGJvZHlUZXh0KTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdHJpbW1lZFN0cmluZyA9IGJvZHlUZXh0Lmxlbmd0aCA+IDE4MCA/XG4gICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0LnN1YnN0cmluZygwLCAxODAgLSAzKSArIFwiLi4uIFwiIDpcbiAgICAgICAgICAgICAgICAgICAgYm9keVRleHQ7XG5cblx0XHRcdFx0XHRcdFx0Ym9keS5pbm5lckhUTUwgPSB0cmltbWVkU3RyaW5nLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcblx0XHRcdFx0XHRcdH1cblx0XHQgICAgfVxuXHRcdCAgICBlbHNlIHtcblx0XHQgICAgICAgIGNvbnNvbGUubG9nKCdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1czogJyArIHhoci5zdGF0dXMpO1xuXHRcdCAgICB9XG5cdFx0fTtcblx0XHR4aHIuc2VuZCgpO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtVmFsaWRhdGUoKSB7XG4gIC8vY29uc29sZS5sb2coJ2Zvcm0gdmFsaWRhdGUnKTtcblxuICB2YXIgcmV0dXJuVXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luc3VyYW5jZS1wbGFuc19fcXVvdGUtZm9ybS1yZXR1cm4nKTtcbiAgaWYgKHJldHVyblVybCkge1xuICAgIHZhciBkb21haW4gPSBsb2NhdGlvbi5wcm90b2NvbCsnLy8nK2xvY2F0aW9uLmhvc3RuYW1lKyhsb2NhdGlvbi5wb3J0ID8gJzonK2xvY2F0aW9uLnBvcnQ6ICcnKTtcbiAgICByZXR1cm5Vcmwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGRvbWFpbiArIHJldHVyblVybC52YWx1ZSk7XG4gICAgLy9jb25zb2xlLmxvZyhyZXR1cm5VcmwudmFsdWUsIGRvbWFpbik7XG4gIH1cblxuICB2YXIgcmV0dXJuVXJsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhY3QtZm9ybV9fZm9ybS1yZXR1cm4nKTtcbiAgaWYgKHJldHVyblVybCkge1xuICAgIHZhciBkb21haW4gPSBsb2NhdGlvbi5wcm90b2NvbCsnLy8nK2xvY2F0aW9uLmhvc3RuYW1lKyhsb2NhdGlvbi5wb3J0ID8gJzonK2xvY2F0aW9uLnBvcnQ6ICcnKTtcbiAgICByZXR1cm5Vcmwuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGRvbWFpbiArIHJldHVyblVybC52YWx1ZSk7XG4gICAgLy9jb25zb2xlLmxvZyhyZXR1cm5VcmwudmFsdWUsIGRvbWFpbik7XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5zdXJhbmNlLXBsYW5zX19xdW90ZS1mb3JtIGlucHV0JykuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy9jb25zb2xlLmxvZygnaW5wdXQnLCBlbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuXG4gICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnN1cmFuY2UtcGxhbnNfX3F1b3RlLWZvcm0gZm9ybScpO1xuICAgICAgdmFyIGZvcm1FcnJvciA9IGVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSAnJztcbiAgICAgIGZvcm1FcnJvci5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZXJyb3InKTtcbiAgICB9KTtcblx0fSk7XG5cbiAgLy8gcXVvdGUgZm9ybVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5zdXJhbmNlLXBsYW5zX19xdW90ZS1mb3JtLWJ0biBpbnB1dCcpLmZvckVhY2goZWwgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnN1cmFuY2UtcGxhbnNfX3F1b3RlLWZvcm0gZm9ybScpO1xuICAgICAgLy9jb25zb2xlLmxvZyhmb3JtKTtcblxuXG4gICAgICB2YXIgZm9ybUVycm9yID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsKCcuaW5wdXQtZ3JvdXBfX2Vycm9yJykuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgIGVycm9yLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBlcnJvci5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZXJyb3InKTtcbiAgICAgIH0pO1xuXG5cbiAgXHRcdHZhciBjb25zdHJhaW50cyA9IHtcbiAgXHQgICAgJ25hbWUnOiB7XG4gIFx0ICAgICAgcHJlc2VuY2U6IHRydWVcbiAgXHQgICAgfSxcbiAgICAgICAgJ2VtYWlsJzoge1xuICBcdCAgICAgIHByZXNlbmNlOiB0cnVlLFxuICAgICAgICAgIGVtYWlsOiB0cnVlXG4gIFx0ICAgIH0sXG4gICAgICAgICdwaG9uZSc6IHtcbiAgXHQgICAgICBwcmVzZW5jZTogdHJ1ZVxuICBcdCAgICB9XG4gIFx0XHR9O1xuXG4gICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdGUoZm9ybSwgY29uc3RyYWludHMpO1xuICBcdFx0Ly9jb25zb2xlLmxvZygnZXJyb3JzJywgZXJyb3JzKTtcblxuICBcdFx0aWYgKGVycm9ycykge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdoYXMgZXJyb3InKTtcbiAgICAgICAgZm9yICh2YXIgY29uc3RyYWludCBpbiBjb25zdHJhaW50cykge1xuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5oYXNPd25Qcm9wZXJ0eShjb25zdHJhaW50KSkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhrZXkgKyBcIiAtPiBcIiArIHBba2V5XSk7XG4gICAgICAgICAgICBpZiAoZXJyb3JzW2NvbnN0cmFpbnRdKSB7XG4gICAgICAgICAgICAgIHZhciBmb3JtRXJyb3IgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ncm91cF9fZXJyb3IuJyArIGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCcuaW5wdXQtZ3JvdXBfX2Vycm9yIC4nICsgY29uc3RyYWludCk7XG4gICAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBlcnJvcnNbY29uc3RyYWludF1bMF07XG4gICAgICAgIFx0XHRcdGZvcm1FcnJvci5jbGFzc0xpc3QuYWRkKCdoYXMtZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgXHRcdH1cbiAgXHRcdGVsc2Uge1xuICAgICAgICBmb3JtLnN1Ym1pdCgpO1xuICBcdFx0fVxuXG4gICAgfSk7XG5cdH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250YWN0LWZvcm1fX2Zvcm0gaW5wdXQnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvL2NvbnNvbGUubG9nKCdpbnB1dCcsIGVsLm5leHRFbGVtZW50U2libGluZyk7XG5cbiAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhY3QtZm9ybV9fZm9ybSBmb3JtJyk7XG4gICAgICB2YXIgZm9ybUVycm9yID0gZWwubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgZm9ybUVycm9yLmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9ybUVycm9yLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1lcnJvcicpO1xuICAgIH0pO1xuXHR9KTtcblxuICAvLyBjb250YWN0IGZvcm1cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbnRhY3QtZm9ybV9fZm9ybS1idG4gaW5wdXQnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFjdC1mb3JtX19mb3JtIGZvcm0nKTtcbiAgICAgIC8vY29uc29sZS5sb2coZm9ybSk7XG5cblxuICAgICAgdmFyIGZvcm1FcnJvciA9IGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmlucHV0LWdyb3VwX19lcnJvcicpLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgZXJyb3IuY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWVycm9yJyk7XG4gICAgICB9KTtcblxuXG4gIFx0XHR2YXIgY29uc3RyYWludHMgPSB7XG4gIFx0ICAgICduYW1lJzoge1xuICBcdCAgICAgIHByZXNlbmNlOiB0cnVlXG4gIFx0ICAgIH0sXG4gICAgICAgICdlbWFpbCc6IHtcbiAgXHQgICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgICAgICBlbWFpbDogdHJ1ZVxuICBcdCAgICB9LFxuICAgICAgICAncGhvbmUnOiB7XG4gIFx0ICAgICAgcHJlc2VuY2U6IHRydWVcbiAgXHQgICAgfVxuICBcdFx0fTtcblxuICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKGZvcm0sIGNvbnN0cmFpbnRzKTtcbiAgXHRcdC8vY29uc29sZS5sb2coJ2Vycm9ycycsIGVycm9ycyk7XG5cbiAgXHRcdGlmIChlcnJvcnMpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnaGFzIGVycm9yJyk7XG4gICAgICAgIGZvciAodmFyIGNvbnN0cmFpbnQgaW4gY29uc3RyYWludHMpIHtcbiAgICAgICAgICBpZiAoY29uc3RyYWludHMuaGFzT3duUHJvcGVydHkoY29uc3RyYWludCkpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coa2V5ICsgXCIgLT4gXCIgKyBwW2tleV0pO1xuICAgICAgICAgICAgaWYgKGVycm9yc1tjb25zdHJhaW50XSkge1xuICAgICAgICAgICAgICB2YXIgZm9ybUVycm9yID0gZm9ybS5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtZ3JvdXBfX2Vycm9yLicgKyBjb25zdHJhaW50KTtcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnLmlucHV0LWdyb3VwX19lcnJvciAuJyArIGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgICBmb3JtRXJyb3IuaW5uZXJIVE1MID0gZXJyb3JzW2NvbnN0cmFpbnRdWzBdO1xuICAgICAgICBcdFx0XHRmb3JtRXJyb3IuY2xhc3NMaXN0LmFkZCgnaGFzLWVycm9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gIFx0XHR9XG4gIFx0XHRlbHNlIHtcbiAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgXHRcdH1cblxuICAgIH0pO1xuXHR9KTtcblxuXG59XG4iLCJcbmZ1bmN0aW9uIHNldE9mZnNldCgpIHtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW52ZXN0bWVudC10eXBlcycpLmZvckVhY2goZWwgPT4ge1xuICAgIHZhciBwID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLmludmVzdG1lbnQtdHlwZXNfX3RhYi1jb250ZW50LXRleHQtLWFjdGl2ZSBwJylbMF07XG4gICAgLy9jb25zb2xlLmxvZygncCcsIHAub2Zmc2V0VG9wKTtcblxuICAgIHZhciBjaGF0ID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLmludmVzdG1lbnQtdHlwZXNfX2NoYXQnKVswXTtcbiAgICBpZiAoY2hhdCkge1xuICAgICAgY2hhdC5zdHlsZS5tYXJnaW5Ub3AgPSBwLm9mZnNldFRvcCArICdweCc7XG4gICAgfVxuXG5cdH0pO1xuXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQocGFyZW50LCBpbmRleCkge1xuXG4gIHZhciBhY3RpdmVUZXh0ID0gcGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ludmVzdG1lbnQtdHlwZXNfX3RhYi1jb250ZW50LXRleHQtLWFjdGl2ZScpWzBdO1xuICAvL2NvbnNvbGUubG9nKCdhY3RpdmUnLCBhY3RpdmVUZXh0KTtcbiAgYWN0aXZlVGV4dC5jbGFzc0xpc3QucmVtb3ZlKFwiaW52ZXN0bWVudC10eXBlc19fdGFiLWNvbnRlbnQtdGV4dC0tYWN0aXZlXCIpO1xuXG4gIC8vdmFyIG5leHRUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW52ZXN0bWVudC10eXBlc19fdGFiLWNvbnRlbnQtJyArIGluZGV4KVswXTtcbiAgLy9uZXh0VGV4dC5jbGFzc0xpc3QuYWRkKFwiaW52ZXN0bWVudC10eXBlc19fdGFiLWNvbnRlbnQtdGV4dC0tYWN0aXZlXCIpO1xuXG4gIHZhciBuZXh0VGV4dCA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCcjaW52ZXN0bWVudC10eXBlc19fdGFiLWNvbnRlbnQtJyArIGluZGV4KTtcbiAgbmV4dFRleHQuY2xhc3NMaXN0LmFkZChcImludmVzdG1lbnQtdHlwZXNfX3RhYi1jb250ZW50LXRleHQtLWFjdGl2ZVwiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW52ZXN0bWVudFR5cGVzKCkge1xuXG4gIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW52ZXN0bWVudC10eXBlc19fY2hhdCcpLmxlbmd0aCkge1xuICAgIHNldE9mZnNldCgpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIF8uZGVib3VuY2UoKCkgPT4ge1xuICAgICAgc2V0T2Zmc2V0KCk7XG4gICAgfSwgNDAwKSk7XG4gIH1cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW52ZXN0bWVudC10eXBlcycpLmZvckVhY2goZWwgPT4ge1xuXG4gICAgdmFyIHNlbGVjdCA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbnZlc3RtZW50LXR5cGVzIHNlbGVjdCcpO1xuXG4gICAgaWYgKHNlbGVjdC5sZW5ndGgpIHtcbiAgICAgIHNlbGVjdFswXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3NlbGVjdCcsIHRoaXMudmFsdWUpXG5cbiAgICAgICAgdmFyIGFjdGl2ZVRhYiA9IGVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ludmVzdG1lbnQtdHlwZXNfX3RhYnMtLWFjdGl2ZScpWzBdO1xuICAgICAgICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgICAgICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5yZW1vdmUoXCJpbnZlc3RtZW50LXR5cGVzX190YWJzLS1hY3RpdmVcIik7XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVDb250ZW50KGVsLCB0aGlzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgdmFyIGxpbmtzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLmludmVzdG1lbnQtdHlwZXNfX3RhYnMgYScpO1xuXG4gICAgbGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgXHRcdGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblxuICAgICAgICAvLyB1cGRhdGUgdGFic1xuICAgICAgICB2YXIgYWN0aXZlVGFiID0gZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW52ZXN0bWVudC10eXBlc19fdGFicy0tYWN0aXZlJylbMF07XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2FjdGl2ZScsIGFjdGl2ZVRhYik7XG4gICAgICAgIGlmIChhY3RpdmVUYWIpIHtcbiAgICAgICAgICBhY3RpdmVUYWIuY2xhc3NMaXN0LnJlbW92ZShcImludmVzdG1lbnQtdHlwZXNfX3RhYnMtLWFjdGl2ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImludmVzdG1lbnQtdHlwZXNfX3RhYnMtLWFjdGl2ZVwiKTtcblxuICAgICAgICAvLyB1cGRhdGUgY29udGVudFxuXG4gICAgICAgIHVwZGF0ZUNvbnRlbnQoZWwsIGxpbmsuZGF0YXNldC50YWIpO1xuXG5cbiAgICAgICAgc2V0T2Zmc2V0KCk7XG5cblxuICBcdFx0fSk7XG4gIFx0fSk7XG5cbiAgfSk7XG5cblxuICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHtcbiAgICAvL2NvbnNvbGUubG9nKCdoYXNoJywgd2luZG93LmxvY2F0aW9uLmhhc2gpXG5cbiAgICB2YXIgaGFzaFNwbGl0ID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3BsaXQoJy0nKTtcbiAgICAvL2NvbnNvbGUubG9nKGhhc2hTcGxpdCk7XG5cbiAgICBpZiAoaGFzaFNwbGl0Lmxlbmd0aCA9PSAyKSB7XG5cbiAgICAgIHZhciB0YWJJZCA9IHBhcnNlSW50KGhhc2hTcGxpdFsxXSk7XG4gICAgICAvL2NvbnNvbGUubG9nKHRhYklkKTtcblxuICAgICAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmludmVzdG1lbnQtdHlwZXNfX3RhYnMgYScpO1xuICAgICAgbGlua3NbdGFiSWQtMV0uY2xpY2soKTtcbiAgICB9XG5cbiAgfVxufVxuIiwiaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2dpbk1vZGFsKCkge1xuICAvLyBzaG93IG1vZGFsXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuc2hvdy1sb2dpblwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmxvZ2luLW1vZGFsXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJib2R5XCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJtb2RhbC1vcGVuXCIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVJZCA9IENvb2tpZXMuZ2V0KFwic2F2ZWRVc2VyTmFtZVwiKTtcbiAgICAgIGlmICh1SWQpIHtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNsb2dpbi11c2VyLWlkXCIpLnZhbHVlID0gdUlkO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xvZ2luLXJlbWVtYmVyLW1lXCIpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmxvZ2luLW1vZGFsX19ibG9ja3NcIikuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgICB9XG5cbiAgICAgIE1pY3JvTW9kYWwuc2hvdyhcIm1vZGFsLTFcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGNsb3NlIG1vZGFsXG4gIGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubG9naW4tbW9kYWwsIC5sb2dpbi1tb2RhbF9fY29udGVudC1jbG9zZVwiKVxuICAgIC5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmxvZ2luLW1vZGFsXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcIm9wZW5cIik7XG4gICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChcImZhZGUtb3V0XCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiYm9keVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJtb2RhbC1vcGVuXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudFxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLmxvZ2luLW1vZGFsX19ibG9ja3NcIilbMF1cbiAgICAgICAgICAuY2xhc3NMaXN0LnJlbW92ZShcIm9wZW5cIik7XG5cbiAgICAgICAgdmFyIGVycm9yTXNnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5sb2dpbi1tb2RhbF9fYmxvY2stZm9ybS1lcnJvclwiKTtcbiAgICAgICAgZXJyb3JNc2cuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xvZ2luLXVzZXItaWRcIikudmFsdWUgPSBcIlwiO1xuXG4gICAgICAgIE1pY3JvTW9kYWwuY2xvc2UoXCJtb2RhbC0xXCIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sb2dpbi1tb2RhbF9fY29udGVudFwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sb2dpbi1tb2RhbF9fYmxvY2sgYVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWRpcmVjdC1saW5rJykpIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGVsLmhyZWY7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgZm9ybUNvbnRhaW5lciA9IGVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLWZvcm0nKTtcbiAgICAgIGZvcm1Db250YWluZXIuYXBwZW5kQ2hpbGQoZm9ybSk7XG5cbiAgICAgIGVsLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgICAgXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubG9naW4tbW9kYWxfX2Jsb2NrLm9wZW4nKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucGFyZW50Tm9kZS5jbGFzc0xpc3QuYWRkKFwib3BlblwiKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNsb2dpbi11c2VyLWlkXCIpLmZvY3VzKCk7XG4gICAgICB9LCA1MCk7XG4gIFxuXG4gICAgICAvKnZhciBwYXJlbnRPcGVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuY2xhc3NMaXN0XG4gICAgICApLmluZGV4T2YoXCJvcGVuXCIpO1xuXG4gICAgICBpZiAocGFyZW50T3BlbiA+IC0xKSB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xvZ2luLXVzZXItaWRcIikudmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbG9naW4tdXNlci1pZFwiKS5mb2N1cygpO1xuICAgICAgfSovXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIubG9naW4tbW9kYWxfX2Jsb2NrLWZvcm0gaW5wdXRcIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLWZvcm0nKTtcbiAgICAgIHZhciBmb3JtRXJyb3IgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW5wdXQtZ3JvdXBfX2Vycm9yXCIpO1xuICAgICAgZm9ybUVycm9yLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LnJlbW92ZShcImhhcy1lcnJvclwiKTtcblxuICAgICAgdmFyIGVycm9yTXNnID0gZm9ybS5xdWVyeVNlbGVjdG9yKFwiLmxvZ2luLW1vZGFsX19ibG9jay1mb3JtLWVycm9yXCIpO1xuICAgICAgZXJyb3JNc2cuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBmb3JtIGNhbmNlbFxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmxvZ2luLW1vZGFsX19ibG9jay1mb3JtLWNhbmNlbFwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sb2dpbi1tb2RhbF9fYmxvY2tzXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xvZ2luLXVzZXItaWRcIikudmFsdWUgPSBcIlwiO1xuICAgICAgfSk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIubG9naW4tbW9kYWxfX2Jsb2NrXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGZvcmdldCB1c2VybmFtZSBpZiByZW1lbWJlciBtZSBpcyB1bmNoZWNrZWRcbiAgZG9jdW1lbnRcbiAgICAucXVlcnlTZWxlY3RvcihcIiNsb2dpbi1yZW1lbWJlci1tZVwiKVxuICAgIC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChlKSA9PiB7XG4gICAgICBpZiAoIWUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgQ29va2llcy5yZW1vdmUoXCJzYXZlZFVzZXJOYW1lXCIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIC8vIGZvcm0gY29udGludWVcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sb2dpbi1tb2RhbF9fYmxvY2stZm9ybS1zdWJtaXRcIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9naW4tZm9ybScpO1xuXG4gICAgICB2YXIgY29uc3RyYWludHMgPSB7XG4gICAgICAgIFwidXNlci1pZFwiOiB7XG4gICAgICAgICAgcHJlc2VuY2U6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiVXNlciBJRCBjYW5ub3QgYmUgYmxhbmsuXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHZhciBmb3JtRXJyb3IgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW5wdXQtZ3JvdXBfX2Vycm9yXCIpO1xuICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKGZvcm0sIGNvbnN0cmFpbnRzLCB7IGZ1bGxNZXNzYWdlczogZmFsc2UgfSk7XG4gICAgICAvL2NvbnNvbGUubG9nKCdlcnJvcnMnLCBlcnJvcnMpO1xuXG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBlcnJvcnNbXCJ1c2VyLWlkXCJdWzBdO1xuICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LmFkZChcImhhcy1lcnJvclwiKTtcblxuICAgICAgICB2YXIgZXJyb3JNc2cgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIubG9naW4tbW9kYWxfX2Jsb2NrLWZvcm0tZXJyb3JcIik7XG4gICAgICAgIGVycm9yTXNnLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LnJlbW92ZShcImhhcy1lcnJvclwiKTtcbiAgICAgICAgLy8gc3VibWl0XG5cbiAgICAgICAgdmFyIHVzZXJJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibG9naW4tdXNlci1pZFwiKS52YWx1ZTtcbiAgICAgICAgZG9Mb2dpbih1c2VySWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkb2N1bWVudFxuICAgIC5nZXRFbGVtZW50QnlJZChcImxvZ2luLXVzZXItaWRcIilcbiAgICAuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2VudGVyJyk7XG5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5sb2dpbi1tb2RhbF9fYmxvY2stZm9ybS1zdWJtaXRcIilbMF0uY2xpY2soKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBmdW5jdGlvbiBkb0xvZ2luKHVzZXJJZCkge1xuICAgIHZhciBodHRwUmVxdWVzdDIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xvZ2luLXJlbWVtYmVyLW1lOmNoZWNrZWRcIikgIT09IG51bGwpIHtcbiAgICAgIENvb2tpZXMuc2V0KFwic2F2ZWRVc2VyTmFtZVwiLCB1c2VySWQpO1xuICAgIH1cblxuXG4gICAgaHR0cFJlcXVlc3QyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChodHRwUmVxdWVzdDIucmVhZHlTdGF0ZSA9PT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICBpZiAoaHR0cFJlcXVlc3QyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MnLCBodHRwUmVxdWVzdDIucmVzcG9uc2VUZXh0KTtcblxuICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdDIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICB2YXIgc3lzdGVtID0gZGF0YS5DYWxsUmVzdWx0cy5TeXN0ZW07XG5cbiAgICAgICAgICBpZiAoc3lzdGVtID09IFwibmZzXCIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCJodHRwczovL2ludmVzdG9yLndlYWx0aHNjYXBlLmNvbS9tc2llYmVydC9pbnZlc3Rvci1pbmRleC5odG1sXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHN5c3RlbSA9PSBcImVzb3BcIikge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcImh0dHBzOi8vc3RvY3guaW52ZXN0b3IudHJhZGluZzIuZmFzdC10cmFkZS5jb20vc2llYmVydG5ldC9sb2dpbi5kb1wiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChzeXN0ZW0gPT0gXCJldG5hXCIgfHwgc3lzdGVtID09IFwiYXNwaXJlXCIpIHtcbiAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwcm9jZXNzLmVudi5UUkFERVJfVVJMO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcImh0dHBzOi8vc3RvY3guaW52ZXN0b3IudHJhZGluZzIuZmFzdC10cmFkZS5jb20vc2llYmVydG5ldC9sb2dpbi5kb1wiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwcm9jZXNzLmVudi5SRUdJU1RFUl9VUkwgKyBcIj9uZXdcIjtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCJodHRwczovL3N0b2N4LmludmVzdG9yLnRyYWRpbmcyLmZhc3QtdHJhZGUuY29tL3NpZWJlcnRuZXQvbG9naW4uZG9cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGVycm9yJywgaHR0cFJlcXVlc3QyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgXG4gICAgaHR0cFJlcXVlc3QyLm9wZW4oXG4gICAgICBcIkdFVFwiLFxuICAgICAgXCIvYXBpL0dldFNpZWJlcnRBY2NvdW50TG9va3VwP2lkPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXJJZCksXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICAvL2h0dHBSZXF1ZXN0Mi5zZXRSZXF1ZXN0SGVhZGVyIChcIkF1dGhvcml6YXRpb25cIiwgXCJCYXNpYyBcIiArIGJ0b2EoXCJTaWViZXJ0QWNjb3VudExvb2t1cEFwaVVzZXJcIiArIFwiOlwiICsgXCJoQTE3STQkMlohZWtKJFN1VDlTcVRDalZ5eUtmcGRDeklCJjZPTmdwSSZcIikpO1xuICAgIGh0dHBSZXF1ZXN0Mi5zZW5kKCk7XG5cbiAgICAvKlxuICAgIHZhciBodHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGh0dHBSZXF1ZXN0LnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhodHRwUmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5yZXNwb25zZVRleHQpO1xuXG4gICAgICAgICAgaWYgKGRhdGEuU3lzdGVtID09IFwibmZzXCIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID1cbiAgICAgICAgICAgICAgXCJodHRwczovL2ludmVzdG9yLndlYWx0aHNjYXBlLmNvbS9tc2llYmVydC9pbnZlc3Rvci1pbmRleC5odG1sXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLlN5c3RlbSA9PSBcImFzcGlyZVwiKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9XG4gICAgICAgICAgICAgIFwiaHR0cHM6Ly9zdG9jeC5pbnZlc3Rvci50cmFkaW5nMi5mYXN0LXRyYWRlLmNvbS9zaWViZXJ0bmV0L1wiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3dpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vd3d3LnNpZWJlcnRuZXQuY29tL25vdC1yZWNvZ25pemVkJztcblxuICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgXCIubG9naW4tbW9kYWxfX2Jsb2NrLWZvcm0tZXJyb3JcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVycm9yTXNnLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coJ2xvZ2luIGVycm9yJywgaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTtcblxuICAgICAgICAgIHZhciBlcnJvck1zZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICBcIi5sb2dpbi1tb2RhbF9fYmxvY2stZm9ybS1lcnJvclwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnJvck1zZy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGh0dHBSZXF1ZXN0Lm9wZW4oXG4gICAgICBcIkdFVFwiLFxuICAgICAgXCJodHRwczovL2FwaS5zaWViZXJ0bmV0LmNvbS9hcGkvYWNjb3VudGxvb2t1cC9cIiArXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh1c2VySWQpLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgaHR0cFJlcXVlc3Quc2VuZCgpOyovXG4gIH1cbn1cbiIsImltcG9ydCBhbmltZSBmcm9tICdhbmltZWpzJ1xyXG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICd0aHJvdHRsZS1kZWJvdW5jZSdcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5hdigpIHtcclxuXHRjb25zdCBtZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1haW4tbmF2X19pdGVtcycpLFxyXG5cdFx0bWVudUJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLW5hdl9fbW9iLW1lbnUnKSxcclxuXHRcdG1lbnVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1haW4tbmF2X19pdGVtJyksXHJcblx0XHRtZW51TGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWFpbi1uYXZfX2l0ZW0gPiAubWFpbi1uYXZfX2xpbmsnKSxcclxuXHRcdGxhc3RJdGVtTGlua3MgPSBtZW51TGlzdFttZW51TGlzdC5sZW5ndGggLSAxXS5xdWVyeVNlbGVjdG9yQWxsKCdhJyksXHJcblx0XHRtZW51RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1uYXYnKSxcclxuXHRcdG1lbnVBbmltID0gbW9iaWxlTWVudVRpbWxpbmUoKVxyXG5cclxuXHRjbGVhckFuaW1hdGlvblN0eWxlcyhtZW51QW5pbSwgdHJ1ZSlcclxuXHJcblxyXG5cdC8vIERlYWwgd2l0aCBjaGFuZ2luZyBzY3JlZW4gc2l6ZXNcclxuXHRjb25zdCByZXNpemVGdW5jID0gZGVib3VuY2UoODAwLCAoKSA9PiB7XHJcblx0XHRpZighbWVudUlzTW9iaWxlKCkpIHtcclxuXHRcdFx0dG9nZ2xlQWN0aXZlKG1lbnVFbCwgJ21haW4tbmF2LS1leHBhbmRlZCcsIGZhbHNlKVxyXG5cdFx0XHR0b2dnbGVBY3RpdmUoZG9jdW1lbnQuYm9keSwgJ21vYmlsZS1tZW51LWFjdGl2ZScsIGZhbHNlKVxyXG5cdFx0XHRjbGVhckFuaW1hdGlvblN0eWxlcyhtZW51QW5pbSwgdHJ1ZSlcclxuXHJcblx0XHRcdG1lbnVMaW5rcy5mb3JFYWNoKChlbCkgPT4ge1xyXG5cdFx0XHRcdHRvZ2dsZUFjdGl2ZShlbC5wYXJlbnROb2RlLCAnbWFpbi1uYXZfX2l0ZW0tLWFjdGl2ZScsIGZhbHNlKVxyXG5cdFx0XHRcdGVsLm5leHRFbGVtZW50U2libGluZy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJylcclxuXHRcdFx0fSlcclxuXHRcdH1cclxuXHR9KVxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoZSkgPT4ge1xyXG5cdFx0cmVzaXplRnVuYygpXHJcblx0fSwgdHJ1ZSlcclxuXHJcblxyXG5cdC8vIGhhbWJ1cmdlciBjbGlja1xyXG5cdG1lbnVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdHdpbmRvdy5zY3JvbGxUbygwLDApXHJcblx0XHR0b2dnbGVBY3RpdmUobWVudUVsLCAnbWFpbi1uYXYtLWV4cGFuZGVkJylcclxuXHRcdHRvZ2dsZUFjdGl2ZShkb2N1bWVudC5ib2R5LCAnbW9iaWxlLW1lbnUtYWN0aXZlJylcclxuXHJcblx0XHRhbmltZS5yZW1vdmUobWVudSlcclxuXHJcblx0XHRpZihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnbW9iaWxlLW1lbnUtYWN0aXZlJykpIHtcclxuXHRcdFx0bWVudS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnXHJcblx0XHRcdG1lbnVBbmltLnJlc3RhcnQoKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWVudUFuaW0ucmV2ZXJzZSgpXHJcblx0XHRcdC8vIHByZXZlbnQgYmxpbmtcclxuXHRcdFx0bWVudUFuaW0uY29tcGxldGVkID0gZmFsc2VcclxuXHRcdFx0bWVudUFuaW0ucGxheSgpXHJcblx0XHR9XHJcblx0fSlcclxuXHJcblx0bWVudUxpc3QuZm9yRWFjaChlbCA9PiB7XHJcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRcdGlmICghbWVudUlzTW9iaWxlKCkpIHtcclxuXHRcdFx0XHR0b2dnbGVBY3RpdmUoZWwsICdtYWluLW5hdl9faXRlbS0tYWN0aXZlJywgdHJ1ZSlcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHRcdGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0aWYgKCFtZW51SXNNb2JpbGUoKSkgdG9nZ2xlQWN0aXZlKGVsLCAnbWFpbi1uYXZfX2l0ZW0tLWFjdGl2ZScsIGZhbHNlKVxyXG5cdFx0fSlcclxuXHR9KVxyXG5cclxuXHRtZW51TGlua3MuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XHJcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkge1xyXG5cdFx0XHRpZiAoIW1lbnVJc01vYmlsZSgpKSB7XHJcblx0XHRcdFx0bWVudUxpc3QuZm9yRWFjaChlbCA9PiB7XHJcblx0XHRcdFx0XHR0b2dnbGVBY3RpdmUoZWwsICdtYWluLW5hdl9faXRlbS0tYWN0aXZlJywgZmFsc2UpXHJcblx0XHRcdFx0fSlcclxuXHJcblx0XHRcdFx0dG9nZ2xlQWN0aXZlKGVsLnBhcmVudE5vZGUsICdtYWluLW5hdl9faXRlbS0tYWN0aXZlJywgdHJ1ZSlcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHJcblx0XHQvLyBNb2JpbGUgbWVudVxyXG5cdFx0ZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuXHRcdFx0aWYgKG1lbnVJc01vYmlsZSgpKSB7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0XHRcdGNvbnN0IGRyb3Bkb3duID0gZWwubmV4dEVsZW1lbnRTaWJsaW5nXHJcblx0XHRcdFx0bGV0IHN0b3JlSGVpZ2h0ID0gMFxyXG5cclxuXHRcdFx0XHRkcm9wZG93bi5zdHlsZS5oZWlnaHQgPSAnYXV0bydcclxuXHRcdFx0XHRzdG9yZUhlaWdodCA9IGRyb3Bkb3duLm9mZnNldEhlaWdodFxyXG5cclxuXHRcdFx0XHRpZih0b2dnbGVBY3RpdmUoZWwucGFyZW50Tm9kZSwgJ21haW4tbmF2X19pdGVtLS1hY3RpdmUnKSkge1xyXG5cdFx0XHRcdFx0YW5pbUhlaWdodChkcm9wZG93biwgMCwgc3RvcmVIZWlnaHQgKyAncHgnKVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhbmltSGVpZ2h0KGRyb3Bkb3duLCBzdG9yZUhlaWdodCArICdweCcsIDApXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KVxyXG5cdH0pXHJcblxyXG5cdGxhc3RJdGVtTGlua3NbbGFzdEl0ZW1MaW5rcy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcblx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PSA5KSB7XHJcblx0XHRcdHRvZ2dsZUFjdGl2ZShtZW51TGlzdFttZW51TGlzdC5sZW5ndGggLSAxXSwgJ21haW4tbmF2X19pdGVtLS1hY3RpdmUnLCBmYWxzZSlcclxuXHRcdH1cclxuXHR9KVxyXG5cclxuXHRmdW5jdGlvbiB0b2dnbGVBY3RpdmUoZWwsIGNscywgc2hvdykge1xyXG5cdFx0bGV0IGNsc0xpc3QgPSBlbC5jbGFzc0xpc3RcclxuXHJcblx0XHRpZiAodHlwZW9mIHNob3cgPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdHNob3cgPSBjbHNMaXN0LmNvbnRhaW5zKGNscykgPyBmYWxzZSA6IHRydWVcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc2hvdykge1xyXG5cdFx0XHRjbHNMaXN0LmFkZChjbHMpXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjbHNMaXN0LnJlbW92ZShjbHMpXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNob3dcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG1lbnVJc01vYmlsZSgpIHtcclxuXHRcdHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA+IDEwMjQgPyBmYWxzZSA6IHRydWVcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFuaW1IZWlnaHQoZWwsIHN0YXJ0LCBlbmQpIHtcclxuXHRcdGFuaW1lKHtcclxuXHRcdFx0dGFyZ2V0czogZWwsXHJcblx0XHRcdGVhc2luZzogJ2Vhc2VPdXRDdWJpYycsXHJcblx0XHRcdGhlaWdodDogW3N0YXJ0LCBlbmRdLFxyXG5cdFx0XHRkdXJhdGlvbjogMjUwLFxyXG5cdFx0XHRjb21wbGV0ZTogKGEpID0+IHtcclxuXHRcdFx0XHRhbmltZS5yZW1vdmUoZWwpXHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBtb2JpbGVNZW51VGltbGluZSgpIHtcclxuXHRcdGNvbnN0IG1lbnVJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYWluLW5hdl9faXRlbXM+Lm1haW4tbmF2X19pdGVtJyksXHJcblx0XHRcdG1lbnVTcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tYWluLW5hdl9faXRlbXMtc3BlY2lhbCcpLFxyXG5cdFx0XHR0bCA9IGFuaW1lLnRpbWVsaW5lKHtcclxuXHRcdFx0XHRlYXNpbmc6ICdlYXNlSW5PdXRDdWJpYycsXHJcblx0XHRcdFx0ZHVyYXRpb246IDMwMCxcclxuXHRcdFx0XHRhdXRvcGxheTogZmFsc2UsXHJcblx0XHRcdFx0Y29tcGxldGU6IChhKSA9PiB7XHJcblx0XHRcdFx0XHRpZihhLnJldmVyc2VkKSB7XHJcblx0XHRcdFx0XHRcdG1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xyXG5cdFx0XHRcdFx0XHRhLnJldmVyc2UoKVxyXG5cdFx0XHRcdFx0XHRjbGVhckFuaW1hdGlvblN0eWxlcyhhLCB0cnVlKVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pXHJcblxyXG5cdFx0dGwuYWRkKHtcclxuXHRcdFx0dGFyZ2V0czogbWVudSxcclxuXHRcdFx0b3BhY2l0eTogWzAsIDFdXHJcblx0XHR9KVxyXG5cdFx0LmFkZCh7XHJcblx0XHRcdHRhcmdldHM6IG1lbnVJdGVtcyxcclxuXHRcdFx0b3BhY2l0eTogWzAsIDFdLFxyXG5cdFx0XHR0cmFuc2xhdGVZOiBbJy0xMHB4JywgMF1cclxuXHRcdH0pXHJcblx0XHQuYWRkKHtcclxuXHRcdFx0dGFyZ2V0czogbWVudVNwLFxyXG5cdFx0XHRvcGFjaXR5OiBbMCwxXSxcclxuXHRcdFx0dHJhbnNsYXRlWTogWycyMHB4JywgMF1cclxuXHRcdH0sICctPTEwMCcpXHJcblxyXG5cdFx0cmV0dXJuIHRsXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjbGVhckFuaW1hdGlvblN0eWxlcyhhLCB0aW1lbGluZSkge1xyXG5cdFx0aWYodGltZWxpbmUpIHtcclxuXHRcdFx0YS5jaGlsZHJlbi5mb3JFYWNoKChvYmopID0+IHtcclxuXHRcdFx0XHRjbGVhckFuaW1hdGFibGVzKG9iailcclxuXHRcdFx0fSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNsZWFyQW5pbWF0YWJsZXMoYSlcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBjbGVhckFuaW1hdGFibGVzKG9iaikge1xyXG5cdFx0XHRvYmouYW5pbWF0YWJsZXMuZm9yRWFjaCgoZWwpID0+IHtcclxuXHRcdFx0XHRlbC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpXHJcblx0XHRcdH0pXHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBob25lU2xpZGVyKCkge1xyXG5cclxuXHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBob25lLXNsaWRlcl9fc2xpZGVyLmdsaWRlJykpIHtcclxuXHRcdHZhciBnbGlkZSA9IG5ldyBHbGlkZSgnLnBob25lLXNsaWRlcl9fc2xpZGVyLmdsaWRlJywge1xyXG5cdFx0XHR0eXBlOiAnY2Fyb3VzZWwnLFxyXG5cdFx0XHRwZXJWaWV3OiAxLFxyXG5cdFx0XHRmb2N1c0F0OiAnY2VudGVyJyxcclxuXHRcdFx0Z2FwOiAwLFxyXG5cdFx0XHRhdXRvcGxheTogNTUwMFxyXG5cdFx0fSlcclxuXHJcblx0XHRnbGlkZS5tb3VudCgpXHJcblx0fVxyXG5cclxufVxyXG4iLCJcbmZ1bmN0aW9uIGhhbmRsZVN0b3J5KCkge1xuXG4gIC8vIHF1b3RlIG1lZGlhIHN0b3J5XG4gIHZhciBtYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLm1hdGNoKC9pbnZlc3Rvci1uZXdzXFw/cW1vZFN0b3J5SUQ9KFswLTldKykvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgLy9jb25zb2xlLmxvZyhtYXRjaFsxXSk7XG5cbiAgICB2YXIgcXRvb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucXRvb2wnKTtcblxuICAgIHF0b29sLnNldEF0dHJpYnV0ZSgnZGF0YS1xbW9kLXRvb2wnLCAnZnVsbG5ld3NzdG9yeScpO1xuICAgIHF0b29sLnNldEF0dHJpYnV0ZSgnZGF0YS1xbW9kLXBhcmFtcycsICd7XCJxbW9kU3RvcnlJRFwiOlwiJyttYXRjaFsxXSsnXCJ9Jyk7XG5cbiAgICBxdG9vbC5pbm5lckhUTUwgPSAnPHNjcmlwdCB0eXBlPVwidGV4dC90ZW1wbGF0ZVwiPicrXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJxbW9kLXVpLXRvb2wgcW1vZC1mdWxsbmV3c3N0b3J5XCI+JytcbiAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicW1vZC1uZXdzLWRhdGV0aW1lXCI+JytcbiAgICAgICAgICAgICAgICAgICAgXCJ7c2NvcGUuZnVsbG5ld3NzdG9yeS5kYXRhLnFtbmV3cy5xbXN0b3J5LmRhdGV0aW1lIHwgbW9tZW50anMgdHJ1ZSAnbGxsJyB0TGFuZ31cIitcbiAgICAgICAgICAgICAgICAgICc8L2Rpdj4nK1xuICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJxbW9kLWhlYWRsaW5lc1wiPjxoMyBjbGFzcz1cInFtb2QtaGVhZGxpbmVcIj57c2NvcGUuZnVsbG5ld3NzdG9yeS5kYXRhLnFtbmV3cy5xbXN0b3J5LnFtaGVhZGxpbmV9PC9oMz48L2Rpdj4nK1xuICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJxbW9kLXN0b3J5XCIgcnYtaHRtbD1cInNjb3BlLmZ1bGxuZXdzc3RvcnkuZGF0YS5xbW5ld3MucW1zdG9yeS5xbXRleHRcIj48L2Rpdj4nK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nK1xuICAgICAgICAgICAgICAnPC9zY3JpcHQ+JztcblxuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmludmVzdG9yLW5ld3MtYXJ0aWNsZXNfX2hlYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnZlc3Rvci1uZXdzLWFydGljbGVzJykuY2xhc3NOYW1lICs9IFwiIGludmVzdG9yLW5ld3MtYXJ0aWNsZXNfX3N0b3J5XCI7XG5cbiAgICB3aW5kb3cucU1vZC5sb2FkVG9vbHMoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdW90ZU1lZGlhKCkge1xuICBoYW5kbGVTdG9yeSgpO1xuXG4gIC8vY29uc29sZS5sb2coJ3F1b3RlIG1lZGlhJyk7XG5cbiAgdmFyIHF0b29scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdG9vbCcpO1xuXG4gIHF0b29scy5mb3JFYWNoKHF0b29sID0+IHtcbiAgICB2YXIgdG9vbCA9IHF0b29sLmRhdGFzZXQucW1vZFRvb2w7XG4gICAgLy9jb25zb2xlLmxvZyh0b29sKTtcblxuICAgIGlmICh0b29sID09ICdtaW5pcXVvdGVzJyB8fCB0b29sID09J2ZpbGluZ3MnIHx8IHRvb2wgPT0gJ2RldGFpbGVkcXVvdGV0YWInIHx8IHRvb2wgPT0gJ2ludGVyYWN0aXZlY2hhcnQnIHx8IHRvb2wgPT0gJ3ByaWNlaGlzdG9yeScpIHtcbiAgICAgIHF0b29sLnNldEF0dHJpYnV0ZSgnZGF0YS1xbW9kLXBhcmFtcycsICd7XCJzeW1ib2xcIjpcIlNJRUJcIn0nKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9vbCA9PSAnZnVsbG5ld3NzdW1tYXJ5Jykge1xuICAgICAgcXRvb2wuc2V0QXR0cmlidXRlKCdkYXRhLXFtb2QtcGFyYW1zJywgJ3tcInN0b3J5VVJMXCI6XCIvaW52ZXN0b3ItcmVsYXRpb25zL2ludmVzdG9yLW5ld3M/cW1vZFN0b3J5SUQ9XCIsIFwic3ltYm9sXCIgOiBcIlNJRUJcIiwgXCJleGNsdWRlVG9waWNzXCIgOiBcIk5PTkNPTVBBTllcIiwgXCJzcmNcIiA6IFwiYndpXCIsIFwicmVzdWx0c1BlclBhZ2VcIjo0LCBcImRhdGVIZWFkaW5nc1wiOmZhbHNlfScpO1xuICAgIH1cblx0fSk7XG5cblxuXG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN1Ym5hdigpIHtcblxuICBmdW5jdGlvbiBnZXRIZWlnaHQoZWwpIHtcbiAgICByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpc3RhbmNlKCkge1xuICAgIHZhciB0b3BEaXN0ID0gaC5vZmZzZXRUb3A7XG4gICAgcmV0dXJuIHRvcERpc3Q7XG4gIH1cblxuICB2YXIgaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3ViLW5hdlwiKTtcblxuICBpZiAoIWgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaGVpZ2h0ID0gZ2V0SGVpZ2h0KGgpO1xuICB2YXIgcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3ViLW5hdl9fc3RpY2t5LXBsYWNlaG9sZGVyXCIpO1xuICB2YXIgc3R1Y2sgPSBmYWxzZTtcbiAgdmFyIHN0aWNrUG9pbnQgPSBnZXREaXN0YW5jZSgpO1xuXG4gIHZhciBzY3JvbGxGbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSBnZXREaXN0YW5jZSgpIC0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIHZhciBvZmZzZXQgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICBpZiAoIChkaXN0YW5jZSA8PSAwKSAmJiAhc3R1Y2spIHtcbiAgICAgIGguY2xhc3NMaXN0LmFkZChcInN0aWNreVwiKTtcbiAgICAgIHAuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHN0dWNrID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHN0dWNrICYmIChvZmZzZXQgPD0gc3RpY2tQb2ludCkpe1xuICAgICAgaC5jbGFzc0xpc3QucmVtb3ZlKFwic3RpY2t5XCIpO1xuICAgICAgaGVpZ2h0ID0gZ2V0SGVpZ2h0KGgpO1xuICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgc3R1Y2sgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfLnRocm90dGxlKHNjcm9sbEZuLCAzMDApKTtcblxuXG4gIHZhciBzdWJuYXZIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3ViLW5hdl9faGVhZGVyJyk7XG4gIHZhciBzdWJuYXZDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Yi1uYXZfX2NvbnRlbnQnKTtcblxuICBzdWJuYXZIZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cbiAgICBpZiAoc3VibmF2Q29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3N1Yi1uYXZfX2NvbnRlbnQtLXZpc2libGUnKSkge1xuICAgICAgc3VibmF2SGVhZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJzdWItbmF2X19oZWFkZXItLW9wZW5cIik7XG4gICAgICBzdWJuYXZDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJzdWItbmF2X19jb250ZW50LS12aXNpYmxlXCIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN1Ym5hdkhlYWRlci5jbGFzc0xpc3QuYWRkKFwic3ViLW5hdl9faGVhZGVyLS1vcGVuXCIpO1xuICAgICAgc3VibmF2Q29udGVudC5jbGFzc0xpc3QuYWRkKFwic3ViLW5hdl9fY29udGVudC0tdmlzaWJsZVwiKTtcbiAgICB9XG4gIH0pO1xuXG59XG4iLCJcblxuZnVuY3Rpb24gdXBkYXRlQ29udGVudChpbmRleCkge1xuICB2YXIgYWN0aXZlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnMtMmNvbF9fdGFiLWNvbnRlbnQtdGV4dC0tYWN0aXZlJylbMF07XG4gIGFjdGl2ZVRleHQuY2xhc3NMaXN0LnJlbW92ZShcInRhYnMtMmNvbF9fdGFiLWNvbnRlbnQtdGV4dC0tYWN0aXZlXCIpO1xuXG4gIC8vdmFyIG5leHRUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFicy0yY29sX190YWItY29udGVudC0nICsgaW5kZXgpWzBdO1xuICAvL25leHRUZXh0LmNsYXNzTGlzdC5hZGQoXCJ0YWJzLTJjb2xfX3RhYi1jb250ZW50LXRleHQtLWFjdGl2ZVwiKTtcblxuICB2YXIgbmV4dFRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFicy0yY29sX190YWItY29udGVudC0nICsgaW5kZXgpO1xuICBuZXh0VGV4dC5jbGFzc0xpc3QuYWRkKFwidGFicy0yY29sX190YWItY29udGVudC10ZXh0LS1hY3RpdmVcIik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRhYnMyQ29sKCkge1xuXG5cbiAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWJzLTJjb2wgc2VsZWN0Jyk7XG5cbiAgaWYgKHNlbGVjdC5sZW5ndGgpIHtcbiAgICBzZWxlY3RbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSkge1xuICAgICAgLy9jb25zb2xlLmxvZygnc2VsZWN0JywgdGhpcy52YWx1ZSlcblxuICAgICAgdmFyIGFjdGl2ZVRhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnMtMmNvbF9fdGFicy0tYWN0aXZlJylbMF07XG4gICAgICBpZiAoYWN0aXZlVGFiKSB7XG4gICAgICAgIGFjdGl2ZVRhYi5jbGFzc0xpc3QucmVtb3ZlKFwidGFicy0yY29sX190YWJzLS1hY3RpdmVcIik7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUNvbnRlbnQodGhpcy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFicy0yY29sX190YWJzIGEnKTtcblxuICBsaW5rcy5mb3JFYWNoKGVsID0+IHtcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIHVwZGF0ZSB0YWJzXG4gICAgICB2YXIgYWN0aXZlVGFiID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFicy0yY29sX190YWJzLS1hY3RpdmUnKVswXTtcbiAgICAgIGlmIChhY3RpdmVUYWIpIHtcbiAgICAgICAgYWN0aXZlVGFiLmNsYXNzTGlzdC5yZW1vdmUoXCJ0YWJzLTJjb2xfX3RhYnMtLWFjdGl2ZVwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwidGFicy0yY29sX190YWJzLS1hY3RpdmVcIik7XG5cbiAgICAgIC8vIHVwZGF0ZSBjb250ZW50XG4gICAgICB1cGRhdGVDb250ZW50KGVsLmRhdGFzZXQudGFiKTtcblxuXHRcdH0pO1xuXHR9KTtcblxuXG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZpZGVvTW9kYWwoKSB7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZ1bGwtd2lkdGgtcGhvdG9fX3ZpZGVvLCAuZnVsbC13aWR0aC1waG90by1iZ19fdmlkZW8nKS5mb3JFYWNoKGVsID0+IHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG5cblxuICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWRlby1wbGF5ZXInKTtcbiAgICAgIHBsYXllci5zZXRBdHRyaWJ1dGUoJ3NyYycsIHBsYXllci5kYXRhc2V0LnNyYyk7XG5cbiAgICAgIC8qZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnl0X3BsYXllcl9pZnJhbWUnKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgne1wiZXZlbnRcIjpcImNvbW1hbmRcIixcImZ1bmNcIjpcInBsYXlWaWRlb1wiLFwiYXJnc1wiOlwiXCJ9JywgJyonKVxuICAgICAgfSk7Ki9cblxuICAgICAgLyp2YXIgY2xkID0gY2xvdWRpbmFyeS5DbG91ZGluYXJ5Lm5ldyh7IGNsb3VkX25hbWU6ICdkbWgxNW92OXonIH0pO1xuICAgICAgdmFyIGRlbW9wbGF5ZXIgPSBjbGQudmlkZW9QbGF5ZXIoJ2RvYy1wbGF5ZXInKS53aWR0aCg2MDApO1xuICAgICAgZGVtb3BsYXllci5zb3VyY2UoJ3N0b2NrJTIwcGxhbnMvU3RvY2tjcm9zc19Db3Jwb3JhdGVPZmZpY2UtVmlkZW9DX3dlam54ZCcpKi9cblxuICAgICAgLyp2YXIgY2xkID0gY2xvdWRpbmFyeS5DbG91ZGluYXJ5Lm5ldyh7IGNsb3VkX25hbWU6ICdkZW1vJyB9KTtcbiAgICAgIHZhciBkZW1vcGxheWVyID0gY2xkLnZpZGVvUGxheWVyKCdkb2MtcGxheWVyJykud2lkdGgoNjAwKTtcbiAgICAgIGRlbW9wbGF5ZXIuc291cmNlKCdyYWNlX3JvYWRfY2FyJykqL1xuXG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS12aWRlbycpKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHknKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cdH0pO1xuXG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZ1bGwtd2lkdGgtcGhvdG9fX3ZpZGVvLW1vZGFsLWNvbnRlbnQtd3JhcCwgLmZ1bGwtd2lkdGgtcGhvdG8tYmdfX3ZpZGVvLW1vZGFsLWNvbnRlbnQtd3JhcCcpLmZvckVhY2goZWwgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG4gIH0pO1xuXG5cblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZnVsbC13aWR0aC1waG90b19fdmlkZW8tbW9kYWwsIC5mdWxsLXdpZHRoLXBob3RvLWJnX192aWRlby1tb2RhbCcpLmZvckVhY2goZWwgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZmFkZS1vdXQnKTtcblxuICAgICAgLypkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcueXRfcGxheWVyX2lmcmFtZScpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBlbC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7XCJldmVudFwiOlwiY29tbWFuZFwiLFwiZnVuY1wiOlwic3RvcFZpZGVvXCIsXCJhcmdzXCI6XCJcIn0nLCAnKicpXG4gICAgICB9KTsqL1xuXG4gICAgICB2YXIgcGxheWVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvLXBsYXllcicpO1xuICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgJycpO1xuXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5JykuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXHR9KTtcblxuXG5cblxufVxuIiwiXHJcblxyXG5cclxuaW1wb3J0IFwiLi9wb2x5ZmlsbHMvTm9kZUxpc3QuZm9yRWFjaFwiO1xyXG5cclxuaW1wb3J0IGFuaW1hdGlvbnMgZnJvbSBcIi4vX2FuaW1hdGlvbnNcIjtcclxuaW1wb3J0IGNsb3VkSW1hZ2VzIGZyb20gXCIuL19jbG91ZGluYXJ5XCI7XHJcbmltcG9ydCBxdW90ZU1lZGlhIGZyb20gXCIuL19xdW90ZW1lZGlhXCI7XHJcbmltcG9ydCBuYXYgZnJvbSBcIi4vX25hdlwiO1xyXG5pbXBvcnQgc3VibmF2IGZyb20gXCIuL19zdWJuYXZcIjtcclxuaW1wb3J0IHBob25lU2xpZGVyIGZyb20gXCIuL19waG9uZS1zbGlkZXJcIjtcclxuaW1wb3J0IGRhaWx5TWFya2V0IGZyb20gXCIuL19kYWlseS1tYXJrZXRcIjtcclxuaW1wb3J0IGludmVzdG1lbnRUeXBlcyBmcm9tIFwiLi9faW52ZXN0bWVudC10eXBlc1wiO1xyXG5pbXBvcnQgYW5udWl0aWVzVGFibGUgZnJvbSBcIi4vX2FubnVpdGllcy10YWJsZVwiO1xyXG5pbXBvcnQgdmlkZW9Nb2RhbCBmcm9tIFwiLi9fdmlkZW8tbW9kYWxcIjtcclxuaW1wb3J0IGNsb3VkaW5hcnlWaWRlb01vZGFsIGZyb20gXCIuL19jbG91ZGluYXJ5LXZpZGVvLW1vZGFsXCI7XHJcbmltcG9ydCBsb2dpbk1vZGFsIGZyb20gXCIuL19sb2dpbi1tb2RhbFwiO1xyXG4vLyBpbXBvcnQgc2FsZXNmb3JjZU1vZGFsIGZyb20gXCIuL19saXZlLWNoYXQtbW9kYWxcIjtcclxuaW1wb3J0IHRhYnMyQ29sIGZyb20gXCIuL190YWJzLTJjb2xcIjtcclxuaW1wb3J0IGZvcm1WYWxpZGF0ZSBmcm9tIFwiLi9fZm9ybS12YWxpZGF0ZVwiO1xyXG5pbXBvcnQgYWxlcnRCYW5uZXJzIGZyb20gXCIuL19hbGVydC1iYW5uZXJcIjtcclxuLy8gaW1wb3J0IGxpdmVDaGF0IGZyb20gXCIuL19saXZlLWNoYXRcIjtcclxuXHJcblxyXG5jb25zb2xlLmxvZygnTk9ERV9FTlYnLCBwcm9jZXNzLmVudi5OT0RFX0VOVik7XHJcbmNvbnNvbGUubG9nKCdUUkFERVJfVVJMJywgcHJvY2Vzcy5lbnYuVFJBREVSX1VSTCk7XHJcbmNvbnNvbGUubG9nKCdSRUdJU1RFUl9VUkwnLCBwcm9jZXNzLmVudi5SRUdJU1RFUl9VUkwpXHJcbmNvbnNvbGUubG9nKCdBUElfVVJMJywgcHJvY2Vzcy5lbnYuQVBJX1VSTClcclxuXHJcbi8vIHByZXZlbnQgbWVudSBjYWNoZSBvbiBpb3Ncclxud2luZG93Lm9ucGFnZXNob3cgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICBpZiAoZXZlbnQucGVyc2lzdGVkKSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgfVxyXG59O1xyXG5cclxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIChldmVudCkgPT4ge1xyXG4gIGFuaW1hdGlvbnMoKTtcclxufSk7XHJcblxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gIFwiRE9NQ29udGVudExvYWRlZFwiLFxyXG4gIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICBmb3JtVmFsaWRhdGUoKTtcclxuICAgIGNsb3VkSW1hZ2VzKCk7XHJcbiAgICBxdW90ZU1lZGlhKCk7XHJcbiAgICBcclxuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWFpbi1uYXYnKSAhPSBudWxsKSB7XHJcbiAgICAgIG5hdigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN1Ym5hdigpO1xyXG4gICAgdGFiczJDb2woKTtcclxuICAgIHBob25lU2xpZGVyKCk7XHJcbiAgICBkYWlseU1hcmtldCgpO1xyXG4gICAgaW52ZXN0bWVudFR5cGVzKCk7XHJcbiAgICBhbm51aXRpZXNUYWJsZSgpO1xyXG4gICAgdmlkZW9Nb2RhbCgpO1xyXG4gICAgY2xvdWRpbmFyeVZpZGVvTW9kYWwoKTtcclxuXHJcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvZ2luLW1vZGFsJykgIT0gbnVsbCkge1xyXG4gICAgICBsb2dpbk1vZGFsKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIHNhbGVzZm9yY2VNb2RhbCgpO1xyXG4gICAgYWxlcnRCYW5uZXJzKCk7XHJcbiAgICAvLyBsaXZlQ2hhdCgpO1xyXG5cclxuXHJcbiAgICAvLyBzZXR1cCBodWJzcG90IGZvcm0gaW4gZm9vdGVyIGFyZWFcclxuICAgIHZhciBteUh1YnNwb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZm9vdGVyX19uZXdzbGV0dGVyLWZvcm0taHVic3BvdCcpO1xyXG5cclxuICAgIGlmIChteUh1YnNwb3QgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgbXlTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG4gICAgICBteVNjcmlwdC5pbm5lckhUTUwgPSAnaGJzcHQuZm9ybXMuY3JlYXRlKHtyZWdpb246IFwibmExXCIscG9ydGFsSWQ6IFwiMjExMjg0OTRcIixmb3JtSWQ6IFwiOGM3ODE0ZGUtNDg2Yi00YThlLTliMzYtZGI1MDMwMjMzMDYyXCJ9KTsnO1xyXG4gICAgICBteUh1YnNwb3QucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobXlTY3JpcHQsIG15SHVic3BvdCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIGFuaW1hdGUgZmFkZSBvdXRcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25lbmRcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgaWYgKGUuYW5pbWF0aW9uTmFtZSA9PT0gXCJmYWRlT3V0XCIpIHtcclxuICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKFwiZmFkZS1vdXRcIik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHNtb290aCBzY3JvbGwgYW5jaG9yc1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXj1cIiNcIl0nKS5mb3JFYWNoKChhbmNob3IpID0+IHtcclxuICAgICAgYW5jaG9yLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucyhcIm5vLWp1bXBcIikpIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucyhcIm5vLWFuaW1hdGVcIikpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgLypkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykpLnNjcm9sbEludG9WaWV3KHtcclxuICBcdCAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcclxuICBcdCAgICAgIH0pOyovXHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcclxuICAgICAgICAgICAgY29uc3QgeU9mZnNldCA9IC0xMDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkKTtcclxuICAgICAgICAgICAgY29uc3QgeSA9XHJcbiAgICAgICAgICAgICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgK1xyXG4gICAgICAgICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCArXHJcbiAgICAgICAgICAgICAgeU9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogeSwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGJhY2sgdG8gdG9wXHJcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhY2stdG8tdG9wID4gZGl2XCIpLmZvckVhY2goKGFuY2hvcikgPT4ge1xyXG4gICAgICBhbmNob3IuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIixcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBtYWtlIGhpZ2h0IG9mIGlmcmFtZXMgMTAwJVxyXG4gICAgaWYgKHR5cGVvZiBpRnJhbWVSZXNpemUgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgaUZyYW1lUmVzaXplKHsgbG9nOiBmYWxzZSB9LCBcIi5pZnJhbWUtcmVzaXplXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5ld3NsZXR0ZXIgZm9ybVxyXG4gICAgdmFyIG5ld3NsZXR0ZXJGb3JtQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgXCIuZm9vdGVyX19uZXdzbGV0dGVyLWZvcm0gLmJ0blwiXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChuZXdzbGV0dGVyRm9ybUJ0biAhPSBudWxsKSB7XHJcbiAgICAgIG5ld3NsZXR0ZXJGb3JtQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZm9vdGVyX19uZXdzbGV0dGVyLWZvcm1cIilbMF07XHJcblxyXG4gICAgICAgIHZhciBjb25zdHJhaW50cyA9IHtcclxuICAgICAgICAgIGVtYWlsOiB7XHJcbiAgICAgICAgICAgIHByZXNlbmNlOiB0cnVlLFxyXG4gICAgICAgICAgICBlbWFpbDogdHJ1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1FcnJvciA9IGZvcm0ucXVlcnlTZWxlY3RvcihcIi5pbnB1dC1ncm91cF9fZXJyb3JcIik7XHJcbiAgICAgICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKGZvcm0sIGNvbnN0cmFpbnRzKTtcclxuXHJcbiAgICAgICAgaWYgKGVycm9ycykge1xyXG4gICAgICAgICAgZm9ybUVycm9yLmlubmVySFRNTCA9IGVycm9ycy5lbWFpbFswXTtcclxuICAgICAgICAgIGZvcm1FcnJvci5jbGFzc0xpc3QuYWRkKFwiaGFzLWVycm9yXCIsIFwiaW5wdXQtZ3JvdXBfX2Vycm9yLS1kYXJrXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3JtRXJyb3IuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgIGZvcm1FcnJvci5jbGFzc0xpc3QucmVtb3ZlKFwiaGFzLWVycm9yXCIpO1xyXG4gICAgICAgICAgLy8gc3VibWl0XHJcblxyXG4gICAgICAgICAgdmFyIGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmb290ZXJfX25ld3NsZXR0ZXItZm9ybS1lbWFpbFwiKTtcclxuXHJcbiAgICAgICAgICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHJcbiAgICAgICAgICBodHRwUmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChodHRwUmVxdWVzdC5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XHJcbiAgICAgICAgICAgICAgLy8gc2hvdyBzdWNjZXNzIG1lc3NhZ2VcclxuICAgICAgICAgICAgICBpZiAoaHR0cFJlcXVlc3Quc3RhdHVzID09PSAyMDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXNcclxuICAgICAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZm9ybUVycm9yLmNsYXNzTGlzdC5yZW1vdmUoXCJoYXMtZXJyb3JcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBlbWFpbCBmaWVsZCB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gXCJUaGFua3MgZm9yIHNpZ25pbmcgdXAhXCI7XHJcbiAgICAgICAgICAgICAgICBwLmNsYXNzTmFtZSA9IFwiZm9vdGVyX19uZXdzbGV0dGVyLWZvcm0tc3VjY2Vzc1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGFkZCBzdWNjZXNzIC8gZXJyb3IgbWVzc2FnZSB0byBET01cclxuICAgICAgICAgICAgICAgIGVtYWlsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHAsIGVtYWlsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHN1Ym1pdCBidXR0b24gb24gc3VjY2Vzc1xyXG4gICAgICAgICAgICAgICAgdmFyIGJ0biA9IGZvcm0ucXVlcnlTZWxlY3RvcihcImJ1dHRvblwiKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChodHRwUmVxdWVzdC5zdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChodHRwUmVxdWVzdC5zdGF0dXNUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5zdGF0dXNUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY29kZSBmb3IgaW52YWxpZCBlbWFpbCBhZGRyZXNzXHJcbiAgICAgICAgICAgICAgICAgIGlmIChqc29uLkNvZGUgJiYganNvbi5Db2RlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUVycm9yLmlubmVySFRNTCA9IFwiVGhpcyBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24uQ29kZSAmJiAoanNvbi5Db2RlID09PSAyMDQgfHwganNvbi5Db2RlID09PSAyMDUgfHwganNvbi5Db2RlID09PSAyMDYgfHwganNvbi5Db2RlID09PSAyMDcgfHwganNvbi5Db2RlID09PSAyMDgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgICAgICogZW1haWwgYWRkcmVzcyBpcyBvbiBhIGxpc3QgdGhhdCBtYWtlcyBpdCBzbyBpdCBjYW5ub3Qgc2lnblxyXG4gICAgICAgICAgICAgICAgICAgICAqIHVwIGZvciBtYWlsaW5nIGxpc3QgKGRlbGV0ZWQsIHVuc3Vic2NyaWJlZCwgYm91bmNlZCwgZXRjLilcclxuICAgICAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgICAgICBmb3JtRXJyb3IuaW5uZXJIVE1MID0gXCJTb3JyeSwgeW91IGNhbm5vdCBzaWduIHVwIHdpdGggdGhpcyBlbWFpbCBhZGRyZXNzLlwiO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBcIlNvcnJ5IHRoZXJlIHdhcyBhbiBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlclwiO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBzZXQgZXJyb3IgY3NzIGNsYXNzIGZvciBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LmFkZChcImhhcy1lcnJvclwiLCBcImlucHV0LWdyb3VwX19lcnJvci0tZGFya1wiKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJpYyBkZWZhdWx0IGVycm9yXHJcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LmFkZChcImhhcy1lcnJvclwiLCBcImlucHV0LWdyb3VwX19lcnJvci0tZGFya1wiKTtcclxuICAgICAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBcIlNvcnJ5IHRoZXJlIHdhcyBhbiBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlclwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBodHRwUmVxdWVzdC5vcGVuKFwiUE9TVFwiLCBcIi9jYW1wYWlnbi9jcmVhdGVcIik7XHJcbiAgICAgICAgICBodHRwUmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKFxyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiLFxyXG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChcIkVtYWlsPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsLnZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8vIGludmVzdG9yIHJlbGF0aW9ucyBzaGFyZWhvbGRlciB1cGRhdGVzXHJcbiAgICB2YXIgc2hhcmVob2xkZXJTaWdudXBCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3NoYXJlaG9sZGVyVXBkYXRlc1NpZ251cEJ0blwiKTtcclxuICAgIGlmIChzaGFyZWhvbGRlclNpZ251cEJ0bikge1xyXG4gICAgICBzaGFyZWhvbGRlclNpZ251cEJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc2lnbnVwIGNsaWNrJyk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImludmVzdG1lbnQtdGV4dC1pbWFnZV9fZm9ybVwiKVswXTtcclxuICAgICAgICB2YXIgY29uc3RyYWludHMgPSB7XHJcbiAgICAgICAgICAgIGVtYWlsOiB7XHJcbiAgICAgICAgICAgICAgICBwcmVzZW5jZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBmb3JtRXJyb3IgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW52ZXN0bWVudC10ZXh0LWltYWdlX19mb3JtLWVycm9yXCIpO1xyXG4gICAgICAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShmb3JtLCBjb25zdHJhaW50cyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBlcnJvcnMuZW1haWxbMF07XHJcbiAgICAgICAgICAgIGZvcm1FcnJvci5jbGFzc0xpc3QuYWRkKFwiaGFzLWVycm9yXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvcm1FcnJvci5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LnJlbW92ZShcImhhcy1lcnJvclwiKTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyBzdWJtaXRcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1YmJtaXR0aW5nJyk7XHJcblxyXG4gICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCAnL0NhbXBhaWduL1NoYXJlaG9sZGVyVXBkYXRlcycsIHRydWUpO1xyXG4gICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsgLy8gQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgcC5pbm5lckhUTUwgPSBcIlRoYW5rcyBmb3Igc2lnbmluZyB1cCFcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybUZpZWxkcyA9IGZvcm0ucXVlcnlTZWxlY3RvcihcIi5pbnZlc3RtZW50LXRleHQtaW1hZ2VfX2Zvcm0tZmllbGRzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkcy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwLCBmb3JtRmllbGRzKTsgLy8gZGlzYWJsZSBzdWJtaXQgYnV0dG9uIG9uIHN1Y2Nlc3NcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwLmlubmVySFRNTCA9IFwiU29ycnkgdGhlcmUgd2FzIGFuIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1GaWVsZHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW52ZXN0bWVudC10ZXh0LWltYWdlX19mb3JtLWZpZWxkc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZHMucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocCwgZm9ybUZpZWxkcyk7IC8vIGRpc2FibGUgc3VibWl0IGJ1dHRvbiBvbiBzdWNjZXNzXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbnZlc3RtZW50LXRleHQtaW1hZ2VfX2Zvcm0tbmFtZVwiKTtcclxuICAgICAgICAgICAgdmFyIGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbnZlc3RtZW50LXRleHQtaW1hZ2VfX2Zvcm0tZW1haWxcIik7XHJcbiAgICAgICAgICAgIHZhciBhY2NvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbnZlc3RtZW50LXRleHQtaW1hZ2VfX2Zvcm0tYWNjb3VudFwiKTtcclxuICAgICAgICAgICAgeGhyLnNlbmQoXCJOYW1lPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUudmFsdWUpICsgXCImRW1haWw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZW1haWwudmFsdWUpICsgXCImQWNjb3VudD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChhY2NvdW50LnZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpbnZlc3RvciBuZXdzIHVwZGF0ZXNcclxuICAgIHZhciBpbnZlc3Rvck5ld3NTaWdudXBCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2ludmVzdG9yTmV3c1NpZ251cEJ0blwiKTtcclxuICAgIGlmIChpbnZlc3Rvck5ld3NTaWdudXBCdG4pIHtcclxuICAgICAgaW52ZXN0b3JOZXdzU2lnbnVwQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdzaWdudXAgY2xpY2snKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiaW52ZXN0b3ItbmV3cy1wYW5lbF9fZm9ybVwiKVswXTtcclxuICAgICAgICB2YXIgY29uc3RyYWludHMgPSB7XHJcbiAgICAgICAgICAgIGVtYWlsOiB7XHJcbiAgICAgICAgICAgICAgICBwcmVzZW5jZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBmb3JtRXJyb3IgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW52ZXN0b3ItbmV3cy1wYW5lbF9fZm9ybS1lcnJvclwiKTtcclxuICAgICAgICB2YXIgZXJyb3JzID0gdmFsaWRhdGUoZm9ybSwgY29uc3RyYWludHMpO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGVycm9ycykge1xyXG4gICAgICAgICAgICBmb3JtRXJyb3IuaW5uZXJIVE1MID0gZXJyb3JzLmVtYWlsWzBdO1xyXG4gICAgICAgICAgICBmb3JtRXJyb3IuY2xhc3NMaXN0LmFkZChcImhhcy1lcnJvclwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3JtRXJyb3IuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgZm9ybUVycm9yLmNsYXNzTGlzdC5yZW1vdmUoXCJoYXMtZXJyb3JcIik7XHJcblxyXG5cclxuICAgICAgICAgICAgLy8gc3VibWl0XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWJibWl0dGluZycpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICB4aHIub3BlbihcIlBPU1RcIiwgJy9DYW1wYWlnbi9TaGFyZWhvbGRlclVwZGF0ZXMnLCB0cnVlKTtcclxuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XHJcblxyXG4gICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7IC8vIENhbGwgYSBmdW5jdGlvbiB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gXCJUaGFua3MgZm9yIHNpZ25pbmcgdXAhXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1GaWVsZHMgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCIuaW52ZXN0b3ItbmV3cy1wYW5lbF9fZm9ybS1maWVsZHNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRzLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHAsIGZvcm1GaWVsZHMpOyAvLyBkaXNhYmxlIHN1Ym1pdCBidXR0b24gb24gc3VjY2Vzc1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gXCJTb3JyeSB0aGVyZSB3YXMgYW4gZXJyb3IsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybUZpZWxkcyA9IGZvcm0ucXVlcnlTZWxlY3RvcihcIi5pbnZlc3Rvci1uZXdzLXBhbmVsX19mb3JtLWZpZWxkc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZHMucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocCwgZm9ybUZpZWxkcyk7IC8vIGRpc2FibGUgc3VibWl0IGJ1dHRvbiBvbiBzdWNjZXNzXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbnZlc3Rvci1uZXdzLXBhbmVsX19mb3JtLW5hbWVcIik7XHJcbiAgICAgICAgICAgIHZhciBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW52ZXN0b3ItbmV3cy1wYW5lbF9fZm9ybS1lbWFpbFwiKTtcclxuICAgICAgICAgICAgeGhyLnNlbmQoXCJOYW1lPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUudmFsdWUpICsgXCImRW1haWw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZW1haWwudmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdvb2dsZSBtYXBcclxuICAgIHZhciBtYXBDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmdvb2dsZS1tYXBcIik7XHJcbiAgICBtYXBDb250YWluZXIuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoXCJpZnJhbWVcIikuY2xhc3NMaXN0LmFkZChcImNsaWNrZWRcIik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKFwiaWZyYW1lXCIpLmNsYXNzTGlzdC5yZW1vdmUoXCJjbGlja2VkXCIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIDQgc3RlcCBhY2NvcmRpb24gaW1hZ2UgYmxvY2tcclxuICAgIHZhciBpbWFnZUJsb2NrTWVudUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcclxuICAgICAgXCIuaW1hZ2UtbWVudS1ibG9ja19fY29udGVudFwiXHJcbiAgICApO1xyXG4gICAgaW1hZ2VCbG9ja01lbnVJdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xyXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdmFyIHZpc2libGUgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgXCJpbWFnZS1tZW51LWJsb2NrX19tZW51LWl0ZW0tLXZpc2libGVcIlxyXG4gICAgICAgIClbMF07XHJcbiAgICAgICAgdmlzaWJsZS5jbGFzc0xpc3QucmVtb3ZlKFwiaW1hZ2UtbWVudS1ibG9ja19fbWVudS1pdGVtLS12aXNpYmxlXCIpO1xyXG5cclxuICAgICAgICB2YXIgdmlzaWJsZUltYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcclxuICAgICAgICAgIFwiaW1hZ2UtbWVudS1ibG9ja19faW1hZ2UtLXZpc2libGVcIlxyXG4gICAgICAgIClbMF07XHJcbiAgICAgICAgdmlzaWJsZUltYWdlLmNsYXNzTGlzdC5yZW1vdmUoXCJpbWFnZS1tZW51LWJsb2NrX19pbWFnZS0tdmlzaWJsZVwiKTtcclxuXHJcbiAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoXCJpbWFnZS1tZW51LWJsb2NrX19tZW51LWl0ZW0tLXZpc2libGVcIik7XHJcblxyXG4gICAgICAgIHZhciBpbWFnZSA9IGVsLmRhdGFzZXQuaW1hZ2U7XHJcblxyXG4gICAgICAgIHZhciBpbWFnZUVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxyXG4gICAgICAgICAgXCJpbWFnZS1tZW51LWJsb2NrX19pbWFnZS1cIiArIGltYWdlXHJcbiAgICAgICAgKVswXTtcclxuICAgICAgICBpbWFnZUVsZW0uY2xhc3NMaXN0LmFkZChcImltYWdlLW1lbnUtYmxvY2tfX2ltYWdlLS12aXNpYmxlXCIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgZmFsc2VcclxuKTtcclxuIiwiaWYgKHdpbmRvdy5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHtcclxuXHROb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc0FyZykge1xyXG5cdFx0dGhpc0FyZyA9IHRoaXNBcmcgfHwgd2luZG93XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzW2ldLCBpLCB0aGlzKVxyXG5cdFx0fVxyXG5cdH1cclxufSJdfQ=="}