From 66634cfba063edcc742a81efd9da368e177fd567 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Wed, 19 Oct 2022 19:32:09 +0530 Subject: [PATCH 1/5] Changed dependency of GMLImage to external framework MLImage --- tensorflow_lite_support/ios/BUILD | 23 ++++- .../TensorFlowLiteTaskVision.podspec.template | 3 +- tensorflow_lite_support/ios/ios.bzl | 4 +- tensorflow_lite_support/ios/task/core/BUILD | 2 +- tensorflow_lite_support/ios/task/vision/BUILD | 12 ++- .../task/vision/sources/TFLImageClassifier.h | 2 +- .../task/vision/sources/TFLImageSearcher.h | 2 +- .../task/vision/sources/TFLImageSegmenter.h | 2 +- .../task/vision/sources/TFLObjectDetector.h | 2 +- .../ios/task/vision/utils/BUILD | 6 +- .../vision/utils/sources/GMLImage+CppUtils.h | 2 +- .../vision/utils/sources/GMLImage+Utils.h | 2 +- .../ios/third_party_frameworks/BUILD | 10 ++ .../MLImage.framework/Headers/GMLImage.h | 96 ++++++++++++++++++ .../MLImage.framework/Headers/MLImage.h | 1 + .../MLImage.framework/MLImage | Bin 0 -> 87600 bytes .../Modules/module.modulemap | 9 ++ 17 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 tensorflow_lite_support/ios/third_party_frameworks/BUILD create mode 100755 tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/GMLImage.h create mode 100755 tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/MLImage.h create mode 100755 tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/MLImage create mode 100755 tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Modules/module.modulemap diff --git a/tensorflow_lite_support/ios/BUILD b/tensorflow_lite_support/ios/BUILD index cf68522d8..a78c0df7b 100644 --- a/tensorflow_lite_support/ios/BUILD +++ b/tensorflow_lite_support/ios/BUILD @@ -44,15 +44,19 @@ strip_api_include_path_prefix( "//tensorflow_lite_support/ios/task/text/qa:Sources/TFLBertQuestionAnswerer.h", "//tensorflow_lite_support/ios/task/vision:sources/TFLImageClassifier.h", "//tensorflow_lite_support/ios/task/vision:sources/TFLObjectDetector.h", - "//tensorflow_lite_support/ios/task/vision:sources/TFLImageSegmenter.h", + "//tensorflow_lite_support/ios/task/vision:sources/TFLImageSegmenter.h", + "//tensorflow_lite_support/ios/task/vision:sources/TFLImageSearcher.h", "//tensorflow_lite_support/ios:sources/TFLCommon.h", "//tensorflow_lite_support/ios/task/core:sources/TFLBaseOptions.h", + "//tensorflow_lite_support/ios/task/core:sources/TFLExternalFile.h", + "//tensorflow_lite_support/ios/task/processor:sources/TFLEmbeddingOptions.h", + "//tensorflow_lite_support/ios/task/processor:sources/TFLSearchOptions.h", "//tensorflow_lite_support/ios/task/processor:sources/TFLClassificationOptions.h", "//tensorflow_lite_support/ios/task/processor:sources/TFLCategory.h", "//tensorflow_lite_support/ios/task/processor:sources/TFLClassificationResult.h", "//tensorflow_lite_support/ios/task/processor:sources/TFLDetectionResult.h", - "//tensorflow_lite_support/ios/task/processor:sources/TFLSegmentationResult.h", - "//tensorflow_lite_support/odml/ios/image:apis/GMLImage.h", + "//tensorflow_lite_support/ios/task/processor:sources/TFLSegmentationResult.h", + "//tensorflow_lite_support/ios/task/processor:sources/TFLSearchResult.h", "//tensorflow_lite_support/ios/task/audio/core:sources/TFLAudioFormat.h", "//tensorflow_lite_support/ios/task/audio/core:sources/TFLFloatBuffer.h", "//tensorflow_lite_support/ios/task/audio/core/audio_record:sources/TFLAudioRecord.h", @@ -153,6 +157,10 @@ objc_library( hdrs = [ "sources/TFLCommonCppUtils.h", ], + copts = [ + "-ObjC++", + "-std=c++17", + ], module_name = "TFLCommonCppUtils", deps = [ ":TFLCommon", @@ -168,8 +176,10 @@ objc_library( ios_static_framework( name = "TensorFlowLiteTaskVision_framework", hdrs = [ - ":GMLImage.h", ":TFLBaseOptions.h", + ":TFLExternalFile.h", + ":TFLSearchOptions.h", + ":TFLEmbeddingOptions.h", ":TFLCategory.h", ":TFLClassificationOptions.h", ":TFLClassificationResult.h", @@ -177,8 +187,11 @@ ios_static_framework( ":TFLDetectionResult.h", ":TFLImageClassifier.h", ":TFLImageSegmenter.h", + ":TFLImageSearcher.h", ":TFLObjectDetector.h", ":TFLSegmentationResult.h", + ":TFLSearchResult.h" + ], bundle_name = "TensorFlowLiteTaskVision", minimum_os_version = TFL_TASK_MINIMUM_OS_VERSION, @@ -186,6 +199,7 @@ ios_static_framework( "//tensorflow_lite_support/ios/task/vision:TFLImageClassifier", "//tensorflow_lite_support/ios/task/vision:TFLImageSegmenter", "//tensorflow_lite_support/ios/task/vision:TFLObjectDetector", + "//tensorflow_lite_support/ios/task/vision:TFLImageSearcher", ], ) @@ -213,6 +227,7 @@ ios_static_framework( ":TFLAudioRecord.h", ":TFLAudioTensor.h", ":TFLBaseOptions.h", + ":TFLExternalFile.h", ":TFLCategory.h", ":TFLClassificationOptions.h", ":TFLClassificationResult.h", diff --git a/tensorflow_lite_support/ios/TensorFlowLiteTaskVision.podspec.template b/tensorflow_lite_support/ios/TensorFlowLiteTaskVision.podspec.template index e229b92b8..95f85e59c 100644 --- a/tensorflow_lite_support/ios/TensorFlowLiteTaskVision.podspec.template +++ b/tensorflow_lite_support/ios/TensorFlowLiteTaskVision.podspec.template @@ -18,4 +18,5 @@ Pod::Spec.new do |s| s.library = 'c++' s.frameworks = 'CoreMedia', 'Accelerate' s.vendored_frameworks = 'Frameworks/TensorFlowLiteTaskVision.framework' -end \ No newline at end of file + s.dependency 'MLImage', '~> 1.0.0-beta3' +end diff --git a/tensorflow_lite_support/ios/ios.bzl b/tensorflow_lite_support/ios/ios.bzl index d328ba254..a9ed9ed2a 100644 --- a/tensorflow_lite_support/ios/ios.bzl +++ b/tensorflow_lite_support/ios/ios.bzl @@ -25,7 +25,6 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): # can be split at '/' to get the header file name. if "/" in hdr_filename: hdr_filename = hdr_filename.split("/")[-1] - hdr_basename = hdr_filename.split(".")[0] native.genrule( name = "{}_{}".format(name, hdr_basename), @@ -37,3 +36,6 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): > "$@" """.format(prefix, hdr_label), ) + + # sed 's|#\\(import\\) ".*/\\(GMLImage\\.h\\)"|#\\1 |'; t; 's|#\\([a-z]*\\) ".*/\\([^/]\\{{1,\\}}\\.h\\)"|#\\1 "{}\\2"|'\ + diff --git a/tensorflow_lite_support/ios/task/core/BUILD b/tensorflow_lite_support/ios/task/core/BUILD index d047db93d..1109e5589 100644 --- a/tensorflow_lite_support/ios/task/core/BUILD +++ b/tensorflow_lite_support/ios/task/core/BUILD @@ -51,7 +51,7 @@ objc_library( hdrs = [ "sources/TFLBaseOptions+CppHelpers.h", ], - module_name = "TFLBaseOptionsHelpers", + module_name = "TFLBaseOptionsCppHelpers", deps = [ "//tensorflow_lite_support/cc/task/core/proto:base_options_proto_inc", "//tensorflow_lite_support/ios/task/core:TFLBaseOptions", diff --git a/tensorflow_lite_support/ios/task/vision/BUILD b/tensorflow_lite_support/ios/task/vision/BUILD index 52ce3b026..fddfbd0c9 100644 --- a/tensorflow_lite_support/ios/task/vision/BUILD +++ b/tensorflow_lite_support/ios/task/vision/BUILD @@ -23,7 +23,7 @@ objc_library( "//tensorflow_lite_support/ios/task/processor:TFLClassificationResult", "//tensorflow_lite_support/ios/task/processor:TFLClassificationResultHelpers", "//tensorflow_lite_support/ios/task/vision/utils:GMLImageUtils", - "//tensorflow_lite_support/odml/ios/image:MLImage", + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", ], ) @@ -46,8 +46,8 @@ objc_library( "//tensorflow_lite_support/ios/task/processor:TFLClassificationOptionsHelpers", "//tensorflow_lite_support/ios/task/processor:TFLDetectionResult", "//tensorflow_lite_support/ios/task/processor:TFLDetectionResultHelpers", - "//tensorflow_lite_support/ios/task/vision/utils:GMLImageUtils", - "//tensorflow_lite_support/odml/ios/image:MLImage", + "//tensorflow_lite_support/ios/task/vision/utils:GMLImageUtils", + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", ], ) @@ -69,7 +69,7 @@ objc_library( "//tensorflow_lite_support/ios/task/processor:TFLSegmentationResult", "//tensorflow_lite_support/ios/task/processor:TFLSegmentationResultHelpers", "//tensorflow_lite_support/ios/task/vision/utils:GMLImageUtils", - "//tensorflow_lite_support/odml/ios/image:MLImage", + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", ], ) @@ -95,5 +95,7 @@ objc_library( "//tensorflow_lite_support/ios/task/processor:TFLSearchOptionsHelpers", "//tensorflow_lite_support/ios/task/processor:TFLSearchResultHelpers", "//tensorflow_lite_support/ios/task/vision/utils:GMLImageCppUtils", - ], + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", + ], + ) diff --git a/tensorflow_lite_support/ios/task/vision/sources/TFLImageClassifier.h b/tensorflow_lite_support/ios/task/vision/sources/TFLImageClassifier.h index f22803414..3c3023b6d 100644 --- a/tensorflow_lite_support/ios/task/vision/sources/TFLImageClassifier.h +++ b/tensorflow_lite_support/ios/task/vision/sources/TFLImageClassifier.h @@ -17,7 +17,7 @@ #import "tensorflow_lite_support/ios/task/core/sources/TFLBaseOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLClassificationOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLClassificationResult.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/vision/sources/TFLImageSearcher.h b/tensorflow_lite_support/ios/task/vision/sources/TFLImageSearcher.h index 667ea674f..583d141e7 100644 --- a/tensorflow_lite_support/ios/task/vision/sources/TFLImageSearcher.h +++ b/tensorflow_lite_support/ios/task/vision/sources/TFLImageSearcher.h @@ -18,7 +18,7 @@ #import "tensorflow_lite_support/ios/task/processor/sources/TFLEmbeddingOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLSearchOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLSearchResult.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/vision/sources/TFLImageSegmenter.h b/tensorflow_lite_support/ios/task/vision/sources/TFLImageSegmenter.h index 7b556dcd3..1302c1221 100644 --- a/tensorflow_lite_support/ios/task/vision/sources/TFLImageSegmenter.h +++ b/tensorflow_lite_support/ios/task/vision/sources/TFLImageSegmenter.h @@ -15,7 +15,7 @@ #import #import "tensorflow_lite_support/ios/task/core/sources/TFLBaseOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLSegmentationResult.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/vision/sources/TFLObjectDetector.h b/tensorflow_lite_support/ios/task/vision/sources/TFLObjectDetector.h index 5e3a0e718..32d7e4bf6 100644 --- a/tensorflow_lite_support/ios/task/vision/sources/TFLObjectDetector.h +++ b/tensorflow_lite_support/ios/task/vision/sources/TFLObjectDetector.h @@ -16,7 +16,7 @@ #import "tensorflow_lite_support/ios/task/core/sources/TFLBaseOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLClassificationOptions.h" #import "tensorflow_lite_support/ios/task/processor/sources/TFLDetectionResult.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/vision/utils/BUILD b/tensorflow_lite_support/ios/task/vision/utils/BUILD index ccb6c4537..39f2bf0fc 100644 --- a/tensorflow_lite_support/ios/task/vision/utils/BUILD +++ b/tensorflow_lite_support/ios/task/vision/utils/BUILD @@ -22,8 +22,8 @@ objc_library( deps = [ "//tensorflow_lite_support/c/task/vision/core:frame_buffer", "//tensorflow_lite_support/ios:TFLCommonUtils", - "//tensorflow_lite_support/odml/ios/image:MLImage", - ], + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", + ], ) objc_library( @@ -41,7 +41,7 @@ objc_library( "//tensorflow_lite_support/cc/task/vision/core:frame_buffer", "//tensorflow_lite_support/cc/task/vision/utils:frame_buffer_common_utils", "//tensorflow_lite_support/ios:TFLCommonCppUtils", - "//tensorflow_lite_support/odml/ios/image:MLImage", + "//tensorflow_lite_support/ios/third_party_frameworks:MLImage", "@com_google_absl//absl/strings:str_format", ], ) diff --git a/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+CppUtils.h b/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+CppUtils.h index f5b38903a..ce02dd9bc 100644 --- a/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+CppUtils.h +++ b/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+CppUtils.h @@ -16,7 +16,7 @@ #include "tensorflow_lite_support/cc/task/vision/core/frame_buffer.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+Utils.h b/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+Utils.h index b76870914..a292d1b56 100644 --- a/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+Utils.h +++ b/tensorflow_lite_support/ios/task/vision/utils/sources/GMLImage+Utils.h @@ -16,7 +16,7 @@ #include "tensorflow_lite_support/c/task/vision/core/frame_buffer.h" -#import "tensorflow_lite_support/odml/ios/image/apis/GMLImage.h" +#import NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/third_party_frameworks/BUILD b/tensorflow_lite_support/ios/third_party_frameworks/BUILD new file mode 100644 index 000000000..215b548e8 --- /dev/null +++ b/tensorflow_lite_support/ios/third_party_frameworks/BUILD @@ -0,0 +1,10 @@ +package( + default_visibility = ["//tensorflow_lite_support:internal"], + licenses = ["notice"], # Apache 2.0 +) +load("@build_bazel_rules_apple//apple:apple.bzl", "apple_static_framework_import") + +apple_static_framework_import( + name = "MLImage", + framework_imports = glob(["MLImage.framework/**"]), +) diff --git a/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/GMLImage.h b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/GMLImage.h new file mode 100755 index 000000000..110186bb6 --- /dev/null +++ b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/GMLImage.h @@ -0,0 +1,96 @@ +// Copyright 2021 Google LLC. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Types of image sources. */ +typedef NSInteger GMLImageSourceType NS_TYPED_ENUM NS_SWIFT_NAME(MLImageSourceType); +/** Image source is a `UIImage`. */ +static const GMLImageSourceType GMLImageSourceTypeImage = 0; +/** Image source is a `CVPixelBuffer`. */ +static const GMLImageSourceType GMLImageSourceTypePixelBuffer = 1; +/** Image source is a `CMSampleBuffer`. */ +static const GMLImageSourceType GMLImageSourceTypeSampleBuffer = 2; + +/** An image used in on-device machine learning. */ +NS_SWIFT_NAME(MLImage) +@interface GMLImage : NSObject + +/** Width of the image in pixels. */ +@property(nonatomic, readonly) CGFloat width; + +/** Height of the image in pixels. */ +@property(nonatomic, readonly) CGFloat height; + +/** + * The display orientation of the image. If `imageSourceType` is `.image`, the default value is + * `image.imageOrientation`; otherwise the default value is `.up`. + */ +@property(nonatomic) UIImageOrientation orientation; + +/** The type of the image source. */ +@property(nonatomic, readonly) GMLImageSourceType imageSourceType; + +/** The source image. `nil` if `imageSourceType` is not `.image`. */ +@property(nonatomic, readonly, nullable) UIImage *image; + +/** The source pixel buffer. `nil` if `imageSourceType` is not `.pixelBuffer`. */ +@property(nonatomic, readonly, nullable) CVPixelBufferRef pixelBuffer; + +/** The source sample buffer. `nil` if `imageSourceType` is not `.sampleBuffer`. */ +@property(nonatomic, readonly, nullable) CMSampleBufferRef sampleBuffer; + +/** + * Initializes an `MLImage` object with the given image. + * + * @param image The image to use as the source. Its `CGImage` property must not be `NULL`. + * @return A new `MLImage` instance with the given image as the source. `nil` if the given `image` + * is `nil` or invalid. + */ +- (nullable instancetype)initWithImage:(UIImage *)image NS_DESIGNATED_INITIALIZER; + +/** + * Initializes an `MLImage` object with the given pixel buffer. + * + * @param pixelBuffer The pixel buffer to use as the source. It will be retained by the new + * `MLImage` instance for the duration of its lifecycle. + * @return A new `MLImage` instance with the given pixel buffer as the source. `nil` if the given + * pixel buffer is `nil` or invalid. + */ +- (nullable instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer + NS_DESIGNATED_INITIALIZER; + +/** + * Initializes an `MLImage` object with the given sample buffer. + * + * @param sampleBuffer The sample buffer to use as the source. It will be retained by the new + * `MLImage` instance for the duration of its lifecycle. The sample buffer must be based on a + * pixel buffer (not compressed data). In practice, it should be the video output of the camera + * on an iOS device, not other arbitrary types of `CMSampleBuffer`s. + * @return A new `MLImage` instance with the given sample buffer as the source. `nil` if the given + * sample buffer is `nil` or invalid. + */ +- (nullable instancetype)initWithSampleBuffer:(CMSampleBufferRef)sampleBuffer + NS_DESIGNATED_INITIALIZER; + +/** Unavailable. */ +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/MLImage.h b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/MLImage.h new file mode 100755 index 000000000..9d59ff077 --- /dev/null +++ b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Headers/MLImage.h @@ -0,0 +1 @@ +#import "GMLImage.h" diff --git a/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/MLImage b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/MLImage new file mode 100755 index 0000000000000000000000000000000000000000..2b045b5079a79e431cf424c2af4c19f48e671a3d GIT binary patch literal 87600 zcmeFae_T{m{y%<)8D<6?W=6#v6>#uZWP-yF5d>|9@dp+rDw+9XXNDgN1&V-(rZvN$ zgNZGc>yo(}lohqLQM#Mkw%Y(^q*P>9uDULinWiPFmD?{r&)2=@!Z0&feczw`zeesfq=QjoW@%vM&g zYGr@f6c<$F6{f9OzC5p_Kax^gQE_43^=Z}?G8ug48JG}_jBpT2oY{ZBZjHdpr4$jv!MMe z%2)u7#ga8+5#7jM7u}O|5kD$R=QxfVL4b_2lOtXh%Zi*FOI}4zUU8YF%$DuVFN5(B zvs8f@6>}vS#Jlf|a=_-*nHsuQGl{R?hw4M{U}M`VJBZ`?R9P zl9z8;USca^1@x9*(kLO(S;p_`7=hoSC_zsKa9qAXA^aZ;N6UNB>WUCv*7UHjf_^02 z%<*_ypae+AW%6`_ZjgQuHV{8G!+(i$NBWjeOm~_VF33#Zbj|d4Ds6^l#y5Xe!jqnS zDqS<{RK~WAof%uMrEfWvvE|ZPV!p{;rsh5A@D0A!alSKs>x|BH=KAHFCINV*2r$W8LRJ z7g^TUX7(oWlfVz;!-Hs0_cHmib5yQntpo^uK5EMcy#ar|bdi9&_UKrN?nbpsA~gqW zl1OLZ*1P8hr$p+IP%psUzY+gP=Sj%d9vvc4$pQyRf`U12aA25(>B+T62TGJ8e*aI? zpK=eS=I283dlmNIVB4RJ~TGK-Txoyf9L-ppF)%rIjaoJV6@loSzV>dJ{-L5~_2EJSL z97p4ixKY(X`rJ*j!K3$7;orwq4Yi?zGHPlDR2|6B9%v4eq;Y|zvii);R$aAD66K7Q zm9-DFn<59C`s!)Eep3{mrQz(&V#_i2bc89nvXnttls4Cw54Kxl6$VRjsqE11s$Z z;&jc%+{ha1)wT&$169(7Qkmo#spO{G3`wrhTBV1K=iw$+p(7b_W!%+kxFnhOpboo1 zf3Pe3v?=0{E$pl#{8B^6>8|k4n#0=~!rB@_+9Ja*M3VowHR2;v#My?Bc1gtX`tTM< zM2E!SDz>`TMJeohS6Q8_SgRt!DvkhUVB}AjJTU{j(T)woT)>Wb-Rwen;QoE~MsVM19empY#WJAcYhOoE6 zup#6^L)bw_#3@t6@y>`Nj-K z5Z>7kayByTfFt~nErKgWF_5W{yx3J-e7)q>h$CHLCwbvqK^3~f&-j-~v1@I z*siERk&=81bH)+TVhj5K0x?CLa`5s;Lo|dOXozTU4m*UZAurR&LlU>t4yo3Jx5K3+&MjJak?w)kR#%_JM2(o*x7~%;AbR@oU7fgq$X)1c@(Ku=Olw-L!DwB zJo&D2w*vS&rJ~Hhdr)`aXo4t3GV{2Y2T^rkBHiG2rf}8kAsMBj6s>GfROCC+K@yPrGG)h24EbKTAI$F=r6 z>6<#z$6L6;vFeL@&81BB$41SCT1}B&b1_r%g;D*9QC(zIpR;Pt!QUajtkqmHYKpAt z?hg6qTJ;sX+MZk`O=&kLbF$<;t*KScq$YFnKFQQ7^OPp@h#E5_k;xrd))n6DjpXfD4qTysIJ6coQ%_H2-)E%u!V70?MqE4E+&zw}-o4iYX zu|s~YQ+>wZzYJ9=ubM~fHz)0HP2J~6cAG~aIqq8S3~qIU<`Yi)MYp=hpgC8p{vuO- zx@%lyN`a?VNvG8D9>^bf zJBsZLW1d##K~y`KNTzi*hjY`XLNZm(WF}ivN|khKeXn@uY0yR}^F^!r3S@%L5#{L- zNKx&g7Q3`Y*CFzQL)8Tg|*10NbapU;y z5YWG!5&8kXLpb6HKW-&`MwivwEtKLe&ZkbPqQX^HtXLnVSjQ2KM33(1j4k3gM>pL; zu!8=(!#W$#J%;rr|2dtKJG`a&dOeAAUAn8Z*j1u;C3d(*Spr%x)Qan^#sfT<=0hS5l|2f^6hRZuK$V(`^s=z#Z0Yi#Y8F`Jg`h zxMU=7NV}ssj68TK0Jl=7aT=7o=ZxS%l#Q5lOEh0_dOVDfs-4L;p zC+bpKPckX5pgv#hlPsid&sdA#*>_7SCTJ@)$ zeD{kE1l`N^db|!Nx`I@4b5WRY> z8a*Kw!O5mpIa7C=lRMCLOH+?Z4fIg>M6cjXsDIM`WJ=j5oko3;IjP<$_D*7F)kfVKdV9WWf(IQJ-(R7lJ1H?9CCMb! z;W^^B5B~~1Im+CvKEwB!7rLoDJ&&Og59BJ3=#SZ>NcV2x)LO|Ad3KOJ&w0uqAcG8& z;ad5Dq*tA(ZRTVQ@tVxj_Bm2tHBa3yMgNS4SMna`)IIQO4FJDjN;(QsN)3A8C11uX(r=y>U=N(0lL z`y5m8Wb9~7X)}*FX`WI`T{lMeKkJ#;Xr8(cii+nl|A6**BJ;_= z(5k<H+P=!~o_jomG@QCl`G`NpG^%*1_NX2uorgaJgf}wN=FMl+| zK1b3~XEItGRYP89F`TIId@>r;-I*FUH5ndoo?40|c!V7V-kQqYV^CkkP}nUek6lsN zBtK)>^ZePEH-uomG`PxGXHZR#jWmpty-_6@_)w4|F48zo`9_?{_)w4}-ju&P zs6{$Q`FK!sd}RJO*^w%1z~E^c+|rb*fhqOQM5Us_&d(7rBdT+y6ibuvM~@pw1*cfARbV<*)TyqhSFE-w@VF`wVhsaU>lGFC zSM1uzpxn0fAgyt9)tk?Rcf4DW{O!G+FuW! ze&Meh?%(u}b9?`q@#8Cp*M3-$!BtDS%~{$R!UR@{3XkM!C5Antq!+jVBZ9)Ems-GTckQi1qU4l@U3Qf{@;4I~X|*)VwhQ1e&OCm-dyJkBVLpZ{4mnPU zwHf*MEdrFwsh+tnyT#7)hV*f@ak}|$zW%r{FBdYQf_*mNJQrX@ym0AJut_6^C}>*m zQLx~t2j~?)-r4X)(eT`!NgpFO5*RVa4Yys%Qkn~!C8D^Mm7C+ zyRJ^c8G}6K_H4(C9jFvu5D+b5Al~;s&&uUEdaxfsF^!T7?n3Fd>OorA1&!hr!cwLm*G) z9MLXL=i4i4Fpj)esetMiV?bFfrBRFCHLQK0`a&(eBv@(CU})Z*sgBnkpn24>$nX|h z#B#%ylvkb9VWAsEH$-!u?odpj@6A_CrV*-QvYjT1#a7&Ait?+0V7u1tvS7fcdXJ|4-Uz0?AK_GGP`c3_IfWQQ;?>X*78x zGVG)y;$$byoIjI9EZ5D$RE@gz_RKM?B39Sh3PnZTyo@Wg8j?W7-Td4*GW=9?_BszAmQUzu zH@f+VDdKe3&|_WUr%-_OVJS_{sr#HGs#=q3FcfG_-QS#yr@~QbYJ2)V{w;=LHI0}R z+&VqS#iIR7BGUEdYSplylDKsJXh+TV?e9*n*GA>0#>S;RSR467y7onG>qDaFM7b4r zBxloe+%0ei%Wj`QJq5l0O9(xnGzMkH1sEOAbJj;AJK_V37sHzQ7n1PN_ zH}gbdCdc%j&l2%q{My<3e4-}i-_T~xZIN50V zbZMoP`%81Nxe16gP4=EntsLd(QeKt^hRIA#?SrBOpS#D`0pDo(>qw`6)AXC>KaG~p zfZzU>$uK9tp+6F~I86EQ^tr~Fs+vGqb7!@*@E_KCsk$yLwl*grlAAfW%6h=P$f#AR zrySeewV5+J@7la6Xr?MyDQmVr;dFee3aFIW^c+X;mj}zH^D-d0gw}A}dwP^E%~&gm zZ66U@%*pJAU0M!>8H~cnml(E5?D|ovw-Yl5Mo9t+4XZNU5-oQyKaH!=h0aq}NzP;QEHxcd_0&$7)J#+3QXif_z~dr9sgJO z(R+H4{v6|92CRoa=mVre`WoPaMfwD!W%y%W_;}zD755T;Bsr0PB5=z0Z}|1(i}KF_ zPT}|Pqk4<9=tchya4N@K;G*0p-_yWH1J42OSsog(5#LR~#qtwj%e90ET-5{ zkW{>?w4lOLlvgCI!mzBUsIU~{3At(|fU%wikypllAJ4a~%q`3-DaUu( z3Y(A}mL{+d%6Rx%7T@k!6m#s1axZ8)L40a{JxAYy<*m%+izN{7>mSyv%&REQ%PGSL zdO!7=-)CuvkSsfIMZroeo+!)77XWbW3Hn)BK{ZV7S!RLq`mXr!hk0eaIM;WP$?}rC zJS=qajqsP&d##Ay6*7K7A8uG#v|x*zWV1+*+|Ad>yW$) z;7`-ASOGftbCgh^@zxtk>bp?OKk8c^KZ=N?eY-2ZPm3-qDS%FLKcS#pbY4+GS@f#x zySeDxf>K*H)R+`4y4Y4)npet2qhmu?6nO|LuauCXt%N zu(e@B& z*~OXE+RXvx5PlGhc%qw*-@}ZKl@pTmr7Hy88b-(J>z8f^=obGBey@Tq^=HtX23^EY zOR_#QgO`NjQ5k|-Q63m7@pY{`Dab?AE9HCt6acZlGo67C%6=^+`YikcSTxCr zF6BF3^a9KgeHDIE7ENP4x|A>XPrncGXIOc9_&?^KeiqskZ5BO+xdym+cN0C1xx<(n z0vB(YqJIQ$j8md7!Nu4(`g6D#mqvdKR|WStT#QwsJK$p68~p}cjK88=;1b;{a4G#C z;Zpi%7*69=qNg^7PDTG3F7cr?HCW#ky#_AoK6NErjGv~ifQ#{F^isGOS4B^O8wxiT zZUkJCG3e${{mIp%{P>g8KXN;Plj~+~J#+2Mt$>T6n!Fe;bU;^x&K8CB7 z;Vqn=5Ax%2jl|B6vkBRZABDyKfyUDm7W;$CEMDxtY%DDHSCbjN*gvgcVX?n_htZ4u zVpB>=lO2^obwm6;6bFJkxLV;{UW) zc%&EoD_-%$i+x8RhYSpIHW1D2zD8^{p1m9m0y#`FW*lu$+`d=M`mR0dih$Owp>`HHBDvP2)E) z6R%MzVDGWiEVJ2Tb#Gx_0_Tmy`yjEz-gn~XLq~ns&)ugWuCtCeOfn?t>9PikE7oZZ zwZHY#?m%Rq7w#aM*QQgrpQ}Dci0EWAVwm22(vSL8x_<8Z>8}>8|69xWSQ&jW9-8QOdoJpiJTHp{W7!-`z{~QXnAFgH*LQa_ ze#6m!(A5Eco)?3AAjYpWudpO6D-kwdKu<%^;5ora$5;cjYa3|QHmrcV?9 z)c%5E;Wp$9ELA23yq@g~J7R^$CQ`cS$*GV!B} z<~H;r)ui+ocmLvxmeAAw0@EF)tOe=L3%c|z-=%N)@EW~yrB(lD$(_CBU^?3zu;mRF zwaKli`ZLjN+vrZ;GBSND3P&ksDH$oBG9B9sum|D(^f%0UK3-sxu{D}P8C$+FU3))$ ziy688E8Y1%NysVGh(mxvNK&f3IhDk*m4z{By>wmOHIp!jS{?g7Ls7J>6?yds-8dr z(zm>qz75+cwj`x*D_XZ?>J|Oml7(RvyX|d}=*fznp zG~dqJ*;`O)YHGerRcOr@dEtI4v>P>VJpgL@Z5uoKZ()d&T9|5Dj6$KNvve6-1TJ&7 ztVlxHc#b_aUCgSG?NNnU)P#M>=*2nJG{ut)HN7U*3=MgZ8uDuhNx(9;bPKgz+S_w0`kvUR z9-pDdm&ANf`q;09Z7Yy=?}b{k%V5S+dWIMhT*Bz;#i2Irx<0*mmarMIU}ZrW$M>#t zJ$47u$9S$3qt`qxH;*4?b3}M&L0LYZY)Vfsvv}qAFk9#?J!k2| zT;P_KJ7NBW+b1k!%o*<<)K8tVR`c|pxqD|05`n3Agizls8A7}0#ncKnKe=@fUdQS2);zw5lo5%c8 zJvYWB7!6aBjF|p1Z{M!N6ZhXofTBD$k(h9~%w5gga)CL595UcZyty;5Kh^?UZZ+52 z>2ZBoAm~4_AQw@`#6dpY*L3Om|GoW$frZ6+77KEo`!YK)$3a{7w=Z+!d;8{oSAOwd zS3LJ+o`=5ttbLh!VPB?fptvuy@;du6D?RsRwzZ+KTlBC%0XJ@xGML|&IfnLSj$!*U zYq2j=Hb-0cdYI%PB^PSs5{!{I&R#G*=;3QArcvJq=)(@^Bu06jPN&n$Zmk>5IUn6~ z)8kcdUi+PX;C-9x)GLgwZnrVOuzT#Bfnzg%ycU0;EUEQ1{gEqk^A|13*SnGfGV5zf zg(Q!)t@|-3NGc7|uYNdT#ty^3uMJLqN2IOOKk%?f_DERsT|Wj*l1c|^a19wSKqeiM zyPX^QbZ^1tp3Zo%bHcUC^udGl2IWU#1rJ2oF5SN;;PLy@HXU@kThamwPmbY>^y@6+ zm5J2}KMWpz!wpG|ACD0zZIUtPe!cttv_mZ|EpE5D>J4My#*?G@1QRFN$NVsOd~mQj z)YzyWz~zq_%{7h*;m(d3%thhu%^y3GYaBb2J3IDfE^1sXmp?9=YaBO&J3CIpMcp`z z%fB&_YrJs;clO3xxTvUbE>^s6vW+q=mu{6A!$(j zgbCBPXUSFCJJcby??c>+a%5b=kZk=u)~)*=Fc^%#T0`P*V)7x$Z&_chge1o-bU9v> zj2a<{s{9A{yJbR!ua#b$IV5o4wt?J^h1HJdB$F23T)AubpN2@%ww+q}@Ke=;#{Fv@ zS3N4};lR2Tk%`YnRp-}m_50IQxgl-uE*;37Zv3P2?vk=Q<$Ir#9J;ykk>Q_*NOm+# zyvP3iA#VF5qkWU%@Nm1nIj%4-L~9#%^d)&)ld9w{Y1JZme5GW5m@?h5Noem+joT%v z>>5u0MqH{|r9B;HG6Wj$f+mfqKNM$FsXE3M4QqJe1=TL8bl+W@|L%}{w&(9QnPgPv z{Lz1jtJ@Z$y@}sj`!5VkM^v!AwRK#GQd${y#D-O`*svOQ+#b;q8IGN+2eF#h5q_p; zW2D`nSf_N+)>*r2Eq035V~3SOPc&R5ZBNDiQfv@CWFuDCJxlvK5`g|wtf1~ZMot&OFzUr|AH|%=5Ro67S%CTt{drkSRydHaZDfxeV zi(0*6T_bkkRs4dCA1~XRf1)}jli)R`2%ZMccl6PZ8HnQ?lSB#YnO~XV~T+1ctdzMzagzf z65cNEOk*3>Otc$~cC7K+(%`|SHQKAjjqL7JW1AedsG({2J#xsjm|gBq#Bsn;k=(p}i3y&4??_MabGe z4|UOA+2d}0eLlZ;{fo%(HZl!hm)dCqyc63TO0Tz7^=L!Hadc?t8~IMsqgUkj&#zU| z9fVz-zPru&ovv7${x)tsN7!-WNL1mJjqW4t?f2Rv%G(8i3eg56>Mcvfz3X=DCLr4c z|Icm3SE55(i>A>jDjF4?VTT|D?5(iTCj66l;=p`>f2#zIe1l?hgh4?&qOsKiePfS( zgkx5{q=|c9zIV2uSKo7XsWD)jQQE?tmD<(+RjvQ3*8gYKGDb<73cDZqgnx1gO7&m6 zA?W(NZK?EYHw3%-KZBKx>!ylz?*ScD=5>lS8*uWbH zDK;ufMROr!Mx+j-9kMe*9?dOZup5Fc`n=&1Y>0#Ll+%&n2POZ* zjs3FAq)Jjlk$xAK#J{_b& zXmvT2h6Jwvy{W1G_oiBdd-kSw>lJG`wgl%8>6n4}W zc3%S?b`c%T;Vt9|IcST3R^VCuHny{2n-&R{tnDo9XrB0ez)e*F(NzH>zHh;CP~U3ejhlt5Pl!fyDhw3Isyhqz7N2*b8O_A$nRL3;%*-HUPfVTg^rx09FWvj&&PV@o@w?yt?y29tc6mzJk2~M9tSWi*hg)C!^o6pN4Kc5s zx%kS4rN4je!8yxc3ZM4dWuJ!+G6Xtjk1_F|$&Ci+z)d5nI&?}2XUDD~Ye3ulfrGMS z#pUS@^+Q@}wZiMfX4!?>@`m9~$Bc*cM91mt?BRn_3!VDm(n$V8t~SH1E*Sf4oNnou zpaA}jUS-g+NXP4m$|qvAm=ohQA2Ip*@!`&fK1>P=oyI;)ral|5%k9IYEm8TTCzJ9$ z!J8jWujCghqQvFt#VsL~1*$6kEh4IvdqcGW@5`E&=tqx%V}5C9RLJIGv$0(a1>qBn zdv9aF11fs=h%^RCSa_Q<=;nZ=)8UOuyzjnHo4sPO(=qd*`rf+!dr^_$WcnZ(|Iu1D zxXFCvv2!8v@Y$8p9;VT`uQzv$o~`AK;L6LR=DB3uePe>uJ@WWu`yC2%ou}~ceCZ3T z_Te!}oF0jk{iv=T&muY>(>3<^`H>9n&l!q4F)b_oYi#{ljCF zJxq??`9Xwg#X~X)Cj(m&{PM%W^53L;l=fWSSIza~JW6}+wdW@5$~{Z_e%<>D^DfWQ zPTKpnwR*cpMxl2vG(6{7+E*ssqmd_gmiF`IuQzv&o?YB4mebGOqC4iDy)cW;}ejJbTGzH1~Gz<;11eVnh9FN{#-dDeQRq3Hu_<8}}6 z9^EWagy<#ObjU@J%>3A_B@4LTsHqY@W_WZxd7miRRJtR}~H2T+*w9@>jAiEKIFKE}%y^cx2=G~rc z`j?OiS-P{H?f&FSgZvNrlW!V@m&}x1_P^{?oRXOy*$q-E?i`^??j!A_{a$)_`e5_> ziq<|VG++J4sk*m4TmQ?F;y<<6Z}gB-!S9`a&}{CbMdQPlHX4r3_P7Cq&v#C7M)oPv zuM{7KsjQww`c=yQudT*D4R@+}jiR;BJ@}*gk6sG-Zbk9mT59_g=`HD;8>*%bQ}Uw> zz7u&eBKNV{QBoV<+;qRc`Jr^n4YFyotLdhrjz)P=ZyWOMbfYV4)X2hDInK|b-mjIP_sVyCSm;ybT!0-!!p8*U`~L9Y_ft5D5g0m7 zT$FEU;Q4Sn-=*~Ao42)6*DmE$yc&W`=9a0R>7Lj4nM7$vL5!4?vj%L=ioU7%8x#d} zdLECDr%crw#u`@#IKL7hk;Fv+%~Blk@EcEP#r4%lP6^5{}=bPIP>8OdXO`%h{VL zjLXiESe_3aG@ElO?_0tN&a%oH1{;5AYjWs!sI|kYt9!$uT=C5|W9=>@>fNjZ1+iF+CgT}Kr ztX*`{);L=0whB=n*h5bCde1QLad*hGuZQ2TR`*$jG^vTDQJ?NyEU-zgmlg`iKXa>J z5(xK8Q#(ZFbpn(mP3UBh=8BsYVQQyym5}yZx2A>VcZyRVU|ygHnfGljq>Xt48dL(O z9L-fX^NvP=nD=9iQ4+$k3Y{Lwyg8xiCK1(KsTaN4PR8^{F7!0>9&)QbV_uja{DOH= ztnOagE6fYwe9gQw9iiVcZ)W6>@0l0nHbUGadC;aYFZfPpUes|W^L}mDq%-g0<{`KC z5@awh_}5+?fdXNGgCNC;n46X)PFOM}X312; ziPvIJ+!A-f9e2VMf5IJqA}!%WYr=`?la~B#(un}clI@Zc;~SxL9BVpNn;ptWdKhPr z<_H2p_O(6Ql1YTkJN53J_02o$-8(zoJN3;wt<7KOzrOR_8|8<#gwEuuC9c^!YPvGt zJQ5ogV@um?9yjaF;*Kln!_<#PM7KHyk6E5ncIl|fHMe$m7dQTBeAx7Dm7Ar{%zwAo z@JagcsWsfOi03m8D7o47+S_gj-kaZ$dH9Clmx~)}ZyOr?*NTRY!$a=?&F#tW%5Ru( z`;5xV@~uM~M>Vf=&Zx524C6jp_Qu7b4H*4j3@(shk0TvIorOZm67p zgXFFGxtz29HzE5%Hizi%o_FKtx4-v7!IUZgP(OBf%9>ZdySO%g$OmtodFj;;?{wX| zeD+Iw86VTR=kUXLN)($wV(0;8TC_weW4f0^*O?#UxxB>b@J zsV5o=Harsj+@o*h{pI$XF8=sk_~K1#_WotU#jkP_^%<@whW*VRH(dKv>$-3Lb+KbS zk*#}SaQXapYBTBz3c{|%)kCef~xV<58tHh3qHTR^sZCq_wJc+ zoQ2V7n{Q)B zKn(A8B>ug4*)?N2zE{7O_?pOQ;1Jt_w@)UQojdw`&WCURGo|9oHl-qEZT6stviTTKT1?l#d_1?7TfK+cOBg`XwusyFFp6K zms6LOzt?)@%85C156QDG{urWpAz3gHh#$LK{wyol>O$e8GqRM{F418=Z?Srhu^+X zbn=yT-^pWk?_Yg1X=gXa8e~t2zW4vvp3?tDdrGchCl0DFST&z_;$0b;afE%zuQSyv zwd#)zY6M{?8^-%iXR5CnMt^j{Mqiqabq$3zYP{Y&fG_D}mT2U1{qJCGm$#V+JD7`J zg*7c0kHW{_^<;J1HO$t%jovt=?1p_OXKIa;f4e2V8X}~1;tuIF*nM(Kr|#k36t%nE zR+!rggYDFldKfM3HSKyI-jO=OVIvD4e|cL_rO@42*b&w%xD@#c>`s zq2^}a4HFUt<$2L&(M*&l#4nH3&&Ga$pNL&RTwvvb-&Hfgdo#g=lDri#q);+p`hC+MtI<#R&QRI3zf~E~p&qR~oC@FyfbLdh z%OFj>Dx;&_kQ5N#+NpX+uwyHnP)O6`JFw2Vn zWSz9h?oi-mAAL`)aKVBY*&tg~yt_3CMl|upa7SyUl-}F6G(?agTkdDs(xRO;qAe$y zrcJlr9B2IXXfCv1#KIXn|D3n5iafjjY`fz$Jb_&Nz>k_PNN>uGYZ@)zq^-1e4)|su z%qOM69@E5=F5@5K$h6fMSu-~-bd+wTQfH{k(^u*>hr$!}0b97U!}QAv)AL&sH-}Uk z_1xXRff;>klwK*H^yLJT{H~Of`aN_}8P6(9d9<%FP>>LbdNnmCx zENhH@smP*f@X{M<#>u!(4spX`4TH2Y=kL4scWyRLu^XS9C4VfX&?u8iYIM3FWo7g2 zH4>fvi6E09+d2lNoNAJ17w^`lE3^sUv~`xcLaMEL`(2f`1NB9Lpd8da+fTQ{EC8L5ItF9)KRB5Fr7XpVMX{_&rOD7880uIaRPA_RDd%)(?2ZQ4RPC>WAUCS);KHj}siCCWwVUoKGR+mw~2se4?pC$(ouA48!4 znPXs2?3?>>?#iV4C&-L%a_6#Jza0KzEL0~zqJ36XJ5Xvy)f`fPD_NrxQFw`=|-nPSJS;KXGxlJ`~Eq@=>jnyMrq^#LJbkUeyW259#N*tkF ztUf(bcUE^)Zjh!GReI>(3{n5+P3Mx$q*4bUKOK}Tf%FgZtA+kGfA?y%c{sWqPzm}K z4cAk@L=lde9AJDB-38Gx{W=}n6mC>bN41_bJ_ze?3P@6Es%>#Us0+OnwMcH9Ww=dW z#x)zasiyxnU{c&kZGzQs*r&b!qUo zZS-2lrWewRamMS!=@a5Q76t3Q)2WFk((yf(UTKtg^W^-eD8ER9d{(2LA)w*y%gsMOsQRm^ zj-^kAD$D0Oa-JHJ{=s5L-o7FEe_rBP(K4iZ=Tb*O$B@SIWsZAJ@f+DV-p-r@@6TY1 z>*{UbL+_m4gaVNaGw`EsXc2yNkz0gcEk2yih5HWZM#B99?hLqt@uTai$A&wirz;+5 zU>Ad{M1^4Yg0~08>0u}WIFbJjIK2a-@3drR?pMI+`TD#EJ>lztQ+?Zjt3>)S9OnW~ z`5y%i`xycs;Iw|7!e@X}J|h3;fa?+d26!aH31|lndmEe%4^HC8(}PbZ@EZ`m890ef z#J>g(I~|-6IK_*22sR`V--WC8w^K1x)c z%9H1XV~ED%_j=(;4BzgBXEOY0FFc>&WS7%3UpvF!^TKJLJ(Y*-a(dD?G5ner-p24D z(!TVa48Pe6zshiv7p{fUP`-D1;ZY1P^1_V_cY5KA82*SCUd-?pyzpw^qmb|Gz$4*` z`t~ev((g0C#rq-o7;Bzl<;wP5>*NpymUi42he6JV&8t^el z|0ZzaC${g$z^OhLfQ!#f>L30Mocbvm_)vez(*qv_BEpAy;Wslp#tWa$@EKnCGKMep z!pj+6>V^NB;SYG>jSQ##Z=U6BX83+D{5Zqk@xm`N{EQc_Lgz{K{lN<#%kWT)mpt>G z2AuTfX5c-~L4@xDPT?8A#r_{E#+3p`*4(dvL&XF+45qK_&G!!lRZv`IhhyIuH|9_qSPk8P|`H{nSz^R?YOO#uG^6ZaK zfAVqQx#+JQ|I_sU>3sjwXFS z^w=FYdwpD}aB{28~KXDsl4w0rM)?-{cfWLXy6 zkx5DD@OM9~V`6#GAM=bG$HaPx zJL|4Y*7DwjLKF0$JYh_%U+KpR;`gTYl04%eh`xuGmqSdfm(&@pAa*a>ID;q|59N)C z^Qx}EA>lWv?ZgF09V;ua}EzWP<;{4Vv&Trk~z3L{^BHpWRLK))Y1oatX znSJ|$EE8^33rTA3^aXuYXg1y9y=oOB82Irg!+5`Pi5KMJ!$z%OXG+C4|&xe25iGmekgr3;9>&`Hx&B(B@ zewsgVg3K`%;DnNxHKlpElISHOAAMhgW6OBrRj|DpQ<7I^D_H3rHm$*V73!IsiB#l<*XW#X#bqQZ$dc4Z=8r-`Mj)|BMrl};3O zG^VJ3eHDyHdnl|A;Gwb1sIZ{2eFB2c_DRdPuAhuOlyu56Scmfn3+mDr6SdX{71Y*G z27R^G(pN*7+IpdV_0}RPt_O2bZ}~XBYJCgDG}j}Aptv3Y(_0V3Q*Aw9Z>{x+@>W{! zsAV32r^?v*$XIs8y!+guXKw^DbkRJ&4tqUnU z+2Ho6NVf18QV|O$4=^p-lyFepUK|z!jvP{r_mXGvVZzGLqE8WtOP!BKC)ud zt$yko*H3-peCo^i^i$use(D?7PkrP1sc*bbeT90(`_xw`52kQ}=3QqFClL6|7x*WG zmnxIxb^ij7??-^~Z2sWGUU<&*!;JMLK8ZXYMg64gNB;4wqw(SB^{DEHYf?Wl;#2pN z#-{~^mP#=6!^`7A=$~VPPa89iY?|&xcHO%^a)W&z($9Q^8fBd7E`t=tf zHklWnm;~{j@re*`8lMPJ=H3yL#M{OvLX@dbgxFE|M2I5ui4eOApNRfyKB>Q&V@fEB zpJ�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
  • )LAM>)N`yAoo5V&sssvLv$g+y0$o4 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 literal 0 HcmV?d00001 diff --git a/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Modules/module.modulemap b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Modules/module.modulemap new file mode 100755 index 000000000..9c8e98acd --- /dev/null +++ b/tensorflow_lite_support/ios/third_party_frameworks/MLImage.framework/Modules/module.modulemap @@ -0,0 +1,9 @@ +framework module MLImage { + umbrella header "MLImage.h" + export * + module * { export * } + link framework "CoreGraphics" + link framework "CoreMedia" + link framework "CoreVideo" + link framework "UIKit" +} From f0ad10f2aca212c979485f5486fe40c7b20cbfda Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Wed, 19 Oct 2022 19:36:55 +0530 Subject: [PATCH 2/5] Updated ios.bzl --- tensorflow_lite_support/ios/ios.bzl | 3 --- 1 file changed, 3 deletions(-) diff --git a/tensorflow_lite_support/ios/ios.bzl b/tensorflow_lite_support/ios/ios.bzl index a9ed9ed2a..84ff73cfd 100644 --- a/tensorflow_lite_support/ios/ios.bzl +++ b/tensorflow_lite_support/ios/ios.bzl @@ -36,6 +36,3 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): > "$@" """.format(prefix, hdr_label), ) - - # sed 's|#\\(import\\) ".*/\\(GMLImage\\.h\\)"|#\\1 |'; t; 's|#\\([a-z]*\\) ".*/\\([^/]\\{{1,\\}}\\.h\\)"|#\\1 "{}\\2"|'\ - From 1510ef31007f0cab633488f5753d25e4ce4a2066 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Wed, 19 Oct 2022 19:37:48 +0530 Subject: [PATCH 3/5] Added space --- tensorflow_lite_support/ios/ios.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_lite_support/ios/ios.bzl b/tensorflow_lite_support/ios/ios.bzl index 84ff73cfd..225db5c16 100644 --- a/tensorflow_lite_support/ios/ios.bzl +++ b/tensorflow_lite_support/ios/ios.bzl @@ -25,6 +25,7 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): # can be split at '/' to get the header file name. if "/" in hdr_filename: hdr_filename = hdr_filename.split("/")[-1] + hdr_basename = hdr_filename.split(".")[0] native.genrule( name = "{}_{}".format(name, hdr_basename), From 2e1644cf38ad96e330fc194d9c04e2caee53d293 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Wed, 19 Oct 2022 19:38:28 +0530 Subject: [PATCH 4/5] Updated formatting --- tensorflow_lite_support/ios/ios.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/tensorflow_lite_support/ios/ios.bzl b/tensorflow_lite_support/ios/ios.bzl index 225db5c16..84ff73cfd 100644 --- a/tensorflow_lite_support/ios/ios.bzl +++ b/tensorflow_lite_support/ios/ios.bzl @@ -25,7 +25,6 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): # can be split at '/' to get the header file name. if "/" in hdr_filename: hdr_filename = hdr_filename.split("/")[-1] - hdr_basename = hdr_filename.split(".")[0] native.genrule( name = "{}_{}".format(name, hdr_basename), From 600e920d0f382c530262d2030d89e32d13458778 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Wed, 19 Oct 2022 19:40:03 +0530 Subject: [PATCH 5/5] Updated formatting --- tensorflow_lite_support/ios/ios.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/tensorflow_lite_support/ios/ios.bzl b/tensorflow_lite_support/ios/ios.bzl index 84ff73cfd..d328ba254 100644 --- a/tensorflow_lite_support/ios/ios.bzl +++ b/tensorflow_lite_support/ios/ios.bzl @@ -25,6 +25,7 @@ def strip_api_include_path_prefix(name, hdr_labels, prefix = ""): # can be split at '/' to get the header file name. if "/" in hdr_filename: hdr_filename = hdr_filename.split("/")[-1] + hdr_basename = hdr_filename.split(".")[0] native.genrule( name = "{}_{}".format(name, hdr_basename),