@decaf-ts/for-http 0.2.5 → 0.2.7
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/LICENSE.md +3 -2
- package/README.md +212 -276
- package/dist/for-http.cjs +1 -1
- package/dist/for-http.esm.cjs +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/package.json +12 -4
package/LICENSE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2025 Tiago Venceslau
|
|
3
|
+
Copyright (c) 2025 Tiago Venceslau and Contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
|
22
|
+
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-

|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# decaf-ts/for-http
|
|
4
4
|
|
|
5
|
-
A
|
|
5
|
+
A lightweight HTTP adapter layer for decaf-ts that enables CRUD-style repositories and services over REST APIs. It defines a generic HttpAdapter with concrete implementations (e.g., Axios), a RestService for simple model-centric operations, and a RestRepository when you need repository decoration logic before submitting to the backend. Includes minimal types for configuration and request flags.
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|

|
|
@@ -28,344 +28,280 @@ A TypeScript library for seamless REST API interactions. This module provides a
|
|
|
28
28
|
|
|
29
29
|
Documentation available [here](https://decaf-ts.github.io/for-http/)
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
# decaf-ts/for-http — Detailed Description
|
|
32
|
+
|
|
33
|
+
This package provides a small, focused HTTP integration for decaf-ts. It introduces a generic HttpAdapter abstraction that maps REST semantics (create/read/update/delete and bulk variants) onto decaf-ts repositories and services, plus minimal configuration and flags. A ready-to-use Axios adapter is included.
|
|
34
|
+
|
|
35
|
+
Core goals
|
|
36
|
+
- Keep HTTP concerns decoupled from models and repositories.
|
|
37
|
+
- Provide a consistent CRUD surface over REST endpoints.
|
|
38
|
+
- Allow custom clients (via subclassing HttpAdapter) while shipping an Axios implementation.
|
|
39
|
+
- Offer simple configuration (protocol/host) and request-scoped headers via flags/context.
|
|
40
|
+
|
|
41
|
+
Key building blocks
|
|
42
|
+
- HttpConfig: A minimal connection config with protocol and host.
|
|
43
|
+
- HttpFlags: Extends RepositoryFlags to include optional HTTP headers.
|
|
44
|
+
- HttpAdapter<Y, CON, Q, F, C>:
|
|
45
|
+
- Extends the core Adapter to focus on HTTP.
|
|
46
|
+
- Adds default flags() with headers support.
|
|
47
|
+
- Provides URL building (protected url()) and error parsing (parseError()).
|
|
48
|
+
- Declares abstract request(), create(), read(), update(), delete().
|
|
49
|
+
- Declares optional/unsupported-by-default raw(), Sequence(), Statement(), parseCondition() that concrete adapters may implement if needed.
|
|
50
|
+
- repository() returns RestService as the default repository/service implementation for this adapter type.
|
|
51
|
+
- RestService<M, Q, A, F, C>:
|
|
52
|
+
- Lightweight, model-centric service that delegates to the HttpAdapter for CRUD and bulk operations.
|
|
53
|
+
- Converts between model instances and plain records using adapter.prepare() and adapter.revert().
|
|
54
|
+
- Manages a list of observers (observe/unObserve/updateObservers) that can be refreshed after changes.
|
|
55
|
+
- RestRepository<M, Q, A, F, C>:
|
|
56
|
+
- A Repository that works with an HttpAdapter; use it if you need decaf-ts repository decoration/logic before sending to the backend.
|
|
57
|
+
- Not the default repository for the HTTP adapter (that role is fulfilled by RestService); intended for cases where repository lifecycle logic matters.
|
|
58
|
+
- AxiosHttpAdapter:
|
|
59
|
+
- Concrete implementation of HttpAdapter built on Axios.
|
|
60
|
+
- Implements request and CRUD operations using Axios.request/get/post/put/delete.
|
|
61
|
+
- Uses HttpConfig for base URL construction and inherits header flag behavior.
|
|
62
|
+
|
|
63
|
+
Flow overview
|
|
64
|
+
1. Instantiate a concrete adapter (e.g., AxiosHttpAdapter) with an HttpConfig.
|
|
65
|
+
2. Get a repository/service for a given model (the default is RestService via adapter.getRepository(), or instantiate RestService/RestRepository directly).
|
|
66
|
+
3. Call CRUD methods (create/read/update/delete) or their bulk equivalents (createAll/readAll/updateAll/deleteAll) on the service or repository. The service:
|
|
67
|
+
- Derives the table/collection name from the model’s decaf-ts metadata.
|
|
68
|
+
- Uses adapter.prepare() to serialize the model and extract its ID.
|
|
69
|
+
- Invokes the adapter’s HTTP methods.
|
|
70
|
+
- Uses adapter.revert() to rehydrate responses back into model instances.
|
|
71
|
+
4. Optionally provide HttpFlags (e.g., headers) in the Context to influence requests.
|
|
72
|
+
|
|
73
|
+
URL building and error handling
|
|
74
|
+
- HttpAdapter.url() builds URLs as `${protocol}://${host}/${tableName}` and appends encoded query parameters when provided, ensuring spaces are encoded as %20.
|
|
75
|
+
- HttpAdapter.parseError() currently returns the error unchanged (as BaseError) but is intended to be overridden/extended by concrete adapters to normalize HTTP/client errors.
|
|
76
|
+
|
|
77
|
+
Bulk operations
|
|
78
|
+
- RestService implements createAll, readAll, updateAll, deleteAll. These delegate to similarly named adapter methods (which are expected to exist on the base Adapter implementation from @decaf-ts/core), allowing efficient batched operations where supported by the backend.
|
|
79
|
+
|
|
80
|
+
Unsupported APIs by default
|
|
81
|
+
- Some persistence APIs from the core (raw, Sequence, Statement, parseCondition) are not meaningful out of the box for a generic HTTP adapter, so HttpAdapter throws UnsupportedError for them. Concrete adapters targeting specific backends can choose to implement these.
|
|
82
|
+
|
|
83
|
+
When to use RestService vs RestRepository
|
|
84
|
+
- Use RestService by default for straightforward CRUD over REST endpoints.
|
|
85
|
+
- Use RestRepository if you need repository-level decoration logic (e.g., hooks, rules) to run on your models before hitting the HTTP layer.
|
|
86
|
+
|
|
87
|
+
Extending with another HTTP client
|
|
88
|
+
- Subclass HttpAdapter and implement request(), create(), read(), update(), delete().
|
|
89
|
+
- Override parseError() to translate client-specific errors to your app’s BaseError.
|
|
90
|
+
- Optionally implement raw(), Sequence(), Statement(), parseCondition() if your backend/client supports those features.
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# How to Use decaf-ts/for-http
|
|
94
|
+
|
|
95
|
+
Below are concise, non-repeating examples demonstrating how to use each public element of this library. All code samples are valid TypeScript.
|
|
96
|
+
|
|
97
|
+
Note: Examples assume your models are decorated with decaf-ts metadata (e.g., table names and primary keys) through @decaf-ts/decorator-validation and @decaf-ts/db-decorators. For brevity, model decoration details are omitted.
|
|
98
|
+
|
|
99
|
+
## Types: HttpConfig and HttpFlags
|
|
100
|
+
|
|
101
|
+
Description: Define the basic connection configuration and optional per-request headers.
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
import { HttpConfig, HttpFlags } from "@decaf-ts/for-http";
|
|
32
105
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
106
|
+
const config: HttpConfig = {
|
|
107
|
+
protocol: "https",
|
|
108
|
+
host: "api.example.com",
|
|
109
|
+
};
|
|
36
110
|
|
|
37
|
-
|
|
111
|
+
// You can pass headers via flags (typically through a Context)
|
|
112
|
+
const flags: HttpFlags = {
|
|
113
|
+
headers: {
|
|
114
|
+
Authorization: "Bearer <token>",
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
```
|
|
38
118
|
|
|
39
|
-
|
|
119
|
+
## Adapter: AxiosHttpAdapter
|
|
40
120
|
|
|
41
|
-
|
|
121
|
+
Description: Ready-to-use HTTP adapter based on Axios. Use it to interact with REST endpoints.
|
|
42
122
|
|
|
43
|
-
|
|
123
|
+
```ts
|
|
124
|
+
import { AxiosHttpAdapter } from "@decaf-ts/for-http/axios";
|
|
125
|
+
import { HttpConfig } from "@decaf-ts/for-http";
|
|
44
126
|
|
|
45
|
-
|
|
127
|
+
const config: HttpConfig = { protocol: "https", host: "api.example.com" };
|
|
128
|
+
const adapter = new AxiosHttpAdapter(config);
|
|
129
|
+
```
|
|
46
130
|
|
|
47
|
-
|
|
131
|
+
## Service: RestService
|
|
48
132
|
|
|
49
|
-
|
|
133
|
+
Description: Lightweight, model-centric service that delegates CRUD and bulk operations to the adapter.
|
|
50
134
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- **Extensibility**: Designed to be extended with different HTTP client implementations
|
|
56
|
-
- **Error Handling**: Includes robust error handling and parsing
|
|
57
|
-
- **Observer Pattern**: Implements the observer pattern for reactive programming
|
|
135
|
+
```ts
|
|
136
|
+
import { RestService } from "@decaf-ts/for-http";
|
|
137
|
+
import { AxiosHttpAdapter } from "@decaf-ts/for-http/axios";
|
|
138
|
+
import { HttpConfig } from "@decaf-ts/for-http";
|
|
58
139
|
|
|
59
|
-
|
|
140
|
+
// Example model (assumes proper decaf-ts decorations elsewhere)
|
|
141
|
+
class User {
|
|
142
|
+
id!: string;
|
|
143
|
+
name!: string;
|
|
144
|
+
}
|
|
60
145
|
|
|
146
|
+
const config: HttpConfig = { protocol: "https", host: "api.example.com" };
|
|
147
|
+
const adapter = new AxiosHttpAdapter(config);
|
|
61
148
|
|
|
62
|
-
|
|
149
|
+
// Create a service bound to the User model
|
|
150
|
+
const users = new RestService<User, any, typeof adapter>(adapter, User);
|
|
63
151
|
|
|
64
|
-
|
|
65
|
-
|
|
152
|
+
// Create
|
|
153
|
+
const created = await users.create({ id: "u1", name: "Alice" } as User);
|
|
66
154
|
|
|
67
|
-
|
|
155
|
+
// Read
|
|
156
|
+
const found = await users.read("u1");
|
|
68
157
|
|
|
69
|
-
|
|
158
|
+
// Update
|
|
159
|
+
const updated = await users.update({ id: "u1", name: "Alice Cooper" } as User);
|
|
70
160
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
import { AxiosHttpAdapter } from '@decaf-ts/for-http';
|
|
161
|
+
// Delete
|
|
162
|
+
const removed = await users.delete("u1");
|
|
74
163
|
|
|
75
|
-
//
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
164
|
+
// Bulk create
|
|
165
|
+
const many = await users.createAll([
|
|
166
|
+
{ id: "u2", name: "Bob" } as User,
|
|
167
|
+
{ id: "u3", name: "Carol" } as User,
|
|
168
|
+
]);
|
|
80
169
|
|
|
81
|
-
//
|
|
82
|
-
const
|
|
83
|
-
```
|
|
170
|
+
// Bulk read
|
|
171
|
+
const foundMany = await users.readAll(["u2", "u3"]);
|
|
84
172
|
|
|
85
|
-
|
|
173
|
+
// Bulk update
|
|
174
|
+
const updatedMany = await users.updateAll([
|
|
175
|
+
{ id: "u2", name: "Bobby" } as User,
|
|
176
|
+
{ id: "u3", name: "Caroline" } as User,
|
|
177
|
+
]);
|
|
86
178
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class User extends Model {
|
|
91
|
-
id: string;
|
|
92
|
-
name: string;
|
|
93
|
-
email: string;
|
|
94
|
-
|
|
95
|
-
constructor(data?: Partial<User>) {
|
|
96
|
-
super();
|
|
97
|
-
Object.assign(this, data);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
179
|
+
// Bulk delete
|
|
180
|
+
const removedMany = await users.deleteAll(["u2", "u3"]);
|
|
100
181
|
```
|
|
101
182
|
|
|
102
|
-
|
|
183
|
+
## Repository: RestRepository
|
|
103
184
|
|
|
104
|
-
|
|
105
|
-
import { RestRepository } from '@decaf-ts/for-http';
|
|
185
|
+
Description: Use this when you need decaf-ts "repository" decoration logic to run before hitting the HTTP backend.
|
|
106
186
|
|
|
107
|
-
|
|
108
|
-
|
|
187
|
+
```ts
|
|
188
|
+
import { RestRepository } from "@decaf-ts/for-http";
|
|
189
|
+
import { AxiosHttpAdapter } from "@decaf-ts/for-http/axios";
|
|
190
|
+
import { HttpConfig } from "@decaf-ts/for-http";
|
|
109
191
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
});
|
|
115
|
-
const createdUser = await userRepository.create(newUser);
|
|
192
|
+
class Product {
|
|
193
|
+
id!: number;
|
|
194
|
+
title!: string;
|
|
195
|
+
}
|
|
116
196
|
|
|
117
|
-
|
|
118
|
-
const
|
|
197
|
+
const cfg: HttpConfig = { protocol: "https", host: "store.example.com" };
|
|
198
|
+
const http = new AxiosHttpAdapter(cfg);
|
|
119
199
|
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
await userRepository.update(user);
|
|
200
|
+
// Create a repository for Product
|
|
201
|
+
const products = new RestRepository<Product, any, typeof http>(http, Product);
|
|
123
202
|
|
|
124
|
-
//
|
|
125
|
-
await
|
|
203
|
+
// Typical repository interactions
|
|
204
|
+
const p = await products.findById(101);
|
|
205
|
+
// ... other repository APIs as provided by @decaf-ts/core Repository
|
|
126
206
|
```
|
|
127
207
|
|
|
128
|
-
|
|
208
|
+
## Passing headers via flags/context
|
|
129
209
|
|
|
130
|
-
|
|
131
|
-
import { RestService } from '@decaf-ts/for-http';
|
|
210
|
+
Description: Supply headers for a specific operation using HttpFlags. These are typically carried inside a Context from @decaf-ts/db-decorators.
|
|
132
211
|
|
|
133
|
-
|
|
134
|
-
|
|
212
|
+
```ts
|
|
213
|
+
import { Context } from "@decaf-ts/db-decorators";
|
|
214
|
+
import { OperationKeys } from "@decaf-ts/db-decorators";
|
|
215
|
+
import { AxiosHttpAdapter, AxiosFlags } from "@decaf-ts/for-http/axios";
|
|
216
|
+
import { RestService } from "@decaf-ts/for-http";
|
|
135
217
|
|
|
136
|
-
|
|
137
|
-
const newUser = new User({
|
|
138
|
-
name: 'John Doe',
|
|
139
|
-
email: 'john@example.com'
|
|
140
|
-
});
|
|
141
|
-
const createdUser = await userService.create(newUser);
|
|
218
|
+
class User { id!: string; name!: string; }
|
|
142
219
|
|
|
143
|
-
|
|
144
|
-
const
|
|
220
|
+
const adapter = new AxiosHttpAdapter({ protocol: "https", host: "api.example.com" });
|
|
221
|
+
const users = new RestService<User, any, typeof adapter>(adapter, User);
|
|
145
222
|
|
|
146
|
-
//
|
|
147
|
-
|
|
148
|
-
await userService.update(user);
|
|
223
|
+
// Generate flags for a READ operation (adds an empty headers obj you can override)
|
|
224
|
+
const flags = adapter.flags<User>(OperationKeys.READ, User, { headers: { Authorization: "Bearer <token>" } });
|
|
149
225
|
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
```
|
|
226
|
+
// Place flags into a context (shape depends on @decaf-ts/db-decorators; we cast here for example purposes)
|
|
227
|
+
const ctx = { flags } as unknown as Context<AxiosFlags>;
|
|
153
228
|
|
|
154
|
-
|
|
229
|
+
// Many decaf-ts operations accept an optional context/flags as the last argument
|
|
230
|
+
const user = await users.read("u1", ctx);
|
|
231
|
+
```
|
|
155
232
|
|
|
156
|
-
|
|
157
|
-
import { RestService } from '@decaf-ts/for-http';
|
|
233
|
+
## Subclassing: Custom HttpAdapter
|
|
158
234
|
|
|
159
|
-
|
|
160
|
-
const userService = new RestService(httpAdapter, User);
|
|
235
|
+
Description: Implement a custom adapter for a different HTTP client. You must implement request and CRUD methods at minimum.
|
|
161
236
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
new User({ name: 'Jane Doe', email: 'jane@example.com' })
|
|
166
|
-
];
|
|
167
|
-
const createdUsers = await userService.createAll(users);
|
|
237
|
+
```ts
|
|
238
|
+
import { HttpAdapter, HttpConfig, HttpFlags } from "@decaf-ts/for-http";
|
|
239
|
+
import { Context } from "@decaf-ts/db-decorators";
|
|
168
240
|
|
|
169
|
-
//
|
|
170
|
-
|
|
171
|
-
const fetchedUsers = await userService.readAll(userIds);
|
|
241
|
+
// Hypothetical client types
|
|
242
|
+
type MyClient = { request: <T>(config: any) => Promise<T>; get: <T>(url: string) => Promise<T>; post: <T>(url: string, body: any) => Promise<T>; put: <T>(url: string, body: any) => Promise<T>; delete: <T>(url: string) => Promise<T>; };
|
|
172
243
|
|
|
173
|
-
|
|
174
|
-
const usersToUpdate = [
|
|
175
|
-
new User({ id: '123', name: 'John Smith' }),
|
|
176
|
-
new User({ id: '456', name: 'Jane Smith' })
|
|
177
|
-
];
|
|
178
|
-
const updatedUsers = await userService.updateAll(usersToUpdate);
|
|
244
|
+
type MyRequestConfig = { url: string; method: "GET"|"POST"|"PUT"|"DELETE"; data?: any; headers?: Record<string,string>; };
|
|
179
245
|
|
|
180
|
-
|
|
181
|
-
await userService.deleteAll(['123', '456']);
|
|
182
|
-
```
|
|
246
|
+
type MyFlags = HttpFlags;
|
|
183
247
|
|
|
184
|
-
|
|
248
|
+
type MyContext = Context<MyFlags>;
|
|
185
249
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
import { Observer } from '@decaf-ts/core';
|
|
250
|
+
class MyHttpAdapter extends HttpAdapter<HttpConfig, MyClient, MyRequestConfig, MyFlags, MyContext> {
|
|
251
|
+
constructor(config: HttpConfig, alias?: string) { super(config, "my-client", alias); }
|
|
189
252
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
253
|
+
protected override getClient(): MyClient {
|
|
254
|
+
// create and return your HTTP client instance
|
|
255
|
+
return {
|
|
256
|
+
request: async <T>(c: any) => ({} as T),
|
|
257
|
+
get: async <T>(url: string) => ({} as T),
|
|
258
|
+
post: async <T>(url: string, body: any) => ({} as T),
|
|
259
|
+
put: async <T>(url: string, body: any) => ({} as T),
|
|
260
|
+
delete: async <T>(url: string) => ({} as T),
|
|
261
|
+
};
|
|
197
262
|
}
|
|
198
|
-
};
|
|
199
263
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
// When operations are performed, observers will be notified
|
|
204
|
-
await userService.create(new User({ name: 'John Doe' }));
|
|
205
|
-
|
|
206
|
-
// Unregister the observer when done
|
|
207
|
-
userService.unObserve(userObserver);
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Custom HTTP Adapter Implementation
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
import { HttpAdapter } from '@decaf-ts/for-http';
|
|
214
|
-
import { HttpConfig, HttpFlags } from '@decaf-ts/for-http';
|
|
215
|
-
import { Context } from '@decaf-ts/db-decorators';
|
|
216
|
-
import SomeHttpClient from 'some-http-client';
|
|
217
|
-
|
|
218
|
-
// Create a custom HTTP adapter for a different HTTP client
|
|
219
|
-
class CustomHttpAdapter extends HttpAdapter<
|
|
220
|
-
SomeHttpClient,
|
|
221
|
-
any,
|
|
222
|
-
HttpFlags,
|
|
223
|
-
Context<HttpFlags>
|
|
224
|
-
> {
|
|
225
|
-
constructor(native: SomeHttpClient, config: HttpConfig, alias?: string) {
|
|
226
|
-
super(native, config, 'custom', alias);
|
|
264
|
+
override async request<V>(details: MyRequestConfig): Promise<V> {
|
|
265
|
+
// bridge to your client’s request API
|
|
266
|
+
return this.client.request<V>(details);
|
|
227
267
|
}
|
|
228
268
|
|
|
229
|
-
async
|
|
230
|
-
|
|
269
|
+
async create(table: string, id: string|number, model: Record<string, any>): Promise<Record<string, any>> {
|
|
270
|
+
const url = this.url(table);
|
|
271
|
+
return this.client.post(url, model);
|
|
231
272
|
}
|
|
232
273
|
|
|
233
|
-
async
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
return this.native.post(url, model);
|
|
237
|
-
} catch (e: any) {
|
|
238
|
-
throw this.parseError(e);
|
|
239
|
-
}
|
|
274
|
+
async read(table: string, id: string|number|bigint): Promise<Record<string, any>> {
|
|
275
|
+
const url = this.url(table, { id: id as string|number });
|
|
276
|
+
return this.client.get(url);
|
|
240
277
|
}
|
|
241
278
|
|
|
242
|
-
async
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return this.native.get(url);
|
|
246
|
-
} catch (e: any) {
|
|
247
|
-
throw this.parseError(e);
|
|
248
|
-
}
|
|
279
|
+
async update(table: string, id: string|number, model: Record<string, any>): Promise<Record<string, any>> {
|
|
280
|
+
const url = this.url(table);
|
|
281
|
+
return this.client.put(url, model);
|
|
249
282
|
}
|
|
250
283
|
|
|
251
|
-
async
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return this.native.put(url, model);
|
|
255
|
-
} catch (e: any) {
|
|
256
|
-
throw this.parseError(e);
|
|
257
|
-
}
|
|
284
|
+
async delete(table: string, id: string|number|bigint): Promise<Record<string, any>> {
|
|
285
|
+
const url = this.url(table, { id: id as string|number });
|
|
286
|
+
return this.client.delete(url);
|
|
258
287
|
}
|
|
259
288
|
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
const url = this.url(tableName, { id: id as string | number });
|
|
263
|
-
return this.native.delete(url);
|
|
264
|
-
} catch (e: any) {
|
|
265
|
-
throw this.parseError(e);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
289
|
+
// Optionally override parseError(err) to normalize client-specific errors
|
|
268
290
|
}
|
|
269
291
|
```
|
|
270
292
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
```typescript
|
|
274
|
-
import { HttpFlags } from '@decaf-ts/for-http';
|
|
275
|
-
|
|
276
|
-
// Create custom HTTP flags with headers
|
|
277
|
-
const flags: HttpFlags = {
|
|
278
|
-
headers: {
|
|
279
|
-
'Authorization': 'Bearer token123',
|
|
280
|
-
'Content-Type': 'application/json'
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
// Use flags with repository operations
|
|
285
|
-
const user = await userRepository.findById('123', { flags });
|
|
293
|
+
## Constants and Types (axios)
|
|
286
294
|
|
|
287
|
-
|
|
288
|
-
const createdUser = await userService.create(newUser, { flags });
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Complete Application Example
|
|
292
|
-
|
|
293
|
-
```typescript
|
|
294
|
-
import axios from 'axios';
|
|
295
|
-
import {
|
|
296
|
-
AxiosHttpAdapter,
|
|
297
|
-
RestRepository,
|
|
298
|
-
RestService,
|
|
299
|
-
HttpConfig
|
|
300
|
-
} from '@decaf-ts/for-http';
|
|
301
|
-
import { Model } from '@decaf-ts/decorator-validation';
|
|
302
|
-
|
|
303
|
-
// Define a model
|
|
304
|
-
class Product extends Model {
|
|
305
|
-
id: string;
|
|
306
|
-
name: string;
|
|
307
|
-
price: number;
|
|
308
|
-
|
|
309
|
-
constructor(data?: Partial<Product>) {
|
|
310
|
-
super();
|
|
311
|
-
Object.assign(this, data);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
295
|
+
Description: Utilities specific to the Axios implementation.
|
|
314
296
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
protocol: 'https',
|
|
318
|
-
host: 'api.mystore.com'
|
|
319
|
-
};
|
|
297
|
+
```ts
|
|
298
|
+
import { AxiosFlavour, AxiosFlags } from "@decaf-ts/for-http/axios";
|
|
320
299
|
|
|
321
|
-
//
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
// Create a repository
|
|
325
|
-
const productRepo = new RestRepository(adapter, Product);
|
|
326
|
-
|
|
327
|
-
// Create a service
|
|
328
|
-
const productService = new RestService(adapter, Product);
|
|
329
|
-
|
|
330
|
-
// Example application
|
|
331
|
-
async function manageProducts() {
|
|
332
|
-
try {
|
|
333
|
-
// Create a new product
|
|
334
|
-
const newProduct = new Product({
|
|
335
|
-
name: 'Smartphone',
|
|
336
|
-
price: 699.99
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
const createdProduct = await productRepo.create(newProduct);
|
|
340
|
-
console.log('Created product:', createdProduct);
|
|
341
|
-
|
|
342
|
-
// Get all products
|
|
343
|
-
const products = await productRepo.findAll();
|
|
344
|
-
console.log('All products:', products);
|
|
345
|
-
|
|
346
|
-
// Update a product
|
|
347
|
-
createdProduct.price = 649.99;
|
|
348
|
-
const updatedProduct = await productService.update(createdProduct);
|
|
349
|
-
console.log('Updated product:', updatedProduct);
|
|
350
|
-
|
|
351
|
-
// Delete a product
|
|
352
|
-
await productService.delete(createdProduct.id);
|
|
353
|
-
console.log('Product deleted');
|
|
354
|
-
|
|
355
|
-
// Bulk operations
|
|
356
|
-
const bulkProducts = [
|
|
357
|
-
new Product({ name: 'Laptop', price: 1299.99 }),
|
|
358
|
-
new Product({ name: 'Tablet', price: 499.99 })
|
|
359
|
-
];
|
|
360
|
-
|
|
361
|
-
const createdProducts = await productService.createAll(bulkProducts);
|
|
362
|
-
console.log('Created multiple products:', createdProducts);
|
|
363
|
-
} catch (error) {
|
|
364
|
-
console.error('Error managing products:', error);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
300
|
+
// AxiosFlavour is the adapter flavour identifier string: "axios"
|
|
301
|
+
console.log(AxiosFlavour);
|
|
367
302
|
|
|
368
|
-
|
|
303
|
+
// AxiosFlags is a type alias of HttpFlags; useful for contexts with Axios
|
|
304
|
+
const f: AxiosFlags = { headers: { "X-Trace": "1" } };
|
|
369
305
|
```
|
|
370
306
|
|
|
371
307
|
|
package/dist/for-http.cjs
CHANGED
package/dist/for-http.esm.cjs
CHANGED
|
@@ -470,7 +470,7 @@ class RestRepository extends Repository {
|
|
|
470
470
|
* @summary Version identifier for the module
|
|
471
471
|
* @const VERSION
|
|
472
472
|
*/
|
|
473
|
-
const VERSION = "0.2.
|
|
473
|
+
const VERSION = "0.2.6";
|
|
474
474
|
|
|
475
475
|
export { HttpAdapter, RestRepository, RestService, VERSION };
|
|
476
476
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWh0dHAuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL1Jlc3RTZXJ2aWNlLnRzIiwiLi4vc3JjL2FkYXB0ZXIudHMiLCIuLi9zcmMvUmVzdFJlcG9zaXRvcnkudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRvcixcbiAgQ29udGV4dCxcbiAgQ3J1ZE9wZXJhdG9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSHR0cEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXJ2aWNlIGNsYXNzIGZvciBSRVNUIEFQSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW1wbGVtZW50YXRpb24gZm9yIGludGVyYWN0aW5nIHdpdGggUkVTVCBBUElzLlxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIENSVUQgb3BlcmF0aW9ucyBmb3Igc2luZ2xlIGFuZCBidWxrIG9wZXJhdGlvbnMsIGFzIHdlbGwgYXNcbiAqIHRoZSBPYnNlcnZhYmxlIHBhdHRlcm4gdG8gbm90aWZ5IG9ic2VydmVycyBvZiBjaGFuZ2VzLiBJdCB3b3JrcyB3aXRoIEhUVFAgYWRhcHRlcnNcbiAqIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBBUEkgcmVxdWVzdHMgYW5kIGhhbmRsZXMgbW9kZWwgY29udmVyc2lvbi5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUsIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgQSAtIFRoZSBIVFRQIGFkYXB0ZXIgdHlwZSwgZXh0ZW5kaW5nIEh0dHBBZGFwdGVyXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSBIVFRQIGZsYWdzIHR5cGUsIGV4dGVuZGluZyBIdHRwRmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7QX0gYWRhcHRlciAtIFRoZSBIVFRQIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gKiBAY2xhc3MgUmVzdFNlcnZpY2VcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBzZXJ2aWNlIGZvciBVc2VyIG1vZGVsIHdpdGggQXhpb3MgYWRhcHRlclxuICogY29uc3QgYXhpb3NBZGFwdGVyID0gbmV3IEF4aW9zQWRhcHRlcih7XG4gKiAgIHByb3RvY29sOiAnaHR0cHMnLFxuICogICBob3N0OiAnYXBpLmV4YW1wbGUuY29tJ1xuICogfSk7XG4gKiBjb25zdCB1c2VyU2VydmljZSA9IG5ldyBSZXN0U2VydmljZShheGlvc0FkYXB0ZXIsIFVzZXIpO1xuICpcbiAqIC8vIENyZWF0ZSBhIG5ldyB1c2VyXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyBuYW1lOiAnSm9obiBEb2UnLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogY29uc3QgY3JlYXRlZFVzZXIgPSBhd2FpdCB1c2VyU2VydmljZS5jcmVhdGUodXNlcik7XG4gKlxuICogLy8gVXBkYXRlIGEgdXNlclxuICogY3JlYXRlZFVzZXIubmFtZSA9ICdKYW5lIERvZSc7XG4gKiBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVzZXJTZXJ2aWNlLnVwZGF0ZShjcmVhdGVkVXNlcik7XG4gKlxuICogLy8gRGVsZXRlIGEgdXNlclxuICogYXdhaXQgdXNlclNlcnZpY2UuZGVsZXRlKHVwZGF0ZWRVc2VyLmlkKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgU2VydmljZSBhcyBSZXN0U2VydmljZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIEh0dHBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IEFQSVxuICogICBDbGllbnQtPj5TZXJ2aWNlOiBjcmVhdGUobW9kZWwpXG4gKiAgIFNlcnZpY2UtPj5BZGFwdGVyOiBwcmVwYXJlKG1vZGVsLCBwaylcbiAqICAgU2VydmljZS0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZSwgaWQsIHJlY29yZClcbiAqICAgQWRhcHRlci0+PkFQSTogSFRUUCBQT1NUXG4gKiAgIEFQSS0tPj5BZGFwdGVyOiAyMDEgQ3JlYXRlZFxuICogICBBZGFwdGVyLS0+PlNlcnZpY2U6IHJlY29yZFxuICogICBTZXJ2aWNlLS0+PkNsaWVudDogcmV2ZXJ0KHJlY29yZClcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3RTZXJ2aWNlPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBRLFxuICAgIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4sXG4gICAgRiBleHRlbmRzIEh0dHBGbGFncyA9IEh0dHBGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID5cbiAgaW1wbGVtZW50cyBDcnVkT3BlcmF0b3I8TT4sIEJ1bGtDcnVkT3BlcmF0b3I8TT4sIE9ic2VydmFibGVcbntcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhc3MhOiBDb25zdHJ1Y3RvcjxNPjtcbiAgcHJpdmF0ZSBfcGshOiBrZXlvZiBNO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbW9kZWwgY2xhc3MgY29uc3RydWN0b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBtb2RlbCBjbGFzcyBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gY2xhc3MgZGVmaW5pdGlvbiBpcyBmb3VuZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT59IFRoZSBtb2RlbCBjbGFzcyBjb25zdHJ1Y3RvclxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBjbGFzcyBkZWZpbml0aW9uIGlzIGZvdW5kXG4gICAqL1xuICBnZXQgY2xhc3MoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGFzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY2xhc3MgZGVmaW5pdGlvbiBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5XCIpO1xuICAgIHJldHVybiB0aGlzLl9jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IHByb3BlcnR5IGZvciB0aGUgbW9kZWwuXG4gICAqIElmIG5vdCBhbHJlYWR5IGRldGVybWluZWQsIGl0IGZpbmRzIHRoZSBwcmltYXJ5IGtleSB1c2luZyB0aGUgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm4gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICovXG4gIGdldCBwaygpIHtcbiAgICBpZiAoIXRoaXMuX3BrKSB0aGlzLl9wayA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLmNsYXNzKCkpLmlkO1xuICAgIHJldHVybiB0aGlzLl9waztcbiAgfVxuXG4gIHByb3RlY3RlZCBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQTtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgSFRUUCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgSFRUUCBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBhZGFwdGVyIGlzIGZvdW5kLlxuICAgKiBAcmV0dXJuIHtBfSBUaGUgSFRUUCBhZGFwdGVyIGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGFkYXB0ZXIgaXMgZm91bmRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYWRhcHRlcigpOiBBIHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/XCJcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbCBjbGFzcy5cbiAgICogSWYgbm90IGFscmVhZHkgZGV0ZXJtaW5lZCwgaXQgZ2V0cyB0aGUgdGFibGUgbmFtZSBmcm9tIHRoZSBSZXBvc2l0b3J5IHV0aWxpdHkuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IFJlc3RTZXJ2aWNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgc2VydmljZSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBhbmQgb3B0aW9uYWwgbW9kZWwgY2xhc3MuXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBzdG9yZXMgdGhlIGFkYXB0ZXIgYW5kIG1vZGVsIGNsYXNzIGZvciBsYXRlciB1c2UgaW4gQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0ge0F9IGFkYXB0ZXIgLSBUaGUgSFRUUCBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgQVBJIHJlcXVlc3RzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB0aGlzLl9jbGFzcyA9IGNsYXp6O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlc291cmNlXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgcmVzb3VyY2UgaW4gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBtb2RlbC5cbiAgICogVGhlIG1ldGhvZCBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHRoZSBhZGFwdGVyLCBzZW5kcyB0aGUgY3JlYXRlIHJlcXVlc3QsXG4gICAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXNwb25zZSBiYWNrIHRvIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXNvdXJjZSBieSBJRFxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIElELlxuICAgKiBUaGUgbWV0aG9kIHNlbmRzIHRoZSByZWFkIHJlcXVlc3QgYW5kIGNvbnZlcnRzIHRoZSByZXNwb25zZSB0byBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgcmVhZChpZDogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZCh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyByZXNvdXJjZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlc291cmNlIGluIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgbW9kZWwuXG4gICAqIFRoZSBtZXRob2QgcHJlcGFyZXMgdGhlIG1vZGVsIGZvciB0aGUgYWRhcHRlciwgc2VuZHMgdGhlIHVwZGF0ZSByZXF1ZXN0LFxuICAgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgcmVzcG9uc2UgYmFjayB0byBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHdpdGggdXBkYXRlZCBkYXRhXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVzb3VyY2UgYnkgSURcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHJlc291cmNlIGZyb20gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBJRC5cbiAgICogVGhlIG1ldGhvZCBzZW5kcyB0aGUgZGVsZXRlIHJlcXVlc3QgYW5kIGNvbnZlcnRzIHRoZSByZXNwb25zZSB0byBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZXNvdXJjZXNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBtdWx0aXBsZSByZXNvdXJjZXMgaW4gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBtb2RlbHMuXG4gICAqIFRoZSBtZXRob2QgcHJlcGFyZXMgZWFjaCBtb2RlbCBmb3IgdGhlIGFkYXB0ZXIsIHNlbmRzIGEgYnVsayBjcmVhdGUgcmVxdWVzdCxcbiAgICogYW5kIHRoZW4gY29udmVydHMgdGhlIHJlc3BvbnNlcyBiYWNrIHRvIG1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbCBpbnN0YW5jZXMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBjcmVhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBTZXJ2aWNlIGFzIFJlc3RTZXJ2aWNlXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBIdHRwQWRhcHRlclxuICAgKiAgIENsaWVudC0+PlNlcnZpY2U6IGNyZWF0ZUFsbChtb2RlbHMpXG4gICAqICAgU2VydmljZS0+PkFkYXB0ZXI6IHByZXBhcmUobW9kZWwsIHBrKSB4IE5cbiAgICogICBTZXJ2aWNlLT4+QWRhcHRlcjogY3JlYXRlQWxsKHRhYmxlLCBpZHNbXSwgcmVjb3Jkc1tdKVxuICAgKiAgIEFkYXB0ZXItLT4+U2VydmljZTogcmVjb3Jkc1tdXG4gICAqICAgU2VydmljZS0tPj5DbGllbnQ6IHJldmVydChyZWNvcmRzW10pXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZXNvdXJjZXMgYnkgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGZyb20gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBJRHMuXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgYSBidWxrIGRlbGV0ZSByZXF1ZXN0IGFuZCBjb252ZXJ0cyB0aGUgcmVzcG9uc2VzIHRvIG1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVzb3VyY2VzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGJ5IElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIHJlc291cmNlcyBmcm9tIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgSURzLlxuICAgKiBUaGUgbWV0aG9kIHNlbmRzIGEgYnVsayByZWFkIHJlcXVlc3QgYW5kIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgdG8gbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZXNvdXJjZXMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGluIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgbW9kZWxzLlxuICAgKiBUaGUgbWV0aG9kIHByZXBhcmVzIGVhY2ggbW9kZWwgZm9yIHRoZSBhZGFwdGVyLCBzZW5kcyBhIGJ1bGsgdXBkYXRlIHJlcXVlc3QsXG4gICAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgYmFjayB0byBtb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWwgaW5zdGFuY2VzIHdpdGggdXBkYXRlZCBkYXRhXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB1cGRhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byB0aGUgbGlzdCBvZiBvYnNlcnZlcnMgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgb2JzZXJ2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgbGlzdCBvZiBvYnNlcnZlcnMuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgb2JzZXJ2ZXIgaXMgbm90IGZvdW5kLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBpcyBub3QgZm91bmRcbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSByZWZyZXNoIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgdG8gdXBkYXRlIHRoZW1zZWx2ZXMuXG4gICAqIEFueSBlcnJvcnMgZHVyaW5nIG9ic2VydmVyIHJlZnJlc2ggYXJlIGxvZ2dlZCBhcyB3YXJuaW5ncyBidXQgZG9uJ3Qgc3RvcCB0aGUgcHJvY2Vzcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyIHJlZnJlc2ggbWV0aG9kXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gdXBkYXRlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5yZWZyZXNoKC4uLmFyZ3MpKVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV19OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb25kaXRpb24sXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBDb250ZXh0LCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwQ29uZmlnLCBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEhUVFAgYWRhcHRlciBmb3IgUkVTVCBBUEkgaW50ZXJhY3Rpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIEhUVFAgYWRhcHRlcnMgd2l0aCBtZXRob2RzIGZvciBDUlVEIG9wZXJhdGlvbnMsXG4gKiBVUkwgY29uc3RydWN0aW9uLCBhbmQgZXJyb3IgaGFuZGxpbmcuIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgY29yZSBBZGFwdGVyIGNsYXNzIGFuZFxuICogaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMgZm9yIEhUVFAgY29tbXVuaWNhdGlvbi4gQ29uY3JldGUgaW1wbGVtZW50YXRpb25zXG4gKiBtdXN0IHByb3ZpZGUgc3BlY2lmaWMgSFRUUCBjbGllbnQgZnVuY3Rpb25hbGl0eS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBIVFRQIGNsaWVudCB0eXBlXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIEhUVFAgZmxhZ3MgdHlwZSwgZXh0ZW5kaW5nIEh0dHBGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtZfSBuYXRpdmUgLSBUaGUgbmF0aXZlIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge0h0dHBDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBIVFRQIGFkYXB0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGFkYXB0ZXIgZmxhdm9yIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyXG4gKiBAY2xhc3MgSHR0cEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFeGFtcGxlIGltcGxlbWVudGF0aW9uIHdpdGggQXhpb3NcbiAqIGNsYXNzIEF4aW9zQWRhcHRlciBleHRlbmRzIEh0dHBBZGFwdGVyPEF4aW9zSW5zdGFuY2UsIEF4aW9zUmVxdWVzdENvbmZpZz4ge1xuICogICBjb25zdHJ1Y3Rvcihjb25maWc6IEh0dHBDb25maWcpIHtcbiAqICAgICBzdXBlcihheGlvcy5jcmVhdGUoKSwgY29uZmlnLCAnYXhpb3MnKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmVxdWVzdDxWPihkZXRhaWxzOiBBeGlvc1JlcXVlc3RDb25maWcpOiBQcm9taXNlPFY+IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLnJlcXVlc3QoZGV0YWlscyk7XG4gKiAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIEltcGxlbWVudCBvdGhlciBhYnN0cmFjdCBtZXRob2RzLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEh0dHBBZGFwdGVyPFxuICBZIGV4dGVuZHMgSHR0cENvbmZpZyxcbiAgQ09OLFxuICBRLFxuICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgQWRhcHRlcjxZLCBDT04sIFEsIEYsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNvbmZpZzogWSwgZmxhdm91cjogc3RyaW5nLCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKGNvbmZpZywgZmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgb3BlcmF0aW9uIGZsYWdzIHdpdGggSFRUUCBoZWFkZXJzXG4gICAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgZmxhZ3MgbWV0aG9kIHRvIGluY2x1ZGUgSFRUUC1zcGVjaWZpYyBoZWFkZXJzIGZvciBvcGVyYXRpb25zLlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGFuIGVtcHR5IGhlYWRlcnMgb2JqZWN0IHRvIHRoZSBmbGFncyByZXR1cm5lZCBieSB0aGUgcGFyZW50IGNsYXNzLlxuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IEZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMuQ1JFQVRFfE9wZXJhdGlvbktleXMuUkVBRHxPcGVyYXRpb25LZXlzLlVQREFURXxPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gb3ZlcnJpZGVzIC0gT3B0aW9uYWwgZmxhZyBvdmVycmlkZXNcbiAgICogQHJldHVybiB7Rn0gVGhlIGZsYWdzIG9iamVjdCB3aXRoIGhlYWRlcnNcbiAgICovXG4gIG92ZXJyaWRlIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPlxuICApIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFnczxNPihvcGVyYXRpb24sIG1vZGVsLCBvdmVycmlkZXMpLCB7XG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBSZXN0U2VydmljZSBjbGFzcyBhcyB0aGUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBIVFRQIGFkYXB0ZXIuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIHJlcG9zaXRvcnkgaW5zdGFuY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgYWRhcHRlciB0eXBlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgUSwgSHR0cEFkYXB0ZXI8WSwgUSwgRiwgQz4sIEYsIEM+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PE0sIFEsIEh0dHBBZGFwdGVyPFksIENPTiwgUSwgRiwgQz4sIEYsIEM+XG4gID4ge1xuICAgIHJldHVybiBSZXN0U2VydmljZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFxuICAgICAgUmVwb3NpdG9yeTxNLCBRLCBIdHRwQWRhcHRlcjxZLCBDT04sIFEsIEYsIEM+LCBGLCBDPlxuICAgID47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdHMgYSBVUkwgZm9yIEFQSSByZXF1ZXN0c1xuICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb21wbGV0ZSBVUkwgZm9yIEFQSSByZXF1ZXN0cyB1c2luZyB0aGUgY29uZmlndXJlZCBwcm90b2NvbCBhbmQgaG9zdCxcbiAgICogdGhlIHNwZWNpZmllZCB0YWJsZSBuYW1lLCBhbmQgb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycy4gVGhlIG1ldGhvZCBoYW5kbGVzIFVSTCBlbmNvZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBlbmRwb2ludFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj59IFtxdWVyeVBhcmFtc10gLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGVuY29kZWQgVVJMIHN0cmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIHVybChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj5cbiAgKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChcbiAgICAgIGAke3RoaXMuY29uZmlnLnByb3RvY29sfTovLyR7dGhpcy5jb25maWcuaG9zdH0vJHt0YWJsZU5hbWV9YFxuICAgICk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1zKVxuICAgICAgT2JqZWN0LmVudHJpZXMocXVlcnlQYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgICAgKTtcblxuICAgIC8vIGVuc3VyZSBzcGFjZXMgYXJlIGVuY29kZWQgYXMgJTIwIChub3QgJysnKSB0byBtYXRjaCBleHBlY3RhdGlvbnNcbiAgICByZXR1cm4gZW5jb2RlVVJJKHVybC50b1N0cmluZygpKS5yZXBsYWNlKC9cXCsvZywgXCIlMjBcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgY29udmVydHMgZXJyb3JzIHRvIEJhc2VFcnJvciB0eXBlXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgSFRUUCBvcGVyYXRpb25zIGFuZCBjb252ZXJ0cyB0aGVtIHRvXG4gICAqIHRoZSBhcHByb3ByaWF0ZSBCYXNlRXJyb3IgdHlwZS4gQ3VycmVudGx5IHJldHVybnMgdGhlIGVycm9yIGFzLWlzLCBidXQgY2FuIGJlXG4gICAqIGV4dGVuZGVkIHRvIGhhbmRsZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyBkaWZmZXJlbnRseS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvciBhcyBhIEJhc2VFcnJvclxuICAgKi9cbiAgcGFyc2VFcnJvcihlcnI6IEVycm9yKTogQmFzZUVycm9yIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IGVycjtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBlcnIgYXMgQmFzZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2VuZHMgYW4gSFRUUCByZXF1ZXN0XG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzZW5kIEhUVFAgcmVxdWVzdHNcbiAgICogdXNpbmcgdGhlIG5hdGl2ZSBIVFRQIGNsaWVudC4gVGhpcyBpcyB0aGUgY29yZSBtZXRob2QgZm9yIG1ha2luZyBBUEkgY2FsbHMuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlc3BvbnNlIHZhbHVlIHR5cGVcbiAgICogQHBhcmFtIHtRfSBkZXRhaWxzIC0gVGhlIHJlcXVlc3QgZGV0YWlscyBzcGVjaWZpYyB0byB0aGUgSFRUUCBjbGllbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxWPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGF0YVxuICAgKi9cbiAgYWJzdHJhY3QgcmVxdWVzdDxWPihkZXRhaWxzOiBRKTogUHJvbWlzZTxWPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZVxuICAgKiB2aWEgSFRUUC4gVGhpcyB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gYSBQT1NUIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgZW5kcG9pbnRcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBkYXRhIG1vZGVsIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3JlYXRlZCByZXNvdXJjZVxuICAgKi9cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlc291cmNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byByZXRyaWV2ZSBhIHJlc291cmNlXG4gICAqIHZpYSBIVFRQLiBUaGlzIHR5cGljYWxseSBjb3JyZXNwb25kcyB0byBhIEdFVCByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9yIGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmV0cmlldmVkIHJlc291cmNlXG4gICAqL1xuICBhYnN0cmFjdCBvdmVycmlkZSByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHVwZGF0ZSBhIHJlc291cmNlXG4gICAqIHZpYSBIVFRQLiBUaGlzIHR5cGljYWxseSBjb3JyZXNwb25kcyB0byBhIFBVVCBvciBQQVRDSCByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9yIGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgdXBkYXRlZCBkYXRhIG1vZGVsXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1cGRhdGVkIHJlc291cmNlXG4gICAqL1xuICBhYnN0cmFjdCBvdmVycmlkZSB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlc291cmNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWxldGUgYSByZXNvdXJjZVxuICAgKiB2aWEgSFRUUC4gVGhpcyB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gYSBERUxFVEUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBlbmRwb2ludFxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2UgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWxldGlvbiByZXN1bHRcbiAgICovXG4gIGFic3RyYWN0IG92ZXJyaWRlIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeVxuICAgKiBAc3VtbWFyeSBNZXRob2QgZm9yIGV4ZWN1dGluZyByYXcgcXVlcmllcyBkaXJlY3RseSB3aXRoIHRoZSBIVFRQIGNsaWVudC5cbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIEhUVFAgYWRhcHRlcnMgYW5kIHRocm93cyBhbiBVbnN1cHBvcnRlZEVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge1F9IHJhd0lucHV0IC0gVGhlIHJhdyBxdWVyeSBpbnB1dFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByb2Nlc3MgLSBXaGV0aGVyIHRvIHByb2Nlc3MgdGhlIHJlc3VsdFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcXVlcnkgcmVzdWx0XG4gICAqIEB0aHJvd3Mge1Vuc3VwcG9ydGVkRXJyb3J9IEFsd2F5cyB0aHJvd3MgYXMgdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJhdzxSPihyYXdJbnB1dDogUSwgcHJvY2VzczogYm9vbGVhbiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IE1ldGhvZCBmb3IgY3JlYXRpbmcgYSBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgaWRlbnRpZmllcnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiBIVFRQIGFkYXB0ZXJzIGFuZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRFcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNyZWF0ZWQgc2VxdWVuY2VcbiAgICogQHRocm93cyB7VW5zdXBwb3J0ZWRFcnJvcn0gQWx3YXlzIHRocm93cyBhcyB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc3RhdGVtZW50IGZvciBxdWVyeWluZ1xuICAgKiBAc3VtbWFyeSBNZXRob2QgZm9yIGNyZWF0aW5nIGEgc3RhdGVtZW50IGZvciBidWlsZGluZyBhbmQgZXhlY3V0aW5nIHF1ZXJpZXMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiBIVFRQIGFkYXB0ZXJzIGFuZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRFcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAdGVtcGxhdGUgISAtIFRoZSByYXcgcXVlcnkgdHlwZVxuICAgKiBAcmV0dXJuIHtTdGF0ZW1lbnQ8USwgTSwgYW55Pn0gQSBzdGF0ZW1lbnQgb2JqZWN0IGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0aHJvd3Mge1Vuc3VwcG9ydGVkRXJyb3J9IEFsd2F5cyB0aHJvd3MgYXMgdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0XG4gICAqL1xuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8USwgTSwgYW55PiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IE1ldGhvZCBmb3IgcGFyc2luZyBhIGNvbmRpdGlvbiBvYmplY3QgaW50byBhIHF1ZXJ5IGZvcm1hdCB1bmRlcnN0b29kIGJ5IHRoZSBIVFRQIGNsaWVudC5cbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIEhUVFAgYWRhcHRlcnMgYW5kIHRocm93cyBhbiBVbnN1cHBvcnRlZEVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxhbnk+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1F9IFRoZSBwYXJzZWQgcXVlcnlcbiAgICogQHRocm93cyB7VW5zdXBwb3J0ZWRFcnJvcn0gQWx3YXlzIHRocm93cyBhcyB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248YW55Pik6IFEge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSHR0cEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGZvciBSRVNUIEFQSSBpbnRlcmFjdGlvbnNcbiAqIEBzdW1tYXJ5IEEgc3BlY2lhbGl6ZWQgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBSRVNUIEFQSXMuXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGNvcmUgUmVwb3NpdG9yeSBjbGFzcyBhbmQgd29ya3Mgd2l0aCBIVFRQIGFkYXB0ZXJzIHRvXG4gKiBwcm92aWRlIENSVUQgb3BlcmF0aW9ucyBmb3IgbW9kZWxzIHZpYSBSRVNUIGVuZHBvaW50cy5cbiAqIFRoaXMgSXMgTk9UIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgZm9yIHRoZSBIVFRQIGFkYXB0ZXIuIFRoYXQgd291bGQgYmUge0BsaW5rIFJlc3RTZXJ2aWNlfS5cbiAqIFVzZSB0aGlzIG9ubHkgaW4gdGhlIHNwZWNpZmljIGNhc2Ugb2YgbmVlZGluZyB0byBydW4gdGhlIENVUkQgbW9kZWwgbG9naWMgKGRlY29yYXRpb24pIGJlZm9yZSBzdWJtaXR0aW5nIHRvIHRoZSBiYWNrZW5kXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlLCBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlclxuICogQHRlbXBsYXRlIEEgLSBUaGUgSFRUUCBhZGFwdGVyIHR5cGUsIGV4dGVuZGluZyBIdHRwQWRhcHRlclxuICogQHRlbXBsYXRlIEYgLSBUaGUgSFRUUCBmbGFncyB0eXBlLCBleHRlbmRpbmcgSHR0cEZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUsIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0F9IGFkYXB0ZXIgLSBUaGUgSFRUUCBhZGFwdGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICogQGNsYXNzIFJlc3RSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgVXNlciBtb2RlbCB3aXRoIEF4aW9zIGFkYXB0ZXJcbiAqIGNvbnN0IGF4aW9zQWRhcHRlciA9IG5ldyBBeGlvc0FkYXB0ZXIoe1xuICogICBwcm90b2NvbDogJ2h0dHBzJyxcbiAqICAgaG9zdDogJ2FwaS5leGFtcGxlLmNvbSdcbiAqIH0pO1xuICogY29uc3QgdXNlclJlcG9zaXRvcnkgPSBuZXcgUmVzdFJlcG9zaXRvcnkoYXhpb3NBZGFwdGVyLCBVc2VyKTtcbiAqXG4gKiAvLyBVc2UgdGhlIHJlcG9zaXRvcnkgZm9yIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IHVzZXJSZXBvc2l0b3J5LmZpbmRCeUlkKCcxMjMnKTtcbiAqIGBgYFxuICogQHNlZSB7QGxpbmsgUmVzdFNlcnZpY2V9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRLFxuICBBIGV4dGVuZHMgSHR0cEFkYXB0ZXI8YW55LCBhbnksIFEsIEYsIEM+LFxuICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBRLCBBPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEhUVFAgY2xpZW50IG1vZHVsZSBmb3IgUkVTVCBBUEkgaW50ZXJhY3Rpb25zXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUkVTVCBBUElzLlxuICogSXQgZXhwb3NlcyByZXBvc2l0b3J5IGFuZCBzZXJ2aWNlIGNsYXNzZXMgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzLCBhbG9uZyB3aXRoXG4gKiB0eXBlIGRlZmluaXRpb25zIGFuZCBhZGFwdGVycyBmb3IgZGlmZmVyZW50IEhUVFAgY2xpZW50cy4gVGhlIG1vZHVsZSBpbmNsdWRlc1xuICoge0BsaW5rIFJlc3RSZXBvc2l0b3J5fSBhbmQge0BsaW5rIFJlc3RTZXJ2aWNlfSBmb3IgQVBJIGludGVyYWN0aW9ucy5cbiAqIEBtb2R1bGUgZm9yLWh0dHBcbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmVzdFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RTZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGZvci1odHRwIG1vZHVsZVxuICogQHN1bW1hcnkgVmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGUgbW9kdWxlXG4gKiBAY29uc3QgVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQ0c7TUFDVSxXQUFXLENBQUE7QUFZdEI7Ozs7OztBQU1HO0FBQ0gsSUFBQSxJQUFJLEtBQUssR0FBQTtRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUNkLFlBQUEsTUFBTSxJQUFJLGFBQWEsQ0FBQywrQ0FBK0MsQ0FBQztRQUMxRSxPQUFPLElBQUksQ0FBQyxNQUFNOztBQUdwQjs7Ozs7QUFLRztBQUNILElBQUEsSUFBSSxFQUFFLEdBQUE7UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7QUFBRSxZQUFBLElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtRQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHOztBQVFqQjs7Ozs7O0FBTUc7QUFDSCxJQUFBLElBQWMsT0FBTyxHQUFBO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtBQUNoQixZQUFBLE1BQU0sSUFBSSxhQUFhLENBQ3JCLHNHQUFzRyxDQUN2RztRQUNILE9BQU8sSUFBSSxDQUFDLFFBQVE7O0FBR3RCOzs7OztBQUtHO0FBQ0gsSUFBQSxJQUFjLFNBQVMsR0FBQTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwRSxPQUFPLElBQUksQ0FBQyxVQUFVOztBQUd4Qjs7Ozs7O0FBTUc7SUFDSCxXQUFZLENBQUEsT0FBVSxFQUFFLEtBQXNCLEVBQUE7UUF0Q3BDLElBQVMsQ0FBQSxTQUFBLEdBQWUsRUFBRTtBQXVDbEMsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU87QUFDdkIsUUFBQSxJQUFJLEtBQUs7QUFBRSxZQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSzs7QUFHaEM7Ozs7Ozs7O0FBUUc7QUFDSCxJQUFBLE1BQU0sTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVcsRUFBQTs7QUFFbkMsUUFBQSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3pELFFBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZFLFFBQUEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7QUFHN0Q7Ozs7Ozs7QUFPRztBQUNILElBQUEsTUFBTSxJQUFJLENBQUMsRUFBbUIsRUFBRSxHQUFHLElBQVcsRUFBQTtBQUM1QyxRQUFBLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDOUQsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztBQUd4RDs7Ozs7Ozs7QUFRRztBQUNILElBQUEsTUFBTSxNQUFNLENBQUMsS0FBUSxFQUFFLEdBQUcsSUFBVyxFQUFBOztBQUVuQyxRQUFBLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDekQsUUFBQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkUsUUFBQSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztBQUc3RDs7Ozs7OztBQU9HO0FBQ0gsSUFBQSxNQUFNLE1BQU0sQ0FBQyxFQUFtQixFQUFFLEdBQUcsSUFBVyxFQUFBO0FBQzlDLFFBQUEsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJ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
|
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
|
@@ -15,5 +15,5 @@ export * from "./types.js";
|
|
|
15
15
|
* @summary Version identifier for the module
|
|
16
16
|
* @const VERSION
|
|
17
17
|
*/
|
|
18
|
-
export const VERSION = "0.2.
|
|
18
|
+
export const VERSION = "0.2.6";
|
|
19
19
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILDZCQUEwQjtBQUMxQixvQ0FBaUM7QUFDakMsaUNBQThCO0FBQzlCLDJCQUF3QjtBQUV4Qjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIEhUVFAgY2xpZW50IG1vZHVsZSBmb3IgUkVTVCBBUEkgaW50ZXJhY3Rpb25zXG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBjbGFzc2VzIGFuZCB1dGlsaXRpZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUkVTVCBBUElzLlxuICogSXQgZXhwb3NlcyByZXBvc2l0b3J5IGFuZCBzZXJ2aWNlIGNsYXNzZXMgZm9yIG1ha2luZyBIVFRQIHJlcXVlc3RzLCBhbG9uZyB3aXRoXG4gKiB0eXBlIGRlZmluaXRpb25zIGFuZCBhZGFwdGVycyBmb3IgZGlmZmVyZW50IEhUVFAgY2xpZW50cy4gVGhlIG1vZHVsZSBpbmNsdWRlc1xuICoge0BsaW5rIFJlc3RSZXBvc2l0b3J5fSBhbmQge0BsaW5rIFJlc3RTZXJ2aWNlfSBmb3IgQVBJIGludGVyYWN0aW9ucy5cbiAqIEBtb2R1bGUgZm9yLWh0dHBcbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vYWRhcHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmVzdFJlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RTZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGZvci1odHRwIG1vZHVsZVxuICogQHN1bW1hcnkgVmVyc2lvbiBpZGVudGlmaWVyIGZvciB0aGUgbW9kdWxlXG4gKiBAY29uc3QgVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
|
package/lib/index.cjs
CHANGED
|
@@ -32,5 +32,5 @@ __exportStar(require("./types.cjs"), exports);
|
|
|
32
32
|
* @summary Version identifier for the module
|
|
33
33
|
* @const VERSION
|
|
34
34
|
*/
|
|
35
|
-
exports.VERSION = "0.2.
|
|
35
|
+
exports.VERSION = "0.2.6";
|
|
36
36
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7OztHQU9HO0FBQ0gsZ0RBQTBCO0FBQzFCLHVEQUFpQztBQUNqQyxvREFBOEI7QUFDOUIsOENBQXdCO0FBRXhCOzs7O0dBSUc7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBIVFRQIGNsaWVudCBtb2R1bGUgZm9yIFJFU1QgQVBJIGludGVyYWN0aW9uc1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgY2xhc3NlcyBhbmQgdXRpbGl0aWVzIGZvciBpbnRlcmFjdGluZyB3aXRoIFJFU1QgQVBJcy5cbiAqIEl0IGV4cG9zZXMgcmVwb3NpdG9yeSBhbmQgc2VydmljZSBjbGFzc2VzIGZvciBtYWtpbmcgSFRUUCByZXF1ZXN0cywgYWxvbmcgd2l0aFxuICogdHlwZSBkZWZpbml0aW9ucyBhbmQgYWRhcHRlcnMgZm9yIGRpZmZlcmVudCBIVFRQIGNsaWVudHMuIFRoZSBtb2R1bGUgaW5jbHVkZXNcbiAqIHtAbGluayBSZXN0UmVwb3NpdG9yeX0gYW5kIHtAbGluayBSZXN0U2VydmljZX0gZm9yIEFQSSBpbnRlcmFjdGlvbnMuXG4gKiBAbW9kdWxlIGZvci1odHRwXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmb3ItaHR0cCBtb2R1bGVcbiAqIEBzdW1tYXJ5IFZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhlIG1vZHVsZVxuICogQGNvbnN0IFZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXX0=
|
package/lib/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@decaf-ts/for-http",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "http wrappers for decaf-ts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -32,14 +32,21 @@
|
|
|
32
32
|
"coverage": "rimraf ./workdocs/reports/data/*.json && npm run test:all -- --coverage --config=./workdocs/reports/jest.coverage.config.ts",
|
|
33
33
|
"lint": "eslint .",
|
|
34
34
|
"lint-fix": "eslint --fix .",
|
|
35
|
-
"prepare-pr": "npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
|
|
35
|
+
"prepare-pr": "npm run repo:pr && npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
|
|
36
36
|
"prepare-release": "npm run lint-fix && npm run build:prod && npm run coverage && npm run docs",
|
|
37
37
|
"release": "./bin/tag-release.sh",
|
|
38
38
|
"clean-publish": "npx clean-publish",
|
|
39
39
|
"drawings": "for FILE in workdocs/drawings/*.drawio; do echo \"converting $FILE to image...\" && docker run --rm -v $(pwd):/data rlespinasse/drawio-export --format png $FILE; done && cp -rf workdocs/drawings/export/* workdocs/resources/",
|
|
40
40
|
"uml": "cd workdocs/uml && for FILE in ./*.puml; do docker run --rm -v $(pwd):/work -w /work miy4/plantuml -DPLANTUML_LIMIT_SIZE=8192 -tpng $FILE; done && cd ../.. && cp -fr workdocs/uml/*.png workdocs/resources/",
|
|
41
41
|
"docs": "npx rimraf ./docs && mkdir docs && npx build-scripts --docs",
|
|
42
|
-
"publish-docs": "docker run -it --rm --user $(id -u):$(id -g) -v \"$(pwd)/workdocs/confluence:/content\" -e ATLASSIAN_API_TOKEN=$(cat .confluence-token) ghcr.io/markdown-confluence/publish:latest"
|
|
42
|
+
"publish-docs": "docker run -it --rm --user $(id -u):$(id -g) -v \"$(pwd)/workdocs/confluence:/content\" -e ATLASSIAN_API_TOKEN=$(cat .confluence-token) ghcr.io/markdown-confluence/publish:latest",
|
|
43
|
+
"repo:init": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is `./`, initialize the repository\"",
|
|
44
|
+
"repo:setup": "codex exec \"$(cat ./.codex/prompts/repo-setup.md)\nbase_path is ./\"",
|
|
45
|
+
"repo:doc": "codex exec \"$(cat ./.codex/prompts/doc.md) $(cat ./.codex/prompts/bulk-docs.md)\nbase_path is ./\"",
|
|
46
|
+
"repo:tests": "codex exec \"$(cat ./.codex/prompts/bulk-tests.md)\nbase_path is ./ and coverage is 95%\" -s workspace-write",
|
|
47
|
+
"repo:readme": "codex exec \"$(cat ./.codex/prompts/update-readme.md)\nbase_path is ./\"",
|
|
48
|
+
"repo:pr": "npm run repo:doc && npm run repo:tests && npm run repo:readme",
|
|
49
|
+
"sync-codex": "./bin/sync-codex.sh"
|
|
43
50
|
},
|
|
44
51
|
"repository": {
|
|
45
52
|
"type": "git",
|
|
@@ -71,7 +78,7 @@
|
|
|
71
78
|
"typescript",
|
|
72
79
|
"ts"
|
|
73
80
|
],
|
|
74
|
-
"author": "Tiago Venceslau",
|
|
81
|
+
"author": "Tiago Venceslau and Contributors",
|
|
75
82
|
"license": "MIT",
|
|
76
83
|
"bugs": {
|
|
77
84
|
"url": "https://github.com/decaf-ts/for-http/issues"
|
|
@@ -91,6 +98,7 @@
|
|
|
91
98
|
"eslint": "^9.25.1",
|
|
92
99
|
"eslint-config-prettier": "^10.1.2",
|
|
93
100
|
"eslint-plugin-prettier": "^5.2.6",
|
|
101
|
+
"fastify": "^5.6.1",
|
|
94
102
|
"globals": "^16.0.0",
|
|
95
103
|
"jest": "^29.7.0",
|
|
96
104
|
"jest-html-reporters": "^3.1.7",
|