1 /*
2 * Copyright (C) 2018 Alberto Irurueta Carro (alberto@irurueta.com)
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.irurueta.navigation.indoor;
17
18 import java.util.List;
19
20 /**
21 * Data related to a beacon whose transmitted power and standard deviation of
22 * such transmitted power is known.
23 */
24 public class BeaconWithPower extends Beacon implements RadioSourceWithPower {
25
26 /**
27 * Default exponent typically used on free space for path loss propagation in
28 * terms of distance. This value is used for free space environments.
29 */
30 public static final double DEFAULT_PATH_LOSS_EXPONENT = 2.0;
31
32 /**
33 * Standard deviation of transmitted power value or null if unknown.
34 */
35 private Double transmittedPowerStandardDeviation;
36
37 /**
38 * Exponent typically used on free space for path loss propagation in
39 * terms of distance.
40 * On different environments path loss exponent might have different values:
41 * - Free space: 2.0
42 * - Urban Area: 2.7 to 3.5
43 * - Suburban Area: 3 to 5
44 * - Indoor (line-of-sight): 1.6 to 1.8
45 * If path loss exponent estimation is not enabled, this value will always be equal to
46 * {@link #DEFAULT_PATH_LOSS_EXPONENT}
47 */
48 private double pathLossExponent = DEFAULT_PATH_LOSS_EXPONENT;
49
50 /**
51 * Standard deviation of path loss exponent or null if unknown.
52 */
53 private Double pathLossExponentStandardDeviation;
54
55 /**
56 * Constructor.
57 *
58 * @param identifiers list of the multipart identifiers of the beacon.
59 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
60 * @throws IllegalArgumentException if identifiers is null.
61 */
62 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower) {
63 super(identifiers, transmittedPower);
64 }
65
66 /**
67 * Constructor.
68 *
69 * @param identifiers list of the multipart identifiers of the beacon.
70 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
71 * @param bluetoothAddress the bluetooth mac address.
72 * @param beaconTypeCode the two byte value indicating the type of beacon.
73 * @param manufacturer a two byte code indicating the beacon manufacturer.
74 * @param serviceUuid a 32 bit service uuid for the beacon.
75 * @param bluetoothName the bluetooth device name.
76 * @throws IllegalArgumentException if identifiers is null.
77 */
78 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
79 final String bluetoothAddress, final int beaconTypeCode, final int manufacturer,
80 final int serviceUuid, final String bluetoothName) {
81 super(identifiers, transmittedPower, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
82 bluetoothName);
83 }
84
85 /**
86 * Constructor.
87 *
88 * @param identifiers list of the multipart identifiers of the beacon.
89 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
90 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
91 * if unknown.
92 * @throws IllegalArgumentException if identifiers is null or standard deviation is negative.
93 */
94 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
95 final Double transmittedPowerStandardDeviation) {
96 super(identifiers, transmittedPower);
97
98 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
99 throw new IllegalArgumentException();
100 }
101 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
102 }
103
104 /**
105 * Constructor.
106 *
107 * @param identifiers list of the multipart identifiers of the beacon.
108 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
109 * @param bluetoothAddress the bluetooth mac address.
110 * @param beaconTypeCode the two byte value indicating the type of beacon.
111 * @param manufacturer a two byte code indicating the beacon manufacturer.
112 * @param serviceUuid a 32 bit service uuid for the beacon.
113 * @param bluetoothName the bluetooth device name.
114 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
115 * if unknown.
116 * @throws IllegalArgumentException if identifiers is null.
117 */
118 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
119 final String bluetoothAddress, final int beaconTypeCode, final int manufacturer,
120 final int serviceUuid, final String bluetoothName,
121 final Double transmittedPowerStandardDeviation) {
122 super(identifiers, transmittedPower, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
123 bluetoothName);
124
125 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
126 throw new IllegalArgumentException();
127 }
128 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
129 }
130
131 /**
132 * Constructor.
133 *
134 * @param identifiers list of the multipart identifiers of the beacon.
135 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
136 * @param frequency frequency used by this Beacon.
137 * @param bluetoothAddress the bluetooth mac address.
138 * @param beaconTypeCode the two byte value indicating the type of beacon.
139 * @param manufacturer a two byte code indicating the beacon manufacturer.
140 * @param serviceUuid a 32 bit service uuid for the beacon.
141 * @param bluetoothName the bluetooth device name.
142 * @throws IllegalArgumentException if identifiers is null.
143 */
144 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
145 final double frequency, final String bluetoothAddress, final int beaconTypeCode,
146 final int manufacturer, final int serviceUuid, final String bluetoothName) {
147 super(identifiers, transmittedPower, frequency, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
148 bluetoothName);
149 }
150
151 /**
152 * Constructor.
153 *
154 * @param identifiers list of the multipart identifiers of the beacon.
155 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
156 * @param frequency frequency used by this Beacon.
157 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
158 * if unknown.
159 * @throws IllegalArgumentException if identifiers is null.
160 */
161 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
162 final double frequency, final Double transmittedPowerStandardDeviation) {
163 super(identifiers, transmittedPower, frequency);
164
165 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
166 throw new IllegalArgumentException();
167 }
168 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
169 }
170
171 /**
172 * Constructor.
173 *
174 * @param identifiers list of the multipart identifiers of the beacon.
175 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
176 * @param frequency frequency used by this Beacon.
177 * @param bluetoothAddress the bluetooth mac address.
178 * @param beaconTypeCode the two byte value indicating the type of beacon.
179 * @param manufacturer a two byte code indicating the beacon manufacturer.
180 * @param serviceUuid a 32 bit service uuid for the beacon.
181 * @param bluetoothName the bluetooth device name.
182 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
183 * if unknown.
184 * @throws IllegalArgumentException if identifiers is null.
185 */
186 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
187 final double frequency, final String bluetoothAddress, final int beaconTypeCode,
188 final int manufacturer, final int serviceUuid, final String bluetoothName,
189 final Double transmittedPowerStandardDeviation) {
190 super(identifiers, transmittedPower, frequency, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
191 bluetoothName);
192
193 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
194 throw new IllegalArgumentException();
195 }
196 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
197 }
198
199 /**
200 * Constructor.
201 *
202 * @param identifiers list of the multipart identifiers of the beacon.
203 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
204 * @param pathLossExponent path loss exponent. By default, this is 2.0.
205 * @throws IllegalArgumentException if identifiers is null.
206 */
207 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
208 final double pathLossExponent) {
209 this(identifiers, transmittedPower);
210 this.pathLossExponent = pathLossExponent;
211 }
212
213 /**
214 * Constructor.
215 *
216 * @param identifiers list of the multipart identifiers of the beacon.
217 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
218 * @param bluetoothAddress the bluetooth mac address.
219 * @param beaconTypeCode the two byte value indicating the type of beacon.
220 * @param manufacturer a two byte code indicating the beacon manufacturer.
221 * @param serviceUuid a 32 bit service uuid for the beacon.
222 * @param bluetoothName the bluetooth device name.
223 * @param pathLossExponent path loss exponent. By default, this is 2.0.
224 * @throws IllegalArgumentException if identifiers is null.
225 */
226 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
227 final String bluetoothAddress, final int beaconTypeCode, final int manufacturer,
228 final int serviceUuid, final String bluetoothName, final double pathLossExponent) {
229 this(identifiers, transmittedPower, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid, bluetoothName);
230 this.pathLossExponent = pathLossExponent;
231 }
232
233 /**
234 * Constructor.
235 *
236 * @param identifiers list of the multipart identifiers of the beacon.
237 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
238 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
239 * if unknown.
240 * @param pathLossExponent path loss exponent. By default, this is 2.0.
241 * @throws IllegalArgumentException if identifiers is null or standard deviation is negative.
242 */
243 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
244 final Double transmittedPowerStandardDeviation, final double pathLossExponent) {
245 this(identifiers, transmittedPower, pathLossExponent);
246
247 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
248 throw new IllegalArgumentException();
249 }
250 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
251 }
252
253 /**
254 * Constructor.
255 *
256 * @param identifiers list of the multipart identifiers of the beacon.
257 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
258 * @param bluetoothAddress the bluetooth mac address.
259 * @param beaconTypeCode the two byte value indicating the type of beacon.
260 * @param manufacturer a two byte code indicating the beacon manufacturer.
261 * @param serviceUuid a 32 bit service uuid for the beacon.
262 * @param bluetoothName the bluetooth device name.
263 * @param pathLossExponent path loss exponent. By default, this is 2.0.
264 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
265 * if unknown.
266 * @throws IllegalArgumentException if identifiers is null or standard deviation is negative.
267 */
268 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
269 final String bluetoothAddress, final int beaconTypeCode, final int manufacturer,
270 final int serviceUuid, final String bluetoothName, final double pathLossExponent,
271 final Double transmittedPowerStandardDeviation) {
272 this(identifiers, transmittedPower, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid, bluetoothName,
273 pathLossExponent);
274
275 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
276 throw new IllegalArgumentException();
277 }
278 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
279 }
280
281 /**
282 * Constructor.
283 *
284 * @param identifiers list of the multipart identifiers of the beacon.
285 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
286 * @param frequency frequency used by this Beacon.
287 * @param bluetoothAddress the bluetooth mac address.
288 * @param beaconTypeCode the two byte value indicating the type of beacon.
289 * @param manufacturer a two byte code indicating the beacon manufacturer.
290 * @param serviceUuid a 32 bit service uuid for the beacon.
291 * @param bluetoothName the bluetooth device name.
292 * @param pathLossExponent path loss exponent. By default, this is 2.0.
293 * @throws IllegalArgumentException if identifiers is null.
294 */
295 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
296 final double frequency, final String bluetoothAddress, final int beaconTypeCode,
297 final int manufacturer, final int serviceUuid, final String bluetoothName,
298 final double pathLossExponent) {
299 super(identifiers, transmittedPower, frequency, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
300 bluetoothName);
301 this.pathLossExponent = pathLossExponent;
302 }
303
304 /**
305 * Constructor.
306 *
307 * @param identifiers list of the multipart identifiers of the beacon.
308 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
309 * @param frequency frequency used by this Beacon.
310 * @param pathLossExponent path loss exponent. By default, this is 2.0.
311 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
312 * if unknown.
313 * @throws IllegalArgumentException if identifiers is null or standard deviation is negative.
314 */
315 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
316 final double frequency, final double pathLossExponent,
317 final Double transmittedPowerStandardDeviation) {
318 this(identifiers, transmittedPower, frequency, transmittedPowerStandardDeviation);
319 this.pathLossExponent = pathLossExponent;
320 }
321
322 /**
323 * Constructor.
324 *
325 * @param identifiers list of the multipart identifiers of the beacon.
326 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
327 * @param frequency frequency used by this Beacon.
328 * @param bluetoothAddress the bluetooth mac address.
329 * @param beaconTypeCode the two byte value indicating the type of beacon.
330 * @param manufacturer a two byte code indicating the beacon manufacturer.
331 * @param serviceUuid a 32 bit service uuid for the beacon.
332 * @param bluetoothName the bluetooth device name.
333 * @param pathLossExponent path loss exponent. By default, this is 2.0.
334 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
335 * if unknown.
336 * @throws IllegalArgumentException if identifiers is null or standard deviation is negative.
337 */
338 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
339 final double frequency, final String bluetoothAddress, final int beaconTypeCode,
340 final int manufacturer, final int serviceUuid, final String bluetoothName,
341 final double pathLossExponent, final Double transmittedPowerStandardDeviation) {
342 super(identifiers, transmittedPower, frequency, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
343 bluetoothName);
344 this.pathLossExponent = pathLossExponent;
345
346 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
347 throw new IllegalArgumentException();
348 }
349 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
350 }
351
352 /**
353 * Constructor.
354 *
355 * @param identifiers list of the multipart identifiers of the beacon.
356 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
357 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
358 * if unknown.
359 * @param pathLossExponent path loss exponent. By default, this is 2.0.
360 * @param pathLossExponentStandardDeviation standard deviation of path loss exponent or null if
361 * unknown.
362 * @throws IllegalArgumentException if identifiers is null or any standard deviation is negative.
363 */
364 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
365 final Double transmittedPowerStandardDeviation, final double pathLossExponent,
366 final Double pathLossExponentStandardDeviation) {
367 this(identifiers, transmittedPower, pathLossExponent);
368
369 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
370 throw new IllegalArgumentException();
371 }
372 if (pathLossExponentStandardDeviation != null && pathLossExponentStandardDeviation < 0.0) {
373 throw new IllegalArgumentException();
374 }
375
376 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
377 this.pathLossExponentStandardDeviation = pathLossExponentStandardDeviation;
378 }
379
380 /**
381 * Constructor.
382 *
383 * @param identifiers list of the multipart identifiers of the beacon.
384 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
385 * @param bluetoothAddress the bluetooth mac address.
386 * @param beaconTypeCode the two byte value indicating the type of beacon.
387 * @param manufacturer a two byte code indicating the beacon manufacturer.
388 * @param serviceUuid a 32 bit service uuid for the beacon.
389 * @param bluetoothName the bluetooth device name.
390 * @param pathLossExponent path loss exponent. By default, this is 2.0.
391 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
392 * if unknown.
393 * @param pathLossExponentStandardDeviation standard deviation of path loss exponent or null if
394 * unknown.
395 * @throws IllegalArgumentException if identifiers is null or any standard deviation is negative.
396 */
397 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
398 final String bluetoothAddress, final int beaconTypeCode, final int manufacturer,
399 final int serviceUuid, final String bluetoothName, final double pathLossExponent,
400 final Double transmittedPowerStandardDeviation,
401 final Double pathLossExponentStandardDeviation) {
402 this(identifiers, transmittedPower, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid, bluetoothName,
403 pathLossExponent);
404
405 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
406 throw new IllegalArgumentException();
407 }
408 if (pathLossExponentStandardDeviation != null && pathLossExponentStandardDeviation < 0.0) {
409 throw new IllegalArgumentException();
410 }
411
412 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
413 this.pathLossExponentStandardDeviation = pathLossExponentStandardDeviation;
414 }
415
416 /**
417 * Constructor.
418 *
419 * @param identifiers list of the multipart identifiers of the beacon.
420 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
421 * @param frequency frequency used by this Beacon.
422 * @param pathLossExponent path loss exponent. By default, this is 2.0.
423 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
424 * if unknown.
425 * @param pathLossExponentStandardDeviation standard deviation of path loss exponent or null if
426 * unknown.
427 * @throws IllegalArgumentException if identifiers is null or any standard deviation is negative.
428 */
429 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
430 final double frequency, final double pathLossExponent,
431 final Double transmittedPowerStandardDeviation,
432 final Double pathLossExponentStandardDeviation) {
433 this(identifiers, transmittedPower, frequency, transmittedPowerStandardDeviation);
434 this.pathLossExponent = pathLossExponent;
435
436 if (pathLossExponentStandardDeviation != null && pathLossExponentStandardDeviation < 0.0) {
437 throw new IllegalArgumentException();
438 }
439
440 this.pathLossExponentStandardDeviation = pathLossExponentStandardDeviation;
441 }
442
443 /**
444 * Constructor.
445 *
446 * @param identifiers list of the multipart identifiers of the beacon.
447 * @param transmittedPower calibrated measured Tx power of the Beacon in RSSI (expressed in dBm's).
448 * @param frequency frequency used by this Beacon.
449 * @param bluetoothAddress the bluetooth mac address.
450 * @param beaconTypeCode the two byte value indicating the type of beacon.
451 * @param manufacturer a two byte code indicating the beacon manufacturer.
452 * @param serviceUuid a 32 bit service uuid for the beacon.
453 * @param bluetoothName the bluetooth device name.
454 * @param pathLossExponent path loss exponent. By default, this is 2.0.
455 * @param transmittedPowerStandardDeviation standard deviation of transmitted power value or null
456 * if unknown.
457 * @param pathLossExponentStandardDeviation standard deviation of path loss exponent or null if
458 * unknown.
459 * @throws IllegalArgumentException if identifiers is null.
460 */
461 public BeaconWithPower(final List<BeaconIdentifier> identifiers, final double transmittedPower,
462 final double frequency, final String bluetoothAddress, final int beaconTypeCode,
463 final int manufacturer, final int serviceUuid, final String bluetoothName,
464 final double pathLossExponent, final Double transmittedPowerStandardDeviation,
465 final Double pathLossExponentStandardDeviation) {
466 super(identifiers, transmittedPower, frequency, bluetoothAddress, beaconTypeCode, manufacturer, serviceUuid,
467 bluetoothName);
468 this.pathLossExponent = pathLossExponent;
469
470 if (transmittedPowerStandardDeviation != null && transmittedPowerStandardDeviation < 0.0) {
471 throw new IllegalArgumentException();
472 }
473 if (pathLossExponentStandardDeviation != null && pathLossExponentStandardDeviation < 0.0) {
474 throw new IllegalArgumentException();
475 }
476
477 this.transmittedPowerStandardDeviation = transmittedPowerStandardDeviation;
478 this.pathLossExponentStandardDeviation = pathLossExponentStandardDeviation;
479 }
480
481 /**
482 * Empty constructor.
483 */
484 protected BeaconWithPower() {
485 super();
486 }
487
488 /**
489 * Gets standard deviation of transmitted power value or null if unknown.
490 *
491 * @return standard deviation of transmitted power value or null if unknown.
492 */
493 @Override
494 public Double getTransmittedPowerStandardDeviation() {
495 return transmittedPowerStandardDeviation;
496 }
497
498 /**
499 * Gets exponent typically used on free space for path loss propagation in
500 * terms of distance.
501 * On different environments path loss exponent might have different values:
502 * - Free space: 2.0
503 * - Urban Area: 2.7 to 3.5
504 * - Suburban Area: 3 to 5
505 * - Indoor (line-of-sight): 1.6 to 1.8
506 * If path loss exponent estimation is not enabled, this value will always be equal to
507 * {@link #DEFAULT_PATH_LOSS_EXPONENT}
508 *
509 * @return path loss exponent.
510 */
511 @Override
512 public double getPathLossExponent() {
513 return pathLossExponent;
514 }
515
516 /**
517 * Gets standard deviation of path loss exponent or null if unknown.
518 *
519 * @return standard deviation of path loss exponent or null if unknown.
520 */
521 @Override
522 public Double getPathLossExponentStandardDeviation() {
523 return pathLossExponentStandardDeviation;
524 }
525 }