@blinkk/root-cms 1.0.0-rc.34 → 1.0.0-rc.36
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 +42 -17
- package/bin/root-cms.js +5 -23
- package/dist/app.js +42 -14
- package/dist/cli.js +147 -114
- package/dist/ui/ui.css +31 -2
- package/dist/ui/ui.js +433 -130
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -7,26 +7,51 @@ Firestore read/writes will need to be locked down by adding the following to the
|
|
|
7
7
|
rules_version = '2';
|
|
8
8
|
service cloud.firestore {
|
|
9
9
|
match /databases/{database}/documents {
|
|
10
|
-
match /
|
|
11
|
-
allow write:
|
|
12
|
-
if request.auth != null
|
|
13
|
-
&& exists(/databases/$(database)/documents/Projects/$(project))
|
|
14
|
-
&& get(/databases/$(database)/documents/Projects/$(project)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR'];
|
|
15
|
-
allow read:
|
|
16
|
-
if request.auth != null
|
|
17
|
-
&& exists(/databases/$(database)/documents/Projects/$(project))
|
|
18
|
-
&& get(/databases/$(database)/documents/Projects/$(project)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR', 'VIEWER'];
|
|
10
|
+
match /{document=**} {
|
|
11
|
+
allow read, write: if false;
|
|
19
12
|
}
|
|
20
13
|
|
|
21
|
-
match /Projects/{project}
|
|
14
|
+
match /Projects/{project} {
|
|
22
15
|
allow write:
|
|
23
|
-
if
|
|
24
|
-
&& exists(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection))
|
|
25
|
-
&& get(/databases/$(database)/documents/Projects/$(project)/Collections/$(collection)).data.roles[request.auth.token.email] in ['ADMIN', 'EDITOR'];
|
|
16
|
+
if isSignedIn() && userIsAdmin();
|
|
26
17
|
allow read:
|
|
27
|
-
if
|
|
28
|
-
|
|
29
|
-
|
|
18
|
+
if isSignedIn() && userCanRead();
|
|
19
|
+
|
|
20
|
+
match /{collection}/{document=**} {
|
|
21
|
+
allow write:
|
|
22
|
+
if isSignedIn() && userCanWrite();
|
|
23
|
+
allow read:
|
|
24
|
+
if isSignedIn() && userCanRead();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function isSignedIn() {
|
|
28
|
+
return request.auth != null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getRoles() {
|
|
32
|
+
return get(/databases/$(database)/documents/Projects/$(project)).data.roles;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function userCanRead() {
|
|
36
|
+
let roles = getRoles();
|
|
37
|
+
let email = request.auth.token.email;
|
|
38
|
+
let domain = '*@' + email.split('@')[1];
|
|
39
|
+
return (roles[email] in ['ADMIN', 'EDITOR', 'VIEWER']) || (roles[domain] in ['ADMIN', 'EDITOR', 'VIEWER']);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function userCanWrite() {
|
|
43
|
+
let roles = getRoles();
|
|
44
|
+
let email = request.auth.token.email;
|
|
45
|
+
let domain = '*@' + email.split('@')[1];
|
|
46
|
+
return (roles[email] in ['ADMIN', 'EDITOR']) || (roles[domain] in ['ADMIN', 'EDITOR']);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function userIsAdmin() {
|
|
50
|
+
let roles = getRoles();
|
|
51
|
+
let email = request.auth.token.email;
|
|
52
|
+
let domain = '*@' + email.split('@')[1];
|
|
53
|
+
return (roles[email] == 'ADMIN') || (roles[domain] == 'ADMIN');
|
|
54
|
+
}
|
|
30
55
|
}
|
|
31
56
|
}
|
|
32
57
|
}
|
|
@@ -38,4 +63,4 @@ Using Firestore Studio:
|
|
|
38
63
|
- Under `Give the collection an ID`, set `Collection ID` to `Projects`
|
|
39
64
|
- Under `Add its first document` set `Document ID` to your project ID
|
|
40
65
|
- For the first record set `Field name` to `roles` with a `Field type` of `map`
|
|
41
|
-
- In the map set the new `Field name` to your e-mail, `Field type` to `string` and `Field value` to `ADMIN` and save.
|
|
66
|
+
- In the map set the new `Field name` to your e-mail, `Field type` to `string` and `Field value` to `ADMIN` and save.
|
package/bin/root-cms.js
CHANGED
|
@@ -3,33 +3,15 @@
|
|
|
3
3
|
import {createRequire} from 'node:module';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import {fileURLToPath} from 'node:url';
|
|
6
|
-
import {
|
|
7
|
-
import {bgGreen, black} from 'kleur/colors';
|
|
8
|
-
import {initFirebase, generateTypes} from '../dist/cli.js';
|
|
9
|
-
import {loadRootConfig} from '@blinkk/root/node';
|
|
6
|
+
import {CliRunner} from '../dist/cli.js';
|
|
10
7
|
|
|
11
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
9
|
const require = createRequire(import.meta.url);
|
|
13
10
|
const packageJson = require(path.join(__dirname, '../package.json'));
|
|
14
11
|
|
|
15
|
-
async function main() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const rootDir = process.cwd();
|
|
19
|
-
const rootConfig = await loadRootConfig(rootDir, {command: 'root-cms'});
|
|
20
|
-
|
|
21
|
-
const program = new Command('root-cms');
|
|
22
|
-
program.version(packageJson.version);
|
|
23
|
-
program
|
|
24
|
-
.command('init-firebase')
|
|
25
|
-
.description('inits the firebase project with proper security rules')
|
|
26
|
-
.option('--project <project>', 'gcp project id')
|
|
27
|
-
.action(initFirebase(rootConfig));
|
|
28
|
-
program
|
|
29
|
-
.command('generate-types')
|
|
30
|
-
.description('generates root-cms.d.ts from *.schema.ts files in the project')
|
|
31
|
-
.action(generateTypes(rootConfig));
|
|
32
|
-
await program.parseAsync(process.argv);
|
|
12
|
+
async function main(argv) {
|
|
13
|
+
const cli = new CliRunner('root-cms', packageJson.version);
|
|
14
|
+
await cli.run(argv);
|
|
33
15
|
}
|
|
34
16
|
|
|
35
|
-
main();
|
|
17
|
+
main(process.argv);
|
package/dist/app.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// core/app.tsx
|
|
2
|
+
import crypto from "node:crypto";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { render as renderToString } from "preact-render-to-string";
|
|
@@ -21,14 +22,16 @@ function App(props) {
|
|
|
21
22
|
"link",
|
|
22
23
|
{
|
|
23
24
|
rel: "stylesheet",
|
|
24
|
-
href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&display=swap"
|
|
25
|
+
href: "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;900&display=swap",
|
|
26
|
+
nonce: "{NONCE}"
|
|
25
27
|
}
|
|
26
28
|
),
|
|
27
29
|
/* @__PURE__ */ jsx(
|
|
28
30
|
"link",
|
|
29
31
|
{
|
|
30
32
|
rel: "stylesheet",
|
|
31
|
-
href: "https://fonts.googleapis.com/css2?family=Google+Sans:wght@500&display=swap"
|
|
33
|
+
href: "https://fonts.googleapis.com/css2?family=Google+Sans:wght@500&display=swap",
|
|
34
|
+
nonce: "{NONCE}"
|
|
32
35
|
}
|
|
33
36
|
),
|
|
34
37
|
/* @__PURE__ */ jsx(
|
|
@@ -39,7 +42,7 @@ function App(props) {
|
|
|
39
42
|
type: "image/png"
|
|
40
43
|
}
|
|
41
44
|
),
|
|
42
|
-
/* @__PURE__ */ jsx("link", { rel: "stylesheet", href: "{CSS_URL}" })
|
|
45
|
+
/* @__PURE__ */ jsx("link", { rel: "stylesheet", href: "{CSS_URL}", nonce: "{NONCE}" })
|
|
43
46
|
] }),
|
|
44
47
|
/* @__PURE__ */ jsxs("body", { children: [
|
|
45
48
|
/* @__PURE__ */ jsx("div", { id: "root", children: /* @__PURE__ */ jsxs("div", { className: "bootstrap", children: [
|
|
@@ -51,10 +54,11 @@ function App(props) {
|
|
|
51
54
|
{
|
|
52
55
|
dangerouslySetInnerHTML: {
|
|
53
56
|
__html: `window.__ROOT_CTX = ${JSON.stringify(props.ctx)}`
|
|
54
|
-
}
|
|
57
|
+
},
|
|
58
|
+
nonce: "{NONCE}"
|
|
55
59
|
}
|
|
56
60
|
),
|
|
57
|
-
/* @__PURE__ */ jsx("script", { type: "module", src: "{JS_URL}" })
|
|
61
|
+
/* @__PURE__ */ jsx("script", { type: "module", src: "{JS_URL}", nonce: "{NONCE}" })
|
|
58
62
|
] })
|
|
59
63
|
] });
|
|
60
64
|
}
|
|
@@ -93,15 +97,17 @@ async function renderApp(req, res, options) {
|
|
|
93
97
|
const mainHtml = renderToString(/* @__PURE__ */ jsx(App, { title, ctx }));
|
|
94
98
|
let html = `<!doctype html>
|
|
95
99
|
${mainHtml}`;
|
|
100
|
+
const nonce = generateNonce();
|
|
96
101
|
if (req.viteServer) {
|
|
97
102
|
const uiCssPath = path.join(__dirname, "ui/ui.css");
|
|
98
103
|
const uiJsPath = path.join(__dirname, "ui/ui.js");
|
|
99
|
-
const tpl = html.replace("{CSS_URL}", `/@fs${uiCssPath}`).replace("{JS_URL}", `/@fs${uiJsPath}`);
|
|
104
|
+
const tpl = html.replace("{CSS_URL}", `/@fs${uiCssPath}`).replace("{JS_URL}", `/@fs${uiJsPath}`).replaceAll("{NONCE}", nonce);
|
|
100
105
|
html = await req.viteServer.transformIndexHtml(req.originalUrl, tpl);
|
|
101
106
|
} else {
|
|
102
|
-
html = html.replace("{CSS_URL}", "/cms/static/ui.css").replace("{JS_URL}", "/cms/static/ui.js");
|
|
107
|
+
html = html.replace("{CSS_URL}", "/cms/static/ui.css").replace("{JS_URL}", "/cms/static/ui.js").replaceAll("{NONCE}", nonce);
|
|
103
108
|
}
|
|
104
109
|
res.setHeader("Content-Type", "text/html");
|
|
110
|
+
setSecurityHeaders(res, nonce);
|
|
105
111
|
res.send(html);
|
|
106
112
|
}
|
|
107
113
|
function SignIn(props) {
|
|
@@ -123,7 +129,8 @@ function SignIn(props) {
|
|
|
123
129
|
"link",
|
|
124
130
|
{
|
|
125
131
|
rel: "stylesheet",
|
|
126
|
-
href: "https://fonts.googleapis.com/css?family=Google+Sans:400,500&display=swap"
|
|
132
|
+
href: "https://fonts.googleapis.com/css?family=Google+Sans:400,500&display=swap",
|
|
133
|
+
nonce: "{NONCE}"
|
|
127
134
|
}
|
|
128
135
|
),
|
|
129
136
|
/* @__PURE__ */ jsx(
|
|
@@ -134,7 +141,7 @@ function SignIn(props) {
|
|
|
134
141
|
type: "image/png"
|
|
135
142
|
}
|
|
136
143
|
),
|
|
137
|
-
/* @__PURE__ */ jsx("link", { rel: "stylesheet", href: "{CSS_URL}" })
|
|
144
|
+
/* @__PURE__ */ jsx("link", { rel: "stylesheet", href: "{CSS_URL}", nonce: "{NONCE}" })
|
|
138
145
|
] }),
|
|
139
146
|
/* @__PURE__ */ jsxs("body", { children: [
|
|
140
147
|
/* @__PURE__ */ jsx("div", { id: "root", children: /* @__PURE__ */ jsxs("div", { className: "bootstrap", children: [
|
|
@@ -146,10 +153,11 @@ function SignIn(props) {
|
|
|
146
153
|
{
|
|
147
154
|
dangerouslySetInnerHTML: {
|
|
148
155
|
__html: `window.__ROOT_CTX = ${JSON.stringify(props.ctx)}`
|
|
149
|
-
}
|
|
156
|
+
},
|
|
157
|
+
nonce: "{NONCE}"
|
|
150
158
|
}
|
|
151
159
|
),
|
|
152
|
-
/* @__PURE__ */ jsx("script", { type: "module", src: "{JS_URL}" })
|
|
160
|
+
/* @__PURE__ */ jsx("script", { type: "module", src: "{JS_URL}", nonce: "{NONCE}" })
|
|
153
161
|
] })
|
|
154
162
|
] });
|
|
155
163
|
}
|
|
@@ -158,19 +166,39 @@ async function renderSignIn(req, res, options) {
|
|
|
158
166
|
const mainHtml = renderToString(/* @__PURE__ */ jsx(SignIn, { title: "Sign in", ctx }));
|
|
159
167
|
let html = `<!doctype html>
|
|
160
168
|
${mainHtml}`;
|
|
169
|
+
const nonce = generateNonce();
|
|
161
170
|
if (req.viteServer) {
|
|
162
171
|
const cssPath = path.join(__dirname, "ui/signin.css");
|
|
163
172
|
const jsPath = path.join(__dirname, "ui/signin.js");
|
|
164
|
-
const tpl = html.replace("{CSS_URL}", `/@fs${cssPath}`).replace("{JS_URL}", `/@fs${jsPath}`);
|
|
173
|
+
const tpl = html.replace("{CSS_URL}", `/@fs${cssPath}`).replace("{JS_URL}", `/@fs${jsPath}`).replaceAll("{NONCE}", nonce);
|
|
165
174
|
html = await req.viteServer.transformIndexHtml(req.originalUrl, tpl);
|
|
166
175
|
} else {
|
|
167
|
-
html = html.replace("{CSS_URL}", "/cms/static/signin.css").replace("{JS_URL}", "/cms/static/signin.js");
|
|
176
|
+
html = html.replace("{CSS_URL}", "/cms/static/signin.css").replace("{JS_URL}", "/cms/static/signin.js").replaceAll("{NONCE}", nonce);
|
|
168
177
|
}
|
|
169
178
|
res.setHeader("Content-Type", "text/html");
|
|
179
|
+
setSecurityHeaders(res, nonce);
|
|
170
180
|
res.send(html);
|
|
171
181
|
}
|
|
182
|
+
function generateNonce() {
|
|
183
|
+
return crypto.randomBytes(16).toString("base64");
|
|
184
|
+
}
|
|
185
|
+
function setSecurityHeaders(res, nonce) {
|
|
186
|
+
res.setHeader("x-frame-options", "SAMEORIGIN");
|
|
187
|
+
res.setHeader(
|
|
188
|
+
"strict-transport-security",
|
|
189
|
+
"max-age=63072000; includeSubdomains; preload"
|
|
190
|
+
);
|
|
191
|
+
res.setHeader("x-content-type-options", "nosniff");
|
|
192
|
+
res.setHeader("x-xss-protection", "1; mode=block");
|
|
193
|
+
const directives = [
|
|
194
|
+
"base-uri 'none'",
|
|
195
|
+
"object-src 'none'",
|
|
196
|
+
`script-src 'self' 'unsafe-eval' 'nonce-${nonce}' *.google.com`
|
|
197
|
+
];
|
|
198
|
+
res.setHeader("content-security-policy-report-only", directives.join(";"));
|
|
199
|
+
}
|
|
172
200
|
export {
|
|
173
201
|
renderApp,
|
|
174
202
|
renderSignIn
|
|
175
203
|
};
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gJy4vc2NoZW1hLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmludGVyZmFjZSBBcHBQcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBBcHAocHJvcHM6IEFwcFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwiaWNvblwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9paks1MFRmUWxWX3lKdzNpLUNNbG5ENm9zSDRQYm9aQklMWnJKY1dob05NRW1veUNENWUxYkF4WGJhT1BlNXc0Z0dfU2NmMzdFWHJtWjZwOHNQMmx1ZTVmTFo0MTltNUp5TE1zPWUzODUtdzI1NlwiXG4gICAgICAgICAgdHlwZT1cImltYWdlL3BuZ1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQXBwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25Nb2R1bGVzID0gaW1wb3J0Lm1ldGEuZ2xvYignL2NvbGxlY3Rpb25zLyouc2NoZW1hLnRzJywge1xuICAgIGVhZ2VyOiB0cnVlLFxuICB9KSBhcyBhbnk7XG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb2xsZWN0aW9uPiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uTW9kdWxlcykuZm9yRWFjaCgobW9kdWxlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHBhdGgucGFyc2UobW9kdWxlSWQpLmJhc2Uuc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCBtb2R1bGUgPSBjb2xsZWN0aW9uTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG1vZHVsZS5kZWZhdWx0IGFzIENvbGxlY3Rpb247XG4gICAgY29sbGVjdGlvbnNbY29sbGVjdGlvbklkXSA9IGNvbGxlY3Rpb247XG4gIH0pO1xuICBjb25zdCByb290Q29uZmlnID0gb3B0aW9ucy5yb290Q29uZmlnIHx8IHt9O1xuICBjb25zdCBjbXNDb25maWcgPSBvcHRpb25zLmNtc0NvbmZpZyB8fCB7fTtcbiAgbGV0IGdjaSA9IGNtc0NvbmZpZy5nY2k7XG4gIGlmIChnY2kgPT09IHRydWUpIHtcbiAgICBnY2kgPSAnaHR0cHM6Ly9nY2kucm9vdGpzLmRldic7XG4gIH1cbiAgY29uc3QgY3R4ID0ge1xuICAgIHJvb3RDb25maWc6IHtcbiAgICAgIHByb2plY3RJZDogY21zQ29uZmlnLmlkIHx8ICdkZWZhdWx0JyxcbiAgICAgIHByb2plY3ROYW1lOiBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJycsXG4gICAgICBkb21haW46IHJvb3RDb25maWcuZG9tYWluIHx8ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGJhc2U6IHJvb3RDb25maWcuYmFzZSB8fCAnLycsXG4gICAgICBnY2k6IGdjaSxcbiAgICAgIGkxOG46IHJvb3RDb25maWcuaTE4bixcbiAgICB9LFxuICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgIGdhcGk6IGNtc0NvbmZpZy5nYXBpLFxuICAgIGNvbGxlY3Rpb25zOiBjb2xsZWN0aW9ucyxcbiAgfTtcbiAgY29uc3QgcHJvamVjdE5hbWUgPSBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJyc7XG4gIGNvbnN0IHRpdGxlID0gcHJvamVjdE5hbWUgPyBgJHtwcm9qZWN0TmFtZX0gXHUyMDEzIFJvb3QuanMgQ01TYCA6ICdSb290LmpzIENNUyc7XG5cbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8QXBwIHRpdGxlPXt0aXRsZX0gY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCB1aUNzc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuY3NzJyk7XG4gICAgY29uc3QgdWlKc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvdWkuanMnKTtcbiAgICBjb25zdCB0cGwgPSBodG1sXG4gICAgICAucmVwbGFjZSgne0NTU19VUkx9JywgYC9AZnMke3VpQ3NzUGF0aH1gKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgYC9AZnMke3VpSnNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy91aS5jc3MnKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgJy9jbXMvc3RhdGljL3VpLmpzJyk7XG4gIH1cbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICByZXMuc2VuZChodG1sKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25JblByb3BzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgY3R4OiBhbnk7XG59XG5cbmZ1bmN0aW9uIFNpZ25Jbihwcm9wczogU2lnbkluUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8aHRtbD5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPlxuICAgICAgICA8dGl0bGU+e3Byb3BzLnRpdGxlfTwvdGl0bGU+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCIgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJwcmVjb25uZWN0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9R29vZ2xlK1NhbnM6NDAwLDUwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cImljb25cIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vaWpLNTBUZlFsVl95SnczaS1DTWxuRDZvc0g0UGJvWkJJTFpySmNXaG9OTUVtb3lDRDVlMWJBeFhiYU9QZTV3NGdHX1NjZjM3RVhybVo2cDhzUDJsdWU1ZkxaNDE5bTVKeUxNcz1lMzg1LXcyNTZcIlxuICAgICAgICAgIHR5cGU9XCJpbWFnZS9wbmdcIlxuICAgICAgICAvPlxuICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIntDU1NfVVJMfVwiIC8+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPGRpdiBpZD1cInJvb3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcFwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cImJvb3RzdHJhcF9fbG9hZGluZ1wiPkxvYWRpbmcuLi48L2gxPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib290c3RyYXAtZXJyb3JcIj5cbiAgICAgICAgICAgICAgSWYgdGhpcyBwYWdlIGZhaWxzIHRvIGxvYWQsIHRyeSBhIGZvcmNlIHJlZnJlc2ggYnkgaG9sZGluZyB0aGVcbiAgICAgICAgICAgICAgc2hpZnQga2V5IHdoaWxlIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fUk9PVF9DVFggPSAke0pTT04uc3RyaW5naWZ5KHByb3BzLmN0eCl9YCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCJ7SlNfVVJMfVwiPjwvc2NyaXB0PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJTaWduSW4ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBhbnkpIHtcbiAgY29uc3QgY3R4ID0ge25hbWU6IG9wdGlvbnMubmFtZSwgZmlyZWJhc2VDb25maWc6IG9wdGlvbnMuZmlyZWJhc2VDb25maWd9O1xuICBjb25zdCBtYWluSHRtbCA9IHJlbmRlclRvU3RyaW5nKDxTaWduSW4gdGl0bGU9XCJTaWduIGluXCIgY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCBjc3NQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3NpZ25pbi5jc3MnKTtcbiAgICBjb25zdCBqc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvc2lnbmluLmpzJyk7XG4gICAgY29uc3QgdHBsID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsIGAvQGZzJHtjc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7anNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uanMnKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUc1QixTQUFRLFVBQVUsc0JBQXFCO0FBY2pDLFNBQ0UsS0FERjtBQVZOLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQU83RCxTQUFTLElBQUksT0FBaUI7QUFDNUIsU0FDRSxxQkFBQyxVQUNDO0FBQUEseUJBQUMsVUFDQztBQUFBLDBCQUFDLFdBQU8sZ0JBQU0sT0FBTTtBQUFBLE1BQ3BCLG9CQUFDLFVBQUssS0FBSSxjQUFhLE1BQUssZ0NBQStCO0FBQUEsTUFDM0Q7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLGFBQVk7QUFBQTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxLQUFJO0FBQUEsVUFDSixNQUFLO0FBQUE7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsS0FBSTtBQUFBLFVBQ0osTUFBSztBQUFBO0FBQUEsTUFDUDtBQUFBLE1BQ0E7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLE1BQUs7QUFBQTtBQUFBLE1BQ1A7QUFBQSxNQUNBLG9CQUFDLFVBQUssS0FBSSxjQUFhLE1BQUssYUFBWTtBQUFBLE9BQzFDO0FBQUEsSUFDQSxxQkFBQyxVQUNDO0FBQUEsMEJBQUMsU0FBSSxJQUFHLFFBQ04sK0JBQUMsU0FBSSxXQUFVLGFBQ2I7QUFBQSw0QkFBQyxRQUFHLFdBQVUsc0JBQXFCLHdCQUFVO0FBQUEsUUFDN0Msb0JBQUMsU0FBSSxXQUFVLG1CQUFrQixpSEFHakM7QUFBQSxTQUNGLEdBQ0Y7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FB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
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tICcuL3NjaGVtYS5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5pbnRlcmZhY2UgQXBwUHJvcHMge1xuICB0aXRsZTogc3RyaW5nO1xuICBjdHg6IGFueTtcbn1cblxuZnVuY3Rpb24gQXBwKHByb3BzOiBBcHBQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxodG1sPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDx0aXRsZT57cHJvcHMudGl0bGV9PC90aXRsZT5cbiAgICAgICAgPGxpbmsgcmVsPVwicHJlY29ubmVjdFwiIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tXCIgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJwcmVjb25uZWN0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRAMzAwOzQwMDs1MDA7NjAwOzcwMDs5MDAmZGlzcGxheT1zd2FwXCJcbiAgICAgICAgICBub25jZT1cIntOT05DRX1cIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgICAgbm9uY2U9XCJ7Tk9OQ0V9XCJcbiAgICAgICAgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJpY29uXCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2lqSzUwVGZRbFZfeUp3M2ktQ01sbkQ2b3NINFBib1pCSUxackpjV2hvTk1FbW95Q0Q1ZTFiQXhYYmFPUGU1dzRnR19TY2YzN0VYcm1aNnA4c1AybHVlNWZMWjQxOW01SnlMTXM9ZTM4NS13MjU2XCJcbiAgICAgICAgICB0eXBlPVwiaW1hZ2UvcG5nXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJ7Q1NTX1VSTH1cIiBub25jZT1cIntOT05DRX1cIiAvPlxuICAgICAgPC9oZWFkPlxuICAgICAgPGJvZHk+XG4gICAgICAgIDxkaXYgaWQ9XCJyb290XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib290c3RyYXBcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJib290c3RyYXBfX2xvYWRpbmdcIj5Mb2FkaW5nLi4uPC9oMT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwLWVycm9yXCI+XG4gICAgICAgICAgICAgIElmIHRoaXMgcGFnZSBmYWlscyB0byBsb2FkLCB0cnkgYSBmb3JjZSByZWZyZXNoIGJ5IGhvbGRpbmcgdGhlXG4gICAgICAgICAgICAgIHNoaWZ0IGtleSB3aGlsZSByZWZyZXNoaW5nIHRoZSBwYWdlLlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogYHdpbmRvdy5fX1JPT1RfQ1RYID0gJHtKU09OLnN0cmluZ2lmeShwcm9wcy5jdHgpfWAsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBub25jZT1cIntOT05DRX1cIlxuICAgICAgICAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCJ7SlNfVVJMfVwiIG5vbmNlPVwie05PTkNFfVwiPjwvc2NyaXB0PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckFwcChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG9wdGlvbnM6IGFueSkge1xuICBjb25zdCBjb2xsZWN0aW9uTW9kdWxlcyA9IGltcG9ydC5tZXRhLmdsb2IoJy9jb2xsZWN0aW9ucy8qLnNjaGVtYS50cycsIHtcbiAgICBlYWdlcjogdHJ1ZSxcbiAgfSkgYXMgYW55O1xuICBjb25zdCBjb2xsZWN0aW9uczogUmVjb3JkPHN0cmluZywgQ29sbGVjdGlvbj4gPSB7fTtcbiAgT2JqZWN0LmtleXMoY29sbGVjdGlvbk1vZHVsZXMpLmZvckVhY2goKG1vZHVsZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWQgPSBwYXRoLnBhcnNlKG1vZHVsZUlkKS5iYXNlLnNwbGl0KCcuJylbMF07XG4gICAgY29uc3QgbW9kdWxlID0gY29sbGVjdGlvbk1vZHVsZXNbbW9kdWxlSWRdO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBtb2R1bGUuZGVmYXVsdCBhcyBDb2xsZWN0aW9uO1xuICAgIGNvbGxlY3Rpb25zW2NvbGxlY3Rpb25JZF0gPSBjb2xsZWN0aW9uO1xuICB9KTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IG9wdGlvbnMucm9vdENvbmZpZyB8fCB7fTtcbiAgY29uc3QgY21zQ29uZmlnID0gb3B0aW9ucy5jbXNDb25maWcgfHwge307XG4gIGxldCBnY2kgPSBjbXNDb25maWcuZ2NpO1xuICBpZiAoZ2NpID09PSB0cnVlKSB7XG4gICAgZ2NpID0gJ2h0dHBzOi8vZ2NpLnJvb3Rqcy5kZXYnO1xuICB9XG4gIGNvbnN0IGN0eCA9IHtcbiAgICByb290Q29uZmlnOiB7XG4gICAgICBwcm9qZWN0SWQ6IGNtc0NvbmZpZy5pZCB8fCAnZGVmYXVsdCcsXG4gICAgICBwcm9qZWN0TmFtZTogY21zQ29uZmlnLm5hbWUgfHwgY21zQ29uZmlnLmlkIHx8ICcnLFxuICAgICAgZG9tYWluOiByb290Q29uZmlnLmRvbWFpbiB8fCAnaHR0cHM6Ly9leGFtcGxlLmNvbScsXG4gICAgICBiYXNlOiByb290Q29uZmlnLmJhc2UgfHwgJy8nLFxuICAgICAgZ2NpOiBnY2ksXG4gICAgICBpMThuOiByb290Q29uZmlnLmkxOG4sXG4gICAgfSxcbiAgICBmaXJlYmFzZUNvbmZpZzogb3B0aW9ucy5maXJlYmFzZUNvbmZpZyxcbiAgICBnYXBpOiBjbXNDb25maWcuZ2FwaSxcbiAgICBjb2xsZWN0aW9uczogY29sbGVjdGlvbnMsXG4gIH07XG4gIGNvbnN0IHByb2plY3ROYW1lID0gY21zQ29uZmlnLm5hbWUgfHwgY21zQ29uZmlnLmlkIHx8ICcnO1xuICBjb25zdCB0aXRsZSA9IHByb2plY3ROYW1lID8gYCR7cHJvamVjdE5hbWV9IFx1MjAxMyBSb290LmpzIENNU2AgOiAnUm9vdC5qcyBDTVMnO1xuXG4gIGNvbnN0IG1haW5IdG1sID0gcmVuZGVyVG9TdHJpbmcoPEFwcCB0aXRsZT17dGl0bGV9IGN0eD17Y3R4fSAvPik7XG4gIGxldCBodG1sID0gYDwhZG9jdHlwZSBodG1sPlxcbiR7bWFpbkh0bWx9YDtcbiAgY29uc3Qgbm9uY2UgPSBnZW5lcmF0ZU5vbmNlKCk7XG4gIGlmIChyZXEudml0ZVNlcnZlcikge1xuICAgIGNvbnN0IHVpQ3NzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS91aS5jc3MnKTtcbiAgICBjb25zdCB1aUpzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS91aS5qcycpO1xuICAgIGNvbnN0IHRwbCA9IGh0bWxcbiAgICAgIC5yZXBsYWNlKCd7Q1NTX1VSTH0nLCBgL0BmcyR7dWlDc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7dWlKc1BhdGh9YClcbiAgICAgIC5yZXBsYWNlQWxsKCd7Tk9OQ0V9Jywgbm9uY2UpO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy91aS5jc3MnKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgJy9jbXMvc3RhdGljL3VpLmpzJylcbiAgICAgIC5yZXBsYWNlQWxsKCd7Tk9OQ0V9Jywgbm9uY2UpO1xuICB9XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgc2V0U2VjdXJpdHlIZWFkZXJzKHJlcywgbm9uY2UpO1xuICByZXMuc2VuZChodG1sKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25JblByb3BzIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgY3R4OiBhbnk7XG59XG5cbmZ1bmN0aW9uIFNpZ25Jbihwcm9wczogU2lnbkluUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8aHRtbD5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPlxuICAgICAgICA8dGl0bGU+e3Byb3BzLnRpdGxlfTwvdGl0bGU+XG4gICAgICAgIDxsaW5rIHJlbD1cInByZWNvbm5lY3RcIiBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbVwiIC8+XG4gICAgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCIgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJwcmVjb25uZWN0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbVwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9R29vZ2xlK1NhbnM6NDAwLDUwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAgIG5vbmNlPVwie05PTkNFfVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwiaWNvblwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9paks1MFRmUWxWX3lKdzNpLUNNbG5ENm9zSDRQYm9aQklMWnJKY1dob05NRW1veUNENWUxYkF4WGJhT1BlNXc0Z0dfU2NmMzdFWHJtWjZwOHNQMmx1ZTVmTFo0MTltNUp5TE1zPWUzODUtdzI1NlwiXG4gICAgICAgICAgdHlwZT1cImltYWdlL3BuZ1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgbm9uY2U9XCJ7Tk9OQ0V9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgICAgbm9uY2U9XCJ7Tk9OQ0V9XCJcbiAgICAgICAgLz5cbiAgICAgICAgPHNjcmlwdCB0eXBlPVwibW9kdWxlXCIgc3JjPVwie0pTX1VSTH1cIiBub25jZT1cIntOT05DRX1cIj48L3NjcmlwdD5cbiAgICAgIDwvYm9keT5cbiAgICA8L2h0bWw+XG4gICk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU2lnbkluKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGN0eCA9IHtuYW1lOiBvcHRpb25zLm5hbWUsIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnfTtcbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8U2lnbkluIHRpdGxlPVwiU2lnbiBpblwiIGN0eD17Y3R4fSAvPik7XG4gIGxldCBodG1sID0gYDwhZG9jdHlwZSBodG1sPlxcbiR7bWFpbkh0bWx9YDtcbiAgY29uc3Qgbm9uY2UgPSBnZW5lcmF0ZU5vbmNlKCk7XG4gIGlmIChyZXEudml0ZVNlcnZlcikge1xuICAgIGNvbnN0IGNzc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvc2lnbmluLmNzcycpO1xuICAgIGNvbnN0IGpzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS9zaWduaW4uanMnKTtcbiAgICBjb25zdCB0cGwgPSBodG1sXG4gICAgICAucmVwbGFjZSgne0NTU19VUkx9JywgYC9AZnMke2Nzc1BhdGh9YClcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsIGAvQGZzJHtqc1BhdGh9YClcbiAgICAgIC5yZXBsYWNlQWxsKCd7Tk9OQ0V9Jywgbm9uY2UpO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uanMnKVxuICAgICAgLnJlcGxhY2VBbGwoJ3tOT05DRX0nLCBub25jZSk7XG4gIH1cbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICBzZXRTZWN1cml0eUhlYWRlcnMocmVzLCBub25jZSk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU5vbmNlKCkge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmZ1bmN0aW9uIHNldFNlY3VyaXR5SGVhZGVycyhyZXM6IFJlc3BvbnNlLCBub25jZTogc3RyaW5nKSB7XG4gIHJlcy5zZXRIZWFkZXIoJ3gtZnJhbWUtb3B0aW9ucycsICdTQU1FT1JJR0lOJyk7XG4gIHJlcy5zZXRIZWFkZXIoXG4gICAgJ3N0cmljdC10cmFuc3BvcnQtc2VjdXJpdHknLFxuICAgICdtYXgtYWdlPTYzMDcyMDAwOyBpbmNsdWRlU3ViZG9tYWluczsgcHJlbG9hZCdcbiAgKTtcbiAgcmVzLnNldEhlYWRlcigneC1jb250ZW50LXR5cGUtb3B0aW9ucycsICdub3NuaWZmJyk7XG4gIHJlcy5zZXRIZWFkZXIoJ3gteHNzLXByb3RlY3Rpb24nLCAnMTsgbW9kZT1ibG9jaycpO1xuXG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBbXG4gICAgXCJiYXNlLXVyaSAnbm9uZSdcIixcbiAgICBcIm9iamVjdC1zcmMgJ25vbmUnXCIsXG4gICAgYHNjcmlwdC1zcmMgJ3NlbGYnICd1bnNhZmUtZXZhbCcgJ25vbmNlLSR7bm9uY2V9JyAqLmdvb2dsZS5jb21gLFxuICBdO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXNlY3VyaXR5LXBvbGljeS1yZXBvcnQtb25seScsIGRpcmVjdGl2ZXMuam9pbignOycpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLFlBQVk7QUFDbkIsT0FBTyxVQUFVO0FBQ2pCLFNBQVEscUJBQW9CO0FBRTVCLFNBQVEsVUFBVSxzQkFBcUI7QUFhakMsU0FDRSxLQURGO0FBVk4sSUFBTSxZQUFZLEtBQUssUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBTzdELFNBQVMsSUFBSSxPQUFpQjtBQUM1QixTQUNFLHFCQUFDLFVBQ0M7QUFBQSx5QkFBQyxVQUNDO0FBQUEsMEJBQUMsV0FBTyxnQkFBTSxPQUFNO0FBQUEsTUFDcEIsb0JBQUMsVUFBSyxLQUFJLGNBQWEsTUFBSyxnQ0FBK0I7QUFBQSxNQUMzRDtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsS0FBSTtBQUFBLFVBQ0osTUFBSztBQUFBLFVBQ0wsYUFBWTtBQUFBO0FBQUEsTUFDZDtBQUFBLE1BQ0E7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNDLEtBQUk7QUFBQSxVQUNKLE1BQUs7QUFBQSxVQUNMLE9BQU07QUFBQTtBQUFBLE1BQ1I7QUFBQSxNQUNBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDQyxLQUFJO0FBQUEsVUFDSixNQUFLO0FBQUEsVUFDTCxPQUFN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
|