@colijnit/sharedcomponents 1.0.30 → 1.0.32

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.
Files changed (137) hide show
  1. package/bundles/colijnit-sharedcomponents.umd.js +766 -1882
  2. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  3. package/colijnit-sharedcomponents.d.ts +40 -29
  4. package/colijnit-sharedcomponents.metadata.json +1 -1
  5. package/esm2015/colijnit-sharedcomponents.js +41 -30
  6. package/esm2015/lib/components/circular-gauge/co-circular-gauge.component.js +18 -15
  7. package/esm2015/lib/components/date-planning/date-planning.component.js +6 -4
  8. package/esm2015/lib/components/docsign/component/signature/signature.component.js +3 -3
  9. package/esm2015/lib/components/docsign/component/signatures/signatures.component.js +7 -7
  10. package/esm2015/lib/components/docsign/docsign.component.js +5 -5
  11. package/esm2015/lib/components/layout-switcher/layout-switcher.component.js +3 -3
  12. package/esm2015/lib/components/linear-gauge/co-linear-gauge.component.js +14 -10
  13. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.js +57 -0
  14. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.js +19 -0
  15. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.js +76 -0
  16. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.js +21 -0
  17. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.js +59 -0
  18. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.js +23 -0
  19. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.js +50 -0
  20. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.js +26 -0
  21. package/esm2015/lib/components/send-method-dialog/model/email-address-viewmodel.js +7 -0
  22. package/esm2015/lib/components/send-method-dialog/send-method-dialog.component.js +162 -251
  23. package/esm2015/lib/components/send-method-dialog/send-method-dialog.module.js +12 -13
  24. package/esm2015/lib/components/send-method-dialog/service/send-method.service.js +59 -0
  25. package/esm2015/lib/components/statusbar/statusbar.component.js +14 -16
  26. package/esm2015/lib/components/statusbar/statusbar.module.js +4 -2
  27. package/esm2015/lib/components/stock/stock-information-grid/stock-information-grid.component.js +7 -8
  28. package/esm2015/lib/enum/gauge-color.enum.js +10 -0
  29. package/esm2015/lib/enum/icon.enum.js +6 -1
  30. package/esm2015/lib/model/icon-svg.js +7 -2
  31. package/esm2015/lib/model/send-method.js +8 -0
  32. package/esm2015/lib/model/time-window.bo.js +4 -4
  33. package/esm2015/lib/pipe/array-number.pipe.js +1 -1
  34. package/esm2015/lib/service/icon-cache.service.js +1 -1
  35. package/esm2015/lib/service/shared-connector.service.js +91 -121
  36. package/esm2015/lib/service/shared.service.js +11 -1
  37. package/esm2015/lib/service/stock.service.js +19 -36
  38. package/fesm2015/colijnit-sharedcomponents.js +802 -1888
  39. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  40. package/lib/components/circular-gauge/style/_layout.scss +6 -5
  41. package/lib/components/circular-gauge/style/_theme.scss +0 -2
  42. package/lib/components/circular-gauge/style/material.scss +1 -0
  43. package/lib/components/date-planning/date-planning.component.d.ts +3 -2
  44. package/lib/components/date-planning/style/_layout.scss +2 -4
  45. package/lib/components/date-planning/style/_theme.scss +2 -4
  46. package/lib/components/docsign/component/signature/style/_layout.scss +2 -4
  47. package/lib/components/docsign/component/signature/style/_theme.scss +2 -4
  48. package/lib/components/docsign/component/signature/style/material.scss +1 -3
  49. package/lib/components/docsign/component/signatures/style/_layout.scss +3 -5
  50. package/lib/components/docsign/component/signatures/style/_theme.scss +2 -4
  51. package/lib/components/docsign/component/signatures/style/material.scss +1 -2
  52. package/lib/components/docsign/style/_layout.scss +3 -5
  53. package/lib/components/docsign/style/_theme.scss +2 -4
  54. package/lib/components/docsign/style/material.scss +1 -0
  55. package/lib/components/layout-switcher/style/_layout.scss +2 -4
  56. package/lib/components/layout-switcher/style/_theme.scss +2 -4
  57. package/lib/components/layout-switcher/style/material.scss +1 -0
  58. package/lib/components/linear-gauge/co-linear-gauge.component.d.ts +1 -6
  59. package/lib/components/linear-gauge/style/_layout.scss +0 -2
  60. package/lib/components/linear-gauge/style/_theme.scss +0 -2
  61. package/lib/components/linear-gauge/style/material.scss +1 -0
  62. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.d.ts +13 -0
  63. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.d.ts +2 -0
  64. package/lib/components/send-method-dialog/components/layout-selection/style/_layout.scss +34 -0
  65. package/lib/components/send-method-dialog/components/layout-selection/style/_material-definition.scss +19 -0
  66. package/lib/components/send-method-dialog/components/layout-selection/style/_theme.scss +17 -0
  67. package/lib/components/send-method-dialog/components/layout-selection/style/material.scss +4 -0
  68. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.d.ts +18 -0
  69. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.d.ts +2 -0
  70. package/lib/components/send-method-dialog/components/printer-selection/style/_layout.scss +59 -0
  71. package/lib/components/send-method-dialog/components/printer-selection/style/_material-definition.scss +39 -0
  72. package/lib/components/send-method-dialog/components/printer-selection/style/_theme.scss +23 -0
  73. package/lib/components/send-method-dialog/components/printer-selection/style/material.scss +4 -0
  74. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.d.ts +14 -0
  75. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.d.ts +2 -0
  76. package/lib/components/send-method-dialog/components/send-method-email/style/_layout.scss +21 -0
  77. package/lib/components/send-method-dialog/components/send-method-email/style/_material-definition.scss +8 -0
  78. package/lib/components/send-method-dialog/components/send-method-email/style/_theme.scss +5 -0
  79. package/lib/components/send-method-dialog/components/send-method-email/style/material.scss +4 -0
  80. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.d.ts +10 -0
  81. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.d.ts +2 -0
  82. package/lib/components/send-method-dialog/components/send-method-printer/style/_layout.scss +17 -0
  83. package/lib/components/send-method-dialog/components/send-method-printer/style/_material-definition.scss +5 -0
  84. package/lib/components/send-method-dialog/components/send-method-printer/style/_theme.scss +5 -0
  85. package/lib/components/send-method-dialog/components/send-method-printer/style/material.scss +4 -0
  86. package/lib/components/send-method-dialog/model/email-address-viewmodel.d.ts +5 -0
  87. package/lib/components/send-method-dialog/send-method-dialog.component.d.ts +53 -61
  88. package/lib/components/send-method-dialog/service/send-method.service.d.ts +23 -0
  89. package/lib/components/send-method-dialog/style/_layout.scss +44 -184
  90. package/lib/components/send-method-dialog/style/_material-definition.scss +30 -1
  91. package/lib/components/send-method-dialog/style/_theme.scss +31 -5
  92. package/lib/components/send-method-dialog/style/material.scss +5 -0
  93. package/lib/components/statusbar/statusbar.component.d.ts +2 -3
  94. package/lib/components/statusbar/style/_layout.scss +0 -2
  95. package/lib/components/statusbar/style/_theme.scss +0 -2
  96. package/lib/components/statusbar/style/material.scss +1 -0
  97. package/lib/components/stock/style/_layout.scss +0 -2
  98. package/lib/components/stock/style/_theme.scss +0 -3
  99. package/lib/components/stock/style/material.scss +1 -0
  100. package/lib/enum/gauge-color.enum.d.ts +8 -0
  101. package/lib/enum/icon.enum.d.ts +5 -0
  102. package/lib/model/send-method.d.ts +7 -0
  103. package/lib/model/time-window.bo.d.ts +1 -1
  104. package/lib/service/icon-cache.service.d.ts +1 -1
  105. package/lib/service/shared-connector.service.d.ts +21 -29
  106. package/lib/service/shared.service.d.ts +4 -0
  107. package/lib/service/stock.service.d.ts +1 -12
  108. package/lib/style/_variables.scss +5 -1
  109. package/package.json +6 -6
  110. package/esm2015/lib/components/send-method-dialog/enums/send-option.js +0 -8
  111. package/esm2015/lib/factory/business-object-factory.js +0 -120
  112. package/esm2015/lib/factory/decorators/boolean.decorator.js +0 -102
  113. package/esm2015/lib/factory/decorators/complex-array.decorator.js +0 -55
  114. package/esm2015/lib/factory/decorators/complex-field.decorator.js +0 -57
  115. package/esm2015/lib/factory/decorators/date-field.decorator.js +0 -36
  116. package/esm2015/lib/factory/decorators/string-number.decorator.js +0 -43
  117. package/esm2015/lib/model/business-object.js +0 -81
  118. package/esm2015/lib/utils/array-utils.js +0 -202
  119. package/esm2015/lib/utils/check-precision-and-scale-result.js +0 -2
  120. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +0 -2
  121. package/esm2015/lib/utils/is-nill.function.js +0 -5
  122. package/esm2015/lib/utils/number-utils.js +0 -390
  123. package/esm2015/lib/utils/object-utils.js +0 -278
  124. package/lib/components/send-method-dialog/enums/send-option.d.ts +0 -6
  125. package/lib/factory/business-object-factory.d.ts +0 -23
  126. package/lib/factory/decorators/boolean.decorator.d.ts +0 -43
  127. package/lib/factory/decorators/complex-array.decorator.d.ts +0 -25
  128. package/lib/factory/decorators/complex-field.decorator.d.ts +0 -25
  129. package/lib/factory/decorators/date-field.decorator.d.ts +0 -17
  130. package/lib/factory/decorators/string-number.decorator.d.ts +0 -22
  131. package/lib/model/business-object.d.ts +0 -7
  132. package/lib/utils/array-utils.d.ts +0 -63
  133. package/lib/utils/check-precision-and-scale-result.d.ts +0 -4
  134. package/lib/utils/check-within-stepped-bounds-result.d.ts +0 -8
  135. package/lib/utils/is-nill.function.d.ts +0 -1
  136. package/lib/utils/number-utils.d.ts +0 -125
  137. package/lib/utils/object-utils.d.ts +0 -40
@@ -1,278 +0,0 @@
1
- import { isNill } from "./is-nill.function";
2
- import { notNill } from "./function/not-nill.function";
3
- // Static utility function holder related to objects.
4
- export class ObjectUtils {
5
- /**
6
- * Returns whether all given values exist: for all values it holds that they are not null nor undefined. Short-circuit check.
7
- * @param {any} values Rest parameters with all objects to check existence for.
8
- * @returns {boolean} True if ALL given values are not null nor undefined, otherwise false (if at least one value was null or undefined)
9
- */
10
- static AllExist(...values) {
11
- let allExist = true;
12
- for (let i = 0, len = values.length; i < len; i++) {
13
- if (isNill(values[i])) {
14
- allExist = false;
15
- break;
16
- }
17
- }
18
- return allExist;
19
- }
20
- /**
21
- * Copies all properties from object 'from' to object 'to'. Overwrites properties on object 'to' if property already exists.
22
- * Does not copy functions, only properties.
23
- * @param {Object} from The source object from which to copy all properties of to the 'to' object.
24
- * @param {Object} to The object to which the properties of the 'from' object will be copied.
25
- * @param {boolean} [allowUndefined = true] wether the 'to' object may be assigned null or undefined values to any of its properties.
26
- */
27
- static CopyPropertiesFrom(from, to, allowUndefined = true) {
28
- if (!to) {
29
- to = {};
30
- }
31
- if (!from) {
32
- return to;
33
- }
34
- ObjectUtils.ForOwnProperty(from, (value, key) => {
35
- if (allowUndefined || notNill(value)) {
36
- to[key] = value;
37
- }
38
- });
39
- return to;
40
- }
41
- static DeepEquals(actual, expected) {
42
- if (actual === expected) {
43
- return true;
44
- }
45
- else if (actual instanceof Date && expected instanceof Date) {
46
- return actual.getTime() === expected.getTime();
47
- }
48
- else if (!actual || !expected || typeof actual !== "object" && typeof expected !== "object") {
49
- return actual === expected;
50
- }
51
- else {
52
- return this._objEquiv(actual, expected);
53
- }
54
- }
55
- // Performs given callback function for each own property of given plain object. Also works on string enums.
56
- static ForOwnProperty(plainObject, callback) {
57
- if (ObjectUtils.IsPlainObject(plainObject)) {
58
- for (const key in plainObject) {
59
- if (plainObject.hasOwnProperty(key) && typeof plainObject[key] !== "function") {
60
- const response = callback(plainObject[key], key);
61
- if (response === false) {
62
- break;
63
- }
64
- }
65
- }
66
- }
67
- }
68
- // Returns the class name of given argument. The argument can be an object or a class.
69
- static GetClassName(objectOrClass) {
70
- if (!objectOrClass) {
71
- return undefined;
72
- // arg was a class (or a function..)
73
- }
74
- else if (objectOrClass.constructor === Function) {
75
- return objectOrClass.name; // .. which has its readable name stores like this
76
- // else arg was an object
77
- }
78
- else {
79
- const constructorString = objectOrClass.constructor.toString();
80
- return constructorString.match(/\w+/g)[1];
81
- }
82
- }
83
- // Returns a shallow clone of the given original object. The clone is a SIMPLE OBJECT with the same properties as the original.
84
- static GetShallowClone(originalObject, objectClass) {
85
- let clonedObject = undefined;
86
- if (objectClass) {
87
- clonedObject = new objectClass();
88
- }
89
- else {
90
- clonedObject = {};
91
- }
92
- ObjectUtils.ForOwnProperty(originalObject, (value, key) => {
93
- clonedObject[key] = value;
94
- });
95
- return clonedObject;
96
- }
97
- static GetDeepClone(originalObject, circular = true) {
98
- // First create an empty object with
99
- // same prototype of our original source
100
- let propertyIndex;
101
- let descriptor;
102
- let keys;
103
- let current;
104
- let nextSource;
105
- let indexOf;
106
- const copies = [{
107
- source: originalObject,
108
- target: Object.create(Object.getPrototypeOf(originalObject))
109
- }];
110
- const cloneObject = copies[0].target;
111
- const sourceReferences = [originalObject];
112
- const targetReferences = [cloneObject];
113
- // First in, first out
114
- while (current = copies.shift()) { //NOSONAR
115
- keys = Object.getOwnPropertyNames(current.source);
116
- for (propertyIndex = 0; propertyIndex < keys.length; propertyIndex++) {
117
- // Save the source's descriptor
118
- descriptor = Object.getOwnPropertyDescriptor(current.source, keys[propertyIndex]);
119
- if (!descriptor.value || typeof descriptor.value !== "object") {
120
- Object.defineProperty(current.target, keys[propertyIndex], descriptor);
121
- continue;
122
- }
123
- nextSource = descriptor.value;
124
- descriptor.value = Array.isArray(nextSource) ?
125
- [] :
126
- Object.create(Object.getPrototypeOf(nextSource));
127
- if (circular) {
128
- indexOf = sourceReferences.indexOf(nextSource);
129
- if (indexOf !== -1) {
130
- // The source is already referenced, just assign reference
131
- descriptor.value = targetReferences[indexOf];
132
- Object.defineProperty(current.target, keys[propertyIndex], descriptor);
133
- continue;
134
- }
135
- sourceReferences.push(nextSource);
136
- targetReferences.push(descriptor.value);
137
- }
138
- Object.defineProperty(current.target, keys[propertyIndex], descriptor);
139
- copies.push({ source: nextSource, target: descriptor.value });
140
- }
141
- }
142
- return cloneObject;
143
- }
144
- static IsEmpty(obj) {
145
- return isNill(obj) || Object.getOwnPropertyNames(obj).length === 0;
146
- }
147
- // Returns whether given object is an existing, plain object. That is, it defined, its type if 'object' and it is NOT an array or func.
148
- static IsPlainObject(object) {
149
- return object !== null && !Array.isArray(object) && typeof object !== "function" && typeof object === "object";
150
- }
151
- /**
152
- * Returns an instance of given class with data of given dataObject. Only works if that class has a default constructor without args.
153
- * Does not actually create a new object if it alread is an instance of that class.
154
- * @param {any} clazz A class that has a default constructor
155
- * @param {any} [dataObject] The object with data to copy to the new instance of the class
156
- * @returns {any} An object that is an instance of given class, with given data applied to it.
157
- */
158
- static MakeInstanceOf(clazz, dataObject) {
159
- // dont make a clone if given dataObject already instance of clazz
160
- if (dataObject instanceof clazz) {
161
- return dataObject;
162
- }
163
- else {
164
- const asClazz = new clazz();
165
- ObjectUtils.CopyPropertiesFrom(dataObject, asClazz);
166
- return asClazz;
167
- }
168
- }
169
- // Returns the value of a random own property of given object.
170
- static PickRandomPropertyValue(object) {
171
- if (!object) {
172
- return;
173
- }
174
- let result;
175
- let count = 0;
176
- for (const prop in object) {
177
- if (object.hasOwnProperty(prop)) {
178
- count++;
179
- if (Math.random() < 1 / count) {
180
- result = object[prop];
181
- }
182
- }
183
- }
184
- return result;
185
- }
186
- // Returns a default if given value doesn't exist, otherwise just value.
187
- static ValueOrDefault(value, defaultReturnVal = "") {
188
- return notNill(value) ? value : defaultReturnVal;
189
- }
190
- static _isArguments(x) {
191
- const supportsArgsClass = this._supportsArgumentsClass();
192
- return supportsArgsClass ? this._isArgumentsWhenArgsClassSupported(x) : this._isArgumentsWhenArgsClassNotSupported(x);
193
- }
194
- static _isArgumentsWhenArgsClassNotSupported(object) {
195
- return object &&
196
- typeof object === "object" &&
197
- typeof object.length === "number" &&
198
- Object.prototype.hasOwnProperty.call(object, "callee") &&
199
- !Object.prototype.propertyIsEnumerable.call(object, "callee") ||
200
- false;
201
- }
202
- static _isArgumentsWhenArgsClassSupported(object) {
203
- return Object.prototype.toString.call(object) === "[object Arguments]";
204
- }
205
- static _isBuffer(x) {
206
- if (!x || typeof x !== "object" || typeof x.length !== "number") {
207
- return false;
208
- }
209
- if (typeof x.copy !== "function" || typeof x.slice !== "function") {
210
- return false;
211
- }
212
- return !(x.length > 0 && typeof x[0] !== "number");
213
- }
214
- static _isUndefinedOrNull(value) {
215
- return value === null || value === undefined;
216
- }
217
- static _objEquiv(a, b) {
218
- let i, key;
219
- if (this._isUndefinedOrNull(a) || this._isUndefinedOrNull(b)) {
220
- return false;
221
- }
222
- if (a.prototype !== b.prototype) {
223
- return false;
224
- }
225
- if (this._isArguments(a)) {
226
- if (!this._isArguments(b)) {
227
- return false;
228
- }
229
- a = Array.prototype.slice.call(a);
230
- b = Array.prototype.slice.call(b);
231
- return this.DeepEquals(a, b);
232
- }
233
- if (this._isBuffer(a)) {
234
- if (!this._isBuffer(b)) {
235
- return false;
236
- }
237
- if (a.length !== b.length) {
238
- return false;
239
- }
240
- for (i = 0; i < a.length; i++) {
241
- if (a[i] !== b[i]) {
242
- return false;
243
- }
244
- }
245
- return true;
246
- }
247
- let ka;
248
- let kb;
249
- try {
250
- ka = Object.keys(a);
251
- kb = Object.keys(b);
252
- }
253
- catch (e) {
254
- return false;
255
- }
256
- if (ka.length !== kb.length) {
257
- return false;
258
- }
259
- ka.sort();
260
- kb.sort();
261
- for (i = ka.length - 1; i >= 0; i--) {
262
- if (ka[i] !== kb[i]) {
263
- return false;
264
- }
265
- }
266
- for (i = ka.length - 1; i >= 0; i--) {
267
- key = ka[i];
268
- if (!this.DeepEquals(a[key], b[key])) {
269
- return false;
270
- }
271
- }
272
- return typeof a === typeof b;
273
- }
274
- static _supportsArgumentsClass() {
275
- return Object.prototype.toString.call(arguments) === "[object Arguments]";
276
- }
277
- }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkY29tcG9uZW50cy9zcmMvbGliL3V0aWxzL29iamVjdC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXJELHFEQUFxRDtBQUNyRCxNQUFNLE9BQU8sV0FBVztJQUVwQjs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQWE7UUFDbkMsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0QsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ2pCLE1BQU07YUFDVDtTQUNKO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBSSxJQUFZLEVBQUUsRUFBSyxFQUFFLGlCQUEwQixJQUFJO1FBQ25GLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDTCxFQUFFLEdBQUcsRUFBTyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUN6RCxJQUFJLGNBQWMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLEVBQUUsQ0FB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QUFDLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxLQUFLLENBQUM7YUFDaEI7U0FDSjtRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLE1BQU0sQ0FBQyx1QkFBdUI7UUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssb0JBQW9CLENBQUM7SUFDOUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc05pbGx9IGZyb20gXCIuL2lzLW5pbGwuZnVuY3Rpb25cIjtcclxuaW1wb3J0IHtub3ROaWxsfSBmcm9tIFwiLi9mdW5jdGlvbi9ub3QtbmlsbC5mdW5jdGlvblwiO1xyXG5cclxuLy8gU3RhdGljIHV0aWxpdHkgZnVuY3Rpb24gaG9sZGVyIHJlbGF0ZWQgdG8gb2JqZWN0cy5cclxuZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciBhbGwgZ2l2ZW4gdmFsdWVzIGV4aXN0OiBmb3IgYWxsIHZhbHVlcyBpdCBob2xkcyB0aGF0IHRoZXkgYXJlIG5vdCBudWxsIG5vciB1bmRlZmluZWQuIFNob3J0LWNpcmN1aXQgY2hlY2suXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWVzIFJlc3QgcGFyYW1ldGVycyB3aXRoIGFsbCBvYmplY3RzIHRvIGNoZWNrIGV4aXN0ZW5jZSBmb3IuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBBTEwgZ2l2ZW4gdmFsdWVzIGFyZSBub3QgbnVsbCBub3IgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2UgKGlmIGF0IGxlYXN0IG9uZSB2YWx1ZSB3YXMgbnVsbCBvciB1bmRlZmluZWQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQWxsRXhpc3QoLi4udmFsdWVzOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBhbGxFeGlzdDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGlzTmlsbCh2YWx1ZXNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFsbEV4aXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29waWVzIGFsbCBwcm9wZXJ0aWVzIGZyb20gb2JqZWN0ICdmcm9tJyB0byBvYmplY3QgJ3RvJy4gT3ZlcndyaXRlcyBwcm9wZXJ0aWVzIG9uIG9iamVjdCAndG8nIGlmIHByb3BlcnR5IGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICogRG9lcyBub3QgY29weSBmdW5jdGlvbnMsIG9ubHkgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmcm9tIFRoZSBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBhbGwgcHJvcGVydGllcyBvZiB0byB0aGUgJ3RvJyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdG8gVGhlIG9iamVjdCB0byB3aGljaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgJ2Zyb20nIG9iamVjdCB3aWxsIGJlIGNvcGllZC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5kZWZpbmVkID0gdHJ1ZV0gd2V0aGVyIHRoZSAndG8nIG9iamVjdCBtYXkgYmUgYXNzaWduZWQgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHRvIGFueSBvZiBpdHMgcHJvcGVydGllcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb3B5UHJvcGVydGllc0Zyb208VD4oZnJvbTogT2JqZWN0LCB0bzogVCwgYWxsb3dVbmRlZmluZWQ6IGJvb2xlYW4gPSB0cnVlKTogVCB7XHJcbiAgICAgICAgaWYgKCF0bykge1xyXG4gICAgICAgICAgICB0byA9IHt9IGFzIFQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZnJvbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdFV0aWxzLkZvck93blByb3BlcnR5KGZyb20sICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYWxsb3dVbmRlZmluZWQgfHwgbm90TmlsbCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRvW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIERlZXBFcXVhbHMoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIERhdGUgJiYgZXhwZWN0ZWQgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCB0eXBlb2YgYWN0dWFsICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBleHBlY3RlZCAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSBleHBlY3RlZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlcmZvcm1zIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIG93biBwcm9wZXJ0eSBvZiBnaXZlbiBwbGFpbiBvYmplY3QuIEFsc28gd29ya3Mgb24gc3RyaW5nIGVudW1zLlxyXG4gICAgcHVibGljIHN0YXRpYyBGb3JPd25Qcm9wZXJ0eShwbGFpbk9iamVjdDogYW55LCBjYWxsYmFjazogKHByb3BWYWw6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5Jc1BsYWluT2JqZWN0KHBsYWluT2JqZWN0KSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBsYWluT2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkgJiYgdHlwZW9mIHBsYWluT2JqZWN0W2tleV0gIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlOiBib29sZWFuID0gY2FsbGJhY2socGxhaW5PYmplY3Rba2V5XSwga2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIG9mIGdpdmVuIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgY2FuIGJlIGFuIG9iamVjdCBvciBhIGNsYXNzLlxyXG4gICAgcHVibGljIHN0YXRpYyBHZXRDbGFzc05hbWUob2JqZWN0T3JDbGFzczogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIW9iamVjdE9yQ2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgLy8gYXJnIHdhcyBhIGNsYXNzIChvciBhIGZ1bmN0aW9uLi4pXHJcbiAgICAgICAgfSBlbHNlIGlmIChvYmplY3RPckNsYXNzLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0T3JDbGFzcy5uYW1lOyAvLyAuLiB3aGljaCBoYXMgaXRzIHJlYWRhYmxlIG5hbWUgc3RvcmVzIGxpa2UgdGhpc1xyXG4gICAgICAgICAgICAvLyBlbHNlIGFyZyB3YXMgYW4gb2JqZWN0XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3JTdHJpbmc6IHN0cmluZyA9IG9iamVjdE9yQ2xhc3MuY29uc3RydWN0b3IudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yU3RyaW5nLm1hdGNoKC9cXHcrL2cpWzFdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgZ2l2ZW4gb3JpZ2luYWwgb2JqZWN0LiBUaGUgY2xvbmUgaXMgYSBTSU1QTEUgT0JKRUNUIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgb3JpZ2luYWwuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFNoYWxsb3dDbG9uZShvcmlnaW5hbE9iamVjdDogYW55LCBvYmplY3RDbGFzcz86IGFueSk6IGFueSB7XHJcbiAgICAgICAgbGV0IGNsb25lZE9iamVjdDogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBpZiAob2JqZWN0Q2xhc3MpIHtcclxuICAgICAgICAgICAgY2xvbmVkT2JqZWN0ID0gbmV3IG9iamVjdENsYXNzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2xvbmVkT2JqZWN0ID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBPYmplY3RVdGlscy5Gb3JPd25Qcm9wZXJ0eShvcmlnaW5hbE9iamVjdCwgKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNsb25lZE9iamVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZWRPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBHZXREZWVwQ2xvbmUob3JpZ2luYWxPYmplY3Q6IGFueSwgY2lyY3VsYXI6IGJvb2xlYW4gPSB0cnVlKTogYW55IHtcclxuICAgICAgICAvLyBGaXJzdCBjcmVhdGUgYW4gZW1wdHkgb2JqZWN0IHdpdGhcclxuICAgICAgICAvLyBzYW1lIHByb3RvdHlwZSBvZiBvdXIgb3JpZ2luYWwgc291cmNlXHJcblxyXG4gICAgICAgIGxldCBwcm9wZXJ0eUluZGV4OiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcjtcclxuICAgICAgICBsZXQga2V5czogc3RyaW5nW107XHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IGFueTtcclxuICAgICAgICBsZXQgbmV4dFNvdXJjZTogYW55O1xyXG4gICAgICAgIGxldCBpbmRleE9mOiBudW1iZXI7XHJcbiAgICAgICAgY29uc3QgY29waWVzOiBhbnlbXSA9IFt7XHJcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWxPYmplY3QsXHJcbiAgICAgICAgICAgIHRhcmdldDogT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxPYmplY3QpKVxyXG4gICAgICAgIH1dO1xyXG4gICAgICAgIGNvbnN0IGNsb25lT2JqZWN0OiBhbnkgPSBjb3BpZXNbMF0udGFyZ2V0O1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZVJlZmVyZW5jZXM6IGFueVtdID0gW29yaWdpbmFsT2JqZWN0XTtcclxuICAgICAgICBjb25zdCB0YXJnZXRSZWZlcmVuY2VzOiBhbnlbXSA9IFtjbG9uZU9iamVjdF07XHJcblxyXG4gICAgICAgIC8vIEZpcnN0IGluLCBmaXJzdCBvdXRcclxuICAgICAgICB3aGlsZSAoY3VycmVudCA9IGNvcGllcy5zaGlmdCgpKSB7IC8vTk9TT05BUlxyXG4gICAgICAgICAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudC5zb3VyY2UpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChwcm9wZXJ0eUluZGV4ID0gMDsgcHJvcGVydHlJbmRleCA8IGtleXMubGVuZ3RoOyBwcm9wZXJ0eUluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHNvdXJjZSdzIGRlc2NyaXB0b3JcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnQuc291cmNlLCBrZXlzW3Byb3BlcnR5SW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IudmFsdWUgfHwgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VycmVudC50YXJnZXQsIGtleXNbcHJvcGVydHlJbmRleF0sIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG5leHRTb3VyY2UgPSBkZXNjcmlwdG9yLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IEFycmF5LmlzQXJyYXkobmV4dFNvdXJjZSkgP1xyXG4gICAgICAgICAgICAgICAgICAgIFtdIDpcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXh0U291cmNlKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZiA9IHNvdXJjZVJlZmVyZW5jZXMuaW5kZXhPZihuZXh0U291cmNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2YgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgaXMgYWxyZWFkeSByZWZlcmVuY2VkLCBqdXN0IGFzc2lnbiByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IHRhcmdldFJlZmVyZW5jZXNbaW5kZXhPZl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJyZW50LnRhcmdldCwga2V5c1twcm9wZXJ0eUluZGV4XSwgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlUmVmZXJlbmNlcy5wdXNoKG5leHRTb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFJlZmVyZW5jZXMucHVzaChkZXNjcmlwdG9yLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VycmVudC50YXJnZXQsIGtleXNbcHJvcGVydHlJbmRleF0sIGRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvcGllcy5wdXNoKHtzb3VyY2U6IG5leHRTb3VyY2UsIHRhcmdldDogZGVzY3JpcHRvci52YWx1ZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2xvbmVPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBJc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGlzTmlsbChvYmopIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgd2hldGhlciBnaXZlbiBvYmplY3QgaXMgYW4gZXhpc3RpbmcsIHBsYWluIG9iamVjdC4gVGhhdCBpcywgaXQgZGVmaW5lZCwgaXRzIHR5cGUgaWYgJ29iamVjdCcgYW5kIGl0IGlzIE5PVCBhbiBhcnJheSBvciBmdW5jLlxyXG4gICAgcHVibGljIHN0YXRpYyBJc1BsYWluT2JqZWN0KG9iamVjdDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpICYmIHR5cGVvZiBvYmplY3QgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBnaXZlbiBjbGFzcyB3aXRoIGRhdGEgb2YgZ2l2ZW4gZGF0YU9iamVjdC4gT25seSB3b3JrcyBpZiB0aGF0IGNsYXNzIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aG91dCBhcmdzLlxyXG4gICAgICogRG9lcyBub3QgYWN0dWFsbHkgY3JlYXRlIGEgbmV3IG9iamVjdCBpZiBpdCBhbHJlYWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy5cclxuICAgICAqIEBwYXJhbSB7YW55fSBjbGF6eiBBIGNsYXNzIHRoYXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHthbnl9IFtkYXRhT2JqZWN0XSBUaGUgb2JqZWN0IHdpdGggZGF0YSB0byBjb3B5IHRvIHRoZSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyB7YW55fSBBbiBvYmplY3QgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiBnaXZlbiBjbGFzcywgd2l0aCBnaXZlbiBkYXRhIGFwcGxpZWQgdG8gaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgTWFrZUluc3RhbmNlT2YoY2xheno6IGFueSwgZGF0YU9iamVjdD86IGFueSk6IGFueSB7XHJcbiAgICAgICAgLy8gZG9udCBtYWtlIGEgY2xvbmUgaWYgZ2l2ZW4gZGF0YU9iamVjdCBhbHJlYWR5IGluc3RhbmNlIG9mIGNsYXp6XHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3QgaW5zdGFuY2VvZiBjbGF6eikge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBhc0NsYXp6OiBhbnkgPSBuZXcgY2xhenooKTtcclxuICAgICAgICAgICAgT2JqZWN0VXRpbHMuQ29weVByb3BlcnRpZXNGcm9tKGRhdGFPYmplY3QsIGFzQ2xhenopO1xyXG4gICAgICAgICAgICByZXR1cm4gYXNDbGF6ejtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgYSByYW5kb20gb3duIHByb3BlcnR5IG9mIGdpdmVuIG9iamVjdC5cclxuICAgIHB1YmxpYyBzdGF0aWMgUGlja1JhbmRvbVByb3BlcnR5VmFsdWUob2JqZWN0OiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgICAgICBsZXQgY291bnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIG9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAxIC8gY291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmplY3RbcHJvcF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIGEgZGVmYXVsdCBpZiBnaXZlbiB2YWx1ZSBkb2Vzbid0IGV4aXN0LCBvdGhlcndpc2UganVzdCB2YWx1ZS5cclxuICAgIHB1YmxpYyBzdGF0aWMgVmFsdWVPckRlZmF1bHQodmFsdWU6IGFueSwgZGVmYXVsdFJldHVyblZhbDogYW55ID0gXCJcIik6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIG5vdE5pbGwodmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0UmV0dXJuVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIF9pc0FyZ3VtZW50cyh4OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzdXBwb3J0c0FyZ3NDbGFzczogYm9vbGVhbiA9IHRoaXMuX3N1cHBvcnRzQXJndW1lbnRzQ2xhc3MoKTtcclxuICAgICAgICByZXR1cm4gc3VwcG9ydHNBcmdzQ2xhc3MgPyB0aGlzLl9pc0FyZ3VtZW50c1doZW5BcmdzQ2xhc3NTdXBwb3J0ZWQoeCkgOiB0aGlzLl9pc0FyZ3VtZW50c1doZW5BcmdzQ2xhc3NOb3RTdXBwb3J0ZWQoeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2lzQXJndW1lbnRzV2hlbkFyZ3NDbGFzc05vdFN1cHBvcnRlZChvYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBvYmplY3QgJiZcclxuICAgICAgICAgICAgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICAgICAgICB0eXBlb2Ygb2JqZWN0Lmxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJlxyXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBcImNhbGxlZVwiKSAmJlxyXG4gICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgXCJjYWxsZWVcIikgfHxcclxuICAgICAgICAgICAgZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2lzQXJndW1lbnRzV2hlbkFyZ3NDbGFzc1N1cHBvcnRlZChvYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaXNCdWZmZXIoeDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB4Lmxlbmd0aCAhPT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgeC5jb3B5ICE9PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHguc2xpY2UgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAhKHgubGVuZ3RoID4gMCAmJiB0eXBlb2YgeFswXSAhPT0gXCJudW1iZXJcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2lzVW5kZWZpbmVkT3JOdWxsKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfb2JqRXF1aXYoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaTogbnVtYmVyLCBrZXk6IHN0cmluZztcclxuICAgICAgICBpZiAodGhpcy5faXNVbmRlZmluZWRPck51bGwoYSkgfHwgdGhpcy5faXNVbmRlZmluZWRPck51bGwoYikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGEucHJvdG90eXBlICE9PSBiLnByb3RvdHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5faXNBcmd1bWVudHMoYSkpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FyZ3VtZW50cyhiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtcclxuICAgICAgICAgICAgYiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5EZWVwRXF1YWxzKGEsIGIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faXNCdWZmZXIoYSkpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0J1ZmZlcihiKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBrYTogc3RyaW5nW107XHJcbiAgICAgICAgbGV0IGtiOiBzdHJpbmdbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBrYSA9IE9iamVjdC5rZXlzKGEpO1xyXG4gICAgICAgICAgICBrYiA9IE9iamVjdC5rZXlzKGIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGthLnNvcnQoKTtcclxuICAgICAgICBrYi5zb3J0KCk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAga2V5ID0ga2FbaV07XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5EZWVwRXF1YWxzKGFba2V5XSwgYltrZXldKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N1cHBvcnRzQXJndW1lbnRzQ2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,6 +0,0 @@
1
- export declare enum SendOption {
2
- Email = 0,
3
- Print = 1,
4
- Pdf = 2,
5
- Xml = 3
6
- }
@@ -1,23 +0,0 @@
1
- import { BusinessObject } from "../model/business-object";
2
- export declare class BusinessObjectFactory {
3
- constructor();
4
- /**
5
- * Creates and returns a new business data object instance of given class, with all given data properties applied to it in a
6
- * complex-aware style. That is, all properties on given class that are decorated with @ComplexField(..) or @ComplexArray(..) decorators
7
- * become strongly typed business objects, with methods that are usable and such.
8
- *
9
- * @param modelClass
10
- * @param {Object} rawData The object with all (possibly raw/flat/not alive) data to be applied to the created model object
11
- */
12
- makeWithRawBackendData(modelClass: any, rawData: Object): BusinessObject;
13
- makeBOArrayFromRawBackendDataArray(modelClass: any, arrayOfRawDatas: Object[]): BusinessObject[];
14
- instantiateNewBo(modelClass: any): BusinessObject;
15
- /**
16
- * Applies all properties of given 'source' object to the given 'destination' businessobject, if destination has that property.
17
- * Works with the @ComplexField(), @ComplexArray, @BooleanText, @CoInject and @DateField annotations of given destination model.
18
- *
19
- * @param sourceData Raw data to copy to destination model
20
- * @param {BusinessObject} destinationModel InOut: The annotated businessobject to apply source properties to
21
- */
22
- private _copyAllPropertiesDecoratorProcessedFrom;
23
- }
@@ -1,43 +0,0 @@
1
- import { DbBooleanValueType } from "@colijnit/articleapi/build/enum/db-boolean-value-type.enum";
2
- /**
3
- * There are 'J', 'T', 'N', 'F', 0 and 1 'boolean values' in the database. These should be translated to true and false boolean values in
4
- * our client application.
5
- *
6
- * The values 'J' and 'N' seem to be most commonly used. This is the default setting when using this decorator.
7
- * You can pass 'T' or 1 for the other variants as follows:
8
- *
9
- * Usage:
10
- *
11
- * @BooleanText() or @BooleanText("J") (the default, uses YesNoDbType char values)
12
- * public foo: boolean // 'J' and 'N' become true and false after BusinessObjectFactoryService and -SerializerService processing
13
- *
14
- * @BooleanText('T') (uses TrueFalseDbType char values)
15
- * public bar: boolean // 'T' and 'F' become true and false after BusinessObjectFactoryService and -SerializerService processing
16
- *
17
- * @BooleanText(1)
18
- * public baz: boolean // 1 and 0 become true and false after BusinessObjectFactoryService and -SerializerService processing
19
- */
20
- export declare function BooleanText(type?: "J" | "T" | 1): PropertyDecorator;
21
- export declare class BooleanTextDecorator {
22
- /**
23
- * Returns whether given property (as a string) on given object is a boolean text field. That is, it's a field that is decorated
24
- * with the @BooleanText decorator.
25
- */
26
- static IsBooleanTextField(target: Object, propertyKey: string): boolean;
27
- /**
28
- * Returns the logical true or false value of given character ('J', 'N', 'T' or 'F') or number (0 or 1).
29
- * Returns UNDEFINED if given boolChar was not recognised as a boolean text.
30
- */
31
- static GetLogicalBooleanValue(dbBoolChar: DbBooleanValueType | string): boolean;
32
- /**
33
- * Returns the boolean character / number of given logical bool property on target object. Uses its @BooleanText() annotation to decide
34
- * what character / number to return.
35
- * Used in BusinessObjectSerializerServiceService to convert logical bools to their original boolean character.
36
- * @returns {string|number} The original, reverse-engineered boolean character (or number) of given object property, or undefined.
37
- */
38
- static GetDbBooleanValue(target: Object, propertyKey: string): DbBooleanValueType;
39
- private static _IsJaNeeProp;
40
- private static _IsTrueFalseProp;
41
- private static _IsZeroOneProp;
42
- private static _IsProp;
43
- }
@@ -1,25 +0,0 @@
1
- /**
2
- * !! just a TAG DECORATOR for now, there is no code that uses this meta data within the ione connector lib itself.
3
- */
4
- /**
5
- * Property decorator for properties of businessobject classes that are an array of other strongly typed businessobjects.
6
- * Ensures that the BusinessObjectFactoryService makes properly typed objects from incoming raw persistence data. Otherwise we couldn't add methods
7
- * to our own businessobjects and use them, since all fields would be flat data without methods after BusinessObjectFactoryService creation.
8
- *
9
- * Usage:
10
- *
11
- * @ComplexArray(TransactionLine)
12
- * public transactionLines: TransactionLine[]
13
- */
14
- export declare function ComplexArray(type: any): PropertyDecorator;
15
- export declare class ComplexArrayDecorator {
16
- /**
17
- * Returns whether given property (as a string) on given object is a complex array. A complex array is an array field that is decorated
18
- * with the @ComplexArray decorator.
19
- */
20
- static IsComplexArray(target: Object, propertyKey: string): boolean;
21
- /**
22
- * Returns the VALUE of the @ComplexArray(VALUE) property decorator on the given propertyKey on the given modelobject.
23
- */
24
- static GetComplexArrayType(target: Object, propertyKey: string): any;
25
- }
@@ -1,25 +0,0 @@
1
- /**
2
- * !! just a TAG DECORATOR for now, there is no code that uses this meta data within the ione connector lib itself.
3
- */
4
- /**
5
- * Property decorator for properties of businessobject classes that are other strongly typed businessobjects.
6
- * Ensures that the BusinessObjectFactoryService makes properly typed objects from incoming raw persistence data. Otherwise we couldn't add methods
7
- * to our own businessobjects and use them, since all fields would be flat data without methods after BusinessObjectFactoryService creation.
8
- *
9
- * Usage:
10
- *
11
- * @ComplexField(Transaction)
12
- * public transaction: Transaction
13
- *
14
- * Also keeps track of a "complexFieldProps" metadata on the class-level, as a reflect-metadata workaround to be able to
15
- * retrieve all properties that have the @ComplexField(..) decorator (impossible with current Reflect API).
16
- */
17
- export declare function ComplexField(type: any): PropertyDecorator;
18
- export declare class ComplexFieldDecorator {
19
- /**
20
- * Returns whether given property (as a string) on given object is a complex field. A complex field is a field that is decorated
21
- * with the @ComplexField decorator.
22
- */
23
- static IsComplexField(target: Object, propertyKey: string): boolean;
24
- static GetComplexFieldType(target: Object, propertyKey: string): any;
25
- }
@@ -1,17 +0,0 @@
1
- /**
2
- * !! just a TAG DECORATOR for now, there is no code that uses this meta data within the ione connector lib itself.
3
- */
4
- /**
5
- * Property decorator for properties of businessobject classes that are of type Date, but are sent to us as strings.
6
- * Ensures that the BusinessObjectFactory makes proper JavaScript Date objects from incoming strings for @DateField() decorated properties.
7
- *
8
- * Usage:
9
- *
10
- * @DateField()
11
- * public expectedDeliveryDate: Date
12
- */
13
- export declare function DateField(): PropertyDecorator;
14
- export declare class DateFieldFieldDecorator {
15
- static IsDateField(target: Object, propertyKey: string): boolean;
16
- static StringAsDate(str: string): Date;
17
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * !! just a TAG DECORATOR for now, there is no code that uses this meta data within the ione connector lib itself.
3
- */
4
- /**
5
- * Decorator for properties of businessobjects that are sent to us as strings from the database, but which we want to use as a number in the client.
6
- *
7
- * Can be handy for incongruent backend api cases, where id data types are communicated wrongly via strings instead of numbers
8
- * (e.g. on EmployeeFullObject.district, points to a District which has a number id, but in employee it's a string representation of that number...)
9
- *
10
- * Used by business object factory and -serializer.
11
- *
12
- * Usage:
13
- *
14
- * @StringNumber()
15
- * public rights: UserRightType
16
- */
17
- export declare function StringNumber(): PropertyDecorator;
18
- export declare class StringNumberDecorator {
19
- static IsStringNumber(target: Object, propertyKey: string): boolean;
20
- static StringAsNumber(str: string): number;
21
- static NumberAsString(nr: number): string;
22
- }
@@ -1,7 +0,0 @@
1
- export declare type BusinessObjectIDType = number | string | Object;
2
- export declare abstract class BusinessObject {
3
- id: BusinessObjectIDType;
4
- getId(): BusinessObjectIDType;
5
- constructor();
6
- protected setOwnMappedPropsFromRawData(rawData?: any): void;
7
- }
@@ -1,63 +0,0 @@
1
- export declare class ArrayUtils {
2
- /**
3
- * Returns whether at least one element in given array could be found by given finder function.
4
- *
5
- * @param {T[]} array
6
- * @param {(element: T) => boolean} finder A finder function that takes an element of the array and returns a boolean that represents
7
- * the 'found status' for that element; whether it should have been found or not.
8
- */
9
- static ContainsAnElementFoundBy<T>(array: T[], finder: (element: T) => boolean): boolean;
10
- /**
11
- * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
12
- * undefined when none was found.
13
- *
14
- * Example usage:
15
- * const foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
16
- * (return modelItem.getId() === '1')
17
- * * });
18
- *
19
- * @param array The array with items to search in.
20
- * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
21
- */
22
- static Find<T>(array: T[], foundBy: (item: T) => boolean): T;
23
- static FindAll<T>(array: T[], foundBy: (item: T) => boolean): T[];
24
- static CloneArray<T>(array: T[]): T[];
25
- /**
26
- * Returns a 'semi deep clone' of given array. Its first-level members are object-shallow-cloned (optionally with a strongly typed constructor),
27
- * or just as plain object (see param arrayItemsClass).
28
- * @param array
29
- * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
30
- * it'll be a plain object.
31
- * @param deepClone Set to true if array items contain FUNCTIONS that need to be cloned..
32
- * @returns {Array} semi-deep clone of given array
33
- */
34
- static CloneArrayAndItsItems<T>(array: T[], arrayItemsClass?: any, deepClone?: boolean): T[];
35
- /**
36
- * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
37
- * removes the element using splice().
38
- *
39
- * @param {number} index
40
- * @param {any[]} array in-out
41
- * @returns {boolean} True if and only if the element on given index is succesfully removed from given array.
42
- */
43
- static RemoveElementAtIndex(index: number, array: any[]): boolean;
44
- /**
45
- * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really removes the
46
- * element using splice(). Also works on associative arrays.
47
- *
48
- * @param {T} element The element to remove.
49
- * @param {T[]} array The array to remove the element from.
50
- * @returns {boolean} True iff given element was truly successfully removed from given array.
51
- */
52
- static RemoveElement<T>(element: T, array: T[]): boolean;
53
- static IsArrayWithElements<T>(arrayToCheck: T[], classItemsMustBeInstanceOf?: any): boolean;
54
- static RemoveElementsByFilter(array: any[], filterFunction: (item: any) => boolean): boolean;
55
- static MoveElement<T>(element: T, toIndex: number, array: T[]): boolean;
56
- static PlaceElementAfterOther(array: any[], elementToPlace: any, afterThisElement: any): void;
57
- /**
58
- * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
59
- * @param array
60
- * @param itemValueFunction The function applied to each array item that gives it a numerical value. The max num val found is returned.
61
- */
62
- static GetMaxCalculatedValue<T>(array: T[], itemValueFunction: (item: T) => number): number;
63
- }
@@ -1,4 +0,0 @@
1
- export interface CheckPrecisionAndScaleResult {
2
- isOk: boolean;
3
- nearestOkNr?: number;
4
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Output object shape for NumberUtils.CheckWithinSteppedBounds(). For efficiency, this method also returns the found remainder if the given
3
- * number was NOT within the specified stepped bounds.
4
- */
5
- export interface CheckWithinSteppedBoundsResult {
6
- isOk: boolean;
7
- remainder?: number;
8
- }
@@ -1 +0,0 @@
1
- export declare function isNill(value: any): boolean;