@ethlete/query 5.7.0 → 5.8.1
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/CHANGELOG.md +52 -0
- package/esm2022/index.mjs +4 -2
- package/esm2022/lib/devtools/components/query-devtools/index.mjs +2 -0
- package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +3 -3
- package/esm2022/lib/devtools/pipes/index.mjs +2 -2
- package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +3 -3
- package/esm2022/lib/devtools/utils/index.mjs +2 -2
- package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +3 -3
- package/esm2022/lib/directives/infinity-query.directive.mjs +3 -3
- package/esm2022/lib/directives/query.directive.mjs +3 -3
- package/esm2022/lib/query/query.mjs +83 -16
- package/esm2022/lib/query/query.types.mjs +1 -1
- package/esm2022/lib/query-creator/query-creator.mjs +1 -1
- package/esm2022/lib/query-creator/query-creator.types.mjs +1 -1
- package/esm2022/lib/request/request.util.mjs +1 -1
- package/fesm2022/ethlete-query.mjs +98 -31
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/index.d.ts +3 -1
- package/lib/devtools/pipes/index.d.ts +1 -1
- package/lib/devtools/utils/index.d.ts +1 -1
- package/lib/query/query.d.ts +2 -0
- package/lib/query/query.types.d.ts +58 -1
- package/lib/query/query.utils.d.ts +5 -5
- package/lib/query-client/query-client.d.ts +8 -8
- package/lib/query-creator/query-creator.types.d.ts +2 -2
- package/lib/request/request.d.ts +1 -1
- package/lib/request/request.util.d.ts +6 -5
- package/package.json +5 -5
- package/esm2022/lib/devtools/components/public-api.mjs +0 -2
- package/esm2022/lib/devtools/components/query-devtools/public-api.mjs +0 -2
- package/esm2022/lib/devtools/index.mjs +0 -2
- package/esm2022/lib/devtools/pipes/public-api.mjs +0 -2
- package/esm2022/lib/devtools/public-api.mjs +0 -4
- package/esm2022/lib/devtools/utils/public-api.mjs +0 -2
- package/lib/devtools/components/public-api.d.ts +0 -1
- package/lib/devtools/index.d.ts +0 -1
- package/lib/devtools/pipes/public-api.d.ts +0 -1
- package/lib/devtools/public-api.d.ts +0 -3
- package/lib/devtools/utils/public-api.d.ts +0 -1
- /package/lib/devtools/components/query-devtools/{public-api.d.ts → index.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# @ethlete/query
|
|
2
2
|
|
|
3
|
+
## 5.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1614](https://github.com/ethlete-io/ethdk/pull/1614) [`5f414b9`](https://github.com/ethlete-io/ethdk/commit/5f414b96362366f650945835b87d3cf8ce292bc1) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix various circular dependencies
|
|
8
|
+
|
|
9
|
+
## 5.8.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- [`d1c07b5`](https://github.com/ethlete-io/ethdk/commit/d1c07b556bd41a48b4571165a38fa302a92c29a0) Thanks [@TomTomB](https://github.com/TomTomB)! - Add `mock` property to `prepare` method to allow for mocking responses and errors.
|
|
14
|
+
Mocked queries will ignore the `secure` property and will not be sent over the network.
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
// The query results in a successful response after 300ms using the mock response
|
|
18
|
+
getBooks
|
|
19
|
+
.prepare({
|
|
20
|
+
queryParams: { page: 1 },
|
|
21
|
+
mock: { response: MOCK_RESPONSE, delay: 300 },
|
|
22
|
+
})
|
|
23
|
+
.execute();
|
|
24
|
+
|
|
25
|
+
// The query results in a failed response after 300ms using the mock error
|
|
26
|
+
getBooks
|
|
27
|
+
.prepare({
|
|
28
|
+
queryParams: { page: 1 },
|
|
29
|
+
mock: { error: MOCK_ERROR, delay: 300 },
|
|
30
|
+
})
|
|
31
|
+
.execute();
|
|
32
|
+
|
|
33
|
+
// The query results in a successful response using the mock response after being retried 3 times
|
|
34
|
+
getBooks
|
|
35
|
+
.prepare({
|
|
36
|
+
queryParams: { page: 1 },
|
|
37
|
+
mock: { retryIntoResponse: true },
|
|
38
|
+
})
|
|
39
|
+
.execute();
|
|
40
|
+
|
|
41
|
+
// The query results in a successful response after 6 progress events using the mock response
|
|
42
|
+
uploadSomeFile
|
|
43
|
+
.prepare({
|
|
44
|
+
queryParams: { page: 1 },
|
|
45
|
+
mock: {
|
|
46
|
+
response: MOCK_RESPONSE,
|
|
47
|
+
progress: {
|
|
48
|
+
eventCount: 6,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
.execute();
|
|
53
|
+
```
|
|
54
|
+
|
|
3
55
|
## 5.7.0
|
|
4
56
|
|
|
5
57
|
### Minor Changes
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './lib/auth';
|
|
2
2
|
export * from './lib/class-validator';
|
|
3
|
-
export * from './lib/devtools';
|
|
3
|
+
export * from './lib/devtools/components/query-devtools';
|
|
4
|
+
export * from './lib/devtools/pipes';
|
|
5
|
+
export * from './lib/devtools/utils';
|
|
4
6
|
export * from './lib/directives';
|
|
5
7
|
export * from './lib/entity';
|
|
6
8
|
export * from './lib/gql';
|
|
@@ -14,4 +16,4 @@ export * from './lib/query-store';
|
|
|
14
16
|
export * from './lib/request';
|
|
15
17
|
export * from './lib/symfony';
|
|
16
18
|
export * from './lib/utils';
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvYXV0aCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jbGFzcy12YWxpZGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGV2dG9vbHMvY29tcG9uZW50cy9xdWVyeS1kZXZ0b29scyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kZXZ0b29scy9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kZXZ0b29scy91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXJlY3RpdmVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2VudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW5maW5pdGUtcXVlcnknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3F1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3F1ZXJ5LWNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9xdWVyeS1jcmVhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3F1ZXJ5LWZvcm0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcXVlcnktc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVxdWVzdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zeW1mb255JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3V0aWxzJztcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './query-devtools.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZGV2dG9vbHMvY29tcG9uZW50cy9xdWVyeS1kZXZ0b29scy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1kZXZ0b29scy5jb21wb25lbnQnO1xuIl19
|
|
@@ -211,10 +211,10 @@ export class QueryDevtoolsComponent {
|
|
|
211
211
|
clearQueryHistory() {
|
|
212
212
|
this.queryHistory$.next([]);
|
|
213
213
|
}
|
|
214
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
215
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Open Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Query browser</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' }\"\n (click)=\"selectQueryListMode('live')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' }\"\n (click)=\"selectQueryListMode('history')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n </div>\n\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\" (click)=\"selectQuery(query)\">\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\" (click)=\"selectQuery(query)\">\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}.et-query-devtools-open-btn{position:fixed;inset-inline-start:0;inset-block-start:0;z-index:9999;all:unset;font-family:monospace}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid #3c424a;padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid #3c424a;margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid #3c424a;list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid #3c424a;background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;gap:2px}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
214
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryDevtoolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
215
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Open Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Query browser</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' }\"\n (click)=\"selectQueryListMode('live')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' }\"\n (click)=\"selectQueryListMode('history')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n </div>\n\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\" (click)=\"selectQuery(query)\">\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\" (click)=\"selectQuery(query)\">\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}.et-query-devtools-open-btn{position:fixed;inset-inline-start:0;inset-block-start:0;z-index:9999;all:unset;font-family:monospace}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid #3c424a;padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid #3c424a;margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid #3c424a;list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid #3c424a;background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;gap:2px}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
216
216
|
}
|
|
217
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
217
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryDevtoolsComponent, decorators: [{
|
|
218
218
|
type: Component,
|
|
219
219
|
args: [{ selector: 'et-query-devtools', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, host: {
|
|
220
220
|
class: 'et-query-devtools',
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './query-short-name.pipe';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZGV2dG9vbHMvcGlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcXVlcnktc2hvcnQtbmFtZS5waXBlJztcbiJdfQ==
|
|
@@ -15,10 +15,10 @@ export class QueryShortNamePipe {
|
|
|
15
15
|
console.log(route);
|
|
16
16
|
return route;
|
|
17
17
|
}
|
|
18
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
19
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryShortNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
19
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.0", ngImport: i0, type: QueryShortNamePipe, isStandalone: true, name: "queryShortName" }); }
|
|
20
20
|
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryShortNamePipe, decorators: [{
|
|
22
22
|
type: Pipe,
|
|
23
23
|
args: [{ name: 'queryShortName', standalone: true }]
|
|
24
24
|
}] });
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './query-client.utils';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZGV2dG9vbHMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcXVlcnktY2xpZW50LnV0aWxzJztcbiJdfQ==
|
|
@@ -40,10 +40,10 @@ export class InfinityQueryTriggerDirective {
|
|
|
40
40
|
});
|
|
41
41
|
this._observer.observe(this._elementRef.nativeElement);
|
|
42
42
|
}
|
|
43
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
44
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: InfinityQueryTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
44
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.0", type: InfinityQueryTriggerDirective, isStandalone: true, selector: "[etInfinityQueryTrigger], et-infinity-query-trigger", inputs: { scrollContainerSelector: "scrollContainerSelector" }, ngImport: i0 }); }
|
|
45
45
|
}
|
|
46
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: InfinityQueryTriggerDirective, decorators: [{
|
|
47
47
|
type: Directive,
|
|
48
48
|
args: [{
|
|
49
49
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -155,10 +155,10 @@ export class InfinityQueryDirective {
|
|
|
155
155
|
this._viewContext.currentQuery = null;
|
|
156
156
|
this._data$.next([]);
|
|
157
157
|
}
|
|
158
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
159
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.
|
|
158
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: InfinityQueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
159
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.0", type: InfinityQueryDirective, isStandalone: true, selector: "[etInfinityQuery]", inputs: { infinityQuery: ["etInfinityQuery", "infinityQuery"] }, providers: [{ provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective }], exportAs: ["etInfinityQuery"], hostDirectives: [{ directive: i1.DelayableDirective }], ngImport: i0 }); }
|
|
160
160
|
}
|
|
161
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: InfinityQueryDirective, decorators: [{
|
|
162
162
|
type: Directive,
|
|
163
163
|
args: [{
|
|
164
164
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -103,10 +103,10 @@ export class QueryDirective {
|
|
|
103
103
|
this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.
|
|
107
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
107
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.0", type: QueryDirective, isStandalone: true, selector: "[etQuery]", inputs: { query: ["etQuery", "query"], cache: ["etQueryCache", "cache"] }, ngImport: i0 }); }
|
|
108
108
|
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.
|
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: QueryDirective, decorators: [{
|
|
110
110
|
type: Directive,
|
|
111
111
|
args: [{
|
|
112
112
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { untracked } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, filter, interval, map, of, ReplaySubject, shareReplay, skip, Subject, switchMap, takeUntil, takeWhile, tap, } from 'rxjs';
|
|
2
|
+
import { BehaviorSubject, filter, interval, map, of, ReplaySubject, shareReplay, skip, Subject, switchMap, takeUntil, takeWhile, tap, timer, } from 'rxjs';
|
|
3
3
|
import { isBearerAuthProvider } from '../auth';
|
|
4
4
|
import { shouldCacheQuery } from '../query-client';
|
|
5
5
|
import { request } from '../request';
|
|
@@ -74,6 +74,9 @@ export class Query {
|
|
|
74
74
|
get canBeCached() {
|
|
75
75
|
return shouldCacheQuery(this._queryConfig.method);
|
|
76
76
|
}
|
|
77
|
+
get _isInMockMode() {
|
|
78
|
+
return !!this._arguments?.mock;
|
|
79
|
+
}
|
|
77
80
|
constructor(_client,
|
|
78
81
|
/**
|
|
79
82
|
* @internal
|
|
@@ -129,7 +132,7 @@ export class Query {
|
|
|
129
132
|
if (!this.isExpired && !skipCache && isQueryStateSuccess(this.rawState)) {
|
|
130
133
|
return this;
|
|
131
134
|
}
|
|
132
|
-
if (queryConfig.secure && !authProvider) {
|
|
135
|
+
if (queryConfig.secure && !authProvider && !this._isInMockMode) {
|
|
133
136
|
throw new Error('Cannot execute secure query without auth provider');
|
|
134
137
|
}
|
|
135
138
|
const id = this._nextId;
|
|
@@ -146,19 +149,24 @@ export class Query {
|
|
|
146
149
|
const method = computeQueryMethod({ config: queryConfig, client: this._client });
|
|
147
150
|
const body = computeQueryBody({ config: queryConfig, client: this._client, args: this._arguments, method });
|
|
148
151
|
const headers = computeQueryHeaders({ client: this._client, config: queryConfig, args: this._arguments });
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
152
|
+
if (this._isInMockMode) {
|
|
153
|
+
this._mockRequest(headers, meta, options);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
request({
|
|
157
|
+
urlWithParams: this._routeWithParams,
|
|
158
|
+
method,
|
|
159
|
+
body,
|
|
160
|
+
headers,
|
|
161
|
+
reportProgress: queryConfig.reportProgress,
|
|
162
|
+
responseType: queryConfig.responseType,
|
|
163
|
+
withCredentials: queryConfig.withCredentials,
|
|
164
|
+
cacheAdapter: this._client.config.request?.cacheAdapter,
|
|
165
|
+
retryFn: this._client.config.request?.retryFn,
|
|
166
|
+
})
|
|
167
|
+
.pipe(tap((state) => this._updateEntityState(state, meta, options)), takeUntil(this._onAbort$))
|
|
168
|
+
.subscribe();
|
|
169
|
+
}
|
|
162
170
|
return this;
|
|
163
171
|
}
|
|
164
172
|
abort() {
|
|
@@ -303,6 +311,65 @@ export class Query {
|
|
|
303
311
|
// We need to use untracked here to avoid Angular's "allowSignalWrites is false" error when executing queries inside Angular's computed/effect signal functions.
|
|
304
312
|
untracked(() => this._state$.next(s));
|
|
305
313
|
}
|
|
314
|
+
_mockRequest(headers, meta, options) {
|
|
315
|
+
if (!this._arguments?.mock)
|
|
316
|
+
return;
|
|
317
|
+
const { delay = 200, error, response, retryIntoResponse = false, progress } = this._arguments.mock;
|
|
318
|
+
const progressFileSize = progress?.fileSize ?? 1000000;
|
|
319
|
+
const progressEventType = progress?.eventType ?? 'upload';
|
|
320
|
+
const progressEventCount = progress?.eventCount ?? 5;
|
|
321
|
+
const progressOmitTotal = progress?.omitTotal ?? false;
|
|
322
|
+
const omitPartialText = progress?.omitPartialText ?? false;
|
|
323
|
+
const finalResolveMock = () => {
|
|
324
|
+
if (error) {
|
|
325
|
+
this._updateEntityState({ error, headers: headers ?? {}, type: 'failure' }, meta, options);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
this._updateEntityState({ response: response, headers: headers ?? {}, type: 'success' }, meta, options);
|
|
329
|
+
};
|
|
330
|
+
if (progress) {
|
|
331
|
+
interval(delay)
|
|
332
|
+
.pipe(tap((a) => {
|
|
333
|
+
if (a === progressEventCount + 1) {
|
|
334
|
+
finalResolveMock();
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
const current = Math.min(progressFileSize * a, progressFileSize * progressEventCount);
|
|
338
|
+
const percentage = (current / (progressFileSize * progressEventCount)) * 100;
|
|
339
|
+
this._updateEntityState({
|
|
340
|
+
type: progressEventType === 'upload' ? 'upload-progress' : 'download-progress',
|
|
341
|
+
headers: headers ?? {},
|
|
342
|
+
progress: { current, ...(progressOmitTotal ? {} : { percentage, total: progressFileSize }) },
|
|
343
|
+
partialText: omitPartialText ? undefined : `Partial text ${a}`,
|
|
344
|
+
}, meta, options);
|
|
345
|
+
}
|
|
346
|
+
}), takeUntil(this._onAbort$), takeWhile((a) => a < progressEventCount + 1, true))
|
|
347
|
+
.subscribe();
|
|
348
|
+
}
|
|
349
|
+
else if (retryIntoResponse) {
|
|
350
|
+
interval(delay)
|
|
351
|
+
.pipe(tap((a) => {
|
|
352
|
+
if (a === 3) {
|
|
353
|
+
finalResolveMock();
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
const aModified = a + 1;
|
|
357
|
+
this._updateEntityState({
|
|
358
|
+
type: 'delay-retry',
|
|
359
|
+
headers: headers ?? {},
|
|
360
|
+
retryDelay: 1000 + 1000 * aModified,
|
|
361
|
+
retryNumber: aModified,
|
|
362
|
+
}, meta, options);
|
|
363
|
+
}
|
|
364
|
+
}), takeUntil(this._onAbort$), takeWhile((a) => a < 3, true))
|
|
365
|
+
.subscribe();
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
timer(delay)
|
|
369
|
+
.pipe(tap(() => finalResolveMock()), takeUntil(this._onAbort$))
|
|
370
|
+
.subscribe();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
306
373
|
/**
|
|
307
374
|
* @internal
|
|
308
375
|
*/
|
|
@@ -334,4 +401,4 @@ export class Query {
|
|
|
334
401
|
return Object.keys(this._dependents).length > 0;
|
|
335
402
|
}
|
|
336
403
|
}
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUVILEVBQUUsRUFDRixhQUFhLEVBQ2IsV0FBVyxFQUNYLElBQUksRUFDSixPQUFPLEVBRVAsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9DLE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBa0IsT0FBTyxFQUE4QixNQUFNLFlBQVksQ0FBQztBQWFqRixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sT0FBTyxLQUFLO0lBdUNoQixJQUFZLE9BQU87UUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8s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VUFBVSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YWtlV2hpbGUsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0JlYXJlckF1dGhQcm92aWRlciB9IGZyb20gJy4uL2F1dGgnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuLi9lbnRpdHknO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIHNob3VsZENhY2hlUXVlcnkgfSBmcm9tICcuLi9xdWVyeS1jbGllbnQnO1xuaW1wb3J0IHsgSHR0cFN0YXR1c0NvZGUsIHJlcXVlc3QsIFJlcXVlc3RFcnJvciwgUmVxdWVzdEV2ZW50IH0gZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQge1xuICBCYXNlQXJndW1lbnRzLFxuICBFeGVjdXRlUXVlcnlPcHRpb25zLFxuICBHcWxRdWVyeUNvbmZpZyxcbiAgUG9sbENvbmZpZyxcbiAgUXVlcnlBdXRvUmVmcmVzaENvbmZpZyxcbiAgUXVlcnlTdGF0ZSxcbiAgUXVlcnlTdGF0ZU1ldGEsXG4gIFF1ZXJ5U3RhdGVUeXBlLFxuICBSZXN0UXVlcnlDb25maWcsXG4gIFJvdXRlVHlwZSxcbn0gZnJvbSAnLi9xdWVyeS50eXBlcyc7XG5pbXBvcnQge1xuICBjb21wdXRlUXVlcnlCb2R5LFxuICBjb21wdXRlUXVlcnlIZWFkZXJzLFxuICBjb21wdXRlUXVlcnlNZXRob2QsXG4gIGZpbHRlckZhaWx1cmUsXG4gIGZpbHRlclN1Y2Nlc3MsXG4gIGlzR3FsUXVlcnlDb25maWcsXG4gIGlzUXVlcnlTdGF0ZUNhbmNlbGxlZCxcbiAgaXNRdWVyeVN0YXRlRmFpbHVyZSxcbiAgaXNRdWVyeVN0YXRlTG9hZGluZyxcbiAgaXNRdWVyeVN0YXRlUHJlcGFyZWQsXG4gIGlzUXVlcnlTdGF0ZVN1Y2Nlc3MsXG4gIHRha2VVbnRpbFJlc3BvbnNlLFxufSBmcm9tICcuL3F1ZXJ5LnV0aWxzJztcblxubGV0IF9uZXh0UXVlcnlJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeTxcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFJvdXRlIGV4dGVuZHMgUm91dGVUeXBlPEFyZ3VtZW50cz4sXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiB7XG4gIHJlYWRvbmx5IF9pZCA9IF9uZXh0UXVlcnlJZCsrO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRMb2NhbElkID0gMDtcbiAgcHJpdmF0ZSBfcG9sbGluZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX29uQWJvcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfY3VycmVudFBvbGxDb25maWc6IFBvbGxDb25maWcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFVzZWQgdG8gdHJhY2sgd2hpY2ggY29tcG9uZW50cyBkZXBlbmQgb24gdGhpcyBxdWVyeS5cbiAgICogVGhlIGtleSBpcyB0aGUgY29tcG9uZW50J3MgX3ROb2RlIGluZGV4LlxuICAgKiBUaGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgY29tcG9uZW50IGhhcyBzdWJzY3JpYmVkIHRvIHRoaXMgcXVlcnkuXG4gICAqIFRoZSB2YWx1ZSBtaWdodCBpbmNyZWFzZSBzaW5jZSB3ZSBjYW50IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBjb21wb25lbnQgYW5kIGEgaG9zdCBkaXJlY3RpdmUgYXBwbGllZCB0byBpdC5cbiAgICovXG4gIF9kZXBlbmRlbnRzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2RlcGVuZGVudHNDaGFuZ2VkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlY29yZDxudW1iZXIsIG51bWJlcj4+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2lzUG9sbGluZ1BhdXNlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlTdGF0ZTxSZXNwb25zZT4+KHtcbiAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5QcmVwYXJlZCxcbiAgICBtZXRhOiB7IGlkOiB0aGlzLl9jdXJyZW50TG9jYWxJZCwgdHJpZ2dlcmVkVmlhOiAncHJvZ3JhbScgfSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBnZXQgX25leHRJZCgpIHtcbiAgICByZXR1cm4gKyt0aGlzLl9jdXJyZW50TG9jYWxJZDtcbiAgfVxuXG4gIGdldCBzdGF0ZSQoKTogT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPERhdGE+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5waXBlKFxuICAgICAgdGFwKChzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY2xpZW50LmNvbmZpZy5sb2dnaW5nPy5wcmVwYXJlZFF1ZXJ5U3Vic2NyaXB0aW9ucykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChpc1F1ZXJ5U3RhdGVQcmVwYXJlZChzKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBRdWVyeSAke3RoaXMuX3JvdXRlV2l0aFBhcmFtc30gd2FzIHN1YnNjcmliZWQgdG8gaW4gdGhlIHByZXBhcmVkIHN0YXRlLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIC5leGVjdXRlKCk/YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgocykgPT4gdGhpcy5fdHJhbnNmb3JtU3RhdGUocykpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogKipXYXJuaW5nISoqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBgc3RhdGUkYCBvYnNlcnZhYmxlIGluIHRoYXQgaXQgZG9lcyBub3QgdXNlIHRoZSBxdWVyeSBzdG9yZS4gVGh1cywgdGhlIHJlc3BvbnNlIGRhdGEgbWlnaHQgYmUgb3V0ZGF0ZWQuXG4gICAqIFVzZSBgc3RhdGUkYCAob3IgYGZpcnN0VmFsdWVGcm9tKHN0YXRlJClgKSB0aGUgbW9zdCB1cC10by1kYXRlIGRhdGEuXG4gICAqL1xuICBnZXQgcmF3U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC52YWx1ZTtcbiAgfVxuXG4gIGdldCBpc0V4cGlyZWQoKSB7XG4gICAgaWYgKGlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpc1F1ZXJ5U3RhdGVQcmVwYXJlZCh0aGlzLnJhd1N0YXRlKSB8fFxuICAgICAgaXNRdWVyeVN0YXRlQ2FuY2VsbGVkKHRoaXMucmF3U3RhdGUpIHx8XG4gICAgICBpc1F1ZXJ5U3RhdGVGYWlsdXJlKHRoaXMucmF3U3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0cyA9IHRoaXMucmF3U3RhdGUubWV0YS5leHBpcmVzQXQ7XG5cbiAgICBpZiAoIXRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHMgPCBEYXRlLm5vdygpO1xuICB9XG5cbiAgZ2V0IGlzSW5Vc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5vYnNlcnZlZCB8fCBPYmplY3Qua2V5cyh0aGlzLl9kZXBlbmRlbnRzKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IF9zdWJzY3JpYmVyQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5vYnNlcnZlcnMubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzUG9sbGluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0IGF1dG9SZWZyZXNoT25Db25maWcoKSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmF1dG9SZWZyZXNoT24gPz8ge307XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZDogUmVhZG9ubHk8UXVlcnlBdXRvUmVmcmVzaENvbmZpZz4gPSB7XG4gICAgICBxdWVyeUNsaWVudERlZmF1bHRIZWFkZXJzQ2hhbmdlOiBiYXNlLnF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2UgPz8gdHJ1ZSxcbiAgICAgIHdpbmRvd0ZvY3VzOiBiYXNlLndpbmRvd0ZvY3VzID8/IHRydWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBfZW5hYmxlU21hcnRQb2xsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbmFibGVTbWFydFBvbGxpbmcgPz8gdHJ1ZTtcbiAgfVxuXG4gIGdldCBzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5zdG9yZSA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGNhbkJlQ2FjaGVkKCkge1xuICAgIHJldHVybiBzaG91bGRDYWNoZVF1ZXJ5KHRoaXMuX3F1ZXJ5Q29uZmlnLm1ldGhvZCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbGllbnQ6IFF1ZXJ5Q2xpZW50LFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9xdWVyeUNvbmZpZzpcbiAgICAgIHwgUmVzdFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+XG4gICAgICB8IEdxbFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+LFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9yb3V0ZVdpdGhQYXJhbXM6IFJvdXRlLFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9hcmd1bWVudHM6IEFyZ3VtZW50cyxcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfcXVlcnlTdG9yZUtleTogc3RyaW5nLFxuICApIHt9XG5cbiAgZXhlY3V0ZShvcHRpb25zOiBFeGVjdXRlUXVlcnlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNraXBDYWNoZSA9IGZhbHNlLCBfdHJpZ2dlcmVkVmlhOiB0cmlnZ2VyZWRWaWEgPSAncHJvZ3JhbScsIGNhbmNlbFByZXZpb3VzID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBhdXRoUHJvdmlkZXIgfSA9IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBxdWVyeUNvbmZpZyA9IHRoaXMuX3F1ZXJ5Q29uZmlnO1xuXG4gICAgaWYgKCF0aGlzLmlzRXhwaXJlZCAmJiAhc2tpcENhY2hlICYmIGlzUXVlcnlTdGF0ZVN1Y2Nlc3ModGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChxdWVyeUNvbmZpZy5zZWN1cmUgJiYgIWF1dGhQcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXhlY3V0ZSBzZWN1cmUgcXVlcnkgd2l0aG91dCBhdXRoIHByb3ZpZGVyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB0aGlzLl9uZXh0SWQ7XG4gICAgY29uc3QgbWV0YTogUXVlcnlTdGF0ZU1ldGEgPSB7IGlkLCB0cmlnZ2VyZWRWaWEgfTtcblxuICAgIGlmIChpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMucmF3U3RhdGUpKSB7XG4gICAgICBpZiAoY2FuY2VsUHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlU3RhdGUoeyB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nLCBtZXRhIH0pO1xuXG4gICAgY29uc3QgbWV0aG9kID0gY29tcHV0ZVF1ZXJ5TWV0aG9kKHsgY29uZmlnOiBxdWVyeUNvbmZpZywgY2xpZW50OiB0aGlzLl9jbGllbnQgfSk7XG4gICAgY29uc3QgYm9keSA9IGNvbXB1dGVRdWVyeUJvZHkoeyBjb25maWc6IHF1ZXJ5Q29uZmlnLCBjbGllbnQ6IHRoaXMuX2NsaWVudCwgYXJnczogdGhpcy5fYXJndW1lbnRzLCBtZXRob2QgfSk7XG4gICAgY29uc3QgaGVhZGVycyA9IGNvbXB1dGVRdWVyeUhlYWRlcnMoeyBjbGllbnQ6IHRoaXMuX2NsaWVudCwgY29uZmlnOiBxdWVyeUNvbmZpZywgYXJnczogdGhpcy5fYXJndW1lbnRzIH0pO1xuXG4gICAgcmVxdWVzdDxSZXNwb25zZT4oe1xuICAgICAgdXJsV2l0aFBhcmFtczogdGhpcy5fcm91dGVXaXRoUGFyYW1zLFxuICAgICAgbWV0aG9kLFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZXBvcnRQcm9ncmVzczogcXVlcnlDb25maWcucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICByZXNwb25zZVR5cGU6IHF1ZXJ5Q29uZmlnLnJlc3BvbnNlVHlwZSxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogcXVlcnlDb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgY2FjaGVBZGFwdGVyOiB0aGlzLl9jbGllbnQuY29uZmlnLnJlcXVlc3Q/LmNhY2hlQWRhcHRlcixcbiAgICAgIHJldHJ5Rm46IHRoaXMuX2NsaWVudC5jb25maWcucmVxdWVzdD8ucmV0cnlGbixcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc3RhdGUpID0+IHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHN0YXRlLCBtZXRhLCBvcHRpb25zKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIGlmICghaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fb25BYm9ydCQubmV4dCgpO1xuXG4gICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuQ2FuY2VsbGVkLFxuICAgICAgbWV0YTogeyBpZDogdGhpcy5yYXdTdGF0ZS5tZXRhLmlkLCB0cmlnZ2VyZWRWaWE6IHRoaXMucmF3U3RhdGUubWV0YS50cmlnZ2VyZWRWaWEgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcG9sbChjb25maWc6IFBvbGxDb25maWcpIHtcbiAgICBpZiAodGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fY3VycmVudFBvbGxDb25maWcgPSBjb25maWc7XG5cbiAgICBjb25zdCBpbnRlcnZhbCQgPSBpbnRlcnZhbChjb25maWcuaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHBvbGwkID0gaW50ZXJ2YWwkLnBpcGUoXG4gICAgICBza2lwKGNvbmZpZy50cmlnZ2VySW1tZWRpYXRlbHkgPyAwIDogMSksXG4gICAgICB0YWtlVW50aWwoY29uZmlnLnRha2VVbnRpbCksXG4gICAgICB0YWtlV2hpbGUoKCkgPT4gIXRoaXMuX2lzUG9sbGluZ1BhdXNlZCksXG4gICAgICBmaWx0ZXIoKCkgPT4gIWlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5fc3RhdGUkLnZhbHVlKSksXG4gICAgKTtcblxuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBwb2xsJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5leGVjdXRlKHsgc2tpcENhY2hlOiB0cnVlLCBfdHJpZ2dlcmVkVmlhOiAncG9sbCcgfSksXG4gICAgICBjb21wbGV0ZTogKCkgPT4gdGhpcy5zdG9wUG9sbGluZygpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdG9wUG9sbGluZygpIHtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIHRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnID0gbnVsbDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcGF1c2VQb2xsaW5nKCkge1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbiA9IG51bGw7XG5cbiAgICB0aGlzLl9pc1BvbGxpbmdQYXVzZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXN1bWVQb2xsaW5nKCkge1xuICAgIGlmICghdGhpcy5faXNQb2xsaW5nUGF1c2VkIHx8ICF0aGlzLl9jdXJyZW50UG9sbENvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5faXNQb2xsaW5nUGF1c2VkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5wb2xsKHsgLi4udGhpcy5fY3VycmVudFBvbGxDb25maWcsIHRyaWdnZXJJbW1lZGlhdGVseTogdHJ1ZSB9KTtcbiAgfVxuXG4gIG9uU3VjY2VzcyhjYWxsYmFjazogKHJlc3BvbnNlOiBEYXRhKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWxSZXNwb25zZSgpLCBmaWx0ZXJTdWNjZXNzKCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHN0YXRlLnJlc3BvbnNlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbkZhaWx1cmUoY2FsbGJhY2s6IChlcnJvcjogUmVxdWVzdEVycm9yPHVua25vd24+KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWxSZXNwb25zZSgpLCBmaWx0ZXJGYWlsdXJlKCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHN0YXRlLmVycm9yKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCZWFyZXJBdXRoUHJvdmlkZXIoKSB7XG4gICAgY29uc3QgYXV0aFByb3ZpZGVyID0gdGhpcy5fY2xpZW50LmF1dGhQcm92aWRlcjtcblxuICAgIGlmIChhdXRoUHJvdmlkZXIgJiYgaXNCZWFyZXJBdXRoUHJvdmlkZXIoYXV0aFByb3ZpZGVyKSkge1xuICAgICAgcmV0dXJuIGF1dGhQcm92aWRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgIHJlcXVlc3RFdmVudDogUmVxdWVzdEV2ZW50PFJlc3BvbnNlPixcbiAgICBtZXRhOiBRdWVyeVN0YXRlTWV0YSxcbiAgICBvcHRpb25zPzogRXhlY3V0ZVF1ZXJ5T3B0aW9ucyxcbiAgKSB7XG4gICAgc3dpdGNoIChyZXF1ZXN0RXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgY2FzZSAnZGVsYXktcmV0cnknOiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgcmV0cnlEZWxheSwgcmV0cnlOdW1iZXIgfSA9IHJlcXVlc3RFdmVudDtcbiAgICAgICAgY29uc3QgbmV3TWV0YTogUXVlcnlTdGF0ZU1ldGEgPSB7IC4uLm1ldGEsIGlzV2FpdGluZ0ZvclJldHJ5OiB0eXBlID09PSAnZGVsYXktcmV0cnknLCByZXRyeURlbGF5LCByZXRyeU51bWJlciB9O1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nLFxuICAgICAgICAgIG1ldGE6IG5ld01ldGEsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBsb2FkLXByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ2Rvd25sb2FkLXByb2dyZXNzJzoge1xuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZyxcbiAgICAgICAgICBwcm9ncmVzczogcmVxdWVzdEV2ZW50LnByb2dyZXNzLFxuICAgICAgICAgIHBhcnRpYWxUZXh0OiAncGFydGlhbFRleHQnIGluIHJlcXVlc3RFdmVudCA/IHJlcXVlc3RFdmVudC5wYXJ0aWFsVGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtZXRhLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHtcbiAgICAgICAgY29uc3QgeyByZXNwb25zZSwgZXhwaXJlc0luVGltZXN0YW1wIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IGlzR3FsID0gaXNHcWxRdWVyeUNvbmZpZyh0aGlzLl9xdWVyeUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9XG4gICAgICAgICAgaXNHcWwgJiYgdHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiAhIXJlc3BvbnNlICYmICdkYXRhJyBpbiByZXNwb25zZVxuICAgICAgICAgICAgPyAocmVzcG9uc2VbJ2RhdGEnXSBhcyBSZXNwb25zZSlcbiAgICAgICAgICAgIDogKHJlc3BvbnNlIGFzIFJlc3BvbnNlKTtcblxuICAgICAgICBpZiAodGhpcy5fcXVlcnlDb25maWcuZW50aXR5ICYmIHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zZXQpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uaWQoeyBhcmdzOiB0aGlzLl9hcmd1bWVudHMsIHJlc3BvbnNlOiByZXNwb25zZURhdGEgfSk7XG5cbiAgICAgICAgICB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LnNldCh7XG4gICAgICAgICAgICBhcmdzOiB0aGlzLl9hcmd1bWVudHMsXG4gICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBzdG9yZTogdGhpcy5fcXVlcnlDb25maWcuZW50aXR5LnN0b3JlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLlN1Y2Nlc3MsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBtZXRhOiB7IC4uLm1ldGEsIGV4cGlyZXNBdDogZXhwaXJlc0luVGltZXN0YW1wIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdmYWlsdXJlJzoge1xuICAgICAgICBjb25zdCB7IGVycm9yIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IGZhaWx1cmUgPSAoKSA9PiB0aGlzLl91cGRhdGVTdGF0ZSh7IHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkZhaWx1cmUsIGVycm9yLCBtZXRhIH0pO1xuICAgICAgICBjb25zdCBiZWFyZXJBdXRoUHJvdmlkZXIgPSB0aGlzLl9nZXRCZWFyZXJBdXRoUHJvdmlkZXIoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWJlYXJlckF1dGhQcm92aWRlciB8fFxuICAgICAgICAgIG9wdGlvbnM/Ll9pc1VuYXV0aG9yaXplZFJldHJ5IHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5VbmF1dGhvcml6ZWQgfHxcbiAgICAgICAgICAhYmVhcmVyQXV0aFByb3ZpZGVyLnNob3VsZFJlZnJlc2hPblVuYXV0aG9yaXplZFJlc3BvbnNlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWlsdXJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGJlYXJlckF1dGhQcm92aWRlci5fcmVmcmVzaFF1ZXJ5KCk7XG4gICAgICAgIGlmICghcXVlcnkpIHJldHVybiBmYWlsdXJlKCk7XG5cbiAgICAgICAgcXVlcnkuc3RhdGUkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWxSZXNwb25zZSgpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgICAgIHRhcCgoc3RhdGUpID0+XG4gICAgICAgICAgICAgIGlzUXVlcnlTdGF0ZVN1Y2Nlc3Moc3RhdGUpID8gdGhpcy5leGVjdXRlKHsgLi4ub3B0aW9ucywgX2lzVW5hdXRob3JpemVkUmV0cnk6IHRydWUgfSkgOiBmYWlsdXJlKCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NhbmNlbCc6IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkNhbmNlbGxlZCxcbiAgICAgICAgICBtZXRhLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2Zvcm1TdGF0ZShzOiBRdWVyeVN0YXRlPFJlc3BvbnNlPik6IE9ic2VydmFibGU8UXVlcnlTdGF0ZTxEYXRhPj4ge1xuICAgIGlmICghaXNRdWVyeVN0YXRlU3VjY2VzcyhzKSB8fCAhdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5nZXQpIHtcbiAgICAgIHJldHVybiBvZihzKSBhcyBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+O1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5LmlkKHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCByZXNwb25zZTogcy5yZXNwb25zZSB9KTtcblxuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHlcbiAgICAgIC5nZXQoeyBhcmdzOiB0aGlzLl9hcmd1bWVudHMsIGlkLCByZXNwb25zZTogcy5yZXNwb25zZSwgc3RvcmU6IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zdG9yZSB9KVxuICAgICAgLnBpcGUobWFwKCh2KSA9PiAoeyAuLi5zLCByZXNwb25zZTogdiB9KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU3RhdGUoczogUXVlcnlTdGF0ZTxSZXNwb25zZT4pIHtcbiAgICAvLyBXZSBuZWVkIHRvIHVzZSB1bnRyYWNrZWQgaGVyZSB0byBhdm9pZCBBbmd1bGFyJ3MgXCJhbGxvd1NpZ25hbFdyaXRlcyBpcyBmYWxzZVwiIGVycm9yIHdoZW4gZXhlY3V0aW5nIHF1ZXJpZXMgaW5zaWRlIEFuZ3VsYXIncyBjb21wdXRlZC9lZmZlY3Qgc2lnbmFsIGZ1bmN0aW9ucy5cbiAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc3RhdGUkLm5leHQocykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2FkZERlcGVuZGVudCh0Tm9kZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0pIHtcbiAgICAgIHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0gPSAwO1xuICAgIH1cblxuICAgIHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0rKztcblxuICAgIHRoaXMuX2RlcGVuZGVudHNDaGFuZ2VkJC5uZXh0KHRoaXMuX2RlcGVuZGVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3JlbW92ZURlcGVuZGVudCh0Tm9kZUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF07XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdLS07XG5cbiAgICBpZiAoY291bnQgPD0gMSkge1xuICAgICAgZGVsZXRlIHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF07XG4gICAgfVxuXG4gICAgdGhpcy5fZGVwZW5kZW50c0NoYW5nZWQkLm5leHQodGhpcy5fZGVwZW5kZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaGFzRGVwZW5kZW50cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZGVwZW5kZW50cykubGVuZ3RoID4gMDtcbiAgfVxufVxuIl19
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUVILEVBQUUsRUFDRixhQUFhLEVBQ2IsV0FBVyxFQUNYLElBQUksRUFDSixPQUFPLEVBRVAsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvQyxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQWtCLE9BQU8sRUFBOEMsTUFBTSxZQUFZLENBQUM7QUFhakcsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFNLE9BQU8sS0FBSztJQXVDaEIsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0s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QUM7UUFFL0IsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YWtlV2hpbGUsXG4gIHRhcCxcbiAgdGltZXIsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNCZWFyZXJBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9hdXRoJztcbmltcG9ydCB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vZW50aXR5JztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBzaG91bGRDYWNoZVF1ZXJ5IH0gZnJvbSAnLi4vcXVlcnktY2xpZW50JztcbmltcG9ydCB7IEh0dHBTdGF0dXNDb2RlLCByZXF1ZXN0LCBSZXF1ZXN0RXJyb3IsIFJlcXVlc3RFdmVudCwgUmVxdWVzdEhlYWRlcnMgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIEJhc2VBcmd1bWVudHMsXG4gIEV4ZWN1dGVRdWVyeU9wdGlvbnMsXG4gIEdxbFF1ZXJ5Q29uZmlnLFxuICBQb2xsQ29uZmlnLFxuICBRdWVyeUF1dG9SZWZyZXNoQ29uZmlnLFxuICBRdWVyeVN0YXRlLFxuICBRdWVyeVN0YXRlTWV0YSxcbiAgUXVlcnlTdGF0ZVR5cGUsXG4gIFJlc3RRdWVyeUNvbmZpZyxcbiAgUm91dGVUeXBlLFxufSBmcm9tICcuL3F1ZXJ5LnR5cGVzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVRdWVyeUJvZHksXG4gIGNvbXB1dGVRdWVyeUhlYWRlcnMsXG4gIGNvbXB1dGVRdWVyeU1ldGhvZCxcbiAgZmlsdGVyRmFpbHVyZSxcbiAgZmlsdGVyU3VjY2VzcyxcbiAgaXNHcWxRdWVyeUNvbmZpZyxcbiAgaXNRdWVyeVN0YXRlQ2FuY2VsbGVkLFxuICBpc1F1ZXJ5U3RhdGVGYWlsdXJlLFxuICBpc1F1ZXJ5U3RhdGVMb2FkaW5nLFxuICBpc1F1ZXJ5U3RhdGVQcmVwYXJlZCxcbiAgaXNRdWVyeVN0YXRlU3VjY2VzcyxcbiAgdGFrZVVudGlsUmVzcG9uc2UsXG59IGZyb20gJy4vcXVlcnkudXRpbHMnO1xuXG5sZXQgX25leHRRdWVyeUlkID0gMDtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5PFxuICBSZXNwb25zZSxcbiAgQXJndW1lbnRzIGV4dGVuZHMgQmFzZUFyZ3VtZW50cyB8IHVuZGVmaW5lZCxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPixcbiAgU3RvcmUgZXh0ZW5kcyBFbnRpdHlTdG9yZTx1bmtub3duPixcbiAgRGF0YSxcbiAgSWQsXG4+IHtcbiAgcmVhZG9ubHkgX2lkID0gX25leHRRdWVyeUlkKys7XG5cbiAgcHJpdmF0ZSBfY3VycmVudExvY2FsSWQgPSAwO1xuICBwcml2YXRlIF9wb2xsaW5nU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb25BYm9ydCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9jdXJyZW50UG9sbENvbmZpZzogUG9sbENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogVXNlZCB0byB0cmFjayB3aGljaCBjb21wb25lbnRzIGRlcGVuZCBvbiB0aGlzIHF1ZXJ5LlxuICAgKiBUaGUga2V5IGlzIHRoZSBjb21wb25lbnQncyBfdE5vZGUgaW5kZXguXG4gICAqIFRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBjb21wb25lbnQgaGFzIHN1YnNjcmliZWQgdG8gdGhpcyBxdWVyeS5cbiAgICogVGhlIHZhbHVlIG1pZ2h0IGluY3JlYXNlIHNpbmNlIHdlIGNhbnQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGNvbXBvbmVudCBhbmQgYSBob3N0IGRpcmVjdGl2ZSBhcHBsaWVkIHRvIGl0LlxuICAgKi9cbiAgX2RlcGVuZGVudHM6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZGVwZW5kZW50c0NoYW5nZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8UmVjb3JkPG51bWJlciwgbnVtYmVyPj4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaXNQb2xsaW5nUGF1c2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeVN0YXRlPFJlc3BvbnNlPj4oe1xuICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLlByZXBhcmVkLFxuICAgIG1ldGE6IHsgaWQ6IHRoaXMuX2N1cnJlbnRMb2NhbElkLCB0cmlnZ2VyZWRWaWE6ICdwcm9ncmFtJyB9LFxuICB9KTtcblxuICBwcml2YXRlIGdldCBfbmV4dElkKCkge1xuICAgIHJldHVybiArK3RoaXMuX2N1cnJlbnRMb2NhbElkO1xuICB9XG5cbiAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLnBpcGUoXG4gICAgICB0YXAoKHMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnQuY29uZmlnLmxvZ2dpbmc/LnByZXBhcmVkUXVlcnlTdWJzY3JpcHRpb25zKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGlzUXVlcnlTdGF0ZVByZXBhcmVkKHMpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFF1ZXJ5ICR7dGhpcy5fcm91dGVXaXRoUGFyYW1zfSB3YXMgc3Vic2NyaWJlZCB0byBpbiB0aGUgcHJlcGFyZWQgc3RhdGUuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgLmV4ZWN1dGUoKT9gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChzKSA9PiB0aGlzLl90cmFuc2Zvcm1TdGF0ZShzKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiAqKldhcm5pbmchKiogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGBzdGF0ZSRgIG9ic2VydmFibGUgaW4gdGhhdCBpdCBkb2VzIG5vdCB1c2UgdGhlIHF1ZXJ5IHN0b3JlLiBUaHVzLCB0aGUgcmVzcG9uc2UgZGF0YSBtaWdodCBiZSBvdXRkYXRlZC5cbiAgICogVXNlIGBzdGF0ZSRgIChvciBgZmlyc3RWYWx1ZUZyb20oc3RhdGUkKWApIHRoZSBtb3N0IHVwLXRvLWRhdGUgZGF0YS5cbiAgICovXG4gIGdldCByYXdTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGlzRXhwaXJlZCgpIHtcbiAgICBpZiAoaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUXVlcnlTdGF0ZVByZXBhcmVkKHRoaXMucmF3U3RhdGUpIHx8XG4gICAgICBpc1F1ZXJ5U3RhdGVDYW5jZWxsZWQodGhpcy5yYXdTdGF0ZSkgfHxcbiAgICAgIGlzUXVlcnlTdGF0ZUZhaWx1cmUodGhpcy5yYXdTdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRzID0gdGhpcy5yYXdTdGF0ZS5tZXRhLmV4cGlyZXNBdDtcblxuICAgIGlmICghdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cyA8IERhdGUubm93KCk7XG4gIH1cblxuICBnZXQgaXNJblVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLm9ic2VydmVkIHx8IE9iamVjdC5rZXlzKHRoaXMuX2RlcGVuZGVudHMpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgX3N1YnNjcmliZXJDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cblxuICBnZXQgaXNQb2xsaW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb247XG4gIH1cblxuICBnZXQgYXV0b1JlZnJlc2hPbkNvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5fcXVlcnlDb25maWcuYXV0b1JlZnJlc2hPbiA/PyB7fTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkOiBSZWFkb25seTxRdWVyeUF1dG9SZWZyZXNoQ29uZmlnPiA9IHtcbiAgICAgIHF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2U6IGJhc2UucXVlcnlDbGllbnREZWZhdWx0SGVhZGVyc0NoYW5nZSA/PyB0cnVlLFxuICAgICAgd2luZG93Rm9jdXM6IGJhc2Uud2luZG93Rm9jdXMgPz8gdHJ1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IF9lbmFibGVTbWFydFBvbGxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Q29uZmlnLmVuYWJsZVNtYXJ0UG9sbGluZyA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IHN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LnN0b3JlID8/IG51bGw7XG4gIH1cblxuICBnZXQgY2FuQmVDYWNoZWQoKSB7XG4gICAgcmV0dXJuIHNob3VsZENhY2hlUXVlcnkodGhpcy5fcXVlcnlDb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGdldCBfaXNJbk1vY2tNb2RlKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2FyZ3VtZW50cz8ubW9jaztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NsaWVudDogUXVlcnlDbGllbnQsXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3F1ZXJ5Q29uZmlnOlxuICAgICAgfCBSZXN0UXVlcnlDb25maWc8Um91dGUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD5cbiAgICAgIHwgR3FsUXVlcnlDb25maWc8Um91dGUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD4sXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3JvdXRlV2l0aFBhcmFtczogUm91dGUsXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX2FyZ3VtZW50czogQXJndW1lbnRzLFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9xdWVyeVN0b3JlS2V5OiBzdHJpbmcsXG4gICkge31cblxuICBleGVjdXRlKG9wdGlvbnM6IEV4ZWN1dGVRdWVyeU9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgc2tpcENhY2hlID0gZmFsc2UsIF90cmlnZ2VyZWRWaWE6IHRyaWdnZXJlZFZpYSA9ICdwcm9ncmFtJywgY2FuY2VsUHJldmlvdXMgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGF1dGhQcm92aWRlciB9ID0gdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHF1ZXJ5Q29uZmlnID0gdGhpcy5fcXVlcnlDb25maWc7XG5cbiAgICBpZiAoIXRoaXMuaXNFeHBpcmVkICYmICFza2lwQ2FjaGUgJiYgaXNRdWVyeVN0YXRlU3VjY2Vzcyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Q29uZmlnLnNlY3VyZSAmJiAhYXV0aFByb3ZpZGVyICYmICF0aGlzLl9pc0luTW9ja01vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4ZWN1dGUgc2VjdXJlIHF1ZXJ5IHdpdGhvdXQgYXV0aCBwcm92aWRlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gdGhpcy5fbmV4dElkO1xuICAgIGNvbnN0IG1ldGE6IFF1ZXJ5U3RhdGVNZXRhID0geyBpZCwgdHJpZ2dlcmVkVmlhIH07XG5cbiAgICBpZiAoaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgaWYgKGNhbmNlbFByZXZpb3VzKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHsgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZywgbWV0YSB9KTtcblxuICAgIGNvbnN0IG1ldGhvZCA9IGNvbXB1dGVRdWVyeU1ldGhvZCh7IGNvbmZpZzogcXVlcnlDb25maWcsIGNsaWVudDogdGhpcy5fY2xpZW50IH0pO1xuICAgIGNvbnN0IGJvZHkgPSBjb21wdXRlUXVlcnlCb2R5KHsgY29uZmlnOiBxdWVyeUNvbmZpZywgY2xpZW50OiB0aGlzLl9jbGllbnQsIGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgbWV0aG9kIH0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBjb21wdXRlUXVlcnlIZWFkZXJzKHsgY2xpZW50OiB0aGlzLl9jbGllbnQsIGNvbmZpZzogcXVlcnlDb25maWcsIGFyZ3M6IHRoaXMuX2FyZ3VtZW50cyB9KTtcblxuICAgIGlmICh0aGlzLl9pc0luTW9ja01vZGUpIHtcbiAgICAgIHRoaXMuX21vY2tSZXF1ZXN0KGhlYWRlcnMsIG1ldGEsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0PFJlc3BvbnNlPih7XG4gICAgICAgIHVybFdpdGhQYXJhbXM6IHRoaXMuX3JvdXRlV2l0aFBhcmFtcyBhcyBzdHJpbmcsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHF1ZXJ5Q29uZmlnLnJlcG9ydFByb2dyZXNzLFxuICAgICAgICByZXNwb25zZVR5cGU6IHF1ZXJ5Q29uZmlnLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBxdWVyeUNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIGNhY2hlQWRhcHRlcjogdGhpcy5fY2xpZW50LmNvbmZpZy5yZXF1ZXN0Py5jYWNoZUFkYXB0ZXIsXG4gICAgICAgIHJldHJ5Rm46IHRoaXMuX2NsaWVudC5jb25maWcucmVxdWVzdD8ucmV0cnlGbixcbiAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoc3RhdGUpID0+IHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHN0YXRlLCBtZXRhLCBvcHRpb25zKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICBpZiAoIWlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX29uQWJvcnQkLm5leHQoKTtcblxuICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkNhbmNlbGxlZCxcbiAgICAgIG1ldGE6IHsgaWQ6IHRoaXMucmF3U3RhdGUubWV0YS5pZCwgdHJpZ2dlcmVkVmlhOiB0aGlzLnJhd1N0YXRlLm1ldGEudHJpZ2dlcmVkVmlhIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBvbGwoY29uZmlnOiBQb2xsQ29uZmlnKSB7XG4gICAgaWYgKHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnID0gY29uZmlnO1xuXG4gICAgY29uc3QgaW50ZXJ2YWwkID0gaW50ZXJ2YWwoY29uZmlnLmludGVydmFsKTtcbiAgICBjb25zdCBwb2xsJCA9IGludGVydmFsJC5waXBlKFxuICAgICAgc2tpcChjb25maWcudHJpZ2dlckltbWVkaWF0ZWx5ID8gMCA6IDEpLFxuICAgICAgdGFrZVVudGlsKGNvbmZpZy50YWtlVW50aWwpLFxuICAgICAgdGFrZVdoaWxlKCgpID0+ICF0aGlzLl9pc1BvbGxpbmdQYXVzZWQpLFxuICAgICAgZmlsdGVyKCgpID0+ICFpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMuX3N0YXRlJC52YWx1ZSkpLFxuICAgICk7XG5cbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uID0gcG9sbCQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuZXhlY3V0ZSh7IHNraXBDYWNoZTogdHJ1ZSwgX3RyaWdnZXJlZFZpYTogJ3BvbGwnIH0pLFxuICAgICAgY29tcGxldGU6ICgpID0+IHRoaXMuc3RvcFBvbGxpbmcoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RvcFBvbGxpbmcoKSB7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9jdXJyZW50UG9sbENvbmZpZyA9IG51bGw7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBhdXNlUG9sbGluZygpIHtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gICAgdGhpcy5faXNQb2xsaW5nUGF1c2VkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVzdW1lUG9sbGluZygpIHtcbiAgICBpZiAoIXRoaXMuX2lzUG9sbGluZ1BhdXNlZCB8fCAhdGhpcy5fY3VycmVudFBvbGxDb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2lzUG9sbGluZ1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRoaXMucG9sbCh7IC4uLnRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnLCB0cmlnZ2VySW1tZWRpYXRlbHk6IHRydWUgfSk7XG4gIH1cblxuICBvblN1Y2Nlc3MoY2FsbGJhY2s6IChyZXNwb25zZTogRGF0YSkgPT4gdm9pZCkge1xuICAgIHRoaXMuc3RhdGUkLnBpcGUodGFrZVVudGlsUmVzcG9uc2UoKSwgZmlsdGVyU3VjY2VzcygpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiBjYWxsYmFjayhzdGF0ZS5yZXNwb25zZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25GYWlsdXJlKGNhbGxiYWNrOiAoZXJyb3I6IFJlcXVlc3RFcnJvcjx1bmtub3duPikgPT4gdm9pZCkge1xuICAgIHRoaXMuc3RhdGUkLnBpcGUodGFrZVVudGlsUmVzcG9uc2UoKSwgZmlsdGVyRmFpbHVyZSgpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiBjYWxsYmFjayhzdGF0ZS5lcnJvcikpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QmVhcmVyQXV0aFByb3ZpZGVyKCkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IHRoaXMuX2NsaWVudC5hdXRoUHJvdmlkZXI7XG5cbiAgICBpZiAoYXV0aFByb3ZpZGVyICYmIGlzQmVhcmVyQXV0aFByb3ZpZGVyKGF1dGhQcm92aWRlcikpIHtcbiAgICAgIHJldHVybiBhdXRoUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICByZXF1ZXN0RXZlbnQ6IFJlcXVlc3RFdmVudDxSZXNwb25zZT4sXG4gICAgbWV0YTogUXVlcnlTdGF0ZU1ldGEsXG4gICAgb3B0aW9ucz86IEV4ZWN1dGVRdWVyeU9wdGlvbnMsXG4gICkge1xuICAgIHN3aXRjaCAocmVxdWVzdEV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIGNhc2UgJ2RlbGF5LXJldHJ5Jzoge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHJldHJ5RGVsYXksIHJldHJ5TnVtYmVyIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IG5ld01ldGE6IFF1ZXJ5U3RhdGVNZXRhID0geyAuLi5tZXRhLCBpc1dhaXRpbmdGb3JSZXRyeTogdHlwZSA9PT0gJ2RlbGF5LXJldHJ5JywgcmV0cnlEZWxheSwgcmV0cnlOdW1iZXIgfTtcblxuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZyxcbiAgICAgICAgICBtZXRhOiBuZXdNZXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3VwbG9hZC1wcm9ncmVzcyc6XG4gICAgICBjYXNlICdkb3dubG9hZC1wcm9ncmVzcyc6IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkxvYWRpbmcsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHJlcXVlc3RFdmVudC5wcm9ncmVzcyxcbiAgICAgICAgICBwYXJ0aWFsVGV4dDogJ3BhcnRpYWxUZXh0JyBpbiByZXF1ZXN0RXZlbnQgPyByZXF1ZXN0RXZlbnQucGFydGlhbFRleHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIGV4cGlyZXNJblRpbWVzdGFtcCB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBpc0dxbCA9IGlzR3FsUXVlcnlDb25maWcodGhpcy5fcXVlcnlDb25maWcpO1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPVxuICAgICAgICAgIGlzR3FsICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgISFyZXNwb25zZSAmJiAnZGF0YScgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgID8gKHJlc3BvbnNlWydkYXRhJ10gYXMgUmVzcG9uc2UpXG4gICAgICAgICAgICA6IChyZXNwb25zZSBhcyBSZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eSAmJiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc2V0KSB7XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LmlkKHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCByZXNwb25zZTogcmVzcG9uc2VEYXRhIH0pO1xuXG4gICAgICAgICAgdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5zZXQoe1xuICAgICAgICAgICAgYXJnczogdGhpcy5fYXJndW1lbnRzLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgc3RvcmU6IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zdG9yZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5TdWNjZXNzLFxuICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBleHBpcmVzQXQ6IGV4cGlyZXNJblRpbWVzdGFtcCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZmFpbHVyZSc6IHtcbiAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBmYWlsdXJlID0gKCkgPT4gdGhpcy5fdXBkYXRlU3RhdGUoeyB0eXBlOiBRdWVyeVN0YXRlVHlwZS5GYWlsdXJlLCBlcnJvciwgbWV0YSB9KTtcbiAgICAgICAgY29uc3QgYmVhcmVyQXV0aFByb3ZpZGVyID0gdGhpcy5fZ2V0QmVhcmVyQXV0aFByb3ZpZGVyKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFiZWFyZXJBdXRoUHJvdmlkZXIgfHxcbiAgICAgICAgICBvcHRpb25zPy5faXNVbmF1dGhvcml6ZWRSZXRyeSB8fFxuICAgICAgICAgIGVycm9yLnN0YXR1cyAhPT0gSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkIHx8XG4gICAgICAgICAgIWJlYXJlckF1dGhQcm92aWRlci5zaG91bGRSZWZyZXNoT25VbmF1dGhvcml6ZWRSZXNwb25zZVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFpbHVyZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBiZWFyZXJBdXRoUHJvdmlkZXIuX3JlZnJlc2hRdWVyeSgpO1xuICAgICAgICBpZiAoIXF1ZXJ5KSByZXR1cm4gZmFpbHVyZSgpO1xuXG4gICAgICAgIHF1ZXJ5LnN0YXRlJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsUmVzcG9uc2UoKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgICB0YXAoKHN0YXRlKSA9PlxuICAgICAgICAgICAgICBpc1F1ZXJ5U3RhdGVTdWNjZXNzKHN0YXRlKSA/IHRoaXMuZXhlY3V0ZSh7IC4uLm9wdGlvbnMsIF9pc1VuYXV0aG9yaXplZFJldHJ5OiB0cnVlIH0pIDogZmFpbHVyZSgpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjYW5jZWwnOiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5DYW5jZWxsZWQsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtU3RhdGUoczogUXVlcnlTdGF0ZTxSZXNwb25zZT4pOiBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+IHtcbiAgICBpZiAoIWlzUXVlcnlTdGF0ZVN1Y2Nlc3MocykgfHwgIXRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uZ2V0KSB7XG4gICAgICByZXR1cm4gb2YocykgYXMgT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPERhdGE+PjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5pZCh7IGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgcmVzcG9uc2U6IHMucmVzcG9uc2UgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5XG4gICAgICAuZ2V0KHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCBpZCwgcmVzcG9uc2U6IHMucmVzcG9uc2UsIHN0b3JlOiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc3RvcmUgfSlcbiAgICAgIC5waXBlKG1hcCgodikgPT4gKHsgLi4ucywgcmVzcG9uc2U6IHYgfSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVN0YXRlKHM6IFF1ZXJ5U3RhdGU8UmVzcG9uc2U+KSB7XG4gICAgLy8gV2UgbmVlZCB0byB1c2UgdW50cmFja2VkIGhlcmUgdG8gYXZvaWQgQW5ndWxhcidzIFwiYWxsb3dTaWduYWxXcml0ZXMgaXMgZmFsc2VcIiBlcnJvciB3aGVuIGV4ZWN1dGluZyBxdWVyaWVzIGluc2lkZSBBbmd1bGFyJ3MgY29tcHV0ZWQvZWZmZWN0IHNpZ25hbCBmdW5jdGlvbnMuXG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3N0YXRlJC5uZXh0KHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21vY2tSZXF1ZXN0KGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzIHwgdW5kZWZpbmVkLCBtZXRhOiBRdWVyeVN0YXRlTWV0YSwgb3B0aW9uczogRXhlY3V0ZVF1ZXJ5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5fYXJndW1lbnRzPy5tb2NrKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRlbGF5ID0gMjAwLCBlcnJvciwgcmVzcG9uc2UsIHJldHJ5SW50b1Jlc3BvbnNlID0gZmFsc2UsIHByb2dyZXNzIH0gPSB0aGlzLl9hcmd1bWVudHMubW9jaztcbiAgICBjb25zdCBwcm9ncmVzc0ZpbGVTaXplID0gcHJvZ3Jlc3M/LmZpbGVTaXplID8/IDEwMDAwMDA7XG4gICAgY29uc3QgcHJvZ3Jlc3NFdmVudFR5cGUgPSBwcm9ncmVzcz8uZXZlbnRUeXBlID8/ICd1cGxvYWQnO1xuICAgIGNvbnN0IHByb2dyZXNzRXZlbnRDb3VudCA9IHByb2dyZXNzPy5ldmVudENvdW50ID8/IDU7XG4gICAgY29uc3QgcHJvZ3Jlc3NPbWl0VG90YWwgPSBwcm9ncmVzcz8ub21pdFRvdGFsID8/IGZhbHNlO1xuICAgIGNvbnN0IG9taXRQYXJ0aWFsVGV4dCA9IHByb2dyZXNzPy5vbWl0UGFydGlhbFRleHQgPz8gZmFsc2U7XG5cbiAgICBjb25zdCBmaW5hbFJlc29sdmVNb2NrID0gKCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHsgZXJyb3IsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdmYWlsdXJlJyB9LCBtZXRhLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgeyByZXNwb25zZTogcmVzcG9uc2UgYXMgUmVzcG9uc2UsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdzdWNjZXNzJyB9LFxuICAgICAgICBtZXRhLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICBpbnRlcnZhbChkZWxheSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChhKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gcHJvZ3Jlc3NFdmVudENvdW50ICsgMSkge1xuICAgICAgICAgICAgICBmaW5hbFJlc29sdmVNb2NrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5taW4ocHJvZ3Jlc3NGaWxlU2l6ZSAqIGEsIHByb2dyZXNzRmlsZVNpemUgKiBwcm9ncmVzc0V2ZW50Q291bnQpO1xuICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGN1cnJlbnQgLyAocHJvZ3Jlc3NGaWxlU2l6ZSAqIHByb2dyZXNzRXZlbnRDb3VudCkpICogMTAwO1xuXG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHByb2dyZXNzRXZlbnRUeXBlID09PSAndXBsb2FkJyA/ICd1cGxvYWQtcHJvZ3Jlc3MnIDogJ2Rvd25sb2FkLXByb2dyZXNzJyxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgICAgICAgICBwcm9ncmVzczogeyBjdXJyZW50LCAuLi4ocHJvZ3Jlc3NPbWl0VG90YWwgPyB7fSA6IHsgcGVyY2VudGFnZSwgdG90YWw6IHByb2dyZXNzRmlsZVNpemUgfSkgfSxcbiAgICAgICAgICAgICAgICAgIHBhcnRpYWxUZXh0OiBvbWl0UGFydGlhbFRleHQgPyB1bmRlZmluZWQgOiBgUGFydGlhbCB0ZXh0ICR7YX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgdGFrZVdoaWxlKChhKSA9PiBhIDwgcHJvZ3Jlc3NFdmVudENvdW50ICsgMSwgdHJ1ZSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSBpZiAocmV0cnlJbnRvUmVzcG9uc2UpIHtcbiAgICAgIGludGVydmFsKGRlbGF5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGEpID0+IHtcbiAgICAgICAgICAgIGlmIChhID09PSAzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzb2x2ZU1vY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFNb2RpZmllZCA9IGEgKyAxO1xuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZGVsYXktcmV0cnknLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IDEwMDAgKyAxMDAwICogYU1vZGlmaWVkLFxuICAgICAgICAgICAgICAgICAgcmV0cnlOdW1iZXI6IGFNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25BYm9ydCQpLFxuICAgICAgICAgIHRha2VXaGlsZSgoYSkgPT4gYSA8IDMsIHRydWUpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZXIoZGVsYXkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiBmaW5hbFJlc29sdmVNb2NrKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9hZGREZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKSB7XG4gICAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKys7XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzQ2hhbmdlZCQubmV4dCh0aGlzLl9kZXBlbmRlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZW1vdmVEZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGVwZW5kZW50c1t0Tm9kZUluZGV4XS0tO1xuXG4gICAgaWYgKGNvdW50IDw9IDEpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHRoaXMuX2RlcGVuZGVudHNDaGFuZ2VkJC5uZXh0KHRoaXMuX2RlcGVuZGVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2hhc0RlcGVuZGVudHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2RlcGVuZGVudHMpLmxlbmd0aCA+IDA7XG4gIH1cbn1cbiJdfQ==
|