UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

556 lines (553 loc) 62.7 kB
"use strict"; require("core-js/modules/es.symbol.js"); require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.symbol.iterator.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); Object.defineProperty(exports, "__esModule", { value: true }); exports.TypeMajorite = exports.PositionMajoritaire = exports.ModePublicationDesVotes = exports.LieuVote = exports.LibelleTypeVote = exports.Libelle = exports.Convert = exports.CodeTypeVote = exports.Code = exports.CausePositionVote = void 0; require("core-js/modules/es.symbol.to-primitive.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.array.for-each.js"); require("core-js/modules/es.array.index-of.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.date.to-json.js"); require("core-js/modules/es.date.to-primitive.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.object.get-own-property-names.js"); require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/web.dom-collections.for-each.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // To parse this data: // // import { Convert, Scrutins } from "./file"; // // const scrutins = Convert.toScrutins(json); // // These functions will throw an error if the JSON doesn't // match the expected interface, even if the JSON is valid. var ModePublicationDesVotes = exports.ModePublicationDesVotes = /*#__PURE__*/function (ModePublicationDesVotes) { ModePublicationDesVotes["DecompteDissidentsPositionGroupe"] = "DecompteDissidentsPositionGroupe"; ModePublicationDesVotes["DecompteNominatif"] = "DecompteNominatif"; return ModePublicationDesVotes; }({}); var Code = exports.Code = /*#__PURE__*/function (Code) { Code["Adopt\xE9"] = "adopt\xE9"; Code["Rejet\xE9"] = "rejet\xE9"; return Code; }({}); var Libelle = exports.Libelle = /*#__PURE__*/function (Libelle) { Libelle["LAssembl\xE9eNationaleAAdopt\xE9"] = "l'Assembl\xE9e nationale a adopt\xE9"; Libelle["LAssembl\xE9eNationaleNAPasAdopt\xE9"] = "L'Assembl\xE9e nationale n'a pas adopt\xE9"; Libelle["LeCongr\xE8sDuParlementAAdopt\xE9"] = "Le Congr\xE8s du Parlement a adopt\xE9"; Libelle["LeCongr\xE8sDuParlementNAPasAdopt\xE9"] = "Le Congr\xE8s du Parlement n'a pas adopt\xE9"; return Libelle; }({}); var CodeTypeVote = exports.CodeTypeVote = /*#__PURE__*/function (CodeTypeVote) { CodeTypeVote["Moc"] = "MOC"; CodeTypeVote["Sat"] = "SAT"; CodeTypeVote["Spo"] = "SPO"; CodeTypeVote["Sps"] = "SPS"; CodeTypeVote["Ssg"] = "SSG"; return CodeTypeVote; }({}); var LibelleTypeVote = exports.LibelleTypeVote = /*#__PURE__*/function (LibelleTypeVote) { LibelleTypeVote["MotionDeCensure"] = "motion de censure"; LibelleTypeVote["ScrutinPublicOrdinaire"] = "scrutin public ordinaire"; LibelleTypeVote["ScrutinPublicSolennel"] = "scrutin public solennel"; LibelleTypeVote["Scrutin\xC0LaTribune"] = "scrutin \xE0 la tribune"; LibelleTypeVote["ScrutinSolennelCongr\xE8s"] = "Scrutin solennel congr\xE8s"; return LibelleTypeVote; }({}); var TypeMajorite = exports.TypeMajorite = /*#__PURE__*/function (TypeMajorite) { TypeMajorite["Majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "Majorit\xE9 absolue des suffrages exprim\xE9s"; TypeMajorite["majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "majorit\xE9 absolue des suffrages exprim\xE9s"; TypeMajorite["majorit\xE9DesMembresComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composant l'Assembl\xE9e nationale"; TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9e"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e"; TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e nationale"; TypeMajorite["Majorit\xE9RequisePourUnCongr\xE8s"] = "Majorit\xE9 requise pour un Congr\xE8s"; TypeMajorite["Majorit\xE9RequisePourUneMotionDeCensure"] = "Majorit\xE9 requise pour une motion de censure"; return TypeMajorite; }({}); var CausePositionVote = exports.CausePositionVote = /*#__PURE__*/function (CausePositionVote) { CausePositionVote["Mg"] = "MG"; CausePositionVote["Pan"] = "PAN"; CausePositionVote["Pse"] = "PSE"; return CausePositionVote; }({}); var PositionMajoritaire = exports.PositionMajoritaire = /*#__PURE__*/function (PositionMajoritaire) { PositionMajoritaire["Abstention"] = "abstention"; PositionMajoritaire["Contre"] = "contre"; PositionMajoritaire["Pour"] = "pour"; return PositionMajoritaire; }({}); var LieuVote = exports.LieuVote = /*#__PURE__*/function (LieuVote) { LieuVote["Congr\xE8s"] = "Congr\xE8s"; LieuVote["H\xE9micycle"] = "H\xE9micycle"; LieuVote["Salons"] = "Salons"; return LieuVote; }({}); // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime var Convert = exports.Convert = /*#__PURE__*/function () { function Convert() { _classCallCheck(this, Convert); } return _createClass(Convert, null, [{ key: "toScrutins", value: function toScrutins(json) { return cast(JSON.parse(json), r("Scrutins")); } }, { key: "scrutinsToJson", value: function scrutinsToJson(value) { return JSON.stringify(uncast(value, r("Scrutins")), null, 2); } }, { key: "toScrutin", value: function toScrutin(json) { return cast(JSON.parse(json), r("Scrutin")); } }, { key: "scrutinToJson", value: function scrutinToJson(value) { return JSON.stringify(uncast(value, r("Scrutin")), null, 2); } }]); }(); function invalidValue(typ, val) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; if (key) { throw Error("Invalid value for key \"".concat(key, "\". Expected type ").concat(JSON.stringify(typ), " but got ").concat(JSON.stringify(val))); } throw Error("Invalid value ".concat(JSON.stringify(val), " for type ").concat(JSON.stringify(typ))); } function jsonToJSProps(typ) { if (typ.jsonToJS === undefined) { var map = {}; typ.props.forEach(function (p) { return map[p.json] = { key: p.js, typ: p.typ }; }); typ.jsonToJS = map; } return typ.jsonToJS; } function jsToJSONProps(typ) { if (typ.jsToJSON === undefined) { var map = {}; typ.props.forEach(function (p) { return map[p.js] = { key: p.json, typ: p.typ }; }); typ.jsToJSON = map; } return typ.jsToJSON; } function transform(val, typ, getProps) { var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; function transformPrimitive(typ, val) { if (_typeof(typ) === _typeof(val)) return val; return invalidValue(typ, val, key); } function transformUnion(typs, val) { // val must validate against one typ in typs var l = typs.length; for (var i = 0; i < l; i++) { var _typ = typs[i]; try { return transform(val, _typ, getProps); } catch (_) {} } return invalidValue(typs, val); } function transformEnum(cases, val) { if (cases.indexOf(val) !== -1) return val; return invalidValue(cases, val); } function transformArray(typ, val) { // val must be an array with no invalid elements if (!Array.isArray(val)) return invalidValue("array", val); return val.map(function (el) { return transform(el, typ, getProps); }); } function transformDate(val) { if (val === null) { return null; } var d = new Date(val); if (isNaN(d.valueOf())) { return invalidValue("Date", val); } return d; } function transformObject(props, additional, val) { if (val === null || _typeof(val) !== "object" || Array.isArray(val)) { return invalidValue("object", val); } var result = {}; Object.getOwnPropertyNames(props).forEach(function (key) { var prop = props[key]; var v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; result[prop.key] = transform(v, prop.typ, getProps, prop.key); }); Object.getOwnPropertyNames(val).forEach(function (key) { if (!Object.prototype.hasOwnProperty.call(props, key)) { result[key] = transform(val[key], additional, getProps, key); } }); return result; } if (typ === "any") return val; if (typ === null) { if (val === null) return val; return invalidValue(typ, val); } // if (typ === false) return invalidValue(typ, val) while (_typeof(typ) === "object" && typ.ref !== undefined) { typ = typeMap[typ.ref]; } if (Array.isArray(typ)) return transformEnum(typ, val); if (_typeof(typ) === "object") { return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val); } // Numbers can be parsed by Date but shouldn't be. if (typ === Date && typeof val !== "number") return transformDate(val); return transformPrimitive(typ, val); } function cast(val, typ) { return transform(val, typ, jsonToJSProps); } function uncast(val, typ) { return transform(val, typ, jsToJSONProps); } function a(typ) { return { arrayItems: typ }; } function u() { for (var _len = arguments.length, typs = new Array(_len), _key = 0; _key < _len; _key++) { typs[_key] = arguments[_key]; } return { unionMembers: typs }; } function o(props, additional) { return { props: props, additional: additional }; } // function m(additional: any) { // return { props: [], additional } // } function r(name) { return { ref: name }; } var typeMap = { Scrutins: o([{ json: "scrutins", js: "scrutins", typ: a(r("Scrutin")) }], false), Scrutin: o([{ json: "schemaVersion", js: "schemaVersion", typ: u(undefined, "") }, { json: "uid", js: "uid", typ: "" }, { json: "numero", js: "numero", typ: "" }, { json: "organeRef", js: "organeRef", typ: "" }, { json: "legislature", js: "legislature", typ: "" }, { json: "sessionRef", js: "sessionRef", typ: "" }, { json: "seanceRef", js: "seanceRef", typ: "" }, { json: "dateScrutin", js: "dateScrutin", typ: Date }, { json: "quantiemeJourSeance", js: "quantiemeJourSeance", typ: "" }, { json: "typeVote", js: "typeVote", typ: r("TypeVote") }, { json: "sort", js: "sort", typ: r("SortScrutin") }, { json: "titre", js: "titre", typ: "" }, { json: "demandeur", js: "demandeur", typ: r("Demandeur") }, { json: "objet", js: "objet", typ: r("Objet") }, { json: "modePublicationDesVotes", js: "modePublicationDesVotes", typ: r("ModePublicationDesVotes") }, { json: "syntheseVote", js: "syntheseVote", typ: r("SyntheseVote") }, { json: "ventilationVotes", js: "ventilationVotes", typ: r("VentilationVotes") }, { json: "miseAuPoint", js: "miseAuPoint", typ: u(undefined, r("MiseAuPoint")) }, { json: "lieuVote", js: "lieuVote", typ: u(undefined, r("LieuVote")) }], false), Demandeur: o([{ json: "texte", js: "texte", typ: u(undefined, "") }], false), MiseAuPoint: o([{ json: "nonVotants", js: "nonVotants", typ: u(undefined, a(r("Votant"))) }, { json: "pour", js: "pour", typ: u(undefined, a(r("Votant"))) }, { json: "contre", js: "contre", typ: u(undefined, a(r("Votant"))) }, { json: "abstentions", js: "abstentions", typ: u(undefined, a(r("Votant"))) }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(undefined, a(r("Votant"))) }, { json: "dysfonctionnement", js: "dysfonctionnement", typ: u(undefined, r("Dysfonctionnement")) }], false), Dysfonctionnement: o([{ json: "nonVotants", js: "nonVotants", typ: u(undefined, a(r("Votant"))) }, { json: "pour", js: "pour", typ: u(undefined, a(r("Votant"))) }, { json: "contre", js: "contre", typ: u(undefined, a(r("Votant"))) }, { json: "abstentions", js: "abstentions", typ: u(undefined, a(r("Votant"))) }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(undefined, a(r("Votant"))) }], false), Objet: o([{ json: "libelle", js: "libelle", typ: "" }], false), SortScrutin: o([{ json: "code", js: "code", typ: r("Code") }, { json: "libelle", js: "libelle", typ: r("Libelle") }], false), SyntheseVote: o([{ json: "nombreVotants", js: "nombreVotants", typ: "" }, { json: "suffragesExprimes", js: "suffragesExprimes", typ: "" }, { json: "nbrSuffragesRequis", js: "nbrSuffragesRequis", typ: "" }, { json: "annonce", js: "annonce", typ: r("Libelle") }, { json: "decompte", js: "decompte", typ: r("DecompteVoix") }], false), TypeVote: o([{ json: "codeTypeVote", js: "codeTypeVote", typ: r("CodeTypeVote") }, { json: "libelleTypeVote", js: "libelleTypeVote", typ: r("LibelleTypeVote") }, { json: "typeMajorite", js: "typeMajorite", typ: r("TypeMajorite") }], false), VentilationVotes: o([{ json: "organeRef", js: "organeRef", typ: "" }, { json: "groupes", js: "groupes", typ: a(r("VentilationVotesGroupe")) }], false), VentilationVotesGroupe: o([{ json: "organeRef", js: "organeRef", typ: "" }, { json: "nombreMembresGroupe", js: "nombreMembresGroupe", typ: "" }, { json: "vote", js: "vote", typ: r("Vote") }], false), Vote: o([{ json: "positionMajoritaire", js: "positionMajoritaire", typ: r("PositionMajoritaire") }, { json: "decompteVoix", js: "decompteVoix", typ: r("DecompteVoix") }, { json: "decompteNominatif", js: "decompteNominatif", typ: r("DecompteNominatif") }], false), DecompteNominatif: o([{ json: "nonVotants", js: "nonVotants", typ: u(undefined, a(r("Votant"))) }, { json: "pour", js: "pour", typ: u(undefined, a(r("Votant"))) }, { json: "contre", js: "contre", typ: u(undefined, a(r("Votant"))) }, { json: "abstentions", js: "abstentions", typ: u(undefined, a(r("Votant"))) }], false), Votant: o([{ json: "acteurRef", js: "acteurRef", typ: "" }, { json: "mandatRef", js: "mandatRef", typ: "" }, { json: "parDelegation", js: "parDelegation", typ: u(undefined, false) }, { json: "numPlace", js: "numPlace", typ: u(undefined, 0) }, { json: "causePositionVote", js: "causePositionVote", typ: u(undefined, r("CausePositionVote")) }], false), DecompteVoix: o([{ json: "pour", js: "pour", typ: "" }, { json: "contre", js: "contre", typ: "" }, { json: "nonVotants", js: "nonVotants", typ: u(undefined, "") }, { json: "abstentions", js: "abstentions", typ: u(undefined, "") }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(undefined, "") }], false), ModePublicationDesVotes: ["DecompteDissidentsPositionGroupe", "DecompteNominatif"], Code: ["adopté", "rejeté"], Libelle: ["l'Assemblée nationale a adopté", "L'Assemblée nationale n'a pas adopté", "Le Congrès du Parlement a adopté", "Le Congrès du Parlement n'a pas adopté"], CodeTypeVote: ["MOC", "SAT", "SPO", "SPS", "SSG"], LibelleTypeVote: ["motion de censure", "scrutin public ordinaire", "scrutin public solennel", "scrutin à la tribune", "Scrutin solennel congrès"], TypeMajorite: ["Majorité absolue des suffrages exprimés", "majorité absolue des suffrages exprimés", "majorité des membres composant l'Assemblée nationale", "majorité des membres composants composant l'Assemblée", "majorité des membres composants composant l'Assemblée nationale", "Majorité requise pour un Congrès", "Majorité requise pour une motion de censure"], CausePositionVote: ["MG", "PAN", "PSE"], PositionMajoritaire: ["abstention", "contre", "pour"], LieuVote: ["Congrès", "Hémicycle", "Salons"] }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlUHVibGljYXRpb25EZXNWb3RlcyIsImV4cG9ydHMiLCJDb2RlIiwiTGliZWxsZSIsIkNvZGVUeXBlVm90ZSIsIkxpYmVsbGVUeXBlVm90ZSIsIlR5cGVNYWpvcml0ZSIsIkNhdXNlUG9zaXRpb25Wb3RlIiwiUG9zaXRpb25NYWpvcml0YWlyZSIsIkxpZXVWb3RlIiwiQ29udmVydCIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwidG9TY3J1dGlucyIsImpzb24iLCJjYXN0IiwiSlNPTiIsInBhcnNlIiwiciIsInNjcnV0aW5zVG9Kc29uIiwic3RyaW5naWZ5IiwidW5jYXN0IiwidG9TY3J1dGluIiwic2NydXRpblRvSnNvbiIsImludmFsaWRWYWx1ZSIsInR5cCIsInZhbCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIkVycm9yIiwiY29uY2F0IiwianNvblRvSlNQcm9wcyIsImpzb25Ub0pTIiwibWFwIiwicHJvcHMiLCJmb3JFYWNoIiwicCIsImpzIiwianNUb0pTT05Qcm9wcyIsImpzVG9KU09OIiwidHJhbnNmb3JtIiwiZ2V0UHJvcHMiLCJ0cmFuc2Zvcm1QcmltaXRpdmUiLCJfdHlwZW9mIiwidHJhbnNmb3JtVW5pb24iLCJ0eXBzIiwibCIsImkiLCJfIiwidHJhbnNmb3JtRW51bSIsImNhc2VzIiwiaW5kZXhPZiIsInRyYW5zZm9ybUFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZWwiLCJ0cmFuc2Zvcm1EYXRlIiwiZCIsIkRhdGUiLCJpc05hTiIsInZhbHVlT2YiLCJ0cmFuc2Zvcm1PYmplY3QiLCJhZGRpdGlvbmFsIiwicmVzdWx0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJ2IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVmIiwidHlwZU1hcCIsInVuaW9uTWVtYmVycyIsImFycmF5SXRlbXMiLCJhIiwidSIsIl9sZW4iLCJfa2V5IiwibyIsIm5hbWUiLCJTY3J1dGlucyIsIlNjcnV0aW4iLCJEZW1hbmRldXIiLCJNaXNlQXVQb2ludCIsIkR5c2ZvbmN0aW9ubmVtZW50IiwiT2JqZXQiLCJTb3J0U2NydXRpbiIsIlN5bnRoZXNlVm90ZSIsIlR5cGVWb3RlIiwiVmVudGlsYXRpb25Wb3RlcyIsIlZlbnRpbGF0aW9uVm90ZXNHcm91cGUiLCJWb3RlIiwiRGVjb21wdGVOb21pbmF0aWYiLCJWb3RhbnQiLCJEZWNvbXB0ZVZvaXgiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvc2NydXRpbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG8gcGFyc2UgdGhpcyBkYXRhOlxuLy9cbi8vICAgaW1wb3J0IHsgQ29udmVydCwgU2NydXRpbnMgfSBmcm9tIFwiLi9maWxlXCI7XG4vL1xuLy8gICBjb25zdCBzY3J1dGlucyA9IENvbnZlcnQudG9TY3J1dGlucyhqc29uKTtcbi8vXG4vLyBUaGVzZSBmdW5jdGlvbnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgSlNPTiBkb2Vzbid0XG4vLyBtYXRjaCB0aGUgZXhwZWN0ZWQgaW50ZXJmYWNlLCBldmVuIGlmIHRoZSBKU09OIGlzIHZhbGlkLlxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcnV0aW5zIHtcbiAgc2NydXRpbnM6IFNjcnV0aW5bXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcnV0aW4ge1xuICBzY2hlbWFWZXJzaW9uPzogc3RyaW5nXG4gIHVpZDogc3RyaW5nXG4gIG51bWVybzogc3RyaW5nXG4gIG9yZ2FuZVJlZjogc3RyaW5nXG4gIGxlZ2lzbGF0dXJlOiBzdHJpbmdcbiAgc2Vzc2lvblJlZjogc3RyaW5nXG4gIHNlYW5jZVJlZjogc3RyaW5nXG4gIGRhdGVTY3J1dGluOiBEYXRlXG4gIHF1YW50aWVtZUpvdXJTZWFuY2U6IHN0cmluZ1xuICB0eXBlVm90ZTogVHlwZVZvdGVcbiAgc29ydDogU29ydFNjcnV0aW5cbiAgdGl0cmU6IHN0cmluZ1xuICBkZW1hbmRldXI6IERlbWFuZGV1clxuICBvYmpldDogT2JqZXRcbiAgbW9kZVB1YmxpY2F0aW9uRGVzVm90ZXM6IE1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzXG4gIHN5bnRoZXNlVm90ZTogU3ludGhlc2VWb3RlXG4gIHZlbnRpbGF0aW9uVm90ZXM6IFZlbnRpbGF0aW9uVm90ZXNcbiAgbWlzZUF1UG9pbnQ/OiBNaXNlQXVQb2ludFxuICBsaWV1Vm90ZT86IExpZXVWb3RlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyIHtcbiAgdGV4dGU/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaXNlQXVQb2ludCB7XG4gIG5vblZvdGFudHM/OiBWb3RhbnRbXVxuICBwb3VyPzogVm90YW50W11cbiAgY29udHJlPzogVm90YW50W11cbiAgYWJzdGVudGlvbnM/OiBWb3RhbnRbXVxuICBub25Wb3RhbnRzVm9sb250YWlyZXM/OiBWb3RhbnRbXVxuICBkeXNmb25jdGlvbm5lbWVudD86IER5c2ZvbmN0aW9ubmVtZW50XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHlzZm9uY3Rpb25uZW1lbnQge1xuICBub25Wb3RhbnRzPzogVm90YW50W11cbiAgcG91cj86IFZvdGFudFtdXG4gIGNvbnRyZT86IFZvdGFudFtdXG4gIGFic3RlbnRpb25zPzogVm90YW50W11cbiAgbm9uVm90YW50c1ZvbG9udGFpcmVzPzogVm90YW50W11cbn1cblxuZXhwb3J0IGVudW0gTW9kZVB1YmxpY2F0aW9uRGVzVm90ZXMge1xuICBEZWNvbXB0ZURpc3NpZGVudHNQb3NpdGlvbkdyb3VwZSA9IFwiRGVjb21wdGVEaXNzaWRlbnRzUG9zaXRpb25Hcm91cGVcIixcbiAgRGVjb21wdGVOb21pbmF0aWYgPSBcIkRlY29tcHRlTm9taW5hdGlmXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZXQge1xuICBsaWJlbGxlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3J0U2NydXRpbiB7XG4gIGNvZGU6IENvZGVcbiAgbGliZWxsZTogTGliZWxsZVxufVxuXG5leHBvcnQgZW51bSBDb2RlIHtcbiAgQWRvcHTDqSA9IFwiYWRvcHTDqVwiLFxuICBSZWpldMOpID0gXCJyZWpldMOpXCIsXG59XG5cbmV4cG9ydCBlbnVtIExpYmVsbGUge1xuICBMQXNzZW1ibMOpZU5hdGlvbmFsZUFBZG9wdMOpID0gXCJsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlIGEgYWRvcHTDqVwiLFxuICBMQXNzZW1ibMOpZU5hdGlvbmFsZU5BUGFzQWRvcHTDqSA9IFwiTCdBc3NlbWJsw6llIG5hdGlvbmFsZSBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgTGVDb25ncsOoc0R1UGFybGVtZW50QUFkb3B0w6kgPSBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBhIGFkb3B0w6lcIixcbiAgTGVDb25ncsOoc0R1UGFybGVtZW50TkFQYXNBZG9wdMOpID0gXCJMZSBDb25ncsOocyBkdSBQYXJsZW1lbnQgbidhIHBhcyBhZG9wdMOpXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2VWb3RlIHtcbiAgbm9tYnJlVm90YW50czogc3RyaW5nXG4gIHN1ZmZyYWdlc0V4cHJpbWVzOiBzdHJpbmdcbiAgbmJyU3VmZnJhZ2VzUmVxdWlzOiBzdHJpbmdcbiAgYW5ub25jZTogTGliZWxsZVxuICBkZWNvbXB0ZTogRGVjb21wdGVWb2l4XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVZvdGUge1xuICBjb2RlVHlwZVZvdGU6IENvZGVUeXBlVm90ZVxuICBsaWJlbGxlVHlwZVZvdGU6IExpYmVsbGVUeXBlVm90ZVxuICB0eXBlTWFqb3JpdGU6IFR5cGVNYWpvcml0ZVxufVxuXG5leHBvcnQgZW51bSBDb2RlVHlwZVZvdGUge1xuICBNb2MgPSBcIk1PQ1wiLFxuICBTYXQgPSBcIlNBVFwiLFxuICBTcG8gPSBcIlNQT1wiLFxuICBTcHMgPSBcIlNQU1wiLFxuICBTc2cgPSBcIlNTR1wiLFxufVxuXG5leHBvcnQgZW51bSBMaWJlbGxlVHlwZVZvdGUge1xuICBNb3Rpb25EZUNlbnN1cmUgPSBcIm1vdGlvbiBkZSBjZW5zdXJlXCIsXG4gIFNjcnV0aW5QdWJsaWNPcmRpbmFpcmUgPSBcInNjcnV0aW4gcHVibGljIG9yZGluYWlyZVwiLFxuICBTY3J1dGluUHVibGljU29sZW5uZWwgPSBcInNjcnV0aW4gcHVibGljIHNvbGVubmVsXCIsXG4gIFNjcnV0aW7DgExhVHJpYnVuZSA9IFwic2NydXRpbiDDoCBsYSB0cmlidW5lXCIsXG4gIFNjcnV0aW5Tb2xlbm5lbENvbmdyw6hzID0gXCJTY3J1dGluIHNvbGVubmVsIGNvbmdyw6hzXCIsXG59XG5cbmV4cG9ydCBlbnVtIFR5cGVNYWpvcml0ZSB7XG4gIE1ham9yaXTDqUFic29sdWVEZXNTdWZmcmFnZXNFeHByaW3DqXMgPSBcIk1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gIG1ham9yaXTDqUFic29sdWVEZXNTdWZmcmFnZXNFeHByaW3DqXMgPSBcIm1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gIG1ham9yaXTDqURlc01lbWJyZXNDb21wb3NhbnRMQXNzZW1ibMOpZU5hdGlvbmFsZSA9IFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCIsXG4gIG1ham9yaXTDqURlc01lbWJyZXNDb21wb3NhbnRzQ29tcG9zYW50TEFzc2VtYmzDqWUgPSBcIm1ham9yaXTDqSBkZXMgbWVtYnJlcyBjb21wb3NhbnRzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWVcIixcbiAgbWFqb3JpdMOpRGVzTWVtYnJlc0NvbXBvc2FudHNDb21wb3NhbnRMQXNzZW1ibMOpZU5hdGlvbmFsZSA9IFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudHMgY29tcG9zYW50IGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIixcbiAgTWFqb3JpdMOpUmVxdWlzZVBvdXJVbkNvbmdyw6hzID0gXCJNYWpvcml0w6kgcmVxdWlzZSBwb3VyIHVuIENvbmdyw6hzXCIsXG4gIE1ham9yaXTDqVJlcXVpc2VQb3VyVW5lTW90aW9uRGVDZW5zdXJlID0gXCJNYWpvcml0w6kgcmVxdWlzZSBwb3VyIHVuZSBtb3Rpb24gZGUgY2Vuc3VyZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlbnRpbGF0aW9uVm90ZXMge1xuICBvcmdhbmVSZWY6IHN0cmluZ1xuICBncm91cGVzOiBWZW50aWxhdGlvblZvdGVzR3JvdXBlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZW50aWxhdGlvblZvdGVzR3JvdXBlIHtcbiAgb3JnYW5lUmVmOiBzdHJpbmdcbiAgbm9tYnJlTWVtYnJlc0dyb3VwZTogc3RyaW5nXG4gIHZvdGU6IFZvdGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb3RlIHtcbiAgcG9zaXRpb25NYWpvcml0YWlyZTogUG9zaXRpb25NYWpvcml0YWlyZVxuICBkZWNvbXB0ZVZvaXg6IERlY29tcHRlVm9peFxuICBkZWNvbXB0ZU5vbWluYXRpZjogRGVjb21wdGVOb21pbmF0aWZcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNvbXB0ZU5vbWluYXRpZiB7XG4gIG5vblZvdGFudHM/OiBWb3RhbnRbXVxuICBwb3VyPzogVm90YW50W11cbiAgY29udHJlPzogVm90YW50W11cbiAgYWJzdGVudGlvbnM/OiBWb3RhbnRbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvdGFudCB7XG4gIGFjdGV1clJlZjogc3RyaW5nXG4gIG1hbmRhdFJlZjogc3RyaW5nXG4gIHBhckRlbGVnYXRpb24/OiBib29sZWFuXG4gIG51bVBsYWNlPzogbnVtYmVyXG4gIGNhdXNlUG9zaXRpb25Wb3RlPzogQ2F1c2VQb3NpdGlvblZvdGVcbn1cblxuZXhwb3J0IGVudW0gQ2F1c2VQb3NpdGlvblZvdGUge1xuICBNZyA9IFwiTUdcIixcbiAgUGFuID0gXCJQQU5cIixcbiAgUHNlID0gXCJQU0VcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWNvbXB0ZVZvaXgge1xuICBwb3VyOiBzdHJpbmdcbiAgY29udHJlOiBzdHJpbmdcbiAgbm9uVm90YW50cz86IHN0cmluZ1xuICBhYnN0ZW50aW9ucz86IHN0cmluZ1xuICBub25Wb3RhbnRzVm9sb250YWlyZXM/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGVudW0gUG9zaXRpb25NYWpvcml0YWlyZSB7XG4gIEFic3RlbnRpb24gPSBcImFic3RlbnRpb25cIixcbiAgQ29udHJlID0gXCJjb250cmVcIixcbiAgUG91ciA9IFwicG91clwiLFxufVxuXG5leHBvcnQgZW51bSBMaWV1Vm90ZSB7XG4gIENvbmdyw6hzID0gXCJDb25ncsOoc1wiLFxuICBIw6ltaWN5Y2xlID0gXCJIw6ltaWN5Y2xlXCIsXG4gIFNhbG9ucyA9IFwiU2Fsb25zXCIsXG59XG5cbi8vIENvbnZlcnRzIEpTT04gc3RyaW5ncyB0by9mcm9tIHlvdXIgdHlwZXNcbi8vIGFuZCBhc3NlcnRzIHRoZSByZXN1bHRzIG9mIEpTT04ucGFyc2UgYXQgcnVudGltZVxuZXhwb3J0IGNsYXNzIENvbnZlcnQge1xuICBwdWJsaWMgc3RhdGljIHRvU2NydXRpbnMoanNvbjogc3RyaW5nKTogU2NydXRpbnMge1xuICAgIHJldHVybiBjYXN0KEpTT04ucGFyc2UoanNvbiksIHIoXCJTY3J1dGluc1wiKSlcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2NydXRpbnNUb0pzb24odmFsdWU6IFNjcnV0aW5zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodW5jYXN0KHZhbHVlLCByKFwiU2NydXRpbnNcIikpLCBudWxsLCAyKVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1NjcnV0aW4oanNvbjogc3RyaW5nKTogU2NydXRpbiB7XG4gICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIlNjcnV0aW5cIikpXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNjcnV0aW5Ub0pzb24odmFsdWU6IFNjcnV0aW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJTY3J1dGluXCIpKSwgbnVsbCwgMilcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkVmFsdWUodHlwOiBhbnksIHZhbDogYW55LCBrZXk6IGFueSA9IFwiXCIpOiBuZXZlciB7XG4gIGlmIChrZXkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgdHlwZSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICB0eXAsXG4gICAgICApfSBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsKX1gLFxuICAgIClcbiAgfVxuICB0aHJvdyBFcnJvcihcbiAgICBgSW52YWxpZCB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGZvciB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX1gLFxuICApXG59XG5cbmZ1bmN0aW9uIGpzb25Ub0pTUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICBpZiAodHlwLmpzb25Ub0pTID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYXA6IGFueSA9IHt9XG4gICAgdHlwLnByb3BzLmZvckVhY2goKHA6IGFueSkgPT4gKG1hcFtwLmpzb25dID0geyBrZXk6IHAuanMsIHR5cDogcC50eXAgfSkpXG4gICAgdHlwLmpzb25Ub0pTID0gbWFwXG4gIH1cbiAgcmV0dXJuIHR5cC5qc29uVG9KU1xufVxuXG5mdW5jdGlvbiBqc1RvSlNPTlByb3BzKHR5cDogYW55KTogYW55IHtcbiAgaWYgKHR5cC5qc1RvSlNPTiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWFwOiBhbnkgPSB7fVxuICAgIHR5cC5wcm9wcy5mb3JFYWNoKChwOiBhbnkpID0+IChtYXBbcC5qc10gPSB7IGtleTogcC5qc29uLCB0eXA6IHAudHlwIH0pKVxuICAgIHR5cC5qc1RvSlNPTiA9IG1hcFxuICB9XG4gIHJldHVybiB0eXAuanNUb0pTT05cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtKHZhbDogYW55LCB0eXA6IGFueSwgZ2V0UHJvcHM6IGFueSwga2V5OiBhbnkgPSBcIlwiKTogYW55IHtcbiAgZnVuY3Rpb24gdHJhbnNmb3JtUHJpbWl0aXZlKHR5cDogc3RyaW5nLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiB0eXAgPT09IHR5cGVvZiB2YWwpIHJldHVybiB2YWxcbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsLCBrZXkpXG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1Vbmlvbih0eXBzOiBhbnlbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgIC8vIHZhbCBtdXN0IHZhbGlkYXRlIGFnYWluc3Qgb25lIHR5cCBpbiB0eXBzXG4gICAgY29uc3QgbCA9IHR5cHMubGVuZ3RoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IHR5cCA9IHR5cHNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGdldFByb3BzKVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gICAgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXBzLCB2YWwpXG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1FbnVtKGNhc2VzOiBzdHJpbmdbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgIGlmIChjYXNlcy5pbmRleE9mKHZhbCkgIT09IC0xKSByZXR1cm4gdmFsXG4gICAgcmV0dXJuIGludmFsaWRWYWx1ZShjYXNlcywgdmFsKVxuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtQXJyYXkodHlwOiBhbnksIHZhbDogYW55KTogYW55IHtcbiAgICAvLyB2YWwgbXVzdCBiZSBhbiBhcnJheSB3aXRoIG5vIGludmFsaWQgZWxlbWVudHNcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGludmFsaWRWYWx1ZShcImFycmF5XCIsIHZhbClcbiAgICByZXR1cm4gdmFsLm1hcCgoZWwpID0+IHRyYW5zZm9ybShlbCwgdHlwLCBnZXRQcm9wcykpXG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBjb25zdCBkID0gbmV3IERhdGUodmFsKVxuICAgIGlmIChpc05hTihkLnZhbHVlT2YoKSkpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJEYXRlXCIsIHZhbClcbiAgICB9XG4gICAgcmV0dXJuIGRcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdChcbiAgICBwcm9wczogeyBbazogc3RyaW5nXTogYW55IH0sXG4gICAgYWRkaXRpb25hbDogYW55LFxuICAgIHZhbDogYW55LFxuICApOiBhbnkge1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJvYmplY3RcIiwgdmFsKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2tleV1cbiAgICAgIGNvbnN0IHYgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpXG4gICAgICAgID8gdmFsW2tleV1cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJlc3VsdFtwcm9wLmtleV0gPSB0cmFuc2Zvcm0odiwgcHJvcC50eXAsIGdldFByb3BzLCBwcm9wLmtleSlcbiAgICB9KVxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRyYW5zZm9ybSh2YWxba2V5XSwgYWRkaXRpb25hbCwgZ2V0UHJvcHMsIGtleSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGlmICh0eXAgPT09IFwiYW55XCIpIHJldHVybiB2YWxcbiAgaWYgKHR5cCA9PT0gbnVsbCkge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB2YWxcbiAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsKVxuICB9XG4gIC8vIGlmICh0eXAgPT09IGZhbHNlKSByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsKVxuICB3aGlsZSAodHlwZW9mIHR5cCA9PT0gXCJvYmplY3RcIiAmJiB0eXAucmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB0eXAgPSB0eXBlTWFwW3R5cC5yZWZdXG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwKSkgcmV0dXJuIHRyYW5zZm9ybUVudW0odHlwLCB2YWwpXG4gIGlmICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHR5cC5oYXNPd25Qcm9wZXJ0eShcInVuaW9uTWVtYmVyc1wiKVxuICAgICAgPyB0cmFuc2Zvcm1Vbmlvbih0eXAudW5pb25NZW1iZXJzLCB2YWwpXG4gICAgICA6IHR5cC5oYXNPd25Qcm9wZXJ0eShcImFycmF5SXRlbXNcIilcbiAgICAgICAgPyB0cmFuc2Zvcm1BcnJheSh0eXAuYXJyYXlJdGVtcywgdmFsKVxuICAgICAgICA6IHR5cC5oYXNPd25Qcm9wZXJ0eShcInByb3BzXCIpXG4gICAgICAgICAgPyB0cmFuc2Zvcm1PYmplY3QoZ2V0UHJvcHModHlwKSwgdHlwLmFkZGl0aW9uYWwsIHZhbClcbiAgICAgICAgICA6IGludmFsaWRWYWx1ZSh0eXAsIHZhbClcbiAgfVxuICAvLyBOdW1iZXJzIGNhbiBiZSBwYXJzZWQgYnkgRGF0ZSBidXQgc2hvdWxkbid0IGJlLlxuICBpZiAodHlwID09PSBEYXRlICYmIHR5cGVvZiB2YWwgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cmFuc2Zvcm1EYXRlKHZhbClcbiAgcmV0dXJuIHRyYW5zZm9ybVByaW1pdGl2ZSh0eXAsIHZhbClcbn1cblxuZnVuY3Rpb24gY2FzdDxUPih2YWw6IGFueSwgdHlwOiBhbnkpOiBUIHtcbiAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwganNvblRvSlNQcm9wcylcbn1cblxuZnVuY3Rpb24gdW5jYXN0PFQ+KHZhbDogVCwgdHlwOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc1RvSlNPTlByb3BzKVxufVxuXG5mdW5jdGlvbiBhKHR5cDogYW55KSB7XG4gIHJldHVybiB7IGFycmF5SXRlbXM6IHR5cCB9XG59XG5cbmZ1bmN0aW9uIHUoLi4udHlwczogYW55W10pIHtcbiAgcmV0dXJuIHsgdW5pb25NZW1iZXJzOiB0eXBzIH1cbn1cblxuZnVuY3Rpb24gbyhwcm9wczogYW55W10sIGFkZGl0aW9uYWw6IGFueSkge1xuICByZXR1cm4geyBwcm9wcywgYWRkaXRpb25hbCB9XG59XG5cbi8vIGZ1bmN0aW9uIG0oYWRkaXRpb25hbDogYW55KSB7XG4vLyAgIHJldHVybiB7IHByb3BzOiBbXSwgYWRkaXRpb25hbCB9XG4vLyB9XG5cbmZ1bmN0aW9uIHIobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiB7IHJlZjogbmFtZSB9XG59XG5cbmNvbnN0IHR5cGVNYXA6IGFueSA9IHtcbiAgU2NydXRpbnM6IG8oXG4gICAgW3sganNvbjogXCJzY3J1dGluc1wiLCBqczogXCJzY3J1dGluc1wiLCB0eXA6IGEocihcIlNjcnV0aW5cIikpIH1dLFxuICAgIGZhbHNlLFxuICApLFxuICBTY3J1dGluOiBvKFxuICAgIFtcbiAgICAgIHsganNvbjogXCJzY2hlbWFWZXJzaW9uXCIsIGpzOiBcInNjaGVtYVZlcnNpb25cIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICAgIHsganNvbjogXCJ1aWRcIiwganM6IFwidWlkXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcIm51bWVyb1wiLCBqczogXCJudW1lcm9cIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwib3JnYW5lUmVmXCIsIGpzOiBcIm9yZ2FuZVJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJsZWdpc2xhdHVyZVwiLCBqczogXCJsZWdpc2xhdHVyZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJzZXNzaW9uUmVmXCIsIGpzOiBcInNlc3Npb25SZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwic2VhbmNlUmVmXCIsIGpzOiBcInNlYW5jZVJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJkYXRlU2NydXRpblwiLCBqczogXCJkYXRlU2NydXRpblwiLCB0eXA6IERhdGUgfSxcbiAgICAgIHsganNvbjogXCJxdWFudGllbWVKb3VyU2VhbmNlXCIsIGpzOiBcInF1YW50aWVtZUpvdXJTZWFuY2VcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwidHlwZVZvdGVcIiwganM6IFwidHlwZVZvdGVcIiwgdHlwOiByKFwiVHlwZVZvdGVcIikgfSxcbiAgICAgIHsganNvbjogXCJzb3J0XCIsIGpzOiBcInNvcnRcIiwgdHlwOiByKFwiU29ydFNjcnV0aW5cIikgfSxcbiAgICAgIHsganNvbjogXCJ0aXRyZVwiLCBqczogXCJ0aXRyZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJkZW1hbmRldXJcIiwganM6IFwiZGVtYW5kZXVyXCIsIHR5cDogcihcIkRlbWFuZGV1clwiKSB9LFxuICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogcihcIk9iamV0XCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwibW9kZVB1YmxpY2F0aW9uRGVzVm90ZXNcIixcbiAgICAgICAganM6IFwibW9kZVB1YmxpY2F0aW9uRGVzVm90ZXNcIixcbiAgICAgICAgdHlwOiByKFwiTW9kZVB1YmxpY2F0aW9uRGVzVm90ZXNcIiksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInN5bnRoZXNlVm90ZVwiLCBqczogXCJzeW50aGVzZVZvdGVcIiwgdHlwOiByKFwiU3ludGhlc2VWb3RlXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwidmVudGlsYXRpb25Wb3Rlc1wiLFxuICAgICAgICBqczogXCJ2ZW50aWxhdGlvblZvdGVzXCIsXG4gICAgICAgIHR5cDogcihcIlZlbnRpbGF0aW9uVm90ZXNcIiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcIm1pc2VBdVBvaW50XCIsXG4gICAgICAgIGpzOiBcIm1pc2VBdVBvaW50XCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIHIoXCJNaXNlQXVQb2ludFwiKSksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcImxpZXVWb3RlXCIsIGpzOiBcImxpZXVWb3RlXCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJMaWV1Vm90ZVwiKSkgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBEZW1hbmRldXI6IG8oW3sganNvbjogXCJ0ZXh0ZVwiLCBqczogXCJ0ZXh0ZVwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9XSwgZmFsc2UpLFxuICBNaXNlQXVQb2ludDogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwibm9uVm90YW50c1wiLFxuICAgICAgICBqczogXCJub25Wb3RhbnRzXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwb3VyXCIsXG4gICAgICAgIGpzOiBcInBvdXJcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImNvbnRyZVwiLFxuICAgICAgICBqczogXCJjb250cmVcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImFic3RlbnRpb25zXCIsXG4gICAgICAgIGpzOiBcImFic3RlbnRpb25zXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIixcbiAgICAgICAganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJkeXNmb25jdGlvbm5lbWVudFwiLFxuICAgICAgICBqczogXCJkeXNmb25jdGlvbm5lbWVudFwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCByKFwiRHlzZm9uY3Rpb25uZW1lbnRcIikpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBEeXNmb25jdGlvbm5lbWVudDogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwibm9uVm90YW50c1wiLFxuICAgICAgICBqczogXCJub25Wb3RhbnRzXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJwb3VyXCIsXG4gICAgICAgIGpzOiBcInBvdXJcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImNvbnRyZVwiLFxuICAgICAgICBqczogXCJjb250cmVcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImFic3RlbnRpb25zXCIsXG4gICAgICAgIGpzOiBcImFic3RlbnRpb25zXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIixcbiAgICAgICAganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIGEocihcIlZvdGFudFwiKSkpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBPYmpldDogbyhbeyBqc29uOiBcImxpYmVsbGVcIiwganM6IFwibGliZWxsZVwiLCB0eXA6IFwiXCIgfV0sIGZhbHNlKSxcbiAgU29ydFNjcnV0aW46IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcImNvZGVcIiwganM6IFwiY29kZVwiLCB0eXA6IHIoXCJDb2RlXCIpIH0sXG4gICAgICB7IGpzb246IFwibGliZWxsZVwiLCBqczogXCJsaWJlbGxlXCIsIHR5cDogcihcIkxpYmVsbGVcIikgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBTeW50aGVzZVZvdGU6IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcIm5vbWJyZVZvdGFudHNcIiwganM6IFwibm9tYnJlVm90YW50c1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJzdWZmcmFnZXNFeHByaW1lc1wiLCBqczogXCJzdWZmcmFnZXNFeHByaW1lc1wiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJuYnJTdWZmcmFnZXNSZXF1aXNcIiwganM6IFwibmJyU3VmZnJhZ2VzUmVxdWlzXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcImFubm9uY2VcIiwganM6IFwiYW5ub25jZVwiLCB0eXA6IHIoXCJMaWJlbGxlXCIpIH0sXG4gICAgICB7IGpzb246IFwiZGVjb21wdGVcIiwganM6IFwiZGVjb21wdGVcIiwgdHlwOiByKFwiRGVjb21wdGVWb2l4XCIpIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgVHlwZVZvdGU6IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcImNvZGVUeXBlVm90ZVwiLCBqczogXCJjb2RlVHlwZVZvdGVcIiwgdHlwOiByKFwiQ29kZVR5cGVWb3RlXCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwibGliZWxsZVR5cGVWb3RlXCIsXG4gICAgICAgIGpzOiBcImxpYmVsbGVUeXBlVm90ZVwiLFxuICAgICAgICB0eXA6IHIoXCJMaWJlbGxlVHlwZVZvdGVcIiksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcInR5cGVNYWpvcml0ZVwiLCBqczogXCJ0eXBlTWFqb3JpdGVcIiwgdHlwOiByKFwiVHlwZU1ham9yaXRlXCIpIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgVmVudGlsYXRpb25Wb3RlczogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwib3JnYW5lUmVmXCIsIGpzOiBcIm9yZ2FuZVJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJncm91cGVzXCIsIGpzOiBcImdyb3VwZXNcIiwgdHlwOiBhKHIoXCJWZW50aWxhdGlvblZvdGVzR3JvdXBlXCIpKSB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFZlbnRpbGF0aW9uVm90ZXNHcm91cGU6IG8oXG4gICAgW1xuICAgICAgeyBqc29uOiBcIm9yZ2FuZVJlZlwiLCBqczogXCJvcmdhbmVSZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwibm9tYnJlTWVtYnJlc0dyb3VwZVwiLCBqczogXCJub21icmVNZW1icmVzR3JvdXBlXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcInZvdGVcIiwganM6IFwidm90ZVwiLCB0eXA6IHIoXCJWb3RlXCIpIH0sXG4gICAgXSxcbiAgICBmYWxzZSxcbiAgKSxcbiAgVm90ZTogbyhcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGpzb246IFwicG9zaXRpb25NYWpvcml0YWlyZVwiLFxuICAgICAgICBqczogXCJwb3NpdGlvbk1ham9yaXRhaXJlXCIsXG4gICAgICAgIHR5cDogcihcIlBvc2l0aW9uTWFqb3JpdGFpcmVcIiksXG4gICAgICB9LFxuICAgICAgeyBqc29uOiBcImRlY29tcHRlVm9peFwiLCBqczogXCJkZWNvbXB0ZVZvaXhcIiwgdHlwOiByKFwiRGVjb21wdGVWb2l4XCIpIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiZGVjb21wdGVOb21pbmF0aWZcIixcbiAgICAgICAganM6IFwiZGVjb21wdGVOb21pbmF0aWZcIixcbiAgICAgICAgdHlwOiByKFwiRGVjb21wdGVOb21pbmF0aWZcIiksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlY29tcHRlTm9taW5hdGlmOiBvKFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJub25Wb3RhbnRzXCIsXG4gICAgICAgIGpzOiBcIm5vblZvdGFudHNcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcInBvdXJcIixcbiAgICAgICAganM6IFwicG91clwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJWb3RhbnRcIikpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiY29udHJlXCIsXG4gICAgICAgIGpzOiBcImNvbnRyZVwiLFxuICAgICAgICB0eXA6IHUodW5kZWZpbmVkLCBhKHIoXCJWb3RhbnRcIikpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGpzb246IFwiYWJzdGVudGlvbnNcIixcbiAgICAgICAganM6IFwiYWJzdGVudGlvbnNcIixcbiAgICAgICAgdHlwOiB1KHVuZGVmaW5lZCwgYShyKFwiVm90YW50XCIpKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIFZvdGFudDogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwiYWN0ZXVyUmVmXCIsIGpzOiBcImFjdGV1clJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgIHsganNvbjogXCJtYW5kYXRSZWZcIiwganM6IFwibWFuZGF0UmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcInBhckRlbGVnYXRpb25cIiwganM6IFwicGFyRGVsZWdhdGlvblwiLCB0eXA6IHUodW5kZWZpbmVkLCBmYWxzZSkgfSxcbiAgICAgIHsganNvbjogXCJudW1QbGFjZVwiLCBqczogXCJudW1QbGFjZVwiLCB0eXA6IHUodW5kZWZpbmVkLCAwKSB9LFxuICAgICAge1xuICAgICAgICBqc29uOiBcImNhdXNlUG9zaXRpb25Wb3RlXCIsXG4gICAgICAgIGpzOiBcImNhdXNlUG9zaXRpb25Wb3RlXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIHIoXCJDYXVzZVBvc2l0aW9uVm90ZVwiKSksXG4gICAgICB9LFxuICAgIF0sXG4gICAgZmFsc2UsXG4gICksXG4gIERlY29tcHRlVm9peDogbyhcbiAgICBbXG4gICAgICB7IGpzb246IFwicG91clwiLCBqczogXCJwb3VyXCIsIHR5cDogXCJcIiB9LFxuICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICB7IGpzb246IFwibm9uVm90YW50c1wiLCBqczogXCJub25Wb3RhbnRzXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICB7IGpzb246IFwiYWJzdGVudGlvbnNcIiwganM6IFwiYWJzdGVudGlvbnNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICAgIHtcbiAgICAgICAganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIixcbiAgICAgICAganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsXG4gICAgICAgIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGZhbHNlLFxuICApLFxuICBNb2RlUHVibGljYXRpb25EZXNWb3RlczogW1xuICAgIFwiRGVjb21wdGVEaXNzaWRlbnRzUG9zaXRpb25Hcm91cGVcIixcbiAgICBcIkRlY29tcHRlTm9taW5hdGlmXCIsXG4gIF0sXG4gIENvZGU6IFtcImFkb3B0w6lcIiwgXCJyZWpldMOpXCJdLFxuICBMaWJlbGxlOiBbXG4gICAgXCJsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlIGEgYWRvcHTDqVwiLFxuICAgIFwiTCdBc3NlbWJsw6llIG5hdGlvbmFsZSBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgICBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBhIGFkb3B0w6lcIixcbiAgICBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgXSxcbiAgQ29kZVR5cGVWb3RlOiBbXCJNT0NcIiwgXCJTQVRcIiwgXCJTUE9cIiwgXCJTUFNcIiwgXCJTU0dcIl0sXG4gIExpYmVsbGVUeXBlVm90ZTogW1xuICAgIFwibW90aW9uIGRlIGNlbnN1cmVcIixcbiAgICBcInNjcnV0aW4gcHVibGljIG9yZGluYWlyZVwiLFxuICAgIFwic2NydXRpbiBwdWJsaWMgc29sZW5uZWxcIixcbiAgICBcInNjcnV0aW4gw6AgbGEgdHJpYnVuZVwiLFxuICAgIFwiU2NydXRpbiBzb2xlbm5lbCBjb25ncsOoc1wiLFxuICBdLFxuICBUeXBlTWFqb3JpdGU6IFtcbiAgICBcIk1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gICAgXCJtYWpvcml0w6kgYWJzb2x1ZSBkZXMgc3VmZnJhZ2VzIGV4cHJpbcOpc1wiLFxuICAgIFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCIsXG4gICAgXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50cyBjb21wb3NhbnQgbCdBc3NlbWJsw6llXCIsXG4gICAgXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50cyBjb21wb3NhbnQgbCdBc3NlbWJsw6llIG5hdGlvbmFsZVwiLFxuICAgIFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1biBDb25ncsOoc1wiLFxuICAgIFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1bmUgbW90aW9uIGRlIGNlbnN1cmVcIixcbiAgXSxcbiAgQ2F1c2VQb3NpdGlvblZvdGU6IFtcIk1HXCIsIFwiUEFOXCIsIFwiUFNFXCJdLFxuICBQb3NpdGlvbk1ham9yaXRhaXJlOiBbXCJhYnN0ZW50aW9uXCIsIFwiY29udHJlXCIsIFwicG91clwiXSxcbiAgTGlldVZvdGU6IFtcIkNvbmdyw6hzXCIsIFwiSMOpbWljeWNsZVwiLCBcIlNhbG9uc1wiXSxcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBLElBaURZQSx1QkFBdUIsR0FBQUMsT0FBQSxDQUFBRCx1QkFBQSwwQkFBdkJBLHVCQUF1QjtFQUF2QkEsdUJBQXVCO0VBQXZCQSx1QkFBdUI7RUFBQSxPQUF2QkEsdUJBQXVCO0FBQUE7QUFBQSxJQWN2QkUsSUFBSSxHQUFBRCxPQUFBLENBQUFDLElBQUEsMEJBQUpBLElBQUk7RUFBSkEsSUFBSTtFQUFKQSxJQUFJO0VBQUEsT0FBSkEsSUFBSTtBQUFBO0FBQUEsSUFLSkMsT0FBTyxHQUFBRixPQUFBLENBQUFFLE9BQUEsMEJBQVBBLE9BQU87RUFBUEEsT0FBTztFQUFQQSxPQUFPO0VBQVBBLE9BQU87RUFBUEEsT0FBTztFQUFBLE9BQVBBLE9BQU87QUFBQTtBQUFBLElBcUJQQyxZQUFZLEdBQUFILE9BQUEsQ0FBQUcsWUFBQSwwQkFBWkEsWUFBWTtFQUFaQSxZQUFZO0VBQVpBLFlBQVk7RUFBWkEsWUFBWTtFQUFaQSxZQUFZO0VB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