openplanter 0.2.9 → 0.3.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.
Files changed (39) hide show
  1. package/dist/investigation-tools/asx-options-flow.d.ts +75 -0
  2. package/dist/investigation-tools/asx-options-flow.d.ts.map +1 -0
  3. package/dist/investigation-tools/asx-options-flow.js +272 -0
  4. package/dist/investigation-tools/asx-options-flow.js.map +1 -0
  5. package/dist/investigation-tools/glassdoor-asx-analyzer.d.ts +55 -0
  6. package/dist/investigation-tools/glassdoor-asx-analyzer.d.ts.map +1 -0
  7. package/dist/investigation-tools/glassdoor-asx-analyzer.js +244 -0
  8. package/dist/investigation-tools/glassdoor-asx-analyzer.js.map +1 -0
  9. package/dist/investigation-tools/index.d.ts +7 -0
  10. package/dist/investigation-tools/index.d.ts.map +1 -1
  11. package/dist/investigation-tools/index.js +7 -0
  12. package/dist/investigation-tools/index.js.map +1 -1
  13. package/dist/investigation-tools/ip-australia-patent-scraper.d.ts +51 -0
  14. package/dist/investigation-tools/ip-australia-patent-scraper.d.ts.map +1 -0
  15. package/dist/investigation-tools/ip-australia-patent-scraper.js +303 -0
  16. package/dist/investigation-tools/ip-australia-patent-scraper.js.map +1 -0
  17. package/dist/investigation-tools/linkedin-asx-employee-scraper.d.ts +49 -0
  18. package/dist/investigation-tools/linkedin-asx-employee-scraper.d.ts.map +1 -0
  19. package/dist/investigation-tools/linkedin-asx-employee-scraper.js +250 -0
  20. package/dist/investigation-tools/linkedin-asx-employee-scraper.js.map +1 -0
  21. package/dist/investigation-tools/state-mp-holdings-scraper.d.ts +49 -0
  22. package/dist/investigation-tools/state-mp-holdings-scraper.d.ts.map +1 -0
  23. package/dist/investigation-tools/state-mp-holdings-scraper.js +286 -0
  24. package/dist/investigation-tools/state-mp-holdings-scraper.js.map +1 -0
  25. package/dist/investigation-tools/stocktwits-asx-scraper.d.ts +61 -0
  26. package/dist/investigation-tools/stocktwits-asx-scraper.d.ts.map +1 -0
  27. package/dist/investigation-tools/stocktwits-asx-scraper.js +246 -0
  28. package/dist/investigation-tools/stocktwits-asx-scraper.js.map +1 -0
  29. package/dist/investigation-tools/tenders-gov-au-scraper.d.ts +39 -0
  30. package/dist/investigation-tools/tenders-gov-au-scraper.d.ts.map +1 -0
  31. package/dist/investigation-tools/tenders-gov-au-scraper.js +173 -0
  32. package/dist/investigation-tools/tenders-gov-au-scraper.js.map +1 -0
  33. package/dist/investigation-tools/tool-registry.d.ts.map +1 -1
  34. package/dist/investigation-tools/tool-registry.js +77 -0
  35. package/dist/investigation-tools/tool-registry.js.map +1 -1
  36. package/dist/tool-defs.d.ts.map +1 -1
  37. package/dist/tool-defs.js +220 -0
  38. package/dist/tool-defs.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ /**
2
+ * asx-options-flow.ts -- ASX Unusual Options Activity Scanner
3
+ *
4
+ * Fetches ASX unusual options activity data including call/put volume
5
+ * spikes. Identifies potential pre-announcement positioning through
6
+ * abnormal options flow.
7
+ *
8
+ * Data sources:
9
+ * - ASX options market data
10
+ * - Yahoo Finance options chains (.AX)
11
+ *
12
+ * Note: ASX options data is limited compared to US markets. This tool
13
+ * aggregates what's publicly available and uses Yahoo Finance as a
14
+ * supplementary source.
15
+ *
16
+ * DISCLAIMER:
17
+ * This tool is provided for research and educational purposes only.
18
+ * Users are solely responsible for ensuring compliance with all applicable
19
+ * laws, regulations, and website terms before using this tool.
20
+ */
21
+ export interface OptionContract {
22
+ type: "call" | "put";
23
+ strike: number;
24
+ expiry: string;
25
+ last_price: number;
26
+ bid: number;
27
+ ask: number;
28
+ volume: number;
29
+ open_interest: number;
30
+ implied_volatility: number;
31
+ in_the_money: boolean;
32
+ }
33
+ export interface UnusualActivity {
34
+ contract_type: "call" | "put";
35
+ strike: number;
36
+ expiry: string;
37
+ volume: number;
38
+ open_interest: number;
39
+ volume_oi_ratio: number;
40
+ implied_volatility: number;
41
+ flag_reason: string;
42
+ signal_strength: "low" | "medium" | "high" | "extreme";
43
+ }
44
+ export interface OptionsFlowSummary {
45
+ total_call_volume: number;
46
+ total_put_volume: number;
47
+ put_call_ratio: number;
48
+ total_call_oi: number;
49
+ total_put_oi: number;
50
+ avg_call_iv: number;
51
+ avg_put_iv: number;
52
+ iv_skew: number;
53
+ nearest_expiry: string;
54
+ }
55
+ export interface AsxOptionsFlowResult {
56
+ scraped_at: string;
57
+ ticker: string;
58
+ symbol: string;
59
+ period_days: number;
60
+ threshold: number;
61
+ total_contracts: number;
62
+ calls: OptionContract[];
63
+ puts: OptionContract[];
64
+ unusual_activity: UnusualActivity[];
65
+ summary: OptionsFlowSummary;
66
+ alert_level: "none" | "low" | "medium" | "high";
67
+ alert_message: string;
68
+ }
69
+ export declare function fetchOptionsFlow(opts: {
70
+ ticker: string;
71
+ days?: number;
72
+ threshold?: number;
73
+ }): Promise<AsxOptionsFlowResult>;
74
+ export declare function sampleData(ticker: string): AsxOptionsFlowResult;
75
+ //# sourceMappingURL=asx-options-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asx-options-flow.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/asx-options-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqBH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChD,aAAa,EAAE,MAAM,CAAC;CACvB;AAmDD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyJhC;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAgF/D"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * asx-options-flow.ts -- ASX Unusual Options Activity Scanner
3
+ *
4
+ * Fetches ASX unusual options activity data including call/put volume
5
+ * spikes. Identifies potential pre-announcement positioning through
6
+ * abnormal options flow.
7
+ *
8
+ * Data sources:
9
+ * - ASX options market data
10
+ * - Yahoo Finance options chains (.AX)
11
+ *
12
+ * Note: ASX options data is limited compared to US markets. This tool
13
+ * aggregates what's publicly available and uses Yahoo Finance as a
14
+ * supplementary source.
15
+ *
16
+ * DISCLAIMER:
17
+ * This tool is provided for research and educational purposes only.
18
+ * Users are solely responsible for ensuring compliance with all applicable
19
+ * laws, regulations, and website terms before using this tool.
20
+ */
21
+ import { fetchJson, isoNow, normalizeTicker, yahooTicker, } from "./shared.js";
22
+ // ── Constants ────────────────────────────────────────────────────
23
+ const YAHOO_OPTIONS_URL = "https://query1.finance.yahoo.com/v7/finance/options/{symbol}";
24
+ const DEFAULT_THRESHOLD = 2.0; // Volume must be 2x average to flag
25
+ const DEFAULT_DELAY = 1.0;
26
+ function epochToDate(epoch) {
27
+ return new Date(epoch * 1000).toISOString().slice(0, 10);
28
+ }
29
+ function classifySignalStrength(volOiRatio, iv) {
30
+ if (volOiRatio > 10 || iv > 1.5)
31
+ return "extreme";
32
+ if (volOiRatio > 5 || iv > 1.0)
33
+ return "high";
34
+ if (volOiRatio > 2 || iv > 0.6)
35
+ return "medium";
36
+ return "low";
37
+ }
38
+ function determineAlertLevel(unusual) {
39
+ if (unusual.length === 0)
40
+ return "none";
41
+ const hasExtreme = unusual.some((u) => u.signal_strength === "extreme");
42
+ const hasHigh = unusual.some((u) => u.signal_strength === "high");
43
+ if (hasExtreme)
44
+ return "high";
45
+ if (hasHigh || unusual.length >= 3)
46
+ return "medium";
47
+ return "low";
48
+ }
49
+ // ── Fetcher ──────────────────────────────────────────────────────
50
+ export async function fetchOptionsFlow(opts) {
51
+ const ticker = normalizeTicker(opts.ticker);
52
+ const symbol = yahooTicker(ticker);
53
+ const days = opts.days ?? 14;
54
+ const threshold = opts.threshold ?? DEFAULT_THRESHOLD;
55
+ const calls = [];
56
+ const puts = [];
57
+ const unusual = [];
58
+ try {
59
+ const url = YAHOO_OPTIONS_URL.replace("{symbol}", symbol);
60
+ const data = await fetchJson(url, { delay: DEFAULT_DELAY });
61
+ const result = data?.optionChain?.result?.[0];
62
+ if (result?.options) {
63
+ for (const chain of result.options) {
64
+ const expiry = chain.expirationDate
65
+ ? epochToDate(chain.expirationDate)
66
+ : "";
67
+ // Process calls
68
+ for (const c of chain.calls ?? []) {
69
+ const contract = {
70
+ type: "call",
71
+ strike: c.strike ?? 0,
72
+ expiry,
73
+ last_price: c.lastPrice ?? 0,
74
+ bid: c.bid ?? 0,
75
+ ask: c.ask ?? 0,
76
+ volume: c.volume ?? 0,
77
+ open_interest: c.openInterest ?? 0,
78
+ implied_volatility: Math.round((c.impliedVolatility ?? 0) * 100) / 100,
79
+ in_the_money: c.inTheMoney ?? false,
80
+ };
81
+ calls.push(contract);
82
+ // Check for unusual activity
83
+ const volOiRatio = contract.open_interest > 0
84
+ ? contract.volume / contract.open_interest
85
+ : contract.volume > 0 ? 999 : 0;
86
+ if (volOiRatio >= threshold || contract.implied_volatility > 0.8) {
87
+ unusual.push({
88
+ contract_type: "call",
89
+ strike: contract.strike,
90
+ expiry,
91
+ volume: contract.volume,
92
+ open_interest: contract.open_interest,
93
+ volume_oi_ratio: Math.round(volOiRatio * 100) / 100,
94
+ implied_volatility: contract.implied_volatility,
95
+ flag_reason: volOiRatio >= threshold
96
+ ? `Volume/OI ratio ${volOiRatio.toFixed(1)}x exceeds ${threshold}x threshold`
97
+ : `High implied volatility: ${(contract.implied_volatility * 100).toFixed(0)}%`,
98
+ signal_strength: classifySignalStrength(volOiRatio, contract.implied_volatility),
99
+ });
100
+ }
101
+ }
102
+ // Process puts
103
+ for (const p of chain.puts ?? []) {
104
+ const contract = {
105
+ type: "put",
106
+ strike: p.strike ?? 0,
107
+ expiry,
108
+ last_price: p.lastPrice ?? 0,
109
+ bid: p.bid ?? 0,
110
+ ask: p.ask ?? 0,
111
+ volume: p.volume ?? 0,
112
+ open_interest: p.openInterest ?? 0,
113
+ implied_volatility: Math.round((p.impliedVolatility ?? 0) * 100) / 100,
114
+ in_the_money: p.inTheMoney ?? false,
115
+ };
116
+ puts.push(contract);
117
+ const volOiRatio = contract.open_interest > 0
118
+ ? contract.volume / contract.open_interest
119
+ : contract.volume > 0 ? 999 : 0;
120
+ if (volOiRatio >= threshold || contract.implied_volatility > 0.8) {
121
+ unusual.push({
122
+ contract_type: "put",
123
+ strike: contract.strike,
124
+ expiry,
125
+ volume: contract.volume,
126
+ open_interest: contract.open_interest,
127
+ volume_oi_ratio: Math.round(volOiRatio * 100) / 100,
128
+ implied_volatility: contract.implied_volatility,
129
+ flag_reason: volOiRatio >= threshold
130
+ ? `Volume/OI ratio ${volOiRatio.toFixed(1)}x exceeds ${threshold}x threshold`
131
+ : `High implied volatility: ${(contract.implied_volatility * 100).toFixed(0)}%`,
132
+ signal_strength: classifySignalStrength(volOiRatio, contract.implied_volatility),
133
+ });
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ catch (err) {
140
+ console.error(`[asx_options_flow] Fetch error: ${err}`);
141
+ }
142
+ // Sort unusual by signal strength
143
+ const strengthOrder = { extreme: 0, high: 1, medium: 2, low: 3 };
144
+ unusual.sort((a, b) => strengthOrder[a.signal_strength] - strengthOrder[b.signal_strength]);
145
+ // Build summary
146
+ const totalCallVol = calls.reduce((s, c) => s + c.volume, 0);
147
+ const totalPutVol = puts.reduce((s, p) => s + p.volume, 0);
148
+ const totalCallOi = calls.reduce((s, c) => s + c.open_interest, 0);
149
+ const totalPutOi = puts.reduce((s, p) => s + p.open_interest, 0);
150
+ const avgCallIv = calls.length > 0
151
+ ? Math.round((calls.reduce((s, c) => s + c.implied_volatility, 0) / calls.length) * 100) / 100
152
+ : 0;
153
+ const avgPutIv = puts.length > 0
154
+ ? Math.round((puts.reduce((s, p) => s + p.implied_volatility, 0) / puts.length) * 100) / 100
155
+ : 0;
156
+ const allExpiries = [...calls, ...puts].map((c) => c.expiry).filter(Boolean);
157
+ const nearestExpiry = allExpiries.sort()[0] ?? "";
158
+ const alertLevel = determineAlertLevel(unusual);
159
+ const alertMessage = alertLevel === "none"
160
+ ? `No unusual options activity detected for ${ticker}.`
161
+ : alertLevel === "high"
162
+ ? `HIGH ALERT: ${unusual.length} unusual option flow(s) detected for ${ticker}. Possible pre-announcement positioning.`
163
+ : `${unusual.length} unusual option flow(s) detected for ${ticker} at ${alertLevel} alert level.`;
164
+ return {
165
+ scraped_at: isoNow(),
166
+ ticker,
167
+ symbol,
168
+ period_days: days,
169
+ threshold,
170
+ total_contracts: calls.length + puts.length,
171
+ calls,
172
+ puts,
173
+ unusual_activity: unusual,
174
+ summary: {
175
+ total_call_volume: totalCallVol,
176
+ total_put_volume: totalPutVol,
177
+ put_call_ratio: totalCallVol > 0
178
+ ? Math.round((totalPutVol / totalCallVol) * 100) / 100
179
+ : 0,
180
+ total_call_oi: totalCallOi,
181
+ total_put_oi: totalPutOi,
182
+ avg_call_iv: avgCallIv,
183
+ avg_put_iv: avgPutIv,
184
+ iv_skew: Math.round((avgPutIv - avgCallIv) * 100) / 100,
185
+ nearest_expiry: nearestExpiry,
186
+ },
187
+ alert_level: alertLevel,
188
+ alert_message: alertMessage,
189
+ };
190
+ }
191
+ // ── Test/sample data ─────────────────────────────────────────────
192
+ export function sampleData(ticker) {
193
+ const t = normalizeTicker(ticker || "BHP");
194
+ return {
195
+ scraped_at: isoNow(),
196
+ ticker: t,
197
+ symbol: `${t}.AX`,
198
+ period_days: 14,
199
+ threshold: 2.0,
200
+ total_contracts: 24,
201
+ calls: [
202
+ { type: "call", strike: 44.00, expiry: "2026-03-20", last_price: 1.85, bid: 1.80, ask: 1.90, volume: 2450, open_interest: 380, implied_volatility: 0.42, in_the_money: true },
203
+ { type: "call", strike: 45.00, expiry: "2026-03-20", last_price: 1.10, bid: 1.05, ask: 1.15, volume: 5200, open_interest: 620, implied_volatility: 0.48, in_the_money: false },
204
+ { type: "call", strike: 46.00, expiry: "2026-03-20", last_price: 0.55, bid: 0.50, ask: 0.60, volume: 8100, open_interest: 450, implied_volatility: 0.55, in_the_money: false },
205
+ { type: "call", strike: 48.00, expiry: "2026-04-17", last_price: 0.25, bid: 0.20, ask: 0.30, volume: 3200, open_interest: 180, implied_volatility: 0.62, in_the_money: false },
206
+ ],
207
+ puts: [
208
+ { type: "put", strike: 43.00, expiry: "2026-03-20", last_price: 0.65, bid: 0.60, ask: 0.70, volume: 1800, open_interest: 520, implied_volatility: 0.38, in_the_money: false },
209
+ { type: "put", strike: 42.00, expiry: "2026-03-20", last_price: 0.35, bid: 0.30, ask: 0.40, volume: 900, open_interest: 340, implied_volatility: 0.36, in_the_money: false },
210
+ ],
211
+ unusual_activity: [
212
+ {
213
+ contract_type: "call",
214
+ strike: 46.00,
215
+ expiry: "2026-03-20",
216
+ volume: 8100,
217
+ open_interest: 450,
218
+ volume_oi_ratio: 18.0,
219
+ implied_volatility: 0.55,
220
+ flag_reason: "Volume/OI ratio 18.0x exceeds 2.0x threshold",
221
+ signal_strength: "extreme",
222
+ },
223
+ {
224
+ contract_type: "call",
225
+ strike: 48.00,
226
+ expiry: "2026-04-17",
227
+ volume: 3200,
228
+ open_interest: 180,
229
+ volume_oi_ratio: 17.78,
230
+ implied_volatility: 0.62,
231
+ flag_reason: "Volume/OI ratio 17.8x exceeds 2.0x threshold",
232
+ signal_strength: "extreme",
233
+ },
234
+ {
235
+ contract_type: "call",
236
+ strike: 45.00,
237
+ expiry: "2026-03-20",
238
+ volume: 5200,
239
+ open_interest: 620,
240
+ volume_oi_ratio: 8.39,
241
+ implied_volatility: 0.48,
242
+ flag_reason: "Volume/OI ratio 8.4x exceeds 2.0x threshold",
243
+ signal_strength: "high",
244
+ },
245
+ {
246
+ contract_type: "call",
247
+ strike: 44.00,
248
+ expiry: "2026-03-20",
249
+ volume: 2450,
250
+ open_interest: 380,
251
+ volume_oi_ratio: 6.45,
252
+ implied_volatility: 0.42,
253
+ flag_reason: "Volume/OI ratio 6.4x exceeds 2.0x threshold",
254
+ signal_strength: "high",
255
+ },
256
+ ],
257
+ summary: {
258
+ total_call_volume: 18950,
259
+ total_put_volume: 2700,
260
+ put_call_ratio: 0.14,
261
+ total_call_oi: 1630,
262
+ total_put_oi: 860,
263
+ avg_call_iv: 0.52,
264
+ avg_put_iv: 0.37,
265
+ iv_skew: -0.15,
266
+ nearest_expiry: "2026-03-20",
267
+ },
268
+ alert_level: "high",
269
+ alert_message: `HIGH ALERT: 4 unusual option flow(s) detected for ${t}. Possible pre-announcement positioning.`,
270
+ };
271
+ }
272
+ //# sourceMappingURL=asx-options-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asx-options-flow.js","sourceRoot":"","sources":["../../src/investigation-tools/asx-options-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAEL,SAAS,EACT,MAAM,EACN,eAAe,EACf,WAAW,GAEZ,MAAM,aAAa,CAAC;AAErB,oEAAoE;AAEpE,MAAM,iBAAiB,GACrB,8DAA8D,CAAC;AAEjE,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,oCAAoC;AACnE,MAAM,aAAa,GAAG,GAAG,CAAC;AAmF1B,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB,EAAE,EAAU;IAC5D,IAAI,UAAU,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA0B;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,MAAM,CAAC,CAAC;IAClE,IAAI,UAAU;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oEAAoE;AAEpE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAItC;IACC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,iBAAiB,CAAC;IAEtD,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,GAAG,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAE/E,MAAM,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc;oBACjC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC;oBACnC,CAAC,CAAC,EAAE,CAAC;gBAEP,gBAAgB;gBAChB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;oBAClC,MAAM,QAAQ,GAAmB;wBAC/B,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;wBACrB,MAAM;wBACN,UAAU,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;wBAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;wBACf,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;wBACf,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;wBACrB,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC;wBAClC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;wBACtE,YAAY,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK;qBACpC,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAErB,6BAA6B;oBAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,GAAG,CAAC;wBAC3C,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa;wBAC1C,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAElC,IAAI,UAAU,IAAI,SAAS,IAAI,QAAQ,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC;wBACjE,OAAO,CAAC,IAAI,CAAC;4BACX,aAAa,EAAE,MAAM;4BACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,MAAM;4BACN,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,aAAa,EAAE,QAAQ,CAAC,aAAa;4BACrC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;4BACnD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;4BAC/C,WAAW,EAAE,UAAU,IAAI,SAAS;gCAClC,CAAC,CAAC,mBAAmB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,SAAS,aAAa;gCAC7E,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;4BACjF,eAAe,EAAE,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC;yBACjF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,eAAe;gBACf,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAmB;wBAC/B,IAAI,EAAE,KAAK;wBACX,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;wBACrB,MAAM;wBACN,UAAU,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;wBAC5B,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;wBACf,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;wBACf,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;wBACrB,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC;wBAClC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;wBACtE,YAAY,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK;qBACpC,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAEpB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,GAAG,CAAC;wBAC3C,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa;wBAC1C,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAElC,IAAI,UAAU,IAAI,SAAS,IAAI,QAAQ,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC;wBACjE,OAAO,CAAC,IAAI,CAAC;4BACX,aAAa,EAAE,KAAK;4BACpB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,MAAM;4BACN,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,aAAa,EAAE,QAAQ,CAAC,aAAa;4BACrC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;4BACnD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;4BAC/C,WAAW,EAAE,UAAU,IAAI,SAAS;gCAClC,CAAC,CAAC,mBAAmB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,SAAS,aAAa;gCAC7E,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;4BACjF,eAAe,EAAE,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC;yBACjF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,kCAAkC;IAClC,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAE5F,gBAAgB;IAChB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC9F,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC5F,CAAC,CAAC,CAAC,CAAC;IAEN,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,UAAU,KAAK,MAAM;QACxC,CAAC,CAAC,4CAA4C,MAAM,GAAG;QACvD,CAAC,CAAC,UAAU,KAAK,MAAM;YACrB,CAAC,CAAC,eAAe,OAAO,CAAC,MAAM,wCAAwC,MAAM,0CAA0C;YACvH,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,wCAAwC,MAAM,OAAO,UAAU,eAAe,CAAC;IAEtG,OAAO;QACL,UAAU,EAAE,MAAM,EAAE;QACpB,MAAM;QACN,MAAM;QACN,WAAW,EAAE,IAAI;QACjB,SAAS;QACT,eAAe,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAC3C,KAAK;QACL,IAAI;QACJ,gBAAgB,EAAE,OAAO;QACzB,OAAO,EAAE;YACP,iBAAiB,EAAE,YAAY;YAC/B,gBAAgB,EAAE,WAAW;YAC7B,cAAc,EAAE,YAAY,GAAG,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;gBACtD,CAAC,CAAC,CAAC;YACL,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,UAAU;YACxB,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACvD,cAAc,EAAE,aAAa;SAC9B;QACD,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;KAC5B,CAAC;AACJ,CAAC;AAED,oEAAoE;AAEpE,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;IAE3C,OAAO;QACL,UAAU,EAAE,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,GAAG,CAAC,KAAK;QACjB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,GAAG;QACd,eAAe,EAAE,EAAE;QACnB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;YAC7K,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;YAC9K,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;YAC9K,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;SAC/K;QACD,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;YAC7K,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE;SAC7K;QACD,gBAAgB,EAAE;YAChB;gBACE,aAAa,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,GAAG;gBAClB,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;gBACxB,WAAW,EAAE,8CAA8C;gBAC3D,eAAe,EAAE,SAAS;aAC3B;YACD;gBACE,aAAa,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,GAAG;gBAClB,eAAe,EAAE,KAAK;gBACtB,kBAAkB,EAAE,IAAI;gBACxB,WAAW,EAAE,8CAA8C;gBAC3D,eAAe,EAAE,SAAS;aAC3B;YACD;gBACE,aAAa,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,GAAG;gBAClB,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;gBACxB,WAAW,EAAE,6CAA6C;gBAC1D,eAAe,EAAE,MAAM;aACxB;YACD;gBACE,aAAa,EAAE,MAAM;gBACrB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,GAAG;gBAClB,eAAe,EAAE,IAAI;gBACrB,kBAAkB,EAAE,IAAI;gBACxB,WAAW,EAAE,6CAA6C;gBAC1D,eAAe,EAAE,MAAM;aACxB;SACF;QACD,OAAO,EAAE;YACP,iBAAiB,EAAE,KAAK;YACxB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,GAAG;YACjB,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,CAAC,IAAI;YACd,cAAc,EAAE,YAAY;SAC7B;QACD,WAAW,EAAE,MAAM;QACnB,aAAa,EAAE,qDAAqD,CAAC,0CAA0C;KAChH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * glassdoor-asx-analyzer.ts -- Glassdoor ASX Company Review Analyzer
3
+ *
4
+ * Analyzes Glassdoor reviews for ASX-listed companies to detect
5
+ * sentiment spikes and morale shifts that may precede material news.
6
+ *
7
+ * Uses Google-indexed Glassdoor pages as Glassdoor blocks direct scraping.
8
+ * In live mode, searches for recent reviews via search engine indexing.
9
+ *
10
+ * DISCLAIMER:
11
+ * This tool is provided for research and educational purposes only.
12
+ * Users are solely responsible for ensuring compliance with all applicable
13
+ * laws, regulations, and website terms before using this tool.
14
+ * Glassdoor's Terms of Service restrict automated scraping. This tool uses
15
+ * only publicly indexed data from search engines.
16
+ */
17
+ export interface GlassdoorReview {
18
+ date: string;
19
+ rating: number | null;
20
+ title: string;
21
+ pros: string;
22
+ cons: string;
23
+ sentiment_score: number;
24
+ sentiment_label: string;
25
+ pre_news_signals: string[];
26
+ url: string;
27
+ }
28
+ export interface MoraleTrend {
29
+ period: string;
30
+ avg_rating: number | null;
31
+ avg_sentiment: number;
32
+ review_count: number;
33
+ trend_direction: "improving" | "declining" | "stable";
34
+ }
35
+ export interface GlassdoorResult {
36
+ scraped_at: string;
37
+ company: string;
38
+ ticker: string;
39
+ period_days: number;
40
+ total_reviews: number;
41
+ reviews: GlassdoorReview[];
42
+ morale_trends: MoraleTrend[];
43
+ overall_sentiment: number;
44
+ overall_rating: number | null;
45
+ pre_news_signal_count: number;
46
+ sentiment_spike_detected: boolean;
47
+ summary: string;
48
+ }
49
+ export declare function analyzeGlassdoor(opts: {
50
+ ticker: string;
51
+ days?: number;
52
+ minReviews?: number;
53
+ }): Promise<GlassdoorResult>;
54
+ export declare function sampleData(ticker: string): GlassdoorResult;
55
+ //# sourceMappingURL=glassdoor-asx-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glassdoor-asx-analyzer.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/glassdoor-asx-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAsCH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,OAAO,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAqDD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqF3B;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAwF1D"}