@bscotch/gamemaker-releases 0.1.0
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/README.md +64 -0
- package/dist/browser.d.ts +7 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +6 -0
- package/dist/browser.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/feeds.d.ts +5 -0
- package/dist/feeds.d.ts.map +1 -0
- package/dist/feeds.js +78 -0
- package/dist/feeds.js.map +1 -0
- package/dist/feeds.lib.d.ts +4 -0
- package/dist/feeds.lib.d.ts.map +1 -0
- package/dist/feeds.lib.js +53 -0
- package/dist/feeds.lib.js.map +1 -0
- package/dist/feeds.types.d.ts +548 -0
- package/dist/feeds.types.d.ts.map +1 -0
- package/dist/feeds.types.js +69 -0
- package/dist/feeds.types.js.map +1 -0
- package/dist/fetch.d.ts +6 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +37 -0
- package/dist/fetch.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/notes.d.ts +16 -0
- package/dist/notes.d.ts.map +1 -0
- package/dist/notes.js +141 -0
- package/dist/notes.js.map +1 -0
- package/dist/notes.type.d.ts +2 -0
- package/dist/notes.type.d.ts.map +1 -0
- package/dist/notes.type.js +2 -0
- package/dist/notes.type.js.map +1 -0
- package/dist/urls.d.ts +13 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.js +20 -0
- package/dist/urls.js.map +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +44 -0
- package/dist/utils.js.map +1 -0
- package/package.json +68 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# GameMaker Releases
|
|
2
|
+
|
|
3
|
+
[GameMaker](https://gamemaker.io/) releases new builds fairly frequently across several release channels (e.g. beta, stable, and LTS). Each release includes two separate artifacts: an IDE installer and a Runtime. Release notes are listed separately for each artifact type and release channel.
|
|
4
|
+
|
|
5
|
+
This package centralizes all of the official GameMaker information (for Windows versions) into a single structured document. It is used by [Butterscotch Shenanigans](https://www.bscotch.net) to keep an up-to-date, centralized history of releases. These are uploaded [as GitHub releases](https://github.com/bscotch/gamemaker-info/releases).
|
|
6
|
+
|
|
7
|
+
Latest releases document: https://github.com/bscotch/gamemaker-info/releases/latest/download/releases-summary.json
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
+ [Node.js 16+](https://nodejs.org)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
`npm install @bscotch/gamemaker-releases`
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { listReleasesWithNotes } from '@bscotch/gamemaker-releases';
|
|
21
|
+
|
|
22
|
+
// Get info for all releases, including IDE and Runtime, across
|
|
23
|
+
// all channels, with release notes. The first run may take a while,
|
|
24
|
+
// since there are many files that need to be fetched. These are
|
|
25
|
+
// cached for future runs, however.
|
|
26
|
+
const releases = await listReleasesWithNotes();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Background Info
|
|
30
|
+
|
|
31
|
+
### Artifacts
|
|
32
|
+
|
|
33
|
+
GameMaker releases are made up of a pair of artifacts: an IDE and a Runtime. While each IDE has a "matching" Runtime, you can specify any Runtime you want for the active IDE (though not all will work with any given IDE version).
|
|
34
|
+
|
|
35
|
+
The IDE artifacts are installed via an installer, while Runtimes are installed via the GameMaker IDE or via other installed Runtimes. In other words, you cannot manually install Runtimes.
|
|
36
|
+
|
|
37
|
+
### Release Channels
|
|
38
|
+
|
|
39
|
+
GameMaker artifacts are released into one or more of several channels. Each channel has a separate RSS feed describing the GameMaker versions available in that channel.
|
|
40
|
+
|
|
41
|
+
- **Long-Term Support (LTS)** Releases intended for maximum stability, with infrequent feature changes.
|
|
42
|
+
- **Stable** Releases intended for typical use-cases. The schedule is roughly monthly, and new features are delivered regularly.
|
|
43
|
+
- **Beta** Releases intended for games in early stages of production, where new and relatively-untested features are delivered rapidly. The schedule is roughly weekly.
|
|
44
|
+
- **Dev (Unstable)** Releases intended for internal use or rapid delivery of new features. Not recommended.
|
|
45
|
+
|
|
46
|
+
### Release Feeds
|
|
47
|
+
|
|
48
|
+
GameMaker releases are described by RSS feeds and JSON files whose URLs are listed inside those feeds. These RSS feeds are the same ones used by the GameMaker IDE to determine when new IDE and Runtime artifacts have become available.
|
|
49
|
+
|
|
50
|
+
There are distinct feeds for each platform supported by the GameMaker IDE, for each release channel. The IDE and Runtime have separate feeds.
|
|
51
|
+
|
|
52
|
+
#### IDE Feeds (Windows)
|
|
53
|
+
|
|
54
|
+
- `lts`: https://gms.yoyogames.com/update-win-LTS.rss
|
|
55
|
+
- `stable`: https://gms.yoyogames.com/update-win.rss
|
|
56
|
+
- `beta`: https://gms.yoyogames.com/update-win-NuBeta.rss
|
|
57
|
+
- `unstable`: https://gms.yoyogames.com/update-win-NuBeta-I.rss
|
|
58
|
+
|
|
59
|
+
#### Runtime Feeds (Windows)
|
|
60
|
+
|
|
61
|
+
- `lts`: https://gms.yoyogames.com/Zeus-Runtime-LTS.rss
|
|
62
|
+
- `stable`: https://gms.yoyogames.com/Zeus-Runtime.rss
|
|
63
|
+
- `beta`: https://gms.yoyogames.com/Zeus-Runtime-NuBeta.rss
|
|
64
|
+
- `unstable`: https://gms.yoyogames.com/Zeus-Runtime-NuBeta-I.rss
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Browser-compatible exports
|
|
3
|
+
*/
|
|
4
|
+
export { ideFeedUrls, runtimeFeedUrls } from './urls.js';
|
|
5
|
+
export { gameMakerReleaseWithNotesSchema } from './feeds.types.js';
|
|
6
|
+
export type { ArtifactType, Channel, GameMakerRelease, GameMakerReleaseWithNotes, } from './feeds.types.js';
|
|
7
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,yCAG3B,CAAC;AAEF,eAAO,MAAM,qBAAqB,yCAEjC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import { pathy } from '@bscotch/pathy';
|
|
3
|
+
export const defaultCacheDir = pathy(os.tmpdir(), '@bscotch/gamemaker-releases');
|
|
4
|
+
export const defaultNotesCachePath = defaultCacheDir.join('release-notes-cache.json');
|
|
5
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAClC,EAAE,CAAC,MAAM,EAAE,EACX,6BAA6B,CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC,IAAI,CACvD,0BAA0B,CAC3B,CAAC"}
|
package/dist/feeds.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Pathy } from '@bscotch/pathy';
|
|
2
|
+
import { GameMakerRelease, GameMakerReleaseWithNotes } from './feeds.types.js';
|
|
3
|
+
export declare function listReleasesWithNotes(releases?: GameMakerRelease[], cache?: Pathy | string): Promise<GameMakerReleaseWithNotes[]>;
|
|
4
|
+
export declare function listReleases(): Promise<GameMakerRelease[]>;
|
|
5
|
+
//# sourceMappingURL=feeds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../src/feeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAKvC,OAAO,EAKL,gBAAgB,EAEhB,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAI1B,wBAAsB,qBAAqB,CACzC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,EAC7B,KAAK,GAAE,KAAK,GAAG,MAA8B,GAC5C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CA2BtC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2BhE"}
|
package/dist/feeds.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { assert } from '@bscotch/utility/browser';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { defaultNotesCachePath } from './constants.js';
|
|
4
|
+
import { downloadRssFeed, findPairedRuntime } from './feeds.lib.js';
|
|
5
|
+
import { channels, gameMakerArtifactSchema, gameMakerReleaseSchema, gameMakerReleaseWithNotesSchema, } from './feeds.types.js';
|
|
6
|
+
import { listReleaseNotes } from './notes.js';
|
|
7
|
+
import { ideFeedUrls, runtimeFeedUrls } from './urls.js';
|
|
8
|
+
export async function listReleasesWithNotes(releases, cache = defaultNotesCachePath) {
|
|
9
|
+
releases ||= await listReleases();
|
|
10
|
+
const notes = await listReleaseNotes(releases, cache);
|
|
11
|
+
const withNotes = [];
|
|
12
|
+
for (const release of releases) {
|
|
13
|
+
const ideNotes = notes[release.ide.notesUrl];
|
|
14
|
+
assert(ideNotes, `No notes found for IDE release ${release.ide.version}`);
|
|
15
|
+
const runtimeNotes = notes[release.runtime.notesUrl];
|
|
16
|
+
assert(runtimeNotes, `No notes found for IDE release ${release.runtime.version}`);
|
|
17
|
+
const ide = { ...release.ide, notes: ideNotes.changes };
|
|
18
|
+
const runtime = { ...release.runtime, notes: runtimeNotes.changes };
|
|
19
|
+
withNotes.push({
|
|
20
|
+
channel: release.channel,
|
|
21
|
+
summary: release.summary,
|
|
22
|
+
publishedAt: release.publishedAt,
|
|
23
|
+
ide,
|
|
24
|
+
runtime,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
withNotes.sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime());
|
|
28
|
+
return z.array(gameMakerReleaseWithNotesSchema).parse(withNotes);
|
|
29
|
+
}
|
|
30
|
+
export async function listReleases() {
|
|
31
|
+
const ideArtifacts = await listArtifacts('ide');
|
|
32
|
+
const runtimeArtifacts = await listArtifacts('runtime');
|
|
33
|
+
const releases = [];
|
|
34
|
+
for (let i = 0, r = 0; i < ideArtifacts.length; i++) {
|
|
35
|
+
const ide = ideArtifacts[i];
|
|
36
|
+
if (!ide.publishedAt) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const nextR = findPairedRuntime(runtimeArtifacts, ide, r);
|
|
40
|
+
r = nextR === -1 ? r : nextR;
|
|
41
|
+
if (nextR === -1) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
releases.push({
|
|
45
|
+
channel: ide.channel,
|
|
46
|
+
summary: ide.summary,
|
|
47
|
+
publishedAt: ide.publishedAt,
|
|
48
|
+
ide,
|
|
49
|
+
runtime: runtimeArtifacts[nextR],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
releases.sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime());
|
|
53
|
+
return z.array(gameMakerReleaseSchema).parse(releases);
|
|
54
|
+
}
|
|
55
|
+
async function listArtifacts(type) {
|
|
56
|
+
const entries = [];
|
|
57
|
+
const urls = type === 'ide' ? ideFeedUrls() : runtimeFeedUrls();
|
|
58
|
+
const feeds = await Promise.all(channels.map((channel) => downloadRssFeed(urls[channel])));
|
|
59
|
+
for (let i = 0; i < channels.length; i++) {
|
|
60
|
+
const channel = channels[i];
|
|
61
|
+
const feed = feeds[i];
|
|
62
|
+
for (const entry of feed) {
|
|
63
|
+
entries.push(gameMakerArtifactSchema.parse({
|
|
64
|
+
type,
|
|
65
|
+
channel,
|
|
66
|
+
publishedAt: entry.pubDate,
|
|
67
|
+
version: entry.title.match(/^Version (.*)/)[1],
|
|
68
|
+
link: entry.link,
|
|
69
|
+
feedUrl: urls[channel],
|
|
70
|
+
summary: entry.description,
|
|
71
|
+
notesUrl: entry.comments,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
entries.sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime());
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=feeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.js","sourceRoot":"","sources":["../src/feeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RssFeedEntry, type GameMakerArtifact } from './feeds.types.js';
|
|
2
|
+
export declare function findPairedRuntime(runtimeFeed: GameMakerArtifact[], ide: GameMakerArtifact, searchIndex: number): number;
|
|
3
|
+
export declare function downloadRssFeed(url: string): Promise<RssFeedEntry[]>;
|
|
4
|
+
//# sourceMappingURL=feeds.lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.lib.d.ts","sourceRoot":"","sources":["../src/feeds.lib.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EAEZ,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAW1B,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,iBAAiB,EAAE,EAChC,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,UAqCpB;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAG1E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { dateDifferenceDays } from '@bscotch/utility/browser';
|
|
2
|
+
import { rssFeedSchema, } from './feeds.types.js';
|
|
3
|
+
import { fetchXml } from './fetch.js';
|
|
4
|
+
function daysApart(a, b) {
|
|
5
|
+
return dateDifferenceDays(new Date(a), new Date(b));
|
|
6
|
+
}
|
|
7
|
+
function absoluteDaysApart(a, b) {
|
|
8
|
+
return Math.abs(daysApart(a, b));
|
|
9
|
+
}
|
|
10
|
+
export function findPairedRuntime(runtimeFeed, ide, searchIndex) {
|
|
11
|
+
// Go backwards until the dateDiff starts growing
|
|
12
|
+
let dateDiff = Infinity;
|
|
13
|
+
for (let r = searchIndex; r >= 0; r--) {
|
|
14
|
+
const runtime = runtimeFeed[r];
|
|
15
|
+
if (!runtime.publishedAt || runtime.channel !== ide.channel) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const diff = absoluteDaysApart(runtime.publishedAt, ide.publishedAt);
|
|
19
|
+
if (diff < dateDiff) {
|
|
20
|
+
dateDiff = diff;
|
|
21
|
+
searchIndex = r;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Go forwards until the dateDiff starts growing
|
|
28
|
+
dateDiff = Infinity;
|
|
29
|
+
for (let r = searchIndex; r < runtimeFeed.length; r++) {
|
|
30
|
+
const runtime = runtimeFeed[r];
|
|
31
|
+
if (!runtime.publishedAt || runtime.channel !== ide.channel) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const diff = absoluteDaysApart(runtime.publishedAt, ide.publishedAt);
|
|
35
|
+
if (diff < dateDiff) {
|
|
36
|
+
dateDiff = diff;
|
|
37
|
+
searchIndex = r;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const runtime = runtimeFeed[searchIndex];
|
|
44
|
+
if (!runtime || absoluteDaysApart(runtime.publishedAt, ide.publishedAt) > 1) {
|
|
45
|
+
return -1;
|
|
46
|
+
}
|
|
47
|
+
return searchIndex;
|
|
48
|
+
}
|
|
49
|
+
export async function downloadRssFeed(url) {
|
|
50
|
+
const feed = await fetchXml(url, rssFeedSchema);
|
|
51
|
+
return feed.rss.channel.item;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=feeds.lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feeds.lib.js","sourceRoot":"","sources":["../src/feeds.lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAEL,aAAa,GAEd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,OAAO,kBAAkB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,WAAgC,EAChC,GAAsB,EACtB,WAAmB;IAEnB,iDAAiD;IACjD,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;YAC3D,SAAS;SACV;QACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,IAAI,GAAG,QAAQ,EAAE;YACnB,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,GAAG,CAAC,CAAC;SACjB;aAAM;YACL,MAAM;SACP;KACF;IACD,gDAAgD;IAChD,QAAQ,GAAG,QAAQ,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE;YAC3D,SAAS;SACV;QACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,IAAI,GAAG,QAAQ,EAAE;YACnB,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,GAAG,CAAC,CAAC;SACjB;aAAM;YACL,MAAM;SACP;KACF;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;QAC3E,OAAO,CAAC,CAAC,CAAC;KACX;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/B,CAAC"}
|