@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -0,0 +1,150 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ import versionCompare from "tiny-version-compare";
4
+ import fetch from "node-fetch";
5
+ import { BasePlugin } from "../bugs/index.mjs"; // https://www.wikidata.org/wiki/Wikidata:WikiProject_France/Assembl%C3%A9e_Nationale#Legislative_session
6
+
7
+ 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";
8
+
9
+ function compareString(a, b) {
10
+ if (a < b) return -1;
11
+ if (a > b) return 1;
12
+ return 0;
13
+ }
14
+
15
+ export class Plugin extends BasePlugin {
16
+ constructor(options) {
17
+ super(options, "agenda-00011");
18
+
19
+ _defineProperty(this, "sessions", void 0);
20
+
21
+ _defineProperty(this, "fetch", void 0);
22
+
23
+ this.fetch = fetch;
24
+ }
25
+
26
+ async preFix() {
27
+ return this.setSessions();
28
+ }
29
+
30
+ async preCheck() {
31
+ return this.setSessions();
32
+ }
33
+
34
+ async setSessions() {
35
+ const sessions = (await this.fetchSessions()).sort((a, b) => compareString(a["start_time"]["value"], b["start_time"]["value"]));
36
+ this.sessions = sessions.map(s => {
37
+ return {
38
+ label: s["label"]["value"].replace(/\s+en france/i, ""),
39
+ debut: s["start_time"]["value"].substr(0, 10),
40
+ fin: s["end_time"]["value"].substr(0, 10)
41
+ };
42
+ });
43
+ }
44
+
45
+ async get(url, headers) {
46
+ return this.fetch(url, headers);
47
+ }
48
+
49
+ async fetchSessions() {
50
+ const response = await this.get(url, {
51
+ headers: {
52
+ Accept: "application/json"
53
+ }
54
+ });
55
+ if (!response.ok) throw response;
56
+ const payload = await response.json();
57
+ return payload["results"]["bindings"];
58
+ }
59
+
60
+ lookupSession(debut) {
61
+ const max = this.sessions.length - 1;
62
+ const min = 0;
63
+ let h = max;
64
+ let m;
65
+ let l = min;
66
+ let session;
67
+ let ok;
68
+
69
+ do {
70
+ m = Math.floor((l + h) / 2);
71
+ session = this.sessions[m];
72
+ ok = session.debut <= debut && debut <= session.fin;
73
+
74
+ if (!ok) {
75
+ if (l == m && m == h) // in between sessions
76
+ return null;
77
+
78
+ if (debut < session.debut) {
79
+ if (m <= min) return null;
80
+ h = m;
81
+ } else if (debut > session.fin) {
82
+ if (m >= max) return null;
83
+ l = l == m ? h : m;
84
+ }
85
+ }
86
+ } while (!ok);
87
+
88
+ return session;
89
+ }
90
+
91
+ inScope(agenda) {
92
+ if (agenda.xsiType != "seance_type" || agenda.lieu !== undefined && agenda.lieu.code != "CG" && agenda.lieu.code != "AN") return false;
93
+ if (agenda.cycleDeVie.etat != "Confirmé") return false;
94
+ return true;
95
+ }
96
+
97
+ async check(agenda, _filename) {
98
+ if (!this.inScope(agenda)) return null;
99
+ const debut = agenda.timestampDebut.substr(0, 10);
100
+ const session = this.lookupSession(debut);
101
+
102
+ if (session == null) {
103
+ return {
104
+ status: "needs-fixing",
105
+ info: [`${debut} is not in a session`]
106
+ };
107
+ } else {
108
+ return {
109
+ status: "ok",
110
+ info: [""]
111
+ };
112
+ }
113
+ }
114
+
115
+ maybeUpgradeSchemaVersion(agenda) {
116
+ if (agenda.schemaVersion !== undefined) {
117
+ const version = agenda.schemaVersion.split("-")[1];
118
+ if (versionCompare(version, "1.0") == 1) return;
119
+ }
120
+
121
+ agenda.schemaVersion = "agenda-1.1";
122
+ }
123
+
124
+ async fix(agenda, _filename) {
125
+ let status;
126
+
127
+ if ("sessionRef" in agenda) {
128
+ // sessionRef is undefined and must be removed
129
+ delete agenda.sessionRef;
130
+ status = true;
131
+ } else {
132
+ // if there is no sessionRef to remove, file which is not in scope does not need to be rewritten
133
+ status = null;
134
+ }
135
+
136
+ if (!this.inScope(agenda)) return status;
137
+ if ("session" in agenda) delete agenda.session;
138
+ const session = this.lookupSession(agenda.timestampDebut.substr(0, 10));
139
+
140
+ if (session == null) {
141
+ return null;
142
+ } else {
143
+ agenda.session = session;
144
+ this.maybeUpgradeSchemaVersion(agenda);
145
+ return true;
146
+ }
147
+ }
148
+
149
+ }
150
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uQ29tcGFyZSIsImZldGNoIiwiQmFzZVBsdWdpbiIsInVybCIsImNvbXBhcmVTdHJpbmciLCJhIiwiYiIsIlBsdWdpbiIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInByZUZpeCIsInNldFNlc3Npb25zIiwicHJlQ2hlY2siLCJzZXNzaW9ucyIsImZldGNoU2Vzc2lvbnMiLCJzb3J0IiwibWFwIiwicyIsImxhYmVsIiwicmVwbGFjZSIsImRlYnV0Iiwic3Vic3RyIiwiZmluIiwiZ2V0IiwiaGVhZGVycyIsInJlc3BvbnNlIiwiQWNjZXB0Iiwib2siLCJwYXlsb2FkIiwianNvbiIsImxvb2t1cFNlc3Npb24iLCJtYXgiLCJsZW5ndGgiLCJtaW4iLCJoIiwibSIsImwiLCJzZXNzaW9uIiwiTWF0aCIsImZsb29yIiwiaW5TY29wZSIsImFnZW5kYSIsInhzaVR5cGUiLCJsaWV1IiwidW5kZWZpbmVkIiwiY29kZSIsImN5Y2xlRGVWaWUiLCJldGF0IiwiY2hlY2siLCJfZmlsZW5hbWUiLCJ0aW1lc3RhbXBEZWJ1dCIsInN0YXR1cyIsImluZm8iLCJtYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uIiwic2NoZW1hVmVyc2lvbiIsInZlcnNpb24iLCJzcGxpdCIsImZpeCIsInNlc3Npb25SZWYiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVncy9hZ2VuZGEtMDAwMTEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZlcnNpb25Db21wYXJlIGZyb20gXCJ0aW55LXZlcnNpb24tY29tcGFyZVwiXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHsgQmFzZVBsdWdpbiB9IGZyb20gXCIuLi9idWdzXCJcblxuLy8gaHR0cHM6Ly93d3cud2lraWRhdGEub3JnL3dpa2kvV2lraWRhdGE6V2lraVByb2plY3RfRnJhbmNlL0Fzc2VtYmwlQzMlQTllX05hdGlvbmFsZSNMZWdpc2xhdGl2ZV9zZXNzaW9uXG5jb25zdCB1cmwgPVxuICBcImh0dHBzOi8vcXVlcnkud2lraWRhdGEub3JnL3NwYXJxbD9xdWVyeT1TRUxFQ1QlMjBESVNUSU5DVCUyMCUzRnNlc3Npb24lMjAlM0ZzdGFydF90aW1lJTIwJTNGZW5kX3RpbWUlMjAlM0ZsYWJlbCUyMCUzRmZvbGxvd3MlMjAlM0Zmb2xsb3dlZF9ieSUyMFdIRVJFJTIwJTdCJTBBJTBBJTIwJTIwJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVAzMSUyRndkdCUzQVAyNzkqJTIwd2QlM0FRODczMzc0ODEuJTBBJTIwJTIwJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVA1ODAlMjAlM0ZzdGFydF90aW1lLiUyMCUwQSUyMCUyMCUyME9QVElPTkFMJTIwJTdCJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVA1ODIlMjAlM0ZlbmRfdGltZSUyMCU3RC4lMEElMjAlMjAlMjBPUFRJT05BTCUyMCU3QiUyMCUzRnNlc3Npb24lMjB3ZHQlM0FQMTU1JTIwJTNGZm9sbG93cyUyMCU3RC4lMEElMjAlMjAlMjBPUFRJT05BTCUyMCU3QiUyMCUzRnNlc3Npb24lMjB3ZHQlM0FQMTU2JTIwJTNGZm9sbG93ZWRfYnklMjAlN0QuJTBBJTIwJTIwJTIwT1BUSU9OQUwlMjAlN0IlMjAlM0ZzZXNzaW9uJTIwcmRmcyUzQWxhYmVsJTIwJTNGbGFiZWwlMjBmaWx0ZXIlMjAobGFuZyglM0ZsYWJlbCklMjAlM0QlMjAlMjJmciUyMiklMjAuJTdEJTBBJTdEXCJcblxuZnVuY3Rpb24gY29tcGFyZVN0cmluZyhhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICBpZiAoYSA8IGIpIHJldHVybiAtMVxuICBpZiAoYSA+IGIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW4gZXh0ZW5kcyBCYXNlUGx1Z2luIHtcbiAgc2Vzc2lvbnM6IGFueVxuICBmZXRjaDogYW55XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIob3B0aW9ucywgXCJhZ2VuZGEtMDAwMTFcIilcbiAgICB0aGlzLmZldGNoID0gZmV0Y2hcbiAgfVxuXG4gIGFzeW5jIHByZUZpeCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnNldFNlc3Npb25zKClcbiAgfVxuXG4gIGFzeW5jIHByZUNoZWNrKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0U2Vzc2lvbnMoKVxuICB9XG5cbiAgYXN5bmMgc2V0U2Vzc2lvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzZXNzaW9ucyA9IChhd2FpdCB0aGlzLmZldGNoU2Vzc2lvbnMoKSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICBjb21wYXJlU3RyaW5nKGFbXCJzdGFydF90aW1lXCJdW1widmFsdWVcIl0sIGJbXCJzdGFydF90aW1lXCJdW1widmFsdWVcIl0pLFxuICAgIClcbiAgICB0aGlzLnNlc3Npb25zID0gc2Vzc2lvbnMubWFwKChzOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBzW1wibGFiZWxcIl1bXCJ2YWx1ZVwiXS5yZXBsYWNlKC9cXHMrZW4gZnJhbmNlL2ksIFwiXCIpLFxuICAgICAgICBkZWJ1dDogc1tcInN0YXJ0X3RpbWVcIl1bXCJ2YWx1ZVwiXS5zdWJzdHIoMCwgMTApLFxuICAgICAgICBmaW46IHNbXCJlbmRfdGltZVwiXVtcInZhbHVlXCJdLnN1YnN0cigwLCAxMCksXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldCh1cmw6IHN0cmluZywgaGVhZGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaCh1cmwsIGhlYWRlcnMpXG4gIH1cblxuICBhc3luYyBmZXRjaFNlc3Npb25zKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldCh1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgIH0pXG4gICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgcmVzcG9uc2VcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgcmV0dXJuIHBheWxvYWRbXCJyZXN1bHRzXCJdW1wiYmluZGluZ3NcIl1cbiAgfVxuXG4gIGxvb2t1cFNlc3Npb24oZGVidXQ6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5zZXNzaW9ucy5sZW5ndGggLSAxXG4gICAgY29uc3QgbWluID0gMFxuICAgIGxldCBoID0gbWF4XG4gICAgbGV0IG1cbiAgICBsZXQgbCA9IG1pblxuICAgIGxldCBzZXNzaW9uXG4gICAgbGV0IG9rXG4gICAgZG8ge1xuICAgICAgbSA9IE1hdGguZmxvb3IoKGwgKyBoKSAvIDIpXG4gICAgICBzZXNzaW9uID0gdGhpcy5zZXNzaW9uc1ttXVxuICAgICAgb2sgPSBzZXNzaW9uLmRlYnV0IDw9IGRlYnV0ICYmIGRlYnV0IDw9IHNlc3Npb24uZmluXG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGlmIChsID09IG0gJiYgbSA9PSBoKVxuICAgICAgICAgIC8vIGluIGJldHdlZW4gc2Vzc2lvbnNcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICBpZiAoZGVidXQgPCBzZXNzaW9uLmRlYnV0KSB7XG4gICAgICAgICAgaWYgKG0gPD0gbWluKSByZXR1cm4gbnVsbFxuICAgICAgICAgIGggPSBtXG4gICAgICAgIH0gZWxzZSBpZiAoZGVidXQgPiBzZXNzaW9uLmZpbikge1xuICAgICAgICAgIGlmIChtID49IG1heCkgcmV0dXJuIG51bGxcbiAgICAgICAgICBsID0gbCA9PSBtID8gaCA6IG1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCFvaylcbiAgICByZXR1cm4gc2Vzc2lvblxuICB9XG5cbiAgaW5TY29wZShhZ2VuZGE6IGFueSkge1xuICAgIGlmIChcbiAgICAgIGFnZW5kYS54c2lUeXBlICE9IFwic2VhbmNlX3R5cGVcIiB8fFxuICAgICAgKGFnZW5kYS5saWV1ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgYWdlbmRhLmxpZXUuY29kZSAhPSBcIkNHXCIgJiZcbiAgICAgICAgYWdlbmRhLmxpZXUuY29kZSAhPSBcIkFOXCIpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGFnZW5kYS5jeWNsZURlVmllLmV0YXQgIT0gXCJDb25maXJtw6lcIikgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIGNoZWNrKGFnZW5kYTogYW55LCBfZmlsZW5hbWU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmluU2NvcGUoYWdlbmRhKSkgcmV0dXJuIG51bGxcbiAgICBjb25zdCBkZWJ1dCA9IGFnZW5kYS50aW1lc3RhbXBEZWJ1dC5zdWJzdHIoMCwgMTApXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMubG9va3VwU2Vzc2lvbihkZWJ1dClcbiAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwibmVlZHMtZml4aW5nXCIsIGluZm86IFtgJHtkZWJ1dH0gaXMgbm90IGluIGEgc2Vzc2lvbmBdIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcIm9rXCIsIGluZm86IFtcIlwiXSB9XG4gICAgfVxuICB9XG5cbiAgbWF5YmVVcGdyYWRlU2NoZW1hVmVyc2lvbihhZ2VuZGE6IGFueSkge1xuICAgIGlmIChhZ2VuZGEuc2NoZW1hVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gYWdlbmRhLnNjaGVtYVZlcnNpb24uc3BsaXQoXCItXCIpWzFdXG4gICAgICBpZiAodmVyc2lvbkNvbXBhcmUodmVyc2lvbiwgXCIxLjBcIikgPT0gMSkgcmV0dXJuXG4gICAgfVxuICAgIGFnZW5kYS5zY2hlbWFWZXJzaW9uID0gXCJhZ2VuZGEtMS4xXCJcbiAgfVxuXG4gIGFzeW5jIGZpeChhZ2VuZGE6IGFueSwgX2ZpbGVuYW1lOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBzdGF0dXNcbiAgICBpZiAoXCJzZXNzaW9uUmVmXCIgaW4gYWdlbmRhKSB7XG4gICAgICAvLyBzZXNzaW9uUmVmIGlzIHVuZGVmaW5lZCBhbmQgbXVzdCBiZSByZW1vdmVkXG4gICAgICBkZWxldGUgYWdlbmRhLnNlc3Npb25SZWZcbiAgICAgIHN0YXR1cyA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gc2Vzc2lvblJlZiB0byByZW1vdmUsIGZpbGUgd2hpY2ggaXMgbm90IGluIHNjb3BlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gICAgICBzdGF0dXMgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmluU2NvcGUoYWdlbmRhKSkgcmV0dXJuIHN0YXR1c1xuXG4gICAgaWYgKFwic2Vzc2lvblwiIGluIGFnZW5kYSkgZGVsZXRlIGFnZW5kYS5zZXNzaW9uXG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5sb29rdXBTZXNzaW9uKGFnZW5kYS50aW1lc3RhbXBEZWJ1dC5zdWJzdHIoMCwgMTApKVxuICAgIGlmIChzZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIGFnZW5kYS5zZXNzaW9uID0gc2Vzc2lvblxuICAgICAgdGhpcy5tYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uKGFnZW5kYSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBT0EsY0FBUCxNQUEyQixzQkFBM0I7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLFlBQWxCO1NBQ1NDLFUsNkJBRVQ7O0FBQ0EsTUFBTUMsR0FBRyxHQUNQLGluQkFERjs7QUFHQSxTQUFTQyxhQUFULENBQXVCQyxDQUF2QixFQUFrQ0MsQ0FBbEMsRUFBNkM7RUFDM0MsSUFBSUQsQ0FBQyxHQUFHQyxDQUFSLEVBQVcsT0FBTyxDQUFD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