@kaspernj/api-maker 1.0.2110 → 1.0.2112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,6 +39,8 @@ const user = await User.find("a0f3842b-1e4c-4e9d-8f2d-cd021e5a9b6a")
39
39
 
40
40
  Models are generated from the server recipes and inherit `BaseModel`. Collections let you compose queries fluently and then execute them with `toArray()`.
41
41
 
42
+ For generated model source shape, prefer `export default class Foo {}` when possible; only use class expressions when explicitly required.
43
+
42
44
  ```js
43
45
  const activeProjects = await Project
44
46
  .ransack({state_eq: "active"})
@@ -96,6 +98,25 @@ The relationship name is stored in `snake_case`, so `preloadRelationship("Accoun
96
98
 
97
99
  `config` is a shared singleton. Some helpers (forms, routing, navigation, and money inputs) require config values like `history`, `linkTo`, `navigation`, and `currenciesCollection` to be set. If a required value is missing, the getter throws an error to avoid silent failures.
98
100
 
101
+ ## Realtime model events
102
+
103
+ For model-specific websocket events in React/ShapeComponent UI code, prefer `useModelEvent` over manual `ModelEvents.connect(...)` subscriptions. The hook handles subscription lifecycle automatically and avoids leaked listeners.
104
+
105
+ ```js
106
+ import useModelEvent from "@kaspernj/api-maker/build/use-model-event.js"
107
+
108
+ useModelEvent(projectEnvironmentInstance, "termination_job_status", ({args}) => {
109
+ console.log(args)
110
+ })
111
+ ```
112
+
113
+ Related hooks:
114
+
115
+ - `useUpdatedEvent(model, onUpdated)`
116
+ - `useDestroyedEvent(model, onDestroyed)`
117
+ - `useCreatedEvent(ModelClass, onCreated)`
118
+ - `useModelClassEvent(ModelClass, "custom_event", onEvent)`
119
+
99
120
  ## ApiMakerTable date formatting
100
121
 
101
122
  `ApiMakerTable` supports date formatting in two ways:
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * @typedef AttributeArgType
3
- * @property {string} column
3
+ * @property {import("./column.js").ColumnArgType | null} column
4
4
  * @property {string} name
5
- * @property {boolean} selected_by_default
6
- * @property {boolean} translated
7
- * @property {string} type
5
+ * @property {boolean | null} [selected_by_default]
6
+ * @property {boolean | null} [translated]
7
+ * @property {string | null} [type]
8
8
  */
9
9
  export default class ApiMakerBaseModelAttribute {
10
10
  /** @param {AttributeArgType} attributeData */
@@ -23,11 +23,11 @@ export default class ApiMakerBaseModelAttribute {
23
23
  name(): string;
24
24
  }
25
25
  export type AttributeArgType = {
26
- column: string;
26
+ column: import("./column.js").ColumnArgType | null;
27
27
  name: string;
28
- selected_by_default: boolean;
29
- translated: boolean;
30
- type: string;
28
+ selected_by_default?: boolean | null;
29
+ translated?: boolean | null;
30
+ type?: string | null;
31
31
  };
32
32
  import Column from "./column.js";
33
33
  //# sourceMappingURL=attribute.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attribute.d.ts","sourceRoot":"/src/","sources":["base-model/attribute.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH;IACE,8CAA8C;IAC9C,2BADY,gBAAgB,EAG3B;IADC,gCAAkC;IAGpC,wBAAwB;IACxB,aADc,MAAM,CAWnB;IALK,eAAoC;IAO1C,yBAAyB;IACzB,YADc,OAAO,CACmC;IAExD,yBAAyB;IACzB,uBADc,OAAO,CAOpB;IAED,yBAAyB;IACzB,gBADc,OAAO,CACkC;IAEvD,wBAAwB;IACxB,QADc,MAAM,CACqB;CAC1C;;YA3Ca,MAAM;UACN,MAAM;yBACN,OAAO;gBACP,OAAO;UACP,MAAM;;mBARD,aAAa"}
1
+ {"version":3,"file":"attribute.d.ts","sourceRoot":"/src/","sources":["base-model/attribute.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH;IACE,8CAA8C;IAC9C,2BADY,gBAAgB,EAG3B;IADC,gCAAkC;IAGpC,wBAAwB;IACxB,aADc,MAAM,CAWnB;IALK,eAAoC;IAO1C,yBAAyB;IACzB,YADc,OAAO,CACmC;IAExD,yBAAyB;IACzB,uBADc,OAAO,CAOpB;IAED,yBAAyB;IACzB,gBADc,OAAO,CACkC;IAEvD,wBAAwB;IACxB,QADc,MAAM,CACqB;CAC1C;;YA3Ca,OAAO,aAAa,EAAE,aAAa,GAAG,IAAI;UAC1C,MAAM;0BACN,OAAO,GAAG,IAAI;iBACd,OAAO,GAAG,IAAI;WACd,MAAM,GAAG,IAAI;;mBARR,aAAa"}
@@ -2,11 +2,11 @@
2
2
  import Column from "./column.js";
3
3
  /**
4
4
  * @typedef AttributeArgType
5
- * @property {string} column
5
+ * @property {import("./column.js").ColumnArgType | null} column
6
6
  * @property {string} name
7
- * @property {boolean} selected_by_default
8
- * @property {boolean} translated
9
- * @property {string} type
7
+ * @property {boolean | null} [selected_by_default]
8
+ * @property {boolean | null} [translated]
9
+ * @property {string | null} [type]
10
10
  */
11
11
  export default class ApiMakerBaseModelAttribute {
12
12
  /** @param {AttributeArgType} attributeData */
@@ -37,4 +37,4 @@ export default class ApiMakerBaseModelAttribute {
37
37
  /** @returns {string} */
38
38
  name() { return this.attributeData.name; }
39
39
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJiYXNlLW1vZGVsL2F0dHJpYnV0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRWhDOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qyw4Q0FBOEM7SUFDOUMsWUFBWSxhQUFhO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO0lBQ3BDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUE7WUFFNUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsUUFBUSxLQUFLLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXhELHlCQUF5QjtJQUN6QixtQkFBbUI7UUFDakIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFBO1FBRWxFLElBQUksbUJBQW1CLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXBFLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQSxDQUFDLENBQUM7SUFFdkQsd0JBQXdCO0lBQ3hCLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQztDQUMxQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29sdW1uIGZyb20gXCIuL2NvbHVtbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYgQXR0cmlidXRlQXJnVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbHVtblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2VsZWN0ZWRfYnlfZGVmYXVsdFxuICogQHByb3BlcnR5IHtib29sZWFufSB0cmFuc2xhdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyQmFzZU1vZGVsQXR0cmlidXRlIHtcbiAgLyoqIEBwYXJhbSB7QXR0cmlidXRlQXJnVHlwZX0gYXR0cmlidXRlRGF0YSAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVEYXRhKSB7XG4gICAgdGhpcy5hdHRyaWJ1dGVEYXRhID0gYXR0cmlidXRlRGF0YVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtDb2x1bW59ICovXG4gIGdldENvbHVtbigpIHtcbiAgICBpZiAoIXRoaXMuY29sdW1uKSB7XG4gICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5hdHRyaWJ1dGVEYXRhLmNvbHVtblxuXG4gICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IG5ldyBDb2x1bW4oY29sdW1uRGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNDb2x1bW4oKSB7IHJldHVybiBCb29sZWFuKHRoaXMuYXR0cmlidXRlRGF0YS5jb2x1bW4pIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzU2VsZWN0ZWRCeURlZmF1bHQoKSB7XG4gICAgY29uc3QgaXNTZWxlY3RlZEJ5RGVmYXVsdCA9IHRoaXMuYXR0cmlidXRlRGF0YS5zZWxlY3RlZF9ieV9kZWZhdWx0XG5cbiAgICBpZiAoaXNTZWxlY3RlZEJ5RGVmYXVsdCB8fCBpc1NlbGVjdGVkQnlEZWZhdWx0ID09PSBudWxsKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzVHJhbnNsYXRlZCgpIHsgcmV0dXJuIHRoaXMuYXR0cmlidXRlRGF0YS50cmFuc2xhdGVkIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbmFtZSgpIHsgcmV0dXJuIHRoaXMuYXR0cmlidXRlRGF0YS5uYW1lIH1cbn1cbiJdfQ==
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJiYXNlLW1vZGVsL2F0dHJpYnV0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBRWhDOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qyw4Q0FBOEM7SUFDOUMsWUFBWSxhQUFhO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO0lBQ3BDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsU0FBUztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUE7WUFFNUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsUUFBUSxLQUFLLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBRXhELHlCQUF5QjtJQUN6QixtQkFBbUI7UUFDakIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFBO1FBRWxFLElBQUksbUJBQW1CLElBQUksbUJBQW1CLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXBFLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQSxDQUFDLENBQUM7SUFFdkQsd0JBQXdCO0lBQ3hCLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQztDQUMxQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ29sdW1uIGZyb20gXCIuL2NvbHVtbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYgQXR0cmlidXRlQXJnVHlwZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbHVtbi5qc1wiKS5Db2x1bW5BcmdUeXBlIHwgbnVsbH0gY29sdW1uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3NlbGVjdGVkX2J5X2RlZmF1bHRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdHJhbnNsYXRlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gW3R5cGVdXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJCYXNlTW9kZWxBdHRyaWJ1dGUge1xuICAvKiogQHBhcmFtIHtBdHRyaWJ1dGVBcmdUeXBlfSBhdHRyaWJ1dGVEYXRhICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZURhdGEpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVEYXRhXG4gIH1cblxuICAvKiogQHJldHVybnMge0NvbHVtbn0gKi9cbiAgZ2V0Q29sdW1uKCkge1xuICAgIGlmICghdGhpcy5jb2x1bW4pIHtcbiAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSB0aGlzLmF0dHJpYnV0ZURhdGEuY29sdW1uXG5cbiAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgIHRoaXMuY29sdW1uID0gbmV3IENvbHVtbihjb2x1bW5EYXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbHVtblxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBpc0NvbHVtbigpIHsgcmV0dXJuIEJvb2xlYW4odGhpcy5hdHRyaWJ1dGVEYXRhLmNvbHVtbikgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNTZWxlY3RlZEJ5RGVmYXVsdCgpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkQnlEZWZhdWx0ID0gdGhpcy5hdHRyaWJ1dGVEYXRhLnNlbGVjdGVkX2J5X2RlZmF1bHRcblxuICAgIGlmIChpc1NlbGVjdGVkQnlEZWZhdWx0IHx8IGlzU2VsZWN0ZWRCeURlZmF1bHQgPT09IG51bGwpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNUcmFuc2xhdGVkKCkgeyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVEYXRhLnRyYW5zbGF0ZWQgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBuYW1lKCkgeyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVEYXRhLm5hbWUgfVxufVxuIl19
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * @typedef {object} ColumnArgType
3
- * @property {string} type
3
+ * @property {any} [default]
4
+ * @property {string} [name]
5
+ * @property {boolean} [null]
6
+ * @property {string | null} type
4
7
  */
5
8
  export default class ApiMakerBaseModelColumn {
6
9
  /** @param {ColumnArgType} columnData */
@@ -10,6 +13,9 @@ export default class ApiMakerBaseModelColumn {
10
13
  getType(): string;
11
14
  }
12
15
  export type ColumnArgType = {
13
- type: string;
16
+ default?: any;
17
+ name?: string;
18
+ null?: boolean;
19
+ type: string | null;
14
20
  };
15
21
  //# sourceMappingURL=column.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"column.d.ts","sourceRoot":"/src/","sources":["base-model/column.js"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;IACE,wCAAwC;IACxC,wBADY,aAAa,EAOxB;IADC,0BAA4B;IAI9B,wBAAwB;IACxB,WADc,MAAM,CACqB;CAC1C;;UAhBa,MAAM"}
1
+ {"version":3,"file":"column.d.ts","sourceRoot":"/src/","sources":["base-model/column.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;IACE,wCAAwC;IACxC,wBADY,aAAa,EAOxB;IADC,0BAA4B;IAI9B,wBAAwB;IACxB,WADc,MAAM,CACqB;CAC1C;;cAnBa,GAAG;WACH,MAAM;WACN,OAAO;UACP,MAAM,GAAG,IAAI"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * @typedef {object} ColumnArgType
3
- * @property {string} type
3
+ * @property {any} [default]
4
+ * @property {string} [name]
5
+ * @property {boolean} [null]
6
+ * @property {string | null} type
4
7
  */
5
8
  export default class ApiMakerBaseModelColumn {
6
9
  /** @param {ColumnArgType} columnData */
@@ -13,4 +16,4 @@ export default class ApiMakerBaseModelColumn {
13
16
  /** @returns {string} */
14
17
  getType() { return this.columnData.type; }
15
18
  }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJiYXNlLW1vZGVsL2NvbHVtbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVCQUF1QjtJQUMxQyx3Q0FBd0M7SUFDeEMsWUFBWSxVQUFVO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFHRCx3QkFBd0I7SUFDeEIsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDO0NBQzFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2x1bW5BcmdUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyQmFzZU1vZGVsQ29sdW1uIHtcbiAgLyoqIEBwYXJhbSB7Q29sdW1uQXJnVHlwZX0gY29sdW1uRGF0YSAqL1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5EYXRhKSB7XG4gICAgaWYgKCFjb2x1bW5EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW4gZGF0YSB3YXMgZ2l2ZW5cIilcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbkRhdGEgPSBjb2x1bW5EYXRhXG4gIH1cblxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gdGhpcy5jb2x1bW5EYXRhLnR5cGUgfVxufVxuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJiYXNlLW1vZGVsL2NvbHVtbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVCQUF1QjtJQUMxQyx3Q0FBd0M7SUFDeEMsWUFBWSxVQUFVO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFHRCx3QkFBd0I7SUFDeEIsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDO0NBQzFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2x1bW5BcmdUeXBlXG4gKiBAcHJvcGVydHkge2FueX0gW2RlZmF1bHRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtudWxsXVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB0eXBlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJCYXNlTW9kZWxDb2x1bW4ge1xuICAvKiogQHBhcmFtIHtDb2x1bW5BcmdUeXBlfSBjb2x1bW5EYXRhICovXG4gIGNvbnN0cnVjdG9yKGNvbHVtbkRhdGEpIHtcbiAgICBpZiAoIWNvbHVtbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiBkYXRhIHdhcyBnaXZlblwiKVxuICAgIH1cblxuICAgIHRoaXMuY29sdW1uRGF0YSA9IGNvbHVtbkRhdGFcbiAgfVxuXG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldFR5cGUoKSB7IHJldHVybiB0aGlzLmNvbHVtbkRhdGEudHlwZSB9XG59XG4iXX0=