gitdemont / IFC

Tools for Imaging Flow Cytometry
GNU General Public License v3.0
4 stars 2 forks source link

Errors during ExtractFromXIF #3

Closed bavanesyan closed 9 months ago

bavanesyan commented 9 months ago

Hi,

Thanks a lot for developing this package. I'm facing two problems with the ExtractFromXIF function.

My data was generated with AMNIS ImageStream MkII. I am using the IFC package on the MacBook M2 Pro machine.

Whenever I try to extract features from the .rif file using ExtractFromXIF, I get an error. Here is the code and output.

blina_small_rif = ExtractFromXIF( fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = T )

Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Raw/Samples/20231213_blina_test_blina_6.rif, filesize:15320200390 @offset:1774340 Entries: 34 Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0 Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:273 Typ:4 Count:1 Value:4294967304 Bytes:4 Off:0 Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:282 Typ:5 Count:1 Value:4294967305 Bytes:8 Off:1 Tag:283 Typ:5 Count:1 Value:4294967313 Bytes:8 Off:1 Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33004 Typ:2 Count:22 Value:4294967321 Bytes:22 Off:1 Tag:33005 Typ:2 Count:5 Value:4294967343 Bytes:5 Off:1 Tag:33006 Typ:2 Count:12 Value:4294967348 Bytes:12 Off:1 Tag:33012 Typ:12 Count:1 Value:4294967360 Bytes:8 Off:1 Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33027 Typ:2 Count:53741 Value:4294967368 Bytes:53741 Off:1 Tag:33064 Typ:2 Count:1720474 Value:4295021109 Bytes:1720474 Off:1 Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33066 Typ:2 Count:11 Value:4296741583 Bytes:11 Off:1 Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33068 Typ:12 Count:1 Value:4296741594 Bytes:8 Off:1 Tag:33069 Typ:2 Count:11 Value:4296741602 Bytes:11 Off:1 Tag:33073 Typ:12 Count:1 Value:4296741613 Bytes:8 Off:1 Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33079 Typ:2 Count:7 Value:4296741621 Bytes:7 Off:1 Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0 Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:33085 Typ:12 Count:1 Value:4296741628 Bytes:8 Off:1 Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0 Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", : Start tag expected, '<' not found [4]

For the .cif file I get a warning and no feature values are extracted:

blina_big_cif = ExtractFromXIF( fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = F )

Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif, filesize:11496323255 @offset:8 Entries: 43 Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0 Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:273 Typ:4 Count:1 Value:8 Bytes:4 Off:0 Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:282 Typ:5 Count:1 Value:530 Bytes:8 Off:1 Tag:283 Typ:5 Count:1 Value:538 Bytes:8 Off:1 Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33000 Typ:4 Count:0 Value:11 Bytes:0 Off:0 Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33004 Typ:2 Count:22 Value:546 Bytes:22 Off:1 Tag:33005 Typ:2 Count:5 Value:568 Bytes:5 Off:1 Tag:33006 Typ:2 Count:12 Value:573 Bytes:12 Off:1 Tag:33009 Typ:4 Count:0 Value:120 Bytes:0 Off:0 Tag:33012 Typ:12 Count:1 Value:585 Bytes:8 Off:1 Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33020 Typ:12 Count:144 Value:593 Bytes:1152 Off:1 Tag:33023 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33026 Typ:2 Count:130 Value:1745 Bytes:130 Off:1 Tag:33027 Typ:2 Count:53742 Value:1875 Bytes:53742 Off:1 Tag:33064 Typ:2 Count:1720474 Value:55617 Bytes:1720474 Off:1 Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33066 Typ:2 Count:9 Value:1776091 Bytes:9 Off:1 Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33068 Typ:12 Count:1 Value:1776100 Bytes:8 Off:1 Tag:33069 Typ:2 Count:11 Value:1776108 Bytes:11 Off:1 Tag:33070 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33073 Typ:12 Count:1 Value:1776119 Bytes:8 Off:1 Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33079 Typ:2 Count:7 Value:1776127 Bytes:7 Off:1 Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0 Tag:33081 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:33083 Typ:1 Count:485274616 Value:1776134 Bytes:485274616 Off:1 Tag:33084 Typ:2 Count:779 Value:487050750 Bytes:779 Off:1 Tag:33085 Typ:12 Count:1 Value:487051529 Bytes:8 Off:1 Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0 /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif Mismatch in object number. Features values were not exported

My object number is 705341 events. I also see it in the tag 33018. When I try to estimate it following the way you described it in your function, I get completely random values

toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb") readBin(toread, what = "double",size = 4, n = 1, endian = "little")

[1] 3.883381e-39

If you need any further information, I am happy to provide it. I can also provide a file I am working with, however it is more than 12GB.

Thank you!

Best regards, Bogdan

gitdemont commented 9 months ago

Thanks for your interest in IFC package.

Since files are read in binary mode there may be problems with endianness (M2 architecture) or out of range values (big file):

However, from the outputs you pasted, it looks like that IFDs are at correctly extracted (at least the values of the tiff tags numbers are the expected ones and not weird things). So I think we can exclude the problem with the architecture but I can not rule out out-of-range though.

Just to be sure, could you confirm that on your M2 you can correctly read example files from IFCdata package ?

library(IFC)

file_rif <- system.file("extdata", "example.rif", package = "IFCdata")
rif <- ExtractFromXIF(fileName = file_rif)

file_cif <- system.file("extdata", "example.cif", package = "IFCdata")
cif <- ExtractFromXIF(fileName = file_cif)

In addition, are you able to see cells with

DisplayGallery(file_cif, objects = 0:4)

You mentioned that you got an error trying to read your rif file and a warning while reading your cif.

For the cif I suppose that you were able to read your file but did not get features values. Right ? It may be a normal behaviour that you got the warning while reading your cif file see https://github.com/gitdemont/IFC/blob/4fab637d9b61e93de681982bc6035a3cfc7aba91/R/ExtractFromXIF.R#L271 The warning happens because only a subset of the 705341 events features are found in the cif so features are not extracted rather than being extracted for only few of the total number of events.

For the rif According to your copy/paste it seems that the error occurs when trying to read the TAG "33027". To me, this is not normal behaviour and there seems to be an issue at this point with extracting information from this part of the file. Could you please try to look on your own rif at what gives:

IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
getFullTag(IFD, which = 1, tag = "33027") # expecting something starting with "<?xml version=

I don't know what you expect from

toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb")
readBin(toread, what = "double",size = 4, n = 1, endian = "little")

[1] 3.883381e-39

You said that you tried to extract features from rif and cif. Please note that features extracted from rif or cif are limited in comparison with the one extracted from daf files. Notably, not all features may have been stored within the files for all events (as what seems to happen with your cif)

bavanesyan commented 9 months ago

Hello,

Thank you for your quick response.

  1. Yes, I can correctly read example files on my machine:

    image image image
  2. The display function also works:

    image
  3. I also tried to run the same code on the Windows machine and got the same errors.

  4. For the .cif file I indeed don't get any features because of this warning. I can extract them from the .daf file. However, I would still like to access raw features from the .rif file.

  5. Regarding the:

toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb")
readBin(toread, what = "double",size = 4, n = 1, endian = "little")

I was trying to understand why the mismatch warning pops up and in my understanding, this is how obj_number_r from the line you mentioned is calculated. However, the results are different from the obj_number_r so probably I did something wrong.

  1. The output of:
    IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
    getFullTag(IFD, which = 1, tag = "33027") # expecting something starting with "<?xml version=
[1] "\xc7\n56WRc\fz\016{\nor1p\xe4`\xd7P\006\xc7Pp\xc0\nW!a\xc4pA\016{\"g&a\002R\027\002\027w\001'\027$\001\xd4\nf\003\026bw\016{a\002\ffw\002\025\xd0`\0206x\017 o\nR\022\006r\020y\n\xb2\xe7`B5\003'{\023\026\xa2\xc7`\002Qrr\n\006\x97\xf7\xa0\xe7p&\a\021Sa\xb2\a\nbq6`\020P\nt\002g0p\"w\xb1\027s\027\006\002\acp\006\f\027\022{\xc0@b\xd6`\027su\020\fzsB\xc0\n\037\x8f\xf7\xc1\xa4\xf7\xa5\xc3\xe2\xd1F\xb3f\f\017&j\017\017GB\030{\027\001p\004\"\026%\n{\006\f\031zg\frPQs\a\xc6P'`SCc\xc0\n\005a\001\001\xc5`\xd5@\021\006\n\xe6`Uas \026Ps7%\026\0017\006{\xc3P \025\xe4`q\022esC\002\x97\xc7p\xf6\xb0's\001\001&\020`\026'\xe7\xf0\xd6 t\021Ű'\xe5\n$z\016\026\f{\xe6``1t\003\020P\xc1pz\xc2@\002\0267{\020\n{\n\025\n4\021puc0T\f\003&w\f{\nv\003\xb07\021\025 6y\n`r\022\n{&\xb1\xc7`\xc1\xd0\xe6\n\xb2'\032mh\033\035-m\x9b\xa7\f=Xo\xd5@Ylxz9\xcc\xf0怅\f\xc55\016\016\n{\x83\xe7`\020y\xe3`\022y\fn\037o\xe4 f!\xf4\xa0Ǡ\xc7 f\020\nz\n\024\xf7\n\xc1\xa072{CC'\xc7@a!q\027\003zr\xb3\xd7Pp`c\xc1\xb0\xb7\xa7\xc4y\x9b\xe7\x85\032y\xbfǢ\035=\x8a\x87\xe6q,А\x85\xd6\xf2\xf0\xc3Ѥ\x97a\xd3 y\xa3\027f\017gU\f\021p z\fb\"{\001\"o\n\xf6\020_\f8zN\x96\xa3\x97\xf6ѐwx<(JM+'\017\xf5\xf0{\n)\036\xb0\xb7g\020\021\xb7's\xa2\as\x85\xa1\xc7@\"\026\xc4\020\026\006\aRv\xd1PR!AU\031\xd7\020\020w\027&\004\016`v'\027\xc7`\006a'`\"f\0035\aq!f\xd5P\xd7P\001\a\022f\001'\027\022\024 w\f\xb5\xd7\n\027eR2\001\026\020p\xe4p\a\n\034\016\xa07{'\xb3\027\a\030Eb\025\001\020r\001\nPW\n\nwRa\xc7`\xd7`$6A\f6\024\x93\027\xc1P`p\021\"&{5\fa\021\xb2\xd7@\021\006r&b\n{'װw\022WrSb\xc5P%7_M\xb9\x87\xf6\"[\017\xf8\x90\xa2\xa7\x97\001\032\x87\xf1\x86\x87R\016\x80W\031\f\003\006f\002%\xc5\nx\032n\002\032y\xd5ppR\f$s{\020B{\n\025\xa37\016P'Pb\017\u0080\xe7p4{\a\xc1@\027\020R\f{r\xc0`4B\0036z\016\026Us\xc1Pb\0277V2va\ng6q\005\f\027\021e\fz\fv!$@\nsp`\022\025C\001\xf0\xa0W\016F\ff\023u\nvs\a\xc7\n{\n%\xb27\xd4p&t\003\020qpP\002\017y#\n\x80g+\xa1\xd6\xe6\xb2\017^\x8b\x97\x94\x97\xb3\"^nh<\xfa\xe0\017m\x99\x87zn/\xf7f{\036\034BІ\xc1\x86\xa2\a\004\016\xb4\x97\021\x80\xe7pB!d\003Sb\xc4\nt\002q`br\022\005\xa6\027\f0^Y\xbf\xa7\xd2\xe6\xe5\022\xdc \030\"x\035\031\020oy\\\xf3\x90\xf1\xf0pyt\n\xc6\n5V\021\026\n\020\026Q\002F\017w&\xd5`\020qg\001\001'\005\0034&qא\xc7\020w7\xa7\xc7\020\xc7PCrpq\f{\022q\a\026\a\f\nɀ\x86z\xb3\xf7\x86QX\"\030\xe3p\xf2V\016{\fp\"y\030\a{\022A\003\026pQ\016$S\023x#\f\006E#\0251\xf6P{q\ffvrqр7g!bR'\nts\006''Psq\006q\fA\n{\f5Q0\005\ap\003{\017W\020\027\026Q\fdR\xa1\xa7\x85ǰ\xb7\xa7\xf1\x91\nj\nxy)\xcc@_O\004z\017\f\037\fmj\f wB1e\002`1F\037^\n\017\xa3f\fn(Ԁ'\xc1\fYה\x92\031\xab\xa7n\xc4\f-\x94\xb1yHܠ\xf1\034z\xfa\x865\036\xc9\xc0\xe4Vz\034\033l\035mR\nx\0342y\xb7\xa7ae\n{cp5R\na{\002 \021\x90\xc7\020\a`\n\xf3\026#5P\fu$\"\xa2\xd7\020Pg\022\026\016o\xe3P\005\027\ny\n\xa1\xc7 \024\020\021f\xd1Pְ7t\021Q\023rf\017\005Q\021`\001\027'A#\xe6\xe0&\001\nw\027b\xb0\xf7\xa0\xd7\nm\031`\ap\xc2@60$P\016\004t\x96\xc1PEg\016\002\xf0\020z\024\nyS\022 t'f\f\016z\002g\f&\025@2\a`\xe5\n'd\fwe\xc1\xb0'\xd1@\xc0@BC!AR\frA\022E\016\001r\024a\xe6`İ\xb6і\xc1\x95a\030=\xcc\xe0T^ģ\017{\xac\xa7y\030\x93b\n,zhi'\030u\024F\fQ7z\n\xe6`\f\xb1\xc7pg\022u`W\xcd`Lk\x95\016\xc0\xa5Th\030\036yx*;٠\x84\xf4\x90\xb1\xd7\xf2\xa5\xc5p\n\033v$4\027\003{\001R\002 &w\003\ne\0207p5&\xc5@\n\001v\x86\x91g\003a\021\xb2\a\021{\016A\xd6\n\024\n`a\001c \026z\016F\n\006s\xe6\x80\xe7`\nysp\0025\006\nyS\0211\027\024`\nx\017u\023֠\a5\003\xc6\n\026g\022pc\xc4 {\003C'4\020{\n`\001\003F\021\n\xf6\xc0\xd10\xf5F\016\037o^l\xe2\xc0\x80S\xe7\xf6\006\xe3Pv z\n{\xc2P'{\nx\xb4\xe7\x91W\x91\xc1\xa6\xc1\xc0\xa6\xa1\027n\xf1\x93\xf2x\xb3\xf4\xd2\017ڠx\xaf\xc7y)\034\xda\xd01\xcb\xc0\x85y\035ɀ\xe2\x84\xe2\xc6{\036\xf7\xf0Аw\002y\016n\016\f\004\xb3րQy\fs\027\fx#\xc5p%\xc7PA\nz\fd\017y\017\005\027u\016{\"\xc5pwc6ab\006\xa2\xc70a\nV\xc6`Aq\031T\fe\017{\f\0065w!\005p\020P\023\004\f\fu\f\xb4\xe7\n\xf0\n\xc80j\x91\x91\xb7z\xfe\xf6mX\x8a\xc1\f\xc5\f)9nj\xc5\xd0\xe0pc\xd6Pz\031l\"\xc5\020BҰ'F\f\002vA\n\xa0'\n%z\fg\031 WS\xa0wz{\017\xf00\xa3\a$\001\f\xa27\xb2\xc7p\006qa\f{\003\"\025v\f\024\xa3'bCb\xc5\020\a\030y\021p\024{\n\005\f\xc50u\005\xc3@\n@\0165\x96\x87\027,-O]]\0359\032\f\030Z\xe3\xb6³{O\xaa\xe7\xd5\n\xca@\x81\x82\xf2zn\033\034\032E\xb3װǐ\0270\027%S2v7\0067g\021{S\f\nA\xc0p\027'Aa1v\001b\nw&\003\020&f\xc7\nAQb\na$gװ\xd7\020{B\031vpwC\nWs\a\001rqR5\ap1\004\xd7p\006\f{\"PbC\a\"\xa0\xc70vRS\f'uSb'qq'\xd5@\001ap\021\0206{\xc1 $v\f \025\aB\x80\a\xf1P\xd0\020\024\xc5`\001\021\025\xa3\xd7\n\031\033\fWPа\0277ubw°\x87\x97q\x93\xa7\x81\027\017o\017zxq\xca\n3{\030B\x85\xa1\xb7\x87Q\nx\021\022p\027$\nz#{0y\f\002\xc4` \xc0\n\020`\f\xc4P\xf6\x80\027qp#w\xb2'\027aB\"`b!A\fpF#5\xc5@0\ar\xe6\xa0w\002CS\f\006`\023{\022a`q\022\xd5Pq\026%\f\xd5\020_֠\xe1\xf3\x90\xc4{i\033\xc0\xb0\u0083\xd3\xf6{յ\xd2𤇱\xa6\xb2\xd3\xf0\xe6v\033\x97\xc7аGR\xc1`\017\xa1װ\027V\016f!Ps\f{\a\xc0@1\xd36q\a\002\031nab\025\020p\035n\016u5 5\005C\n\005$\n\005bP1'\xc7pt\xc6`\x85\xb1'\n{\0362N9^=\U{072597}z#\016Z\x87š\xb1\x81\x821\n\x90\a{ybQr\017f\026\f\004Q\f\x94\x91\x86A\fazo\f*;h_iG\036\032*(n]\017[N]n9)\021\035\xcb\xf0\xd5\025#4e°א'\016\004S\xc4а7z\n\027W\003V\nR\fe75a\0261FR!\002\026\xe5`\xd0P\024p7\xd5`'\026\006r\xc7pW0\xb7\xd70\xb1'\xa1\xe7p7Gà\a\001\f6{\fv\xc4P\001\xe5P\001b\xc1p{\f\006b'\xc4`S\002q`'\002z!r6\0062\xb7\027B\022'u\"w'aa\ab#{\021\n\xc5P\nfw\002\020\021\024\026\f`\nx{\fb\016{\xc3\026\x86\xb1\x92R_hm\x95\xa7\xf1\xe1\xc0\x80\x97\xb7\xc7\xc1\x81\x96\x84ǐ\xe3\xd1\001\xb47o\xb0\xc7\nV`\n\xc4P\022#Fg\fv\n$\xd4P\002G\f4\fr4\005a\023a\027\xf5`z\0166z\0227\x90\xd7\n\f\033s\x96!\xa1\027`\005W\f\005a`\017z\x97A\x96W\030{\0334m\x94\xf7\x90\016\035JJ\035\031\xaf\x87\x84\xf3\n\032\xba\x87\xe6\xa2\n.JLy9Z\xc2\f\016^z\xf5\xc6`\016\x96\x87QB\x94Q\024g\n\xf3\xc6p\001\xd4 \024wC\016{\xc6 {c6C\027`\020\f\005\016\xb67\xe6\xb0w\n{s\xd6@7&\xd4pcz\xc2p\026\002{\n\n\ng\f{!G\n{\003\a\n\0043y\fQ\001\003\004\003\xb7\xe7p&\a` '\n%w\xc6Pcb`'\021\xc4p\002\025w\f6\005sp\025v\016z\016vS\003%\n{S\a\xd7 \020\xa7wb\"P\xb6\021\x84\027'\016z\f\x937F\f\n{\fV\f\001\xb2wC\0225Q\xd6p5q\027\a\026\xd6p{\f\x94\xe1\xc6p\0025P\xc2P\xc6P0${\030\004 \006\001\020p`!g\003`\017m\xc6\020\ne\xa3w\xa2\xb7\xc7Б\x93\002_Zi{x\017l\0319\005\031\034x\x9dץ\xe1\f\n)a\xa6Vw\nz\n3\005E\034o7\0224 {\020\fz\f{\nǐ\asa\016$%4qp\027\003\024y\n\f6{\017&\0246t`Ӱ\ar6\021\026w\003t\ny\016\020\xb0\a\017Fp\022G\020\023\021p\xb3'4\001Q\023v\026`\fG\n\n\036\033\f\xbe\xf7\x95\x87\xa7\xa3\xe3\020zon7\x87A\f{3dS`2z\023%\001$\002PCc\021fp\021{\0167\025v1Sq\ff'P\f%\006\021\nz3\xa3\xc7`bB\016{\003g&\001`\001\ar\xc40u\001\002\006\n{\f\027\xa7\x87qu\xd6@\022\n\026\xc0`\0240\xc5p\nzr\azd\n\035,\036\xa2Vyno_\016($\n\030okh(\030y:yuyzQ\x91Q\f\xb2ǰW\f\xf1\x96\021֠g\xf7P\xc6`pc u1'r{pq7prr$`\nRQ\001\xc6\n{z\004\030\001\021Q\021{\xc2@6s\016\x97W\017\nU\fm\020\030{lV9=)]]\xe4\xa5\xd1\xf5\x90\nxXա\x93{\xbd\x97\x94\xa1\017\f\xb3r^l\f\nqpC\n$rq\ab\xb7\xe7\n{\006b\021\026\xe4\xb07\xe6\xa0\a\f\fz 5\027\0276\025\021\a\n\xc6p\xb37W\n\025\026\021urB\fP\xc0`z\016\024\003\xe5\xb0W\016d\"\xe0Psu\xc1\x90\027\fz\nWҰw\020!\005&q\xe6\xb0\xc7\nW\003w\n\037o;\fox\xb4aiz\017\032\x93\xf7F\xf1p\xc1\xc00\xc7@\fo\016Pv\xc2`\020\022n\033\xb6W\030{\x87\xa7\xf7Ђr\xe2\xf0\xf6\xc6\xc5\xe0\xc2f\016\xf5\x90\x86\xc6\xe6\xc3\xe0{;\016\xa2\xc7V\017\np\024\xc2P\xc7\020y\030\xb5w\n\005c!g\nR\xb27 f\002\021u#\005\f\025\xd5P\ny\f\n{3\0064\a7g\nuQ\001sR\002\arP1\a 4{\xe2p{\001\nr\025aa\fy#\n\027%\024 \027qp\001g\xc1`s\004\016\a\006{\xc1 {R\022A\022\nU\001\021Qa\n\024\020cw&'\002\xc4 {6\x92\xe7\n\016j{io\x97\022x\035(\034YZ\xa7Q\x95\x87g\xd2p\016\xc4``\022\025%\021P\002w2\005\xc6P\020\xb0\xd7`Q\030a\nv\fuCpqpaS\001\xc6`\002\020\020\xc4`6`\020\027\xc6P\xc6`\020\025\021\f\006\020\006\004\f\027F\023\021\026Q'\020\026Sg\fp&r&\xc4p\002v\xb3\xc7\020\0261uC\006\021v\020\x84'\xd1\020{y\xe1\xa0Ǒ\xe76\030\n\003{z\n\030oz\xd0\xc0`\xd2\n\005\0016ՠ'\xc7\020ur\027\xe6\xa0\027`\xd6 \004\f%\027\nz\xc0`$b\027\nPaq\001!\026P1{\fvC\f\026\022\xb7\abs!\a\027gR\022\xc5\xc0\x90g\f\nrPb'b&v\nz\nqq\xb1\as#\xe6px{\xd3\n\a6y\n$0{\016{S\nz\n\xc5@\031y\xf0@A\020\x80G\xb77\017\032\036\031\037\xc3\xf0\xb6{\xb3⁗\xf2\xa2\xc2y\xbf\xa7\xd2\xd0V_{\016\xe3po\017y\033y2Us\006R0\0011\005P \nzs\fy\f\0206\aP\002\xe6\xb0'aa\xd7`\xa27r\027\006#fP\nt\030d1ŀ\xc7 y\f!\005\xc6@!e\nǰ\x97\027q\n\xb3gn'yk],\034\xe7\xa1\021\x95&\n\xb7g\xd3\xd0\020v\022\"S!{s!a\xc5\xd16\n\024\n{\001a\f\026Ar\027\022\xa1'cE\n\xc6p\027g\ft\016p\0274q!4$R\022\n4e\021\027\026\a\xc7\nW\001!4{\016\xa7'\022\aq\023Frq\xf7\xb0wc\002`\021A\xc1`\f{\xf4@a{`yx\016\f\036аQ\016l\031\037\036'\x83\xa1\xb4\xf6@\x94\xd7\xf6\x86\001\031\005\xf4\nx\xc3p4z\fRc\xe6\xb0'6y\nv\022\002y3\001'\006'rpR\001w5\026\006\f\aa!{\016vq\020\026\020A\f\n`\020\006a`\017{\n\xb6\xc7\020w\027\025R\f&fr{2\006Rwx@y\x941\xf7\xd0q\x85W\n\nW\016n\021Q\f#\x85\xc7\xf0\xf0\xe6pW\025k5\x84\xa1\xd3pl\xd7\0268\036z/.[\xfa\xd6\xf4\017ʐ\xd6\xd4D\036\030\005\xc2\xe0\xb0G\xc0\xe0\xb5\021qs1z\xc1P\002\027w\xc7p u\n\xb0w`\003\xb27e\xf4 w55\nf\n{\n\xb0'\xc6`\001\xc5p0{\021Rc'\f\004\026R\002\xc4\npR1\027\n{\f\np\xc1P'\0255p\016u\027Bq!{S\xc2\n5f\0034\xb1wA\030`\001\001\xe2P\027\006\xa6\xf7\020\aeQ\030\027z\n{\022V\030fR\003\xb1\xe7\xb0\xc7@\fA\xc4\xc0P\xe4PpbB\030x\0035!$q&wS#u\027\xd6\n\020r'\n\xc9 i_h\x93\xf1@\xe6\x80\xf7\n\004g\003p WC\"%\026wR\xf4\xb0'v\a\xe6pg\016\001\025p3{\n\0264b\020w\020` \027\026'\n`B2$w\023{r'6&`\001\xc5`\021\005s\026bc\025\"\006w\n\005\0252{#b\026Q\f\024\022@\xe7\xa0\027\022`ps\026q\023\xb07a`c\xd5\020\a{`\xb1\027{D\016x\033\031\016\016\035\031\xb0Wvzyy\x90g\016\nR\n{\005s\a\xc0p\001e\nR\xa1\xd7@\022\n\x91נ\a\xc5\xc0\n̐\x87\x95\xd7\005\032\031\fo\fA\f\xb2W\xd7p\xd36\xc1p p\xc6PQ\016v\xc6p45W\nŠ7\a\020qz\f{2 @s3{R\016z\022B\001S\n\006\020\026\f\024\xc7PQ\022!A\001\xb2'\xe6pGb\fpwcW\022qa\020\n%S\xc2P%\xc4\020\006v\n`7g\022\001p\xd4\n\xb07\001\xd4`Rg\nrfw0\fwRaQ\f\aw\xd7PsS%\026qw\xf0\xa0\xc7P6r\xa0\xd7@\f\a\n\xd4`\aV\023wb#g\n{\"`R\f\xa0\xe7\x90\xc7p\f$\027\xc4 V\002\xc2@{\031x\033\xf0\xe6@\a6\x90\xf76{e{\032o\n⁢AǶ\x87\x86\xe1\xf6\x80a\"\xb7\x81gA\n\017y\x95\xb1\xb7נ'\xa3\xc7\xc0P7G\017\025P#{\003%\n4\xc4`2\027`aRbR!v\021B\f{\nf\xc7pqcV\n\024r\001\006' qu\nB{\fa\002\025r\016ea{\n!w\006S\0226$\027bA2\006C\022W\020b w!G2U\fv\f\xb07wr6v\nfp6\023`g\022g\f5\xb17\xd4PC\023B\020R\020\016y\027 Q\xa2װ\xb7'z\xf0\020\021\xe2Qy\xf3\xc0@lD׀aw\001{\031zrr\fQ&{\020a\016z\xc1\020\004\xf5p%{\f&CRA\023wP\003W\003\n%\a\026\0207\n\apc\022v\016Tr\"\004`b\002\xc4\ng\022&\xd6@\xc7`v\003bg \001\0207f\022\006b\025`\021p\xa2\xf7`!v\020 \026\xe5\nP\016Tr\021\020qru\002\021vsqqpq\026\xe5P\nE\xc1`\xb2\xe7@05\xc5@\nx\032x\x94'\xd3 \fg\n\xe6\026\x80\xb7\x87\xb1'z\0168\xb3Ǡ\x96V\031\x901\xc3\xc6q\xc5@&\x84Qz\017\034j\017yr{\f\nw\020C\0067q&`ar\022rp\0215@\"a\a`\021\xd6P\003V \001Sp\"\024%A\"@7\nd\023\026w1wwְ'\001\027\020\020\xe5\nz!%\nzS1C\f\xa47q\001q z\n\005\001ac7\xb7\x87Aq\020&Q\021`\xa2\xf7\n\xa7'\017\024'\020ư\a6\xb2\027\n{ 0\006{\f\nm2o\n\xa0G\022\n\f\xc7Ж\xc7\xe0\xd0 \022{\023w6\020R\xc6`\001\0241eqa'\022gA\n4Q1@2u\xc6`b6\027QbR\xd1`P\017u\xb3'\020\xc5PB\002\xd5P\020\020\xc5 {\n{\xc7@\fQ\002!\004rbq\aR\003'\005A\023a\xf5\xa0'\xd7p\005B\001\xb3\xe7`\x92\xc70\025a\003\005\n\n\f\x86Qd\016y\031\xc4Pb\x92\ass'Q'\020'\xb1\027\"Ts\020 p\026\xb3'5{\fq\xd5P\n`bgS\023p'\027\025\020v\xc0 z\xc7\020%\026bP\002\001`'\001&\001wQ\f`&c&A\"`c\xd4p!t\n@psrg\xc7psv\020q\0017t\fwBrp&s5\027\020\027v\nwcuC\002\a\003\f\026{°\xe1\xb6\xf7`{\016x\xf0p\x97\xf1&\a\xb4\x91\xb7\a\021\nn{\022oz\031\xa3\xa7!\xf0\nA0$`\001f\xc3@\fd\fR\xf5PQ\nz\016\xc4p\020Ơ\a\020`\001\027\027 u\n$\xc6`\nx7\f\xb2w\003z\017FC\n\016o#\fx\nzs {\xa2\xe7@\016fSS15Pư'\016G\xe6\xb0\xd7\nGa'b\002\xa17\003A\026\nQ\a\ny\f\xd5Pqzrz\030ax\031!\ft\030\xa4'%\xc0\0200\xa6\a\xb2'\030{q7\xb7\027\0166{'\002\xb2''@\002\xe5p$\nyc\f\xb2\ap\021`\022a\026\027C\f@q\n\006Q\021pB\001A\0160\xb4\xc7p6\027\f\xb6\xd7ppC\001r`\xc6`Bb\xd1@0\005\ne\xc0@c\x84Q\006\027pq\xc1\xb0'\xc0\xa0'&\006\"֠\a#$4\027v\020sf\002R2&Ű'\0016ua\xc0\n%a!\026\xd4@q\003\0255p\n{b\n&V\"z0q\002'\027$b z\fRQB\n\0215v\n{\nu\020\003\006W\002\xe6P\f\0055\006\027\001\xc5p2d\xb3\027\ny\nw '\xd4`q%@\f\a\xe5` \024\001a\022uy\fp\fzz\032A\016\fk\x82q\fd \017mG\030\xc5PB\030t2zѰw\031yx\nP\032{D\030z\031k\035\xa7\x81\027yz\036T\xa37\001r\ny\023aa6b\xc4p\020\001$P2\xc5`C\001Ps S\xa2\xe7\xb0\a\neb\f\a6u7\026Cqb\022wR\016ub`\xb37\003{\016\xb0\xc7`\025\xc0`q\xb37z\f\xc6pq\fE\017\005z#b'\022z\f\xc4`\nz' g\001a\xb2\xc7`\f\024\xc4p\023u\n\xa7\xd7\n7`\027\020%P\xc1@6w\ff\ff\f&\027v`\022aQc\022\xc7@\001'fS\"W!5wAc\022`b\xe6P746g\"p\n\025&\001uc\023`\021u\f\026{\016e1A#ec05ur\fz\023Ơ\xf7P\xc6\xf0\xf6\020\xc4@57\x82\x87qP\016z\xa2\xd1v\017\x817\f{\001\025\031o4\0227z\030n\f\xc7 y\xb6\xa1gV\033d\xe5\020$ V\023G\017v\020Q\f&\025rf\f\005u\nS \xb2'\aaаg\001\n\xb2\xd7`65\006\xc5\020\024s\004\x96Q\006\a\020wsq\001a\027p!\001z\017y\f&7w\f{\f\025P\016t\020!\x90\x87\x91\027\fV BsSr`\xc0`\xd5\n\002\026y\016\xd5@0\fU\f\a{14\xb2\a\nP\020\f{\f\x92w\f\0015&\a \025q\aqg\016w\nz\020g\022\027\0015\024\ne\xd6Pa\003 v'6{\002\fe\f5\025\006\n\004\f\005p\xb2\xc7\020\xc5P0\005\a\003bQ\xd6\020\005\fz\02147\024 \024\n\004\022pA\n\006\xc1\x90\027\020\0275@20T\f\ny\fv\n%{\016{\n\n\xb0'\005!'4q\aa\023\025\aSa\fe\002\023{B\f\xc5p''gRr\xd6\0204wa\fw'V\fw\a\fu\022\005\n\xd6P\020y\xe1\nz6\xe2 \xd4\xd0&\f\020\x967R\n\x82\xf7\xc0\xc0\xf6\xd1\xf6p$\fV\x92\xc1\xc6ѶG\035T\016\xe5\x80\xc7@3{pRc\022qbq\006\a\xe6`{\017\025\xc4P\f\0067\026@\022&\001Q\f\006R\002\xd5p5F\fq`\fv\nİ'5'\a7\006\021\002{\003%p\"\027y\f\n$'g'W\022Ҡw'\xb2'R\002w\f6B\006\n{\xd7p4r\025v\"C'\nv\xb3\027C\f'g7Cw3{w#\xa6\xc7 'p5\001gc\0267P\022bq%\xf5\nF\f\022\004'z\xf2`\020\026{\f\n{s\026\0224\020\001V\002w6r\xa6\xb1\x87\ac\016x\032y\023&\xb4\xe1f\031{\023\x82\027\016y!\xc6\xe6a$\031{@6\002pa\001!\xf7\xe0f!\xc1\xa0\xc7@#{\00356\025p\f{\xc7pr\xb3g!6z\031x\f\001f\016{\f\026\025'\n{#\005\022t\nF\xc0\n\022u\xc6p\xa0\027\f\fu\n\x82\xd7Pf\016g6\xf3\xd6\020\020\026\fU\xc7 wr`4\021\xc0\x80'\002w\xf6p\006A#\024`S\021b\021ְ\027\026q u\fP\fQc\fz\002\nԐ\x87a\006%\xe4\xa07\n{!quc`\003a \n\024q\xc0P\"\xb67A5\xb0\xc7\ny\n\xf4P\f\xf6\xf6\xb0W\xf1`\nk\034\xa1W\017@o\036\xc4\nz\021\003%\026#\006\005q\xd6@\xc7Ps\023$4w\002{\016\xb175\a\xc4`\fgr\n\002%{\xc1\xb0\xf7\xb07'Aq5\f&y\016P\001W\f\xa1\x87Q!@\001\n\0052`g\f5\xd5P\xc7`a\001p6%{\017\026{\xc2PQ!`\xc7p'$\"y\fW\fP#\xa7\xd7p\xa3\xe7`&p\020!zb\017y\023pR\001 \a\xc5\n\xc4 $\025!{\001\x86\xa1'P0\027v\016yS\fA\nu\xa3\xc7 \020\x91ǰw\016'Rp\ny\017%z\xc2@\a\ff\001\fy\016\024Q\n\005\f\025f\xc2@p\n$\003`\026\027r\027R\n\005\001b5vbb\nS\027'we\031{\027\020\a\xd5\nzb\021!\026\005\002\002d\023\0250$\as`\020p\002%\xc7pw0\026\00674\020$wr6\nf\"e\023%&'gRqsa\xc0p\020Q&a\fG\ff\0216v\001q'\a6\020w`\f{\f\026\020aA\023\006\xd5`\021\nR\xd7\nD\nR\ff\nz\017db\ne\xf5\xb0'QS\0027uc\0205w1WѰ'%'g&\023\005\020Sq\f%\xb7\a\fppcRQ!\026\001p\f%5\004\nvC\002\006\xb2\x97\x81\xc7p\xf1\xb0\xe6 G\xc1`\xa1\x87\xa1\xf70o\fcm\xa2QpB\nz\017\xe1\xb6!x\xa2\xf7\n\026W\xc6`\nzs\027`\xd1\nt5\003\xa2'\022a\fy0%6w\001\025\nzs\xe4\n\x92\x96\001WÐw3p7v5\016T@\017U\030\x87'\002C\f\xe5\xb0w\022f\017$zðǐ\xc70G\fz0\021W\ne!\027\020\025\027b5sR\f{\xc1\x80\xc7\020\025Rb\nd\xc1p\0266\0255\023\xb1G3\026\0215uS\n\006\xb1\027\fg\027\fz\f\006\f{\020\026\003\027\027Q!\001{\016`0Ur\fv\002\xa2琷\x87a\nG\f\x837\a\017zs\001P\nz\020qs\0053zw\xe7@\xe5pa\027B\f\n\024\006Q\xc1@ 7\005\022\00605\006'pwQ\0220v4S\nyC\f&\xc7\n\a\nV\f\xc5pz\xc1 4Ba\001 g\xc1`a\001 {\016{R\n%\xb3\027\003{sQ6sB\002\xf3V\031\xe5\xf0\xb6\xe1\xc6\020\006'\002P\xc6pr\xf6\x90\027W\"B\021wc\002\ab z\fp\0224w\nz\f&e\f\026pR v\fP\001a\001\003&\xc6P6\002\024&q@3T\017$\027R` p`\n{\016f\fv\020\a6A7a\021\ap\020$\023g0V\f'\006\026\n{\n6&z\016P\xb0\027\f\n@Rrt\017o\034o\f\017\xe46\xb0\xd7\nm\xd7Ps{\034n\030y\fz0ġ\xe6ࠧ70\030\xb5\xe7@\026'\xb77s\006\xc7@1\004\002 \026\a75w\n{!6Q\002Q\n{\023p% \f{&\026\xb0\027\f\025qb\xd7\n7u\027\xa1\x97\xb1w\022zӐ\xf7\xb0\027\001'\n7z\031xS\016f\026{\031{%\xc6\020R\xc6P#\004\xc4\np\020`\f\004a\002 Pb\021e\n& G\003\a\fV\a\"\xe5 \006\xf26!'\025W\n\xc0P\xb2g\fz\n67\xd5P\006 ֠\027p76ga\022Q6\as\020gQ\002ba\021&\024b\f\apac\001\xc5PQ\016W\fg\a\n\025\026\023{\f\004\xd6`\xe5`\024\003%qbq'\0017\005\002\004\021'v\003\026\ap\001\nG\n$&g\021&A\022q\020W\n\005``\n\006\016\005'Gr\f{\021\xf4`'fb\n\004C\001\002Qa\f\n\026w6\xc6\nf\016{\nF!Cbsc\nUgc\f\025\x96\xb7QcV\017y\016f\003'\x92\ar\xe6pA\fP!wP\022\a!us\xd5P\026\027q\002\021%\xc5p`\fGr`\f$ \020\024'R%sq!6y\016\005q\xc6P6\xe6@a&\001 \xc4p\026Q\n7zbc\xd7`A\016z\003p\0266Q\f%p\027'v\nz\0236v\n\024\025\002\006Sg\016eccRc1{\xb2\x87Q\fy\016zq\017zU\017\fz\x96\xf1\xa6\001k\xb1a y\016\x81\xe7\020{\fy\033x\n\xa57\fn\034zw\034z\nm\017\xd7\xe0\xc6 z\n@\xd6\n6\n\x82\xc7@q\"'{'\f\0276{\020p\n%u\022q0zs`\xc0p$&q\022\xc5@\001`\003t\nz\xe7\020Q'A#5g!$b\021\004\002\a@\ng\f6{\f\006\001'v3e1Vv\023cBs\020\025\"\005a\xe0`e\n@\f\024`\n\024Q\n\024Q\fp\nW\022\025\a 7\005\001'\024\a\xd4`\x87!{\004\xc6\xc0\xa0\xc7\xc0\xa0\xa6a\fE\016n\f\016\xb1\xa7Az\f \xc0&\017pv\xa0\xa1g{\016\026#y\f\xe5\x807pQ1\016n\xe6pr\001%\no\xe1P\027&w`\023\nz\xc7`F\f\021\xd7@\xc4p\001S\xb3\xd7@a\001\n\xc6@a\xd0@%\fW\001\n{\fx\017'$f\xe1P\xe4`G\f\021{\f\026\027Q\f\025bא\xc7 \n\005\fe\002z\xd1p\f\025v\a\022B\n{cbb!4\xd5P7w\020`qr\020%aa\022\020ww\003p\021y\n\xf4Pa\xd6p\xc4\n\026w\fd\002q\021\027\027\024\nvQ\n\025%\xc5@\nv\020\x83\xe7\020wr\026Sp\023z\021q\f\xb1\a\xc1PwR\f%a\xb1\x87A6f\f\xd4`c`q@#\xe7\xa07f\xc7`{\030f\fz\f\na u\xc0p4f\xc0`'r\xf4@\fE2\xd5\xf0\xd6\n\005\027!w7\abpC\002Q\003\006\xe4`\nyR\"'P\022\006p\f\0276gpbcA\021\027\np2zS\nG\n{\023wp1w\xf4`b&\025Q\021\xd6PB\nPRC\f@\n{S\nu\001\xc6Р\a\a\020v\021\021sE\xc1 T\fQ 7t\fpR\"D\nP\003\025cC\xc1pu0\005\xd1@q\u0590\xf7P\026\fGc'6B\021Ppr\xb3\xc7\020aQ\nz\fW7\020\xc1Pz\f\xd4\020V\faacw\fG\030ybq\022\026\a\020\001{r#\006wr\022\xc5P\027\xb0\xe7PQ\017{S\xd7\nl\030\xa2\xd61z!tg\016!'P\arx\016a\xd1@\n\xf5 \f{{\f{\xb2\xd7\xc0\xb0נ\027\023\0275u \021%\xc5`z\f\021\f\026@B\003B\027\016{!\xd6pz\n{\002\xd4\020a\nz\017uf\nf\f`Q!'\xc6@\xc1@w\f@'sQRrb '\025\xb37\xd7Pgr\006\xe5`p\f{\002q\002W\f`Ca\f&w\0016Sa\0251\024`\xb2\xc7p\xb3w\022'z\n\002\025u\fz\n5\xd7\n\ny !\0051\006pS\a\nVs\006\020b&%\xc6\n\xc5`\027Acb\021aaS 5b\002qRw\001\002\x917b\nz B\001r\aǀ\xe7\nP\fB\a\021P\xd6\n5d1b\025rQ7$r\x93\xc7p\f\027\005\001g!w#err7\004q\021\f\024AS\xc6\020\a\026&\n@\xe5\xfbWW\177g\002@>S\xd6f\xa3\xda\xfd?\n\001\003\n\n\n@\xe5\xfbWW\177g\002@>S\xd6f\xa3\xda\xfd?\n\001\003\n\x9bm64g7Ű'0GR!\a\xd0\001'\0276gps\xa1\x87\xb1'\xc7`\024_@\xd0P\a\001\xb2's4` \001\xc5B\fQ\002 g\001\xd6`q\xb7\xe7@ \xcd\xd0 \024R&b\021\0047\016{P!\xc7zp\n\xabw\022{\017\005\001\006!fc\0260ư\xb6\027B\023Ba3Wrp\xb1\xc7\nt\fppc\001\024\022\027w 4R\027p6\002\026\025C\f\026\a!{\xc0p\xd4``\022Q\027\fu\003G\xd7`s\xd5`\025a\021\0014'ǰ7wC\n{\f\n\024\020r\005\ng\xb5\xb1ֱ\xc6\xd00m\031\005\x96\x87q#{`\fנ'f\f\xd5`ՠ7q\fzb\fg2{\fPb\006sq\nĀ\xe7Pbb5'p\xc7@`r\xc1@'\xd6`\026\xa3'2\005\003'p\xb1'`\fy\022\023\020\025\001u\f\025\n%\026\aW\017\026\a\0251V\f4\xe5\xa0w\f\026\xc7`\020\0257\026w\027\001\xc6P!ts P\021a\xb2\xe7`'6\026q\020\026v\f$r\xa3'6\021\024\xc5`\020\nd'\021\xd4p{\f\005C\017%\xb6\xc70t\f{\016z\003\027\021z\xc2pR\005\022\020'frQ\nQ7w'b%\0015q0z2\025\fe\xd0\no\xa0\027\017z1\xc4\xe1\xf6`e\xc4\xc0Pr\xc6P\n{\xc2P\026cQ\025\002a!\024\n{\nz\f6`\n\004\024b\f@cRB\np\020u\"S\xe4@\021\006\001aS\fg\xb17\fQ%\xd5`\xe6P5%\027\xf6\xd0\xe6`\fy\030\xa77R!\xc4\nd\f\026'%\a\xc7PQ \003\026Ǡ\027Sq &4c`'g\016z$\023\xb5\027\017cGs{\n\001gs\0270\005\005sp\"%`q\001A\nW\"g0`\a\021\021%\005S\n\0066\a\001\xb3\027\001a\020rv\001a\020\f{\022vc%s\xb2\xe7pvc\aR\020r`Q\"\006\022g\xe7pz\xc2\ne\022\a v\021prw\001\020\027`S`\003\0207\026pw7\027v\023'W\ns`\032\nl\031\xb7\xd7\xd1\025\030k\031rQ\f\026\aq\027\fz\f\026\026\026\024\nAb\xc7 z\030z\027v\022'\xe4p\nv\020\005\017\xb677w{!&'Cr75w5R\021%'s\026b4\021\026`\xc1P\xd4\n\xe3\xa6\xe1\x96Q\001`\n\004\027\002y\0306\005&\fy\"a\xe6@Bc\027\ne\xa3'\022q\xd4ppp\xe6Pw\nd\xd1`5\n{\nzrP\xe0`aw\023%\xb37V\017v&%\x80\x87\021Q\021\006R\022\xb7\xf7`\xd6@\020W\f\xc5`r\nU\f7{q\x81\xe70{ ր\027\031z{\016\031m\nz0\nu\027\xc5@7\020\025qҰ\027\a\n'4Qq\xf7\x80'\022\027W2\xc7 za\027\xc6p0G\fV\nw\fz3\020u\016\024y\031\004P3x\034y\026q\a\xf1\xb0\aAs0{ p\003\006paS\020!g\xd7Pb w65\027 V\"u\016{\020\001\005\022%\021v!\020zb\002!\xb7'\xd6`#{\n\xb5\xe7`!\xa0\xc7\020`\n\030Q\020q \0067GA\016%Spq7&\a&w\021c\002g\xc1@p\ny\032yR\xc0Ц\x81\xe7\xa0\xe7`q\f{0\026S\a\xd5 f\fy\xf0\xb0\a\002&4a\f\005\002{#gw1a\027Q\xc2P&`cwB\031{\xe5`@\fa@\nw\fvP\017{B\0034\a\002\xd4`'Rqp\006\nǠ\xc7pg`\030F\"\006\xc1`\006ǰ'\xf4\x90\027Sc\f6\xf3\xc6ƀs^o\n\034\xe4Pz\017\xb7W\031x\f\xa3\027r\023Bg\n\026\001vqb\021\025w1\xf5\xf0\xe6@!\020v\001wb\xe1`\xe1pu\005\xb0\027\0227p@ \023{\030{QS\001`s\no\n\xc4\020\xe4\xb0\a\a\021\006\xe6\xa0\xc7P\023\006\0207fas \001\026w\xc4\nt\n$6\fd\n{c\xc5 \026q$\020\xe7`gf\016z\016\006\n\xc5P\n{0\026v\xc0\ng0\xb3g\017\006QwS\nyc\fg\xc6`{\017{\xe30-lh\x84\xd7!x\f\xc4\020`#y\016\024P2\xc4P'#\004qPà\027q%\fwQr\a\xc6p'5qs\n0Sxv\n4\f{5P\n%y\016\fz\031t_\031\xb3\xf2\xb0\xa5\xd5\xf1\xc0P\xa1w\003\xc1`\x86\x81'\xe5P1\xd4`u'\xa27\"\nt\003A1\f\xb4\xc7\n\037\nkk%\030\x84\xa1\027\xa7\xd7\nd\020P\021%\xc5\0204\006\003\a\026`\f\xb0\xd7 \0246{7#u\026C2\xc6p\024qA\021rQ \xc5p\aw\n`\xb0\xc7 \nk\xb7\x97\x81\xe7 &{\003&\0267q$\001 \006%'\020\004q\fvr\n$\0063Vqa\027\nT\f\026\xf1\x90Gz\016\016\xe31\flM\n\xe3\ntr\"P1\024A\nz\fB\022T\nC\f5 y\n\027`a\022\004\022&'p\xc4P\fB6W\017\xb6\027\"@\"d\fP\fQ %p\xf5\n\003\n7{\f\026b\020&\006\xb2\xc7P\0234W\0236\a0$\xc6@b\a \027\020\020{\n&%\027q`\021Bsp'\006!$\xc7P\xc0\xb0G#\020\xd5PC\020\020\n{\021\xc5@\nw\n\xa7\xd7а7\005\xa3'\021&g!&\021\004b\021\006Rp\f\xf6\xb0W\001r%\ac\xc0\xa0'\027\xc1Pf\n\xc4P\027\xc6``\016z\020r\xa3\xd7\n\005w\003\a5\xf4`\n{\023{p@\x82a`7aP\nP\xc7\020\027\xa6'\022\020wv3`Q\016n\003Vz\x90\xe1\x80\027\xd2P\nuC'\002\ny\f%\x87\xd1F*{\035X\016\fn\"!655z!\022V\f`qA\021z\0176\xc5\n\024 \023\005b\001a\xa2\xf7`6\026\025\005\f5 grqa\nx\fy\f\016\017\n\xbb\x97\xa6\x83\x92\xb1\x97\aG\016wpǠ\xc7P\022Qf\f\f&\025\aA3\025\n\xb7\xf7@\f\xb0\a\002\005\f\n\n\006\fU\"\xe5\xa0\a w1wp\020\006\021`t\031\001$\xc5P\xd5\020p\xa3\a\xb3\xc7\n\xc5`\027t\n\025\006\003u\016g\nm{#\fsB\001 \a\n\025aq֠\xc7\xc00y5e\xc0\x80Ao\017 {\xe0@ %`\006\021Q\xc1\xb0\a\f4\027\001f \021T\016Q\027q\002\xa1\x87A \027\xe4\x90\xc7p`b\001\006\xc1\ny\022\xc6p{s\027Q\021c\xd7`\026\n0\xb2g\f``C\003\021\006\020@c's`sR cW\xb2\xc7А\xd1e\030\x82\x81\xb7'\0226{\xc4\xd0P\aQ\n\027\025\022v\026\f{A\016\025\002g!f\f\006\xc4 \xd4\020\001{\021\avPCp\017R\020\xb0\xc7 p\021\006\021\024\xb0\xc7`)_X\nM\xdcP\x85Cm\020\xb1'\016u\002g\023\001F\f\xe6P&bQq\021Rbrpq7\020\005\017{6Wр\xe7\xa0\xd7`\nu\020f\"z\f\001\020\001%\xd4pb%\aQ#V\nf2z\003\n\026z\030vR\021q$\xc7`\001pRc\023{\f\x96\x91w$\x95\xb17\xc6`l\030&0{\xc4\xd1\xc6\n\025B\001g\0164`qsQb\021{\f\xc5p\016oR*\xa0Ħ\xf6\xb3\x91\001\x92&\fa\xd6`CpB!e1f#``\0237%\xa0\xc7\nU\027\0036\025ՠ\xc7p\a\020\001\xa2\xd7\nz2&\005S0\026\nA\xb1\xc7\np\020pB\xe6\n{\ny\xf0py\023\0257&Q#g\026\n4E\f\a\nzs\026\xc7P\002f \a \xc4\020G\017\0264\nxQC\fcRa\001\023o\n` \xd5pQ05'@\n{\003!T\nf\f&\025pb \n\027{\030q\027{\032\030km\x95\xa1ѐg\xa1w\x94Q\xd4 {\"\aP\020\n{\023w6 \025f\xb3\xe7\n{\002\xc4 f\022w0F0\xd7`\024a\f\027@sqB\fB\0275R\022{# u04\xc4\n\025\x90\xd7\n\006\nF3\025'gS \nc\xa1א\xf7@#u\025\002\xd7`\006pCs\0016\026&W\002w\nVs\021gB\f\022\024\nG6' \024\xc7pW\nzA\f\0067\031E\002\004\xc0\xb0\027P\023\a \026PC\002\f\005B\020\002QSq\021parpq\xa2\027\022S\n\xb77`rrq'%rv\a!a'\xa2\xc7\020\xc7@`!{\022\021\006\xc6\n\a`'\xb2\027\f{R#6w\020\x83\xc7p\001$\xc0@\027`\ff\n{\001\f\026E\xd3 \xa7ǰ\xc7\xf0\xb0W\f\ner\xb3w\f$\xb3\xc7 e\f \026\004\023x\017u1q\xc4P\nt\xf6\xe0\xd6\nS\022WR!\004\003P\021f\frp\"{\016VQs\001\020Š\xe7\xb07\027\a\"u&0y\017\027%\025\f\av \n&\xb0\xd7Pqc\xc0`\xd4@\xd7P\020q0\004\xe6\nzWx\033\021v\xb5\xb1&\n\"n\xc3`\fz\n{\022bw \006S  &%V\xd0P'a\027s5\026R7\ar\022QB'6u\f\xc5pP#{\" t\n{{\fw\a\xc7`7\fz7\xb2\xc7\020\xb7\xc7\020p\002\026&r\005\002\020$\n%f\003\020\nf\003G\003p\n{!a'B\001$\n\au\003\024\027\0227Gb\n\xb7\027\n\x9b\x85@\n@?\xeb&=\xc1W\n@3'\xb4\xebK\x8e\xfe?\xbd\xdde\xf2\036S\xfd?\n\001\003\n\n\n\n\n\x9b\x85@\n@?\xeb&=\xc1W\n@3'\xb4\xebK\x8e\xfe?\xbd\xdde\xf2\036S\xfd?\n\001\003\n4P6q\016{u\"p6\nt\nx\016\xb7'\017y\020\f{\016f\021&\xa7\xc7 v\001\n\xb7\aC\f\ar\xc4pp\n\a'5ư\027pbr\005r\xe4\n\nV\f\001\xe5\xb0\a\fgsV\nq\002\006r\xe1\xa0\a\nU1A`\n6Gc\ab\xd1p%#\xaa\xd7\ng\003\001%A\fh\xc1`\026\xe7P{\002\xd1@\xe5 d{\xd0\n\nx\002r\xf4\n\a\004!\020\026\xb5\xf7 R\n%w\001bQ\nW\020\0216%6{7\027\020w\026\002Rrb&\n{\002\005\001!v\xa3\xd7pb\026\023U\016G\fS\006\arr {\f\a\02765\024\021\nww&\027AR\030V\f{s\001\026\027q\002\027$\002\004b\021R6\xc6P`\n\006&Sq&q\020S7{7p\021\026\a \a\027%r!t\n\025A\027!\020\aR\027\027q{\n e\n\024Rr1F\016\006@s!$\003\0245\x93'1\020{\f\006@3\005qr6\027%cPc1&Pp'a{\032\x93\a\xe6\020U\017n\n%\xd5\xf0\xa0\xb7\xe7@\022{\xc5Q{\x87\xf7\xf1\xe6\xf0\xe60G\002\xf7\xc6\xf1\xb0&\030y\n\xf3\u0590g\017\nz2\n\x90\xc7`s\xc5\020\021z'\001\025 S&v\n{\021a\0027u\021 u\002f\021\022\025g\xe6\ndc\n%{ \xd7`6\001u R\026\f$\026R!\006g\022\xc5`\n\xd6P\fz\002$\xc0@5\n$g1\xb2\027`ְ7p\xc0\xa0\027\xc7\nf\022rU\xc2`\n\x90\xa7Az\017o3GA\0160\027%\022\021xq\xf1\xa0\ag\n\026\001v!`\020\006Rb\f\006q\001P\f\026\001{À\xa7Aw\026\xe1\xa0\027\nz\nx\n@\x80\xa1w3T2g\f&t15t\016\x90'f\xc2 \006QP\021\f{\023`\002!wG\"BRq'&\006\n\026\022\005vR\n'\005`\f{3U\xc1p\003o\f\003f2e\xe0P\xb77\f%A {\017`\xc6P\005\017{`6\xd1@A\f\027qf\f{\002\021Q\017\005{\f\005\024\003\xd1\n`\001b\a!\xd4@q\a\022\xd5`!{'Q\n\0255g\002\xb1\xd7\n\xa1\xd7p`\xc6\020d\0227pu\n\001vr'\xc5pp`\nvA\022\xe4\xa0\xd70uab&S e\016\027A\021\006c\xd6`bg\020\nf`\003s\005Rrs\xb3\027\ner\xc6`C\f{s\xc7@\021\x93\xd7`\0270%\026&\xc4\nV#6v\a\001q\n\xd4@\xc7@\022$\"{\f\027w!t\xc1\ny z\016\027V\n\xa6\xf1\006\xc0 oC\xc0\xb0\xe7\020\nx{\xa2\xc1\xb0ְ\027\030\x96\x97\x81\xc7pvr\xe3\xe06\021\0205n\f\001\001&\xc4\n\025vs\xc7`7ga%r\f\005!g\a\xc5\020!z\xf7@w'\020 {\fg\0215wC\nw\ac\020\xa0\xc70\004\003\025\021{\017d\017`\a\026\n\a\006\fyS\xc2PB\xc1@!\aP\f%f\f4\a\001\"@C\xc2\nd0\006а\xf7\n\024\a\023&z\023rz\f\f\005\001ws`\021W\xd7`\xc7`\xf6PfR\003\xd4`\n\xc7@\006C\022\xc5@r\xb3\xd7P R\021P &W\0011Bq\n%\021\nsU\f\0062u\xc6p\0267\xa0\xf7@cp\n5{0\ap\020\a\0200{\xc2Pg\023\024\f\a\xd4`RR\n{w\nf0u0\025b\026 \a\020\001vsz\n q&\006\002QSC\006\f\xc6P\001gs'&g\0036R\016Uǰ\027\f\025'\fuf1P7\a\xd5PS\017x\016W1\xa1''g\017n\f\020\026Pb\f\af\f\ffb% \"{\001\006Q\n4\026bװ\xc7`g!w\027\026\0235\xc4p\xc7\n\024w3\025p74\027\025'\n\016zV\x91\xf7\xd1\006\033\xa4\xe7\xa1W\026\003\n{\nnS\016\x80w\0175x\033z\016x\xd3\xe0\xf6\xb0\a\fn\xc3\020rP\f\027Q\xc7P\f\004\n@\f\n$$\022\005\xf5\xa0w\002wa\016e\003W \020\021\xc40x\n'{\f'@\xc70z\020\f{\003a 5zr\xc1p4\020w 6e1\xc5P1z\021`#5\026aqư\a\f45\ntB\021!p\xc7@&R\xf6pƐ\xd7@\ft\017V\021\026\024sRa\nQ\xa2\xd7p%\n\021y\fq\021%\xb3g\022a\016y\001\u0530\xe7`\n\xf5\x907\002'z\xd7@\016fp2\aV\f\026`\025\032y\no\022R\030yQ\001\f\xf6Py'A\031y\x87\xb1G\033FQ6\xd6@\xe3\x90'\x93\a&\021\xb4\xc167ar&R\f\005\f{\xc7\xc0P\xa7'\nW\022u\n\x92'\xf6p{\001 B\xd5`\ne\xb3\a\001R\xe1Py\016\a\n \x90'\fdӀ\aS\021\xf6 WA&\xa0\xf1f2\004Q!r{\031ta%\003w\ng\nf2x\030u%c\001g\xb2\xc7\xc0pW\f\005\fE\022\xc6\n\002\xc4p\002\024bq\022{s\0267\026g\fb\027A\xc0p{\016\025\020Qrab q@\nw\025\003\nn\016\017\004\006\025@\n\020qvp\001\020f\f\020\021\026\no\022\f$w\0200V\ntS\xc0p\xb7'\xc0P\001\xa27\020'Rr\006`\001\nwwc\xd5p\xc4p{\xe3P`c\aA\016\026 gC\027R7\002\a\025\003z\ng 5\002\006qQ\xe0\xb0'\026\n{\023'v\001f\023r\xc7@ PS\xb2\xc7\n\024\a#z \x92'\xf0@w\016{S\f&\xb3'w0\az\017va\nz1\xb7'`\n\xa1W\f\fV\030t\f\006w7\006\xb3'\xb37A\xc1@\xc7 z\0210\xc7@\002G\fՠ\xc7P5\0015'\004\fz\f\027%\021\xe4P'\006\xf4P'@\nv ư\xf7\xb0\a\f\x81\xd7`\xd7p{\001\nv\xa3\xc7p\xc7P%\020\002gC'\xf4P\001\024c\fe\f\xb7\xe7\nzr%\f\005\x91\xf7\n\xa7\xc7`\n`\001wǰ' {\003\"\xa07\027aa\f%aq\xd6@!\0014\006\n\005\f4\006\a'\0206&\006 \a5Ơ'\ny\021\xc6P!\006\027\0205&5\xb2\027\023w\026qa\xc7@\021\001p\n{!pb\n\aerr\0026%P&\003v\003\xb1\xf7\xb07e\n'\027\a\026\fv\a6$6\xc4@ p\020\nx\016\xf2\xf6\n \025w\fp'W2e\fvq`\016&x\016\026\n\033oA\f\x91\xe1F\033n\xd00n\002\016z\xc5\020&'p\f'\025\027\xc4\n@ #z\n\xb0w\nf\002\xd6\n\025z\017y\n\021$v\n\xe6p@{\017\x917$\025@\x97\xc7\n\020\f\027w\033y\f\002l\fz\031\xc7@\fA\xa7g\034z\f\a\"V\xc1PP a\0224\002av\f\020\xe7\x80\027C\n\004\nz\xc0`\nd\fP\001swq\021va\003BcRcpq\xc1Pa\023{\023\n\005Q\016\xb1\a\ab1\x827 Qqa\001\xa2\xe7pQ\001`\nwBr\020\020qQS0'\005\nAb\006\ft\xc7\020%'gb\nw\aq'\n\021\xb2\xe7@\n\xc5pt\n{\xc0p$\003%5\xc5Pp\003\003y\016\a w4qcP\016y\n\001\027g\xb37F\016\xd4`\aQca\002a\022$f\f\020C7$Ǡ7\xd7@Rs\xc7`\n%'%\004A\xc0\n{\"A#V\021B\017zb\f\aGs\001\027\022'4\xa3'ǰg\f\020pa\xc0\n%gb\003\026Q\f\xb7g\016ww\022 \fo\022\027\xd7`$\026!4{\0304bf\xf6Pq@\nv\xf2\xb0W6\020\awbr\020\0207x\017{\021\a f\016\a&aP\nP\fVq\xc1`u\003 y\nu\f\nz\002\xd5P!g\026\002\xa3'\022u\f{\fP\n{\0200%\026{\030{\n{\fQ\xc7PsR76{&'qz\fqа'\001%rP\f\004\0277A\xf1`'{\xc1\xa0\xe7\xb0G\f\020\016e\xa07\023&\xc5p`rG\n{cC\f@\n\006g 7G\0165wAQ\nW7%\005z2\xb6\xd7\xc0@#\n4{\f{\fr\005\xc0P\xc6\020\006qBpR\016$\a 6$\027\026C\001!\005\xc60T3WB\xc2`pa\f{\003\n&w\001\"{\f\006\xc6\nz\xd7P&q''\027Aba\f\006\020\027b\xc3\xe0P\xb1\xa7\027`\f\003{\a`cac\fes\027\aqq v\n\032y\f\xa5AT\016\x92\027\no\035z{Ӏ\a\006!\021W\n$\002z# \026us\fŰ\xc7p\004\001\001Bp\027\f\006g0\026\xb2\xe7\nRQ1@b W\0237G\fgq1pr\005\xb2\xe7\020g\no\017G\001cQ0f\022Qc\nAS%b\023%p\"vR0p6 \001{\002g\n${1{\023\020V\xd0P\fu\022\025Rc`\0021{\017t\027C\023\020\a\020a\a!z\001Q\002\020\006`\xc0P\ffp\017\025U0eB\f\n\xf1&\032l\xf2ЦW\030\xc4p\016\032\035\030\x84az\x95\xb7\xc6V0\x90Q\035{\xe4\xb0\aԐ\xa7qF\n\016l\f!\xb1'a7\006\nvq\nd\016f\020x\f\xd0Pp\xb1\027\xd6P\n$ U\021\n{q6`\016&\xa3w0pw\n\002\017\016\016o{n\ny#ѠW`\021\006֠\a2pǰ'\xc5\020bT2g\016z\016u\025\f`\xc5\020zRs\ff\005z\a\xa3\azc03$\n21\003\025z\f\001\xc5 t\xf6\nz1\xc4\n\nr\023$\xb7\xc7p\002u\xa2נ\027a\021&p\002\026\0066\xb2'\xd6p`\021\006c\027\n{\nv\020'\a6\nu\027\aa\023$ $\ft\021\001&\ab\003\xc4p\026\nbz\017z'B\002\020\021\027`5R`c\n%`&&\xc0`\022\0056`\x87\xa1w\f\xb77w\n\033\035\n\xb1׀\xf1&\033\xa5\xb6\x97Fo\xf4\xc0 \fe\022\fvpC \026\na\xc0@w7\016E\002$\027z\016{\003{\n\0066Q!Wsg\002\n\aw\0270`w\f56%\xc5`\n\026w!\xd2\xd0\xc1\xd1q_hz\003\fxP5'5\xf5@a\006\001Q\ft\fV\xc0pqv\023\025Sy\f\x82ׁg\n{Ӑ7{\032ox\xe3\xc6@\x90\x91\x86ax\xf3p\xd4\001w\036\x85\xe16 yс\027\017l\xb7Ay\f\a\001{\nǰ\aa!v\023G\fq\fu 6\xe4p5u\023{r\xd4p\021w\"U\nz\n{rr\027S'\a\f{\nu'r\fv\f'!pS\u0590\a&\022vU!\n\002\xc4\nap{\nw#vwc\xc7 y\n&\a\xe5\xb0\a\001\xc2P{\f\xb2\xd7 \024\a!{\f\xb3\027bAS\f{c %\001\n{'\f6\004R\006&\020@\fP0\006\a \fz\xb1\x91gp\031\xb4\027\xa0\a\xd4\xc0\xd0\n\022\fm\f\xd1po\xb27rds\021\xc6Pw\016w\f\025Q\xd4\0207e\016y\fS\xb7G\f{\x85w\n\0345\017E\030o\xe7\xa6\027\x96\021\031\x861{{\np\nw\020\025\xb37\020\025BB\022&`\022\xc4\020\025c!y\0167\xd6@a'A`sC\nf\022\xc5@\nx\016\027`w\021\n\xb3\006\016\xc6P\xc5\020\024Ґ7v1\005\xa2\xe7`\u0080'\0305%q\025G\023ga\021\006\xc6\np\002\xa3\xd7p\xb1\027\"\004#4\x83\xe7\n\017x\031y\x83\x97\xd1`T`Ԡǀ\a`Sq%\022PbCR\"'eð\027\xe6Pv\f\xb17sC\022U\023\025\f%S\xf4p{c\001f\f\xc5P@2\024\xc6\nys\006\nz\faS\n{\020pv\003\022`g\001\xe0P\xf6\xa0\a \xa07\xd1@l\xf5\xf0\xb0\xa3\xf7\x94\xb6\f\xf8\x80\xf7yO+Fyj\017ᡒ\023\xba\xe7\x96\xd6\xd0@\n\030x\xf0\xa0\a2\024\fz\002\xd6`w\001\xb2'7%\xe40\x86\x81\aR\fW'u\az\n\xf0 \f\x96\027C\001\xb170eP\n`\002&G\017\004r\xe6\xb0w7\xd0\020\x96\xf7p{\n{\f&$B\005\n\002b\003\a\005&$\xe7Pg \021e\fQ c%\032\xa3׀\xf1`\031)yli\xa7b\xb0\x95\xb12]Z\x84\001\ny\032npwV\016G\022g\023Q\002\005\xe2\xa0\027B1\027@נWz\001C\xb7\x81Ѡ\xc10!\f\x95\xc7\xe0e]{\006\016\n\xd3pb\xb3\x97\xd1\006\fwb\002pS\021pS Q'\xc6p\020g\n\xd5P\021f1`\xd5@Rb\0276y\f\021g\xe7`R\0206{S\017z\nz\001\"Q\016\a\023a\0214y\017V \nb'\xb1W\002dA\022ư'''\xc4p\n45@\027\xc6\020bbbpqs0QWc\001grq @s\027RS\021sV\021\022fc!g\n\x96\xd7\xd0 \x90\027\f\x91\027 \xc5`\nP\a$\xd0P`p\017{pSg\"\006\fuq\na&w\0217P!\n\f\f!5F'5CP\022\026\n\ab1F\f\023\017\030\n\030@ik\xf1\xa0'\xc5`\f\016-ylk\026\fT\002\0275\a\xd5 \0246v\027!Ԡ\xd7p\016zz\xd6\xe0\xe0\xd60{zv\xe0 P\033)\017o\035\f{\017\032v\016:M{KZi3\030р\x81w\xb2\xc7@\016n\016\f\xc0P%\xb2\xc70x\f AC1r\020Q\xc0@\0226\x91'sCa\f\005r\026\ab\0250P7@\x80\x81'\xb1w\016b!f \xe0\020\021!D{\fl\016\f{\027\017\n\xd4 \xb7\a$PQ0B\002Ppb\0026'f\001`\"''5\nt\xb17\006\002v\xa3\xf7\xb0\xd7`\n$rv\026\x93\a\f\026נ'\020\006 \n%\020\0276$&zs\023p`p\021\xf5@\xc5@\002\xc0@b\006\002\027\002\xa1\xc7\020\0260P&4\017\fx{\017\xe4@a{\017\xc5`0z\a\xe0@rA\nzz\n\n@\fqw\xc0\xb07P\002 \004C\017\xa0\0271\025\xc4P\xe7P3z&6\003ub\001\n@\n\xf2v\022\032\034]_x\xea\x80\n\x8a\x87{\xe5\xf1\f/\034kJ\xb8W:\xa3\x82\xc1\x80\xe6\xd0\025\x87A\n\xb2\xe7\n\026\au\xa37\xb2\xb7\xd7\n\x91\a\f\021\024\025\027A\"\xf4\xb0W\f\021g\xd6p\xc6pp \027\xc5`\f\005\xf4pvQ!\xe5\no\fy\f-\031h\xe6\xe6\xf5\xa4w\xe3\nW\022\026\f\024&\nu4\027\xc4`\001\003\027\027w\027R\xc6\n\n\016\031nY\f\xdf`\xad\xd7\xe6\xe1\x90a\x85\xf1\xc6d*\034\034\fyx\034xi7\016\f\xb7\xc7`g\xd0\020y\xd7\020!e\xe7@S\001P#0\xb0\xc7P\xb3gr0p{'a\f\021r{\xc2P!$\027&%4ps'$\001Qa\016fr\nyChx^\x84ѱqxc\f\016V\031\016bၶw\nP\003{\n\a\006!'w{\n\xe5\020i\034n\x97\021t\n\x82\xf7\xb0w\xc4\xc1pU\031\035/\037\032\xaf\xf7\xc1\xb5\x87\xe6\xf1\003\005\017n\xb9\xa7\x96g\016\f\xa2\001y\017$n\033y\017y\xf0`0\xb1w\f\027g2{\n7{a!\003S5{\017\026\006\xc0\nk2v'y\031{\x95\xd7\xc0\xf0\020\n{b\025\x82\xc70t\f\026%cw`\f{2Qr'\nc\acB1 \020\024\027Ps\020'\027\024\001\n{\nz\n\025`\0227z\003a'Q\f\024\023$W\016@5\017y{\xd1 \n{\fx{\f0Q\020\002\xa3'\xc5` \fz!{0 5'{S \ac `\nxÐw\017{r\xc1\021[)\xce\xe0{\xab\xb7\xa2\f\017N]N/\031n\f\xc5ӡ\xc7\025,\xe0e q\no\xf70`1\004\005\023\024W\f\n\xc4py\fa\"G\030\x85\xd70{p0$57g1\xb1\027\fz\xe3\x80\a\xd0 \024rհgc#{\xe0`\xf4\xa0wR\n\xe4\nzni\xe2\x83\002\031\xc4\n\xbf\xf7F\024g\nG\xa3\xc7@\030d\fu\031m{\030\x827v\xc0`\xd6\020\025z\021\017\030yl\016\036>\xd5\xe0\xf5\xe6`\032XX-\xa2\n\016\xf5\xb5\xc5涇\x917\031\nz\f\x91\a#\002\f\x90\xa1g\025w\xc6p{\002S\001\xd6PQ\023\025p\fucqB \nz\xc1@B\002\xc4\0205%\xa3'\f\026`\x85a%uBr\f6\xe6\xa0gS\fg3\024\006w\fvS2\004P\021\xc7@brC\n6z\a00d\xd6P\001\xd6\020z\016'\024%r\njk\0348\xd9\xf0{o\xbc\xe7R+*X\x8cg(\x9dё\xe6\xa5\xf7\xb6F\f{y\034\003y\xc1\x80\xf1\026\f\xa0w`\016\xc0\xa0'\f{\021\004\021\0017z\f\fA\001'g\001p!S{\022\x90\xf7\nvs\022\xc4`&\006\023e5\nb\xf7p\xa0\xd7@\001gp\xc1`\005\002rv\020B\n{\f\021PQ\faP\xc1@\xa1\x87a`!\x92'\xc6\020\xa3\xd7`\a\021\026P\xb3\xd7\n{p\xd1`5\av\017\030ogq\az6\032\xa2g\nV°7'\006&{\016%\025P\xc0 e\xc0@q\f{\xe1`f\016{a\n z w&\xd6\020Q!\xb7\xc7`\020\n\xca`H\xbc\xb6o\\\x8c\xa1\xb2եa\026\016_(\xb2\xa3wm\xad\xf7\xf2 \xa7\x91W\0264\xa1\xf7\n,\x9f\xd7\0048\016\\>;\x8a\xd7y+\xe9\xa0\f\x83\x94ҶfT\f2\n6 \005\fo6Q\nR\xe4`\xb1'А'\026&Q\0037\005'&\xb2w\003\0016\006c\003\001tpf\ng\006!B\f \027s {Q\xd0pv\xe5@\xc1\xb0'\xc40\005p6\n%p\nA$\n{\xc4\nuv!\027\"D\f\nU\022\0024qf0\020\001P\021\024!6q\xc6`6y\003Q\f{\016\005\fy2\x977\xc2\xc0\xa6\x81\xd3\xe66{\xa4\xb7a{\031\noN{ː\xd2Vk\nQ\016E\n'\006u\n\n\027\006!\027\xb5\a\xe1\n\004\025!{0\002\n\017{x°\xa1\021o\xbb\xf7\xc1\x90A\016xc\026\005\001a7vr\033xt\031z\xe1\xa0w\xf4\xb0\xc7@w\xe4\xb0\xd7\xd1f\x8c\xb1\xa6x\xac\x87\f\xdc\nc\0207\nxà'\xb3\xb77'\002\020\027\xb2W\f\xd7p\nBs\fE\022\025\n\xc5P\020\002z\030{\a\xc2`\026\016{\027\a%P\0010'PQ\fg\021brqz\0175%\020w\xe5`6w0{\fw'0{Rb\016{ \027'\020\n&\025{\f\xc5P'vR\023\xb3w \x84Q\021\005\02753{\020v04$\xc2@\xc6@pcc\n\xb0\aB\003`\023ǰw\nu\001rp\020RB`#w°'\005\xb2\xd7p\x86\xc1\xb6\xe7\xb17\002n\030o\n\xc2\xd0ph\031\xb2\xf5\xc1\xf6\xd3\xd3{X\032=\034nY\\\037\030m\xaf\xc7\xd4\xf3\031\xe4{\x91\xd7\xf1v\032qU\x80\xa1\x86Q\017z\n\004\"A`\nz\016As\002\fzy\"\nvW\f\023\027\a{\xb3'Ґ\xc7\nz\002\n/\031N\xc1\xc1\xd1@\035pox(h=\x92\xf7U\x82ay\003\004\016\026G%B\016Q\xc3p\025q\x85\xb1\xf7\x90\027wR \024\034kz\xcf\xe0儦\xc22lz\xcb\xe0\x81nz<-+\xbb\x97\xe2\020\xa3F\xe0`q\xc5\nu\027#\a\005`\003\xc0\n{s\nvѠ7$\001g'{\nS3iv\016-\xf2氕\xb7\xc1\xf2\xb1\xf6{m;\031m\xab\x97ǣ\016\xa2{\x81\xc1P\xc4\ny\020\xd5`0\xb7'\027'P\xc6\n\xe4\x81\027A\027\fQq\f\aw\002{\fz\xb1g\031z\f\a\031esy\xc2\xe0&g*ń\xa3\x94\xa1\001\xa4\xa1\xc3zm\xac\xb1yI<\x94\x816\n-yo\xb6\xd7\xc0\xc0\xa0\xb7\xd7\nqs\fm\001\002$\021\021\006w&!\xb6\xf7p\001g\f\027\020{0\a`\020Av\f\xd6p\xd5\020\xd6@\aT6\016\n7x\fg\a\n\x91G\0305z\nQRS \xf7\xb0W\x91\xc1\xe6\xe0\xa0W\006\n\025z\n\ndo\032\030@U7!6\026\xc4p'ǰ\xc7\nV\f\xc4 vSqv\n\xc4p$\xe6\xd0P\005q\016x\fD\x93\x91\xf7\xb5ǰ\x82\f\032\xbc\x87\xe4\xa0\xe1Ђ\xf1\xf5z\nـ\xb1\x95z\033<-\xf1䆓\xb7Az\x84\x91\xf7\x80\xc7\n\026!F\xc0p\002\021v\021vP\030{v\xd1\n{\030n\030\017\x96\xd6\xf6\xe1\xd3VlҀ\xd5\xd5\016xԖ{\x97\f\037\034\xb0\xe7\xb6w\xd3\n\024\n\027Qs&Q\016u\027\006gc\021\001`\xc7pz\003\021rPr\f\006vr\xc5pW\xc1 \004\f\xc4p7{R%\xb2A{!\xb6\xc7\n\xa2'\xd5\n{\017\005{\n6&p\020&4\f{v\xd1\na\022\x87\a\016\003x1аG\xd1`p\f\004\003'\024b\020Qr'\001bA7\n&z#\a \xc4` `r\002t2V\016e\022\aa\ab\0011G c\xc6P\026\0250g\f\025V\xd2`qrQa!c\004\fQ\020\026{\xd5\xf6\xd6\xd6F(>\037{n\x86\xc1\020\xc5`z{\xf1\026k\xe1\xe1\xf0\x91\a\xb1\aC\f\026r\n{0\025\022{\0210\004cSp\003\xc6PR'#tp3{\020w\xc4\020\016{vz\017\xc1P`\f{' p\006\nz'\027\xe6\na\016@\xf1\xe6Űӣ\xf1z\xbeg\033\031{\033z\xb5砱\xe7\x91SHj\035\f\xd1\n\006a\020 F\nz\xc2\ng!vD\xb4\xd7\xf5\xd6\026<,\n\030ky\034\036x{\031\xf7\xc4\n׀w\fwǰ''\xd6P{\022@\xc6\n\xb5&\017\035-\xba\x97\xe7\f\034yzoo\xd7zh\xee\xc0\xb3y\xae'\xf8\xc0ҡ\xa5w\017Pb\027\fe\023p\xd6@\0035{\f\026c\a\fgq\021\020vg\017y\032y\a\027\024\f\002W\xc6\n7w\0015qvq\fv\020Q\fF\nqppBs&6e\f\020\027%\027w\xe0@'Ra\020 urS7'\0260vp\xc1\xb07g'\a\001v\f\026g\nf\fz#\n\017m\030\xb3\027\031\xe1!\xb0\xe4\xd6\xd0𐡧'\0263vg\f\025\a A!&\ag#\024t\017\031\xe3FR1y2&Rװ\027{\n\xd4Ps\020a\xa2\xc70w!u\nz\f\025\021\a\a\001b\xc6p\030{t\no\xe2\xa0'\no\n\016\x95\xc1\xb6֥\xe3\x81\016\\\u07b6\fݐ\x91\xa7\xa7ǰx\x8d\x97\031Ƞy^8\xcd\xf0\xa0\xf1\xf5\x96\xc7Bfr\xb3\xb7\xd1v\017\xc6P\n{S\0205CqS\xc0\n\027\004b\023u4\022ws5\nusrא\027ar\f\a\020{\0235\xc5@\022\x80\x91W\023\xc6Py\030z\xb2\xc7 \f\n\xa2\xf6\x96\xb1֕\f\037xn\032\035H\033(d\016\033\017L\033[m\xd1\xc0\022{\xe1&\xf1@{\017@\xb1\xd7p'P\016z\016U\f\025\xa37\027w\xe0\001osy\003a\0020\xc0@榡\a\023a\n\005\a\021f\020q\nxr\xd3`u74r\xc4P\xc6\xc0 \005&W\ff \xc7 \xa4\027a\n5aR\fu\f\xc5\n$T\xf70\x92ו\x86\xc1\xb2р1\xa1\xb2\xb1\x93\xa7{\xb4Wmk{\017h.yp\021\n%\apA\xd2`\006\020\025B\027s\022W\xe2p\x91\xe7\xe6\xf5\xb0\xc3\n\036\x88\x97\xd4\xe0\xc0\xe1\xd0p\xafW\xdc\xc0\x80\xb6\x97\xa2\x91gu\xc7\ne\n\x92\x97\a\f\025'\026\025\fu\003\xb6\xc7P#r\025r\n\xa0'ry\003\f\025A\x80\xb1\0275\n=\x82\xf6\xa6w\xa1ֶ'\x82\xf7P7\n\xd8\xc0zɶ\024;\037.jyذ\xf3{/\030\033mKl\034\xd1P!n\016rҦ\xf2Vw\n\006\026 6\026P\020&B\026\xc2\020y\f6{\022\xf6p\x93\xf7p{\f$\xd4`\027`\021A\023נW0\ncf'\020\005bR\"v\f\005vr& &\fd\021S&\001\xc6p6{\xb3\xc7P\f{\017x\017z\n`q\fp6Fc\n\026%\xa2'נ\xc7\020\xb2\a\xf4@\021'&P\002\016\024\026Wsb\027z\023\xf6p\xe5Pw\xe7\n&\022`\001s\020@\f\xb67\a\xd0@c`\"\xf4`v&apb1\027\027{r\002\026q\027c\006 w\021\0216da\n\xe0\x90\xf7\x80G\033{A\nz\032z%5\xc5Parp{\031y\f@\xc3&\xa6\x81\001\022zg\0221\002{x\f$!\001g4\003a\020 \xd4@\021` \001\026\021\006%tA\xd3 5R%\fe\xc3@6\x87\xe7p!{\nu\0015S\016{\017y\xc6@\nf05pyxm\x94\xe1\xc1\n`\a5\xb17\xb3\027\027rP\016{\n{\021\a\n\020\027u\n\005aa\xf70d\xb7w\002\023\020\xc4`P\xe0p&\026Wrs\021\xb6\xc7pS\ne\"u\xd1PR A\xe6\n\025%\xc6p\006\nW\002$ez\xa5\xd1 \f\xb0w\a#%GT\002\016\027\006\a\fbu\fq@\0020&w6Q\020Sp&\x95'\032q'\027$\xd2PeR\006\"4\001'e\n\a\027Rc0\004 5v\004D\xe2\xc0p\020tr\016^\\\030\037\xd2`\f\031\xb0G\x85q\xc1pv\002'%\027g\0020W{\033\xe0f\033z𰷇1\004\036nK\034\xc0\x94\016\xeb\xf0zL\036\032\xf5\xb0\f\xbc\xa7\x85\x92\x81\xf1\xf4\xd1\xf4\xe6\n\xb07a!w\016T\002C \0016{!q\006P1\006c!{\xb3'\xf6p{{6\f\023\aF\nr\017e\004b '\005r\f\006ր'\fG#\0254!$\acb\0066\xd5`wb\022q\003\026u\xb3\xc7 &6{\003 er&\"\005\030l\031\xf7v\033z \003y2y\034\031\xe2\x96\xf6\025k\f\034hy\032\n//\x85ŀ\xb1\xa6\xf4\xc1\xc3\020\f{x\xd4P\032{b\x80\xe7`s'\f{` pCr\026\020%\xd6\xc60\016\n\x93'4\xc3@\xd2\xd6`v\xd7pS\0227v\xf7`w\004\nvSp\001\n{\023\021\025\021\x84qv v\001B7\"E\xe0\xb0Wp\xe0\xc0`\xa77x\fLn\xbe\xe7\x85\xd1\xf3\xc1\xf0\x96Ò\xe1\xa6\xe7\xc0\xe6Q\031z\027\023RA\n&\026v\030S\003z\"n\034&t\xd3\020\020\n\x96ֶ\x85\xe4\xa3\n,Tln\xd3ᆡ\xf1\x85\xa26Zx-\x86\xd1`$$4A\f$V\017%U\n\005\f&\a\026\xb2\027Cw\xc4\020r\a\xd1@b\021gw\xd7\nzrrb\fgq{\n0g6wa\"{\016{\xd7P0A\022\xe5\xa0\027\xb3\027svcy\xe7\xc0Pa\001\001s\004\020f\n\021$\fy1\027g\xc0@\021S\f{ra\021pR\002`\021\xa3\027\a\027 $C\021\001\xd4Pq\f\n\035\016\036\034o\\y\016W\033\035\xc1\xa0g\025\0060P\n\006\xb17f\n\xc6`\xa1\xf7@ǰ\027\021PC{'\021br\n\xd50\xb7G\aQ\xc6\xe0P1%bq\027\027q\021\005rǠ7p1eC\nV@\020c\020\n\025f5r\002\026p#P\f\005\026 5&\xb7\xc7pq\021&\xc4\020\024W\021oloMz\033\037\034q\036\032uc`\n\022\021\027\020\026g\002\nbӀ\x91\xc7{\xb8\xd7z+Ȁ\0328\\\xaa\x87\xb7\a\033\xcc`\xbe\xd7\xf2V^\x813\n\xb3\xe7֑'o\017\026\027\016n\ng\027\003u\023\026v\xb3\xe7Ppy\003аwcðg\xc7@s\026!\xc0p\xc0p\u0530'\xe0\x90wR\fw\xc0\x907B\f\004S\fV\020\xa7W\027\034\xe3\020\xb0w&\xb6'\xd7QmU\xd7\xc0\nf &\a\xc7p\005\027 \004\016wc\021\006p\020Wb\f\004\xc3`ǰ'4\006\xc60z1y\n&aa2{\002 \xb0g\xd2`Gs!a\xb3\xc7P \xa5'f\021\f\016\002{\026\xa7\xd7\xc0p1{\f5S`\ny\017y\002\002\xb27\xc5@\n\xc4\n7rA2\006%\xc7p\021f\022t&\x83\xd16א'Q\xa4aq\037E^yn\xa2ׁ\x91\xd1!ZlkÐ\xc31z\xa5wBC\xd6\020\027b@\fR0z\016\026\027wr%\xd4\n\020\027\0206Ű'\n\x82'0\x92'w\025\0263\005w\xe5@\003\xe3\xb0\xd7@5q\x83\x87\x91\xc7`\fV\0215S\030z%W07Gf\017R{{mzl\030\034\fc\n\030\xa1\a\017\024x\033$\n\xb77 6\xc4P\021'\027%Srg\030x`\030\xe5`\xc3\xe0\020XLI\x84\xc2\f\037k\\\025\034,9xY\031{O\033\017\035\n7zŰ\xd7`\"Dr06{\016{!P2w\f\026x\n\xc5Pw6{\003\026\023t\016{b\xd7p\027\fPb!\xc5p\005!ar\n\002$q5A\021\xf4pq\a\n\a\003&\025w\nf\022`Cs''u!\xb0\xf7P\0250`\xc7@\ara\021&@\f\nW!Q$!%\xc3\xc0@\x97\xb7g\xa1w\0322{o\024\n\xc1\x81\xa1'F'g \025\xb3\xe7\020&4\006\xc5\0205\005\023y#u\0026\005gT2\f&v\xc4\n\xc6 \016i\n\xb17\xe1\x86\xc1 \033נ\xf7\xb5\xc5\xe5&\xb2W\xc0\x90\f\xcf\xc0\xa0\xf6\xb6G\xac\x87\n\034\x83A\xb1wz\f\021\n\xa6\0275\003\021\0274 A\a\n{C\f\004\027\020\025A\xa6Qy\031z\f%%'s g\003w\n\026f\xd5`\"pw\021%\xb3W\0225\x96w\xe6 Q\030z\035Ā\xf7\xe0F\x857\016\xd7\xe0\xa0\xc7\n\026g\n{\002&PB\030\004&\x92''f\xc1P\n\xa1\a\f\xb7'%0'\xc6\020\aq\xb3\xc7P%\001!Aqq&R\fdr\003\n\024w7'fb\xe5\n\az\fQ3g\022$'\xe1\xa0w\fvw\021\025P\034o\016\xf1\xd6\xe0@'x\xd00z\xc6\xf0@{\031\fz\016\x80\xf7氧\xf7֠\xe7\x92\xf7\xd0Pհ7$A\xe6\xb0'{\020s\030\x907W\ff7\027\xc5\nPSB\f\025\aqS\fG\nu\xc0\xb0\a`р\xc7Pq5s\xd7\n\xc4\n\xb4\xb6浆\027o\017\032\0179*o^\x87\a\xc7\xf20\017\xb5\xb7\xc7@\a\n\025\aw!\nQb6\n\024aw\f\027wRc\021p\026'p7{F\xe6pP \003q\021\x85'\xe7\xb0\xd7`\f\023\xe6\x80\xe7`\xa3'P\fb\021w 6g\003\0276{!p{\022\024!g\xb3\xf7@q%\021c \a\nz SQ\033y\0206fq\0011\xb0w\022\xa3'\xc6\020t\f\027p VB\001R\f\025qv0\xc1p`6\005s \nF\xc2`\xb3'7\a\xc7@y\017bR6B0p\xd7@\n\026A24\025'{\016%&1\fo\xc0\x807\006\001%\022\xc0p\x90\xf1\xc0\xb0G_Zkն\xf1\xa1\x81\"]O\035h\037ȐA\xf2\xa0\xf7\xc60l\016y\033o\003\n\xa1w\f6wrr{\016{\022%%\nV\f\005q\xc6\n\006\n\xb2\xe7\xb0w\n`v\f\xc4\020\025gQ!a\016VcAs\027\002\xc4@\f\026\026\005B\n\027\xe6`\024\xc7\020@\fu&\021\xa2\xd7\020\006cpp\xc7`\xc6p\020f!wC0{\n5\0257'\004s\0015&g\n{\003\a $`%\026\xd5\020{ \xf2\xa0w\026tÐ\xa1\027\032D\n\xc6\n\xb4'tw\xe5Pǁ\a\xd5pfP\f\f%\020'\004r`&rct\fv\023\005\001\020%\nT\xf7P\0267q5\027\005\f\x937Rr$c0G\022q\xc5\020`$\021qC\xd5\020z\n\027{\f\xb37z\017\005\020\xc5Pp\xc0\nB\016'\xc4\020{p\xd6\xf0\xf6 `Ss\005\016{p\006\022z\n6&%\xd0\xf0 \n\xb7\xd7\xf6\xa6\027j\n\032\016ƀ\xd6\xe51\017+\n\xc6`\x87\xc7`t\003f\n\027\024\xb27qs\002gB\n{7ar\xd6\020\xd2@1\020C\no2\xc40x\016\n&a\xc6\n6f\001\xb1\xf7\xb0'\001\xc5`b\a7%\a\020B\0236a%\a0B\001\005R\fP7`\x93\xd7\ny\fcg\xe7\020x\032a\fpV\fPq\020\026uz\f7!z\002\003U\n\a\a75v\xf6`%`\0016\xb17\020W\f\005C\xc7p@\"\n\026\n\027\027\005\f\004\xe7\xa0\xc7P!wS`\xb3\xd7@İ\xd7P`\a\001\nz0&\022&sb\001\x95Q\xc4P\"t\xc6`\020\xd1@f7r{\0220W\n\025W\022\xd5P\xa2\xe7 tb\001\xc6`q\001\nz\fwB0S&`& aѰ\aw\022f\017\006wz\nP\016\024\0025Q\xe5P\017T4\020q0\005\xe5pv\020 \xb27$\xb3\xc7pB!\027'\025p5\004\017VrA\xc1Pcs\003v\xc6\nvq\032k\xc5\020%\a\016x\022{\031e{\030\0051`\n\x84\xd7P\xc6\n\fo\xc7`\fP&pS\xc7P\xd5p7&wS\020\aA3@g\xc3 V\xd6\nD\fa0zҰ'&u\023\026Q\f\004\f\0057\xc5p0\xb57p\020&4#d\f\xb1\xc7pp\022\xb0\xc7\020z\n\006\002\f$\xc4P\n\024\f\a4\027\0276\f\016\n4\nz{g\x90'{\xf5\xd0\xd0P'\xb0\027e5\f{`\021\020\u0080g\027\002@\np\xb27C\xc7`gq\"v\027`\fy\n`\002\fz\003`\n{b\017tg\"\001\a`\016{sw\f{\0037v\n\025e\001\fz\016z\f\fp\a\n``\f\xc5\020f!z\016W!\n\005p\xc1@\n\a\a\021d\xc0`\002E\016\a\022$Q\022q\a\026!\006w2d\022\a\020\xc7P0P\026\021 \006\026\n\004\xe0P \006Q6z\x83\xa17\xb2\027\021\n\025f\"{\"\005\002&6&$Q!Rq\027p\nz2V\f6e\002rqb\xd7`\026A\016{\027\027!{\f5w\027\020\020@\nq\a\006\nm{\033i1T\xe0\xc0\xd0\xf6`\xb3\xf7\x90\xd7\020x\017{\fu\001a\xe5\xb0'7r\aWRC\"\004P\017\xe4`\026\xc7\n\xc6P%\002\021fS!$\xe0\x90'\0266$q&c\005qPc\xc0@\xb27!\n\xa4\xd7 \a\006\xd0P\026P!'BQbc\020R\fpP#@2f\fTr\xc00\004\027\a\022W\"\025e\023B\001\020c1xq\022\f$5\xd4@b\n{\no!\xb1\xc7 %d\f p'$g\n\020\x86\x97Q\017o\xd7p հ\xe6\xd0\nzC\f\f\020z&\016o\n\020\xa1\027R\016\0066e\017f g\fv\020 {\nu\006°w\fW\f\002wSW\nW\xd2`6{\f4\xb2'&\025\0024\020\n{&r\xb2\xc7P6а\a\xd4\n\xb1'a\fW\021\a\xb3\027\016{ \xc5P{\017{\n\020d!0wbap\016{\002\nur\xc5\n&\027Š\xe7p\020{r\f&\006\003gR\xa3\xf7P\001p\n\026{ra w\xd6Pr\020wr'\0205$1vba'r6'@\0027\xc4``rSb\f{\xc0P%\a\f%\025ǰ'ǰ7\022w`\0025\020\026g\021 \aQ\xf7Pf\f`'\n{\xc2P\xa0\xe7`2f\0016U\f\021p v\xb1\xe7\np\020b\020\006\027\n\005&\0256B3e\020 fq\016{\xc6p&\a\023\005 e\n5W\022Qbg\na\027'R\n4\nx\f\xf2\x80\xe7\xa0wS\xa7\x97a\x81\027\016\nl\031n\0345\xf0@\x82\xa1\027\x83\xf7\xe0v\xf7@o\xa2\xf7\xf0\xb0g\n_(\x85\x91\xc7\xd0\xf6@1\005C\f\025\025a#{sCr\f\005Pcr\xb17!y\xe2`'p\002\027\027Pqb\n%%Q7\xc4`\x87\x81'\0260w\026p7Qzr\020\020b\fu`\0306\0246C$0\027\xc4`\027a\xe7P\f{S\u0090\xc7`\027\ny\fw\xc7@\022R\020w\022W\022\025C\002\002e\xe7@\022{\fp\xc7\n{\n\006wb\xc7 uw\002c\0214%a\xb2\xc7\020@\f\026\xe7\xa07\006C\f\004\002\026\024\035lqr\021'x\n\020\017n\030x\xc1\xf0\x90\x97\xf7`y\035{\xe5p{\xf3\xa0\aB4\xa1\xe7\xa0\xf7P\xe6@C\x80\x81\027\xc1p\x92'\xc0\n{\002agSr\f\021U\022{\016x\n\002\a\026\003$\n$\n\xc5\n\xd5@!\0240y\017\024\030E\030u\nCaAW\xd7p\xb2\027{\016\x82\xd7\020{\fǰ'v16\xa0\xc7\nz\"6\0240\nǠ\aq\nBr\027ap\fwS'7$%\001\026\f\024R\xd4`w\0227\a\026\xc6@c\f{\001'r`\n`7\024\fV\002{\f\nz\"\006\026B\xc1\020{\022R@\003c\026&\xb2\027\001\aR\001\xc7P\001a\nfp\027\021A\n\x90'r\001b0z\002\fw\xe5`W\n\nz\021w7\xc0\xb0\027\ffrw\n\xb4\xd7\xe0@\xc4`\xc0\x90\xc7 y\031m\017A\031\xa2w\030n\u0080\xf7\nUpc&\n\025aC\0027W\n4'\006`\xb3\xc7\020\xf5`5gCw\017{\xc7`\xe7\xb0\a\026\n\x85\xf7`\ny\n\xd4` \024\021&4{\032zqq\002\0204\026\0267%'\xd4`qP\016z\fP {\f\nԀ77q\025\f\xa7\027\"\xc5P!\006QCb\n\xa0\xc7\nP\001\025A\031\025\x827Sc7vW\003\xc5@\022\026Ǡw\xf1p\aQ\016{'\xc5PS\001z\f\xc7\020Fss\006\0224\xb2\a\f{\xd2p\005\016{\021&r\005!\005\001Q\002'$Q\f&'$\0277$b`\f\004\001S\fG\002qg\003a\001\nE#\005\020p'7g\006\xe7`\027a\n\025W `\ff0&\0067\005\f\025As\f%z\fq&p\003G0\xd7Paar\apr\001'v\0207z\n\021{\xe6ppC\nŠ7V\f\f\024f'!wqq7A\002q5P7p\020\xd7 \025U\ng\a7c\005\001Q\xd0pf\fp5c\0041\xb7\027\n\xc5`R\001\025\fvr`\003{\n7z\0224\a\020bb\xc1@\006q\021\aq6B\f\004аg\016\004\016z\017z@\f\xb3\x87\xa1\xc7`f\f\xb2'!y\f\027\001\xc6P\006\xc3@1{\a\020\027Acq `'s&Q\0025\025qp\027\n\024'&\026bqbq\n\027\020C%!6$%\a!\026\n\xc4\020\ny\xe7\xa0\xd7P\027\fuc\xc0\xb07qg\ff q\a\xc0P\xd4P\xa37!'4\xc4\nz\020a\002rce\fW0a'\fz\f&pP\002\020% {3Fr\xd1`y\x90awQ\001C\020p\fa\027{\016$5\nD\"\024!%\n6&v2T\016Wb\xc6\xc0\xa0g\001\xc5 'U\f\001\xc6@\020p\020u\f\xc7P\ar0v\xb2\xc7`\027\0215R\n\026p&ǀ\xd7p\001\024\0166z\"6\004\"\xf1\026\xf6\020\005RQ\021\033y%E\030wa{\003\xf4`\006\nPp&\np!f \027ư\xd7P`\002qs@\017\00474f\fb\xe5\xb0\027'v\f$S\n\005\016x\f\026\xf6\xb0W\npva\f7f`\f\xb3wb\f{\xc0\n\xb1'z\016\005\021\020q\x83\xc7\n6\005\001\006B!\001\a\020\02674V\003p\021wsr\a`\fv\0202z\a\022g1\006r\xc6@Ǡ\xd7\n\xb6w\n5W\"G\f&%6\a!\026@\f\xb1'a\002v\f\025 v p\"z\002\027\xd6p\026q\xd5`&Pc!\aV\fPs \ng\xc5P\nvSr\005\016y\020#`\n\x93\xc7p\002\xc5P\027\020v\0165\024&Pb\fQ\f\006B!\006q\n\006\xb3'\020 \xb07\n\xa0\aѰ'z\f\027@\023\xf4\n{rs6\004\027\001gc\016\025\xc6@\022\021zb\030z 4w\001P\022\f\005\026&\xc6\020wW\nu`\n6$q\n${!\026\a A\023\005\022\025p\021\xb1\027\023p&\xb0\027\fr\024  \0040\005\nur\006r\0025e\022\xc7\n\006\xe6\xb0\027'%!\xc5\xd06\016y# %\xa1נ\027\fBb\fw\f{q0f6\xc6 $`\f@C1\025rA\022F\n\005\022\xc4pw\f\006\xd6@\027 b'u\f\x93\xc7\nu\030m3{\fc\fn\017d7\fo\017\016zz\0177z\f\025\nzrqcŐ7c\023\004\nWC\xd1PasP\xc0P`\f{\f&\026qA\022'$\021\xc6@s$\f\xb7\xd7`'@\n\xb6\xc7p\0216p\0057\002g \a\f{\020rQ\n{saQ \002\xb1\a\f{\fQB!\006&bwv\"\f\024!o\xd2 y\n4ư'a\n{7\xb1\xf7\xb0\xc7`6`Q\003q%\n$\xc5@\n\xf5\xb0ǰwR\nb`q\021u\002\n{ \026r\020W'q76\026@\f\a&Cr\027pbq\0234\xc4\n`P°wC\xc7p0'PB1v\0216%%RRsvS\001 bC\001!Gr\022$pr\a\xb3' p6\006\fd % \001\026\021z\xc2@\021\n\xb6\xc7`rR\016\005v\001S\xb3'\xc7\020u \001uv\np\n'u_\x9a\x85@\x87\x93\xba/\x8f\xedT@\xe6\xb1\025A\xc3yJ@\xf7\xe5\xb1\025AsD@\n\001\003\n\xc7\n\n\n\n\001\003\n\n\n\n\n\n\n\001\004\n\001\003\n\n\n\n'u_\x9a\x85@\x87\x93\xba/\x8f\xedT@\xe6\xb1\025A\xc3yJ@\xf7\xe5\xb1\025AsD@\n\001\003\ni\003\nz\030d^.\x9cm{\003C!\nz\021uba\001r\035\006b\xb2\xc7\020\x92\027\fvS\xe4P\021g^'\0266B\"\026{\016{\023\006\xc7`\xa7\002\aa\ff\020\021\xb1'R\f\026\025\x81\n\017zrz\"װ7\025r\xc4\n%{\016q\x8f\032w\f\017\xa7\a\024\n{w\032x7U\032g\xf3\xeb\006\xf6P\006\f{\fА7W\017\x927\016z\f\f\xab\aup#4w7\aq\a1\xd4\xd0\005!\025b\xc7 oӠ\027c!%\xd6P\n\001V\016fr\024\a#\0247\xd2\xf0\026\001\n{\a1\aW\f\aw\n${\xe0P\022\xc5P\n\005\n\"z\023P\001E\031z\016W!aq{\np\027&\020\016y\fuQS\f\020'\006\a\nz\016g0a\xd5Pq@!Ca\003\a'\"xp\031y\016{\f\025{\030\021d{\xc3p%\005\f55S'`\n{{\017d\017{а\xc7 $g\nU\fg\003\020\005\xc7P\no\fV7\002&\a\027'&r\026`r\021\024rP3\0266y\nCB\001\001a\n\nr{\na\020p&araQ\f\xa27\xc7\020t\02005\006\026s4\006\xc6`\xd7Pr\a\f\026p&`\0260p\001w\001\fy\fe\fwb1\020u\x85\xf16{\xe3p@r\006\f&w\002\xc5\nzA\030x\nw\xc0\xb0\a\nz\030x\xc5\020\017bzSs5$Q\fg\n\xb6\xf7`\002'{q\f\025v\n{\xb1\xc7Р7{\xf1@\xc0pg\001\020Q\022U2\nw\027\f\xc4P4a\002\026ws\xc7@\a\003\xb2\027rb\nd\023\026W\016g!5\005rb\020f\023\006\xc1\x90\a\f\a'\003W\022W!fr\xb2\xe7p\026p!W\f\027\0240waSr\x97\xf1\006u\0316\x87\xb1\xa6ǠѦ\021tԐ\xd7p {!a6\001\020&\005b&\001{\na6P\f\026w\f%6x\016\n\004R\"4466&W\"\026\021\a\xb2'pa \020`c%a`\003bqRC\027\022&q\xc5p'\xa1\xc7`\n$\004\n\nx#\026%y\030\026C\n{\n\xb7\xe7PB\f\004\xd6Pb\x93\xc7p\ff\"\xd4P\024\020's%\n@\021\001\a{\fqRR\n\024\xc40\nհ'\006b0{#%%'F\f\002\026\027Q!\0065\020w\xa1\xd7\nA\0261z\nR6as\025S\027\ny\016y\xe3`pQ\xc0P\xd7P'C\002\xb0\x87\xb1\a\nz\xc5\nD\f%\002wp\"\xa7\xe7`bRs664a\a\xd4 {\f\025\n\006\027\xa2\027\x80\xa1W\xd1@\xc0 {R\017zqr RQ\xc6pq\0015\027A\xc7``\fqŰ\xc7\020\026\026&\xc7`&'\0056\xd6P'\aC\n\x85'\n\fzy(xz\030n\016\fn\033v{\f\xb1\xa7\021j\030\021qc'5U\f\020{\003'p\xe4pw 6z\xd1@b\001\001\x85A\xc5P\022waנ\027\"!{Q'\xe7@\f{\nf\x93\xd7\n\nva\0217\027\ny\030{6հ\xd7\020\xd7\xd60\n\xa1G\f\"E0\xc0`\004\003\006\023\x8274q\027\0017{1v ƀ\xe7\ny\nr\xc0@Ac\027\016e\021qvR\023\026\xe0\xa0wR!p\nx\003\xc5`p\nva\0207b\xa0\xd7\n\035\n\017{h{\ny\nz\023 \026\xe5P'`0z\003a\016W\f${sq\003\xb0'\n\005\f\a\001\025\n@\fC\034X\x9f\xc7!\xa0\n\032U!%\n qu2\xc3Ђ\x82\xe2\xc0\xf6\xc5E6o\027s{C17E\xf0P\x94\xb1\xf7\xe6\xc0`\xd6p%$\x85\xa1\xc7`R\f\xb17`!\004\021\001a6P\016z\n{\003%P\fvr\026\n\0055\027R`\f%p\022%'%\aQ\021b!\004r\aqpa\003wr'%s\a\xd7P5\x93\a\016vwQ\fwr\026\021q\0017G\001\021'g°'\026V\030A\xbaǡ\035\xfc\x96n\xebВW\f\xc5\020z\017&e\n\xddz\xf8o\xb9אUn\xd5\020\xf5\xb0\xe6@\n {!\016d\xd0f\030\f{\033z\xc6pA0\026\027\006#{\f\x9171{\026c\nx2\xd5P\020c7g$\0226\024\021&&0faS\a2{q\021`\n\0055\xa2\xc7\020w\n\xf0&\x82\x91\x86z\xfc\xa0:\xda\xc5]\xfeг\x96Qz\n{\f{\f\fB\002%u\016\036x^\xa1ap\nwW\f&\025b\xe7\xb0'\xa2\027a\f\020@Q\f\xd5\xd0\xf0\xa0\xd3\030\x8c\xe2=\xdf\030\xfa\033\xedm\x8bh\xf8\xf6\xb0zzl#{c\xf7\xf0f\032E!r{O\xb4\xc1\xa4\xd2\023"

Thank you!

Best regards, Bogdan

gitdemont commented 9 months ago

Thanks for your tests

1/ and 2/. Great !

3/ since 1. and 2. are OK it seems 3. is the result of the current issue

4/ Good to know that you can extract things from daf

5/ you should be able to extract those obj_number_r and feat_number_r from

IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif") # or your cif file
readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
​readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction

This won't help you but looking at the code I think that I should me even more stringent and throw a warning and don't export features when IFD[[1]]$tags[["33018"]]$maps != obj_number_r whatever the status of onefile/merged (I will add this correction)

6/ This is bad :/, It looks like it has something to do with the offsets correction introduced to handle large file https://github.com/gitdemont/IFC/commit/80ac67f6eee9823603d30c28a1ca0f59cc63ef56 Could you tell what gives

IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
str(IFD$first$tags[["33027"]])

and also

readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
bavanesyan commented 9 months ago

Sure. Here are the results:

image image
bavanesyan commented 9 months ago

Also, as you mentioned it might be the issue with the size of the file. I tested it for another file of a similar size and I got the same errors. However, when I ran files of ~100MB, everything worked smoothly.

gitdemont commented 9 months ago

Happy to know that smaller files are ok

I suspect more and more that it stems offsets correction.

Could you please paste the binary output and not the screen shot of

readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)

In addition, as It gets more clear could you try (and paste raw output)

IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)

Thanks a lot for you help

bavanesyan commented 9 months ago

Here you go

readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
  [1] 22 00 00 01 04 00 01 00 00 00 01 00 00 00 01 01 04 00 01 00 00 00 01 00 00 00 02 01
 [29] 03 00 01 00 00 00 08 00 00 00 03 01 03 00 01 00 00 00 01 00 00 00 06 01 03 00 01 00
 [57] 00 00 01 00 00 00 0a 01 03 00 01 00 00 00 01 00 00 00 11 01 04 00 01 00 00 00 08 00
 [85] 00 00 15 01 03 00 01 00 00 00 01 00 00 00 16 01 04 00 01 00 00 00 01 00 00 00 17 01
[113] 04 00 01 00 00 00 01 00 00 00 1a 01 05 00 01 00 00 00 09 00 00 00 1b 01 05 00 01 00
[141] 00 00 11 00 00 00 1c 01 03 00 01 00 00 00 01 00 00 00 28 01 03 00 01 00 00 00 01 00
[169] 00 00 ea 80 03 00 01 00 00 00 01 00 00 00 ec 80 02 00 16 00 00 00 19 00 00 00 ed 80
[197] 02 00 05 00 00 00 2f 00 00 00 ee 80 02 00 0c 00 00 00 34 00 00 00 f4 80 0c 00 01 00
[225] 00 00 40 00 00 00 fa 80 04 00 01 00 00 00 3d c3 0a 00 03 81 02 00 ed d1 00 00 48 00
[253] 00 00 28 81 02 00 9a 40 1a 00 35 d2 00 00 29 81 02 00 00 00 00 00 00 00 00 00 2a 81
[281] 02 00 0b 00 00 00 cf 12 1b 00 2b 81 02 00 00 00 00 00 00 00 00 00 2c 81 0c 00 01 00
[309] 00 00 da 12 1b 00 2d 81 02 00 0b 00 00 00 e2 12 1b 00 31 81 0c 00 01 00 00 00 ed 12
[337] 1b 00 36 81 02 00 00 00 00 00 00 00 00 00 37 81 02 00 07 00 00 00 f5 12 1b 00 38 81
[365] 04 00 01 00 00 00 c4 fd 3a 74 3a 81 04 00 01 00 00 00 01 00 00 00 3d 81 0c 00 01 00
[393] 00 00 fc 12 1b 00 3e 81 04 00 01 00 00 00 00 00 00 00
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)
 [1] 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20
gitdemont commented 9 months ago

Thanks,

So all of this is the confirmation of what I was suspecting.

From

readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)

We can see that tag "33027" has value of 1774340 which gets erroneously corrected to 4294967368 So when reading it afterwards an error occurs. While reading at 72 (= 4294967368 - 4294967296)

readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)

You got good value

V = c(0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20)
rawToChar(as.raw(V)) # <?xml version=\"1.0\" 

This seems to only happen with large rif files while cif files (small and large) are OK

I will need to figure out how I can integrate a fix for that for large rif files.

gitdemont commented 9 months ago

Considering cif file, for the feature extraction

Did you get the expected event number from ?

IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif")
readat <- function(file, at, n) {
   toread <- file(description = file, open = "rb")
   on.exit(close(toread))
   seek(toread, at)
   readBin(toread, what = "raw", n = n)
}
​readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction

Did you try to run ExtractFromXIF with recursive = TRUE as in case of a merged it can try to read the corresponding files and reassemble features from accordingly ?

Finally, IFCip package contains ExtractFeatures that could also allow you to compute features from the images stored in your cif file

Look at:

file_cif <- system.file("extdata", "example.cif", package = "IFCdata")
cif <- ExtractFromXIF(fileName = file_cif)

file_daf <- system.file("extdata", "example.daf", package = "IFCdata")
daf <- ExtractFromDAF(fileName = file_daf)

feat <- ExtractFeatures(fileName = file_cif, 
                        objects = 0:50,
                        display_progress = TRUE,
                        parallel = FALSE)

print(IFCip::as_IFC_features(feat)$features$Area_M01)
print(daf$features$Area_M01)
print(cif$features$Area_M01) # Note that cif file contains 420 events while there are 20000 values stored
bavanesyan commented 9 months ago
  1. Regarding the expected event number: I am getting the expected number of events from the .cif file. I expect 705341 events.
    IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif")
    readat <- function(file, at, n) {
    toread <- file(description = file, open = "rb")
    on.exit(close(toread))
    seek(toread, at)
    readBin(toread, what = "raw", n = n)
    }
    ​readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction
    [1] 705341    172
  2. Regarding the IFCip package. The test you provided seems to work. However, for the .rif file I am getting the same error.

    blina_feat_rif = ExtractFeatures(fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif", 
                        objects = 0:50,
                        display_progress = TRUE,
                        parallel = FALSE)
    Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", :
    Start tag expected, '<' not found [4]

    For .cif file it works for the first 50 objects. I will run it for all of the objects.

    blina_feat_rif = ExtractFeatures(fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", 
                        objects = 0:50,
                        display_progress = TRUE,
                        parallel = FALSE)
    20231213_blina_test_blina_6.cif
    
    |                                                                                |   0%
    20231213_blina_test_blina_6.cif                                                          
    initialising [workers=1] sequential  
, , channel = 1

      feature
object       Area circularity Minor Axis Major Axis Aspect Ratio    Angle        theta
    0   16.555556 0.026385780   4.221279   5.032527    0.8387989 1.746384 -0.175587532
    1   81.111111 0.061820202   9.748145  10.643006    0.9159203 2.946390  1.375593367
    2    8.888889 0.019662792   3.747514   4.320400    0.8673999 3.033660  1.462863369
    3   66.777778 0.043262285   9.022279   9.448406    0.9548996 2.067382  0.496585245
    4    2.000000 0.016385828   1.349643   1.887109    0.7151905 1.872671  0.301874667
    5    9.444444 0.065160903   3.832625   5.373984    0.7131814 1.635742  0.064945461
    6   10.444444 0.019218743   3.347216   3.998668    0.8370827 1.738034  0.167237204
    7   13.000000 0.020335004   4.536602  11.709782    0.3874198 2.087715 -0.516918784
    8    0.000000         NaN        NaN        NaN          NaN      NaN          NaN
    9    9.333333 0.018893591   3.124987   3.803651    0.8215757 1.634463  0.063666201
    10   9.222222 0.021186829   3.056410   6.502802    0.4700143 2.912203 -1.341407170
    11   7.888889 0.023247662   2.580151   4.090413    0.6307802 1.577133  0.006336308
    12  93.666667 0.070617666  10.572564  11.423825    0.9254837 2.935230  1.364433953
    13   0.000000         NaN        NaN        NaN          NaN      NaN          NaN
    14  10.444444 0.039962861   2.947450   5.058863    0.5826309 2.898345 -1.327549042
    15  75.777778 0.047901467   9.412010  10.285249    0.9150979 2.340264  0.769467786
    16  15.777778 0.030632663   4.284701   4.750426    0.9019614 2.743412  1.172615334
    17   7.222222 0.018312354   2.503464   3.800871    0.6586555 1.609624  0.038827851
      feature
object eccentricity Minor Axis Intensity Major Axis Intensity Aspect Ratio Intensity
    0     0.5444413             4.243652             5.029100              0.8438193
    1     0.4013602             9.612176            10.472372              0.9178604
    2     0.4976118             3.760181             4.330103              0.8683815
    3     0.2969287             8.957716             9.369529              0.9560477
    4     0.6989296             1.349926             1.888334              0.7148768
    5     0.7009795             3.837537             5.380047              0.7132906
    6     0.5470764             3.344491             4.005516              0.8349714
    7     0.9219034             4.526977            11.715012              0.3864253
    8           NaN                  NaN                  NaN                    NaN
    9     0.5700994             3.121957             3.809975              0.8194168
    10    0.8826588             3.086977             6.616524              0.4665556
    11    0.7759616             2.562340             4.085985              0.6271046
    12    0.3787874            10.615818            11.485421              0.9242863
    13          NaN                  NaN                  NaN                    NaN
    14    0.8127369             2.947334             5.061377              0.5823187
    15    0.4032317             9.462733            10.315112              0.9173661
    16    0.4318168             4.292353             4.776680              0.8986059
    17    0.7524447             2.474947             3.790613              0.6529149
      feature
object Angle Intensity theta intensity eccentricity intensity    pix cx    pix cy
    0         1.747161    -0.176364797              0.5366274 21.825503 19.953020
    1         2.943707     1.372910710              0.3969033 32.212329 26.917808
    2         3.037296     1.466500066              0.4958968 16.287500 19.075000
    3         2.044793     0.473996939              0.2932112 34.530782 30.374376
    4         1.871696     0.300899978              0.6992504  9.833333  8.666667
    5         1.630095     0.059299139              0.7008684 12.376471  5.470588
    6         1.731862     0.161065760              0.5502934 18.680851 20.351064
    7         2.086857    -0.516061040              0.9223207 26.307692 11.615385
    8              NaN             NaN                    NaN       NaN       NaN
    9         1.633615     0.062818788              0.5731982 18.059524 19.178571
    10        2.912558    -1.341761399              0.8844919 19.614458 14.481928
    11        1.577292     0.006495277              0.7789351 14.352113 16.338028
    12        2.939976     1.369179464              0.3816998 31.059312 28.265718
    13             NaN             NaN                    NaN       NaN       NaN
    14        2.897256    -1.326459428              0.8129606 14.138298 12.457447
    15        2.331740     0.760943603              0.3980446 35.645161 29.766862
    16        2.752436     1.181640105              0.4387568 16.563380 20.985915
    17        1.612727     0.041930177              0.7574313 16.861538 16.400000
      feature
object pix min axis pix maj axis pix count     inv1      inv2     inv3     inv4      inv5
    0     12.663836    15.097582       149 4.761210  5.957254 18.51085 16.31302 -33.72495
    1     29.244436    31.929019       730 4.785592  4.652721 15.99071 13.79335 -28.68538
    2     11.242543    12.961200        80 5.105729  6.282013 19.61278 17.41570 -35.92949
    3     27.066838    28.345218       601 4.800156  3.394444 17.13671 14.93909 -30.97699
    4      4.048928     5.661327        18 4.811198  7.365802 19.94801 17.75247 -36.60270
    5     11.497876    16.121951        85 5.353192  8.462037 14.33507 12.17110 -25.42356
    6     10.041647    11.996004        94 4.758768  6.070387 19.64516 17.44775 -35.99421
    7     13.609805    35.129347       117 6.324121 12.046443 17.83721 15.69546 -32.45820
    8           NaN          NaN         0      NaN       NaN      NaN      NaN       NaN
    9      9.374962    11.410953        84 4.752567  6.251664 19.66848 17.47126 -36.04113
    10     9.169230    19.508405        83 5.546311 10.207770 18.91076 16.71500 -34.52280
    11     7.740454    12.271238        71 4.882074  8.101545 19.07615 16.87919 -34.85684
    12    31.717692    34.271475       843 4.780675  4.473846 15.58094 13.38558 -27.86884
    13          NaN          NaN         0      NaN       NaN      NaN      NaN       NaN
    14     8.842351    15.176590        94 5.016801  8.621324 17.31823 15.12036 -31.33960
    15    28.236029    30.855746       682 4.802085  4.698178 16.71020 14.51397 -30.12606
    16    12.854103    14.251279       142 4.768978  5.058834 18.33189 16.13327 -33.36585
    17     7.510393    11.402612        65 4.840601  7.859748 19.67262 17.47550 -36.04955
      feature
object      inv6      inv7 Raw Mean Pixel Raw Min Pixel Raw Max Pixel   Std Dev
    0   19.22797  26.74981       715.0537           566           960 63.287008
    1  -16.03924 -19.89312       769.2479           670           949 58.358201
    2  -20.53935 -32.41962       713.3625           547          1009 79.467170
    3   16.09777  24.14154       772.7687           660           934 51.738863
    4   21.24215  28.48461       729.7778           721           741  5.553333
    5   16.39224 -22.08504       731.0706           708           752  8.383160
    6   20.43021  28.20492       715.5957           546          1102 76.227867
    7   21.12233 -29.99200       735.6410           720           749  5.987825
    8        NaN       NaN            NaN           Inf          -Inf       NaN
    9   20.58922  28.78764       713.2381           512           993 74.555607
    10 -21.74387  32.22987       709.4096           559           773 46.841706
    11  20.92989  29.32692       715.7606           535          1028 79.433818
    12 -15.53885  21.32080       730.2147           535           900 43.018026
    13       NaN       NaN            NaN           Inf          -Inf       NaN
    14 -19.31034  26.69410       735.2340           723           746  5.231707
    15  13.84141 -22.77601       753.4370           634           830 31.661974
    16 -18.32299  26.38480       721.0704           609           807 32.544584
    17  21.40195  30.16991       713.5231           533          1091 92.988355
      feature
object    skewness  kurtosis Centroid Y Centroid X Centroid Y Intensity
    0   0.67373749  5.658634   6.941834   6.317673             6.948503
    1   0.92167377  2.937089  10.404110   8.639269            10.435002
    2   1.00422192  5.733076   5.095833   6.025000             5.096042
    3   0.51458670  2.792659  11.176927   9.791459            11.191089
    4   0.19472162  2.286597   2.944444   2.555556             2.943387
    5  -0.10901160  2.967059   3.792157   1.490196             3.792606
    6   1.83640269 11.120401   5.893617   6.450355             5.896292
    7  -0.02488123  2.525231   8.435897   3.538462             8.435219
    8          NaN       NaN   0.000000   0.000000             0.000000
    9   0.70550367  6.783690   5.686508   6.059524             5.688070
    10 -1.49377269  4.800671   6.204819   4.493976             6.206886
    11  1.07084305  6.687177   4.450704   5.112676             4.452154
    12 -0.73271777  5.298200  10.019771   9.088573            10.032188
    13         NaN       NaN   0.000000   0.000000             0.000000
    14 -0.25791762  2.389096   4.379433   3.819149             4.380715
    15 -0.60721630  3.644518  11.548387   9.588954            11.558366
    16 -0.65336955  4.525928   5.187793   6.661972             5.191604
    17  1.51074063  7.405596   5.287179   5.133333             5.293739
      feature
object Centroid X Intensity Perimeter  Diameter Circularity convexity  roundness
    0              6.302188      18.3  4.591208   10.140877 0.6937515  1.2907542
    1              8.642368      38.4 10.162375   19.552780 0.7525727  1.2204806
    2              6.012821      18.0  3.364177          NA        NA         NA
    3              9.790679      34.2  9.220852   26.421524 0.7549526  1.2587811
    4              2.557095       6.6  1.595769    4.874538 0.6016395  1.5939672
    5              1.495288      27.3  3.467714    3.860443 0.3171608  1.5830764
    6              6.442338      14.7  3.646681    9.979951 0.6787660  1.3183188
    7              3.538558      36.3  4.068429    5.229416 0.2097976  2.8166889
    8              0.000000        NA        NA          NA        NA         NA
    9              6.050068      13.2  3.447255   10.058457 0.7047447  1.3552991
    10             4.491721      22.2  3.426674   19.850564        NA         NA
    11             5.103400      13.2  3.169297    4.408860 0.7069208  1.1385086
    12             9.080366      41.4 10.920627   14.915113 0.7590231  1.1920220
    13             0.000000        NA        NA          NA        NA         NA
    14             3.818329      16.8  3.646681    3.626001 0.6679450  1.0423061
    15             9.589294      36.6  9.822589   21.176211 0.7575911  1.2385678
    16             6.652528      17.4  4.482063   11.846150 0.7114578  1.2937754
    17             5.124870      12.0  3.032428    4.817601 0.7134158  1.2383198
      feature
object    Height      Width Elongatedness convex perimeter convex cx convex cy Bkgd Mean
    0   4.368066  3.6124784      1.209160        12.695653 20.833333  23.16667  734.3657
    1   9.534149  8.6377080      1.103782        28.898790 28.000000  31.27778  733.8100
    2         NA         NA            NA               NA        NA        NA  732.5682
    3   8.595929  7.8000000      1.102042        25.819380 29.529412  33.88235  732.4831
    4   1.500000  0.9000000      1.666667         3.970820  8.400000  10.00000  732.1750
    5   4.002499  0.9486833      4.219005         8.658491  2.571429  12.28571  734.1705
    6   3.498571  2.7166155      1.287842         9.977860 20.769231  18.30769  732.8846
    7   3.244996  1.6155494      2.008602         7.615653  6.428571  35.71429  733.8702
    8         NA         NA            NA               NA        NA        NA  731.0833
    9   3.244996  2.4186773      1.341641         9.302630 18.700000  18.00000  732.3704
    10        NA         NA            NA               NA        NA        NA  734.5625
    11  3.420526  2.4186773      1.414214         9.331355 16.333333  15.00000  732.0263
    12 10.568349  9.3048375      1.135791        31.423556 27.526316  29.05263  732.8495
    13        NA         NA            NA               NA        NA        NA  732.8958
    14  4.326662  2.4738634      1.748949        11.221476 11.571429  14.14286  733.9737
    15  9.415413  8.2758685      1.137695        27.727835 30.450000  35.60000  733.7648
    16  4.295346  3.6124784      1.189030        12.379366 21.454545  15.27273  732.6667
    17  3.132092  2.0124612      1.556349         8.560989 15.750000  17.00000  732.5658
      feature
object Bkgd StdDev   Min Pixel Max Pixel  Mean Pixel    Intensity
    0     3.399115 -168.365741 225.63426 -19.3120495 -2877.495370
    1     3.888664  -63.810000 215.19000  35.4379452 25869.700000
    2     3.648414 -185.568182 276.43182 -19.2056818 -1536.454545
    3     3.694221  -72.483051 201.51695  40.2856680 24211.686441
    4     3.522703  -11.175000   8.82500  -2.3972222   -43.150000
    5     3.273796  -26.170455  17.82955  -3.0998663  -263.488636
    6     3.213221 -186.884615 369.11538 -17.2888707 -1625.153846
    7     3.187760  -13.870192  15.12981   1.7708333   207.187500
    8     3.991633         Inf      -Inf         NaN          NaN
    9     3.400664 -220.370370 260.62963 -19.1322751 -1607.111111
    10    3.195880 -175.562500  38.43750 -25.1528614 -2087.687500
    11    3.265204 -197.026316 295.97368 -16.2657524 -1154.868421
    12    3.712155 -197.849537 167.15046  -2.6348277 -2221.159722
    13    3.439220         Inf      -Inf         NaN          NaN
    14    3.372949  -10.973684  12.02632   1.2603583   118.473684
    15    3.326818  -99.764831  96.23517  19.6721196 13416.385593
    16    3.795468 -123.666667  74.33333 -11.5962441 -1646.666667
    17    2.910750 -199.565789 358.43421 -19.0427126 -1237.776316

 [ reached getOption("max.print") -- omitted 33 row(s) and 10 matrix slice(s) ]
attr(,"offset_id")
 [1] "img_000000" "img_000001" "img_000002" "img_000003" "img_000004" "img_000005"
 [7] "img_000006" "img_000007" "img_000008" "img_000009" "img_000010" "img_000011"
[13] "img_000012" "img_000013" "img_000014" "img_000015" "img_000016" "img_000017"
[19] "img_000018" "img_000019" "img_000020" "img_000021" "img_000022" "img_000023"
[25] "img_000024" "img_000025" "img_000026" "img_000027" "img_000028" "img_000029"
[31] "img_000030" "img_000031" "img_000032" "img_000033" "img_000034" "img_000035"
[37] "img_000036" "img_000037" "img_000038" "img_000039" "img_000040" "img_000041"
[43] "img_000042" "img_000043" "img_000044" "img_000045" "img_000046" "img_000047"
[49] "img_000048" "img_000049" "img_000050"
attr(,"channel_id")
 [1] "1"  "2"  "3"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12"
attr(,"channel_names")
 [1] "Ch01"      "FOXO1"     "CD45RA"    "CD86"      "CD19"      "CD28"      "eFluor506"
 [8] "Ch9"       "CD3"       "Ki67"      "SSC"      
attr(,"removal")
 [1] "masked" "masked" "masked" "masked" "masked" "masked" "masked" "masked" "masked"
[10] "masked" "masked"
attr(,"class")
[1] "IFCip_features"
  1. The recursive option results in the same error for the .rif file:
    blina_big_rif = ExtractFromXIF(
    fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif",
    extract_features = T,
    extract_images = T,
    extract_offsets = T,
    extract_stats = T,
    verbose = T,
    verbosity = 2,
    display_progress = T,
    fast = T,
    recursive = T
    )
    Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Raw/Samples/20231213_blina_test_blina_6.rif, filesize:15320200390 @offset:1774340
    Entries: 34
    Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0
    Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0
    Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0
    Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:273 Typ:4 Count:1 Value:4294967304 Bytes:4 Off:0
    Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0
    Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0
    Tag:282 Typ:5 Count:1 Value:4294967305 Bytes:8 Off:1
    Tag:283 Typ:5 Count:1 Value:4294967313 Bytes:8 Off:1
    Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0
    Tag:33004 Typ:2 Count:22 Value:4294967321 Bytes:22 Off:1
    Tag:33005 Typ:2 Count:5 Value:4294967343 Bytes:5 Off:1
    Tag:33006 Typ:2 Count:12 Value:4294967348 Bytes:12 Off:1
    Tag:33012 Typ:12 Count:1 Value:4294967360 Bytes:8 Off:1
    Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0
    Tag:33027 Typ:2 Count:53741 Value:4294967368 Bytes:53741 Off:1
    Tag:33064 Typ:2 Count:1720474 Value:4295021109 Bytes:1720474 Off:1
    Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0
    Tag:33066 Typ:2 Count:11 Value:4296741583 Bytes:11 Off:1
    Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0
    Tag:33068 Typ:12 Count:1 Value:4296741594 Bytes:8 Off:1
    Tag:33069 Typ:2 Count:11 Value:4296741602 Bytes:11 Off:1
    Tag:33073 Typ:12 Count:1 Value:4296741613 Bytes:8 Off:1
    Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0
    Tag:33079 Typ:2 Count:7 Value:4296741621 Bytes:7 Off:1
    Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0
    Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0
    Tag:33085 Typ:12 Count:1 Value:4296741628 Bytes:8 Off:1
    Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0
    Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", :
    Start tag expected, '<' not found [4]
gitdemont commented 9 months ago

Sorry if I was not clear enough. Large rif files won't be correctly read and will produce same error accross many of IFC package functions and consequently IFCip that makes use of them I have to figure out how to make a fix for this

However, it seems it is OK for cif files Although, it remains the problem since you get expected numbers with:

readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction

But that you can't get features extracted with a warning with

blina_big_cif = ExtractFromXIF( fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = F )

So it seems that it try to find the offset from IFD$first$tags[["33080"]] and not IFD$first$tags[["33083"]], because none of merged or onefile is TRUE

readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33080"]]$val, 8), "double", size = 4, n = 2)

So there may be an error here and onefile should be set to TRUE I will add a commit to this

bavanesyan commented 9 months ago

Thanks, now I understand more clearly. Let me know if need more tests t be run.

gitdemont commented 9 months ago

Hi @bavanesyan ,

I did some modifications to fix the errors you reported. You should be able to install the latest IFC package version 0.2.1.110 with:

remove.packages("IFC")
# if you have Rtools and remotes package installed
remotes::install_github(repo = "gitdemont/IFC", ref = "master", dependencies = FALSE)

Could you confirm that everything is fine now with your files (rif and cif) ? Notably,

# in a fresh R session
library(IFC)
f_name = # your big file
IFD = getIFD(f_name); IFD[[1]]$tags[["33027"]]$map    # you should see "<?xml versio"
f_data = ExtractFromXIF(f_name); str(f_data$features) # features should be extracted

# edge case where offset is close to 4 bytes unsigned integer limit
f_offsets = getOffsets(f_name)
f_edge = c()
i = 1
while(max(f_offsets) > i * 2^32) { f_edge = c(f_edge, na.omit(as.numeric(gsub(".*_","",names(which(f_offsets > i * 2^32)[1]))))); i = i + 1 }
f_objects = c(0:2, sapply(f_edge, FUN = function(x) x + -1:1), length(f_offsets)/2 - 1:3)

# visual check
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "msk")
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "img")​
bavanesyan commented 9 months ago

Hi @gitdemont,

Happy New Year! Thank you a lot for fixing this issue. It really simplifies my workflow as now I don't have to use IDEAS anymore.

f_name = "../Raw/Samples/20231213_blina_test_blina_6.rif"
IFD = getIFD(f_name); IFD[[1]]$tags[["33027"]]$map    # you should see "<?xml versio"
[1] "<?xml versio"
f_data = ExtractFromXIF(f_name); str(f_data$features) # features should be extracted
f_data$features

  | Object Number<dbl> | Camera Timer<dbl> | Camera Line Number<dbl> | Raw Centroid X<dbl> |  
-- | -- | -- | -- | -- | --
0 | 0 | 12545115136 | 1575443584 | 107.76950 |  
1 | 1 | 12545117184 | 1575443840 | 94.24047 |  
2 | 2 | 12545120256 | 1575444224 | 98.85526 |  
3 | 3 | 12545127424 | 1575444864 | 47.77905 |  
4 | 4 | 12545128448 | 1575444992 | 48.00000 |  
5 | 5 | 12545128448 | 1575444992 | 67.00000 |  
6 | 6 | 12545138688 | 1575446144 | 107.48555 |  
7 | 7 | 12545141760 | 1575446400 | 32.67105 |  
8 | 8 | 12545150976 | 1575447424 | 54.50000 |  
9 | 9 | 12545152000 | 1575447424 | 106.32076 |  

1-10 of 705,341 rows | 1-5 of 172 columns</div></div>
f_offsets = getOffsets(f_name)

20231213_blina_test_blina_6.rif

  |===================================================================| 100%Offsets were extracted from XIF file with fast method.
Correct mapping between offsets and objects ids is not guaranteed.
f_edge = c()
i = 1
while(max(f_offsets) > i * 2^32) { f_edge = c(f_edge, na.omit(as.numeric(gsub(".*_","",names(which(f_offsets > i * 2^32)[1]))))); i = i + 1 }
f_objects = c(0:2, sapply(f_edge, FUN = function(x) x + -1:1), length(f_offsets)/2 - 1:3)
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "msk")
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "img")

Everything seems to work now. However, I still got the warning Correct mapping between offsets and objects ids is not guaranteed. in getOffsets(f_name). Is it something that is expected by default?

I also have several questions/suggestions unrelated to this issue. I am sorry for asking them here as it is the only way I can contact you. Will it be okay for you to share your email with me? (you can write it to my email Bogdan.Avanesyan@mdc-berlin.de if you don't want to share it here)

  1. Can raw images be extracted in a 16-bit format for further analysis?
  2. Is there a function to extract images in a stacked TIFF format? Currently, I use:
    ExtractImages_toFile(
    fileName = f_name,
    display_progress = T,
    write_to = "../Data/Images/20231213_blina_test_blina_6_rif/%o_%c.tiff"
    )

    This function extracts separate images for every channel. Also, the output differs from the IDEAS as it feels like this function extracts images for display but not the raw data. Am I doing it correctly?

My goal is to get raw images in stacked TIFF and then use them with a custom processing pipeline (ilastik/CellProfiler) as IDEAS is extremely slow with big files.

  1. Is there any possibility of applying custom compensation matrices to the pictures in .rif files?

Best regards, Bogdan

gitdemont commented 9 months ago

HNY ! Thanks a lot for rising this issue and for all the tests you carried on your side ! It was really helpful to improve IFC package. (Sorry I did not catch it before)

As it seems the issue has been fixed, I will close it. I will however try to answer some of your other questions before. Please feel free to open other issues.

concerning the message about offsets Correct mapping between offsets and objects ids is not guaranteed is normal behaviour. You may take a look at fast = FALSE in getOffsets or in functions calling it e.g. ExtractImages_, ExtractMasks_ functions when offsets are not provided.

See https://github.com/gitdemont/IFC/blob/8d064ff8d5f3bb990833d8bf87da3753c4b16a52/R/getOffsets.R#L38 https://github.com/gitdemont/IFC/blob/8d064ff8d5f3bb990833d8bf87da3753c4b16a52/R/getOffsets.R#L87

for the listed questions .1, yes

library(IFC)
f = system.file(package = "IFCdata", "extdata", "example.rif")
param = objectParam(fileName = f, mode = "raw", force_width = FALSE, size = c(0,0)) # play with objectParam arguments
vals = ExtractImages_toMatrix(objects = 0:4, param = param) # See also objectExtract

.2, no there is no function to do this ExtractImages_toFile internally uses objectWrite to pass values extracted by objectExtract to tiff::writeTIFF (ExtractImages_toMatrix does basically the same except that it does not write to files) So you may write custom variations around those to achieve what you need.

.3, this is definitely something that would be nice to have in IFC package and I would be happy to review a PR AFAIK, the process for compensating rif files is described here I wrote some experimental functions in IFCshiny but it was for global intensities and not at pixel level.

gitdemont commented 4 months ago

Hi @bavanesyan , Update: You should be able to easily export stacked TIFF file with new IFC package version >= 0.2.1.600