@kaspernj/api-maker 1.0.2129 → 1.0.2130

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.
@@ -1,7 +1,7 @@
1
1
  export default useCollection;
2
2
  export type UseCollectionResult = {
3
3
  models: Array<import("./base-model.js").default>;
4
- modelIdsCacheString: Array<number | string>;
4
+ modelIdsCacheString: string;
5
5
  overallCount: number;
6
6
  query: import("./collection.js").default<any>;
7
7
  queryName: string;
@@ -14,63 +14,5 @@ export type UseCollectionResult = {
14
14
  showNoRecordsAvailableContent: false | import("react").ReactNode;
15
15
  showNoRecordsFoundContent: false | import("react").ReactNode;
16
16
  };
17
- /**
18
- * @typedef {object} UseCollectionResult
19
- * @property {Array<import("./base-model.js").default>} models
20
- * @property {Array<number | string>} modelIdsCacheString
21
- * @property {number} overallCount
22
- * @property {import("./collection.js").default} query
23
- * @property {string} queryName
24
- * @property {string} queryPerKey
25
- * @property {string} queryQName
26
- * @property {string} querySName
27
- * @property {string} queryPageName
28
- * @property {import("./result.js").default} result
29
- * @property {string[]} searchParams
30
- * @property {false | import("react").ReactNode} showNoRecordsAvailableContent
31
- * @property {false | import("react").ReactNode} showNoRecordsFoundContent
32
- */
33
- /**
34
- * @param {object} props
35
- * @param {Record<string, string[]>} props.abilities
36
- * @param {import("./collection.js").default} props.collection
37
- * @param {Record<string, any>} props.defaultParams
38
- * @param {string[]} props.groupBy
39
- * @param {function() : boolean} props.ifCondition
40
- * @param {number} props.limit
41
- * @param {typeof import("./base-model.js").default} props.modelClass
42
- * @param {function() : import("react").ReactNode} props.noRecordsAvailableContent
43
- * @param {function() : import("react").ReactNode} props.noRecordsFoundContent
44
- * @param {function() : void} props.onModelsLoaded
45
- * @param {boolean} props.pagination
46
- * @param {string[]} props.preloads
47
- * @param {function({query: import("./collection.js").default}) : import("./collection.js").default} props.queryMethod
48
- * @param {string} props.queryName
49
- * @param {Record<string, any>} props.ransack
50
- * @param {Record<string, string[]>} props.select
51
- * @param {Record<string, string[]>} props.selectColumns
52
- * @param {any[]} cacheKeys
53
- * @returns {UseCollectionResult & Record<string, any>}
54
- */
55
- declare function useCollection(props: {
56
- abilities: Record<string, string[]>;
57
- collection: import("./collection.js").default<any>;
58
- defaultParams: Record<string, any>;
59
- groupBy: string[];
60
- ifCondition: () => boolean;
61
- limit: number;
62
- modelClass: typeof import("./base-model.js").default;
63
- noRecordsAvailableContent: () => import("react").ReactNode;
64
- noRecordsFoundContent: () => import("react").ReactNode;
65
- onModelsLoaded: () => void;
66
- pagination: boolean;
67
- preloads: string[];
68
- queryMethod: (arg0: {
69
- query: import("./collection.js").default<any>;
70
- }) => import("./collection.js").default<any>;
71
- queryName: string;
72
- ransack: Record<string, any>;
73
- select: Record<string, string[]>;
74
- selectColumns: Record<string, string[]>;
75
- }, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
17
+ declare function useCollection(props: any, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
76
18
  //# sourceMappingURL=use-collection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;kBACtB,MAAM;;eAEN,MAAM;iBACN,MAAM;gBACN,MAAM;gBACN,MAAM;mBACN,MAAM;YACN,OAAO,aAAa,EAAE,OAAO;kBAC7B,MAAM,EAAE;mCACR,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;+BACjC,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;;AAd/C;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,sCApBG;IAAwC,SAAS,EAAzC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACiB,UAAU,EAAnD,sCAAiC;IACN,aAAa,EAAxC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACH,OAAO,EAAvB,MAAM,EAAE;IACoB,WAAW,EAAvC,MAAa,OAAO;IACN,KAAK,EAAnB,MAAM;IAC0C,UAAU,EAA1D,cAAc,iBAAiB,EAAE,OAAO;IACM,yBAAyB,EAAvE,MAAa,OAAO,OAAO,EAAE,SAAS;IACQ,qBAAqB,EAAnE,MAAa,OAAO,OAAO,EAAE,SAAS;IACb,cAAc,EAAvC,MAAa,IAAI;IACF,UAAU,EAAzB,OAAO;IACS,QAAQ,EAAxB,MAAM,EAAE;IACwF,WAAW,EAA3G,CAAS,IAA0C,EAA1C;QAAC,KAAK,EAAE,sCAAiC,CAAA;KAAC,KAAI,sCAAiC;IAC1E,SAAS,EAAvB,MAAM;IACqB,OAAO,EAAlC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACa,MAAM,EAAtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACQ,aAAa,EAA7C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAChC,cAAQ,GAAG,EAAE,GACH,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsSrD"}
1
+ {"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,MAAM;kBACN,MAAM;;eAEN,MAAM;iBACN,MAAM;gBACN,MAAM;gBACN,MAAM;mBACN,MAAM;YACN,OAAO,aAAa,EAAE,OAAO;kBAC7B,MAAM,EAAE;mCACR,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;+BACjC,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;;AA8T/C,yGA0DC"}
@@ -1,16 +1,16 @@
1
1
  /* eslint-disable no-unused-vars, no-use-before-define, prefer-object-spread, sort-imports */
2
+ import { ShapeHook, useShapeHook } from "set-state-compare";
2
3
  import debounce from "debounce";
3
4
  import { digg } from "diggerize";
4
5
  import * as inflection from "inflection";
5
6
  import ModelEvents from "./model-events.js";
6
- import { useCallback, useEffect, useMemo, useRef } from "react";
7
+ import { useEffect } from "react";
7
8
  import useCreatedEvent from "./use-created-event.js";
8
- import useShape from "./use-shape.js";
9
9
  import useQueryParams from "on-location-changed/build/use-query-params.js";
10
10
  /**
11
11
  * @typedef {object} UseCollectionResult
12
12
  * @property {Array<import("./base-model.js").default>} models
13
- * @property {Array<number | string>} modelIdsCacheString
13
+ * @property {string} modelIdsCacheString
14
14
  * @property {number} overallCount
15
15
  * @property {import("./collection.js").default} query
16
16
  * @property {string} queryName
@@ -45,89 +45,136 @@ import useQueryParams from "on-location-changed/build/use-query-params.js";
45
45
  * @param {any[]} cacheKeys
46
46
  * @returns {UseCollectionResult & Record<string, any>}
47
47
  */
48
- const useCollection = (props, cacheKeys = []) => {
49
- const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName: initialQueryName, ransack, select = {}, selectColumns, ...restProps } = props;
50
- if (Object.keys(restProps).length > 0) {
51
- throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
48
+ /** Hook state container for useCollection. */
49
+ class UseCollectionShapeHook extends ShapeHook {
50
+ /** Constructor. */
51
+ constructor(props) {
52
+ super(props);
53
+ this.loadModelsGeneration = 0;
54
+ this.loadOverallCountGeneration = 0;
55
+ this.queryParams = undefined;
52
56
  }
53
- const s = useShape(props);
54
- const queryName = initialQueryName || digg(modelClass.modelClassData(), "collectionKey");
55
- const loadModelsGenerationRef = useRef(0);
56
- const loadOverallCountGenerationRef = useRef(0);
57
- s.meta.queryParams = useQueryParams();
58
- const hasQParams = useCallback(() => {
59
- if (s.s.queryQName in s.m.queryParams)
60
- return true;
61
- return false;
62
- }, []);
63
- const qParams = useCallback(() => {
64
- if (hasQParams())
65
- return JSON.parse(digg(s.m.queryParams, s.s.queryQName));
66
- return {};
67
- }, []);
68
- s.useStates({
69
- models: undefined,
70
- overallCount: undefined,
71
- query: undefined,
72
- queryName,
73
- queryPerKey: `${queryName}_per`,
74
- queryQName: `${queryName}_q`,
75
- querySName: `${queryName}_s`,
76
- queryPageName: `${queryName}_page`,
77
- result: undefined,
78
- searchParams: undefined,
79
- showNoRecordsAvailableContent: false,
80
- showNoRecordsFoundContent: false
81
- });
82
- s.useStates({
83
- qParams: () => qParams()
84
- });
85
- let modelIdsCacheString;
86
- if (s.s.models === undefined) {
87
- modelIdsCacheString = "models-undefined";
57
+ /** @returns {string} */
58
+ queryName() {
59
+ return this.p.queryName || digg(this.p.modelClass.modelClassData(), "collectionKey");
60
+ }
61
+ /** @returns {string} */
62
+ queryPerKey() {
63
+ return `${this.queryName()}_per`;
64
+ }
65
+ /** @returns {string} */
66
+ queryQName() {
67
+ return `${this.queryName()}_q`;
68
+ }
69
+ /** @returns {string} */
70
+ querySName() {
71
+ return `${this.queryName()}_s`;
72
+ }
73
+ /** @returns {string} */
74
+ queryPageName() {
75
+ return `${this.queryName()}_page`;
88
76
  }
89
- else if (s.s.models.length === 0) {
90
- modelIdsCacheString = "no-models";
77
+ /** @returns {string} */
78
+ modelIdsCacheString() {
79
+ if (this.s.models === undefined) {
80
+ return "models-undefined";
81
+ }
82
+ else if (this.s.models.length === 0) {
83
+ return "no-models";
84
+ }
85
+ else {
86
+ return this.s.models.map((model) => model.cacheKey())?.join("---");
87
+ }
88
+ }
89
+ /** @returns {Function & {clear?: () => void}} */
90
+ loadModelsDebounce() {
91
+ return this.cache("loadModelsDebounce", () => debounce(() => this.loadModels()));
92
+ }
93
+ /** @param {Record<string, any>} args */
94
+ showNoRecordsAvailableContent(args) {
95
+ let models, overallCount;
96
+ if (args.models !== undefined) {
97
+ models = args.models;
98
+ }
99
+ else if (this.s.models !== undefined) {
100
+ models = this.s.models;
101
+ }
102
+ if (args.overallCount !== undefined) {
103
+ overallCount = args.overallCount;
104
+ }
105
+ else if (this.s.overallCount !== undefined) {
106
+ overallCount = this.s.overallCount;
107
+ }
108
+ if (models === undefined || overallCount === undefined || this.p.noRecordsAvailableContent === undefined)
109
+ return false;
110
+ if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
111
+ return true;
91
112
  }
92
- else {
93
- modelIdsCacheString = s.s.models.map((model) => model.cacheKey())?.join("---");
113
+ /** @param {Record<string, any>} args */
114
+ showNoRecordsFoundContent(args) {
115
+ let models, overallCount;
116
+ if (args.models !== undefined) {
117
+ models = args.models;
118
+ }
119
+ else if (this.s.models !== undefined) {
120
+ models = this.s.models;
121
+ }
122
+ if (args.overallCount !== undefined) {
123
+ overallCount = args.overallCount;
124
+ }
125
+ else if (this.s.overallCount !== undefined) {
126
+ overallCount = this.s.overallCount;
127
+ }
128
+ if (models === undefined || this.p.noRecordsFoundContent === undefined)
129
+ return false;
130
+ // Dont show noRecordsAvailableContent together with noRecordsAvailableContent
131
+ if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
132
+ return false;
133
+ if (models.length === 0 && this.p.noRecordsFoundContent)
134
+ return true;
94
135
  }
95
- const loadOverallCount = useCallback(async () => {
136
+ /** @returns {Promise<void>} */
137
+ loadOverallCount = async () => {
96
138
  // Ignore late overall-count responses once a newer load cycle has started or the hook unmounted.
97
- const loadOverallCountGeneration = loadOverallCountGenerationRef.current + 1;
98
- loadOverallCountGenerationRef.current = loadOverallCountGeneration;
99
- const baseQuery = s.p.collection || s.p.modelClass.all();
139
+ const loadOverallCountGeneration = this.loadOverallCountGeneration + 1;
140
+ this.loadOverallCountGeneration = loadOverallCountGeneration;
141
+ const baseQuery = this.p.collection || this.p.modelClass.all();
100
142
  const overallCount = await baseQuery.count();
101
- if (loadOverallCountGeneration != loadOverallCountGenerationRef.current)
143
+ if (!this.isMounted() || loadOverallCountGeneration != this.loadOverallCountGeneration)
102
144
  return;
103
- s.set({
145
+ this.setState({
104
146
  overallCount,
105
- showNoRecordsAvailableContent: showNoRecordsAvailableContent({ overallCount }),
106
- showNoRecordsFoundContent: showNoRecordsFoundContent({ overallCount })
147
+ showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ overallCount }),
148
+ showNoRecordsFoundContent: this.showNoRecordsFoundContent({ overallCount })
107
149
  });
108
- }, []);
109
- const loadQParams = useCallback(() => {
110
- const qParamsToSet = hasQParams() ? qParams() : Object.assign({}, s.props.defaultParams);
150
+ };
151
+ /** @returns {void} */
152
+ loadQParams() {
153
+ let qParamsToSet = Object.assign({}, this.p.defaultParams);
111
154
  const searchParams = [];
112
- if (s.m.queryParams[s.s.querySName]) {
113
- for (const rawSearchParam of s.m.queryParams[s.s.querySName]) {
155
+ if (this.queryParams && this.queryQName() in this.queryParams) {
156
+ qParamsToSet = JSON.parse(digg(this.queryParams, this.queryQName()));
157
+ }
158
+ if (this.queryParams?.[this.querySName()]) {
159
+ for (const rawSearchParam of this.queryParams[this.querySName()]) {
114
160
  const parsedSearchParam = JSON.parse(rawSearchParam);
115
161
  searchParams.push(parsedSearchParam);
116
162
  }
117
163
  }
118
- s.set({
164
+ this.setState({
119
165
  qParams: qParamsToSet,
120
166
  searchParams
121
167
  });
122
- }, []);
123
- const loadModels = useCallback(async () => {
168
+ }
169
+ /** @returns {Promise<void>} */
170
+ loadModels = async () => {
124
171
  // Only the newest collection request is allowed to update state after navigation/filter changes.
125
- const loadModelsGeneration = loadModelsGenerationRef.current + 1;
126
- loadModelsGenerationRef.current = loadModelsGeneration;
127
- let query = s.props.collection?.clone() || s.p.modelClass.ransack();
128
- if (s.props.pagination) {
129
- const page = s.m.queryParams[s.s.queryPageName] || 1;
130
- let per = s.m.queryParams[s.s.queryPerKey] || 30;
172
+ const loadModelsGeneration = this.loadModelsGeneration + 1;
173
+ this.loadModelsGeneration = loadModelsGeneration;
174
+ let query = this.p.collection?.clone() || this.p.modelClass.ransack();
175
+ if (this.p.pagination) {
176
+ const page = this.queryParams?.[this.queryPageName()] || 1;
177
+ let per = this.queryParams?.[this.queryPerKey()] || 30;
131
178
  if (per == "all") {
132
179
  per = 999_999_999;
133
180
  }
@@ -136,154 +183,162 @@ const useCollection = (props, cacheKeys = []) => {
136
183
  }
137
184
  query.page(page).per(per);
138
185
  }
139
- if (s.props.groupBy)
140
- query = query.groupBy(...s.p.groupBy);
186
+ if (this.p.groupBy)
187
+ query = query.groupBy(...this.p.groupBy);
141
188
  query = query
142
- .ransack(s.s.qParams)
143
- .search(s.s.searchParams)
144
- .searchKey(s.s.queryQName)
145
- .pageKey(s.s.queryPageName)
146
- .perKey(s.s.queryPerKey);
147
- if (s.props.abilities)
148
- query.abilities(s.p.abilities);
149
- if (s.props.limit !== undefined)
150
- query.limit(s.p.limit);
151
- if (s.props.preloads)
152
- query.preload(s.p.preloads);
153
- if (s.props.ransack)
154
- query.ransack(s.props.ransack);
155
- if (s.props.select)
156
- query.select(s.p.select);
157
- if (s.props.selectColumns)
158
- query.selectColumns(s.p.selectColumns);
189
+ .ransack(this.s.qParams)
190
+ .search(this.s.searchParams)
191
+ .searchKey(this.queryQName())
192
+ .pageKey(this.queryPageName())
193
+ .perKey(this.queryPerKey());
194
+ if (this.p.abilities)
195
+ query.abilities(this.p.abilities);
196
+ if (this.p.limit !== undefined)
197
+ query.limit(this.p.limit);
198
+ if (this.p.preloads)
199
+ query.preload(this.p.preloads);
200
+ if (this.p.ransack)
201
+ query.ransack(this.p.ransack);
202
+ if (this.p.select)
203
+ query.select(this.p.select);
204
+ if (this.p.selectColumns)
205
+ query.selectColumns(this.p.selectColumns);
159
206
  let result;
160
- if (s.props.queryMethod) {
161
- result = await s.p.queryMethod({ query });
207
+ if (this.p.queryMethod) {
208
+ result = await this.p.queryMethod({ query });
162
209
  }
163
210
  else {
164
211
  result = await query.result();
165
212
  }
166
213
  const models = result.models();
167
- if (loadModelsGeneration != loadModelsGenerationRef.current)
214
+ if (!this.isMounted() || loadModelsGeneration != this.loadModelsGeneration)
168
215
  return;
169
- if (s.props.onModelsLoaded) {
170
- s.p.onModelsLoaded({
216
+ if (this.p.onModelsLoaded) {
217
+ this.p.onModelsLoaded({
171
218
  models,
172
- qParams: s.s.qParams,
219
+ qParams: this.s.qParams,
173
220
  query,
174
221
  result
175
222
  });
176
223
  }
177
- s.set({
178
- models: result.models(),
224
+ this.setState({
225
+ models,
179
226
  query,
180
227
  result,
181
- showNoRecordsAvailableContent: showNoRecordsAvailableContent({ models }),
182
- showNoRecordsFoundContent: showNoRecordsFoundContent({ models })
228
+ showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ models }),
229
+ showNoRecordsFoundContent: this.showNoRecordsFoundContent({ models })
183
230
  });
184
- }, []);
185
- const loadModelsDebounce = useCallback(debounce(loadModels), []);
186
- const onModelDestroyed = useCallback((args) => {
187
- s.set({
188
- models: s.s.models.filter((model) => model.id() != args.model.id())
231
+ };
232
+ /** @param {{model: import("./base-model.js").default}} args */
233
+ onModelDestroyed(args) {
234
+ const destroyedModel = digg(args, "model");
235
+ this.setState({
236
+ models: this.s.models.filter((model) => model.id() != destroyedModel.id())
189
237
  });
190
- }, []);
191
- const onModelUpdated = useCallback((args) => {
238
+ }
239
+ /** @param {{model: import("./base-model.js").default}} args */
240
+ onModelUpdated(args) {
192
241
  const updatedModel = digg(args, "model");
193
- const foundModel = s.s.models.find((model) => model.id() == updatedModel.id());
242
+ const foundModel = this.s.models.find((model) => model.id() == updatedModel.id());
194
243
  if (foundModel)
195
- loadModelsDebounce();
196
- }, []);
197
- const showNoRecordsAvailableContent = useCallback((args) => {
198
- let models, overallCount;
199
- if (args.models !== undefined) {
200
- models = args.models;
201
- }
202
- else if (s.s.models !== undefined) {
203
- models = s.s.models;
204
- }
205
- if (args.overallCount !== undefined) {
206
- overallCount = args.overallCount;
207
- }
208
- else if (s.s.overallCount !== undefined) {
209
- overallCount = s.s.overallCount;
210
- }
211
- if (models === undefined || overallCount === undefined || s.p.noRecordsAvailableContent === undefined)
212
- return false;
213
- if (models.length === 0 && overallCount === 0 && s.p.noRecordsAvailableContent)
214
- return true;
215
- }, []);
216
- const showNoRecordsFoundContent = useCallback((args) => {
217
- let models, overallCount;
218
- if (args.models !== undefined) {
219
- models = args.models;
220
- }
221
- else if (s.s.models !== undefined) {
222
- models = s.s.models;
223
- }
224
- if (args.overallCount !== undefined) {
225
- overallCount = args.overallCount;
226
- }
227
- else if (s.s.overallCount !== undefined) {
228
- overallCount = s.s.overallCount;
229
- }
230
- if (models === undefined || s.props.noRecordsFoundContent === undefined)
231
- return false;
232
- // Dont show noRecordsAvailableContent together with noRecordsAvailableContent
233
- if (models.length === 0 && overallCount === 0 && s.props.noRecordsAvailableContent)
234
- return false;
235
- if (models.length === 0 && s.props.noRecordsFoundContent)
236
- return true;
237
- }, []);
238
- const onCreated = useCallback(() => {
239
- loadModelsDebounce();
240
- }, []);
241
- // Collection loading has to wait until mount so fast responses cannot get stranded in ShapeHook's pre-mount queue.
242
- useEffect(() => {
243
- if (!("ifCondition" in s.props) || s.props.ifCondition) {
244
- loadQParams();
245
- loadModels();
246
- }
247
- }, [
248
- modelClass,
249
- s.props.ifCondition,
250
- s.s.queryName,
251
- s.m.queryParams[s.s.queryQName],
252
- s.m.queryParams[s.s.queryPageName],
253
- s.m.queryParams[s.s.queryPerKey],
254
- s.m.queryParams[s.s.querySName],
255
- collection
256
- ].concat(cacheKeys));
257
- useEffect(() => {
258
- if (s.props.noRecordsAvailableContent) {
259
- loadOverallCount();
260
- }
261
- }, [modelClass]);
262
- useCreatedEvent(s.p.modelClass, onCreated);
263
- // Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
264
- useEffect(() => () => {
265
- loadModelsGenerationRef.current += 1;
266
- loadOverallCountGenerationRef.current += 1;
267
- }, []);
268
- useEffect(() => {
269
- const connections = [];
270
- if (s.s.models) {
271
- for (const model of s.s.models) {
272
- connections.push(ModelEvents.connectUpdated(model, onModelUpdated));
273
- connections.push(ModelEvents.connectDestroyed(model, onModelDestroyed));
244
+ this.loadModelsDebounce()();
245
+ }
246
+ /** @returns {void} */
247
+ onCreated() {
248
+ this.loadModelsDebounce()();
249
+ }
250
+ /** @returns {void} */
251
+ setup() {
252
+ this.useStates({
253
+ models: undefined,
254
+ overallCount: undefined,
255
+ qParams: {},
256
+ query: undefined,
257
+ result: undefined,
258
+ searchParams: undefined,
259
+ showNoRecordsAvailableContent: false,
260
+ showNoRecordsFoundContent: false
261
+ });
262
+ this.setInstance({ queryParams: useQueryParams() });
263
+ // Collection loading has to wait until mount so fast responses cannot get stranded in ShapeHook's pre-mount queue.
264
+ useEffect(() => {
265
+ if (!("ifCondition" in this.props) || this.p.ifCondition) {
266
+ this.loadQParams();
267
+ this.loadModels();
274
268
  }
275
- }
276
- return () => {
277
- for (const connection of connections) {
278
- connection.unsubscribe();
269
+ }, [
270
+ this.p.modelClass,
271
+ this.p.ifCondition,
272
+ this.queryName(),
273
+ this.queryParams?.[this.queryQName()],
274
+ this.queryParams?.[this.queryPageName()],
275
+ this.queryParams?.[this.queryPerKey()],
276
+ this.queryParams?.[this.querySName()],
277
+ this.p.collection
278
+ ].concat(this.p.cacheKeys));
279
+ useEffect(() => {
280
+ if (this.p.noRecordsAvailableContent) {
281
+ this.loadOverallCount();
282
+ }
283
+ }, [this.p.modelClass]);
284
+ useCreatedEvent(this.p.modelClass, () => this.onCreated());
285
+ // Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
286
+ useEffect(() => () => {
287
+ this.loadModelsGeneration += 1;
288
+ this.loadOverallCountGeneration += 1;
289
+ this.loadModelsDebounce().clear?.();
290
+ }, []);
291
+ useEffect(() => {
292
+ const connections = [];
293
+ if (this.s.models) {
294
+ for (const model of this.s.models) {
295
+ connections.push(ModelEvents.connectUpdated(model, (args) => this.onModelUpdated(args)));
296
+ connections.push(ModelEvents.connectDestroyed(model, (args) => this.onModelDestroyed(args)));
297
+ }
279
298
  }
280
- };
281
- }, [modelIdsCacheString]);
282
- const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, s.state));
283
- const modelVariableName = inflection.pluralize(inflection.camelize(modelClass.modelClassData().name, true));
284
- result.modelIdsCacheString = modelIdsCacheString;
285
- result[modelVariableName] = s.s.models;
299
+ return () => {
300
+ for (const connection of connections) {
301
+ connection.unsubscribe();
302
+ }
303
+ };
304
+ }, [this.modelIdsCacheString()]);
305
+ }
306
+ }
307
+ const useCollection = (props, cacheKeys = []) => {
308
+ const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName, ransack, select = {}, selectColumns, ...restProps } = props;
309
+ if (Object.keys(restProps).length > 0) {
310
+ throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
311
+ }
312
+ const shapeHook = useShapeHook(UseCollectionShapeHook, {
313
+ abilities,
314
+ cacheKeys,
315
+ collection,
316
+ defaultParams,
317
+ groupBy,
318
+ ifCondition,
319
+ limit,
320
+ modelClass,
321
+ noRecordsAvailableContent,
322
+ noRecordsFoundContent,
323
+ onModelsLoaded,
324
+ pagination,
325
+ preloads,
326
+ queryMethod,
327
+ queryName,
328
+ ransack,
329
+ select,
330
+ selectColumns
331
+ });
332
+ const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, shapeHook.state));
333
+ const modelVariableName = inflection.pluralize(inflection.camelize(shapeHook.p.modelClass.modelClassData().name, true));
334
+ result.modelIdsCacheString = shapeHook.modelIdsCacheString();
335
+ result.queryName = shapeHook.queryName();
336
+ result.queryPerKey = shapeHook.queryPerKey();
337
+ result.queryQName = shapeHook.queryQName();
338
+ result.querySName = shapeHook.querySName();
339
+ result.queryPageName = shapeHook.queryPageName();
340
+ result[modelVariableName] = shapeHook.s.models;
286
341
  return result;
287
342
  };
288
343
  export default useCollection;
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzdELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sY0FBYyxNQUFNLCtDQUErQyxDQUFBO0FBRTFFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxFQUNKLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxFQUNMLFVBQVUsRUFDVix5QkFBeUIsR0FBRyxTQUFTLEVBQ3JDLHFCQUFxQixHQUFHLFNBQVMsRUFDakMsY0FBYyxFQUNkLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFFBQVEsR0FBRyxFQUFFLEVBQ2IsV0FBVyxFQUNYLFNBQVMsRUFBRSxnQkFBZ0IsRUFDM0IsT0FBTyxFQUNQLE1BQU0sR0FBRyxFQUFFLEVBQ1gsYUFBYSxFQUNiLEdBQUcsU0FBUyxFQUNiLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFD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LFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUUzRyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7SUFDaEQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFdEMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxlQUFlLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZSwgcHJlZmVyLW9iamVjdC1zcHJlYWQsIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi91c2UtY3JlYXRlZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlU2hhcGUgZnJvbSBcIi4vdXNlLXNoYXBlLmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VDb2xsZWN0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0Pn0gbW9kZWxzXG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlciB8IHN0cmluZz59IG1vZGVsSWRzQ2FjaGVTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdmVyYWxsQ291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQZXJLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVFOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlTTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UGFnZU5hbWVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yZXN1bHQuanNcIikuZGVmYXVsdH0gcmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzZWFyY2hQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcHJvcGVydHkge2ZhbHNlIHwgaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5hYmlsaXRpZXNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLmNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHMuZGVmYXVsdFBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMuZ3JvdXBCeVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogYm9vbGVhbn0gcHJvcHMuaWZDb25kaXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wcy5saW1pdFxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IHByb3BzLm1vZGVsQ2xhc3NcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gcHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IHByb3BzLm9uTW9kZWxzTG9hZGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLnBhZ2luYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzLnByZWxvYWRzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBwcm9wcy5xdWVyeU1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLnF1ZXJ5TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5yYW5zYWNrXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0Q29sdW1uc1xuICogQHBhcmFtIHthbnlbXX0gY2FjaGVLZXlzXG4gKiBAcmV0dXJucyB7VXNlQ29sbGVjdGlvblJlc3VsdCAmIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IHVzZUNvbGxlY3Rpb24gPSAocHJvcHMsIGNhY2hlS2V5cyA9IFtdKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY29sbGVjdGlvbixcbiAgICBkZWZhdWx0UGFyYW1zLFxuICAgIGdyb3VwQnksXG4gICAgaWZDb25kaXRpb24sXG4gICAgbGltaXQsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9IHVuZGVmaW5lZCxcbiAgICBvbk1vZGVsc0xvYWRlZCxcbiAgICBwYWdpbmF0aW9uID0gZmFsc2UsXG4gICAgcHJlbG9hZHMgPSBbXSxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWU6IGluaXRpYWxRdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QgPSB7fSxcbiAgICBzZWxlY3RDb2x1bW5zLFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHNcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BzIGdpdmVuIHRvIHVzZUNvbGxlY3Rpb246ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHMgPSB1c2VTaGFwZShwcm9wcylcbiAgY29uc3QgcXVlcnlOYW1lID0gaW5pdGlhbFF1ZXJ5TmFtZSB8fCBkaWdnKG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKSwgXCJjb2xsZWN0aW9uS2V5XCIpXG4gIGNvbnN0IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG5cbiAgcy5tZXRhLnF1ZXJ5UGFyYW1zID0gdXNlUXVlcnlQYXJhbXMoKVxuXG4gIGNvbnN0IGhhc1FQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHMucy5xdWVyeVFOYW1lIGluIHMubS5xdWVyeVBhcmFtcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9LCBbXSlcblxuICBjb25zdCBxUGFyYW1zID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChoYXNRUGFyYW1zKCkpIHJldHVybiBKU09OLnBhcnNlKGRpZ2cocy5tLnF1ZXJ5UGFyYW1zLCBzLnMucXVlcnlRTmFtZSkpXG5cbiAgICByZXR1cm4ge31cbiAgfSwgW10pXG5cbiAgcy51c2VTdGF0ZXMoe1xuICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgIG92ZXJhbGxDb3VudDogdW5kZWZpbmVkLFxuICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgcXVlcnlOYW1lLFxuICAgIHF1ZXJ5UGVyS2V5OiBgJHtxdWVyeU5hbWV9X3BlcmAsXG4gICAgcXVlcnlRTmFtZTogYCR7cXVlcnlOYW1lfV9xYCxcbiAgICBxdWVyeVNOYW1lOiBgJHtxdWVyeU5hbWV9X3NgLFxuICAgIHF1ZXJ5UGFnZU5hbWU6IGAke3F1ZXJ5TmFtZX1fcGFnZWAsXG4gICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgc2VhcmNoUGFyYW1zOiB1bmRlZmluZWQsXG4gICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IGZhbHNlXG4gIH0pXG4gIHMudXNlU3RhdGVzKHtcbiAgICBxUGFyYW1zOiAoKSA9PiBxUGFyYW1zKClcbiAgfSlcblxuICBsZXQgbW9kZWxJZHNDYWNoZVN0cmluZ1xuXG4gIGlmIChzLnMubW9kZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBtb2RlbElkc0NhY2hlU3RyaW5nID0gXCJtb2RlbHMtdW5kZWZpbmVkXCJcbiAgfSBlbHNlIGlmIChzLnMubW9kZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIG1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBcIm5vLW1vZGVsc1wiXG4gIH0gZWxzZSB7XG4gICAgbW9kZWxJZHNDYWNoZVN0cmluZyA9IHMucy5tb2RlbHMubWFwKChtb2RlbCkgPT4gbW9kZWwuY2FjaGVLZXkoKSk/LmpvaW4oXCItLS1cIilcbiAgfVxuXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgLy8gSWdub3JlIGxhdGUgb3ZlcmFsbC1jb3VudCByZXNwb25zZXMgb25jZSBhIG5ld2VyIGxvYWQgY3ljbGUgaGFzIHN0YXJ0ZWQgb3IgdGhlIGhvb2sgdW5tb3VudGVkLlxuICAgIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb25SZWYuY3VycmVudCArIDFcblxuICAgIGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQgPSBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblxuXG4gICAgY29uc3QgYmFzZVF1ZXJ5ID0gcy5wLmNvbGxlY3Rpb24gfHwgcy5wLm1vZGVsQ2xhc3MuYWxsKClcbiAgICBjb25zdCBvdmVyYWxsQ291bnQgPSBhd2FpdCBiYXNlUXVlcnkuY291bnQoKVxuXG4gICAgaWYgKGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICE9IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgcy5zZXQoe1xuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHtvdmVyYWxsQ291bnR9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe292ZXJhbGxDb3VudH0pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZFFQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgcVBhcmFtc1RvU2V0ID0gaGFzUVBhcmFtcygpID8gcVBhcmFtcygpIDogT2JqZWN0LmFzc2lnbih7fSwgcy5wcm9wcy5kZWZhdWx0UGFyYW1zKVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IFtdXG5cbiAgICBpZiAocy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSkge1xuICAgICAgZm9yIChjb25zdCByYXdTZWFyY2hQYXJhbSBvZiBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5U05hbWVdKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFBhcmFtID0gSlNPTi5wYXJzZShyYXdTZWFyY2hQYXJhbSlcblxuICAgICAgICBzZWFyY2hQYXJhbXMucHVzaChwYXJzZWRTZWFyY2hQYXJhbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBxUGFyYW1zOiBxUGFyYW1zVG9TZXQsXG4gICAgICBzZWFyY2hQYXJhbXNcbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkTW9kZWxzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIC8vIE9ubHkgdGhlIG5ld2VzdCBjb2xsZWN0aW9uIHJlcXVlc3QgaXMgYWxsb3dlZCB0byB1cGRhdGUgc3RhdGUgYWZ0ZXIgbmF2aWdhdGlvbi9maWx0ZXIgY2hhbmdlcy5cbiAgICBjb25zdCBsb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmLmN1cnJlbnQgKyAxXG5cbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ID0gbG9hZE1vZGVsc0dlbmVyYXRpb25cbiAgICBsZXQgcXVlcnkgPSBzLnByb3BzLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAocy5wcm9wcy5wYWdpbmF0aW9uKSB7XG4gICAgICBjb25zdCBwYWdlID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSB8fCAxXG4gICAgICBsZXQgcGVyID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBlcktleV0gfHwgMzBcblxuICAgICAgaWYgKHBlciA9PSBcImFsbFwiKSB7XG4gICAgICAgIHBlciA9IDk5OV85OTlfOTk5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXIgPSBOdW1iZXIocGVyKVxuICAgICAgfVxuXG4gICAgICBxdWVyeS5wYWdlKHBhZ2UpLnBlcihwZXIpXG4gICAgfVxuXG4gICAgaWYgKHMucHJvcHMuZ3JvdXBCeSkgcXVlcnkgPSBxdWVyeS5ncm91cEJ5KC4uLnMucC5ncm91cEJ5KVxuXG4gICAgcXVlcnkgPSBxdWVyeVxuICAgICAgLnJhbnNhY2socy5zLnFQYXJhbXMpXG4gICAgICAuc2VhcmNoKHMucy5zZWFyY2hQYXJhbXMpXG4gICAgICAuc2VhcmNoS2V5KHMucy5xdWVyeVFOYW1lKVxuICAgICAgLnBhZ2VLZXkocy5zLnF1ZXJ5UGFnZU5hbWUpXG4gICAgICAucGVyS2V5KHMucy5xdWVyeVBlcktleSlcblxuICAgIGlmIChzLnByb3BzLmFiaWxpdGllcykgcXVlcnkuYWJpbGl0aWVzKHMucC5hYmlsaXRpZXMpXG4gICAgaWYgKHMucHJvcHMubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnkubGltaXQocy5wLmxpbWl0KVxuICAgIGlmIChzLnByb3BzLnByZWxvYWRzKSBxdWVyeS5wcmVsb2FkKHMucC5wcmVsb2FkcylcbiAgICBpZiAocy5wcm9wcy5yYW5zYWNrKSBxdWVyeS5yYW5zYWNrKHMucHJvcHMucmFuc2FjaylcbiAgICBpZiAocy5wcm9wcy5zZWxlY3QpIHF1ZXJ5LnNlbGVjdChzLnAuc2VsZWN0KVxuICAgIGlmIChzLnByb3BzLnNlbGVjdENvbHVtbnMpIHF1ZXJ5LnNlbGVjdENvbHVtbnMocy5wLnNlbGVjdENvbHVtbnMpXG5cbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAocy5wcm9wcy5xdWVyeU1ldGhvZCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcy5wLnF1ZXJ5TWV0aG9kKHtxdWVyeX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LnJlc3VsdCgpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzID0gcmVzdWx0Lm1vZGVscygpXG5cbiAgICBpZiAobG9hZE1vZGVsc0dlbmVyYXRpb24gIT0gbG9hZE1vZGVsc0dlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBpZiAocy5wcm9wcy5vbk1vZGVsc0xvYWRlZCkge1xuICAgICAgcy5wLm9uTW9kZWxzTG9hZGVkKHtcbiAgICAgICAgbW9kZWxzLFxuICAgICAgICBxUGFyYW1zOiBzLnMucVBhcmFtcyxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHJlc3VsdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHJlc3VsdC5tb2RlbHMoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgcmVzdWx0LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHttb2RlbHN9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe21vZGVsc30pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZE1vZGVsc0RlYm91bmNlID0gdXNlQ2FsbGJhY2soZGVib3VuY2UobG9hZE1vZGVscyksIFtdKVxuICBjb25zdCBvbk1vZGVsRGVzdHJveWVkID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHMucy5tb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gbW9kZWwuaWQoKSAhPSBhcmdzLm1vZGVsLmlkKCkpXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25Nb2RlbFVwZGF0ZWQgPSB1c2VDYWxsYmFjaygoYXJncykgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGRpZ2coYXJncywgXCJtb2RlbFwiKVxuICAgIGNvbnN0IGZvdW5kTW9kZWwgPSBzLnMubW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pZCgpID09IHVwZGF0ZWRNb2RlbC5pZCgpKVxuXG4gICAgaWYgKGZvdW5kTW9kZWwpIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgb3ZlcmFsbENvdW50ID09PSB1bmRlZmluZWQgfHwgcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9LCBbXSlcblxuICBjb25zdCBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgcy5wcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG5cbiAgICAvLyBEb250IHNob3cgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCB0b2dldGhlciB3aXRoIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBvdmVyYWxsQ291bnQgPT09IDAgJiYgcy5wcm9wcy5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBzLnByb3BzLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCkgcmV0dXJuIHRydWVcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25DcmVhdGVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIC8vIENvbGxlY3Rpb24gbG9hZGluZyBoYXMgdG8gd2FpdCB1bnRpbCBtb3VudCBzbyBmYXN0IHJlc3BvbnNlcyBjYW5ub3QgZ2V0IHN0cmFuZGVkIGluIFNoYXBlSG9vaydzIHByZS1tb3VudCBxdWV1ZS5cbiAgdXNlRWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGlmICghKFwiaWZDb25kaXRpb25cIiBpbiBzLnByb3BzKSB8fCBzLnByb3BzLmlmQ29uZGl0aW9uKSB7XG4gICAgICAgIGxvYWRRUGFyYW1zKClcbiAgICAgICAgbG9hZE1vZGVscygpXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcy5wcm9wcy5pZkNvbmRpdGlvbixcbiAgICAgIHMucy5xdWVyeU5hbWUsXG4gICAgICBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5UU5hbWVdLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSxcbiAgICAgIHMubS5xdWVyeVBhcmFtc1tzLnMucXVlcnlQZXJLZXldLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSxcbiAgICAgIGNvbGxlY3Rpb25cbiAgICBdLmNvbmNhdChjYWNoZUtleXMpXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzLnByb3BzLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQpIHtcbiAgICAgIGxvYWRPdmVyYWxsQ291bnQoKVxuICAgIH1cbiAgfSwgW21vZGVsQ2xhc3NdKVxuXG4gIHVzZUNyZWF0ZWRFdmVudChzLnAubW9kZWxDbGFzcywgb25DcmVhdGVkKVxuXG4gIC8vIEludmFsaWRhdGUgYW55IGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gdW5tb3VudGVkIGhvb2tzIGNhbm5vdCB3cml0ZSBzdGFsZSBzdGF0ZS5cbiAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgICBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFtdXG5cbiAgICBpZiAocy5zLm1vZGVscykge1xuICAgICAgZm9yKGNvbnN0IG1vZGVsIG9mIHMucy5tb2RlbHMpIHtcbiAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChtb2RlbCwgb25Nb2RlbFVwZGF0ZWQpKVxuICAgICAgICBjb25uZWN0aW9ucy5wdXNoKE1vZGVsRXZlbnRzLmNvbm5lY3REZXN0cm95ZWQobW9kZWwsIG9uTW9kZWxEZXN0cm95ZWQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBmb3IoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttb2RlbElkc0NhY2hlU3RyaW5nXSlcblxuICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge1VzZUNvbGxlY3Rpb25SZXN1bHQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoT2JqZWN0LmFzc2lnbih7fSwgcy5zdGF0ZSkpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSkpXG5cbiAgcmVzdWx0Lm1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBtb2RlbElkc0NhY2hlU3RyaW5nXG4gIHJlc3VsdFttb2RlbFZhcmlhYmxlTmFtZV0gPSBzLnMubW9kZWxzXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb2xsZWN0aW9uXG4iXX0=
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3pELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDL0IsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFFMUU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILDhDQUE4QztBQUM5QyxNQUFNLHNCQUF1QixTQUFRLFNBQVM7SUFDNUMsbUJBQW1CO0lBQ25CLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFdBQVc7UUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNB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QUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtJQUU5QyxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQUVELGVBQWUsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lLCBwcmVmZXItb2JqZWN0LXNwcmVhZCwgc29ydC1pbXBvcnRzICovXG5pbXBvcnQge1NoYXBlSG9vaywgdXNlU2hhcGVIb29rfSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmVcIlxuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi91c2UtY3JlYXRlZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlUXVlcnlQYXJhbXMgZnJvbSBcIm9uLWxvY2F0aW9uLWNoYW5nZWQvYnVpbGQvdXNlLXF1ZXJ5LXBhcmFtcy5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVXNlQ29sbGVjdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtBcnJheTxpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdD59IG1vZGVsc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsSWRzQ2FjaGVTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdmVyYWxsQ291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQZXJLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVFOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlTTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UGFnZU5hbWVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yZXN1bHQuanNcIikuZGVmYXVsdH0gcmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzZWFyY2hQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcHJvcGVydHkge2ZhbHNlIHwgaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5hYmlsaXRpZXNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLmNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHMuZGVmYXVsdFBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMuZ3JvdXBCeVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogYm9vbGVhbn0gcHJvcHMuaWZDb25kaXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wcy5saW1pdFxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IHByb3BzLm1vZGVsQ2xhc3NcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gcHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IHByb3BzLm9uTW9kZWxzTG9hZGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLnBhZ2luYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzLnByZWxvYWRzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBwcm9wcy5xdWVyeU1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLnF1ZXJ5TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5yYW5zYWNrXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0Q29sdW1uc1xuICogQHBhcmFtIHthbnlbXX0gY2FjaGVLZXlzXG4gKiBAcmV0dXJucyB7VXNlQ29sbGVjdGlvblJlc3VsdCAmIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbi8qKiBIb29rIHN0YXRlIGNvbnRhaW5lciBmb3IgdXNlQ29sbGVjdGlvbi4gKi9cbmNsYXNzIFVzZUNvbGxlY3Rpb25TaGFwZUhvb2sgZXh0ZW5kcyBTaGFwZUhvb2sge1xuICAvKiogQ29uc3RydWN0b3IuICovXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IDBcbiAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gMFxuICAgIHRoaXMucXVlcnlQYXJhbXMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucC5xdWVyeU5hbWUgfHwgZGlnZyh0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLCBcImNvbGxlY3Rpb25LZXlcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVBlcktleSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fcGVyYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UU5hbWUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucXVlcnlOYW1lKCl9X3FgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgcXVlcnlTTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fc2BcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVBhZ2VOYW1lKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9wYWdlYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIG1vZGVsSWRzQ2FjaGVTdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMucy5tb2RlbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFwibW9kZWxzLXVuZGVmaW5lZFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwibm8tbW9kZWxzXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucy5tb2RlbHMubWFwKChtb2RlbCkgPT4gbW9kZWwuY2FjaGVLZXkoKSk/LmpvaW4oXCItLS1cIilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge0Z1bmN0aW9uICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gIGxvYWRNb2RlbHNEZWJvdW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZShcImxvYWRNb2RlbHNEZWJvdW5jZVwiLCAoKSA9PiBkZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRNb2RlbHMoKSkpXG4gIH1cblxuICAvKiogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzICovXG4gIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KGFyZ3MpIHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAodGhpcy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSB0aGlzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmICh0aGlzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHRoaXMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgb3ZlcmFsbENvdW50ID09PSB1bmRlZmluZWQgfHwgdGhpcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHRoaXMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncyAqL1xuICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50KGFyZ3MpIHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAodGhpcy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSB0aGlzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmICh0aGlzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHRoaXMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgdGhpcy5wLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2VcblxuICAgIC8vIERvbnQgc2hvdyBub1JlY29yZHNBdmFpbGFibGVDb250ZW50IHRvZ2V0aGVyIHdpdGggbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICAgIGlmIChtb2RlbHMubGVuZ3RoID09PSAwICYmIG92ZXJhbGxDb3VudCA9PT0gMCAmJiB0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgdGhpcy5wLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCkgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgbG9hZE92ZXJhbGxDb3VudCA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBJZ25vcmUgbGF0ZSBvdmVyYWxsLWNvdW50IHJlc3BvbnNlcyBvbmNlIGEgbmV3ZXIgbG9hZCBjeWNsZSBoYXMgc3RhcnRlZCBvciB0aGUgaG9vayB1bm1vdW50ZWQuXG4gICAgY29uc3QgbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gPSB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICsgMVxuXG4gICAgdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiA9IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uXG5cbiAgICBjb25zdCBiYXNlUXVlcnkgPSB0aGlzLnAuY29sbGVjdGlvbiB8fCB0aGlzLnAubW9kZWxDbGFzcy5hbGwoKVxuICAgIGNvbnN0IG92ZXJhbGxDb3VudCA9IGF3YWl0IGJhc2VRdWVyeS5jb3VudCgpXG5cbiAgICBpZiAoIXRoaXMuaXNNb3VudGVkKCkgfHwgbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gIT0gdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG92ZXJhbGxDb3VudCxcbiAgICAgIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHtvdmVyYWxsQ291bnR9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudCh7b3ZlcmFsbENvdW50fSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBsb2FkUVBhcmFtcygpIHtcbiAgICBsZXQgcVBhcmFtc1RvU2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wLmRlZmF1bHRQYXJhbXMpXG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gW11cblxuICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zICYmIHRoaXMucXVlcnlRTmFtZSgpIGluIHRoaXMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHFQYXJhbXNUb1NldCA9IEpTT04ucGFyc2UoZGlnZyh0aGlzLnF1ZXJ5UGFyYW1zLCB0aGlzLnF1ZXJ5UU5hbWUoKSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlcnlQYXJhbXM/Llt0aGlzLnF1ZXJ5U05hbWUoKV0pIHtcbiAgICAgIGZvciAoY29uc3QgcmF3U2VhcmNoUGFyYW0gb2YgdGhpcy5xdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5U05hbWUoKV0pIHtcbiAgICAgICAgY29uc3QgcGFyc2VkU2VhcmNoUGFyYW0gPSBKU09OLnBhcnNlKHJhd1NlYXJjaFBhcmFtKVxuXG4gICAgICAgIHNlYXJjaFBhcmFtcy5wdXNoKHBhcnNlZFNlYXJjaFBhcmFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcVBhcmFtczogcVBhcmFtc1RvU2V0LFxuICAgICAgc2VhcmNoUGFyYW1zXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgbG9hZE1vZGVscyA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgY29sbGVjdGlvbiByZXF1ZXN0IGlzIGFsbG93ZWQgdG8gdXBkYXRlIHN0YXRlIGFmdGVyIG5hdmlnYXRpb24vZmlsdGVyIGNoYW5nZXMuXG4gICAgY29uc3QgbG9hZE1vZGVsc0dlbmVyYXRpb24gPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uICsgMVxuXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgdGhpcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAodGhpcy5wLnBhZ2luYXRpb24pIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldIHx8IDFcbiAgICAgIGxldCBwZXIgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSB8fCAzMFxuXG4gICAgICBpZiAocGVyID09IFwiYWxsXCIpIHtcbiAgICAgICAgcGVyID0gOTk5Xzk5OV85OTlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlciA9IE51bWJlcihwZXIpXG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5LnBhZ2UocGFnZSkucGVyKHBlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wLmdyb3VwQnkpIHF1ZXJ5ID0gcXVlcnkuZ3JvdXBCeSguLi50aGlzLnAuZ3JvdXBCeSlcblxuICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgIC5yYW5zYWNrKHRoaXMucy5xUGFyYW1zKVxuICAgICAgLnNlYXJjaCh0aGlzLnMuc2VhcmNoUGFyYW1zKVxuICAgICAgLnNlYXJjaEtleSh0aGlzLnF1ZXJ5UU5hbWUoKSlcbiAgICAgIC5wYWdlS2V5KHRoaXMucXVlcnlQYWdlTmFtZSgpKVxuICAgICAgLnBlcktleSh0aGlzLnF1ZXJ5UGVyS2V5KCkpXG5cbiAgICBpZiAodGhpcy5wLmFiaWxpdGllcykgcXVlcnkuYWJpbGl0aWVzKHRoaXMucC5hYmlsaXRpZXMpXG4gICAgaWYgKHRoaXMucC5saW1pdCAhPT0gdW5kZWZpbmVkKSBxdWVyeS5saW1pdCh0aGlzLnAubGltaXQpXG4gICAgaWYgKHRoaXMucC5wcmVsb2FkcykgcXVlcnkucHJlbG9hZCh0aGlzLnAucHJlbG9hZHMpXG4gICAgaWYgKHRoaXMucC5yYW5zYWNrKSBxdWVyeS5yYW5zYWNrKHRoaXMucC5yYW5zYWNrKVxuICAgIGlmICh0aGlzLnAuc2VsZWN0KSBxdWVyeS5zZWxlY3QodGhpcy5wLnNlbGVjdClcbiAgICBpZiAodGhpcy5wLnNlbGVjdENvbHVtbnMpIHF1ZXJ5LnNlbGVjdENvbHVtbnModGhpcy5wLnNlbGVjdENvbHVtbnMpXG5cbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAodGhpcy5wLnF1ZXJ5TWV0aG9kKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnAucXVlcnlNZXRob2Qoe3F1ZXJ5fSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcXVlcnkucmVzdWx0KClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbHMgPSByZXN1bHQubW9kZWxzKClcblxuICAgIGlmICghdGhpcy5pc01vdW50ZWQoKSB8fCBsb2FkTW9kZWxzR2VuZXJhdGlvbiAhPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIGlmICh0aGlzLnAub25Nb2RlbHNMb2FkZWQpIHtcbiAgICAgIHRoaXMucC5vbk1vZGVsc0xvYWRlZCh7XG4gICAgICAgIG1vZGVscyxcbiAgICAgICAgcVBhcmFtczogdGhpcy5zLnFQYXJhbXMsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICByZXN1bHRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtb2RlbHMsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHttb2RlbHN9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudCh7bW9kZWxzfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e21vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH19IGFyZ3MgKi9cbiAgb25Nb2RlbERlc3Ryb3llZChhcmdzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkTW9kZWwgPSBkaWdnKGFyZ3MsIFwibW9kZWxcIilcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbW9kZWxzOiB0aGlzLnMubW9kZWxzLmZpbHRlcigobW9kZWwpID0+IG1vZGVsLmlkKCkgIT0gZGVzdHJveWVkTW9kZWwuaWQoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e21vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH19IGFyZ3MgKi9cbiAgb25Nb2RlbFVwZGF0ZWQoYXJncykge1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGRpZ2coYXJncywgXCJtb2RlbFwiKVxuICAgIGNvbnN0IGZvdW5kTW9kZWwgPSB0aGlzLnMubW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pZCgpID09IHVwZGF0ZWRNb2RlbC5pZCgpKVxuXG4gICAgaWYgKGZvdW5kTW9kZWwpIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvbkNyZWF0ZWQoKSB7XG4gICAgdGhpcy5sb2FkTW9kZWxzRGVib3VuY2UoKSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgICAgb3ZlcmFsbENvdW50OiB1bmRlZmluZWQsXG4gICAgICBxUGFyYW1zOiB7fSxcbiAgICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFBhcmFtczogdW5kZWZpbmVkLFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogZmFsc2VcbiAgICB9KVxuICAgIHRoaXMuc2V0SW5zdGFuY2Uoe3F1ZXJ5UGFyYW1zOiB1c2VRdWVyeVBhcmFtcygpfSlcblxuICAgIC8vIENvbGxlY3Rpb24gbG9hZGluZyBoYXMgdG8gd2FpdCB1bnRpbCBtb3VudCBzbyBmYXN0IHJlc3BvbnNlcyBjYW5ub3QgZ2V0IHN0cmFuZGVkIGluIFNoYXBlSG9vaydzIHByZS1tb3VudCBxdWV1ZS5cbiAgICB1c2VFZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghKFwiaWZDb25kaXRpb25cIiBpbiB0aGlzLnByb3BzKSB8fCB0aGlzLnAuaWZDb25kaXRpb24pIHtcbiAgICAgICAgICB0aGlzLmxvYWRRUGFyYW1zKClcbiAgICAgICAgICB0aGlzLmxvYWRNb2RlbHMoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW1xuICAgICAgICB0aGlzLnAubW9kZWxDbGFzcyxcbiAgICAgICAgdGhpcy5wLmlmQ29uZGl0aW9uLFxuICAgICAgICB0aGlzLnF1ZXJ5TmFtZSgpLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVFOYW1lKCldLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlTTmFtZSgpXSxcbiAgICAgICAgdGhpcy5wLmNvbGxlY3Rpb25cbiAgICAgIF0uY29uY2F0KHRoaXMucC5jYWNoZUtleXMpXG4gICAgKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkge1xuICAgICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnQoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAubW9kZWxDbGFzc10pXG5cbiAgICB1c2VDcmVhdGVkRXZlbnQodGhpcy5wLm1vZGVsQ2xhc3MsICgpID0+IHRoaXMub25DcmVhdGVkKCkpXG5cbiAgICAvLyBJbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgYXN5bmMgcmVzcG9uc2VzIHNvIHVubW91bnRlZCBob29rcyBjYW5ub3Qgd3JpdGUgc3RhbGUgc3RhdGUuXG4gICAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICAgIHRoaXMubG9hZE1vZGVsc0dlbmVyYXRpb24gKz0gMVxuICAgICAgdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiArPSAxXG4gICAgICB0aGlzLmxvYWRNb2RlbHNEZWJvdW5jZSgpLmNsZWFyPy4oKVxuICAgIH0sIFtdKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gW11cblxuICAgICAgaWYgKHRoaXMucy5tb2RlbHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLnMubW9kZWxzKSB7XG4gICAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChtb2RlbCwgKGFyZ3MpID0+IHRoaXMub25Nb2RlbFVwZGF0ZWQoYXJncykpKVxuICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2goTW9kZWxFdmVudHMuY29ubmVjdERlc3Ryb3llZChtb2RlbCwgKGFyZ3MpID0+IHRoaXMub25Nb2RlbERlc3Ryb3llZChhcmdzKSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBbdGhpcy5tb2RlbElkc0NhY2hlU3RyaW5nKCldKVxuICB9XG59XG5cbmNvbnN0IHVzZUNvbGxlY3Rpb24gPSAocHJvcHMsIGNhY2hlS2V5cyA9IFtdKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY29sbGVjdGlvbixcbiAgICBkZWZhdWx0UGFyYW1zLFxuICAgIGdyb3VwQnksXG4gICAgaWZDb25kaXRpb24sXG4gICAgbGltaXQsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9IHVuZGVmaW5lZCxcbiAgICBvbk1vZGVsc0xvYWRlZCxcbiAgICBwYWdpbmF0aW9uID0gZmFsc2UsXG4gICAgcHJlbG9hZHMgPSBbXSxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QgPSB7fSxcbiAgICBzZWxlY3RDb2x1bW5zLFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHNcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BzIGdpdmVuIHRvIHVzZUNvbGxlY3Rpb246ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHNoYXBlSG9vayA9IHVzZVNoYXBlSG9vayhVc2VDb2xsZWN0aW9uU2hhcGVIb29rLCB7XG4gICAgYWJpbGl0aWVzLFxuICAgIGNhY2hlS2V5cyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRlZmF1bHRQYXJhbXMsXG4gICAgZ3JvdXBCeSxcbiAgICBpZkNvbmRpdGlvbixcbiAgICBsaW1pdCxcbiAgICBtb2RlbENsYXNzLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQsXG4gICAgbm9SZWNvcmRzRm91bmRDb250ZW50LFxuICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgIHBhZ2luYXRpb24sXG4gICAgcHJlbG9hZHMsXG4gICAgcXVlcnlNZXRob2QsXG4gICAgcXVlcnlOYW1lLFxuICAgIHJhbnNhY2ssXG4gICAgc2VsZWN0LFxuICAgIHNlbGVjdENvbHVtbnNcbiAgfSlcbiAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtVc2VDb2xsZWN0aW9uUmVzdWx0ICYgUmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKE9iamVjdC5hc3NpZ24oe30sIHNoYXBlSG9vay5zdGF0ZSkpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi5jYW1lbGl6ZShzaGFwZUhvb2sucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSkpXG5cbiAgcmVzdWx0Lm1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBzaGFwZUhvb2subW9kZWxJZHNDYWNoZVN0cmluZygpXG4gIHJlc3VsdC5xdWVyeU5hbWUgPSBzaGFwZUhvb2sucXVlcnlOYW1lKClcbiAgcmVzdWx0LnF1ZXJ5UGVyS2V5ID0gc2hhcGVIb29rLnF1ZXJ5UGVyS2V5KClcbiAgcmVzdWx0LnF1ZXJ5UU5hbWUgPSBzaGFwZUhvb2sucXVlcnlRTmFtZSgpXG4gIHJlc3VsdC5xdWVyeVNOYW1lID0gc2hhcGVIb29rLnF1ZXJ5U05hbWUoKVxuICByZXN1bHQucXVlcnlQYWdlTmFtZSA9IHNoYXBlSG9vay5xdWVyeVBhZ2VOYW1lKClcbiAgcmVzdWx0W21vZGVsVmFyaWFibGVOYW1lXSA9IHNoYXBlSG9vay5zLm1vZGVsc1xuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlQ29sbGVjdGlvblxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2129",
4
+ "version": "1.0.2130",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"