@foss.global/codefeed 1.6.4 → 1.7.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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +36 -10
- package/dist_ts/index.js +309 -211
- package/dist_ts/interfaces/index.d.ts +1 -0
- package/dist_ts/plugins.d.ts +8 -0
- package/dist_ts/plugins.js +11 -0
- package/package.json +11 -10
- package/readme.md +70 -101
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +358 -276
- package/ts/interfaces/index.ts +1 -0
- package/ts/{codefeed.plugins.ts → plugins.ts} +2 -0
package/dist_ts/index.js
CHANGED
|
@@ -1,37 +1,244 @@
|
|
|
1
|
-
import * as plugins from './
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
2
|
export class CodeFeed {
|
|
3
|
-
constructor(baseUrl, token, lastRunTimestamp) {
|
|
4
|
-
this.
|
|
5
|
-
|
|
3
|
+
constructor(baseUrl, token, lastRunTimestamp, options) {
|
|
4
|
+
this.pageLimit = 50;
|
|
5
|
+
// Raw changelog content for the current repository
|
|
6
|
+
this.changelogContent = '';
|
|
7
|
+
// In-memory stateful cache of commits
|
|
8
|
+
this.enableCache = false;
|
|
9
|
+
this.cache = [];
|
|
10
|
+
// enable or disable npm publishedOnNpm checks (true by default)
|
|
11
|
+
this.enableNpmCheck = true;
|
|
12
|
+
// return only tagged commits (false by default)
|
|
13
|
+
this.enableTaggedOnly = false;
|
|
6
14
|
this.baseUrl = baseUrl;
|
|
7
15
|
this.token = token;
|
|
8
16
|
this.lastRunTimestamp =
|
|
9
|
-
lastRunTimestamp
|
|
17
|
+
lastRunTimestamp ?? new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
18
|
+
// configure stateful caching
|
|
19
|
+
this.enableCache = options?.enableCache ?? false;
|
|
20
|
+
this.cacheWindowMs = options?.cacheWindowMs;
|
|
21
|
+
this.enableNpmCheck = options?.enableNpmCheck ?? true;
|
|
22
|
+
this.enableTaggedOnly = options?.taggedOnly ?? false;
|
|
23
|
+
this.orgAllowlist = options?.orgAllowlist;
|
|
24
|
+
this.orgDenylist = options?.orgDenylist;
|
|
25
|
+
this.repoAllowlist = options?.repoAllowlist;
|
|
26
|
+
this.repoDenylist = options?.repoDenylist;
|
|
27
|
+
this.untilTimestamp = options?.untilTimestamp;
|
|
28
|
+
this.verbose = options?.verbose ?? false;
|
|
29
|
+
this.cache = [];
|
|
30
|
+
// npm registry instance for version lookups
|
|
31
|
+
this.npmRegistry = new plugins.smartnpm.NpmRegistry();
|
|
10
32
|
console.log('CodeFeed initialized with last run timestamp:', this.lastRunTimestamp);
|
|
11
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Fetch all new commits (since lastRunTimestamp) across all orgs and repos.
|
|
36
|
+
*/
|
|
37
|
+
async fetchAllCommitsFromInstance() {
|
|
38
|
+
// Controlled concurrency with AsyncExecutionStack
|
|
39
|
+
const stack = new plugins.lik.AsyncExecutionStack();
|
|
40
|
+
stack.setNonExclusiveMaxConcurrency(20);
|
|
41
|
+
// determine since timestamp for this run (stateful caching)
|
|
42
|
+
let effectiveSince = this.lastRunTimestamp;
|
|
43
|
+
if (this.enableCache && this.cache.length > 0) {
|
|
44
|
+
// use newest timestamp in cache to fetch only tail
|
|
45
|
+
effectiveSince = this.cache.reduce((max, c) => (c.timestamp > max ? c.timestamp : max), effectiveSince);
|
|
46
|
+
}
|
|
47
|
+
// 1) get all organizations
|
|
48
|
+
let orgs = await this.fetchAllOrganizations();
|
|
49
|
+
// apply allow/deny filters
|
|
50
|
+
if (this.orgAllowlist && this.orgAllowlist.length > 0) {
|
|
51
|
+
orgs = orgs.filter((o) => this.orgAllowlist.includes(o));
|
|
52
|
+
}
|
|
53
|
+
if (this.orgDenylist && this.orgDenylist.length > 0) {
|
|
54
|
+
orgs = orgs.filter((o) => !this.orgDenylist.includes(o));
|
|
55
|
+
}
|
|
56
|
+
// 2) fetch repos per org in parallel
|
|
57
|
+
const repoLists = await Promise.all(orgs.map((org) => stack.getNonExclusiveExecutionSlot(() => this.fetchRepositoriesForOrg(org))));
|
|
58
|
+
// flatten to [{ owner, name }]
|
|
59
|
+
let allRepos = orgs.flatMap((org, i) => repoLists[i].map((r) => ({ owner: org, name: r.name })));
|
|
60
|
+
// apply repo allow/deny filters using slug "org/repo"
|
|
61
|
+
if (this.repoAllowlist && this.repoAllowlist.length > 0) {
|
|
62
|
+
const allow = new Set(this.repoAllowlist.map((s) => s.toLowerCase()));
|
|
63
|
+
allRepos = allRepos.filter(({ owner, name }) => allow.has(`${owner}/${name}`.toLowerCase()));
|
|
64
|
+
}
|
|
65
|
+
if (this.repoDenylist && this.repoDenylist.length > 0) {
|
|
66
|
+
const deny = new Set(this.repoDenylist.map((s) => s.toLowerCase()));
|
|
67
|
+
allRepos = allRepos.filter(({ owner, name }) => !deny.has(`${owner}/${name}`.toLowerCase()));
|
|
68
|
+
}
|
|
69
|
+
// 3) probe latest commit per repo and fetch full list only if new commits exist
|
|
70
|
+
const commitJobs = allRepos.map(({ owner, name }) => stack.getNonExclusiveExecutionSlot(async () => {
|
|
71
|
+
try {
|
|
72
|
+
// 3a) Probe the most recent commit (limit=1)
|
|
73
|
+
const probeResp = await this.fetchFunction(`/api/v1/repos/${owner}/${name}/commits?limit=1`, { headers: this.token ? { Authorization: `token ${this.token}` } : {} });
|
|
74
|
+
if (!probeResp.ok) {
|
|
75
|
+
throw new Error(`Probe failed for ${owner}/${name}: ${probeResp.statusText}`);
|
|
76
|
+
}
|
|
77
|
+
const probeData = await probeResp.json();
|
|
78
|
+
// If no commits or no new commits since last run, skip
|
|
79
|
+
if (probeData.length === 0 ||
|
|
80
|
+
new Date(probeData[0].commit.author.date).getTime() <=
|
|
81
|
+
new Date(effectiveSince).getTime()) {
|
|
82
|
+
return { owner, name, commits: [] };
|
|
83
|
+
}
|
|
84
|
+
// 3b) Fetch commits since last run
|
|
85
|
+
const commits = await this.fetchRecentCommitsForRepo(owner, name, effectiveSince);
|
|
86
|
+
return { owner, name, commits };
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
console.error(`Failed to fetch commits for ${owner}/${name}:`, e.message);
|
|
90
|
+
return { owner, name, commits: [] };
|
|
91
|
+
}
|
|
92
|
+
}));
|
|
93
|
+
const commitResults = await Promise.all(commitJobs);
|
|
94
|
+
// 4) build new commit entries with tagging, npm and changelog support
|
|
95
|
+
const newResults = [];
|
|
96
|
+
let reposWithNewCommits = 0;
|
|
97
|
+
for (const { owner, name, commits } of commitResults) {
|
|
98
|
+
// skip repos with no new commits
|
|
99
|
+
if (commits.length === 0) {
|
|
100
|
+
this.changelogContent = '';
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
reposWithNewCommits++;
|
|
104
|
+
// load changelog for this repo
|
|
105
|
+
await this.loadChangelogFromRepo(owner, name);
|
|
106
|
+
// fetch tags for this repo
|
|
107
|
+
let taggedShas;
|
|
108
|
+
let tagNameBySha;
|
|
109
|
+
try {
|
|
110
|
+
const tagInfo = await this.fetchTags(owner, name);
|
|
111
|
+
taggedShas = tagInfo.shas;
|
|
112
|
+
tagNameBySha = tagInfo.map;
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
console.error(`Failed to fetch tags for ${owner}/${name}:`, e.message);
|
|
116
|
+
taggedShas = new Set();
|
|
117
|
+
tagNameBySha = new Map();
|
|
118
|
+
}
|
|
119
|
+
// fetch npm package info only if any new commits correspond to a tag
|
|
120
|
+
const hasTaggedCommit = commits.some((c) => taggedShas.has(c.sha));
|
|
121
|
+
let pkgInfo = null;
|
|
122
|
+
if (hasTaggedCommit && this.enableNpmCheck) {
|
|
123
|
+
try {
|
|
124
|
+
pkgInfo = await this.npmRegistry.getPackageInfo(`@${owner}/${name}`);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
console.error(`Failed to fetch package info for ${owner}/${name}:`, e.message);
|
|
128
|
+
pkgInfo = null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// build commit entries
|
|
132
|
+
for (const c of commits) {
|
|
133
|
+
const isTagged = taggedShas.has(c.sha);
|
|
134
|
+
// derive version from tag name if present (strip leading 'v')
|
|
135
|
+
let versionFromTag;
|
|
136
|
+
if (isTagged) {
|
|
137
|
+
const tagName = tagNameBySha.get(c.sha);
|
|
138
|
+
if (tagName) {
|
|
139
|
+
versionFromTag = tagName.startsWith('v') ? tagName.substring(1) : tagName;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const publishedOnNpm = isTagged && pkgInfo && versionFromTag
|
|
143
|
+
? pkgInfo.allVersions.some((v) => v.version === versionFromTag)
|
|
144
|
+
: false;
|
|
145
|
+
let changelogEntry;
|
|
146
|
+
if (this.changelogContent) {
|
|
147
|
+
if (versionFromTag) {
|
|
148
|
+
changelogEntry = this.getChangelogForVersion(versionFromTag);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// optionally enforce an upper bound on commit timestamps
|
|
152
|
+
if (this.untilTimestamp) {
|
|
153
|
+
const ts = new Date(c.commit.author.date).getTime();
|
|
154
|
+
if (ts > new Date(this.untilTimestamp).getTime()) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
newResults.push({
|
|
159
|
+
baseUrl: this.baseUrl,
|
|
160
|
+
org: owner,
|
|
161
|
+
repo: name,
|
|
162
|
+
timestamp: c.commit.author.date,
|
|
163
|
+
prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(new Date(c.commit.author.date).getTime()),
|
|
164
|
+
hash: c.sha,
|
|
165
|
+
commitMessage: c.commit.message,
|
|
166
|
+
tagged: isTagged,
|
|
167
|
+
publishedOnNpm,
|
|
168
|
+
changelog: changelogEntry,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// if caching is enabled, merge into in-memory cache and return full cache
|
|
173
|
+
if (this.enableCache) {
|
|
174
|
+
const existingHashes = new Set(this.cache.map((c) => c.hash));
|
|
175
|
+
const uniqueNew = newResults.filter((c) => !existingHashes.has(c.hash));
|
|
176
|
+
this.cache.push(...uniqueNew);
|
|
177
|
+
// trim commits older than window
|
|
178
|
+
if (this.cacheWindowMs !== undefined) {
|
|
179
|
+
const cutoff = Date.now() - this.cacheWindowMs;
|
|
180
|
+
this.cache = this.cache.filter((c) => new Date(c.timestamp).getTime() >= cutoff);
|
|
181
|
+
}
|
|
182
|
+
// advance lastRunTimestamp to now
|
|
183
|
+
this.lastRunTimestamp = new Date().toISOString();
|
|
184
|
+
// sort descending by timestamp
|
|
185
|
+
this.cache.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
186
|
+
// apply tagged-only filter if requested
|
|
187
|
+
if (this.enableTaggedOnly) {
|
|
188
|
+
return this.cache.filter((c) => c.tagged === true);
|
|
189
|
+
}
|
|
190
|
+
if (this.verbose) {
|
|
191
|
+
console.log(`[CodeFeed] orgs=${orgs.length} repos=${allRepos.length} reposWithNew=${reposWithNewCommits} commits=${this.cache.length} (cached)`);
|
|
192
|
+
}
|
|
193
|
+
return this.cache;
|
|
194
|
+
}
|
|
195
|
+
// no caching: apply tagged-only filter if requested
|
|
196
|
+
// sort and dedupe
|
|
197
|
+
const seen = new Set();
|
|
198
|
+
const unique = newResults.filter((c) => {
|
|
199
|
+
if (seen.has(c.hash))
|
|
200
|
+
return false;
|
|
201
|
+
seen.add(c.hash);
|
|
202
|
+
return true;
|
|
203
|
+
});
|
|
204
|
+
unique.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
205
|
+
const result = this.enableTaggedOnly ? unique.filter((c) => c.tagged === true) : unique;
|
|
206
|
+
if (this.verbose) {
|
|
207
|
+
console.log(`[CodeFeed] orgs=${orgs.length} repos=${allRepos.length} reposWithNew=${reposWithNewCommits} commits=${result.length}`);
|
|
208
|
+
}
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
12
211
|
/**
|
|
13
212
|
* Load the changelog directly from the Gitea repository.
|
|
14
213
|
*/
|
|
15
214
|
async loadChangelogFromRepo(owner, repo) {
|
|
16
|
-
const url = `/api/v1/repos/${owner}/${repo}/contents/changelog.md`;
|
|
17
215
|
const headers = {};
|
|
18
|
-
if (this.token)
|
|
216
|
+
if (this.token)
|
|
19
217
|
headers['Authorization'] = `token ${this.token}`;
|
|
218
|
+
const candidates = [
|
|
219
|
+
'CHANGELOG.md',
|
|
220
|
+
'changelog.md',
|
|
221
|
+
'Changelog.md',
|
|
222
|
+
'docs/CHANGELOG.md',
|
|
223
|
+
];
|
|
224
|
+
for (const path of candidates) {
|
|
225
|
+
const url = `/api/v1/repos/${owner}/${repo}/contents/${encodeURIComponent(path)}`;
|
|
226
|
+
const response = await this.fetchFunction(url, { headers });
|
|
227
|
+
if (!response.ok) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const data = await response.json();
|
|
232
|
+
if (data && data.content) {
|
|
233
|
+
this.changelogContent = Buffer.from(data.content, 'base64').toString('utf8');
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// continue trying others
|
|
239
|
+
}
|
|
20
240
|
}
|
|
21
|
-
|
|
22
|
-
if (!response.ok) {
|
|
23
|
-
console.error(`Could not fetch CHANGELOG.md from ${owner}/${repo}: ${response.status} ${response.statusText}`);
|
|
24
|
-
this.changelogContent = '';
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const data = await response.json();
|
|
28
|
-
if (!data.content) {
|
|
29
|
-
console.warn(`No content field found in response for ${owner}/${repo}/changelog.md`);
|
|
30
|
-
this.changelogContent = '';
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const decodedContent = Buffer.from(data.content, 'base64').toString('utf8');
|
|
34
|
-
this.changelogContent = decodedContent;
|
|
241
|
+
this.changelogContent = '';
|
|
35
242
|
}
|
|
36
243
|
/**
|
|
37
244
|
* Parse the changelog to find the entry for a given version.
|
|
@@ -62,234 +269,125 @@ export class CodeFeed {
|
|
|
62
269
|
}
|
|
63
270
|
return changelogLines.join('\n').trim();
|
|
64
271
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
throw new Error(`Failed to fetch organizations: ${response.statusText}`);
|
|
72
|
-
}
|
|
73
|
-
const data = await response.json();
|
|
74
|
-
return data.map((org) => org.username);
|
|
75
|
-
}
|
|
76
|
-
async fetchOrgRssFeed(optionsArg) {
|
|
77
|
-
let rssUrl;
|
|
78
|
-
if (optionsArg.orgName && !optionsArg.repoName) {
|
|
79
|
-
rssUrl = `/${optionsArg.orgName}.atom`;
|
|
80
|
-
}
|
|
81
|
-
else if (optionsArg.orgName && optionsArg.repoName) {
|
|
82
|
-
rssUrl = `/${optionsArg.orgName}/${optionsArg.repoName}.atom`;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
throw new Error('Invalid arguments provided to fetchOrgRssFeed.');
|
|
86
|
-
}
|
|
87
|
-
const response = await this.fetchFunction(rssUrl, {});
|
|
88
|
-
if (!response.ok) {
|
|
89
|
-
throw new Error(`Failed to fetch RSS feed for organization ${optionsArg.orgName}/${optionsArg.repoName}: ${response.statusText}`);
|
|
90
|
-
}
|
|
91
|
-
const rssText = await response.text();
|
|
92
|
-
const rssData = this.smartxmlInstance.parseXmlToObject(rssText);
|
|
93
|
-
return rssData.feed.entry || [];
|
|
94
|
-
}
|
|
95
|
-
async hasNewActivity(optionsArg) {
|
|
96
|
-
const entries = await this.fetchOrgRssFeed(optionsArg);
|
|
97
|
-
return entries.some((entry) => {
|
|
98
|
-
const updated = new Date(entry.updated);
|
|
99
|
-
return updated > new Date(this.lastRunTimestamp);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
async fetchAllRepositories() {
|
|
272
|
+
/**
|
|
273
|
+
* Fetch all tags for a given repo and return the set of tagged commit SHAs
|
|
274
|
+
*/
|
|
275
|
+
async fetchTags(owner, repo) {
|
|
276
|
+
const taggedShas = new Set();
|
|
277
|
+
const tagNameBySha = new Map();
|
|
103
278
|
let page = 1;
|
|
104
|
-
const allRepos = [];
|
|
105
279
|
while (true) {
|
|
106
|
-
const url = `/api/v1/repos/
|
|
280
|
+
const url = `/api/v1/repos/${owner}/${repo}/tags?limit=${this.pageLimit}&page=${page}`;
|
|
107
281
|
const resp = await this.fetchFunction(url, {
|
|
108
282
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
|
109
283
|
});
|
|
110
284
|
if (!resp.ok) {
|
|
111
|
-
|
|
285
|
+
console.error(`Failed to fetch tags for ${owner}/${repo}: ${resp.status} ${resp.statusText}`);
|
|
286
|
+
return { shas: taggedShas, map: tagNameBySha };
|
|
112
287
|
}
|
|
113
288
|
const data = await resp.json();
|
|
114
|
-
|
|
115
|
-
if (data.data.length < 50) {
|
|
289
|
+
if (data.length === 0)
|
|
116
290
|
break;
|
|
291
|
+
for (const t of data) {
|
|
292
|
+
const sha = t.commit?.sha;
|
|
293
|
+
if (sha) {
|
|
294
|
+
taggedShas.add(sha);
|
|
295
|
+
if (t.name)
|
|
296
|
+
tagNameBySha.set(sha, t.name);
|
|
297
|
+
}
|
|
117
298
|
}
|
|
299
|
+
if (data.length < this.pageLimit)
|
|
300
|
+
break;
|
|
118
301
|
page++;
|
|
119
302
|
}
|
|
120
|
-
return
|
|
303
|
+
return { shas: taggedShas, map: tagNameBySha };
|
|
121
304
|
}
|
|
122
|
-
async
|
|
305
|
+
async fetchAllOrganizations() {
|
|
306
|
+
const headers = this.token ? { Authorization: `token ${this.token}` } : {};
|
|
123
307
|
let page = 1;
|
|
124
|
-
const
|
|
308
|
+
const orgs = [];
|
|
125
309
|
while (true) {
|
|
126
|
-
const
|
|
127
|
-
const resp = await this.fetchFunction(url, {
|
|
128
|
-
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
|
129
|
-
});
|
|
310
|
+
const resp = await this.fetchFunction(`/api/v1/orgs?limit=${this.pageLimit}&page=${page}`, { headers });
|
|
130
311
|
if (!resp.ok) {
|
|
131
|
-
|
|
132
|
-
throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`);
|
|
312
|
+
throw new Error(`Failed to fetch organizations: ${resp.status} ${resp.statusText}`);
|
|
133
313
|
}
|
|
134
314
|
const data = await resp.json();
|
|
135
|
-
|
|
136
|
-
|
|
315
|
+
if (data.length === 0)
|
|
316
|
+
break;
|
|
317
|
+
orgs.push(...data.map((o) => o.username));
|
|
318
|
+
if (data.length < this.pageLimit)
|
|
137
319
|
break;
|
|
138
|
-
}
|
|
139
320
|
page++;
|
|
140
321
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
322
|
+
return orgs;
|
|
323
|
+
}
|
|
324
|
+
async fetchRepositoriesForOrg(org) {
|
|
325
|
+
const headers = this.token ? { Authorization: `token ${this.token}` } : {};
|
|
326
|
+
let page = 1;
|
|
327
|
+
const repos = [];
|
|
328
|
+
while (true) {
|
|
329
|
+
const resp = await this.fetchFunction(`/api/v1/orgs/${org}/repos?limit=${this.pageLimit}&page=${page}`, { headers });
|
|
330
|
+
if (!resp.ok) {
|
|
331
|
+
throw new Error(`Failed to fetch repositories for ${org}: ${resp.status} ${resp.statusText}`);
|
|
145
332
|
}
|
|
333
|
+
const data = await resp.json();
|
|
334
|
+
if (data.length === 0)
|
|
335
|
+
break;
|
|
336
|
+
repos.push(...data);
|
|
337
|
+
if (data.length < this.pageLimit)
|
|
338
|
+
break;
|
|
339
|
+
page++;
|
|
146
340
|
}
|
|
147
|
-
return
|
|
341
|
+
return repos;
|
|
148
342
|
}
|
|
149
|
-
async fetchRecentCommitsForRepo(owner, repo) {
|
|
150
|
-
const
|
|
343
|
+
async fetchRecentCommitsForRepo(owner, repo, sinceTimestamp) {
|
|
344
|
+
const since = sinceTimestamp ?? this.lastRunTimestamp;
|
|
345
|
+
const headers = this.token ? { Authorization: `token ${this.token}` } : {};
|
|
151
346
|
let page = 1;
|
|
152
|
-
const
|
|
347
|
+
const commits = [];
|
|
153
348
|
while (true) {
|
|
154
|
-
const url = `/api/v1/repos/${owner}/${repo}/commits?limit
|
|
155
|
-
const resp = await this.fetchFunction(url, {
|
|
156
|
-
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
|
157
|
-
});
|
|
349
|
+
const url = `/api/v1/repos/${owner}/${repo}/commits?since=${encodeURIComponent(since)}&limit=${this.pageLimit}&page=${page}`;
|
|
350
|
+
const resp = await this.fetchFunction(url, { headers });
|
|
158
351
|
if (!resp.ok) {
|
|
159
|
-
|
|
160
|
-
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
|
|
352
|
+
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.status} ${resp.statusText}`);
|
|
161
353
|
}
|
|
162
354
|
const data = await resp.json();
|
|
163
|
-
if (data.length === 0)
|
|
355
|
+
if (data.length === 0)
|
|
356
|
+
break;
|
|
357
|
+
commits.push(...data);
|
|
358
|
+
if (data.length < this.pageLimit)
|
|
164
359
|
break;
|
|
165
|
-
}
|
|
166
|
-
for (const commit of data) {
|
|
167
|
-
const commitDate = new Date(commit.commit.author.date);
|
|
168
|
-
if (commitDate > twentyFourHoursAgo) {
|
|
169
|
-
recentCommits.push(commit);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
return recentCommits;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
360
|
page++;
|
|
176
361
|
}
|
|
177
|
-
return
|
|
362
|
+
return commits;
|
|
178
363
|
}
|
|
179
|
-
async
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
let
|
|
183
|
-
|
|
184
|
-
console.log(`Checking activity for organization: ${orgName}`);
|
|
364
|
+
async fetchFunction(urlArg, optionsArg = {}) {
|
|
365
|
+
const maxAttempts = 4;
|
|
366
|
+
let attempt = 0;
|
|
367
|
+
let lastError;
|
|
368
|
+
while (attempt < maxAttempts) {
|
|
185
369
|
try {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
370
|
+
const resp = await fetch(`${this.baseUrl}${urlArg}`, optionsArg);
|
|
371
|
+
// retry on 429 and 5xx
|
|
372
|
+
if (resp.status === 429 || resp.status >= 500) {
|
|
373
|
+
const retryAfter = Number(resp.headers.get('retry-after'));
|
|
374
|
+
const backoffMs = retryAfter
|
|
375
|
+
? retryAfter * 1000
|
|
376
|
+
: Math.min(32000, 1000 * Math.pow(2, attempt)) + Math.floor(Math.random() * 250);
|
|
377
|
+
await new Promise((r) => setTimeout(r, backoffMs));
|
|
378
|
+
attempt++;
|
|
191
379
|
continue;
|
|
192
380
|
}
|
|
381
|
+
return resp;
|
|
193
382
|
}
|
|
194
|
-
catch (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const repos = await this.fetchAllRepositories();
|
|
200
|
-
for (const r of repos.filter((repo) => repo.owner.login === orgName)) {
|
|
201
|
-
try {
|
|
202
|
-
const hasActivity = await this.hasNewActivity({
|
|
203
|
-
orgName,
|
|
204
|
-
repoName: r.name,
|
|
205
|
-
});
|
|
206
|
-
if (!hasActivity) {
|
|
207
|
-
console.log(`No new activity for repository: ${orgName}/${r.name}`);
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
console.error(`Error fetching activity for repository ${orgName}/${r.name}:`, error.message);
|
|
213
|
-
continue;
|
|
214
|
-
}
|
|
215
|
-
const org = r.owner.login;
|
|
216
|
-
const repo = r.name;
|
|
217
|
-
console.log(`Processing repository ${org}/${repo}`);
|
|
218
|
-
try {
|
|
219
|
-
const taggedCommitShas = await this.fetchTags(org, repo);
|
|
220
|
-
const commits = await this.fetchRecentCommitsForRepo(org, repo);
|
|
221
|
-
// Load the changelog from this repo.
|
|
222
|
-
await this.loadChangelogFromRepo(org, repo);
|
|
223
|
-
const commitResults = commits.map((c) => {
|
|
224
|
-
const commit = {
|
|
225
|
-
baseUrl: this.baseUrl,
|
|
226
|
-
org,
|
|
227
|
-
repo,
|
|
228
|
-
timestamp: c.commit.author.date,
|
|
229
|
-
prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(new Date(c.commit.author.date).getTime()),
|
|
230
|
-
hash: c.sha,
|
|
231
|
-
commitMessage: c.commit.message,
|
|
232
|
-
tagged: taggedCommitShas.has(c.sha),
|
|
233
|
-
publishedOnNpm: false,
|
|
234
|
-
changelog: undefined,
|
|
235
|
-
};
|
|
236
|
-
return commit;
|
|
237
|
-
});
|
|
238
|
-
if (commitResults.length > 0) {
|
|
239
|
-
try {
|
|
240
|
-
const packageInfo = await this.npmRegistry.getPackageInfo(`@${org}/${repo}`);
|
|
241
|
-
for (const commitResult of commitResults.filter((c) => c.tagged)) {
|
|
242
|
-
const versionCandidate = commitResult.commitMessage.replace('\n', '').trim();
|
|
243
|
-
const correspondingVersion = packageInfo.allVersions.find((versionArg) => {
|
|
244
|
-
return versionArg.version === versionCandidate;
|
|
245
|
-
});
|
|
246
|
-
if (correspondingVersion) {
|
|
247
|
-
commitResult.publishedOnNpm = true;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
console.error(`Failed to fetch package info for ${org}/${repo}:`, error.message);
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
for (const commitResult of commitResults.filter((c) => c.tagged)) {
|
|
256
|
-
const versionCandidate = commitResult.commitMessage.replace('\n', '').trim();
|
|
257
|
-
const changelogEntry = this.getChangelogForVersion(versionCandidate);
|
|
258
|
-
if (changelogEntry) {
|
|
259
|
-
commitResult.changelog = changelogEntry;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
console.error(`Failed to fetch changelog info for ${org}/${repo}:`, error.message);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
allCommits.push(...commitResults);
|
|
268
|
-
}
|
|
269
|
-
catch (error) {
|
|
270
|
-
console.error(`Skipping repository ${org}/${repo} due to error:`, error.message);
|
|
271
|
-
}
|
|
383
|
+
catch (e) {
|
|
384
|
+
lastError = e;
|
|
385
|
+
const backoffMs = Math.min(32000, 1000 * Math.pow(2, attempt)) + Math.floor(Math.random() * 250);
|
|
386
|
+
await new Promise((r) => setTimeout(r, backoffMs));
|
|
387
|
+
attempt++;
|
|
272
388
|
}
|
|
273
389
|
}
|
|
274
|
-
|
|
275
|
-
allCommits = allCommits
|
|
276
|
-
.filter((commitArg) => commitArg.tagged)
|
|
277
|
-
.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
278
|
-
console.log(`Filtered to ${allCommits.length} commits with tagged statuses.`);
|
|
279
|
-
for (const c of allCommits) {
|
|
280
|
-
console.log(` ==========================================================================
|
|
281
|
-
${c.prettyAgoTime} ago:
|
|
282
|
-
${c.org}/${c.repo}
|
|
283
|
-
${c.commitMessage}
|
|
284
|
-
Published on npm: ${c.publishedOnNpm}
|
|
285
|
-
${c.changelog ? `Changelog:\n${c.changelog}\n` : ''}
|
|
286
|
-
`);
|
|
287
|
-
}
|
|
288
|
-
return allCommits;
|
|
289
|
-
}
|
|
290
|
-
async fetchFunction(urlArg, optionsArg) {
|
|
291
|
-
const response = await fetch(`${this.baseUrl}${urlArg}`, optionsArg);
|
|
292
|
-
return response;
|
|
390
|
+
throw new Error(`fetchFunction failed after retries for ${urlArg}: ${lastError?.message ?? 'unknown error'}`);
|
|
293
391
|
}
|
|
294
392
|
}
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBRWpELE1BQU0sT0FBTyxRQUFRO0lBUW5CLFlBQVksT0FBZSxFQUFFLEtBQWMsRUFBRSxnQkFBeUI7UUFMOUQsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQscUJBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBS3pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkIsZ0JBQWdCLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQzdELE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSx3QkFBd0IsQ0FBQztRQUNuRSxNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFF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
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLE9BQU8sUUFBUTtJQXlCbkIsWUFDRSxPQUFlLEVBQ2YsS0FBYyxFQUNkLGdCQUF5QixFQUN6QixPQVdDO1FBcENLLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDdkIsbURBQW1EO1FBQzNDLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUd0QyxzQ0FBc0M7UUFDOUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0IsVUFBSyxHQUF1QyxFQUFFLENBQUM7UUFDdkQsZ0VBQWdFO1FBQ3hELG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQ3ZDLGdEQUFnRDtRQUN4QyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUEwQnhDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkIsZ0JBQWdCLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLEtBQUssQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQztRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxFQUFFLFdBQVcsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxFQUFFLGNBQWMsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQywyQkFBMkI7UUFDdEMsa0RBQWtEO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3BELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4Qyw0REFBNEQ7UUFDNUQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxtREFBbUQ7WUFDbkQsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNoQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNuRCxjQUFjLENBQ2YsQ0FBQztRQUNKLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5QywyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEQsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ2YsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM1RSxDQUNGLENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNyQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDeEQsQ0FBQztRQUNGLHNEQUFzRDtRQUN0RCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFFRCxnRkFBZ0Y7UUFDaEYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FDbEQsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzVDLElBQUksQ0FBQztnQkFDSCw2Q0FBNkM7Z0JBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FDeEMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLGtCQUFrQixFQUNoRCxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDeEUsQ0FBQztnQkFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRixDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFpQyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkUsdURBQXVEO2dCQUN2RCxJQUNFLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO3dCQUNqRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFDcEMsQ0FBQztvQkFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLENBQUM7Z0JBQ0QsbUNBQW1DO2dCQUNuQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEQsS0FBSyxFQUNMLElBQUksRUFDSixjQUFjLENBQ2YsQ0FBQztnQkFDRixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBELHNFQUFzRTtRQUN0RSxNQUFNLFVBQVUsR0FBdUMsRUFBRSxDQUFDO1FBQzFELElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckQsaUNBQWlDO1lBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztnQkFDM0IsU0FBUztZQUNYLENBQUM7WUFDRCxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLCtCQUErQjtZQUMvQixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUMsMkJBQTJCO1lBQzNCLElBQUksVUFBdUIsQ0FBQztZQUM1QixJQUFJLFlBQWlDLENBQUM7WUFDdEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUMxQixZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM3QixDQUFDO1lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkUsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0JBQy9CLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztZQUMzQyxDQUFDO1lBQ0QscUVBQXFFO1lBQ3JFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPLEdBQXVELElBQUksQ0FBQztZQUN2RSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQztvQkFDSCxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEtBQUssSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9FLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO1lBQ0QsdUJBQXVCO1lBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2Qyw4REFBOEQ7Z0JBQzlELElBQUksY0FBa0MsQ0FBQztnQkFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUM1RSxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxJQUFJLE9BQU8sSUFBSSxjQUFjO29CQUMxRCxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUFDO29CQUMvRCxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNWLElBQUksY0FBa0MsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxjQUFjLEVBQUUsQ0FBQzt3QkFDbkIsY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDSCxDQUFDO2dCQUNELHlEQUF5RDtnQkFDekQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwRCxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzt3QkFDakQsU0FBUztvQkFDWCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLEdBQUcsRUFBRSxLQUFLO29CQUNWLElBQUksRUFBRSxJQUFJO29CQUNWLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJO29CQUMvQixhQUFhLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FDcEUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQ3pDO29CQUNELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRztvQkFDWCxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUMvQixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsY0FBYztvQkFDZCxTQUFTLEVBQUUsY0FBYztpQkFDMUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLGlDQUFpQztZQUNqQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELGtDQUFrQztZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRCwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRSx3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsbUJBQW1CLElBQUksQ0FBQyxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQU0saUJBQWlCLG1CQUFtQixZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQ3BJLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxvREFBb0Q7UUFDcEQsa0JBQWtCO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBTSxpQkFBaUIsbUJBQW1CLFlBQVksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUN2SCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFhLEVBQUUsSUFBWTtRQUM3RCxNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUc7WUFDakIsY0FBYztZQUNkLGNBQWM7WUFDZCxjQUFjO1lBQ2QsbUJBQW1CO1NBQ3BCLENBQUM7UUFDRixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSxhQUFhLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdFLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AseUJBQXlCO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxzQkFBc0IsQ0FBQyxPQUFlO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsNENBQTRDO1lBQzVDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMzQixNQUFNO1lBQ1IsQ0FBQztZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ0Q7O09BRUc7SUFDSyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixLQUFLLElBQUksSUFBSSxlQUFlLElBQUksQ0FBQyxTQUFTLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDdkYsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRTtnQkFDekMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDcEUsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQzlGLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQThCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE1BQU07WUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7Z0JBQzFCLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSTt3QkFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTO2dCQUFFLE1BQU07WUFDeEMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDeEcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxNQUFNLElBQUksR0FBMkIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsTUFBTTtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTO2dCQUFFLE1BQU07WUFDeEMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEdBQVc7UUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLE1BQU0sS0FBSyxHQUFxQyxFQUFFLENBQUM7UUFDbkQsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDckgsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxHQUFHLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNoRyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEdBQXFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUFFLE1BQU07WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztnQkFBRSxNQUFNO1lBQ3hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsS0FBYSxFQUNiLElBQVksRUFDWixjQUF1QjtRQUV2QixNQUFNLEtBQUssR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixNQUFNLE9BQU8sR0FBaUMsRUFBRSxDQUFDO1FBQ2pELE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsS0FBSyxJQUFJLElBQUksa0JBQWtCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDN0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFpQyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxNQUFNO1lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsTUFBTTtZQUN4QyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FDeEIsTUFBYyxFQUNkLGFBQTBCLEVBQUU7UUFFNUIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFNBQWMsQ0FBQztRQUNuQixPQUFPLE9BQU8sR0FBRyxXQUFXLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNqRSx1QkFBdUI7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQzNELE1BQU0sU0FBUyxHQUFHLFVBQVU7d0JBQzFCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSTt3QkFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNuRixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ25ELE9BQU8sRUFBRSxDQUFDO29CQUNWLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxNQUFNLEtBQUssU0FBUyxFQUFFLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7Q0FDRiJ9
|