@centia-io/sdk 0.0.25 → 0.0.27

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 ADDED
@@ -0,0 +1,288 @@
1
+ # @centia-io/sdk
2
+
3
+ TypeScript/JavaScript client SDK for Centia GC2. It provides:
4
+
5
+ - Authentication helpers:
6
+ - CodeFlow (OAuth 2.0 Authorization Code + PKCE) for browser apps
7
+ - PasswordFlow for trusted/CLI/server environments
8
+ - Data access:
9
+ - Sql: Execute parameterized SQL
10
+ - Rpc: Call JSON-RPC methods
11
+ - createApi: A tiny type-safe helper that maps TypeScript interfaces to JSON‑RPC calls
12
+
13
+ This README focuses on CodeFlow, PasswordFlow, Sql, Rpc and Api.ts (createApi).
14
+
15
+ ## Installation
16
+
17
+ - npm: `npm install @centia-io/sdk`
18
+ - pnpm: `pnpm add @centia-io/sdk`
19
+ - yarn: `yarn add @centia-io/sdk`
20
+
21
+ Requirements:
22
+ - Browser or Node.js 18+ (for global `fetch`).
23
+ - An accessible GC2 host URL and client credentials.
24
+
25
+ ESM import:
26
+ ```ts
27
+ import { CodeFlow, PasswordFlow, Sql, Rpc, createApi } from "@centia-io/sdk";
28
+ import type { RpcRequest, RpcResponse, PgTypes } from "@centia-io/sdk";
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Authentication
34
+
35
+ The SDK handles token storage and refresh for you.
36
+ - Tokens and minimal options are saved to `localStorage` in browsers. In non‑browser environments, an in‑memory store is used for the lifetime of the process.
37
+ - Authorization headers are added automatically for Sql/Rpc requests.
38
+
39
+ ### CodeFlow (Browser, OAuth 2.0 Authorization Code + PKCE)
40
+
41
+ Use this flow in browser applications where you can redirect the user to the GC2 login page.
42
+
43
+ Required options:
44
+ - `host`: Base URL of your GC2 instance, e.g. `https://your.gc2.host`
45
+ - `clientId`: OAuth client id configured in GC2
46
+ - `redirectUri`: The URL in your app that handles the redirect back from GC2 (must be whitelisted)
47
+ - `scope` (optional): space‑separated scopes, e.g. `"openid profile"`
48
+
49
+ Example (vanilla JS/TS + SPA):
50
+ ```ts
51
+ import { CodeFlow } from "@centia-io/sdk";
52
+
53
+ const codeFlow = new CodeFlow({
54
+ host: "https://your.gc2.host",
55
+ clientId: "your-client-id",
56
+ redirectUri: window.location.origin + "/auth/callback",
57
+ scope: "openid"
58
+ });
59
+
60
+ // On app startup, call redirectHandle() once to complete a login redirect (if any)
61
+ codeFlow.redirectHandle().then((signedIn) => {
62
+ if (signedIn) {
63
+ console.log("User signed in");
64
+ }
65
+ });
66
+
67
+ // Start sign-in when user clicks Login
68
+ function onLoginClick() {
69
+ codeFlow.signIn(); // Redirects to GC2 auth page
70
+ }
71
+
72
+ // Sign out (clears tokens/options and redirects to signout endpoint)
73
+ function onLogoutClick() {
74
+ codeFlow.signOut();
75
+ }
76
+ ```
77
+
78
+ Notes:
79
+ - `redirectHandle()` detects errors from the auth server, validates `state` (CSRF protection), exchanges the `code` for tokens, stores tokens and cleans up the URL.
80
+ - `signOut()` clears local tokens/options and redirects to the sign-out URL. If you only need to clear local state without redirect, call `codeFlow.clear()`.
81
+
82
+ ### PasswordFlow (Trusted environments, CLI/Server)
83
+
84
+ Use only in trusted environments. The user’s database credentials are exchanged directly for tokens.
85
+
86
+ Required options:
87
+ - `host`
88
+ - `clientId`
89
+ - `username`
90
+ - `password`
91
+ - `database`
92
+
93
+ Example (Node.js):
94
+ ```ts
95
+ import { PasswordFlow } from "@centia-io/sdk";
96
+
97
+ const flow = new PasswordFlow({
98
+ host: "http://localhost:8080",
99
+ clientId: "gc2-cli",
100
+ username: "mydb",
101
+ password: "secret",
102
+ database: "mydb"
103
+ });
104
+
105
+ await flow.signIn();
106
+ // Tokens are now stored; subsequent Sql/Rpc calls will include Authorization header.
107
+
108
+ // ... your code ...
109
+
110
+ flow.signOut(); // Clears tokens/options in local storage (no redirect)
111
+ ```
112
+
113
+ ---
114
+
115
+ ## SQL
116
+
117
+ Execute parameterized SQL against GC2.
118
+
119
+ - Class: `new Sql()`
120
+ - Method: `exec(request: SqlRequest): Promise<SQLResponse>`
121
+ - Endpoint: `POST {host}/api/v4/sql`
122
+
123
+ Types (simplified):
124
+ - `SqlRequest` has:
125
+ - `q`: SQL string, you can use named placeholders like `:a` (server-side feature)
126
+ - `params?`: object with values for placeholders
127
+ - `type_hints?`: optional explicit type hints
128
+ - `type_formats?`: optional per-column format strings
129
+ - `SQLResponse` has:
130
+ - `schema`: a map of column name -> `{ type: string, array: boolean }`
131
+ - `data`: an array of rows (records)
132
+
133
+ Example:
134
+ ```ts
135
+ import { Sql } from "@centia-io/sdk";
136
+
137
+ const sql = new Sql();
138
+
139
+ const payload = {
140
+ a: 1,
141
+ b: "hello",
142
+ c: "3.14", // numeric/decimal values are strings
143
+ d: ["x", "y"], // arrays are supported
144
+ e: { nested: [1,2] } // JSON
145
+ };
146
+
147
+ const res = await sql.exec({
148
+ q: "select :a::int as a, :b::varchar as b, :c::numeric as c, :d::varchar[] as d, :e::jsonb as e",
149
+ params: payload
150
+ });
151
+
152
+ console.log(res.schema); // { a: {type: 'int4', array: false}, ... }
153
+ console.log(res.data); // [{ a: 1, b: 'hello', c: '3.14', d: ['x','y'], e: {nested:[1,2]} }]
154
+ ```
155
+
156
+ Typing the rows:
157
+ ```ts
158
+ import type { PgTypes } from "@centia-io/sdk";
159
+
160
+ interface Row extends PgTypes.DataRow {
161
+ a: number;
162
+ b: string;
163
+ c: PgTypes.NumericString;
164
+ d: PgTypes.PgArray<string>;
165
+ e: PgTypes.JsonValue;
166
+ }
167
+
168
+ // res: PgTypes.SQLResponse<Row>
169
+ const res = await sql.exec({ q: "...", params: payload }) as PgTypes.SQLResponse<Row>;
170
+ ```
171
+
172
+ ---
173
+
174
+ ## RPC
175
+
176
+ Call JSON‑RPC methods exposed by GC2.
177
+
178
+ - Class: `new Rpc()`
179
+ - Method: `call(request: RpcRequest): Promise<RpcResponse>`
180
+ - Endpoint: `POST {host}/api/v4/call`
181
+
182
+ Types (simplified):
183
+ - `RpcRequest` has `jsonrpc: "2.0"`, `method`, optional `params`, optional `id`
184
+ - `RpcResponse` has `jsonrpc: "2.0"`, `id`, and `result` with `{ schema, data }`
185
+
186
+ Example:
187
+ ```ts
188
+ import { Rpc } from "@centia-io/sdk";
189
+
190
+ const rpc = new Rpc();
191
+
192
+ const payload = { a: 1, b: "hello" };
193
+
194
+ const res = await rpc.call({
195
+ jsonrpc: "2.0",
196
+ method: "typeTest",
197
+ params: payload,
198
+ id: 1
199
+ });
200
+
201
+ console.log(res.result.schema);
202
+ console.log(res.result.data); // array of rows
203
+ ```
204
+
205
+ Typing the rows:
206
+ ```ts
207
+ import type { PgTypes } from "@centia-io/sdk";
208
+
209
+ interface Row extends PgTypes.DataRow {
210
+ a: number;
211
+ b: string;
212
+ }
213
+
214
+ const res = await rpc.call({ jsonrpc: "2.0", method: "typeTest", params: payload }) as PgTypes.RpcResponse<Row>;
215
+ ```
216
+
217
+ ---
218
+
219
+ ## createApi (Api.ts)
220
+
221
+ A tiny helper that builds a Proxy around `Rpc` so you can call `api.someMethod(params)` directly, with TypeScript autocompletion and type‑checking based on your own interface.
222
+
223
+ Under the hood, each property access becomes a JSON‑RPC call with the property name as the method. The helper returns `result.data` (array of rows) from the RPC response.
224
+
225
+ Example with typing:
226
+ ```ts
227
+ import { createApi } from "@centia-io/sdk";
228
+ import type { PgTypes } from "@centia-io/sdk";
229
+
230
+ // Define the shape of your RPC methods and return types
231
+ interface MyApi {
232
+ typeTest(params: {
233
+ a: number;
234
+ b: string;
235
+ c: PgTypes.NumericString;
236
+ d: PgTypes.PgArray<string>;
237
+ e: PgTypes.JsonValue;
238
+ }): Promise<Array<{
239
+ a: number;
240
+ b: string;
241
+ c: PgTypes.NumericString;
242
+ d: PgTypes.PgArray<string>;
243
+ e: PgTypes.JsonValue;
244
+ }>>;
245
+ }
246
+
247
+ const api = createApi<MyApi>();
248
+
249
+ const rows = await api.typeTest({
250
+ a: 1,
251
+ b: "hej",
252
+ c: "3.4",
253
+ d: ["ds", "sdsd"],
254
+ e: { zdsd: [2,3,4,5,6,7,8,9,10] }
255
+ });
256
+
257
+ console.log(rows); // typed row array
258
+ ```
259
+
260
+ Notes:
261
+ - `createApi<T>()` relies on naming conventions: the property name is the JSON‑RPC `method` name.
262
+ - Each call returns `result.data` from the RPC response (array of rows).
263
+
264
+ ---
265
+
266
+ ## Error handling
267
+
268
+ - Network/HTTP errors: thrown as `Error` with the status/body text when available.
269
+ - Auth errors: the SDK auto‑refreshes access tokens when possible. If the refresh token is expired or missing, you’ll get an error and should re‑authenticate.
270
+
271
+ ---
272
+
273
+ ## Environment details
274
+
275
+ - Storage: tokens/options stored in `localStorage` when available; otherwise a global in‑memory store is used (`globalThis.__gc2_memory_storage`).
276
+ - Fetch: Node.js 18+ recommended (includes native `fetch`). For older Node versions, add a Fetch polyfill.
277
+
278
+ ---
279
+
280
+ ## Examples
281
+
282
+ See the `examples/` folder for runnable snippets showing PasswordFlow + Sql/Rpc and browser CodeFlow usage.
283
+
284
+ ---
285
+
286
+ ## License
287
+
288
+ AGPL-3.0
@@ -9,4 +9,4 @@
9
9
  * @license http://www.gnu.org/licenses/#AGPL GNU AFFERO GENERAL PUBLIC LICENSE 3
10
10
  *
11
11
  */const d=async(s,e,t,o,r="application/json")=>{const n=b(),i=await L(r);let c={method:t,headers:i,redirect:"manual"};return o&&(c.body=r==="application/json"?JSON.stringify(o):o),await fetch(n.host+`/api/v${s}/${e}`,c)},u=async(s,e)=>{let t=null,o="";try{o=await s.text()}catch{}if(o)try{t=JSON.parse(o)}catch{}if(s.status!==e){const r=t&&(t.message||t.error)||o||`Unexpected status ${s.status}`;throw new Error(r)}return t};class N{async exec(e){const t=await d("4","sql","POST",e);return await u(t,200)}}class v{async call(e){const t=await d("4","call","POST",e);return await u(t,200)}}class J{async query(e){const t=await d("3",`meta/${e}`,"GET",null);return await u(t,200)}}class z{isAuth(){const e=w();return!(!e.accessToken&&!e.refreshToken)}getTokens(){return w()}}class D{get(){const e=w().accessToken;return q(e)}}class V{async get(e){const t=await d("4",`users/${e}`,"GET",null);return await u(t,200)}}class W{constructor(e){this.options=e}connect(){const e=this,{accessToken:t}=w(),o=()=>{const r=new WebSocket(this.options.host+"/?token="+t);r.onopen=function(){console.log("WebSocket connected!")},r.onmessage=function(n){var i;(i=e.options)==null||i.callBack(n.data)},r.onclose=function(n){t!==""&&(console.log("WebSocket closed, reconnecting in 3 seconds...",n.reason),setTimeout(o,3e3))},r.onerror=function(n){console.error("WebSocket error observed:",n),r.close()}};t!==""&&o()}}class G{async get(){const e=await d("4","stats","GET",null);return await u(e,200)}}class x{async get(e,t){const o=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"GET",null);return await u(o,200)}async create(e,t,o){const r=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"POST",o);return await u(r,200)}async patch(e,t,o){const r=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"PATCH",o);return await u(r,200)}async delete(e,t){const o=await d("4",`schemas/${encodeURIComponent(e)}/tables/${encodeURIComponent(t)}`,"DELETE",null);return await u(o,204)}}async function H(s,e){const t=new v,o={jsonrpc:"2.0",method:s,id:1,params:e};return(await t.call(o)).result.data}function M(){return new Proxy({},{get(s,e){if(typeof e=="string")return(...t)=>H(e,...t)}})}a.Claims=D,a.CodeFlow=F,a.Meta=J,a.PasswordFlow=j,a.Rpc=v,a.Sql=N,a.Stats=G,a.Status=z,a.Tables=x,a.Users=V,a.Ws=W,a.createApi=M,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
12
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MyLWpzLWNsaWVudC5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWwvand0LWRlY29kZS50cyIsIi4uL3NyYy91dGlsL3N0b3JhZ2UudHMiLCIuLi9zcmMvdXRpbC91dGlscy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9nYzIuc2VydmljZXMudHMiLCIuLi9zcmMvQ29kZUZsb3cudHMiLCIuLi9zcmMvUGFzc3dvcmRGbG93LnRzIiwiLi4vc3JjL3V0aWwvcmVxdWVzdC1oZWFkZXJzLnRzIiwiLi4vc3JjL3V0aWwvbWFrZS1yZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWwvZ2V0LXJlc3BvbnNlLnRzIiwiLi4vc3JjL1NxbC50cyIsIi4uL3NyYy9ScGMudHMiLCIuLi9zcmMvTWV0YS50cyIsIi4uL3NyYy9TdGF0dXMudHMiLCIuLi9zcmMvQ2xhaW1zLnRzIiwiLi4vc3JjL1VzZXJzLnRzIiwiLi4vc3JjL1dzLnRzIiwiLi4vc3JjL1N0YXRzLnRzIiwiLi4vc3JjL1RhYmxlcy50cyIsIi4uL3NyYy9BcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQXV0aDAsIEluYy4gPHN1cHBvcnRAYXV0aDAuY29tPiAoaHR0cDovL2F1dGgwLmNvbSlcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0RGVjb2RlT3B0aW9ucyB7XHJcbiAgICBoZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEp3dEhlYWRlciB7XHJcbiAgICB0eXA/OiBzdHJpbmc7XHJcbiAgICBhbGc/OiBzdHJpbmc7XHJcbiAgICBraWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XHJcbiAgICBpc3M/OiBzdHJpbmc7XHJcbiAgICBzdWI/OiBzdHJpbmc7XHJcbiAgICBhdWQ/OiBzdHJpbmdbXSB8IHN0cmluZztcclxuICAgIGV4cD86IG51bWJlcjtcclxuICAgIG5iZj86IG51bWJlcjtcclxuICAgIGlhdD86IG51bWJlcjtcclxuICAgIGp0aT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cclxuXHJcbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xyXG5cclxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICBhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XHJcbiAgICAgICAgfSksXHJcbiAgICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyOiBzdHJpbmcpIHtcclxuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XHJcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0SGVhZGVyPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBKd3REZWNvZGVPcHRpb25zICYgeyBoZWFkZXI6IHRydWUgfSxcclxuKTogVDtcclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IEp3dERlY29kZU9wdGlvbnMpOiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlPFQgPSBKd3RIZWFkZXIgfCBKd3RQYXlsb2FkPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zPzogSnd0RGVjb2RlT3B0aW9ucyxcclxuKTogVCB7XHJcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3B0aW9ucyB8fD0ge307XHJcblxyXG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcclxuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGVjb2RlZDogc3RyaW5nO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcclxuICAgICAgICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCkgYXMgVDtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXHJcbiAgICAgICAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlTGlrZSB7XHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGxcclxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZFxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkXHJcbn1cclxuXHJcbmNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlTGlrZSB7XHJcbiAgcHJpdmF0ZSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcclxuXHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGtleSkgPyB0aGlzLnN0b3JlLmdldChrZXkpISA6IG51bGxcclxuICB9XHJcblxyXG4gIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuc2V0KGtleSwgU3RyaW5nKHZhbHVlKSlcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSlcclxuICB9XHJcbn1cclxuXHJcbmxldCBjYWNoZWQ6IFN0b3JhZ2VMaWtlIHwgbnVsbCA9IG51bGxcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKCk6IFN0b3JhZ2VMaWtlIHtcclxuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGc6IGFueSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IChnbG9iYWxUaGlzIGFzIGFueSkgOiAod2luZG93IGFzIGFueSlcclxuICAgIGlmIChnICYmIGcubG9jYWxTdG9yYWdlICYmIHR5cGVvZiBnLmxvY2FsU3RvcmFnZS5nZXRJdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNhY2hlZCA9IGcubG9jYWxTdG9yYWdlIGFzIFN0b3JhZ2VMaWtlXHJcbiAgICAgIHJldHVybiBjYWNoZWRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmUgYW5kIGZhbGwgYmFjayB0byBtZW1vcnkgc3RvcmFnZVxyXG4gIH1cclxuICBjb25zdCBnOiBhbnkgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpIDoge31cclxuICBpZiAoIWcuX19nYzJfbWVtb3J5X3N0b3JhZ2UpIHtcclxuICAgIGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZSgpXHJcbiAgfVxyXG4gIGNhY2hlZCA9IGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgYXMgU3RvcmFnZUxpa2VcclxuICByZXR1cm4gY2FjaGVkXHJcbn1cclxuIiwiaW1wb3J0IHtqd3REZWNvZGV9IGZyb20gJy4vand0LWRlY29kZSdcclxuaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvZ2MyLnNlcnZpY2VzXCI7XHJcbmltcG9ydCB7Z2V0U3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IHR5cGUgVG9rZW5zID0ge1xyXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gICAgaWRUb2tlbj86IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XHJcbiAgICBob3N0OiBzdHJpbmc7XHJcbiAgICB3c0hvc3Q/OiBzdHJpbmc7XHJcbiAgICB0b2tlblVyaT86IHN0cmluZztcclxuICAgIGF1dGhVcmk/OiBzdHJpbmc7XHJcbiAgICBsb2dvdXRVcmk/OiBzdHJpbmc7XHJcbiAgICBkZXZpY2VVcmk/OiBzdHJpbmc7XHJcbiAgICBzY29wZT86IHN0cmluZztcclxuICAgIGNsaWVudElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENvZGVGbG93T3B0aW9ucyA9IE9wdGlvbnMgJiB7XHJcbiAgICByZWRpcmVjdFVyaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXNzd29yZEZsb3dPcHRpb25zID0gT3B0aW9ucyAmIHtcclxuICAgIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgZGF0YWJhc2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgV3NPcHRpb25zID0ge1xyXG4gICAgaG9zdDogc3RyaW5nO1xyXG4gICAgY2FsbEJhY2s/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdldERldmljZUNvZGVSZXNwb25zZSA9IHtcclxuICAgIGRldmljZV9jb2RlOiBzdHJpbmc7XHJcbiAgICB1c2VyX2NvZGU6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmk6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmlfY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICBpbnRlcnZhbDogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR2V0VG9rZW5SZXNwb25zZSA9IHtcclxuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xyXG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xyXG4gICAgcmVmcmVzaF9leHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBpZF90b2tlbj86IHN0cmluZztcclxuICAgIHRva2VuX3R5cGU6IHN0cmluZztcclxuICAgICdub3QtYmVmb3JlLXBvbGljeSc6IG51bWJlcjtcclxuICAgIHNlc3Npb25fc3RhdGU6IHN0cmluZztcclxuICAgIHNjb3BlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSA9IGFzeW5jICgpID0+IHtcclxuXHJcbiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbVN0cmluZyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgyOCk7XHJcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYyA9PiAoJzAnICsgZGVjLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSkuam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hhMjU2ID0gKHBsYWluOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKHBsYWluKTtcclxuICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlNjR1cmxFbmNvZGUgPSAoc3RyOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsuLi5uZXcgVWludDhBcnJheShzdHIpXSkpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcGtjZUNoYWxsZW5nZUZyb21WZXJpZmllcih2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodik7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NHVybEVuY29kZShoYXNoZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyfSA9IHtcclxuICAgICAgICBzdGF0ZTogZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSxcclxuICAgICAgICBjb2RlVmVyaWZpZXI6IGdlbmVyYXRlUmFuZG9tU3RyaW5nKCksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IHBrY2VDaGFsbGVuZ2VGcm9tVmVyaWZpZXIoY29kZVZlcmlmaWVyKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXRlLFxyXG4gICAgICAgIGNvZGVWZXJpZmllcixcclxuICAgICAgICBjb2RlQ2hhbGxlbmdlLFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNUb2tlbkV4cGlyZWQgPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzSnd0RXhwaXJlZCA9IGZhbHNlXHJcbiAgICBjb25zdCB7ZXhwfSA9IGp3dERlY29kZSh0b2tlbilcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwXHJcblxyXG4gICAgaWYgKGV4cCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA+IGV4cCkgaXNKd3RFeHBpcmVkID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSnd0RXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2xhaW1zID0gKHRva2VuOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgcmV0dXJuIGp3dERlY29kZSh0b2tlbilcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhc3N3b3JkSXNTdHJvbmdFbm91Z2ggPSAocGFzc3dvcmQ6IHN0cmluZywgYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnRW50ZXJlZCBwYXNzd29yZCBpcyB0b28gd2VhaydcclxuICAgIGlmIChwYXNzd29yZCA9PT0gJycgJiYgYWxsb3dOdWxsKSByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDgpIHJldHVybiBtZXNzYWdlXHJcbiAgICBpZiAoISgvW0EtWl0vLnRlc3QocGFzc3dvcmQpKSkgcmV0dXJuIG1lc3NhZ2VcclxuICAgIGlmICghKC9bYS16XS8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgaWYgKCEoL1xcZC8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzTG9naW4gPSBhc3luYyAoZ2MyOiBHYzJTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICBjb25zdCB7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbiAmJiAhcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8IChhY2Nlc3NUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChhY2Nlc3NUb2tlbikpKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChyZWZyZXNoVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9naW4gYWdhaW4uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdjMi5nZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKVxyXG4gICAgICAgICAgICAgICAgc2V0VG9rZW5zKHthY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbiwgaWRUb2tlbjogZGF0YT8uaWRfdG9rZW59KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgcmVmcmVzaCB0b2tlbi4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldFRva2VucyA9ICh0b2tlbnM6IFRva2Vucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl90b2tlbnMnLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAnYWNjZXNzVG9rZW4nOiB0b2tlbnMuYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAncmVmcmVzaFRva2VuJzogdG9rZW5zLnJlZnJlc2hUb2tlbixcclxuICAgICAgICAgICAgICAgICdpZFRva2VuJzogdG9rZW5zPy5pZFRva2VuIHx8ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUb2tlbnMgPSAoKTogVG9rZW5zID0+IHtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nIHwgbnVsbCA9IGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdnYzJfdG9rZW5zJylcclxuICAgIGNvbnN0IHRva2VuczogYW55ID0gc3RyID8gSlNPTi5wYXJzZShzdHIpIDoge31cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucz8uYWNjZXNzVG9rZW4gfHwgJycsXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnM/LnJlZnJlc2hUb2tlbiB8fCAnJyxcclxuICAgICAgICBpZFRva2VuOiB0b2tlbnM/LmlkVG9rZW4gfHwgJycsXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gKG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl9vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgJ2NsaWVudElkJzogb3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICdob3N0Jzogb3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgJ3JlZGlyZWN0VXJpJzogb3B0aW9ucy5yZWRpcmVjdFVyaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3B0aW9ucyA9ICgpOiBDb2RlRmxvd09wdGlvbnMgPT4ge1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgfCBudWxsID0gZ2V0U3RvcmFnZSgpLmdldEl0ZW0oJ2djMl9vcHRpb25zJylcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHN0ciA/IEpTT04ucGFyc2Uoc3RyKSA6IHt9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsaWVudElkOiBvcHRpb25zPy5jbGllbnRJZCB8fCAnJyxcclxuICAgICAgICBob3N0OiBvcHRpb25zPy5ob3N0IHx8ICcnLFxyXG4gICAgICAgIHJlZGlyZWN0VXJpOiBvcHRpb25zPy5yZWRpcmVjdFVyaSB8fCAnJyxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZVN0cmluZyA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICByZXR1cm4gYnRvYShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKS5yZWR1Y2UoKGFjYywgYnl0ZSkgPT4gYWNjICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gICAgICAgIC5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhclRva2VucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfdG9rZW5zJylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFyT3B0aW9ucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfb3B0aW9ucycpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXROb25jZSA9ICgpOiBzdHJpbmd8bnVsbCA9PiB7XHJcbiAgICByZXR1cm4gPHN0cmluZz5nZXRTdG9yYWdlKCkuZ2V0SXRlbSgnZ2MyX25vbmNlJylcclxufVxyXG5leHBvcnQgY29uc3QgY2xlYXJOb25jZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfbm9uY2UnKVxyXG59XHJcblxyXG4iLCJpbXBvcnQge0NvZGVGbG93T3B0aW9ucywgR2V0RGV2aWNlQ29kZVJlc3BvbnNlLCBnZXROb25jZSwgR2V0VG9rZW5SZXNwb25zZSwgUGFzc3dvcmRGbG93T3B0aW9uc30gZnJvbSAnLi4vdXRpbC91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2MyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyB8IFBhc3N3b3JkRmxvd09wdGlvbnM7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHlwZSBndWFyZHMgdG8gY2hlY2sgaWYgb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMgb3IgUGFzc3dvcmRGbG93T3B0aW9uc1xyXG4gICAgcHJpdmF0ZSBpc0NvZGVGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiAncmVkaXJlY3RVcmknIGluIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUGFzc3dvcmRGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBQYXNzd29yZEZsb3dPcHRpb25zIHtcclxuICAgICAgICByZXR1cm4gJ3VzZXJuYW1lJyBpbiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5ob3N0fSR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID0gJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7J0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlfTtcclxuICAgICAgICBsZXQgcGF5bG9hZDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xyXG4gICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYm9keSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgYm9keTogcGF5bG9hZCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2VyclRleHR9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldERldmljZUNvZGUoKTogUHJvbWlzZTxHZXREZXZpY2VDb2RlUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLmRldmljZVVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aC9kZXZpY2VgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodGhpcy5idWlsZFVybChwYXRoKSwgJ1BPU1QnLCB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHBvbGxUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLnRva2VuVXJpID8/IGAke3RoaXMuaG9zdH0vYXBpL3Y0L29hdXRoYDtcclxuICAgICAgICBjb25zdCBnZXRUb2tlbiA9IGFzeW5jICgpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2UgfCBudWxsIHwgc3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRVcmwocGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jb2RlOiBkZXZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnZGV2aWNlX2NvZGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gSlNPTi5wYXJzZShlLm1lc3NhZ2Uuc3BsaXQoJzogJylbMV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciA9PT0gJ2F1dGhvcml6YXRpb25fcGVuZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJyb3JfZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBnZXRUb2tlbigpO1xyXG4gICAgICAgIHdoaWxlIChyZXNwb25zZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwgKiAxMTAwKSk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZ2V0VG9rZW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLm9wdGlvbnMuYXV0aFVyaSA/PyBgJHt0aGlzLmhvc3R9L2F1dGgvYFxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxyXG4gICAgICAgIC8vIEdldCBub25jZSBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBnZXROb25jZSgpXHJcbiAgICAgICAgLy8gQWRkIHBhcmFtZXRlcnMgY29uZGl0aW9uYWxseVxyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsIHRoaXMub3B0aW9ucy5jbGllbnRJZCk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3N0YXRlJywgc3RhdGUpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgY29kZUNoYWxsZW5nZSk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgnY29kZV9jaGFsbGVuZ2VfbWV0aG9kJywgJ1MyNTYnKTtcclxuICAgICAgICBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnbm9uY2UnLCBub25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9ubHkgYWRkIHNjb3BlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NvcGUpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnc2NvcGUnLCB0aGlzLm9wdGlvbnMuc2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7YmFzZX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Db2RlVG9rZW4oXHJcbiAgICAgICAgY29kZTogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgICAgICAgY29kZVZlcmlmaWVyOiBzdHJpbmcgfCBudWxsXHJcbiAgICApOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmkgPSB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVGbG93IG9wdGlvbnMgcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcclxuICAgICAgICAgICAgICAgIGNvZGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQYXNzd29yZFRva2VuKCk6IFByb21pc2U8R2V0VG9rZW5SZXNwb25zZT4ge1xyXG4gICAgICAgIGxldCB1c2VybmFtZSwgcGFzc3dvcmQsIGRhdGFiYXNlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXNzd29yZEZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLm9wdGlvbnMudXNlcm5hbWVcclxuICAgICAgICAgICAgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucGFzc3dvcmRcclxuICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3N3b3JkRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgZGF0YWJhc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFJlZnJlc2hUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHZXRUb2tlblJlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduT3V0VVJMKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmdcclxuICAgICAgICBpZiAodGhpcy5pc0NvZGVGbG93T3B0aW9ucyh0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xyXG4gICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nb3V0VXJpID8/IGAke3RoaXMuaG9zdH0vc2lnbm91dD8ke3BhcmFtcy50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL2djMi5zZXJ2aWNlcydcclxuaW1wb3J0IHtnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UsIGlzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5pbXBvcnQge0NvZGVGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9uc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5pbXBvcnQge2dldFN0b3JhZ2V9IGZyb20gJy4vdXRpbC9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29kZUZsb3cge1xyXG4gICAgb3B0aW9uczogQ29kZUZsb3dPcHRpb25zXHJcbiAgICBzZXJ2aWNlOiBHYzJTZXJ2aWNlXHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29kZUZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZGlyZWN0SGFuZGxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaFxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwpXHJcblxyXG4gICAgICAgIGNvbnN0IGVycm9yID0gcXVlcnlQYXJhbXMuZ2V0KCdlcnJvcicpXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZGlyZWN0OiAke3VybH1gKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29kZSA9IHF1ZXJ5UGFyYW1zLmdldCgnY29kZScpXHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBxdWVyeVBhcmFtcy5nZXQoJ3N0YXRlJylcclxuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBnZXRTdG9yYWdlKCkuZ2V0SXRlbSgnc3RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3NzaWJsZSBDU1JGIGF0dGFjay4gQWJvcnRpbmcgbG9naW4hJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBdXRob3JpemF0aW9uQ29kZVRva2VuKGNvZGUsIGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdjb2RlVmVyaWZpZXInKSlcclxuICAgICAgICAgICAgICAgIHNldFRva2Vucyh7YWNjZXNzVG9rZW46IGFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuOiByZWZyZXNoX3Rva2VuLCBpZFRva2VuOiBpZF90b2tlbn0pXHJcbiAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHtcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKCkucmVtb3ZlSXRlbSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgZ2V0U3RvcmFnZSgpLnJlbW92ZUl0ZW0oJ2NvZGVWZXJpZmllcicpXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIGFuZCBjb2RlIGZyb20gdGhlIHJlZGlyZWN0IHVybFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5kZWxldGUoJ2NvZGUnKVxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmRlbGV0ZSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBsb2Mub3JpZ2luICsgbG9jLnBhdGhuYW1lICsgKHBhcmFtcy5zaXplID4gMCA/ICc/JyArIHBhcmFtcy50b1N0cmluZygpIDogJycpXHJcbiAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCAnJywgbmV3VXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGlzTG9naW4odGhpcy5zZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2lnbkluKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlfSA9IGF3YWl0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSgpXHJcbiAgICAgICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oXCJzdGF0ZVwiLCBzdGF0ZSlcclxuICAgICAgICBnZXRTdG9yYWdlKCkuc2V0SXRlbShcImNvZGVWZXJpZmllclwiLCBjb2RlVmVyaWZpZXIpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoXHJcbiAgICAgICAgICAgIGNvZGVDaGFsbGVuZ2UsXHJcbiAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpZ25PdXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRTaWduT3V0VVJMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICBjbGVhck9wdGlvbnMoKVxyXG4gICAgICAgIGNsZWFyTm9uY2UoKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7R2MyU2VydmljZSx9IGZyb20gJy4vc2VydmljZXMvZ2MyLnNlcnZpY2VzJ1xyXG5pbXBvcnQge2lzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgUGFzc3dvcmRGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFzc3dvcmRGbG93IHtcclxuICAgIG9wdGlvbnM6IFBhc3N3b3JkRmxvd09wdGlvbnNcclxuICAgIHNlcnZpY2U6IEdjMlNlcnZpY2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNpZ25JbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRQYXNzd29yZFRva2VuKClcclxuICAgICAgICBzZXRUb2tlbnMoe2FjY2Vzc1Rva2VuOiBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbn0pXHJcbiAgICAgICAgc2V0T3B0aW9ucyh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICByZWRpcmVjdFVyaTogJydcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaWduT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRva2VucygpXHJcbiAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICBjbGVhck5vbmNlKClcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgTWFydGluIEjDuGdoIDxtaEBtYXBjZW50aWEuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAyMDEzLTIwMjQgTWFwQ2VudGlhIEFwU1xyXG4gKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvI0FHUEwgIEdOVSBBRkZFUk8gR0VORVJBTCBQVUJMSUMgTElDRU5TRSAzXHJcbiAqXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtnZXRPcHRpb25zLCBnZXRUb2tlbnMsIGlzTG9naW59IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7R2MyU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL2djMi5zZXJ2aWNlc1wiO1xyXG5cclxuY29uc3QgZ2V0SGVhZGVycyA9IGFzeW5jIChjb250ZW50VHlwZTogc3RyaW5nfG51bGwgPSAnYXBwbGljYXRpb24vanNvbicpOiBQcm9taXNlPGFueT49PiB7XHJcbiAgdHlwZSBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiBzdHJpbmcsXHJcbiAgICBDb29raWU6IHN0cmluZyxcclxuICAgIEF1dGhvcml6YXRpb246IHN0cmluZ3xudWxsLFxyXG4gICAgJ0NvbnRlbnQtVHlwZSc/OiBzdHJpbmdcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKClcclxuICBjb25zdCBzZXJ2aWNlID0gbmV3IEdjMlNlcnZpY2Uob3B0aW9ucylcclxuXHJcbiAgLy8gV2UgY2hlY2sgaXMgdG9rZW4gbmVlZHMgcmVmcmVzaGluZ1xyXG4gIGlmICghYXdhaXQgaXNMb2dpbihzZXJ2aWNlKSkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdJcyBub3QgbG9nZ2VkIGluJylcclxuICB9XHJcblxyXG4gIGNvbnN0IHthY2Nlc3NUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG5cclxuICBjb25zdCBoZWFkZXJzOiBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICBDb29raWU6ICdYREVCVUdfU0VTU0lPTj1YREVCVUdfRUNMSVBTRScsXHJcbiAgICBBdXRob3JpemF0aW9uOiBhY2Nlc3NUb2tlbiA/ICdCZWFyZXIgJyArIGFjY2Vzc1Rva2VuIDogbnVsbCxcclxuICB9XHJcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXHJcbiAgfVxyXG4gIHJldHVybiBoZWFkZXJzXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgZ2V0SGVhZGVyc1xyXG5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgIE1hcnRpbiBIw7hnaCA8bWhAbWFwY2VudGlhLmNvbT5cclxuICogQGNvcHlyaWdodCAgMjAxMy0yMDI0IE1hcENlbnRpYSBBcFNcclxuICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyNBR1BMICBHTlUgQUZGRVJPIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgM1xyXG4gKlxyXG4gKi9cclxuXHJcbmltcG9ydCBnZXRIZWFkZXJzIGZyb20gJy4vcmVxdWVzdC1oZWFkZXJzJ1xyXG5pbXBvcnQgTWV0aG9kIGZyb20gJy4uL2NvbW1vbi9odHRwLXZlcmJzJ1xyXG5pbXBvcnQge2dldE9wdGlvbnN9IGZyb20gJy4vdXRpbHMnXHJcblxyXG5leHBvcnQgY29uc3QgbWFrZSA9IGFzeW5jICh2ZXJzaW9uOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIG1ldGhvZDogTWV0aG9kLCBwYXlsb2FkPzogYW55LCBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbCA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoKVxyXG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlKVxyXG5cclxuICBsZXQgcmVxdWVzdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICByZWRpcmVjdDogJ21hbnVhbCdcclxuICB9XHJcbiAgaWYgKHBheWxvYWQpIHtcclxuICAgIHJlcXVlc3QuYm9keSA9IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSA6IHBheWxvYWRcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IGZldGNoKG9wdGlvbnMuaG9zdCArIGAvYXBpL3Yke3ZlcnNpb259LyR7cmVzb3VyY2V9YCwgcmVxdWVzdClcclxufVxyXG5leHBvcnQgZGVmYXVsdCBtYWtlXHJcbiIsImNvbnN0IGdldCA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGV4cGVjdGVkQ29kZTogbnVtYmVyKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICBsZXQgcmVzOiBhbnkgPSBudWxsXHJcbiAgICBsZXQgYm9keVRleHQgPSAnJ1xyXG5cclxuICAgIC8vIFJlYWQgdGhlIGJvZHkgb25seSBvbmNlIGFzIHRleHQuIFRoaXMgYXZvaWRzIFwiYm9keSB1c2VkIGFscmVhZHlcIiB3aXRoIG5vZGUtZmV0Y2guXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIEV2ZW4gZm9yIDIwNC8zMDMsIHRleHQoKSBpcyBzYWZlIGFuZCB3aWxsIHJldHVybiAnJyBmb3IgZW1wdHkgYm9kaWVzXHJcbiAgICAgICAgYm9keVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgYm9keSByZWFkIGVycm9yczsgd2UnbGwgcHJvY2VlZCB3aXRoIG51bGwvZW1wdHkgYm9keVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRyeSB0byBwYXJzZSBKU09OIGlmIHRoZXJlIGlzIGEgYm9keVxyXG4gICAgaWYgKGJvZHlUZXh0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShib2R5VGV4dClcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBKU09OOyBrZWVwIHJlcyBhcyBudWxsIGFuZCB1c2UgYm9keVRleHQgZm9yIGVycm9yIG1lc3NhZ2VzXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IGV4cGVjdGVkQ29kZSkge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IChyZXMgJiYgKHJlcy5tZXNzYWdlIHx8IHJlcy5lcnJvcikpIHx8IGJvZHlUZXh0IHx8IGBVbmV4cGVjdGVkIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZylcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgMjA0LzMwMywgcmVzIHdpbGwgYmUgbnVsbCAobm8gYm9keSksIHdoaWNoIGlzIGZpbmUgZm9yIGNhbGxlcnMgZXhwZWN0aW5nIG5vIGNvbnRlbnRcclxuICAgIHJldHVybiByZXNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuaW1wb3J0IHtTcWxSZXF1ZXN0LCBTUUxSZXNwb25zZX0gZnJvbSBcIi4vdHlwZXMvcGdUeXBlc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3FsIHtcclxuICAgIGFzeW5jIGV4ZWMocmVxdWVzdDogU3FsUmVxdWVzdCk6IFByb21pc2U8U1FMUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3FsYCwgJ1BPU1QnLCByZXF1ZXN0KVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcbmltcG9ydCB7UnBjUmVxdWVzdCwgUnBjUmVzcG9uc2V9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJwYyB7XHJcbiAgICBhc3luYyBjYWxsKHJlcXVlc3Q6IFJwY1JlcXVlc3QpOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYGNhbGxgLCAnUE9TVCcsIHJlcXVlc3QpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGEge1xyXG4gICAgYXN5bmMgcXVlcnkocmVsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnMycsIGBtZXRhLyR7cmVsfWAsICdHRVQnLCBudWxsKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2dldFRva2Vuc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIHtcclxuICAgIGlzQXV0aCgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnMoKVxyXG4gICAgICAgIHJldHVybiAhKCF0b2tlbnMuYWNjZXNzVG9rZW4gJiYgIXRva2Vucy5yZWZyZXNoVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRva2VucygpIHtcclxuICAgICAgICByZXR1cm4gZ2V0VG9rZW5zKClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2NsYWltcywgZ2V0VG9rZW5zfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFpbXMge1xyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VucyA9IGdldFRva2VucygpLmFjY2Vzc1Rva2VuXHJcbiAgICAgICAgcmV0dXJuIGNsYWltcyh0b2tlbnMpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJzIHtcclxuICAgIGFzeW5jIGdldCh1c2VyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGB1c2Vycy8ke3VzZXJ9YCwgJ0dFVCcsIG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7V3NPcHRpb25zLCBnZXRUb2tlbnN9IGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdzIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV3NPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdzT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VufSA9IGdldFRva2VucygpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ob3N0ICsgYC8/dG9rZW49YCArIGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB3cy5vbm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY29ubmVjdGVkIScpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgbWUub3B0aW9ucz8uY2FsbEJhY2soZXZlbnQuZGF0YSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gMyBzZWNvbmRzLi4uJywgZXZlbnQucmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIDMwMDApOyAvLyBUcnkgdG8gcmVjb25uZWN0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB3cy5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXQgZXJyb3Igb2JzZXJ2ZWQ6JywgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXQgb24gZXJyb3IgdG8gZW5zdXJlIGNsZWFuIHJlY29ubmVjdGlvblxyXG4gICAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XHJcbiAgICBhc3luYyBnZXQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3RhdHNgLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IG1ha2UgZnJvbSBcIi4vdXRpbC9tYWtlLXJlcXVlc3RcIjtcclxuaW1wb3J0IGdldCBmcm9tIFwiLi91dGlsL2dldC1yZXNwb25zZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVzIHtcclxuICAgIGFzeW5jIGdldChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlKHNjaGVtYTogc3RyaW5nLCB0YWJsZTogc3RyaW5nLCBwYXlsb2FkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGBzY2hlbWFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNjaGVtYSl9L3RhYmxlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0YWJsZSl9YCwgJ1BPU1QnLCBwYXlsb2FkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwYXRjaChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZywgcGF5bG9hZDogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc2NoZW1hcy8ke2VuY29kZVVSSUNvbXBvbmVudChzY2hlbWEpfS90YWJsZXMvJHtlbmNvZGVVUklDb21wb25lbnQodGFibGUpfWAsICdQQVRDSCcsIHBheWxvYWQpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnREVMRVRFJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDQpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IFJwYyBmcm9tIFwiLi9ScGNcIlxyXG5pbXBvcnQge1JwY1JlcXVlc3R9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIlxyXG5cclxudHlwZSBNZXRob2RzT2Y8VD4gPSB7XHJcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6IEEpID0+IFIgOiBuZXZlcjtcclxufTtcclxuXHJcbi8vIEltcGxlbWVudGF0aW9uIHNpZ25hdHVyZSAod2lkZSkg4oCUIG92ZXJsb2FkcyBhYm92ZSBjb250cm9sIHRoZSBwdWJsaWMgdHlwaW5nXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoPEsgZXh0ZW5kcyBrZXlvZiBhbnkgJiBzdHJpbmc+KG5hbWU6IEssIGFyZ3M6IG9iamVjdHxBcnJheTxvYmplY3Q+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vY29uc29sZS5sb2coXCJEaXNwYXRjaDpcIiwgbmFtZSwgYXJncyk7XHJcbiAgICAvLyByb3V0ZSB0byByZWFsIGltcGxlbWVudGF0aW9uczpcclxuICAgIGNvbnN0IHJwYyA9IG5ldyBScGMoKVxyXG4gICAgY29uc3QgcmVxdWVzdDogUnBjUmVxdWVzdCA9IHtcclxuICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxyXG4gICAgICAgIG1ldGhvZDogbmFtZSxcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwYXJhbXM6IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICB9XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMuY2FsbChyZXF1ZXN0KVxyXG4gICAgcmV0dXJuIHJlcy5yZXN1bHQuZGF0YVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGk8VD4oKTogTWV0aG9kc09mPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4gKGRpc3BhdGNoIGFzIGFueSkocHJvcCwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgKSBhcyB1bmtub3duIGFzIE1ldGhvZHNPZjxUPjtcclxufVxyXG4iXSwibmFtZXMiOlsiSW52YWxpZFRva2VuRXJyb3IiLCJiNjREZWNvZGVVbmljb2RlIiwic3RyIiwibSIsInAiLCJjb2RlIiwiYmFzZTY0VXJsRGVjb2RlIiwib3V0cHV0Iiwiand0RGVjb2RlIiwidG9rZW4iLCJvcHRpb25zIiwicG9zIiwicGFydCIsImRlY29kZWQiLCJlIiwiTWVtb3J5U3RvcmFnZSIsImtleSIsInZhbHVlIiwiY2FjaGVkIiwiZ2V0U3RvcmFnZSIsImciLCJnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UiLCJnZW5lcmF0ZVJhbmRvbVN0cmluZyIsImFycmF5IiwiZGVjIiwic2hhMjU2IiwicGxhaW4iLCJkYXRhIiwiYmFzZTY0dXJsRW5jb2RlIiwicGtjZUNoYWxsZW5nZUZyb21WZXJpZmllciIsInYiLCJoYXNoZWQiLCJzdGF0ZSIsImNvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJpc1Rva2VuRXhwaXJlZCIsImlzSnd0RXhwaXJlZCIsImV4cCIsImN1cnJlbnRUaW1lIiwiY2xhaW1zIiwiaXNMb2dpbiIsImdjMiIsImFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZ2V0VG9rZW5zIiwiY2xlYXJUb2tlbnMiLCJjbGVhck9wdGlvbnMiLCJzZXRUb2tlbnMiLCJ0b2tlbnMiLCJzZXRPcHRpb25zIiwiZ2V0T3B0aW9ucyIsImdldE5vbmNlIiwiY2xlYXJOb25jZSIsIkdjMlNlcnZpY2UiLCJwYXRoIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiaGVhZGVycyIsInBheWxvYWQiLCJyZXNwb25zZSIsImVyclRleHQiLCJkZXZpY2VDb2RlIiwiaW50ZXJ2YWwiLCJnZXRUb2tlbiIsImVyciIsInJlc29sdmUiLCJyZWRpcmVjdFVyaSIsImJhc2UiLCJwYXJhbXMiLCJub25jZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYXRhYmFzZSIsIkNvZGVGbG93IiwicXVlcnlQYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiaWRfdG9rZW4iLCJsb2MiLCJuZXdVcmwiLCJQYXNzd29yZEZsb3ciLCJnZXRIZWFkZXJzIiwic2VydmljZSIsIm1ha2UiLCJ2ZXJzaW9uIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwiZ2V0IiwiZXhwZWN0ZWRDb2RlIiwicmVzIiwiYm9keVRleHQiLCJtc2ciLCJTcWwiLCJScGMiLCJNZXRhIiwicmVsIiwiU3RhdHVzIiwiQ2xhaW1zIiwiVXNlcnMiLCJ1c2VyIiwiV3MiLCJtZSIsImNvbm5lY3QiLCJ3cyIsImV2ZW50IiwiX2EiLCJTdGF0cyIsIlRhYmxlcyIsInNjaGVtYSIsInRhYmxlIiwiZGlzcGF0Y2giLCJuYW1lIiwiYXJncyIsInJwYyIsImNyZWF0ZUFwaSIsIl90YXJnZXQiLCJwcm9wIl0sIm1hcHBpbmdzIjoiMk5BNENP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
12
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VudGlhLWlvLXNkay5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWwvand0LWRlY29kZS50cyIsIi4uL3NyYy91dGlsL3N0b3JhZ2UudHMiLCIuLi9zcmMvdXRpbC91dGlscy50cyIsIi4uL3NyYy9zZXJ2aWNlcy9nYzIuc2VydmljZXMudHMiLCIuLi9zcmMvQ29kZUZsb3cudHMiLCIuLi9zcmMvUGFzc3dvcmRGbG93LnRzIiwiLi4vc3JjL3V0aWwvcmVxdWVzdC1oZWFkZXJzLnRzIiwiLi4vc3JjL3V0aWwvbWFrZS1yZXF1ZXN0LnRzIiwiLi4vc3JjL3V0aWwvZ2V0LXJlc3BvbnNlLnRzIiwiLi4vc3JjL1NxbC50cyIsIi4uL3NyYy9ScGMudHMiLCIuLi9zcmMvTWV0YS50cyIsIi4uL3NyYy9TdGF0dXMudHMiLCIuLi9zcmMvQ2xhaW1zLnRzIiwiLi4vc3JjL1VzZXJzLnRzIiwiLi4vc3JjL1dzLnRzIiwiLi4vc3JjL1N0YXRzLnRzIiwiLi4vc3JjL1RhYmxlcy50cyIsIi4uL3NyYy9BcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQXV0aDAsIEluYy4gPHN1cHBvcnRAYXV0aDAuY29tPiAoaHR0cDovL2F1dGgwLmNvbSlcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0RGVjb2RlT3B0aW9ucyB7XHJcbiAgICBoZWFkZXI/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEp3dEhlYWRlciB7XHJcbiAgICB0eXA/OiBzdHJpbmc7XHJcbiAgICBhbGc/OiBzdHJpbmc7XHJcbiAgICBraWQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XHJcbiAgICBpc3M/OiBzdHJpbmc7XHJcbiAgICBzdWI/OiBzdHJpbmc7XHJcbiAgICBhdWQ/OiBzdHJpbmdbXSB8IHN0cmluZztcclxuICAgIGV4cD86IG51bWJlcjtcclxuICAgIG5iZj86IG51bWJlcjtcclxuICAgIGlhdD86IG51bWJlcjtcclxuICAgIGp0aT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige31cclxuXHJcbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xyXG5cclxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICBhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XHJcbiAgICAgICAgfSksXHJcbiAgICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyOiBzdHJpbmcpIHtcclxuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XHJcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0SGVhZGVyPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBKd3REZWNvZGVPcHRpb25zICYgeyBoZWFkZXI6IHRydWUgfSxcclxuKTogVDtcclxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZTxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IEp3dERlY29kZU9wdGlvbnMpOiBUO1xyXG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlPFQgPSBKd3RIZWFkZXIgfCBKd3RQYXlsb2FkPihcclxuICAgIHRva2VuOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zPzogSnd0RGVjb2RlT3B0aW9ucyxcclxuKTogVCB7XHJcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgb3B0aW9ucyB8fD0ge307XHJcblxyXG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcclxuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcclxuXHJcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGVjb2RlZDogc3RyaW5nO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcclxuICAgICAgICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCkgYXMgVDtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXHJcbiAgICAgICAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlTGlrZSB7XHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGxcclxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZFxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkXHJcbn1cclxuXHJcbmNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlTGlrZSB7XHJcbiAgcHJpdmF0ZSBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcclxuXHJcbiAgZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGtleSkgPyB0aGlzLnN0b3JlLmdldChrZXkpISA6IG51bGxcclxuICB9XHJcblxyXG4gIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuc2V0KGtleSwgU3RyaW5nKHZhbHVlKSlcclxuICB9XHJcblxyXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSlcclxuICB9XHJcbn1cclxuXHJcbmxldCBjYWNoZWQ6IFN0b3JhZ2VMaWtlIHwgbnVsbCA9IG51bGxcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKCk6IFN0b3JhZ2VMaWtlIHtcclxuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGc6IGFueSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IChnbG9iYWxUaGlzIGFzIGFueSkgOiAod2luZG93IGFzIGFueSlcclxuICAgIGlmIChnICYmIGcubG9jYWxTdG9yYWdlICYmIHR5cGVvZiBnLmxvY2FsU3RvcmFnZS5nZXRJdGVtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNhY2hlZCA9IGcubG9jYWxTdG9yYWdlIGFzIFN0b3JhZ2VMaWtlXHJcbiAgICAgIHJldHVybiBjYWNoZWRcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmUgYW5kIGZhbGwgYmFjayB0byBtZW1vcnkgc3RvcmFnZVxyXG4gIH1cclxuICBjb25zdCBnOiBhbnkgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpIDoge31cclxuICBpZiAoIWcuX19nYzJfbWVtb3J5X3N0b3JhZ2UpIHtcclxuICAgIGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZSgpXHJcbiAgfVxyXG4gIGNhY2hlZCA9IGcuX19nYzJfbWVtb3J5X3N0b3JhZ2UgYXMgU3RvcmFnZUxpa2VcclxuICByZXR1cm4gY2FjaGVkXHJcbn1cclxuIiwiaW1wb3J0IHtqd3REZWNvZGV9IGZyb20gJy4vand0LWRlY29kZSdcclxuaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvZ2MyLnNlcnZpY2VzXCI7XHJcbmltcG9ydCB7Z2V0U3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IHR5cGUgVG9rZW5zID0ge1xyXG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gICAgaWRUb2tlbj86IHN0cmluZztcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XHJcbiAgICBob3N0OiBzdHJpbmc7XHJcbiAgICB3c0hvc3Q/OiBzdHJpbmc7XHJcbiAgICB0b2tlblVyaT86IHN0cmluZztcclxuICAgIGF1dGhVcmk/OiBzdHJpbmc7XHJcbiAgICBsb2dvdXRVcmk/OiBzdHJpbmc7XHJcbiAgICBkZXZpY2VVcmk/OiBzdHJpbmc7XHJcbiAgICBzY29wZT86IHN0cmluZztcclxuICAgIGNsaWVudElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIENvZGVGbG93T3B0aW9ucyA9IE9wdGlvbnMgJiB7XHJcbiAgICByZWRpcmVjdFVyaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYXNzd29yZEZsb3dPcHRpb25zID0gT3B0aW9ucyAmIHtcclxuICAgIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgZGF0YWJhc2U6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgV3NPcHRpb25zID0ge1xyXG4gICAgaG9zdDogc3RyaW5nO1xyXG4gICAgY2FsbEJhY2s/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEdldERldmljZUNvZGVSZXNwb25zZSA9IHtcclxuICAgIGRldmljZV9jb2RlOiBzdHJpbmc7XHJcbiAgICB1c2VyX2NvZGU6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmk6IHN0cmluZztcclxuICAgIHZlcmlmaWNhdGlvbl91cmlfY29tcGxldGU/OiBzdHJpbmc7XHJcbiAgICBleHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICBpbnRlcnZhbDogbnVtYmVyO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgR2V0VG9rZW5SZXNwb25zZSA9IHtcclxuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xyXG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xyXG4gICAgcmVmcmVzaF9leHBpcmVzX2luOiBudW1iZXI7XHJcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XHJcbiAgICBpZF90b2tlbj86IHN0cmluZztcclxuICAgIHRva2VuX3R5cGU6IHN0cmluZztcclxuICAgICdub3QtYmVmb3JlLXBvbGljeSc6IG51bWJlcjtcclxuICAgIHNlc3Npb25fc3RhdGU6IHN0cmluZztcclxuICAgIHNjb3BlOiBzdHJpbmc7XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSA9IGFzeW5jICgpID0+IHtcclxuXHJcbiAgICBjb25zdCBnZW5lcmF0ZVJhbmRvbVN0cmluZyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgyOCk7XHJcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYyA9PiAoJzAnICsgZGVjLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSkuam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2hhMjU2ID0gKHBsYWluOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKHBsYWluKTtcclxuICAgICAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYXNlNjR1cmxFbmNvZGUgPSAoc3RyOiBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsuLi5uZXcgVWludDhBcnJheShzdHIpXSkpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZnVuY3Rpb24gcGtjZUNoYWxsZW5nZUZyb21WZXJpZmllcih2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodik7XHJcbiAgICAgICAgcmV0dXJuIGJhc2U2NHVybEVuY29kZShoYXNoZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyfSA9IHtcclxuICAgICAgICBzdGF0ZTogZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSxcclxuICAgICAgICBjb2RlVmVyaWZpZXI6IGdlbmVyYXRlUmFuZG9tU3RyaW5nKCksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGF3YWl0IHBrY2VDaGFsbGVuZ2VGcm9tVmVyaWZpZXIoY29kZVZlcmlmaWVyKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHN0YXRlLFxyXG4gICAgICAgIGNvZGVWZXJpZmllcixcclxuICAgICAgICBjb2RlQ2hhbGxlbmdlLFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNUb2tlbkV4cGlyZWQgPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gICAgbGV0IGlzSnd0RXhwaXJlZCA9IGZhbHNlXHJcbiAgICBjb25zdCB7ZXhwfSA9IGp3dERlY29kZSh0b2tlbilcclxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwXHJcblxyXG4gICAgaWYgKGV4cCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50VGltZSA+IGV4cCkgaXNKd3RFeHBpcmVkID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzSnd0RXhwaXJlZFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2xhaW1zID0gKHRva2VuOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgcmV0dXJuIGp3dERlY29kZSh0b2tlbilcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHBhc3N3b3JkSXNTdHJvbmdFbm91Z2ggPSAocGFzc3dvcmQ6IHN0cmluZywgYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnRW50ZXJlZCBwYXNzd29yZCBpcyB0b28gd2VhaydcclxuICAgIGlmIChwYXNzd29yZCA9PT0gJycgJiYgYWxsb3dOdWxsKSByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA8IDgpIHJldHVybiBtZXNzYWdlXHJcbiAgICBpZiAoISgvW0EtWl0vLnRlc3QocGFzc3dvcmQpKSkgcmV0dXJuIG1lc3NhZ2VcclxuICAgIGlmICghKC9bYS16XS8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgaWYgKCEoL1xcZC8udGVzdChwYXNzd29yZCkpKSByZXR1cm4gbWVzc2FnZVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzTG9naW4gPSBhc3luYyAoZ2MyOiBHYzJTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICBjb25zdCB7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbiAmJiAhcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAoIWFjY2Vzc1Rva2VuIHx8IChhY2Nlc3NUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChhY2Nlc3NUb2tlbikpKSB7XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiAmJiBpc1Rva2VuRXhwaXJlZChyZWZyZXNoVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGhhcyBleHBpcmVkLiBQbGVhc2UgbG9naW4gYWdhaW4uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdjMi5nZXRSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKVxyXG4gICAgICAgICAgICAgICAgc2V0VG9rZW5zKHthY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbiwgaWRUb2tlbjogZGF0YT8uaWRfdG9rZW59KVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgcmVmcmVzaCB0b2tlbi4nKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldFRva2VucyA9ICh0b2tlbnM6IFRva2Vucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl90b2tlbnMnLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAnYWNjZXNzVG9rZW4nOiB0b2tlbnMuYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgICAncmVmcmVzaFRva2VuJzogdG9rZW5zLnJlZnJlc2hUb2tlbixcclxuICAgICAgICAgICAgICAgICdpZFRva2VuJzogdG9rZW5zPy5pZFRva2VuIHx8ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICApXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUb2tlbnMgPSAoKTogVG9rZW5zID0+IHtcclxuICAgIGNvbnN0IHN0cjogc3RyaW5nIHwgbnVsbCA9IGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdnYzJfdG9rZW5zJylcclxuICAgIGNvbnN0IHRva2VuczogYW55ID0gc3RyID8gSlNPTi5wYXJzZShzdHIpIDoge31cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucz8uYWNjZXNzVG9rZW4gfHwgJycsXHJcbiAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnM/LnJlZnJlc2hUb2tlbiB8fCAnJyxcclxuICAgICAgICBpZFRva2VuOiB0b2tlbnM/LmlkVG9rZW4gfHwgJycsXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gKG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oJ2djMl9vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgJ2NsaWVudElkJzogb3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgICdob3N0Jzogb3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgJ3JlZGlyZWN0VXJpJzogb3B0aW9ucy5yZWRpcmVjdFVyaVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0T3B0aW9ucyA9ICgpOiBDb2RlRmxvd09wdGlvbnMgPT4ge1xyXG4gICAgY29uc3Qgc3RyOiBzdHJpbmcgfCBudWxsID0gZ2V0U3RvcmFnZSgpLmdldEl0ZW0oJ2djMl9vcHRpb25zJylcclxuICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHN0ciA/IEpTT04ucGFyc2Uoc3RyKSA6IHt9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGNsaWVudElkOiBvcHRpb25zPy5jbGllbnRJZCB8fCAnJyxcclxuICAgICAgICBob3N0OiBvcHRpb25zPy5ob3N0IHx8ICcnLFxyXG4gICAgICAgIHJlZGlyZWN0VXJpOiBvcHRpb25zPy5yZWRpcmVjdFVyaSB8fCAnJyxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZVN0cmluZyA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICByZXR1cm4gYnRvYShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RyKS5yZWR1Y2UoKGFjYywgYnl0ZSkgPT4gYWNjICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxyXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxyXG4gICAgICAgIC5yZXBsYWNlKC89KyQvLCAnJyk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjbGVhclRva2VucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfdG9rZW5zJylcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFyT3B0aW9ucyA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfb3B0aW9ucycpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXROb25jZSA9ICgpOiBzdHJpbmd8bnVsbCA9PiB7XHJcbiAgICByZXR1cm4gPHN0cmluZz5nZXRTdG9yYWdlKCkuZ2V0SXRlbSgnZ2MyX25vbmNlJylcclxufVxyXG5leHBvcnQgY29uc3QgY2xlYXJOb25jZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIGdldFN0b3JhZ2UoKS5yZW1vdmVJdGVtKCdnYzJfbm9uY2UnKVxyXG59XHJcblxyXG4iLCJpbXBvcnQge0NvZGVGbG93T3B0aW9ucywgR2V0RGV2aWNlQ29kZVJlc3BvbnNlLCBnZXROb25jZSwgR2V0VG9rZW5SZXNwb25zZSwgUGFzc3dvcmRGbG93T3B0aW9uc30gZnJvbSAnLi4vdXRpbC91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2MyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IENvZGVGbG93T3B0aW9ucyB8IFBhc3N3b3JkRmxvd09wdGlvbnM7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVHlwZSBndWFyZHMgdG8gY2hlY2sgaWYgb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMgb3IgUGFzc3dvcmRGbG93T3B0aW9uc1xyXG4gICAgcHJpdmF0ZSBpc0NvZGVGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBDb2RlRmxvd09wdGlvbnMge1xyXG4gICAgICAgIHJldHVybiAncmVkaXJlY3RVcmknIGluIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUGFzc3dvcmRGbG93T3B0aW9ucyhvcHRpb25zOiBDb2RlRmxvd09wdGlvbnMgfCBQYXNzd29yZEZsb3dPcHRpb25zKTogb3B0aW9ucyBpcyBQYXNzd29yZEZsb3dPcHRpb25zIHtcclxuICAgICAgICByZXR1cm4gJ3VzZXJuYW1lJyBpbiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5ob3N0fSR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICBtZXRob2Q6ICdHRVQnIHwgJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk/OiBhbnksXHJcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnID0gJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7J0NvbnRlbnQtVHlwZSc6IGNvbnRlbnRUeXBlfTtcclxuICAgICAgICBsZXQgcGF5bG9hZDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xyXG4gICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF5bG9hZCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoYm9keSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVycyxcclxuICAgICAgICAgICAgYm9keTogcGF5bG9hZCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IgJHtyZXNwb25zZS5zdGF0dXN9OiAke2VyclRleHR9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldERldmljZUNvZGUoKTogUHJvbWlzZTxHZXREZXZpY2VDb2RlUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLmRldmljZVVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aC9kZXZpY2VgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodGhpcy5idWlsZFVybChwYXRoKSwgJ1BPU1QnLCB7XHJcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHBvbGxUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gdGhpcy5vcHRpb25zLnRva2VuVXJpID8/IGAke3RoaXMuaG9zdH0vYXBpL3Y0L29hdXRoYDtcclxuICAgICAgICBjb25zdCBnZXRUb2tlbiA9IGFzeW5jICgpOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2UgfCBudWxsIHwgc3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRVcmwocGF0aCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jb2RlOiBkZXZpY2VDb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnZGV2aWNlX2NvZGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gSlNPTi5wYXJzZShlLm1lc3NhZ2Uuc3BsaXQoJzogJylbMV0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciA9PT0gJ2F1dGhvcml6YXRpb25fcGVuZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJyb3JfZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBnZXRUb2tlbigpO1xyXG4gICAgICAgIHdoaWxlIChyZXNwb25zZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaW50ZXJ2YWwgKiAxMTAwKSk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZ2V0VG9rZW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoY29kZUNoYWxsZW5nZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLm9wdGlvbnMuYXV0aFVyaSA/PyBgJHt0aGlzLmhvc3R9L2F1dGgvYFxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxyXG4gICAgICAgIC8vIEdldCBub25jZSBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBnZXROb25jZSgpXHJcbiAgICAgICAgLy8gQWRkIHBhcmFtZXRlcnMgY29uZGl0aW9uYWxseVxyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsIHRoaXMub3B0aW9ucy5jbGllbnRJZCk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgncmVkaXJlY3RfdXJpJywgcmVkaXJlY3RVcmkpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ3N0YXRlJywgc3RhdGUpO1xyXG4gICAgICAgIHBhcmFtcy5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgY29kZUNoYWxsZW5nZSk7XHJcbiAgICAgICAgcGFyYW1zLnNldCgnY29kZV9jaGFsbGVuZ2VfbWV0aG9kJywgJ1MyNTYnKTtcclxuICAgICAgICBpZiAobm9uY2UpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnbm9uY2UnLCBub25jZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9ubHkgYWRkIHNjb3BlIGlmIGl0J3MgZGVmaW5lZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NvcGUpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnNldCgnc2NvcGUnLCB0aGlzLm9wdGlvbnMuc2NvcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7YmFzZX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEF1dGhvcml6YXRpb25Db2RlVG9rZW4oXHJcbiAgICAgICAgY29kZTogc3RyaW5nIHwgc3RyaW5nW10sXHJcbiAgICAgICAgY29kZVZlcmlmaWVyOiBzdHJpbmcgfCBudWxsXHJcbiAgICApOiBQcm9taXNlPEdldFRva2VuUmVzcG9uc2U+IHtcclxuICAgICAgICBsZXQgcmVkaXJlY3RVcmk6IHN0cmluZ1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29kZUZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgcmVkaXJlY3RVcmkgPSB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvZGVGbG93IG9wdGlvbnMgcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uJylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXHJcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcclxuICAgICAgICAgICAgICAgIGNvZGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRQYXNzd29yZFRva2VuKCk6IFByb21pc2U8R2V0VG9rZW5SZXNwb25zZT4ge1xyXG4gICAgICAgIGxldCB1c2VybmFtZSwgcGFzc3dvcmQsIGRhdGFiYXNlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNQYXNzd29yZEZsb3dPcHRpb25zKHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgICAgICAgdXNlcm5hbWUgPSB0aGlzLm9wdGlvbnMudXNlcm5hbWVcclxuICAgICAgICAgICAgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucGFzc3dvcmRcclxuICAgICAgICAgICAgZGF0YWJhc2UgPSB0aGlzLm9wdGlvbnMuZGF0YWJhc2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3N3b3JkRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZSxcclxuICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgZGF0YWJhc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFJlZnJlc2hUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxHZXRUb2tlblJlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMub3B0aW9ucy50b2tlblVyaSA/PyBgJHt0aGlzLmhvc3R9L2FwaS92NC9vYXV0aGA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChcclxuICAgICAgICAgICAgdGhpcy5idWlsZFVybChwYXRoKSxcclxuICAgICAgICAgICAgJ1BPU1QnLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRoaXMub3B0aW9ucy5jbGllbnRJZCxcclxuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcclxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTaWduT3V0VVJMKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlZGlyZWN0VXJpOiBzdHJpbmdcclxuICAgICAgICBpZiAodGhpcy5pc0NvZGVGbG93T3B0aW9ucyh0aGlzLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0VXJpID0gdGhpcy5vcHRpb25zLnJlZGlyZWN0VXJpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2RlRmxvdyBvcHRpb25zIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xyXG4gICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nb3V0VXJpID8/IGAke3RoaXMuaG9zdH0vc2lnbm91dD8ke3BhcmFtcy50b1N0cmluZygpfWA7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHtHYzJTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL2djMi5zZXJ2aWNlcydcclxuaW1wb3J0IHtnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UsIGlzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5pbXBvcnQge0NvZGVGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9uc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5pbXBvcnQge2dldFN0b3JhZ2V9IGZyb20gJy4vdXRpbC9zdG9yYWdlJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29kZUZsb3cge1xyXG4gICAgb3B0aW9uczogQ29kZUZsb3dPcHRpb25zXHJcbiAgICBzZXJ2aWNlOiBHYzJTZXJ2aWNlXHJcblxyXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQ29kZUZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHJlZGlyZWN0SGFuZGxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaFxyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwpXHJcblxyXG4gICAgICAgIGNvbnN0IGVycm9yID0gcXVlcnlQYXJhbXMuZ2V0KCdlcnJvcicpXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZGlyZWN0OiAke3VybH1gKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29kZSA9IHF1ZXJ5UGFyYW1zLmdldCgnY29kZScpXHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBxdWVyeVBhcmFtcy5nZXQoJ3N0YXRlJylcclxuICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBnZXRTdG9yYWdlKCkuZ2V0SXRlbSgnc3RhdGUnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3NzaWJsZSBDU1JGIGF0dGFjay4gQWJvcnRpbmcgbG9naW4hJylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuLFxyXG4gICAgICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRBdXRob3JpemF0aW9uQ29kZVRva2VuKGNvZGUsIGdldFN0b3JhZ2UoKS5nZXRJdGVtKCdjb2RlVmVyaWZpZXInKSlcclxuICAgICAgICAgICAgICAgIHNldFRva2Vucyh7YWNjZXNzVG9rZW46IGFjY2Vzc190b2tlbiwgcmVmcmVzaFRva2VuOiByZWZyZXNoX3Rva2VuLCBpZFRva2VuOiBpZF90b2tlbn0pXHJcbiAgICAgICAgICAgICAgICBzZXRPcHRpb25zKHtcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5vcHRpb25zLmNsaWVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJpOiB0aGlzLm9wdGlvbnMucmVkaXJlY3RVcmlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBnZXRTdG9yYWdlKCkucmVtb3ZlSXRlbSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgZ2V0U3RvcmFnZSgpLnJlbW92ZUl0ZW0oJ2NvZGVWZXJpZmllcicpXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN0YXRlIGFuZCBjb2RlIGZyb20gdGhlIHJlZGlyZWN0IHVybFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5kZWxldGUoJ2NvZGUnKVxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLmRlbGV0ZSgnc3RhdGUnKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBsb2Mub3JpZ2luICsgbG9jLnBhdGhuYW1lICsgKHBhcmFtcy5zaXplID4gMCA/ICc/JyArIHBhcmFtcy50b1N0cmluZygpIDogJycpXHJcbiAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCAnJywgbmV3VXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXHJcblxyXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGlzTG9naW4odGhpcy5zZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2lnbkluKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHtzdGF0ZSwgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlfSA9IGF3YWl0IGdlbmVyYXRlUGtjZUNoYWxsZW5nZSgpXHJcbiAgICAgICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oXCJzdGF0ZVwiLCBzdGF0ZSlcclxuICAgICAgICBnZXRTdG9yYWdlKCkuc2V0SXRlbShcImNvZGVWZXJpZmllclwiLCBjb2RlVmVyaWZpZXIpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0QXV0aG9yaXphdGlvbkNvZGVVUkwoXHJcbiAgICAgICAgICAgIGNvZGVDaGFsbGVuZ2UsXHJcbiAgICAgICAgICAgIHN0YXRlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpZ25PdXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRTaWduT3V0VVJMKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIGNsZWFyVG9rZW5zKClcclxuICAgICAgICBjbGVhck9wdGlvbnMoKVxyXG4gICAgICAgIGNsZWFyTm9uY2UoKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7R2MyU2VydmljZSx9IGZyb20gJy4vc2VydmljZXMvZ2MyLnNlcnZpY2VzJ1xyXG5pbXBvcnQge2lzTG9naW4sIHNldFRva2Vucywgc2V0T3B0aW9ucywgUGFzc3dvcmRGbG93T3B0aW9ucywgY2xlYXJUb2tlbnMsIGNsZWFyT3B0aW9ucywgY2xlYXJOb25jZX0gZnJvbSAnLi91dGlsL3V0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFzc3dvcmRGbG93IHtcclxuICAgIG9wdGlvbnM6IFBhc3N3b3JkRmxvd09wdGlvbnNcclxuICAgIHNlcnZpY2U6IEdjMlNlcnZpY2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQYXNzd29yZEZsb3dPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBHYzJTZXJ2aWNlKG9wdGlvbnMpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNpZ25JbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IGF3YWl0IHRoaXMuc2VydmljZS5nZXRQYXNzd29yZFRva2VuKClcclxuICAgICAgICBzZXRUb2tlbnMoe2FjY2Vzc1Rva2VuOiBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbn0pXHJcbiAgICAgICAgc2V0T3B0aW9ucyh7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LFxyXG4gICAgICAgICAgICByZWRpcmVjdFVyaTogJydcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaWduT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRva2VucygpXHJcbiAgICAgICAgY2xlYXJPcHRpb25zKClcclxuICAgICAgICBjbGVhck5vbmNlKClcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuICogQGF1dGhvciAgICAgTWFydGluIEjDuGdoIDxtaEBtYXBjZW50aWEuY29tPlxyXG4gKiBAY29weXJpZ2h0ICAyMDEzLTIwMjQgTWFwQ2VudGlhIEFwU1xyXG4gKiBAbGljZW5zZSAgICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvI0FHUEwgIEdOVSBBRkZFUk8gR0VORVJBTCBQVUJMSUMgTElDRU5TRSAzXHJcbiAqXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtnZXRPcHRpb25zLCBnZXRUb2tlbnMsIGlzTG9naW59IGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7R2MyU2VydmljZX0gZnJvbSBcIi4uL3NlcnZpY2VzL2djMi5zZXJ2aWNlc1wiO1xyXG5cclxuY29uc3QgZ2V0SGVhZGVycyA9IGFzeW5jIChjb250ZW50VHlwZTogc3RyaW5nfG51bGwgPSAnYXBwbGljYXRpb24vanNvbicpOiBQcm9taXNlPGFueT49PiB7XHJcbiAgdHlwZSBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiBzdHJpbmcsXHJcbiAgICBDb29raWU6IHN0cmluZyxcclxuICAgIEF1dGhvcml6YXRpb246IHN0cmluZ3xudWxsLFxyXG4gICAgJ0NvbnRlbnQtVHlwZSc/OiBzdHJpbmdcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSBnZXRPcHRpb25zKClcclxuICBjb25zdCBzZXJ2aWNlID0gbmV3IEdjMlNlcnZpY2Uob3B0aW9ucylcclxuXHJcbiAgLy8gV2UgY2hlY2sgaXMgdG9rZW4gbmVlZHMgcmVmcmVzaGluZ1xyXG4gIGlmICghYXdhaXQgaXNMb2dpbihzZXJ2aWNlKSkge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdJcyBub3QgbG9nZ2VkIGluJylcclxuICB9XHJcblxyXG4gIGNvbnN0IHthY2Nlc3NUb2tlbn0gPSBnZXRUb2tlbnMoKVxyXG5cclxuICBjb25zdCBoZWFkZXJzOiBoZWFkZXJzID0ge1xyXG4gICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICBDb29raWU6ICdYREVCVUdfU0VTU0lPTj1YREVCVUdfRUNMSVBTRScsXHJcbiAgICBBdXRob3JpemF0aW9uOiBhY2Nlc3NUb2tlbiA/ICdCZWFyZXIgJyArIGFjY2Vzc1Rva2VuIDogbnVsbCxcclxuICB9XHJcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XHJcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGNvbnRlbnRUeXBlXHJcbiAgfVxyXG4gIHJldHVybiBoZWFkZXJzXHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgZ2V0SGVhZGVyc1xyXG5cclxuIiwiLyoqXHJcbiAqIEBhdXRob3IgICAgIE1hcnRpbiBIw7hnaCA8bWhAbWFwY2VudGlhLmNvbT5cclxuICogQGNvcHlyaWdodCAgMjAxMy0yMDI0IE1hcENlbnRpYSBBcFNcclxuICogQGxpY2Vuc2UgICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLyNBR1BMICBHTlUgQUZGRVJPIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgM1xyXG4gKlxyXG4gKi9cclxuXHJcbmltcG9ydCBnZXRIZWFkZXJzIGZyb20gJy4vcmVxdWVzdC1oZWFkZXJzJ1xyXG5pbXBvcnQgTWV0aG9kIGZyb20gJy4uL2NvbW1vbi9odHRwLXZlcmJzJ1xyXG5pbXBvcnQge2dldE9wdGlvbnN9IGZyb20gJy4vdXRpbHMnXHJcblxyXG5leHBvcnQgY29uc3QgbWFrZSA9IGFzeW5jICh2ZXJzaW9uOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIG1ldGhvZDogTWV0aG9kLCBwYXlsb2FkPzogYW55LCBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbCA9ICdhcHBsaWNhdGlvbi9qc29uJyk6IFByb21pc2U8YW55PiA9PiB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoKVxyXG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlKVxyXG5cclxuICBsZXQgcmVxdWVzdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICByZWRpcmVjdDogJ21hbnVhbCdcclxuICB9XHJcbiAgaWYgKHBheWxvYWQpIHtcclxuICAgIHJlcXVlc3QuYm9keSA9IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSA6IHBheWxvYWRcclxuICB9XHJcbiAgcmV0dXJuIGF3YWl0IGZldGNoKG9wdGlvbnMuaG9zdCArIGAvYXBpL3Yke3ZlcnNpb259LyR7cmVzb3VyY2V9YCwgcmVxdWVzdClcclxufVxyXG5leHBvcnQgZGVmYXVsdCBtYWtlXHJcbiIsImNvbnN0IGdldCA9IGFzeW5jIChyZXNwb25zZTogUmVzcG9uc2UsIGV4cGVjdGVkQ29kZTogbnVtYmVyKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICBsZXQgcmVzOiBhbnkgPSBudWxsXHJcbiAgICBsZXQgYm9keVRleHQgPSAnJ1xyXG5cclxuICAgIC8vIFJlYWQgdGhlIGJvZHkgb25seSBvbmNlIGFzIHRleHQuIFRoaXMgYXZvaWRzIFwiYm9keSB1c2VkIGFscmVhZHlcIiB3aXRoIG5vZGUtZmV0Y2guXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIEV2ZW4gZm9yIDIwNC8zMDMsIHRleHQoKSBpcyBzYWZlIGFuZCB3aWxsIHJldHVybiAnJyBmb3IgZW1wdHkgYm9kaWVzXHJcbiAgICAgICAgYm9keVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBJZ25vcmUgYm9keSByZWFkIGVycm9yczsgd2UnbGwgcHJvY2VlZCB3aXRoIG51bGwvZW1wdHkgYm9keVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRyeSB0byBwYXJzZSBKU09OIGlmIHRoZXJlIGlzIGEgYm9keVxyXG4gICAgaWYgKGJvZHlUZXh0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShib2R5VGV4dClcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBKU09OOyBrZWVwIHJlcyBhcyBudWxsIGFuZCB1c2UgYm9keVRleHQgZm9yIGVycm9yIG1lc3NhZ2VzXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IGV4cGVjdGVkQ29kZSkge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IChyZXMgJiYgKHJlcy5tZXNzYWdlIHx8IHJlcy5lcnJvcikpIHx8IGJvZHlUZXh0IHx8IGBVbmV4cGVjdGVkIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZylcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgMjA0LzMwMywgcmVzIHdpbGwgYmUgbnVsbCAobm8gYm9keSksIHdoaWNoIGlzIGZpbmUgZm9yIGNhbGxlcnMgZXhwZWN0aW5nIG5vIGNvbnRlbnRcclxuICAgIHJldHVybiByZXNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuaW1wb3J0IHtTcWxSZXF1ZXN0LCBTUUxSZXNwb25zZX0gZnJvbSBcIi4vdHlwZXMvcGdUeXBlc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3FsIHtcclxuICAgIGFzeW5jIGV4ZWMocmVxdWVzdDogU3FsUmVxdWVzdCk6IFByb21pc2U8U1FMUmVzcG9uc2U+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3FsYCwgJ1BPU1QnLCByZXF1ZXN0KVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcbmltcG9ydCB7UnBjUmVxdWVzdCwgUnBjUmVzcG9uc2V9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJwYyB7XHJcbiAgICBhc3luYyBjYWxsKHJlcXVlc3Q6IFJwY1JlcXVlc3QpOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYGNhbGxgLCAnUE9TVCcsIHJlcXVlc3QpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGEge1xyXG4gICAgYXN5bmMgcXVlcnkocmVsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnMycsIGBtZXRhLyR7cmVsfWAsICdHRVQnLCBudWxsKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2dldFRva2Vuc30gZnJvbSBcIi4vdXRpbC91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdHVzIHtcclxuICAgIGlzQXV0aCgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnMoKVxyXG4gICAgICAgIHJldHVybiAhKCF0b2tlbnMuYWNjZXNzVG9rZW4gJiYgIXRva2Vucy5yZWZyZXNoVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRva2VucygpIHtcclxuICAgICAgICByZXR1cm4gZ2V0VG9rZW5zKClcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQge2NsYWltcywgZ2V0VG9rZW5zfSBmcm9tIFwiLi91dGlsL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGFpbXMge1xyXG4gICAgZ2V0KCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VucyA9IGdldFRva2VucygpLmFjY2Vzc1Rva2VuXHJcbiAgICAgICAgcmV0dXJuIGNsYWltcyh0b2tlbnMpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCBtYWtlIGZyb20gXCIuL3V0aWwvbWFrZS1yZXF1ZXN0XCI7XHJcbmltcG9ydCBnZXQgZnJvbSBcIi4vdXRpbC9nZXQtcmVzcG9uc2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJzIHtcclxuICAgIGFzeW5jIGdldCh1c2VyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGB1c2Vycy8ke3VzZXJ9YCwgJ0dFVCcsIG51bGwpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7V3NPcHRpb25zLCBnZXRUb2tlbnN9IGZyb20gXCIuL3V0aWwvdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdzIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogV3NPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdzT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtZSA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VufSA9IGdldFRva2VucygpXHJcblxyXG4gICAgICAgIGNvbnN0IGNvbm5lY3QgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldChcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5ob3N0ICsgYC8/dG9rZW49YCArIGFjY2Vzc1Rva2VuLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB3cy5vbm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY29ubmVjdGVkIScpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgICAgbWUub3B0aW9ucz8uY2FsbEJhY2soZXZlbnQuZGF0YSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHdzLm9uY2xvc2UgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJTb2NrZXQgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gMyBzZWNvbmRzLi4uJywgZXZlbnQucmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIDMwMDApOyAvLyBUcnkgdG8gcmVjb25uZWN0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB3cy5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXZWJTb2NrZXQgZXJyb3Igb2JzZXJ2ZWQ6JywgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXQgb24gZXJyb3IgdG8gZW5zdXJlIGNsZWFuIHJlY29ubmVjdGlvblxyXG4gICAgICAgICAgICAgICAgd3MuY2xvc2UoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBTdGFydCB0aGUgY29ubmVjdGlvblxyXG4gICAgICAgIGlmIChhY2Nlc3NUb2tlbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgbWFrZSBmcm9tIFwiLi91dGlsL21ha2UtcmVxdWVzdFwiO1xyXG5pbXBvcnQgZ2V0IGZyb20gXCIuL3V0aWwvZ2V0LXJlc3BvbnNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0cyB7XHJcbiAgICBhc3luYyBnZXQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc3RhdHNgLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IG1ha2UgZnJvbSBcIi4vdXRpbC9tYWtlLXJlcXVlc3RcIjtcclxuaW1wb3J0IGdldCBmcm9tIFwiLi91dGlsL2dldC1yZXNwb25zZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVzIHtcclxuICAgIGFzeW5jIGdldChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnR0VUJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDApXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlKHNjaGVtYTogc3RyaW5nLCB0YWJsZTogc3RyaW5nLCBwYXlsb2FkOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFrZSgnNCcsIGBzY2hlbWFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNjaGVtYSl9L3RhYmxlcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0YWJsZSl9YCwgJ1BPU1QnLCBwYXlsb2FkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBnZXQocmVzcG9uc2UsIDIwMClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwYXRjaChzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZywgcGF5bG9hZDogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2UoJzQnLCBgc2NoZW1hcy8ke2VuY29kZVVSSUNvbXBvbmVudChzY2hlbWEpfS90YWJsZXMvJHtlbmNvZGVVUklDb21wb25lbnQodGFibGUpfWAsICdQQVRDSCcsIHBheWxvYWQpXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldChyZXNwb25zZSwgMjAwKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShzY2hlbWE6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlKCc0JywgYHNjaGVtYXMvJHtlbmNvZGVVUklDb21wb25lbnQoc2NoZW1hKX0vdGFibGVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRhYmxlKX1gLCAnREVMRVRFJywgbnVsbClcclxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0KHJlc3BvbnNlLCAyMDQpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IFJwYyBmcm9tIFwiLi9ScGNcIlxyXG5pbXBvcnQge1JwY1JlcXVlc3R9IGZyb20gXCIuL3R5cGVzL3BnVHlwZXNcIlxyXG5cclxudHlwZSBNZXRob2RzT2Y8VD4gPSB7XHJcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSID8gKC4uLmFyZ3M6IEEpID0+IFIgOiBuZXZlcjtcclxufTtcclxuXHJcbi8vIEltcGxlbWVudGF0aW9uIHNpZ25hdHVyZSAod2lkZSkg4oCUIG92ZXJsb2FkcyBhYm92ZSBjb250cm9sIHRoZSBwdWJsaWMgdHlwaW5nXHJcbmFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoPEsgZXh0ZW5kcyBrZXlvZiBhbnkgJiBzdHJpbmc+KG5hbWU6IEssIGFyZ3M6IG9iamVjdHxBcnJheTxvYmplY3Q+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vY29uc29sZS5sb2coXCJEaXNwYXRjaDpcIiwgbmFtZSwgYXJncyk7XHJcbiAgICAvLyByb3V0ZSB0byByZWFsIGltcGxlbWVudGF0aW9uczpcclxuICAgIGNvbnN0IHJwYyA9IG5ldyBScGMoKVxyXG4gICAgY29uc3QgcmVxdWVzdDogUnBjUmVxdWVzdCA9IHtcclxuICAgICAgICBqc29ucnBjOiBcIjIuMFwiLFxyXG4gICAgICAgIG1ldGhvZDogbmFtZSxcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwYXJhbXM6IGFyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICB9XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBycGMuY2FsbChyZXF1ZXN0KVxyXG4gICAgcmV0dXJuIHJlcy5yZXN1bHQuZGF0YVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGk8VD4oKTogTWV0aG9kc09mPFQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJveHkoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4gKGRpc3BhdGNoIGFzIGFueSkocHJvcCwgLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgKSBhcyB1bmtub3duIGFzIE1ldGhvZHNPZjxUPjtcclxufVxyXG4iXSwibmFtZXMiOlsiSW52YWxpZFRva2VuRXJyb3IiLCJiNjREZWNvZGVVbmljb2RlIiwic3RyIiwibSIsInAiLCJjb2RlIiwiYmFzZTY0VXJsRGVjb2RlIiwib3V0cHV0Iiwiand0RGVjb2RlIiwidG9rZW4iLCJvcHRpb25zIiwicG9zIiwicGFydCIsImRlY29kZWQiLCJlIiwiTWVtb3J5U3RvcmFnZSIsImtleSIsInZhbHVlIiwiY2FjaGVkIiwiZ2V0U3RvcmFnZSIsImciLCJnZW5lcmF0ZVBrY2VDaGFsbGVuZ2UiLCJnZW5lcmF0ZVJhbmRvbVN0cmluZyIsImFycmF5IiwiZGVjIiwic2hhMjU2IiwicGxhaW4iLCJkYXRhIiwiYmFzZTY0dXJsRW5jb2RlIiwicGtjZUNoYWxsZW5nZUZyb21WZXJpZmllciIsInYiLCJoYXNoZWQiLCJzdGF0ZSIsImNvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJpc1Rva2VuRXhwaXJlZCIsImlzSnd0RXhwaXJlZCIsImV4cCIsImN1cnJlbnRUaW1lIiwiY2xhaW1zIiwiaXNMb2dpbiIsImdjMiIsImFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZ2V0VG9rZW5zIiwiY2xlYXJUb2tlbnMiLCJjbGVhck9wdGlvbnMiLCJzZXRUb2tlbnMiLCJ0b2tlbnMiLCJzZXRPcHRpb25zIiwiZ2V0T3B0aW9ucyIsImdldE5vbmNlIiwiY2xlYXJOb25jZSIsIkdjMlNlcnZpY2UiLCJwYXRoIiwidXJsIiwibWV0aG9kIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiaGVhZGVycyIsInBheWxvYWQiLCJyZXNwb25zZSIsImVyclRleHQiLCJkZXZpY2VDb2RlIiwiaW50ZXJ2YWwiLCJnZXRUb2tlbiIsImVyciIsInJlc29sdmUiLCJyZWRpcmVjdFVyaSIsImJhc2UiLCJwYXJhbXMiLCJub25jZSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJkYXRhYmFzZSIsIkNvZGVGbG93IiwicXVlcnlQYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiaWRfdG9rZW4iLCJsb2MiLCJuZXdVcmwiLCJQYXNzd29yZEZsb3ciLCJnZXRIZWFkZXJzIiwic2VydmljZSIsIm1ha2UiLCJ2ZXJzaW9uIiwicmVzb3VyY2UiLCJyZXF1ZXN0IiwiZ2V0IiwiZXhwZWN0ZWRDb2RlIiwicmVzIiwiYm9keVRleHQiLCJtc2ciLCJTcWwiLCJScGMiLCJNZXRhIiwicmVsIiwiU3RhdHVzIiwiQ2xhaW1zIiwiVXNlcnMiLCJ1c2VyIiwiV3MiLCJtZSIsImNvbm5lY3QiLCJ3cyIsImV2ZW50IiwiX2EiLCJTdGF0cyIsIlRhYmxlcyIsInNjaGVtYSIsInRhYmxlIiwiZGlzcGF0Y2giLCJuYW1lIiwiYXJncyIsInJwYyIsImNyZWF0ZUFwaSIsIl90YXJnZXQiLCJwcm9wIl0sIm1hcHBpbmdzIjoiMk5BNENP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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/util/utils.ts","../src/services/gc2.services.ts","../src/CodeFlow.ts","../src/PasswordFlow.ts","../src/types/pgTypes.ts","../src/Sql.ts","../src/Rpc.ts","../src/Meta.ts","../src/Status.ts","../src/Claims.ts","../src/Users.ts","../src/Ws.ts","../src/Stats.ts","../src/Tables.ts","../src/Api.ts"],"sourcesContent":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,14 @@
1
1
  {
2
2
  "name": "@centia-io/sdk",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "description": "TypeScript client for Centia-io",
5
5
  "type": "module",
6
- "main": "./dist/index.cjs",
6
+ "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js",
13
- "require": "./dist/index.cjs"
14
- }
10
+ ".": "./dist/index.js",
11
+ "./package.json": "./package.json"
15
12
  },
16
13
  "files": [
17
14
  "dist",
@@ -25,6 +22,6 @@
25
22
  "private": false,
26
23
  "scripts": {
27
24
  "dev": "vite build --watch --mode development",
28
- "build": "tsdown"
25
+ "build": "tsdown --watch"
29
26
  }
30
27
  }