UNPKG

@openfisca/json-model

Version:

Library to handle informations extracted in JSON or YAML format from OpenFisca parameters, variables, etc

181 lines 39.8 kB
import { auditArray, auditBoolean, auditChain, auditDateIso8601String, auditEmptyToNull, auditFunction, auditInteger, auditKeyValueDictionary, auditNumber, auditOptions, auditRequire, auditString, auditStringToNumber, auditSwitch, auditTest, auditTrimString, auditUnique } from "@auditors/core"; function assertNever(type, value) { throw new Error(`Unexpected ${type}: ${JSON.stringify(value)}`); } function auditEntityVariables(audit, data, errors, remainingKeys, currentSmic, currentYear, entity, variableByName) { for (const [variableName, variable] of Object.entries(variableByName).filter(([, variable]) => variable.entity === entity.key)) { audit.attribute(data, variableName, true, errors, remainingKeys, auditKeyValueDictionary([(_audit, value) => { try { return [eval(`let year = ${currentYear}; ${typeof value === "string" && !value.includes("year") ? JSON.stringify(value) : value}`), null]; } catch (e) { return [value, e.toString()]; } }, auditSwitch([auditString, auditStringToNumber, auditInteger], auditInteger), auditTest(year => year >= currentYear - 4 && year <= currentYear, `Year must be in range [${currentYear - 4}, ${currentYear}]`), auditFunction(year => year.toString())], [auditVariableValue(currentSmic, variable), auditRequire])); } } function auditGroupWithoutId(currentSmic, currentYear, entity, personsIds, variableByName) { return (audit, dataUnknown) => { if (dataUnknown == null) { return [dataUnknown, null]; } if (typeof dataUnknown !== "object") { return audit.unexpectedType(dataUnknown, "object"); } const data = { ...dataUnknown }; const errors = {}; const remainingKeys = new Set(Object.keys(data)); audit.attribute(data, "name", true, errors, remainingKeys, auditTrimString, auditEmptyToNull); for (const role of entity.roles) { const roleKey = (role.max ?? 99) > 1 ? role.key_plural ?? role.key : role.key; audit.attribute(data, roleKey, true, errors, remainingKeys, auditArray(auditTrimString, personsIds.length === 0 ? [] : auditOptions(personsIds), auditRequire), auditUnique, auditEmptyToNull); } auditEntityVariables(audit, data, errors, remainingKeys, currentSmic, currentYear, entity, variableByName); return audit.reduceRemaining(data, errors, remainingKeys); }; } function auditLinkedVariable(testCasesIds) { return (audit, dataUnknown) => { if (dataUnknown == null) { return [dataUnknown, null]; } if (typeof dataUnknown !== "object") { return audit.unexpectedType(dataUnknown, "object"); } const data = { ...dataUnknown }; const errors = {}; const remainingKeys = new Set(Object.keys(data)); audit.attribute(data, "compare_to", true, errors, remainingKeys, testCasesIds === undefined ? auditString : auditOptions(testCasesIds)); audit.attribute(data, "description", true, errors, remainingKeys, auditTrimString, auditEmptyToNull); return audit.reduceRemaining(data, errors, remainingKeys); }; } function auditPersonWithoutId(currentSmic, currentYear, entity, variableByName) { return (audit, dataUnknown) => { if (dataUnknown == null) { return [dataUnknown, null]; } if (typeof dataUnknown !== "object") { return audit.unexpectedType(dataUnknown, "object"); } const data = { ...dataUnknown }; const errors = {}; const remainingKeys = new Set(Object.keys(data)); audit.attribute(data, "name", true, errors, remainingKeys, auditTrimString, auditEmptyToNull); auditEntityVariables(audit, data, errors, remainingKeys, currentSmic, currentYear, entity, variableByName); return audit.reduceRemaining(data, errors, remainingKeys); }; } export function auditSituation(currentSmic, currentYear, entityByKey, testCasesIds, variableByName, withId) { return (audit, dataUnknown) => { if (dataUnknown == null) { return [dataUnknown, null]; } if (typeof dataUnknown !== "object") { return audit.unexpectedType(dataUnknown, "object"); } const data = { ...dataUnknown }; const errors = {}; const remainingKeys = new Set(Object.keys(data)); let personsIds = []; for (const entity of Object.values(entityByKey)) { if (entity.is_person) { const personEntityKey = entity.key_plural ?? entity.key; audit.attribute(data, personEntityKey, true, errors, remainingKeys, auditKeyValueDictionary([auditTrimString, auditEmptyToNull], [auditPersonWithoutId(currentSmic, currentYear, entity, variableByName), auditRequire]), auditRequire); if (errors[personEntityKey] === undefined) { personsIds = Object.keys(data[personEntityKey]); } } } for (const entity of Object.values(entityByKey)) { if (!entity.is_person) { audit.attribute(data, entity.key_plural ?? entity.key, true, errors, remainingKeys, auditKeyValueDictionary([auditTrimString, auditEmptyToNull], [auditGroupWithoutId(currentSmic, currentYear, entity, personsIds, variableByName), auditRequire]), auditRequire); } } for (const key of ["description", "title"]) { audit.attribute(data, key, true, errors, remainingKeys, auditTrimString, auditEmptyToNull, auditRequire); } audit.attribute(data, "dixieme", true, errors, remainingKeys, auditInteger, auditTest(value => 1 <= value && value <= 10, "Le dixième doit être compris entre 1 et 10")); if (withId) { audit.attribute(data, "id", true, errors, remainingKeys, auditTrimString, auditEmptyToNull, auditRequire); } audit.attribute(data, "linked_variables", true, errors, remainingKeys, auditKeyValueDictionary(auditOptions(Object.keys(variableByName)), [auditArray(auditLinkedVariable(testCasesIds), auditRequire), auditRequire]), auditEmptyToNull); audit.attribute(data, "note", true, errors, remainingKeys, auditTrimString, auditEmptyToNull); audit.attribute(data, "sliders", true, errors, remainingKeys, auditArray(auditRequire)); if (Object.values(entityByKey).every(entity => errors[entity.key_plural ?? entity.key] === undefined)) { audit.attribute(data, "sliders", true, errors, remainingKeys, auditArray(auditSlider(entityByKey, data), auditRequire), auditEmptyToNull); } return audit.reduceRemaining(data, errors, remainingKeys); }; } function auditSlider(entityByKey, situation) { return (audit, dataUnknown) => { if (dataUnknown == null) { return [dataUnknown, null]; } if (typeof dataUnknown !== "object") { return audit.unexpectedType(dataUnknown, "object"); } const data = { ...dataUnknown }; const errors = {}; const remainingKeys = new Set(Object.keys(data)); audit.attribute(data, "entity", true, errors, remainingKeys, auditString, auditOptions(Object.keys(entityByKey)), auditRequire); audit.attribute(data, "id", true, errors, remainingKeys, auditString, auditRequire); for (const key of ["max", "min"]) { audit.attribute(data, key, true, errors, remainingKeys, auditNumber, auditRequire); } audit.attribute(data, "name", true, errors, remainingKeys, auditString, auditRequire); if (errors.entity === undefined) { const entity = entityByKey[data.entity]; const populationById = situation[entity.key_plural ?? entity.key]; audit.attribute(data, "id", true, errors, remainingKeys, auditOptions(Object.keys(populationById))); if (errors.id === undefined) { const population = populationById[data.id]; audit.attribute(data, "name", true, errors, remainingKeys, auditOptions(Object.keys(population))); } } return audit.reduceRemaining(data, errors, remainingKeys); }; } function auditVariableValue(currentSmic, variable) { let valueAuditor; switch (variable.value_type) { case "bool": valueAuditor = auditBoolean; break; case "date": valueAuditor = auditDateIso8601String; break; case "Enum": valueAuditor = auditOptions(Object.keys(variable.possible_values ?? [])); break; case "float": valueAuditor = auditNumber; break; case "int": valueAuditor = auditInteger; break; case "str": valueAuditor = auditString; break; default: assertNever("Variable.value_type", variable.value_type); } return auditChain((_audit, value) => { try { return [eval(`let smic = ${currentSmic}; ${typeof value === "string" && !value.includes("smic") ? JSON.stringify(value) : value}`), null]; } catch (e) { return [value, e.toString()]; } }, valueAuditor); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhdWRpdEFycmF5IiwiYXVkaXRCb29sZWFuIiwiYXVkaXRDaGFpbiIsImF1ZGl0RGF0ZUlzbzg2MDFTdHJpbmciLCJhdWRpdEVtcHR5VG9OdWxsIiwiYXVkaXRGdW5jdGlvbiIsImF1ZGl0SW50ZWdlciIsImF1ZGl0S2V5VmFsdWVEaWN0aW9uYXJ5IiwiYXVkaXROdW1iZXIiLCJhdWRpdE9wdGlvbnMiLCJhdWRpdFJlcXVpcmUiLCJhdWRpdFN0cmluZyIsImF1ZGl0U3RyaW5nVG9OdW1iZXIiLCJhdWRpdFN3aXRjaCIsImF1ZGl0VGVzdCIsImF1ZGl0VHJpbVN0cmluZyIsImF1ZGl0VW5pcXVlIiwiYXNzZXJ0TmV2ZXIiLCJ0eXBlIiwidmFsdWUiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJhdWRpdEVudGl0eVZhcmlhYmxlcyIsImF1ZGl0IiwiZGF0YSIsImVycm9ycyIsInJlbWFpbmluZ0tleXMiLCJjdXJyZW50U21pYyIsImN1cnJlbnRZZWFyIiwiZW50aXR5IiwidmFyaWFibGVCeU5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJ2YXJpYWJsZSIsIk9iamVjdCIsImVudHJpZXMiLCJmaWx0ZXIiLCJrZXkiLCJhdHRyaWJ1dGUiLCJfYXVkaXQiLCJldmFsIiwiaW5jbHVkZXMiLCJlIiwidG9TdHJpbmciLCJ5ZWFyIiwiYXVkaXRWYXJpYWJsZVZhbHVlIiwiYXVkaXRHcm91cFdpdGhvdXRJZCIsInBlcnNvbnNJZHMiLCJkYXRhVW5rbm93biIsInVuZXhwZWN0ZWRUeXBlIiwiU2V0Iiwia2V5cyIsInJvbGUiLCJyb2xlcyIsInJvbGVLZXkiLCJtYXgiLCJrZXlfcGx1cmFsIiwibGVuZ3RoIiwicmVkdWNlUmVtYWluaW5nIiwiYXVkaXRMaW5rZWRWYXJpYWJsZSIsInRlc3RDYXNlc0lkcyIsInVuZGVmaW5lZCIsImF1ZGl0UGVyc29uV2l0aG91dElkIiwiYXVkaXRTaXR1YXRpb24iLCJlbnRpdHlCeUtleSIsIndpdGhJZCIsInZhbHVlcyIsImlzX3BlcnNvbiIsInBlcnNvbkVudGl0eUtleSIsImV2ZXJ5IiwiYXVkaXRTbGlkZXIiLCJzaXR1YXRpb24iLCJwb3B1bGF0aW9uQnlJZCIsImlkIiwicG9wdWxhdGlvbiIsInZhbHVlQXVkaXRvciIsInZhbHVlX3R5cGUiLCJwb3NzaWJsZV92YWx1ZXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXRvcnMvc2l0dWF0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhdWRpdEFycmF5LFxuICBhdWRpdEJvb2xlYW4sXG4gIGF1ZGl0Q2hhaW4sXG4gIGF1ZGl0RGF0ZUlzbzg2MDFTdHJpbmcsXG4gIGF1ZGl0RW1wdHlUb051bGwsXG4gIGF1ZGl0RnVuY3Rpb24sXG4gIGF1ZGl0SW50ZWdlcixcbiAgYXVkaXRLZXlWYWx1ZURpY3Rpb25hcnksXG4gIGF1ZGl0TnVtYmVyLFxuICBhdWRpdE9wdGlvbnMsXG4gIGF1ZGl0UmVxdWlyZSxcbiAgYXVkaXRTdHJpbmcsXG4gIGF1ZGl0U3RyaW5nVG9OdW1iZXIsXG4gIGF1ZGl0U3dpdGNoLFxuICBhdWRpdFRlc3QsXG4gIGF1ZGl0VHJpbVN0cmluZyxcbiAgYXVkaXRVbmlxdWUsXG4gIHR5cGUgQXVkaXQsXG4gIHR5cGUgQXVkaXRvcixcbn0gZnJvbSBcIkBhdWRpdG9ycy9jb3JlXCJcblxuaW1wb3J0IHR5cGUge1xuICBFbnRpdHksXG4gIEVudGl0eUJ5S2V5LFxuICBHcm91cEVudGl0eSxcbiAgUGVyc29uRW50aXR5LFxufSBmcm9tIFwiLi4vZW50aXRpZXNcIlxuaW1wb3J0IHR5cGUgeyBTaXR1YXRpb24gfSBmcm9tIFwiLi4vc2l0dWF0aW9uc1wiXG5pbXBvcnQgeyBWYXJpYWJsZSwgVmFyaWFibGVCeU5hbWUgfSBmcm9tIFwiLi4vdmFyaWFibGVzXCJcblxuZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodHlwZTogc3RyaW5nLCB2YWx1ZTogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCAke3R5cGV9OiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKVxufVxuXG5mdW5jdGlvbiBhdWRpdEVudGl0eVZhcmlhYmxlcyhcbiAgYXVkaXQ6IEF1ZGl0LFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgZXJyb3JzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgcmVtYWluaW5nS2V5czogU2V0PHN0cmluZz4sXG4gIGN1cnJlbnRTbWljOiBudW1iZXIsXG4gIGN1cnJlbnRZZWFyOiBudW1iZXIsXG4gIGVudGl0eTogRW50aXR5LFxuICB2YXJpYWJsZUJ5TmFtZTogVmFyaWFibGVCeU5hbWUsXG4pIHtcbiAgZm9yIChjb25zdCBbdmFyaWFibGVOYW1lLCB2YXJpYWJsZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVCeU5hbWUpLmZpbHRlcihcbiAgICAoWywgdmFyaWFibGVdKSA9PiB2YXJpYWJsZS5lbnRpdHkgPT09IGVudGl0eS5rZXksXG4gICkpIHtcbiAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICBkYXRhLFxuICAgICAgdmFyaWFibGVOYW1lLFxuICAgICAgdHJ1ZSxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICBhdWRpdEtleVZhbHVlRGljdGlvbmFyeShcbiAgICAgICAgW1xuICAgICAgICAgIChfYXVkaXQ6IEF1ZGl0LCB2YWx1ZTogc3RyaW5nKTogW3Vua25vd24sIHVua25vd25dID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZXZhbChcbiAgICAgICAgICAgICAgICAgIGBsZXQgeWVhciA9ICR7Y3VycmVudFllYXJ9OyAke3R5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuaW5jbHVkZXMoXCJ5ZWFyXCIpID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZSwgKGUgYXMgRXJyb3IgfCBzdHJpbmcpLnRvU3RyaW5nKCldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhdWRpdFN3aXRjaChcbiAgICAgICAgICAgIFthdWRpdFN0cmluZywgYXVkaXRTdHJpbmdUb051bWJlciwgYXVkaXRJbnRlZ2VyXSxcbiAgICAgICAgICAgIGF1ZGl0SW50ZWdlcixcbiAgICAgICAgICApLFxuICAgICAgICAgIGF1ZGl0VGVzdChcbiAgICAgICAgICAgICh5ZWFyKSA9PiB5ZWFyID49IGN1cnJlbnRZZWFyIC0gNCAmJiB5ZWFyIDw9IGN1cnJlbnRZZWFyLFxuICAgICAgICAgICAgYFllYXIgbXVzdCBiZSBpbiByYW5nZSBbJHtjdXJyZW50WWVhciAtIDR9LCAke2N1cnJlbnRZZWFyfV1gLFxuICAgICAgICAgICksXG4gICAgICAgICAgYXVkaXRGdW5jdGlvbigoeWVhcikgPT4geWVhci50b1N0cmluZygpKSxcbiAgICAgICAgXSxcbiAgICAgICAgW2F1ZGl0VmFyaWFibGVWYWx1ZShjdXJyZW50U21pYywgdmFyaWFibGUpLCBhdWRpdFJlcXVpcmVdLFxuICAgICAgKSxcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gYXVkaXRHcm91cFdpdGhvdXRJZChcbiAgY3VycmVudFNtaWM6IG51bWJlcixcbiAgY3VycmVudFllYXI6IG51bWJlcixcbiAgZW50aXR5OiBHcm91cEVudGl0eSxcbiAgcGVyc29uc0lkczogc3RyaW5nW10sXG4gIHZhcmlhYmxlQnlOYW1lOiBWYXJpYWJsZUJ5TmFtZSxcbik6IEF1ZGl0b3Ige1xuICByZXR1cm4gKGF1ZGl0OiBBdWRpdCwgZGF0YVVua25vd246IHVua25vd24pOiBbdW5rbm93biwgdW5rbm93bl0gPT4ge1xuICAgIGlmIChkYXRhVW5rbm93biA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW2RhdGFVbmtub3duLCBudWxsXVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGFVbmtub3duICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYXVkaXQudW5leHBlY3RlZFR5cGUoZGF0YVVua25vd24sIFwib2JqZWN0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7IC4uLmRhdGFVbmtub3duIH1cbiAgICBjb25zdCBlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cbiAgICBjb25zdCByZW1haW5pbmdLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhkYXRhKSlcblxuICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgIGRhdGEsXG4gICAgICBcIm5hbWVcIixcbiAgICAgIHRydWUsXG4gICAgICBlcnJvcnMsXG4gICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgYXVkaXRUcmltU3RyaW5nLFxuICAgICAgYXVkaXRFbXB0eVRvTnVsbCxcbiAgICApXG4gICAgZm9yIChjb25zdCByb2xlIG9mIGVudGl0eS5yb2xlcykge1xuICAgICAgY29uc3Qgcm9sZUtleSA9XG4gICAgICAgIChyb2xlLm1heCA/PyA5OSkgPiAxID8gKHJvbGUua2V5X3BsdXJhbCA/PyByb2xlLmtleSkgOiByb2xlLmtleVxuICAgICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgICBkYXRhLFxuICAgICAgICByb2xlS2V5LFxuICAgICAgICB0cnVlLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICAgIGF1ZGl0QXJyYXkoXG4gICAgICAgICAgYXVkaXRUcmltU3RyaW5nLFxuICAgICAgICAgIHBlcnNvbnNJZHMubGVuZ3RoID09PSAwID8gW10gOiBhdWRpdE9wdGlvbnMocGVyc29uc0lkcyksXG4gICAgICAgICAgYXVkaXRSZXF1aXJlLFxuICAgICAgICApLFxuICAgICAgICBhdWRpdFVuaXF1ZSxcbiAgICAgICAgYXVkaXRFbXB0eVRvTnVsbCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBhdWRpdEVudGl0eVZhcmlhYmxlcyhcbiAgICAgIGF1ZGl0LFxuICAgICAgZGF0YSxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICBjdXJyZW50U21pYyxcbiAgICAgIGN1cnJlbnRZZWFyLFxuICAgICAgZW50aXR5LFxuICAgICAgdmFyaWFibGVCeU5hbWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF1ZGl0LnJlZHVjZVJlbWFpbmluZyhkYXRhLCBlcnJvcnMsIHJlbWFpbmluZ0tleXMpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXVkaXRMaW5rZWRWYXJpYWJsZSh0ZXN0Q2FzZXNJZHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogQXVkaXRvciB7XG4gIHJldHVybiAoYXVkaXQ6IEF1ZGl0LCBkYXRhVW5rbm93bjogdW5rbm93bik6IFt1bmtub3duLCB1bmtub3duXSA9PiB7XG4gICAgaWYgKGRhdGFVbmtub3duID09IG51bGwpIHtcbiAgICAgIHJldHVybiBbZGF0YVVua25vd24sIG51bGxdXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YVVua25vd24gIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBhdWRpdC51bmV4cGVjdGVkVHlwZShkYXRhVW5rbm93biwgXCJvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHsgLi4uZGF0YVVua25vd24gfVxuICAgIGNvbnN0IGVycm9yczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7fVxuICAgIGNvbnN0IHJlbWFpbmluZ0tleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGRhdGEpKVxuXG4gICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgZGF0YSxcbiAgICAgIFwiY29tcGFyZV90b1wiLFxuICAgICAgdHJ1ZSxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICB0ZXN0Q2FzZXNJZHMgPT09IHVuZGVmaW5lZCA/IGF1ZGl0U3RyaW5nIDogYXVkaXRPcHRpb25zKHRlc3RDYXNlc0lkcyksXG4gICAgKVxuICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgIGRhdGEsXG4gICAgICBcImRlc2NyaXB0aW9uXCIsXG4gICAgICB0cnVlLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgIGF1ZGl0VHJpbVN0cmluZyxcbiAgICAgIGF1ZGl0RW1wdHlUb051bGwsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF1ZGl0LnJlZHVjZVJlbWFpbmluZyhkYXRhLCBlcnJvcnMsIHJlbWFpbmluZ0tleXMpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXVkaXRQZXJzb25XaXRob3V0SWQoXG4gIGN1cnJlbnRTbWljOiBudW1iZXIsXG4gIGN1cnJlbnRZZWFyOiBudW1iZXIsXG4gIGVudGl0eTogUGVyc29uRW50aXR5LFxuICB2YXJpYWJsZUJ5TmFtZTogVmFyaWFibGVCeU5hbWUsXG4pOiBBdWRpdG9yIHtcbiAgcmV0dXJuIChhdWRpdDogQXVkaXQsIGRhdGFVbmtub3duOiB1bmtub3duKTogW3Vua25vd24sIHVua25vd25dID0+IHtcbiAgICBpZiAoZGF0YVVua25vd24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtkYXRhVW5rbm93biwgbnVsbF1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhVW5rbm93biAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGF1ZGl0LnVuZXhwZWN0ZWRUeXBlKGRhdGFVbmtub3duLCBcIm9iamVjdFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0geyAuLi5kYXRhVW5rbm93biB9XG4gICAgY29uc3QgZXJyb3JzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG4gICAgY29uc3QgcmVtYWluaW5nS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZGF0YSkpXG5cbiAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICBkYXRhLFxuICAgICAgXCJuYW1lXCIsXG4gICAgICB0cnVlLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgIGF1ZGl0VHJpbVN0cmluZyxcbiAgICAgIGF1ZGl0RW1wdHlUb051bGwsXG4gICAgKVxuXG4gICAgYXVkaXRFbnRpdHlWYXJpYWJsZXMoXG4gICAgICBhdWRpdCxcbiAgICAgIGRhdGEsXG4gICAgICBlcnJvcnMsXG4gICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgY3VycmVudFNtaWMsXG4gICAgICBjdXJyZW50WWVhcixcbiAgICAgIGVudGl0eSxcbiAgICAgIHZhcmlhYmxlQnlOYW1lLFxuICAgIClcblxuICAgIHJldHVybiBhdWRpdC5yZWR1Y2VSZW1haW5pbmcoZGF0YSwgZXJyb3JzLCByZW1haW5pbmdLZXlzKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdFNpdHVhdGlvbihcbiAgY3VycmVudFNtaWM6IG51bWJlcixcbiAgY3VycmVudFllYXI6IG51bWJlcixcbiAgZW50aXR5QnlLZXk6IEVudGl0eUJ5S2V5LFxuICB0ZXN0Q2FzZXNJZHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICB2YXJpYWJsZUJ5TmFtZTogVmFyaWFibGVCeU5hbWUsXG4gIHdpdGhJZDogYm9vbGVhbixcbik6IEF1ZGl0b3Ige1xuICByZXR1cm4gKGF1ZGl0OiBBdWRpdCwgZGF0YVVua25vd246IHVua25vd24pOiBbdW5rbm93biwgdW5rbm93bl0gPT4ge1xuICAgIGlmIChkYXRhVW5rbm93biA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW2RhdGFVbmtub3duLCBudWxsXVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGFVbmtub3duICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYXVkaXQudW5leHBlY3RlZFR5cGUoZGF0YVVua25vd24sIFwib2JqZWN0XCIpXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7IC4uLmRhdGFVbmtub3duIH1cbiAgICBjb25zdCBlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cbiAgICBjb25zdCByZW1haW5pbmdLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhkYXRhKSlcblxuICAgIGxldCBwZXJzb25zSWRzOiBzdHJpbmdbXSA9IFtdXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgT2JqZWN0LnZhbHVlcyhlbnRpdHlCeUtleSkpIHtcbiAgICAgIGlmIChlbnRpdHkuaXNfcGVyc29uKSB7XG4gICAgICAgIGNvbnN0IHBlcnNvbkVudGl0eUtleSA9IGVudGl0eS5rZXlfcGx1cmFsID8/IGVudGl0eS5rZXlcbiAgICAgICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgcGVyc29uRW50aXR5S2V5LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICAgICAgYXVkaXRLZXlWYWx1ZURpY3Rpb25hcnkoXG4gICAgICAgICAgICBbYXVkaXRUcmltU3RyaW5nLCBhdWRpdEVtcHR5VG9OdWxsXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgYXVkaXRQZXJzb25XaXRob3V0SWQoXG4gICAgICAgICAgICAgICAgY3VycmVudFNtaWMsXG4gICAgICAgICAgICAgICAgY3VycmVudFllYXIsXG4gICAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlQnlOYW1lLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBhdWRpdFJlcXVpcmUsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICksXG4gICAgICAgICAgYXVkaXRSZXF1aXJlLFxuICAgICAgICApXG4gICAgICAgIGlmIChlcnJvcnNbcGVyc29uRW50aXR5S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGVyc29uc0lkcyA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgZGF0YVtwZXJzb25FbnRpdHlLZXldIGFzIFJlY29yZDxzdHJpbmcsIFBlcnNvbkVudGl0eT4sXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgT2JqZWN0LnZhbHVlcyhlbnRpdHlCeUtleSkpIHtcbiAgICAgIGlmICghZW50aXR5LmlzX3BlcnNvbikge1xuICAgICAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBlbnRpdHkua2V5X3BsdXJhbCA/PyBlbnRpdHkua2V5LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICAgICAgYXVkaXRLZXlWYWx1ZURpY3Rpb25hcnkoXG4gICAgICAgICAgICBbYXVkaXRUcmltU3RyaW5nLCBhdWRpdEVtcHR5VG9OdWxsXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgYXVkaXRHcm91cFdpdGhvdXRJZChcbiAgICAgICAgICAgICAgICBjdXJyZW50U21pYyxcbiAgICAgICAgICAgICAgICBjdXJyZW50WWVhcixcbiAgICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgICAgcGVyc29uc0lkcyxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUJ5TmFtZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgYXVkaXRSZXF1aXJlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGF1ZGl0UmVxdWlyZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFtcImRlc2NyaXB0aW9uXCIsIFwidGl0bGVcIl0pIHtcbiAgICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgICAgZGF0YSxcbiAgICAgICAga2V5LFxuICAgICAgICB0cnVlLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICAgIGF1ZGl0VHJpbVN0cmluZyxcbiAgICAgICAgYXVkaXRFbXB0eVRvTnVsbCxcbiAgICAgICAgYXVkaXRSZXF1aXJlLFxuICAgICAgKVxuICAgIH1cbiAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICBkYXRhLFxuICAgICAgXCJkaXhpZW1lXCIsXG4gICAgICB0cnVlLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgIGF1ZGl0SW50ZWdlcixcbiAgICAgIGF1ZGl0VGVzdChcbiAgICAgICAgKHZhbHVlKSA9PiAxIDw9IHZhbHVlICYmIHZhbHVlIDw9IDEwLFxuICAgICAgICBcIkxlIGRpeGnDqG1lIGRvaXQgw6p0cmUgY29tcHJpcyBlbnRyZSAxIGV0IDEwXCIsXG4gICAgICApLFxuICAgIClcbiAgICBpZiAod2l0aElkKSB7XG4gICAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICAgIGRhdGEsXG4gICAgICAgIFwiaWRcIixcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZXJyb3JzLFxuICAgICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgICBhdWRpdFRyaW1TdHJpbmcsXG4gICAgICAgIGF1ZGl0RW1wdHlUb051bGwsXG4gICAgICAgIGF1ZGl0UmVxdWlyZSxcbiAgICAgIClcbiAgICB9XG4gICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgZGF0YSxcbiAgICAgIFwibGlua2VkX3ZhcmlhYmxlc1wiLFxuICAgICAgdHJ1ZSxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICBhdWRpdEtleVZhbHVlRGljdGlvbmFyeShhdWRpdE9wdGlvbnMoT2JqZWN0LmtleXModmFyaWFibGVCeU5hbWUpKSwgW1xuICAgICAgICBhdWRpdEFycmF5KGF1ZGl0TGlua2VkVmFyaWFibGUodGVzdENhc2VzSWRzKSwgYXVkaXRSZXF1aXJlKSxcbiAgICAgICAgYXVkaXRSZXF1aXJlLFxuICAgICAgXSksXG4gICAgICBhdWRpdEVtcHR5VG9OdWxsLFxuICAgIClcbiAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICBkYXRhLFxuICAgICAgXCJub3RlXCIsXG4gICAgICB0cnVlLFxuICAgICAgZXJyb3JzLFxuICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgIGF1ZGl0VHJpbVN0cmluZyxcbiAgICAgIGF1ZGl0RW1wdHlUb051bGwsXG4gICAgKVxuICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgIGRhdGEsXG4gICAgICBcInNsaWRlcnNcIixcbiAgICAgIHRydWUsXG4gICAgICBlcnJvcnMsXG4gICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgYXVkaXRBcnJheShhdWRpdFJlcXVpcmUpLFxuICAgIClcblxuICAgIGlmIChcbiAgICAgIE9iamVjdC52YWx1ZXMoZW50aXR5QnlLZXkpLmV2ZXJ5KFxuICAgICAgICAoZW50aXR5KSA9PiBlcnJvcnNbZW50aXR5LmtleV9wbHVyYWwgPz8gZW50aXR5LmtleV0gPT09IHVuZGVmaW5lZCxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgICAgZGF0YSxcbiAgICAgICAgXCJzbGlkZXJzXCIsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgICAgYXVkaXRBcnJheShhdWRpdFNsaWRlcihlbnRpdHlCeUtleSwgZGF0YSBhcyBTaXR1YXRpb24pLCBhdWRpdFJlcXVpcmUpLFxuICAgICAgICBhdWRpdEVtcHR5VG9OdWxsLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBhdWRpdC5yZWR1Y2VSZW1haW5pbmcoZGF0YSwgZXJyb3JzLCByZW1haW5pbmdLZXlzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGF1ZGl0U2xpZGVyKGVudGl0eUJ5S2V5OiBFbnRpdHlCeUtleSwgc2l0dWF0aW9uOiBTaXR1YXRpb24pOiBBdWRpdG9yIHtcbiAgcmV0dXJuIChhdWRpdDogQXVkaXQsIGRhdGFVbmtub3duOiB1bmtub3duKTogW3Vua25vd24sIHVua25vd25dID0+IHtcbiAgICBpZiAoZGF0YVVua25vd24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtkYXRhVW5rbm93biwgbnVsbF1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhVW5rbm93biAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGF1ZGl0LnVuZXhwZWN0ZWRUeXBlKGRhdGFVbmtub3duLCBcIm9iamVjdFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0geyAuLi5kYXRhVW5rbm93biB9XG4gICAgY29uc3QgZXJyb3JzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG4gICAgY29uc3QgcmVtYWluaW5nS2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZGF0YSkpXG5cbiAgICBhdWRpdC5hdHRyaWJ1dGUoXG4gICAgICBkYXRhLFxuICAgICAgXCJlbnRpdHlcIixcbiAgICAgIHRydWUsXG4gICAgICBlcnJvcnMsXG4gICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgYXVkaXRTdHJpbmcsXG4gICAgICBhdWRpdE9wdGlvbnMoT2JqZWN0LmtleXMoZW50aXR5QnlLZXkpKSxcbiAgICAgIGF1ZGl0UmVxdWlyZSxcbiAgICApXG4gICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgZGF0YSxcbiAgICAgIFwiaWRcIixcbiAgICAgIHRydWUsXG4gICAgICBlcnJvcnMsXG4gICAgICByZW1haW5pbmdLZXlzLFxuICAgICAgYXVkaXRTdHJpbmcsXG4gICAgICBhdWRpdFJlcXVpcmUsXG4gICAgKVxuICAgIGZvciAoY29uc3Qga2V5IG9mIFtcIm1heFwiLCBcIm1pblwiXSkge1xuICAgICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgICBkYXRhLFxuICAgICAgICBrZXksXG4gICAgICAgIHRydWUsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgICAgYXVkaXROdW1iZXIsXG4gICAgICAgIGF1ZGl0UmVxdWlyZSxcbiAgICAgIClcbiAgICB9XG4gICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgZGF0YSxcbiAgICAgIFwibmFtZVwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIGVycm9ycyxcbiAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICBhdWRpdFN0cmluZyxcbiAgICAgIGF1ZGl0UmVxdWlyZSxcbiAgICApXG5cbiAgICBpZiAoZXJyb3JzLmVudGl0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdHlCeUtleVtkYXRhLmVudGl0eSBhcyBzdHJpbmddXG4gICAgICBjb25zdCBwb3B1bGF0aW9uQnlJZCA9IHNpdHVhdGlvbltlbnRpdHkua2V5X3BsdXJhbCA/PyBlbnRpdHkua2V5XVxuICAgICAgYXVkaXQuYXR0cmlidXRlKFxuICAgICAgICBkYXRhLFxuICAgICAgICBcImlkXCIsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGVycm9ycyxcbiAgICAgICAgcmVtYWluaW5nS2V5cyxcbiAgICAgICAgYXVkaXRPcHRpb25zKE9iamVjdC5rZXlzKHBvcHVsYXRpb25CeUlkKSksXG4gICAgICApXG5cbiAgICAgIGlmIChlcnJvcnMuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBwb3B1bGF0aW9uID0gcG9wdWxhdGlvbkJ5SWRbZGF0YS5pZCBhcyBzdHJpbmddXG4gICAgICAgIGF1ZGl0LmF0dHJpYnV0ZShcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIFwibmFtZVwiLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgIHJlbWFpbmluZ0tleXMsXG4gICAgICAgICAgYXVkaXRPcHRpb25zKE9iamVjdC5rZXlzKHBvcHVsYXRpb24pKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhdWRpdC5yZWR1Y2VSZW1haW5pbmcoZGF0YSwgZXJyb3JzLCByZW1haW5pbmdLZXlzKVxuICB9XG59XG5cbmZ1bmN0aW9uIGF1ZGl0VmFyaWFibGVWYWx1ZShjdXJyZW50U21pYzogbnVtYmVyLCB2YXJpYWJsZTogVmFyaWFibGUpOiBBdWRpdG9yIHtcbiAgbGV0IHZhbHVlQXVkaXRvcjogKF9hdWRpdDogQXVkaXQsIHZhbHVlOiBzdHJpbmcpID0+IFt1bmtub3duLCB1bmtub3duXVxuICBzd2l0Y2ggKHZhcmlhYmxlLnZhbHVlX3R5cGUpIHtcbiAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgdmFsdWVBdWRpdG9yID0gYXVkaXRCb29sZWFuXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICB2YWx1ZUF1ZGl0b3IgPSBhdWRpdERhdGVJc284NjAxU3RyaW5nXG4gICAgICBicmVha1xuICAgIGNhc2UgXCJFbnVtXCI6XG4gICAgICB2YWx1ZUF1ZGl0b3IgPSBhdWRpdE9wdGlvbnMoT2JqZWN0LmtleXModmFyaWFibGUucG9zc2libGVfdmFsdWVzID8/IFtdKSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICB2YWx1ZUF1ZGl0b3IgPSBhdWRpdE51bWJlclxuICAgICAgYnJlYWtcbiAgICBjYXNlIFwiaW50XCI6XG4gICAgICB2YWx1ZUF1ZGl0b3IgPSBhdWRpdEludGVnZXJcbiAgICAgIGJyZWFrXG4gICAgY2FzZSBcInN0clwiOlxuICAgICAgdmFsdWVBdWRpdG9yID0gYXVkaXRTdHJpbmdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKFwiVmFyaWFibGUudmFsdWVfdHlwZVwiLCB2YXJpYWJsZS52YWx1ZV90eXBlKVxuICB9XG4gIHJldHVybiBhdWRpdENoYWluKChfYXVkaXQ6IEF1ZGl0LCB2YWx1ZTogc3RyaW5nKTogW3Vua25vd24sIHVua25vd25dID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgZXZhbChcbiAgICAgICAgICBgbGV0IHNtaWMgPSAke2N1cnJlbnRTbWljfTsgJHt0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlLmluY2x1ZGVzKFwic21pY1wiKSA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlfWAsXG4gICAgICAgICksXG4gICAgICAgIG51bGwsXG4gICAgICBdXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZSwgKGUgYXMgRXJyb3IgfCBzdHJpbmcpLnRvU3RyaW5nKCldXG4gICAgfVxuICB9LCB2YWx1ZUF1ZGl0b3IpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQ0VBLFVBQVUsRUFDVkMsWUFBWSxFQUNaQyxVQUFVLEVBQ1ZDLHNCQUFzQixFQUN0QkMsZ0JBQWdCLEVBQ2hCQyxhQUFhLEVBQ2JDLFlBQVksRUFDWkMsdUJBQXVCLEVBQ3ZCQyxXQUFXLEVBQ1hDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMsV0FBVyxFQUNYQyxTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsV0FBVyxRQUdOLGdCQUFnQjtBQVd2QixTQUFTQyxXQUFXQSxDQUFDQyxJQUFZLEVBQUVDLEtBQVksRUFBUztFQUN0RCxNQUFNLElBQUlDLEtBQUssQ0FBQyxjQUFjRixJQUFJLEtBQUtHLElBQUksQ0FBQ0MsU0FBUyxDQUFDSCxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ2pFO0FBRUEsU0FBU0ksb0JBQW9CQSxDQUMzQkMsS0FBWSxFQUNaQyxJQUFnQyxFQUNoQ0MsTUFBa0MsRUFDbENDLGFBQTBCLEVBQzFCQyxXQUFtQixFQUNuQkMsV0FBbUIsRUFDbkJDLE1BQWMsRUFDZEMsY0FBOEIsRUFDOUI7RUFDQSxLQUFLLE1BQU0sQ0FBQ0MsWUFBWSxFQUFFQyxRQUFRLENBQUMsSUFBSUMsTUFBTSxDQUFDQyxPQUFPLENBQUNK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