UNPKG

@tricoteuses/assemblee

Version:

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

125 lines 17.2 kB
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, 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); } import versionCompare from "tiny-version-compare"; import { BasePlugin } from "../bugs/index.mjs"; // https://www.wikidata.org/wiki/Wikidata:WikiProject_France/Assembl%C3%A9e_Nationale#Legislative_session const url = "https://query.wikidata.org/sparql?query=SELECT%20DISTINCT%20%3Fsession%20%3Fstart_time%20%3Fend_time%20%3Flabel%20%3Ffollows%20%3Ffollowed_by%20WHERE%20%7B%0A%0A%20%20%20%3Fsession%20wdt%3AP31%2Fwdt%3AP279*%20wd%3AQ87337481.%0A%20%20%20%3Fsession%20wdt%3AP580%20%3Fstart_time.%20%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP582%20%3Fend_time%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP155%20%3Ffollows%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP156%20%3Ffollowed_by%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20rdfs%3Alabel%20%3Flabel%20filter%20(lang(%3Flabel)%20%3D%20%22fr%22)%20.%7D%0A%7D"; function compareString(a, b) { if (a < b) return -1; if (a > b) return 1; return 0; } export class Plugin extends BasePlugin { constructor(options) { super(options, "agenda-00011"); _defineProperty(this, "sessions", void 0); _defineProperty(this, "fetch", void 0); this.fetch = fetch; } async preFix() { return this.setSessions(); } async preCheck() { return this.setSessions(); } async setSessions() { const sessions = (await this.fetchSessions()).sort((a, b) => compareString(a["start_time"]["value"], b["start_time"]["value"])); this.sessions = sessions.map(s => { return { label: s["label"]["value"].replace(/\s+en france/i, ""), debut: s["start_time"]["value"].substr(0, 10), fin: s["end_time"]["value"].substr(0, 10) }; }); } async get(url, headers) { return this.fetch(url, headers); } async fetchSessions() { const response = await this.get(url, { headers: { Accept: "application/json" } }); if (!response.ok) throw response; const payload = await response.json(); return payload["results"]["bindings"]; } lookupSession(debut) { const max = this.sessions.length - 1; const min = 0; let h = max; let m; let l = min; let session; let ok; do { m = Math.floor((l + h) / 2); session = this.sessions[m]; ok = session.debut <= debut && debut <= session.fin; if (!ok) { if (l == m && m == h) // in between sessions return null; if (debut < session.debut) { if (m <= min) return null; h = m; } else if (debut > session.fin) { if (m >= max) return null; l = l == m ? h : m; } } } while (!ok); return session; } inScope(agenda) { if (agenda.xsiType != "seance_type" || agenda.lieu !== undefined && agenda.lieu.code != "CG" && agenda.lieu.code != "AN") return false; if (agenda.cycleDeVie.etat != "Confirmé") return false; return true; } async check(agenda, _filename) { if (!this.inScope(agenda)) return null; const debut = agenda.timestampDebut.substr(0, 10); const session = this.lookupSession(debut); if (session == null) { return { status: "needs-fixing", info: [`${debut} is not in a session`] }; } else { return { status: "ok", info: [""] }; } } maybeUpgradeSchemaVersion(agenda) { if (agenda.schemaVersion !== undefined) { const version = agenda.schemaVersion.split("-")[1]; if (versionCompare(version, "1.0") == 1) return; } agenda.schemaVersion = "agenda-1.1"; } async fix(agenda, _filename) { let status; if ("sessionRef" in agenda) { // sessionRef is undefined and must be removed delete agenda.sessionRef; status = true; } else { // if there is no sessionRef to remove, file which is not in scope does not need to be rewritten status = null; } if (!this.inScope(agenda)) return status; if ("session" in agenda) delete agenda.session; const session = this.lookupSession(agenda.timestampDebut.substr(0, 10)); if (session == null) { return null; } else { agenda.session = session; this.maybeUpgradeSchemaVersion(agenda); return true; } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uQ29tcGFyZSIsIkJhc2VQbHVnaW4iLCJ1cmwiLCJjb21wYXJlU3RyaW5nIiwiYSIsImIiLCJQbHVnaW4iLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfZGVmaW5lUHJvcGVydHkiLCJmZXRjaCIsInByZUZpeCIsInNldFNlc3Npb25zIiwicHJlQ2hlY2siLCJzZXNzaW9ucyIsImZldGNoU2Vzc2lvbnMiLCJzb3J0IiwibWFwIiwicyIsImxhYmVsIiwicmVwbGFjZSIsImRlYnV0Iiwic3Vic3RyIiwiZmluIiwiZ2V0IiwiaGVhZGVycyIsInJlc3BvbnNlIiwiQWNjZXB0Iiwib2siLCJwYXlsb2FkIiwianNvbiIsImxvb2t1cFNlc3Npb24iLCJtYXgiLCJsZW5ndGgiLCJtaW4iLCJoIiwibSIsImwiLCJzZXNzaW9uIiwiTWF0aCIsImZsb29yIiwiaW5TY29wZSIsImFnZW5kYSIsInhzaVR5cGUiLCJsaWV1IiwidW5kZWZpbmVkIiwiY29kZSIsImN5Y2xlRGVWaWUiLCJldGF0IiwiY2hlY2siLCJfZmlsZW5hbWUiLCJ0aW1lc3RhbXBEZWJ1dCIsInN0YXR1cyIsImluZm8iLCJtYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uIiwic2NoZW1hVmVyc2lvbiIsInZlcnNpb24iLCJzcGxpdCIsImZpeCIsInNlc3Npb25SZWYiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVncy9hZ2VuZGEtMDAwMTEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZlcnNpb25Db21wYXJlIGZyb20gXCJ0aW55LXZlcnNpb24tY29tcGFyZVwiXG5pbXBvcnQgeyBCYXNlUGx1Z2luIH0gZnJvbSBcIi4uL2J1Z3NcIlxuXG4vLyBodHRwczovL3d3dy53aWtpZGF0YS5vcmcvd2lraS9XaWtpZGF0YTpXaWtpUHJvamVjdF9GcmFuY2UvQXNzZW1ibCVDMyVBOWVfTmF0aW9uYWxlI0xlZ2lzbGF0aXZlX3Nlc3Npb25cbmNvbnN0IHVybCA9XG4gIFwiaHR0cHM6Ly9xdWVyeS53aWtpZGF0YS5vcmcvc3BhcnFsP3F1ZXJ5PVNFTEVDVCUyMERJU1RJTkNUJTIwJTNGc2Vzc2lvbiUyMCUzRnN0YXJ0X3RpbWUlMjAlM0ZlbmRfdGltZSUyMCUzRmxhYmVsJTIwJTNGZm9sbG93cyUyMCUzRmZvbGxvd2VkX2J5JTIwV0hFUkUlMjAlN0IlMEElMEElMjAlMjAlMjAlM0ZzZXNzaW9uJTIwd2R0JTNBUDMxJTJGd2R0JTNBUDI3OSolMjB3ZCUzQVE4NzMzNzQ4MS4lMEElMjAlMjAlMjAlM0ZzZXNzaW9uJTIwd2R0JTNBUDU4MCUyMCUzRnN0YXJ0X3RpbWUuJTIwJTBBJTIwJTIwJTIwT1BUSU9OQUwlMjAlN0IlMjAlM0ZzZXNzaW9uJTIwd2R0JTNBUDU4MiUyMCUzRmVuZF90aW1lJTIwJTdELiUwQSUyMCUyMCUyME9QVElPTkFMJTIwJTdCJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVAxNTUlMjAlM0Zmb2xsb3dzJTIwJTdELiUwQSUyMCUyMCUyME9QVElPTkFMJTIwJTdCJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVAxNTYlMjAlM0Zmb2xsb3dlZF9ieSUyMCU3RC4lMEElMjAlMjAlMjBPUFRJT05BTCUyMCU3QiUyMCUzRnNlc3Npb24lMjByZGZzJTNBbGFiZWwlMjAlM0ZsYWJlbCUyMGZpbHRlciUyMChsYW5nKCUzRmxhYmVsKSUyMCUzRCUyMCUyMmZyJTIyKSUyMC4lN0QlMEElN0RcIlxuXG5mdW5jdGlvbiBjb21wYXJlU3RyaW5nKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuIC0xXG4gIGlmIChhID4gYikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuZXhwb3J0IGNsYXNzIFBsdWdpbiBleHRlbmRzIEJhc2VQbHVnaW4ge1xuICBzZXNzaW9uczogYW55XG4gIGZldGNoOiBhbnlcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBhbnkpIHtcbiAgICBzdXBlcihvcHRpb25zLCBcImFnZW5kYS0wMDAxMVwiKVxuICAgIHRoaXMuZmV0Y2ggPSBmZXRjaFxuICB9XG5cbiAgYXN5bmMgcHJlRml4KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0U2Vzc2lvbnMoKVxuICB9XG5cbiAgYXN5bmMgcHJlQ2hlY2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zZXRTZXNzaW9ucygpXG4gIH1cblxuICBhc3luYyBzZXRTZXNzaW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNlc3Npb25zID0gKGF3YWl0IHRoaXMuZmV0Y2hTZXNzaW9ucygpKS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgIGNvbXBhcmVTdHJpbmcoYVtcInN0YXJ0X3RpbWVcIl1bXCJ2YWx1ZVwiXSwgYltcInN0YXJ0X3RpbWVcIl1bXCJ2YWx1ZVwiXSksXG4gICAgKVxuICAgIHRoaXMuc2Vzc2lvbnMgPSBzZXNzaW9ucy5tYXAoKHM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHNbXCJsYWJlbFwiXVtcInZhbHVlXCJdLnJlcGxhY2UoL1xccytlbiBmcmFuY2UvaSwgXCJcIiksXG4gICAgICAgIGRlYnV0OiBzW1wic3RhcnRfdGltZVwiXVtcInZhbHVlXCJdLnN1YnN0cigwLCAxMCksXG4gICAgICAgIGZpbjogc1tcImVuZF90aW1lXCJdW1widmFsdWVcIl0uc3Vic3RyKDAsIDEwKSxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZ2V0KHVybDogc3RyaW5nLCBoZWFkZXJzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZldGNoKHVybCwgaGVhZGVycylcbiAgfVxuXG4gIGFzeW5jIGZldGNoU2Vzc2lvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0KHVybCwge1xuICAgICAgaGVhZGVyczogeyBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyByZXNwb25zZVxuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICByZXR1cm4gcGF5bG9hZFtcInJlc3VsdHNcIl1bXCJiaW5kaW5nc1wiXVxuICB9XG5cbiAgbG9va3VwU2Vzc2lvbihkZWJ1dDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBtYXggPSB0aGlzLnNlc3Npb25zLmxlbmd0aCAtIDFcbiAgICBjb25zdCBtaW4gPSAwXG4gICAgbGV0IGggPSBtYXhcbiAgICBsZXQgbVxuICAgIGxldCBsID0gbWluXG4gICAgbGV0IHNlc3Npb25cbiAgICBsZXQgb2tcbiAgICBkbyB7XG4gICAgICBtID0gTWF0aC5mbG9vcigobCArIGgpIC8gMilcbiAgICAgIHNlc3Npb24gPSB0aGlzLnNlc3Npb25zW21dXG4gICAgICBvayA9IHNlc3Npb24uZGVidXQgPD0gZGVidXQgJiYgZGVidXQgPD0gc2Vzc2lvbi5maW5cbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKGwgPT0gbSAmJiBtID09IGgpXG4gICAgICAgICAgLy8gaW4gYmV0d2VlbiBzZXNzaW9uc1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIGlmIChkZWJ1dCA8IHNlc3Npb24uZGVidXQpIHtcbiAgICAgICAgICBpZiAobSA8PSBtaW4pIHJldHVybiBudWxsXG4gICAgICAgICAgaCA9IG1cbiAgICAgICAgfSBlbHNlIGlmIChkZWJ1dCA+IHNlc3Npb24uZmluKSB7XG4gICAgICAgICAgaWYgKG0gPj0gbWF4KSByZXR1cm4gbnVsbFxuICAgICAgICAgIGwgPSBsID09IG0gPyBoIDogbVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAoIW9rKVxuICAgIHJldHVybiBzZXNzaW9uXG4gIH1cblxuICBpblNjb3BlKGFnZW5kYTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgYWdlbmRhLnhzaVR5cGUgIT0gXCJzZWFuY2VfdHlwZVwiIHx8XG4gICAgICAoYWdlbmRhLmxpZXUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBhZ2VuZGEubGlldS5jb2RlICE9IFwiQ0dcIiAmJlxuICAgICAgICBhZ2VuZGEubGlldS5jb2RlICE9IFwiQU5cIilcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBpZiAoYWdlbmRhLmN5Y2xlRGVWaWUuZXRhdCAhPSBcIkNvbmZpcm3DqVwiKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgYXN5bmMgY2hlY2soYWdlbmRhOiBhbnksIF9maWxlbmFtZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuaW5TY29wZShhZ2VuZGEpKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGRlYnV0ID0gYWdlbmRhLnRpbWVzdGFtcERlYnV0LnN1YnN0cigwLCAxMClcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5sb29rdXBTZXNzaW9uKGRlYnV0KVxuICAgIGlmIChzZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJuZWVkcy1maXhpbmdcIiwgaW5mbzogW2Ake2RlYnV0fSBpcyBub3QgaW4gYSBzZXNzaW9uYF0gfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwib2tcIiwgaW5mbzogW1wiXCJdIH1cbiAgICB9XG4gIH1cblxuICBtYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uKGFnZW5kYTogYW55KSB7XG4gICAgaWYgKGFnZW5kYS5zY2hlbWFWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBhZ2VuZGEuc2NoZW1hVmVyc2lvbi5zcGxpdChcIi1cIilbMV1cbiAgICAgIGlmICh2ZXJzaW9uQ29tcGFyZSh2ZXJzaW9uLCBcIjEuMFwiKSA9PSAxKSByZXR1cm5cbiAgICB9XG4gICAgYWdlbmRhLnNjaGVtYVZlcnNpb24gPSBcImFnZW5kYS0xLjFcIlxuICB9XG5cbiAgYXN5bmMgZml4KGFnZW5kYTogYW55LCBfZmlsZW5hbWU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IHN0YXR1c1xuICAgIGlmIChcInNlc3Npb25SZWZcIiBpbiBhZ2VuZGEpIHtcbiAgICAgIC8vIHNlc3Npb25SZWYgaXMgdW5kZWZpbmVkIGFuZCBtdXN0IGJlIHJlbW92ZWRcbiAgICAgIGRlbGV0ZSBhZ2VuZGEuc2Vzc2lvblJlZlxuICAgICAgc3RhdHVzID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBubyBzZXNzaW9uUmVmIHRvIHJlbW92ZSwgZmlsZSB3aGljaCBpcyBub3QgaW4gc2NvcGUgZG9lcyBub3QgbmVlZCB0byBiZSByZXdyaXR0ZW5cbiAgICAgIHN0YXR1cyA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5TY29wZShhZ2VuZGEpKSByZXR1cm4gc3RhdHVzXG5cbiAgICBpZiAoXCJzZXNzaW9uXCIgaW4gYWdlbmRhKSBkZWxldGUgYWdlbmRhLnNlc3Npb25cblxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLmxvb2t1cFNlc3Npb24oYWdlbmRhLnRpbWVzdGFtcERlYnV0LnN1YnN0cigwLCAxMCkpXG4gICAgaWYgKHNlc3Npb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgYWdlbmRhLnNlc3Npb24gPSBzZXNzaW9uXG4gICAgICB0aGlzLm1heWJlVXBncmFkZVNjaGVtYVZlcnNpb24oYWdlbmRhKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsT0FBT0EsY0FBYyxNQUFNLHNCQUFzQjtBQUFBLFNBQ3hDQyxVQUFVLDZCQUVuQjtBQUNBLE1BQU1DLEdBQUcsR0FDUCxpbkJBQWluQjtBQUVubkIsU0FBU0MsYUFBYUEsQ0FBQ0MsQ0FBUyxFQUFFQyxDQUFTLEVBQUU7RUFDM0MsSUFBSUQsQ0FBQyxHQUFHQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7RUFDcEIsSUFBSUQsQ0FBQyxHQUFHQyxDQUFDLEVB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YUFBYSxDQUFDVixLQUFLLENBQUM7SUFDekMsSUFBSWlCLE9BQU8sSUFBSSxJQUFJLEVBQUU7TUFDbkIsT0FBTztRQUFFYyxNQUFNLEVBQUUsY0FBYztRQUFFQyxJQUFJLEVBQUUsQ0FBQyxHQUFHaEMsS0FBSyxzQkFBc0I7TUFBRSxDQUFDO0lBQzNFLENBQUMsTUFBTTtNQUNMLE9BQU87UUFBRStCLE1BQU0sRUFBRSxJQUFJO1FBQUVDLElBQUksRUFBRSxDQUFDLEVBQUU7TUFBRSxDQUFDO0lBQ3JDO0VBQ0Y7RUFFQUMseUJBQXlCQSxDQUFDWixNQUFXLEVBQUU7SUFDckMsSUFBSUEsTUFBTSxDQUFDYSxhQUFhLEtBQUtWLFNBQVMsRUFBRTtNQUN0QyxNQUFNVyxPQUFPLEdBQUdkLE1BQU0sQ0FBQ2EsYUFBYSxDQUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2xELElBQUl6RCxjQUFjLENBQUN3RCxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQzNDO0lBQ0FkLE1BQU0sQ0FBQ2EsYUFBYSxHQUFHLFlBQVk7RUFDckM7RUFFQSxNQUFNRyxHQUFHQSxDQUFDaEIsTUFBVyxFQUFFUSxTQUFjLEVBQWdCO0lBQ25ELElBQUlFLE1BQU07SUFDVixJQUFJLFlBQVksSUFBSVYsTUFBTSxFQUFFO01BQzFCO01BQ0EsT0FBT0EsTUFBTSxDQUFDaUIsVUFBVTtNQUN4QlAsTUFBTSxHQUFHLElBQUk7SUFDZixDQUFDLE1BQU07TUFDTDtNQUNBQSxNQUFNLEdBQUcsSUFBSTtJQUNmO0lBRUEsSUFBSSxDQUFDLElBQUksQ0FBQ1gsT0FBTyxDQUFDQyxNQUFNLENBQUMsRUFBRSxPQUFPVSxNQUFNO0lBRXhDLElBQUksU0FBUyxJQUFJVixNQUFNLEVBQUUsT0FBT0EsTUFBTSxDQUFDSixPQUFPO0lBRTlDLE1BQU1BLE9BQU8sR0FBRyxJQUFJLENBQUNQLGFBQWEsQ0FBQ1csTUFBTSxDQUFDUyxjQUFjLENBQUM3QixNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLElBQUlnQixPQUFPLElBQUksSUFBSSxFQUFFO01BQ25CLE9BQU8sSUFBSTtJQUNiLENBQUMsTUFBTTtNQUNMSSxNQUFNLENBQUNKLE9BQU8sR0FBR0EsT0FBTztNQUN4QixJQUFJLENBQUNnQix5QkFBeUIsQ0FBQ1osTUFBTSxDQUFDO01BQ3RDLE9BQU8sSUFBSTtJQUNiO0VBQ0Y7QUFDRiIsImlnbm9yZUxpc3QiOltdfQ==