@webda/google-auth 4.0.0-beta.2 → 4.0.0-beta.4
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 +122 -0
- package/lib/google-auth.service.d.ts +125 -0
- package/lib/google-auth.service.d.ts.map +1 -0
- package/lib/google-auth.service.js +197 -0
- package/lib/google-auth.service.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +31 -35
- package/webda.module.json +184 -136
- package/lib/google-auth.d.ts +0 -125
- package/lib/google-auth.d.ts.map +0 -1
- package/lib/google-auth.js +0 -227
- package/lib/google-auth.js.map +0 -1
- package/lib/google-auth.spec.d.ts +0 -2
- package/lib/google-auth.spec.d.ts.map +0 -1
- package/lib/google-auth.spec.js +0 -131
- package/lib/google-auth.spec.js.map +0 -1
package/lib/google-auth.js
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { OAuthService, OAuthServiceParameters, WebdaError } from "@webda/core";
|
|
2
|
-
import { OAuth2Client } from "google-auth-library";
|
|
3
|
-
import * as http from "http";
|
|
4
|
-
/**
|
|
5
|
-
* Credentials to manage Google Auth
|
|
6
|
-
* https://developers.google.com/identity/protocols/oauth2
|
|
7
|
-
*/
|
|
8
|
-
export class GoogleParameters extends OAuthServiceParameters {
|
|
9
|
-
constructor(params) {
|
|
10
|
-
super(params);
|
|
11
|
-
this.access_type ?? (this.access_type = "online");
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Manage Google Authentication
|
|
16
|
-
*
|
|
17
|
-
* @WebdaModda
|
|
18
|
-
*/
|
|
19
|
-
export default class GoogleAuthentication extends OAuthService {
|
|
20
|
-
/**
|
|
21
|
-
* Return provider name
|
|
22
|
-
* @returns
|
|
23
|
-
*/
|
|
24
|
-
getName() {
|
|
25
|
-
return "google";
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Allow every accounts.google.
|
|
29
|
-
*/
|
|
30
|
-
getCallbackReferer() {
|
|
31
|
-
return [/accounts\.google\.[a-z]+$/];
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Get OAuth callback query parameters
|
|
35
|
-
* @returns
|
|
36
|
-
*/
|
|
37
|
-
getCallbackQueryParams() {
|
|
38
|
-
return [
|
|
39
|
-
{
|
|
40
|
-
name: "code",
|
|
41
|
-
required: true
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: "scope",
|
|
45
|
-
required: true
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: "state",
|
|
49
|
-
required: true
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
name: "authuser",
|
|
53
|
-
required: false
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: "hd",
|
|
57
|
-
required: false
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
name: "prompt",
|
|
61
|
-
required: false
|
|
62
|
-
}
|
|
63
|
-
];
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Expose on /google by default
|
|
67
|
-
*/
|
|
68
|
-
getDefaultUrl() {
|
|
69
|
-
return "/google";
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* We manage Google Auth Token
|
|
73
|
-
*/
|
|
74
|
-
hasToken() {
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* @inheritdoc
|
|
79
|
-
*/
|
|
80
|
-
loadParameters(params) {
|
|
81
|
-
return new GoogleParameters(params);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
*
|
|
85
|
-
* @param redirect_uri
|
|
86
|
-
* @param state
|
|
87
|
-
*/
|
|
88
|
-
generateAuthUrl(redirect_uri, state, _ctx) {
|
|
89
|
-
const oauthClient = this.getOAuthClient(redirect_uri);
|
|
90
|
-
return oauthClient.generateAuthUrl({
|
|
91
|
-
access_type: this.parameters.access_type,
|
|
92
|
-
scope: this.parameters.scope,
|
|
93
|
-
redirect_uri,
|
|
94
|
-
response_type: "code",
|
|
95
|
-
state,
|
|
96
|
-
...this.parameters.auth_options
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Return a google oauth client
|
|
101
|
-
* @param redirect_uri
|
|
102
|
-
*/
|
|
103
|
-
getOAuthClient(redirect_uri) {
|
|
104
|
-
return new OAuth2Client(this.parameters.client_id, this.parameters.client_secret, redirect_uri);
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* @inheritdoc
|
|
108
|
-
*/
|
|
109
|
-
async handleCallback(ctx) {
|
|
110
|
-
// Verify state are equal
|
|
111
|
-
if (ctx.getParameters().state !== ctx.getSession().oauth?.state) {
|
|
112
|
-
this.log("WARN", `Bad State ${ctx.getParameters().state} !== ${ctx.getSession().oauth?.state}`);
|
|
113
|
-
throw new WebdaError.Forbidden("Bad State");
|
|
114
|
-
}
|
|
115
|
-
const code = ctx.getParameters().code;
|
|
116
|
-
const redirect_uri = ctx.getHttpContext().getAbsoluteUrl(`${this.parameters.url}/callback`);
|
|
117
|
-
const oauthClient = this.getOAuthClient(redirect_uri);
|
|
118
|
-
let profile, identId;
|
|
119
|
-
// Now that we have the code, use that to acquire tokens.
|
|
120
|
-
try {
|
|
121
|
-
const r = await oauthClient.getToken(code);
|
|
122
|
-
this.emitSync("GoogleAuth.Tokens", { tokens: r.tokens, context: ctx });
|
|
123
|
-
profile = await this.getUserInfo(r.tokens.id_token);
|
|
124
|
-
identId = profile.sub;
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
this.log("ERROR", err);
|
|
128
|
-
throw new WebdaError.Forbidden("OAuth Error");
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
identId,
|
|
132
|
-
profile
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Retrieve the user profile based on the token
|
|
137
|
-
* @param token
|
|
138
|
-
* @returns
|
|
139
|
-
*/
|
|
140
|
-
async getUserInfo(token) {
|
|
141
|
-
const oauthClient = this.getOAuthClient();
|
|
142
|
-
const ticket = await oauthClient.verifyIdToken({
|
|
143
|
-
idToken: token,
|
|
144
|
-
audience: this.parameters.client_id
|
|
145
|
-
});
|
|
146
|
-
return ticket.getPayload();
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Verify a Google Auth Token
|
|
150
|
-
*/
|
|
151
|
-
async handleToken(context) {
|
|
152
|
-
const tokens = (await context.getRequestBody()).tokens;
|
|
153
|
-
if (!tokens) {
|
|
154
|
-
throw new WebdaError.BadRequest("No tokens provided");
|
|
155
|
-
}
|
|
156
|
-
const profile = await this.getUserInfo(tokens.id_token);
|
|
157
|
-
return {
|
|
158
|
-
identId: profile.sub,
|
|
159
|
-
profile
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Retrieve Google Client
|
|
164
|
-
*
|
|
165
|
-
* Redirecting to the webbrowser for the OAuth validation
|
|
166
|
-
* Store the token in user store afterwards
|
|
167
|
-
*/
|
|
168
|
-
async getLocalClient(token, open, storeToken) {
|
|
169
|
-
if (this._client) {
|
|
170
|
-
return this._client;
|
|
171
|
-
}
|
|
172
|
-
const oAuth2Client = this.getOAuthClient();
|
|
173
|
-
if (token) {
|
|
174
|
-
oAuth2Client.setCredentials(token);
|
|
175
|
-
this._client = oAuth2Client;
|
|
176
|
-
return oAuth2Client;
|
|
177
|
-
}
|
|
178
|
-
// Generate the url that will be used for the consent dialog.
|
|
179
|
-
const authorizeUrl = oAuth2Client.generateAuthUrl({
|
|
180
|
-
access_type: "offline",
|
|
181
|
-
scope: this.parameters.scope,
|
|
182
|
-
redirect_uri: "http://localhost:3000/oauth2callback"
|
|
183
|
-
});
|
|
184
|
-
// Open an http server to accept the oauth callback. In this simple example, the
|
|
185
|
-
// only request to our webserver is to /oauth2callback?code=<code>
|
|
186
|
-
return new Promise((resolve, reject) => {
|
|
187
|
-
const server = http
|
|
188
|
-
.createServer(async (req, res) => {
|
|
189
|
-
if (req.url.indexOf("/oauth2callback") > -1) {
|
|
190
|
-
try {
|
|
191
|
-
// acquire the code from the querystring, and close the web server.
|
|
192
|
-
const code = new URL(req.url, `http://localhost:3000`).searchParams.get("code");
|
|
193
|
-
if (code) {
|
|
194
|
-
res.end("Authentication successful! Please return to the console.");
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
res.end("Authentication unsuccessful! Please return to the console.");
|
|
198
|
-
return reject("Failed");
|
|
199
|
-
}
|
|
200
|
-
// Now that we have the code, use that to acquire tokens.
|
|
201
|
-
const r = await oAuth2Client.getToken(code);
|
|
202
|
-
// Make sure to set the credentials on the OAuth2 client.
|
|
203
|
-
storeToken(r.tokens);
|
|
204
|
-
oAuth2Client.setCredentials(r.tokens);
|
|
205
|
-
this._client = oAuth2Client;
|
|
206
|
-
this.log("INFO", "Google Authentication finished.");
|
|
207
|
-
return resolve(this._client);
|
|
208
|
-
}
|
|
209
|
-
catch (err) {
|
|
210
|
-
console.log(err);
|
|
211
|
-
reject(err);
|
|
212
|
-
}
|
|
213
|
-
finally {
|
|
214
|
-
server.close();
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
})
|
|
218
|
-
.listen(3000, () => {
|
|
219
|
-
// open the browser to the authorize url to start the workflow
|
|
220
|
-
this.log("INFO", "Launching your browser for Google API Permission");
|
|
221
|
-
open(authorizeUrl);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
export { GoogleAuthentication };
|
|
227
|
-
//# sourceMappingURL=google-auth.js.map
|
package/lib/google-auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth.js","sourceRoot":"","sources":["../src/google-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth.spec.d.ts","sourceRoot":"","sources":["../src/google-auth.spec.ts"],"names":[],"mappings":""}
|
package/lib/google-auth.spec.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { suite, test } from "@testdeck/mocha";
|
|
8
|
-
import { WebdaError } from "@webda/core";
|
|
9
|
-
import { WebdaTest } from "@webda/core/lib/test.js";
|
|
10
|
-
import * as assert from "assert";
|
|
11
|
-
import fetch from "node-fetch";
|
|
12
|
-
import { GoogleAuthentication } from "./google-auth.js";
|
|
13
|
-
let GoogleAuthTest = class GoogleAuthTest extends WebdaTest {
|
|
14
|
-
async before() {
|
|
15
|
-
await super.before();
|
|
16
|
-
this.service = new GoogleAuthentication(this.webda, "google", {
|
|
17
|
-
client_id: "fake",
|
|
18
|
-
client_secret: "secret"
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
cov() {
|
|
22
|
-
assert.strictEqual(this.service.getName(), "google");
|
|
23
|
-
assert.strictEqual(this.service.getDefaultUrl(), "/google");
|
|
24
|
-
assert.deepStrictEqual(this.service.getCallbackReferer(), [/accounts\.google\.[a-z]+$/]);
|
|
25
|
-
assert.strictEqual(this.service.hasToken(), true);
|
|
26
|
-
assert.strictEqual(this.service.getCallbackQueryParams().length, 6);
|
|
27
|
-
}
|
|
28
|
-
generateAuthUrl() {
|
|
29
|
-
const url = this.service.generateAuthUrl("plopor", "myState", undefined);
|
|
30
|
-
assert.strictEqual(url, "https://accounts.google.com/o/oauth2/v2/auth?access_type=online&scope=email&redirect_uri=plopor&response_type=code&state=myState&client_id=fake");
|
|
31
|
-
}
|
|
32
|
-
mockClient() {
|
|
33
|
-
// Mock client
|
|
34
|
-
// @ts-ignore
|
|
35
|
-
this.service.getOAuthClient = () => {
|
|
36
|
-
return {
|
|
37
|
-
getToken: async (arg) => {
|
|
38
|
-
if (arg === "u1")
|
|
39
|
-
return { tokens: { id_token: arg } };
|
|
40
|
-
},
|
|
41
|
-
generateAuthUrl: () => {
|
|
42
|
-
return "/";
|
|
43
|
-
},
|
|
44
|
-
setCredentials: () => { },
|
|
45
|
-
verifyIdToken: async (args) => {
|
|
46
|
-
if (args.idToken === "u1") {
|
|
47
|
-
return {
|
|
48
|
-
getPayload: () => {
|
|
49
|
-
return {
|
|
50
|
-
sub: "u1",
|
|
51
|
-
email: "u1@webda.io"
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
async tokenAndCallback() {
|
|
61
|
-
var _a;
|
|
62
|
-
this.mockClient();
|
|
63
|
-
let ctx = await this.newContext();
|
|
64
|
-
// Verify normal callback
|
|
65
|
-
ctx.getParameters().state = "plop";
|
|
66
|
-
(_a = ctx.getSession()).oauth ?? (_a.oauth = {});
|
|
67
|
-
ctx.getSession().oauth.state = "bouzouf";
|
|
68
|
-
await assert.rejects(() => this.service.handleCallback(ctx), WebdaError.Forbidden);
|
|
69
|
-
ctx.getSession().oauth.state = "plop";
|
|
70
|
-
ctx.getParameters().code = "u1";
|
|
71
|
-
assert.deepStrictEqual(await this.service.handleCallback(ctx), {
|
|
72
|
-
identId: "u1",
|
|
73
|
-
profile: { sub: "u1", email: "u1@webda.io" }
|
|
74
|
-
});
|
|
75
|
-
ctx.getParameters().code = "u2";
|
|
76
|
-
await assert.rejects(() => this.service.handleCallback(ctx), WebdaError.Forbidden);
|
|
77
|
-
// Verify tokens verification
|
|
78
|
-
await assert.rejects(() => this.service.handleToken(ctx), WebdaError.BadRequest);
|
|
79
|
-
ctx = await this.newContext({ tokens: { id_token: "u1" } });
|
|
80
|
-
assert.deepStrictEqual(await this.service.handleToken(ctx), {
|
|
81
|
-
identId: "u1",
|
|
82
|
-
profile: { sub: "u1", email: "u1@webda.io" }
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
async localClient() {
|
|
86
|
-
const fakeClient = {};
|
|
87
|
-
// @ts-ignore
|
|
88
|
-
this.service._client = fakeClient;
|
|
89
|
-
assert.strictEqual(await this.service.getLocalClient(null, null, null), fakeClient);
|
|
90
|
-
// @ts-ignore
|
|
91
|
-
this.service._client = undefined;
|
|
92
|
-
const client = await this.service.getLocalClient({ id_token: "mytoken" }, null, null);
|
|
93
|
-
assert.deepStrictEqual(client.credentials, { id_token: "mytoken" });
|
|
94
|
-
// @ts-ignore
|
|
95
|
-
this.service._client = undefined;
|
|
96
|
-
let calledUrl;
|
|
97
|
-
await assert.rejects(async () => this.service.getLocalClient(null, url => {
|
|
98
|
-
calledUrl = url;
|
|
99
|
-
fetch("http://localhost:3000/oauth2callback", undefined);
|
|
100
|
-
}, null), /Failed/);
|
|
101
|
-
this.mockClient();
|
|
102
|
-
await assert.rejects(async () => this.service.getLocalClient(null, url => {
|
|
103
|
-
fetch("http://localhost:3000/oauth2callback?code=u2", undefined);
|
|
104
|
-
}, null), /Cannot read propert/);
|
|
105
|
-
let token;
|
|
106
|
-
await this.service.getLocalClient(null, url => {
|
|
107
|
-
// cov only
|
|
108
|
-
fetch("http://localhost:3000/cov", {});
|
|
109
|
-
fetch("http://localhost:3000/oauth2callback?code=u1", {});
|
|
110
|
-
}, async (t) => {
|
|
111
|
-
token = t;
|
|
112
|
-
});
|
|
113
|
-
assert.strictEqual(calledUrl, "https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=email&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Foauth2callback&response_type=code&client_id=fake");
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
__decorate([
|
|
117
|
-
test
|
|
118
|
-
], GoogleAuthTest.prototype, "cov", null);
|
|
119
|
-
__decorate([
|
|
120
|
-
test
|
|
121
|
-
], GoogleAuthTest.prototype, "generateAuthUrl", null);
|
|
122
|
-
__decorate([
|
|
123
|
-
test
|
|
124
|
-
], GoogleAuthTest.prototype, "tokenAndCallback", null);
|
|
125
|
-
__decorate([
|
|
126
|
-
test
|
|
127
|
-
], GoogleAuthTest.prototype, "localClient", null);
|
|
128
|
-
GoogleAuthTest = __decorate([
|
|
129
|
-
suite
|
|
130
|
-
], GoogleAuthTest);
|
|
131
|
-
//# sourceMappingURL=google-auth.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth.spec.js","sourceRoot":"","sources":["../src/google-auth.spec.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,SAAS;IAGpC,KAAK,CAAC,MAAM;QACV,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE;YAC5D,SAAS,EAAE,MAAM;YACjB,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAGD,GAAG;QACD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAGD,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,CAAC,WAAW,CAChB,GAAG,EACH,iJAAiJ,CAClJ,CAAC;IACJ,CAAC;IAED,UAAU;QACR,cAAc;QACd,aAAa;QACb,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,GAAG,EAAE;YACjC,OAAO;gBACL,QAAQ,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;oBACpB,IAAI,GAAG,KAAK,IAAI;wBAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC;gBACzD,CAAC;gBACD,eAAe,EAAE,GAAG,EAAE;oBACpB,OAAO,GAAG,CAAC;gBACb,CAAC;gBACD,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;gBACxB,aAAa,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;oBAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;wBAC1B,OAAO;4BACL,UAAU,EAAE,GAAG,EAAE;gCACf,OAAO;oCACL,GAAG,EAAE,IAAI;oCACT,KAAK,EAAE,aAAa;iCACrB,CAAC;4BACJ,CAAC;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAEK,AAAN,KAAK,CAAC,gBAAgB;;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,yBAAyB;QACzB,GAAG,CAAC,aAAa,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC;QACnC,MAAA,GAAG,CAAC,UAAU,EAAgB,EAAC,KAAK,QAAL,KAAK,GAAK,EAAE,EAAC;QAC5C,GAAG,CAAC,UAAU,EAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QACvD,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACnF,GAAG,CAAC,UAAU,EAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QACpD,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;QAChC,MAAM,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;YAC7D,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;SAC7C,CAAC,CAAC;QACH,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;QAChC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAEnF,6BAA6B;QAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;QACjF,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;YAC1D,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;SAC7C,CAAC,CAAC;IACL,CAAC;IAGK,AAAN,KAAK,CAAC,WAAW;QACf,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,aAAa;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QACpF,aAAa;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtF,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACpE,aAAa;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;QACjC,IAAI,SAAS,CAAC;QACd,MAAM,MAAM,CAAC,OAAO,CAClB,KAAK,IAAI,EAAE,CACT,IAAI,CAAC,OAAO,CAAC,cAAc,CACzB,IAAI,EACJ,GAAG,CAAC,EAAE;YACJ,SAAS,GAAG,GAAG,CAAC;YAChB,KAAK,CAAC,sCAAsC,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC,EACD,IAAI,CACL,EACH,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,MAAM,CAAC,OAAO,CAClB,KAAK,IAAI,EAAE,CACT,IAAI,CAAC,OAAO,CAAC,cAAc,CACzB,IAAI,EACJ,GAAG,CAAC,EAAE;YACJ,KAAK,CAAC,8CAA8C,EAAE,SAAS,CAAC,CAAC;QACnE,CAAC,EACD,IAAI,CACL,EACH,qBAAqB,CACtB,CAAC;QACF,IAAI,KAAK,CAAC;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC/B,IAAI,EACJ,GAAG,CAAC,EAAE;YACJ,WAAW;YACX,KAAK,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;YACvC,KAAK,CAAC,8CAA8C,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,EACD,KAAK,EAAC,CAAC,EAAC,EAAE;YACR,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC,CACF,CAAC;QACF,MAAM,CAAC,WAAW,CAChB,SAAS,EACT,4KAA4K,CAC7K,CAAC;IACJ,CAAC;CACF,CAAA;AA9HC;IADC,IAAI;yCAOJ;AAGD;IADC,IAAI;qDAOJ;AA8BK;IADL,IAAI;sDAyBJ;AAGK;IADL,IAAI;iDAsDJ;AAzIG,cAAc;IADnB,KAAK;GACA,cAAc,CA0InB"}
|